啊鑫
2 天以前 1d1a9472606e6c1ed52be701c3ffc98aeb360cfd
钉钉根据人员动态推送
已修改3个文件
133 ■■■■■ 文件已修改
src/main/java/com/gs/xky/entity/DingtalkInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/entity/DingtalkMsg.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/Impl/DingtalkInfoServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/entity/DingtalkInfo.java
@@ -36,4 +36,8 @@
     * 钉钉通知
     */
    private Integer isSendDingtalk;
    /**
     * 固定推送,1表示是固定推送的
     */
    private Integer isHead;
}
src/main/java/com/gs/xky/entity/DingtalkMsg.java
@@ -36,11 +36,19 @@
     */
    private String itemNo;
    /**
     * 审核人
     * 审核人中文
     */
    private String fname;
    /**
     * 处理方式
     */
    private String fngHandle;
    /**
     * 采购人员
     */
    private String employeeName;
    /**
     * 审核人
     */
    private String modify1By;
}
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. 采购人员(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("没有需要发送钉钉消息的用户");
@@ -80,11 +120,25 @@
        }
    }
    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<>();
@@ -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中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<>();
        }
    }
}