From 1d1a9472606e6c1ed52be701c3ffc98aeb360cfd Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期二, 24 六月 2025 18:16:57 +0800
Subject: [PATCH] 钉钉根据人员动态推送

---
 src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java |  119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 113 insertions(+), 6 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
index d0f4835..17bb4e3 100644
--- a/src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java
+++ b/src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java
@@ -8,8 +8,10 @@
 import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
 import com.gs.xky.entity.DingtalkInfo;
 import com.gs.xky.entity.DingtalkMsg;
+import com.gs.xky.entity.MesStaff;
 import com.gs.xky.mapper.DingtalkInfoMapper;
 import com.gs.xky.mapper.DingtalkMsgMapper;
+import com.gs.xky.mapper.MesStaffMapper;
 import com.gs.xky.service.DingtalkInfoService;
 import com.gs.xky.service.SimpleExample;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +37,7 @@
 
     private final SimpleExample simpleExample;
     private final DingtalkMsgMapper dingtalkMsgMapper;
+    private final MesStaffMapper mesStaffMapper;
 
     @Override
     public boolean sendMessage(String releaseNo) {
@@ -59,8 +62,45 @@
                     dingtalkMsg.getSuppName(), createDateStr, dingtalkMsg.getProjectCodes(),
                     dingtalkMsg.getItemNo(), dingtalkMsg.getFname(), dingtalkMsg.getFngHandle());
 
-            // 璋冪敤getDingtalkUserIdList鏂规硶鑾峰彇UserIdList
-            List<String> userIdList = getDingtalkUserIdList();
+            // 鏀堕泦闇�瑕佹帹閫佺殑浜哄憳sid
+            List<Long> sidList = new ArrayList<>();
+
+            // 1. 鍥哄畾鎺ㄩ�佷汉鍛橈紙isSendDingtalk=1锛�
+            List<DingtalkInfo> fixedList = baseMapper.selectList(
+                    new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getIsSendDingtalk, 1)
+            );
+            for (DingtalkInfo info : fixedList) {
+                sidList.add(info.getSid());
+            }
+
+            // 2. 閲囪喘浜哄憳锛坋mployeeName锛�
+            if (StringUtils.hasText(dingtalkMsg.getEmployeeName())) {
+                MesStaff buyer = mesStaffMapper.selectOne(
+                        new LambdaQueryWrapper<MesStaff>().eq(MesStaff::getStaffName, dingtalkMsg.getEmployeeName())
+                );
+                if (buyer != null) {
+                    DingtalkInfo buyerInfo = baseMapper.selectOne(
+                            new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getSid, buyer.getId())
+                    );
+                    if (buyerInfo != null) sidList.add(buyerInfo.getSid());
+                }
+            }
+
+            // 3. 瀹℃牳浜猴紙modify1By锛�
+            if (StringUtils.hasText(dingtalkMsg.getModify1By())) {
+                MesStaff auditor = mesStaffMapper.selectOne(
+                        new LambdaQueryWrapper<MesStaff>().eq(MesStaff::getStaffNo, dingtalkMsg.getModify1By())
+                );
+                if (auditor != null) {
+                    DingtalkInfo auditorInfo = baseMapper.selectOne(
+                            new LambdaQueryWrapper<DingtalkInfo>().eq(DingtalkInfo::getSid, auditor.getId())
+                    );
+                    if (auditorInfo != null) sidList.add(auditorInfo.getSid());
+                }
+            }
+
+            // 4. 鏍规嵁鏀堕泦鐨剆id鑾峰彇dingtalkId (澶嶇敤getDingtalkUserIdList鐨勫叧閿�昏緫)
+            List<String> userIdList = getDingtalkUserIdListBySids(sidList);
 
             if (userIdList == null || userIdList.isEmpty()) {
                 log.warn("娌℃湁闇�瑕佸彂閫侀拤閽夋秷鎭殑鐢ㄦ埛");
@@ -80,11 +120,25 @@
         }
     }
 
-    private List<String> getDingtalkUserIdList() {
+    /**
+     * 鏍规嵁鎸囧畾鐨剆id鍒楄〃鑾峰彇閽夐拤鐢ㄦ埛ID鍒楄〃
+     *
+     * @param sidList sid鍒楄〃
+     * @return 閽夐拤鐢ㄦ埛ID鍒楄〃
+     */
+    private List<String> getDingtalkUserIdListBySids(List<Long> sidList) {
         try {
-            LambdaQueryWrapper<DingtalkInfo> wrapper = new LambdaQueryWrapper<>();
-            wrapper.ge(DingtalkInfo::getIsSendDingtalk, 1);
-            List<DingtalkInfo> list = list(wrapper);
+            if (sidList == null || sidList.isEmpty()) {
+                return new ArrayList<>();
+            }
+
+            // 鍘婚噸
+            sidList = sidList.stream().distinct().collect(Collectors.toList());
+
+            // 鏍规嵁sid鏌ヨDingtalkInfo
+            List<DingtalkInfo> list = baseMapper.selectList(
+                    new LambdaQueryWrapper<DingtalkInfo>().in(DingtalkInfo::getSid, sidList)
+            );
 
             if (list == null || list.isEmpty()) {
                 return new ArrayList<>();
@@ -149,6 +203,59 @@
         return client.execute(request, accessToken);
 
     }
+
+    /**
+     * 鑾峰彇isSendDingtalk=1鐨勭敤鎴风殑閽夐拤鐢ㄦ埛ID鍒楄〃锛堜繚鐣欏師鏈夋柟娉曪紝鍚戝悗鍏煎锛�
+     */
+    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<>();
+        }
+    }
 }
 
 

--
Gitblit v1.9.3