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 针对表【DINGTALK_INFO】的数据库操作Service实现 * @createDate 2025-06-20 16:12:48 */ @Service @RequiredArgsConstructor @Slf4j public class DingtalkInfoServiceImpl extends ServiceImpl implements DingtalkInfoService { private final SimpleExample simpleExample; private final DingtalkMsgMapper dingtalkMsgMapper; @Override public boolean sendMessage(String releaseNo) { try { // 查询钉钉消息内容 LambdaQueryWrapper 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 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 getDingtalkUserIdList() { try { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.ge(DingtalkInfo::getIsSendDingtalk, 1); List list = list(wrapper); if (list == null || list.isEmpty()) { return new ArrayList<>(); } // 使用stream流过滤出list中dingtalkId为空的数据 List emptyDingtalkIdList = list.stream() .filter(info -> !StringUtils.hasText(info.getDingtalkId())) .collect(Collectors.toList()); // 如果存在为空的数据就通过钉钉的接口获取,为dingtalkId赋值,并且更新数据库 if (!emptyDingtalkIdList.isEmpty()) { String accessToken = simpleExample.getAccessToken(); for (DingtalkInfo info : emptyDingtalkIdList) { if (StringUtils.hasText(info.getPhone())) { try { // 通过手机号获取钉钉用户ID 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) .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); } }