Browse Source

pms 瑞恒日报 审批 消息提醒

zhangcl 1 day ago
parent
commit
9b3a4a189e

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java

@@ -13,6 +13,7 @@ public interface PmsConstants {
     String GENERATE_OPERATE_TEMPLATE = "generate-operate";
 
     String DAILY_REPORT = "rdDailyReport";
+    String DAILY_REPORT_APPROVAL = "rdReportApproval";
 
     String MAINTAIN_OUT = "maintainOut";
     String MAINTAIN_OUT_TEMPLATE = "maintain-out";

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java

@@ -82,6 +82,9 @@ public class PmsMessage {
             if (PmsConstants.DAILY_REPORT.equals(businessType)) {
                 msg = "您有新的生产日报 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }
+            if (PmsConstants.DAILY_REPORT_APPROVAL.equals(businessType)) {
+                msg = "您有新的生产日报 " + name + "需要审批,请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            }
             if (PmsConstants.GENERATE_OPERATION.equals(businessType)) {
                 msg = "您有新的运行记录工单 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java

@@ -29,7 +29,7 @@ public interface IotRdDailyReportService {
      *
      * @param updateReqVO 更新信息
      */
-    void updateIotRdDailyReport(@Valid IotRdDailyReportSaveReqVO updateReqVO);
+    IotRdDailyReportDO updateIotRdDailyReport(@Valid IotRdDailyReportSaveReqVO updateReqVO);
 
     /**
      * 审批瑞都日报

+ 105 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachmentSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
@@ -20,12 +21,22 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport.IotRdDailyReportMapper;
 import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
 import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
 import cn.iocoder.yudao.module.supplier.enums.common.SupplierAuditStatusEnum;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dict.DictDataService;
+import cn.iocoder.yudao.module.system.service.permission.RoleService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import com.google.common.collect.ImmutableMap;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -36,12 +47,14 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_NOT_EXISTS;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 /**
  * 瑞都日报 Service 实现类
@@ -64,6 +77,18 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
     private DictDataService dictDataService;
     @Resource
     private DeptService deptService;
+    @Resource
+    private AdminUserService adminUserService;
+    @Resource
+    private RoleService roleService;
+    @Resource
+    private UserRoleMapper userRoleMapper;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
+    @Resource
+    private PmsMessage pmsMessage;
 
     @Override
     public Long createIotRdDailyReport(IotRdDailyReportSaveReqVO createReqVO) {
@@ -75,9 +100,9 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
     }
 
     @Override
-    public void updateIotRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
+    public IotRdDailyReportDO updateIotRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
         // 校验存在
-        validateIotRdDailyReportExists(updateReqVO.getId());
+        IotRdDailyReportDO dailyReport = validateIotRdDailyReportExists(updateReqVO.getId());
         // 如果 endTime = 24:00 转换成 23:59:59 否则会引发异常 Parse [2025-11-22 24:00] with format [yyyy-MM-dd HH:mm] error!
         String endTime = updateReqVO.getEndTime();
         if (StrUtil.isNotBlank(endTime)) {
@@ -127,6 +152,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     "type", AttachmentTypeEnum.EXTERNAL_RENTAL.getCode()
             ));
         }
+        updateObj.setReportName(dailyReport.getReportName());
+        return updateObj;
     }
 
     @Override
@@ -674,9 +701,84 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         if (CollUtil.isEmpty(reports)) {
             throw exception(IOT_RD_DAILY_REPORT_NOT_EXISTS);
         }
+        // 需要发送提醒消息的日报对象
+        List<IotRdDailyReportDO> tobeSendMsgReports = new ArrayList<>();
         reports.forEach(report -> {
-            updateIotRdDailyReport(report);
+            IotRdDailyReportDO updatedReport = updateIotRdDailyReport(report);
+            // 标识当前任务井是 普通井 或 平台井主井 关联的任务审批人发送提醒消息
+            if (1 == updatedReport.getPlatformWell() || 0 == updatedReport.getPlatformWell()) {
+                tobeSendMsgReports.add(updatedReport);
+            }
         });
+        // 考虑到平台井的情况 只向有审批权限的人发送一次 钉钉提醒及站内信
+        // 任务为平台井时 只向主井的任务的 填报人所属部门或上级项目部下 有审批权限的人 发送消息提醒
+        if (CollUtil.isNotEmpty(tobeSendMsgReports)) {
+            Set<Long> deptIds = new HashSet<>();
+            IotRdDailyReportDO tobeSendMsgReport = tobeSendMsgReports.get(0);
+            Long deptId = tobeSendMsgReport.getDeptId();
+            DeptDO dept = deptService.getDept(deptId);
+            if (ObjUtil.isNotEmpty(dept)) {
+                deptIds.add(dept.getId());
+                String type = dept.getType();
+                // 类型(公司级1 项目部2 队伍3)
+                // 如果当前部门是 队伍 查找上级 项目部
+                if ("3".equals(type)) {
+                    DeptDO projectDept = deptService.getDept(dept.getParentId());
+                    if (ObjUtil.isNotEmpty(projectDept)) {
+                        deptIds.add(projectDept.getId());
+                    }
+                }
+                // 查找当前部门及项目下有审批权限的人员 role 项目部日报审批RD
+                List<AdminUserDO> receivedMsgUsers = adminUserService.getUserListByDeptIds(deptIds);
+                //
+                if (CollUtil.isNotEmpty(receivedMsgUsers)) {
+                    Set<Long> userIds = new HashSet<>();
+                    receivedMsgUsers.forEach(user -> {
+                        userIds.add(user.getId());
+                    });
+                    RoleDO role = roleService.getRoleByCode("项目部日报审批RD");
+                    if (ObjUtil.isNotEmpty(role)) {
+                        Set<Long> roleIds = new HashSet<>();
+                        roleIds.add(role.getId());
+                        List<UserRoleDO> userRoles = userRoleMapper.selectListByRoleIds(roleIds);
+                        if (CollUtil.isNotEmpty(userRoles)) {
+                            // 提取有审批角色的所有用户ID(去重+空值过滤)
+                            Set<Long> roleUserIds = userRoles.stream()
+                                    .map(UserRoleDO::getUserId)
+                                    .filter(Objects::nonNull) // 过滤空userId
+                                    .collect(Collectors.toSet());
+
+                            // 计算两个集合的交集,得到最终目标用户ID
+                            Set<Long> targetUserIds = userIds.stream()
+                                    .filter(roleUserIds::contains)
+                                    .collect(Collectors.toSet());
+
+                            // 异步发送 站内信 钉钉消息
+                            if (CollUtil.isNotEmpty(targetUserIds)) {
+                                Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(targetUserIds);
+                                // 给多个用户发送 相同 的 提醒消息
+                                if (CollUtil.isNotEmpty(users)) {
+                                    CountDownLatch latch = new CountDownLatch(users.size());
+                                    users.forEach((userId, user) -> {
+                                        pmsThreadPoolTaskExecutor.execute(() -> {
+                                            try {
+                                                String mobile = user.getMobile();
+                                                if (StrUtil.isNotBlank(mobile) && StrUtil.isNotBlank(tobeSendMsgReport.getReportName())) {
+                                                    pmsMessage.sendMessage(tobeSendMsgReport.getId(), tobeSendMsgReport.getReportName(), PmsConstants.DAILY_REPORT_APPROVAL,
+                                                            userId, mobile);
+                                                }
+                                            } finally {
+                                                latch.countDown();
+                                            }
+                                        });
+                                    });
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 
     @Override