From 9f7368ceb60b8f5c635cf455914f435d8d782a90 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期六, 21 六月 2025 23:58:03 +0800
Subject: [PATCH] 添加钉钉推送消息功能

---
 src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java |  156 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 156 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java b/src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java
new file mode 100644
index 0000000..d0f4835
--- /dev/null
+++ b/src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java
@@ -0,0 +1,156 @@
+package com.gs.xky.service.Impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
+import com.gs.xky.entity.DingtalkInfo;
+import com.gs.xky.entity.DingtalkMsg;
+import com.gs.xky.mapper.DingtalkInfoMapper;
+import com.gs.xky.mapper.DingtalkMsgMapper;
+import com.gs.xky.service.DingtalkInfoService;
+import com.gs.xky.service.SimpleExample;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author 28567
+ * @description 閽堝琛ㄣ�怐INGTALK_INFO銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2025-06-20 16:12:48
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class DingtalkInfoServiceImpl extends ServiceImpl<DingtalkInfoMapper, DingtalkInfo>
+        implements DingtalkInfoService {
+
+    private final SimpleExample simpleExample;
+    private final DingtalkMsgMapper dingtalkMsgMapper;
+
+    @Override
+    public boolean sendMessage(String releaseNo) {
+        try {
+            // 鏌ヨ閽夐拤娑堟伅鍐呭
+            LambdaQueryWrapper<DingtalkMsg> msgWrapper = new LambdaQueryWrapper<>();
+            msgWrapper.eq(DingtalkMsg::getReleaseNo, releaseNo);
+            DingtalkMsg dingtalkMsg = dingtalkMsgMapper.selectOne(msgWrapper);
+
+            if (dingtalkMsg == null) {
+                log.error("鏈壘鍒版楠屽崟鍙蜂负 {} 鐨勯拤閽夋秷鎭唴瀹�", releaseNo);
+                return false;
+            }
+
+            // 鏍煎紡鍖栨棩鏈�
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String createDateStr = (dingtalkMsg.getCreateDate() != null) ?
+                    dateFormat.format(dingtalkMsg.getCreateDate()) : "鏈煡";
+
+            // 鏋勫缓娑堟伅鍐呭
+            String message = String.format("渚涘簲鍟哰%s] 鏉ユ枡鏃ユ湡[%s] 椤圭洰[%s] 鏂欏彿[%s]鐨勪笉鍚堟牸妫�楠屽崟琚玔%s]瀹℃壒涓篬%s]锛岃鏌ユ敹!",
+                    dingtalkMsg.getSuppName(), createDateStr, dingtalkMsg.getProjectCodes(),
+                    dingtalkMsg.getItemNo(), dingtalkMsg.getFname(), dingtalkMsg.getFngHandle());
+
+            // 璋冪敤getDingtalkUserIdList鏂规硶鑾峰彇UserIdList
+            List<String> userIdList = getDingtalkUserIdList();
+
+            if (userIdList == null || userIdList.isEmpty()) {
+                log.warn("娌℃湁闇�瑕佸彂閫侀拤閽夋秷鎭殑鐢ㄦ埛");
+                return false;
+            }
+
+            // 閫氳繃閽夐拤鍙戦�佹秷鎭�
+            String userIdListStr = String.join(",", userIdList);
+
+            OapiMessageCorpconversationAsyncsendV2Response rsp = sendMessage(userIdListStr, message);
+            System.out.println(rsp.getBody());
+            log.info("鎴愬姛鍙戦�侀拤閽夋秷鎭�: {}", message);
+            return true;
+        } catch (Exception e) {
+            log.error("鍙戦�侀拤閽夋秷鎭け璐�", e);
+            return false;
+        }
+    }
+
+    private List<String> getDingtalkUserIdList() {
+        try {
+            LambdaQueryWrapper<DingtalkInfo> wrapper = new LambdaQueryWrapper<>();
+            wrapper.ge(DingtalkInfo::getIsSendDingtalk, 1);
+            List<DingtalkInfo> list = list(wrapper);
+
+            if (list == null || list.isEmpty()) {
+                return new ArrayList<>();
+            }
+
+            // 浣跨敤stream娴佽繃婊ゅ嚭list涓璬ingtalkId涓虹┖鐨勬暟鎹�
+            List<DingtalkInfo> emptyDingtalkIdList = list.stream()
+                    .filter(info -> !StringUtils.hasText(info.getDingtalkId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉瀛樺湪涓虹┖鐨勬暟鎹氨閫氳繃閽夐拤鐨勬帴鍙h幏鍙栵紝涓篸ingtalkId璧嬪�硷紝骞朵笖鏇存柊鏁版嵁搴�
+            if (!emptyDingtalkIdList.isEmpty()) {
+                String accessToken = simpleExample.getAccessToken();
+
+                for (DingtalkInfo info : emptyDingtalkIdList) {
+                    if (StringUtils.hasText(info.getPhone())) {
+                        try {
+                            // 閫氳繃鎵嬫満鍙疯幏鍙栭拤閽夌敤鎴稩D
+                            com.dingtalk.api.response.OapiV2UserGetbymobileResponse response =
+                                    simpleExample.getOapiV2UserGetbymobileResponse(info.getPhone(), accessToken);
+
+                            if (response != null && response.getResult() != null) {
+                                info.setDingtalkId(response.getResult().getUserid());
+                                // 鏇存柊鏁版嵁搴�
+                                updateById(info);
+                            }
+                        } catch (Exception e) {
+                            log.error("鑾峰彇閽夐拤鐢ㄦ埛ID澶辫触锛屾墜鏈哄彿锛歿}", info.getPhone(), e);
+                        }
+                    }
+                }
+            }
+
+            // 涓嶅瓨鍦ㄤ负绌虹殑鏁版嵁鎴栬�呭鐞嗗畬绌烘暟鎹悗锛岃繑鍥炴墍鏈夋湁鏁堢殑dingtalkId鍒楄〃
+            return list.stream()
+                    .map(DingtalkInfo::getDingtalkId)
+                    .filter(StringUtils::hasText)
+                    .distinct()
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("鑾峰彇閽夐拤鐢ㄦ埛鍒楄〃澶辫触", e);
+            return new ArrayList<>();
+        }
+    }
+
+    private OapiMessageCorpconversationAsyncsendV2Response sendMessage(String userIdListStr, String message) throws Exception {
+
+        String accessToken = simpleExample.getAccessToken();
+
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+        request.setAgentId(3917187842L);
+        request.setUseridList(userIdListStr);
+        request.setToAllUser(false);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+        msg.setMsgtype("text");
+        msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
+        msg.getText().setContent(message);
+        request.setMsg(msg);
+
+        return client.execute(request, accessToken);
+
+    }
+}
+
+
+
+

--
Gitblit v1.9.3