From 3a154bdb0a5aaa2c0ac3eac95a6ba747068bd454 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 13 一月 2026 10:00:37 +0800
Subject: [PATCH] 优化

---
 server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java |  792 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 792 insertions(+), 0 deletions(-)

diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
new file mode 100644
index 0000000..87e5ffc
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -0,0 +1,792 @@
+package com.doumee.core.dingTalk;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkoauth2_1_0.Client;
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
+import com.aliyun.dingtalktodo_1_0.models.*;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.dao.CompanyMapper;
+import com.doumee.dao.business.model.CarUseBook;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.HiddenDanger;
+import com.doumee.dao.business.model.Visits;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.service.business.CompanyService;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import com.taobao.api.ApiException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.DateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/9/24 16:25
+ */
+@Slf4j
+@Service
+public class DingTalk {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    /**
+     * 浣跨敤 Token 鍒濆鍖栬处鍙稢lient 鏁版嵁鍚屾绫�
+     * @return Client com.aliyun.dingtalkoauth2_1_0.
+     * @throws Exception
+     */
+    public static Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new Client(config);
+    }
+
+    /**
+     * 寰呭姙閫氱煡绫� 閾炬帴姹�
+     * @return
+     * @throws Exception
+     */
+    public static com.aliyun.dingtalktodo_1_0.Client createV1Client() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalktodo_1_0.Client(config);
+    }
+
+    public void updTokenInfo() throws Exception {
+        String appKey  =  systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_KEY).getCode();
+        String appSecret  = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_SECRET).getCode();
+        Client client = DingTalk.createClient();
+        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
+                .setAppKey(appKey)
+                .setAppSecret(appSecret);
+        try {
+            GetAccessTokenResponse getAccessTokenResponse = client.getAccessToken(getAccessTokenRequest);
+            //杩斿弬鎻忚堪 渚嬶細{"body":{"accessToken":"76a248ea72ba3f359b39c9e70073d642","expireIn":7200},"headers":{"access-control-allow-origin":"*","date":"Wed, 24 Sep 2025 08:39:36 GMT","server":"DingTalk/1.0.0","transfer-encoding":"chunked","x-acs-request-id":"9E8AF053-04DD-7031-9766-14DFFB087A79","access-control-allow-headers":"X-Requested-With, X-Sequence, _aop_secret, _aop_signature, x-acs-dingtalk-access-token","connection":"keep-alive","content-type":"application/json;charset=utf-8","access-control-expose-headers":"*","x-acs-trace-id":"96e7cf1f3c0e059779a6d581d4b5fca7"},"statusCode":200}
+            if(Constants.equalsInteger(getAccessTokenResponse.statusCode,Constants.DD_STATUS_SUCCESS_CODE)){
+                //瑙f瀽token淇℃伅 瀛樺偍
+                String accessToken = getAccessTokenResponse.getBody().getAccessToken();
+                //鏇存柊token淇℃伅瀛樺偍
+                SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN);
+                systemDictData.setCode(accessToken);
+                systemDictData.setUpdateTime(new Date());
+                systemDictDataBiz.updateByIdNew(systemDictData);
+            }
+
+            //鏇存柊Token淇℃伅
+            System.out.println(JSONObject.toJSONString(getAccessTokenResponse));
+
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("鏇存柊閽夐拤Token澶辫触锛歿}" + err.message);
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("鏇存柊閽夐拤Token澶辫触锛歿}" + err.message);
+            }
+        }
+    }
+
+
+    /**
+     * 鑾峰彇閽夐拤Token
+     * @return
+     */
+    public String getToken(){
+        String accessToken  =  systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN).getCode();
+        return accessToken;
+    }
+
+
+    public OapiV2UserGetuserinfoResponse.UserGetByCodeResponse  getDDUserByCode(String code) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
+        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
+        req.setCode(code);
+        OapiV2UserGetuserinfoResponse rsp = client.execute(req, getToken());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+           return  rsp.getResult();
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+    /**
+     * 鍏ㄩ噺鍚屾 閮ㄩ棬淇℃伅
+     * 鎺ュ彛鏂囨。鍦板潃 https://open.dingtalk.com/document/orgapp/obtain-the-department-list-v2
+     * 鏈帴鍙e彧鏀寔鑾峰彇褰撳墠閮ㄩ棬鐨勪笅涓�绾ч儴闂ㄥ熀纭�淇℃伅锛屼笉鏀寔鑾峰彇褰撳墠閮ㄩ棬涓嬫墍鏈夊眰绾у瓙閮ㄩ棬
+     * @throws ApiException
+     */
+    public List<OapiV2DepartmentGetResponse.DeptGetResponse>  syncAllDDDepartmentList() throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
+        List<Long> headList = new ArrayList<>();
+        headList.add(1L);
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptBaseResponseList = new ArrayList<>();
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> thisLevelList = getDepartmentList(client,headList);
+        deptBaseResponseList.addAll(thisLevelList);
+        while (CollectionUtils.isNotEmpty(thisLevelList)){
+            headList = thisLevelList.stream().map(i->i.getDeptId()).collect(Collectors.toList());
+            thisLevelList = getDepartmentList(client,headList);
+            if(CollectionUtils.isNotEmpty(thisLevelList)){
+                deptBaseResponseList.addAll(thisLevelList);
+            }
+        }
+        List<OapiV2DepartmentGetResponse.DeptGetResponse> getResponseList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(deptBaseResponseList)){
+            for (OapiV2DepartmentListsubResponse.DeptBaseResponse deptBaseResponse:deptBaseResponseList) {
+                OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse = syncDepartmentInfo(deptBaseResponse.getDeptId());
+                getResponseList.add(deptGetResponse);
+            }
+        }
+        return getResponseList;
+    }
+
+
+    /**
+     * 鑾峰彇閮ㄩ棬涓嬬骇鏁版嵁
+     * @param client
+     * @param deptIdList
+     * @return
+     * @throws ApiException
+     */
+    public List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getDepartmentList
+            (DingTalkClient client, List<Long> deptIdList) throws ApiException{
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> thisLevelList = new ArrayList<>();
+        for (Long deptId:deptIdList) {
+            OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
+            req.setDeptId(deptId);
+            req.setLanguage("zh_CN");
+            OapiV2DepartmentListsubResponse rsp = client.execute(req, this.getToken());
+            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+                if(CollectionUtils.isNotEmpty(rsp.getResult())){
+                    thisLevelList.addAll(rsp.getResult());
+                }
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }
+        }
+        return thisLevelList;
+    }
+
+    /**
+     * 鍒涘缓缁勭粐閮ㄩ棬 鏆備笉浣跨敤
+     * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://open.dingtalk.com/document/orgapp/create-a-department-v2
+     * @param ddParentId 閽夐拤涓婄骇閮ㄩ棬涓婚敭 濡傛灉娌℃湁鍒欏叆null
+     * @param name 閮ㄩ棬鍚嶇О
+     * @param sn 搴忓彿
+     * @param id 绯荤粺閮ㄩ棬涓婚敭
+     * @throws ApiException
+     */
+    public void pushCreatDepartment(Integer ddParentId,String name,Long sn,Integer id) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/create");
+        OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest();
+        //蹇呭叆鍙傛暟
+        //濡傛灉鏃犵埗绾� 鍒欓粯璁よ窡缁勭粐 1L
+        req.setParentId(Objects.isNull(ddParentId)?1L:ddParentId);
+        req.setName(name);
+        req.setOrder(sn);
+        //澶栭儴閮ㄩ棬瀛楁
+        req.setSourceIdentifier(id.toString());
+
+        //榛樿鍙傛暟
+        req.setHideDept(false);
+        req.setOuterDept(false);
+        req.setCreateDeptGroup(false);
+
+        OapiV2DepartmentCreateResponse rsp = client.execute(req, getToken());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+
+        System.out.println(rsp.getBody());
+    }
+
+
+    /**
+     * 鏇存柊缁勭粐閮ㄩ棬 鏆備笉浣跨敤
+     * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://open.dingtalk.com/document/orgapp/update-a-department-v2
+     * @param deptId 閽夐拤閮ㄩ棬涓婚敭
+     * @param name 閮ㄩ棬鍚嶇О
+     * @param parentId 鐖剁骇閽夐拤閮ㄩ棬涓婚敭
+     * @param sn 搴忓彿
+     * @throws ApiException
+     */
+    public void pushUpdDepartment(Integer deptId,String name,Integer parentId,Long sn) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/update");
+        OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest();
+        req.setDeptId(deptId.longValue());
+        //濡傛灉鏃犵埗绾� 鍒欓粯璁よ窡缁勭粐 1L
+        req.setParentId(Objects.isNull(parentId)?1L:parentId.longValue());
+        req.setOrder(sn);
+        req.setName(name);
+        OapiV2DepartmentUpdateResponse rsp = client.execute(req, getToken());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+
+    /**
+     * 鍒犻櫎缁勭粐閮ㄩ棬 鏆備笉浣跨敤
+     * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://open.dingtalk.com/document/orgapp/delete-a-department-v2
+     * @param deptId 閽夐拤閮ㄩ棬涓婚敭
+     * @throws ApiException
+     */
+    public void pushDelDepartment(Integer deptId) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/delete");
+        OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest();
+        req.setDeptId(deptId.longValue());
+        OapiV2DepartmentDeleteResponse rsp = client.execute(req, getToken());
+        System.out.println(rsp.getBody());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+    /**
+     * 鑾峰彇閽夐拤閮ㄩ棬璇︽儏
+     * @param deptId
+     * @return
+     * @throws ApiException
+     */
+    public OapiV2DepartmentGetResponse.DeptGetResponse syncDepartmentInfo(Long deptId) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
+        OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
+        req.setDeptId(deptId);
+        req.setLanguage("zh_CN");
+        OapiV2DepartmentGetResponse rsp = client.execute(req, getToken());
+        System.out.println(rsp.getBody());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+            return rsp.getResult();
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+
+
+    public List<OapiV2UserGetResponse.UserGetResponse>  syncAllUserInfo() throws ApiException {
+        List<Company> deptList = companyMapper.selectList(new QueryWrapper<Company>().lambda()
+                .eq(Company::getIsdeleted,Constants.ZERO)
+                .eq(Company::getType,Constants.ONE)
+                .isNotNull(Company::getErpId)
+        );
+        if(CollectionUtils.isEmpty(deptList)){
+            return null;
+        }
+        List<String> allUserIdList = new ArrayList<>();
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
+        OapiUserListidRequest req = new OapiUserListidRequest();
+        for (Company company:deptList) {
+            req.setDeptId(Long.valueOf(company.getErpId()));
+            OapiUserListidResponse rsp = client.execute(req, getToken());
+            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+                if(CollectionUtils.isNotEmpty(rsp.getResult().getUseridList())){
+                    allUserIdList.addAll(rsp.getResult().getUseridList());
+                }
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }
+        }
+        if(CollectionUtils.isEmpty(allUserIdList)){
+            return null;
+        }
+        Set<String> setUserIdList = new HashSet<>(allUserIdList);
+        return syncUserInfoList(setUserIdList);
+    }
+
+
+    public List<OapiV2UserGetResponse.UserGetResponse>  syncUserInfoList(Set<String> setUserIdList) throws ApiException {
+        List<OapiV2UserGetResponse.UserGetResponse> userList = new ArrayList<>();
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+        for (String userId:setUserIdList) {
+            req.setUserid(userId);
+            req.setLanguage("zh_CN");
+            OapiV2UserGetResponse rsp = client.execute(req, getToken());
+            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+                OapiV2UserGetResponse.UserGetResponse userGetResponse = rsp.getResult();
+                userList.add(userGetResponse);
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }
+        }
+        return userList;
+    }
+
+
+    public OapiV2UserGetResponse.UserGetResponse syncUserInfo(String userId)throws ApiException {
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+        req.setUserid(userId);
+        req.setLanguage("zh_CN");
+        OapiV2UserGetResponse rsp = client.execute(req, getToken());
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+            OapiV2UserGetResponse.UserGetResponse userGetResponse = rsp.getResult();
+            return userGetResponse;
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+    /**
+     * 鍙戦�� 宸ヤ綔閫氱煡
+     * @param agentId
+     * @param userIds
+     * @param msg
+     * api 鍦板潃 https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
+     * @throws ApiException
+     */
+    public Boolean workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg){
+        try{
+            if(CollectionUtils.isEmpty(msg)){
+                return null;
+            }
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+            request.setAgentId(agentId);
+            request.setUseridList(userIds);
+            request.setToAllUser(false);
+
+            request.setMsg(msg);
+            OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, getToken());
+            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+                return true;
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+            }
+        }catch (ApiException apiException){
+
+        }
+        return false;
+
+    }
+
+
+    /**
+     * 璁垮鐢宠/鎶ュ OA 宸ヤ綔閫氱煡 鍐呭
+     * @param visits
+     * @param title
+     * @return
+     */
+    public OapiMessageCorpconversationAsyncsendV2Request.Msg getVisitNoticeMsg(Visits visits,String title){
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+        msg.setMsgtype("oa");
+        OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
+        oa.setMessageUrl("");
+        OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();
+        head.setText(title);
+        head.setBgcolor("#279BAA");
+        oa.setHead(head);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();
+        body.setTitle(!Constants.equalsInteger(visits.getType(),Constants.TWO)?visits.getName()+"鐨勮瀹㈢敵璇�":"鐨勮瀹㈡姤澶�");
+        List<OapiMessageCorpconversationAsyncsendV2Request.Form> formList = new ArrayList<>();
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form visitUser = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        visitUser.setKey("鏉ヨ浜猴細");
+        visitUser.setValue(visits.getName());
+        formList.add(visitUser);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form inDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        inDate.setKey("鍏ュ洯鏃堕棿锛�");
+        inDate.setValue(DateUtil.formatDate(visits.getStarttime(),"MM-dd HH:mm"));
+        formList.add(inDate);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form outDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        outDate.setKey("绂诲洯鏃堕棿锛�");
+        outDate.setValue(DateUtil.formatDate(visits.getEndtime(),"MM-dd HH:mm"));
+        formList.add(outDate);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form inReason = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        inReason.setKey("鏉ヨ浜嬬敱锛�");
+        inReason.setValue(visits.getReason());
+        formList.add(inReason);
+
+        if(StringUtils.isNotBlank(visits.getCarNos())){
+            OapiMessageCorpconversationAsyncsendV2Request.Form carNos = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            carNos.setKey("闅忚杞﹁締锛�");
+            carNos.setValue(visits.getCarNos());
+            formList.add(visitUser);
+        }
+
+        body.setForm(formList);
+        oa.setBody(body);
+        msg.setOa(oa);
+        return msg;
+    }
+
+
+    /**
+     * 鐢ㄨ溅淇℃伅 閽夐拤閫氱煡鏁版嵁缁勫悎
+     * @param carUseBook
+     * @param title
+     * @return
+     */
+    public OapiMessageCorpconversationAsyncsendV2Request.Msg getCarUseNoticeMsg(CarUseBook carUseBook,String title){
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+        msg.setMsgtype("oa");
+        OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
+        oa.setMessageUrl("");
+        OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();
+        head.setText(title);
+        head.setBgcolor("#279BAA");
+        oa.setHead(head);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();
+        body.setTitle("鍏姟鐢ㄨ溅");
+        List<OapiMessageCorpconversationAsyncsendV2Request.Form> formList = new ArrayList<>();
+
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form startDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        startDate.setKey("寮�濮嬫椂闂达細");
+        startDate.setValue(DateUtil.formatDate(carUseBook.getStartTime(),"MM-dd HH:mm"));
+        formList.add(startDate);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form endDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        endDate.setKey("缁撴潫鏃堕棿锛�");
+        endDate.setValue(DateUtil.formatDate(carUseBook.getEndTime(),"MM-dd HH:mm"));
+        formList.add(endDate);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form userNum = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        userNum.setKey("涔樿溅浜烘暟锛�");
+        userNum.setValue(StringUtils.isBlank(carUseBook.getMemberNames())?"0浜�": (carUseBook.getMemberNames().split(",").length+"浜�"));
+        formList.add(userNum);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Form inReason = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+        inReason.setKey("鐢ㄨ溅鍦扮偣锛�");
+        inReason.setValue(Constants.equalsInteger(carUseBook.getType(),Constants.ZERO)?"甯傚唴":"甯傚");
+        formList.add(inReason);
+
+        body.setForm(formList);
+        oa.setBody(body);
+        msg.setOa(oa);
+        return msg;
+    }
+
+    /**
+     * 澶╂皵 markdown
+     * @param title
+     * @param text
+     * @return
+     */
+    public OapiMessageCorpconversationAsyncsendV2Request.Msg getWeatherNoticeMsg(String title,String text){
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+        msg.setMsgtype("markdown");
+        OapiMessageCorpconversationAsyncsendV2Request.Markdown markdown = new OapiMessageCorpconversationAsyncsendV2Request.Markdown();
+        markdown.setTitle(title);
+        markdown.setText(text);
+        msg.setMarkdown(markdown);
+        return msg;
+    }
+
+
+    /**
+     * 瀹夐槻/娑堥槻 markdown
+     * @return
+     */
+    public OapiMessageCorpconversationAsyncsendV2Request.Msg getAlarmNoticeMsg(String areaName,String submitTime,String infoType){
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+        msg.setMsgtype("markdown");
+        OapiMessageCorpconversationAsyncsendV2Request.Markdown markdown = new OapiMessageCorpconversationAsyncsendV2Request.Markdown();
+        markdown.setTitle("鍥尯瀛樺湪瀹夐槻/娑堥槻闅愭偅");
+        markdown.setText(areaName+"鍦�"+submitTime+"鍙戠敓"+infoType+",璇峰強鏃跺墠寰�瀹夐槻涓績/娑堥槻涓績杩涜澶勭悊");
+        msg.setMarkdown(markdown);
+        return msg;
+    }
+
+
+    /**
+     * 閽夐拤寰呭姙浜嬩欢
+     * api鍦板潃 https://open.dingtalk.com/document/orgapp/add-dingtalk-to-do-task
+     * unionId 閫氱煡鎵�灞炵敤鎴�
+     * title 鏍囬
+     * unionIdList 寰呭姙閫氱煡浜哄憳闆嗗悎
+     * @throws Exception
+     */
+    public String toDoNotice(String title,List<String> unionIdList,List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> fieldList,String url) {
+        try{
+            if(CollectionUtils.isEmpty(fieldList)){
+                return null;
+            }
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
+            createTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
+            //寰呭姙鎴鍓嶇殑鎻愰啋
+            CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs remindNotifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs()
+                    .setDingNotify("1")
+                    .setSendTodoApn("true");
+            //寰呭姙閫氱煡閰嶇疆
+            CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
+                    .setDingNotify("1")
+                    .setSendTodoApn("true")
+                    .setSendAssistantChat("true");
+            //鎸夐挳浜嬩欢
+            CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam actionList0Param = new CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam()
+                    .setBody("");
+            CreateTodoTaskRequest.CreateTodoTaskRequestActionList actionList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestActionList()
+                    .setTitle("鍘诲鐞�")
+                    .setActionType(2)
+                    .setParam(actionList0Param)
+                    .setUrl(url) //TODO 璇︽儏鍦板潃
+                    .setActionKey("ak-1-1");
+            //璇︽儏椤祏rl璺宠浆鍦板潃
+            CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl = new CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
+                    .setAppUrl("https://www.baidu.com")
+                    .setPcUrl("https://www.baidu.com");
+            CreateTodoTaskRequest createTodoTaskRequest = new CreateTodoTaskRequest()
+                    .setSubject(title)
+                    .setCreatorId(unionIdList.get(Constants.ZERO))
+                    .setDescription(title)
+                    .setExecutorIds(unionIdList)
+                    .setDetailUrl(detailUrl)
+                    .setContentFieldList(fieldList)
+                    .setIsOnlyShowExecutor(true)
+                    .setPriority(20)
+                    .setNotifyConfigs(notifyConfigs)
+                    .setActionList(java.util.Arrays.asList(actionList0))
+                    .setTodoType("TODO")
+                    .setRemindNotifyConfigs(remindNotifyConfigs);
+            try {
+                CreateTodoTaskResponse response = client.createTodoTaskWithOptions(unionIdList.get(Constants.ZERO), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+                log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
+                return response.getBody().getId();
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+                }
+            } catch (Exception _err) {
+                TeaException err = new TeaException(_err.getMessage(), _err);
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                    log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+                }
+            }
+            return null;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽夐拤寰呭姙浠诲姟閫氱煡鍙戦�佸け璐�");
+        }
+    }
+
+
+    /**
+     * 澶勭悊鍏ㄩ儴浜虹殑寰呭姙淇℃伅 锛堟祦绋嬪鎵瑰畬鎴愩�佹湰绾у鎵瑰畬鎴� 浣跨敤锛�
+     * @param unionId
+     * @param taskId
+     * api鍦板潃 https://open.dingtalk.com/document/orgapp/updates-dingtalk-to-do-tasks
+     * @throws Exception
+     */
+    public void updToDoNoticeInfoStatus(String unionId,String taskId){
+        try {
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
+            updateTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
+            UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest()
+                    .setOperatorId(unionId)
+                    .setDone(true);
+            UpdateTodoTaskResponse response = client.updateTodoTaskWithOptions(unionId, taskId, updateTodoTaskRequest, updateTodoTaskHeaders, new RuntimeOptions());
+            log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊瀵瑰簲浜哄憳鐨勫緟鍔炰俊鎭�
+     * @param unionId 鍒涘缓浜簎nionId
+     * @param taskId  閽夐拤浠诲姟涓婚敭
+     * @param dealUnionId
+     * api 鍦板潃 https://open.dingtalk.com/document/orgapp/update-dingtalk-to-do-status
+     * @throws Exception
+     */
+    public void updUserToDoNoticeInfoStatus(String unionId,String taskId,String dealUnionId){
+        try {
+            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
+            UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders();
+            updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = getToken();
+            UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList()
+                    .setId(dealUnionId)
+                    .setIsDone(true);
+            UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest()
+                    .setExecutorStatusList(java.util.Arrays.asList(
+                            executorStatusList0
+                    ));
+            UpdateTodoTaskExecutorStatusResponse response = client.updateTodoTaskExecutorStatusWithOptions(unionId, taskId, updateTodoTaskExecutorStatusRequest, updateTodoTaskExecutorStatusHeaders, new RuntimeOptions());
+            log.error("寰呭姙閫氱煡鍙戦�佹垚鍔燂紝鍙戦�佸唴瀹癸細{}"+JSONObject.toJSONString(response));
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("寰呭姙閫氱煡鍙戦�佸け璐ワ紝澶辫触鍘熷洜锛歿}"+err.message);
+            }
+        }
+
+    }
+
+
+    /**
+     * 璁垮鎶ュ涓庤瀹㈢敵璇� 閽夐拤寰呭姙
+     * @param visits
+     * @return
+     */
+    public List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> getToDoVisitFiledInfo(Visits visits){
+        List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> list = new ArrayList<>();
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("鏉ヨ浜�")
+                .setFieldValue(visits.getName());
+        list.add(contentFieldList0);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList1 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("鍏ュ洯鏃堕棿")
+                .setFieldValue(DateUtil.getFomartDate(visits.getStarttime(),"MM-dd HH:mm"));
+        list.add(contentFieldList1);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList2 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("绂诲洯鏃堕棿")
+                .setFieldValue(DateUtil.getFomartDate(visits.getEndtime(),"MM-dd HH:mm"));
+        list.add(contentFieldList2);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList3 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("鏉ヨ浜嬬敱")
+                .setFieldValue(visits.getReason());
+        list.add(contentFieldList3);
+        if(StringUtils.isNotBlank(visits.getCarNos())){
+            CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList4 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                    .setFieldKey("闅忚杞﹁締")
+                    .setFieldValue(visits.getCarNos());
+            list.add(contentFieldList4);
+        }
+        return list;
+    }
+
+
+    /**
+     * 鐢ㄨ溅鐢宠鐨� 閽夐拤寰呭姙
+     * @param carUseBook
+     * @return
+     */
+    public List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> getToDoCarUseBookFiledInfo(CarUseBook carUseBook){
+        List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> list = new ArrayList<>();
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList1 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("寮�濮嬫椂闂�")
+                .setFieldValue(DateUtil.getFomartDate(carUseBook.getStartTime(),"MM-dd HH:mm"));
+        list.add(contentFieldList1);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList2 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("缁撴潫鏃堕棿")
+                .setFieldValue(DateUtil.getFomartDate(carUseBook.getEndTime(),"MM-dd HH:mm"));
+        list.add(contentFieldList2);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList3 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("涔樿溅浜烘暟")
+                .setFieldValue(StringUtils.isBlank(carUseBook.getMemberNames())?"0浜�": (carUseBook.getMemberNames().split(",").length+"浜�"));
+        list.add(contentFieldList3);
+        CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList contentFieldList4 = new CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList()
+                .setFieldKey("鐢ㄨ溅鍦扮偣")
+                .setFieldValue(Constants.equalsInteger(carUseBook.getType(),Constants.ZERO)?"甯傚唴":"甯傚");
+        list.add(contentFieldList4);
+        return list;
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        DingTalk dingTalk = new DingTalk();
+//        Visits visits = new Visits();
+//        visits.setName("灏忚眴涓�");
+//        visits.setStarttime(new Date());
+//        visits.setEndtime(new Date());
+//        visits.setReason("鍙傝");
+//        visits.setCarNos("鐨朅00001");
+//        dingTalk.toDoNotice("visit_01","灏忚眴涓佺殑璁垮鐢宠",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE") ,dingTalk.getToDoVisitFiledInfo(visits));
+
+        CarUseBook carUseBook = new CarUseBook();
+        carUseBook.setStartTime(new Date());
+        carUseBook.setEndTime(new Date());
+        carUseBook.setMemberNames("寮犱笁,鏉庡洓,鐜嬩簲");
+        carUseBook.setType(Constants.ZERO);
+
+
+//        dingTalk.workInfoOANotice(4015267031L,"1568490244651036",dingTalk.getCarUseNoticeMsg(carUseBook,"鐢ㄨ溅鐢宠"));
+
+
+        dingTalk.toDoNotice("灏忚眴涓佹彁浜ょ殑鍏姟杞︾敤杞�",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE","XiPYJKRAv9eCoO4UPM20HQQiEiE","eWbHiSp3uRtrMtiiOX5LXamgiEiE") ,dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"");
+//
+
+//        dingTalk.updUserToDoNoticeInfoStatus("iPsP86axviPHiSP4nm5YgQNCQiEiE",
+//                "taska2d004da1f8e84847c895d14e8695102",
+//                "XiPYJKRAv9eCoO4UPM20HQQiEiE");
+        ;
+//        String appKey  = "dingkfglaktqmfd2dmo2";//systemDictDataBiz.queryByCode("","").getCode();
+//        String appSecret  = "0e22TT2s794Yj49Exgvq8nU2ulpXmxlw9ThBh5s-vDv5Cfspv-f8HPmta4cg2evk";//systemDictDataBiz.queryByCode("","").getCode();
+//        Client client = DingTalk.createClient();
+//        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
+//                .setAppKey(appKey)
+//                .setAppSecret(appSecret);
+//        try {
+//            GetAccessTokenResponse getAccessTokenResponse = client.getAccessToken(getAccessTokenRequest);
+//
+//            //鏇存柊Token淇℃伅
+//            System.out.println(JSONObject.toJSONString(getAccessTokenResponse));
+//
+//        } catch (TeaException err) {
+//            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+//                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+//                log.error("鏇存柊閽夐拤Token澶辫触锛歿}" + err.message);
+//            }
+//
+//        } catch (Exception _err) {
+//            TeaException err = new TeaException(_err.getMessage(), _err);
+//            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+//                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+//                log.error("鏇存柊閽夐拤Token澶辫触锛歿}" + err.message);
+//            }
+//        }
+    }
+
+}

--
Gitblit v1.9.3