瀏覽代碼

pms 生产异常消息提醒 发送markdown类型的钉钉消息

zhangcl 10 小時之前
父節點
當前提交
403b5f5f5f

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java

@@ -106,7 +106,7 @@ public class IotRhDailyReportController {
 
     @PutMapping("/update")
     @Operation(summary = "更新瑞恒日报")
-    @PreAuthorize("@ss.hasPermission('pms:iot-rh-daily-report:update')")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rh-daily-report:modify')")
     public CommonResult<Boolean> updateIotRhDailyReport(@Valid @RequestBody IotRhDailyReportSaveReqVO updateReqVO) {
         iotRhDailyReportService.updateIotRhDailyReport(updateReqVO);
         return success(true);

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/vo/IotRhDailyReportSaveReqVO.java

@@ -43,6 +43,9 @@ public class IotRhDailyReportSaveReqVO {
     @Schema(description = "当日注水时间(H)")
     private BigDecimal dailyInjectWaterTime;
 
+    @Schema(description = "当日油耗(L)")
+    private BigDecimal dailyOilUsage;
+
     @Schema(description = "当日用电量(kWh)")
     private BigDecimal dailyPowerUsage;
 

+ 5 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java

@@ -112,7 +112,7 @@ public class PmsMessage {
 
             // 生产异常
             if (PmsConstants.PRODUCTION_EXCEPTION.equals(businessType)) {
-                msg = "生产异常 \n" + name + "["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+                msg = "生产异常  \n" + name + "["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }
 
             // 瑞鹰项目启动设备整改
@@ -159,9 +159,12 @@ public class PmsMessage {
             }
 
             if (PmsConstants.FAILURE_NO_PASS.equals(businessType) || PmsConstants.ALARM_MESSAGE.equals(businessType)
-                    || PmsConstants.GENERATE_QHSE_CERT.equals(businessType) || PmsConstants.WEEK_ALARM_MESSAGE.equals(businessType) || PmsConstants.PRODUCTION_EXCEPTION.equals(businessType)) {
+                    || PmsConstants.GENERATE_QHSE_CERT.equals(businessType) || PmsConstants.WEEK_ALARM_MESSAGE.equals(businessType)) {
                 //通知设备状态变更为观察使用
                 dingtalkSendApi.send(mobile, msg, "text",url,  title);
+            } else if (PmsConstants.PRODUCTION_EXCEPTION.equals(businessType)) {
+                // markdown 类型消息 支持 文字加粗
+                dingtalkSendApi.send(mobile, msg, "markdown",url,  title);
             } else {
                 dingtalkSendApi.send(mobile, msg,"link", url, title);
             }

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotfivedailyreport/IotFiveDailyReportServiceImpl.java

@@ -172,8 +172,8 @@ public class IotFiveDailyReportServiceImpl implements IotFiveDailyReportService
                     "[队伍]:{}\n" +
                     "[井号]:{}\n" +
                     "[故障描述]:{}\n" +
-                    "[当前处理进度]:{}\n" +
-                    "[下步处理计划]:{}\n" +
+                    "[**当前处理进度**]:{}\n" +
+                    "[**下步处理计划**]:{}\n" +
                     "[累计误工时间]:{}\n";
 
             String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,

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

@@ -330,8 +330,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                         "[队伍]:{}\n" +
                         "[井号]:{}\n" +
                         "[故障描述]:{}\n" +
-                        "[当前处理进度]:{}\n" +
-                        "[下步处理计划]:{}\n" +
+                        "[**当前处理进度**]:{}\n" +
+                        "[**下步处理计划**]:{}\n" +
                         "[累计误工时间]:{}\n";
 
                 String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
@@ -502,6 +502,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         // 平台井需要更新任务施工状态的关联井
         List<IotProjectTaskDO> relatedPlatformTasks = new ArrayList<>();
         if (SupplierAuditStatusEnum.REJECT.getStatus().equals(updateReqVO.getAuditStatus())) {
+            // 审批拒绝
             dailyReport.setStatus(0);
         } else {
             // 审核通过 更新关联任务状态

+ 107 - 107
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

@@ -26,7 +26,6 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
@@ -37,7 +36,6 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapp
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojectinfo.IotProjectInfoMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrhdailyreport.IotRhDailyReportMapper;
-import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
 import cn.iocoder.yudao.module.pms.job.IotDeviceCarFuelVO;
 import cn.iocoder.yudao.module.pms.message.PmsMessage;
 import cn.iocoder.yudao.module.pms.util.ZHBDUtil;
@@ -852,6 +850,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         Long deptId = dailyReport.getDeptId();
         Long taskId = dailyReport.getTaskId();
         if (SupplierAuditStatusEnum.REJECT.getStatus().equals(updateReqVO.getAuditStatus())) {
+            // 审批拒绝
             dailyReport.setStatus(0);
             // 审批拒绝后需要向 日报填报人 发送消息提醒 每个队伍暂时只有1人 随机取1人
             DeptDO dept = deptService.getDept(deptId);
@@ -875,114 +874,115 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                     });
                 }
             }
-        }
-        // 审核同意 将生产异常情况 (npt 工程质量) 发送到拥有 生产异常通知 角色的人员
-        BigDecimal accidentTime = dailyReport.getAccidentTime();
-        if (ObjUtil.isNotEmpty(accidentTime) && accidentTime.compareTo(BigDecimal.ZERO) > 0) {
-
-            String companyName = "瑞恒兴域";
-            BigDecimal day = accidentTime.divide(new BigDecimal("24"), 2, RoundingMode.HALF_UP);
-            String accidentDay = day + "T";
-            // 异常情况
-            String malfunction = StrUtil.blankToDefault(dailyReport.getMalfunction(), "无");
-            DeptDO dept = deptService.getDept(deptId);
-
-            List<String> projectDeptNames = new ArrayList<>();
-            // 查询瑞鹰 163l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
-            Set<Long> userIds = new HashSet<>();
-            Set<Long> deptIds = new HashSet<>();
-            DataPermissionUtils.executeIgnore(() -> {
-                // 封装以上消息内容 发送到公司 角色 (生产异常通知)
-                // 查询瑞恒 157l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
-                deptIds.add(157l);
-                List<AdminUserDO> companyUsers = adminUserService.getUserListByDeptIds(deptIds);
-                if (CollUtil.isNotEmpty(companyUsers)) {
-                    companyUsers.forEach(user -> {
-                        userIds.add(user.getId());
-                    });
-                }
-                deptIds.clear();
-                deptIds.add(156l);
-                List<AdminUserDO> groupUsers = adminUserService.getUserListByDeptIds(deptIds);
-                if (CollUtil.isNotEmpty(groupUsers)) {
-                    groupUsers.forEach(user -> {
-                        userIds.add(user.getId());
-                    });
-                }
-                // 查询当前队伍的上级项目部 过滤掉数据权限
-                DeptDO projectDept = deptService.getDept(dept.getParentId());
-                if (ObjUtil.isNotEmpty(projectDept)) {
-                    projectDeptNames.add(projectDept.getName());
-                }
-            });
+        } else {
+            // 审核同意 将生产异常情况 (npt 工程质量) 发送到拥有 生产异常通知 角色的人员
+            BigDecimal accidentTime = dailyReport.getAccidentTime();
+            if (ObjUtil.isNotEmpty(accidentTime) && accidentTime.compareTo(BigDecimal.ZERO) > 0) {
+
+                String companyName = "瑞恒兴域";
+                BigDecimal day = accidentTime.divide(new BigDecimal("24"), 2, RoundingMode.HALF_UP);
+                String accidentDay = day + "T";
+                // 异常情况
+                String malfunction = StrUtil.blankToDefault(dailyReport.getMalfunction(), "无");
+                DeptDO dept = deptService.getDept(deptId);
+
+                List<String> projectDeptNames = new ArrayList<>();
+                // 查询瑞鹰 163l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
+                Set<Long> userIds = new HashSet<>();
+                Set<Long> deptIds = new HashSet<>();
+                DataPermissionUtils.executeIgnore(() -> {
+                    // 封装以上消息内容 发送到公司 角色 (生产异常通知)
+                    // 查询瑞恒 157l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
+                    deptIds.add(157l);
+                    List<AdminUserDO> companyUsers = adminUserService.getUserListByDeptIds(deptIds);
+                    if (CollUtil.isNotEmpty(companyUsers)) {
+                        companyUsers.forEach(user -> {
+                            userIds.add(user.getId());
+                        });
+                    }
+                    deptIds.clear();
+                    deptIds.add(156l);
+                    List<AdminUserDO> groupUsers = adminUserService.getUserListByDeptIds(deptIds);
+                    if (CollUtil.isNotEmpty(groupUsers)) {
+                        groupUsers.forEach(user -> {
+                            userIds.add(user.getId());
+                        });
+                    }
+                    // 查询当前队伍的上级项目部 过滤掉数据权限
+                    DeptDO projectDept = deptService.getDept(dept.getParentId());
+                    if (ObjUtil.isNotEmpty(projectDept)) {
+                        projectDeptNames.add(projectDept.getName());
+                    }
+                });
 
-            // 队伍名称
-            String deptName = ObjUtil.isNotEmpty(dept) ? dept.getName() : StrUtil.EMPTY;
-            // 项目部名称
-            String projectDeptName = CollUtil.isNotEmpty(projectDeptNames) ? projectDeptNames.get(0) : StrUtil.EMPTY;
-            String wellName = "无";
-            if (ObjUtil.isNotEmpty(taskId)) {
-                IotProjectTaskDO task = iotProjectTaskMapper.selectById(taskId);
-                if (ObjUtil.isNotEmpty(task)) {
-                    wellName = task.getWellName();
+                // 队伍名称
+                String deptName = ObjUtil.isNotEmpty(dept) ? dept.getName() : StrUtil.EMPTY;
+                // 项目部名称
+                String projectDeptName = CollUtil.isNotEmpty(projectDeptNames) ? projectDeptNames.get(0) : StrUtil.EMPTY;
+                String wellName = "无";
+                if (ObjUtil.isNotEmpty(taskId)) {
+                    IotProjectTaskDO task = iotProjectTaskMapper.selectById(taskId);
+                    if (ObjUtil.isNotEmpty(task)) {
+                        wellName = task.getWellName();
+                    }
                 }
-            }
-            // 当前处理进度 当日施工简报
-            String brief = StrUtil.blankToDefault(dailyReport.getProductionStatus(), "无");
-            // 下步计划
-            String nextPlan = StrUtil.blankToDefault(dailyReport.getNextPlan(), "无");
-            // 故障误工时间 accidentTime H
-            String PRODUCTION_EXCEPTION_MSG_TEMPLATE =
-                    "[公司]:{}\n" +
-                    "[项目部]:{}\n" +
-                    "[队伍]:{}\n" +
-                    "[井号]:{}\n" +
-                    "[故障描述]:{}\n" +
-                    "[当前处理进度]:{}\n" +
-                    "[下步处理计划]:{}\n" +
-                    "[累计误工时间]:{}\n";
-
-            String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
-                    companyName, projectDeptName, deptName, wellName,
-                    malfunction, brief, nextPlan, accidentDay
-            );
-
-            RoleDO role = roleService.getRoleByCode("生产异常通知");
-            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(finalMsgTitle)) {
-                                            pmsMessage.sendMessage(dailyReport.getId(), finalMsgTitle, PmsConstants.PRODUCTION_EXCEPTION,
-                                                    userId, mobile);
+                // 当前处理进度 当日施工简报
+                String brief = StrUtil.blankToDefault(dailyReport.getProductionStatus(), "无");
+                // 下步计划
+                String nextPlan = StrUtil.blankToDefault(dailyReport.getNextPlan(), "无");
+                // 故障误工时间 accidentTime H
+                String PRODUCTION_EXCEPTION_MSG_TEMPLATE =
+                        "[公司]:{}  \n" +
+                        "[项目部]:{}  \n" +
+                        "[队伍]:{}  \n" +
+                        "[井号]:{}  \n" +
+                        "[故障描述]:{}  \n" +
+                        "[**当前处理进度**]:{}  \n" +
+                        "[**下步处理计划**]:{}  \n" +
+                        "[累计误工时间]:{}  \n";
+
+                String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
+                        companyName, projectDeptName, deptName, wellName,
+                        malfunction, brief, nextPlan, accidentDay
+                );
+
+                RoleDO role = roleService.getRoleByCode("生产异常通知");
+                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(finalMsgTitle)) {
+                                                pmsMessage.sendMessage(dailyReport.getId(), finalMsgTitle, PmsConstants.PRODUCTION_EXCEPTION,
+                                                        userId, mobile);
+                                            }
+                                        } finally {
+                                            latch.countDown();
                                         }
-                                    } finally {
-                                        latch.countDown();
-                                    }
+                                    });
                                 });
-                            });
+                            }
                         }
                     }
                 }
@@ -1057,7 +1057,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         // 更新
         IotRhDailyReportDO updateObj = BeanUtils.toBean(updateReqVO, IotRhDailyReportDO.class);
         // 编辑后 直接设置 已经 审核通过
-        updateObj.setAuditStatus(FailureAuditStatusEnum.APPROVE.getStatus());
+        // updateObj.setAuditStatus(FailureAuditStatusEnum.APPROVE.getStatus());
         iotRhDailyReportMapper.updateById(updateObj);
     }
 

+ 104 - 103
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportServiceImpl.java

@@ -982,113 +982,114 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
                     });
                 }
             }
-        }
-        // 审核同意 将生产异常情况 (npt 工程质量) 发送到拥有 生产异常通知 角色的人员
-        BigDecimal accidentTime = dailyReport.getAccidentTime();
-        if (ObjUtil.isNotEmpty(accidentTime) && accidentTime.compareTo(BigDecimal.ZERO) > 0) {
-
-            String companyName = "瑞鹰国际";
-            BigDecimal day = accidentTime.divide(new BigDecimal("24"), 2, RoundingMode.HALF_UP);
-            String accidentDay = day + "T";
-            // 异常情况
-            String malfunction = StrUtil.blankToDefault(dailyReport.getMalfunction(), "无");
-            DeptDO dept = deptService.getDept(deptId);
-            List<String> projectDeptNames = new ArrayList<>();
-
-            // 封装以上消息内容 发送到公司 角色 (生产异常通知)
-            // 查询瑞鹰 158l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
-            Set<Long> userIds = new HashSet<>();
-            Set<Long> deptIds = new HashSet<>();
-            DataPermissionUtils.executeIgnore(() -> {
-                deptIds.add(158l);
-                List<AdminUserDO> companyUsers = adminUserService.getUserListByDeptIds(deptIds);
-                if (CollUtil.isNotEmpty(companyUsers)) {
-                    companyUsers.forEach(user -> {
-                        userIds.add(user.getId());
-                    });
-                }
-                deptIds.clear();
-                deptIds.add(156l);
-                List<AdminUserDO> groupUsers = adminUserService.getUserListByDeptIds(deptIds);
-                if (CollUtil.isNotEmpty(groupUsers)) {
-                    groupUsers.forEach(user -> {
-                        userIds.add(user.getId());
-                    });
-                }
-                // 查询当前队伍的上级项目部 过滤掉数据权限
-                DeptDO projectDept = deptService.getDept(dept.getParentId());
-                if (ObjUtil.isNotEmpty(projectDept)) {
-                    projectDeptNames.add(projectDept.getName());
-                }
-            });
+        } else {
+            // 审核同意 将生产异常情况 (npt 工程质量) 发送到拥有 生产异常通知 角色的人员
+            BigDecimal accidentTime = dailyReport.getAccidentTime();
+            if (ObjUtil.isNotEmpty(accidentTime) && accidentTime.compareTo(BigDecimal.ZERO) > 0) {
+
+                String companyName = "瑞鹰国际";
+                BigDecimal day = accidentTime.divide(new BigDecimal("24"), 2, RoundingMode.HALF_UP);
+                String accidentDay = day + "T";
+                // 异常情况
+                String malfunction = StrUtil.blankToDefault(dailyReport.getMalfunction(), "无");
+                DeptDO dept = deptService.getDept(deptId);
+                List<String> projectDeptNames = new ArrayList<>();
+
+                // 封装以上消息内容 发送到公司 角色 (生产异常通知)
+                // 查询瑞鹰 158l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
+                Set<Long> userIds = new HashSet<>();
+                Set<Long> deptIds = new HashSet<>();
+                DataPermissionUtils.executeIgnore(() -> {
+                    deptIds.add(158l);
+                    List<AdminUserDO> companyUsers = adminUserService.getUserListByDeptIds(deptIds);
+                    if (CollUtil.isNotEmpty(companyUsers)) {
+                        companyUsers.forEach(user -> {
+                            userIds.add(user.getId());
+                        });
+                    }
+                    deptIds.clear();
+                    deptIds.add(156l);
+                    List<AdminUserDO> groupUsers = adminUserService.getUserListByDeptIds(deptIds);
+                    if (CollUtil.isNotEmpty(groupUsers)) {
+                        groupUsers.forEach(user -> {
+                            userIds.add(user.getId());
+                        });
+                    }
+                    // 查询当前队伍的上级项目部 过滤掉数据权限
+                    DeptDO projectDept = deptService.getDept(dept.getParentId());
+                    if (ObjUtil.isNotEmpty(projectDept)) {
+                        projectDeptNames.add(projectDept.getName());
+                    }
+                });
 
-            // 队伍名称
-            String deptName = ObjUtil.isNotEmpty(dept) ? dept.getName() : StrUtil.EMPTY;
-            // 项目部名称
-            String projectDeptName = CollUtil.isNotEmpty(projectDeptNames) ? projectDeptNames.get(0) : StrUtil.EMPTY;
-            String wellName = "无";
-            if (ObjUtil.isNotEmpty(taskId)) {
-                IotProjectTaskDO task = iotProjectTaskMapper.selectById(taskId);
-                if (ObjUtil.isNotEmpty(task)) {
-                    wellName = task.getWellName();
+                // 队伍名称
+                String deptName = ObjUtil.isNotEmpty(dept) ? dept.getName() : StrUtil.EMPTY;
+                // 项目部名称
+                String projectDeptName = CollUtil.isNotEmpty(projectDeptNames) ? projectDeptNames.get(0) : StrUtil.EMPTY;
+                String wellName = "无";
+                if (ObjUtil.isNotEmpty(taskId)) {
+                    IotProjectTaskDO task = iotProjectTaskMapper.selectById(taskId);
+                    if (ObjUtil.isNotEmpty(task)) {
+                        wellName = task.getWellName();
+                    }
                 }
-            }
-            // 当前处理进度 当日施工简报
-            String brief = StrUtil.blankToDefault(dailyReport.getConstructionBrief(), "无");
-            // 下步计划
-            String nextPlan = StrUtil.blankToDefault(dailyReport.getNextPlan(), "无");
-            // 故障误工时间 accidentTime H
-            String PRODUCTION_EXCEPTION_MSG_TEMPLATE =
-                    "[公司]:{}\n" +
-                    "[项目部]:{}\n" +
-                    "[队伍]:{}\n" +
-                    "[井号]:{}\n" +
-                    "[故障描述]:{}\n" +
-                    "[当前处理进度]:{}\n" +
-                    "[下步处理计划]:{}\n" +
-                    "[累计误工时间]:{}\n";
-
-            String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
-                    companyName, projectDeptName, deptName, wellName,
-                    malfunction, brief, nextPlan, accidentDay
-            );
-
-            RoleDO role = roleService.getRoleByCode("生产异常通知");
-            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(finalMsgTitle)) {
-                                            pmsMessage.sendMessage(dailyReport.getId(), finalMsgTitle, PmsConstants.PRODUCTION_EXCEPTION,
-                                                    userId, mobile);
+                // 当前处理进度 当日施工简报
+                String brief = StrUtil.blankToDefault(dailyReport.getConstructionBrief(), "无");
+                // 下步计划
+                String nextPlan = StrUtil.blankToDefault(dailyReport.getNextPlan(), "无");
+                // 故障误工时间 accidentTime H
+                String PRODUCTION_EXCEPTION_MSG_TEMPLATE =
+                        "[公司]:{}\n" +
+                        "[项目部]:{}\n" +
+                        "[队伍]:{}\n" +
+                        "[井号]:{}\n" +
+                        "[故障描述]:{}\n" +
+                        "[**当前处理进度**]:{}\n" +
+                        "[**下步处理计划**]:{}\n" +
+                        "[累计误工时间]:{}\n";
+
+                String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
+                        companyName, projectDeptName, deptName, wellName,
+                        malfunction, brief, nextPlan, accidentDay
+                );
+
+                RoleDO role = roleService.getRoleByCode("生产异常通知");
+                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(finalMsgTitle)) {
+                                                pmsMessage.sendMessage(dailyReport.getId(), finalMsgTitle, PmsConstants.PRODUCTION_EXCEPTION,
+                                                        userId, mobile);
+                                            }
+                                        } finally {
+                                            latch.countDown();
                                         }
-                                    } finally {
-                                        latch.countDown();
-                                    }
+                                    });
                                 });
-                            });
+                            }
                         }
                     }
                 }