| | |
| | | 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; |
| | |
| | | |
| | | private final SimpleExample simpleExample; |
| | | private final DingtalkMsgMapper dingtalkMsgMapper; |
| | | private final MesStaffMapper mesStaffMapper; |
| | | |
| | | @Override |
| | | public boolean sendMessage(String releaseNo) { |
| | |
| | | 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. 采购人员(employeeName) |
| | | 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. 根据收集的sid获取dingtalkId (复用getDingtalkUserIdList的关键逻辑) |
| | | List<String> userIdList = getDingtalkUserIdListBySids(sidList); |
| | | |
| | | if (userIdList == null || userIdList.isEmpty()) { |
| | | log.warn("没有需要发送钉钉消息的用户"); |
| | |
| | | } |
| | | } |
| | | |
| | | private List<String> getDingtalkUserIdList() { |
| | | /** |
| | | * 根据指定的sid列表获取钉钉用户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<>(); |
| | |
| | | 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中dingtalkId为空的数据 |
| | | List<DingtalkInfo> 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) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | } catch (Exception e) { |
| | | log.error("获取钉钉用户列表失败", e); |
| | | return new ArrayList<>(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |