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