package com.gs.dingtalk.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.dingtalk.dto.DingTalkMessage; import com.gs.dingtalk.dto.QaMsgDto; import com.gs.dingtalk.entity.MesQaDingtalk; import com.gs.dingtalk.entity.QaSj; import com.gs.dingtalk.service.MesQaDingtalkService; import com.gs.dingtalk.mapper.MesQaDingtalkMapper; import com.gs.dingtalk.service.QaSjService; import com.gs.dingtalk.service.SimpleExample; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【MES_QA_DINGTALK】的数据库操作Service实现 * @createDate 2025-12-03 18:53:07 */ @Service @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class) public class MesQaDingtalkServiceImpl extends ServiceImpl implements MesQaDingtalkService { private final SimpleExample simpleExample; private final QaSjService qaSjService; @Override public void sendQaMsgSJ(QaMsgDto dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(MesQaDingtalk::getLineName, dto.getLineName()) .eq(MesQaDingtalk::getDepartmentname, dto.getWorkshopName()) .eq(MesQaDingtalk::getQaType, dto.getQaType()); //获取到用户id,当用户没有id时重新获取并更新MesQaDingtalk表 List list = list(wrapper); if (list.isEmpty()) { // 如果没有找到对应的用户,直接返回 return; } LambdaQueryWrapper qaSjQueryWrapper = new LambdaQueryWrapper<>(); qaSjQueryWrapper.eq(QaSj::getBillNo, dto.getBillNo()); QaSj qaSj = qaSjService.getOne(qaSjQueryWrapper, false); if (qaSj == null) { // 如果没有找到对应的检验信息,直接返回 return; } String message = String.format("首件[检验单号:%s, 物料编码:%s, 物料名称:%s, 车间:%s, 线体:%s, 工单号:%s, 检验结果:%s],请进行后续操作", qaSj.getBillNo(), qaSj.getItemNo(), qaSj.getItemName(), qaSj.getWorkshopName(), qaSj.getLineName(), qaSj.getDaa001(), qaSj.getJyjg()); // 把List中的userId使用,拼接起来变成userIdList这个变量 List sidList = list.stream() .map(MesQaDingtalk::getTelephone) .collect(Collectors.toList()); List userIdList = getDingtalkUserIdListByPhones(sidList); if (userIdList == null || userIdList.isEmpty()) { log.warn("没有有效的钉钉用户ID"); return; } String userIdListStr = String.join(",", userIdList); DingTalkMessage dingTalkMessage = null; try { dingTalkMessage = simpleExample.sendMessage(userIdListStr, message); } catch (Exception e) { throw new RuntimeException("发送钉钉消息失败", e); } if (dingTalkMessage != null && dingTalkMessage.getErrcode() == 0) { System.out.println("发送成功"); } else { System.out.println("发送失败"); } } private List getDingtalkUserIdListByPhones(List phoneList) { try { if (phoneList == null || phoneList.isEmpty()) { return new ArrayList<>(); } // 去重 phoneList = phoneList.stream().distinct().collect(Collectors.toList()); // 根据sid查询DingtalkInfo List list = baseMapper.selectList( new LambdaQueryWrapper().in(MesQaDingtalk::getTelephone, phoneList) ); if (list == null || list.isEmpty()) { return new ArrayList<>(); } // 使用stream流过滤出list中dingtalkId为空的数据 List emptyDingtalkIdList = list.stream() .filter(info -> !StringUtils.hasText(info.getUserId())) .collect(Collectors.toList()); // 如果存在为空的数据就通过钉钉的接口获取,为dingtalkId赋值,并且更新数据库 if (!emptyDingtalkIdList.isEmpty()) { String accessToken = simpleExample.getAccessToken(); for (MesQaDingtalk info : emptyDingtalkIdList) { if (StringUtils.hasText(info.getTelephone())) { try { // 通过手机号获取钉钉用户ID com.dingtalk.api.response.OapiV2UserGetbymobileResponse response = simpleExample.getOapiV2UserGetbymobileResponse(info.getTelephone(), accessToken); if (response != null && response.getResult() != null) { info.setUserId(response.getResult().getUserid()); // 更新数据库 updateById(info); } } catch (Exception e) { log.error("获取钉钉用户ID失败,手机号:" + info.getTelephone()); } } } } // 不存在为空的数据或者处理完空数据后,返回所有有效的dingtalkId列表 return list.stream() .map(MesQaDingtalk::getUserId) .filter(StringUtils::hasText) .distinct() .collect(Collectors.toList()); } catch (Exception e) { log.error("获取钉钉用户列表失败", e); return new ArrayList<>(); } } }