فهرست منبع

Merge remote-tracking branch 'origin/master'

Zimo 2 روز پیش
والد
کامیت
652ce35e06

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

@@ -27,6 +27,9 @@ public class IotProjectInfoRespVO {
     @Schema(description = "组织id", example = "31703")
     private Long deptId;
 
+    @Schema(description = "项目部id", example = "123")
+    private Long projectDeptId;
+
     @Schema(description = "部门名称", example = "芋艿")
     private String deptName;
 

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

@@ -17,6 +17,9 @@ public class IotProjectInfoSaveReqVO {
     @Schema(description = "组织id", example = "31703")
     private Long deptId;
 
+    @Schema(description = "项目部id", example = "123")
+    private Long projectDeptId;
+
     @Schema(description = "部门名称", example = "芋艿")
     private String deptName;
 

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/IotRdDailyReportController.java

@@ -1862,6 +1862,9 @@ public class IotRdDailyReportController {
             }
         });
 
+        // 没有工作量的日报 也需要体现出部门 施工队伍
+        Map<Long, DeptDO> noWorkDeptMap = deptService.getDeptMap(convertList(reports, IotRdDailyReportDO::getDeptId));
+
         // 查询 当前分页 所有部门 任务井 日报数据 小计工作量
         IotRdDailyReportPageReqVO currentTaskReqVO = new IotRdDailyReportPageReqVO();
         currentTaskReqVO.setTaskIds(convertSet(reports, IotRdDailyReportDO::getTaskId));
@@ -2326,6 +2329,12 @@ public class IotRdDailyReportController {
             }
             // 部门信息 任务中关联的施工队伍
             findAndThen(taskTeamsPair, reportVO.getTaskId(), deptNames -> reportVO.setDeptName(deptNames));
+            // 无工作量日报 设置部门 施工队伍
+            if (StrUtil.isBlank(reportVO.getDeptName())) {
+                if (noWorkDeptMap.containsKey(reportVO.getDeptId())) {
+                    reportVO.setDeptName(noWorkDeptMap.get(reportVO.getDeptId()).getName());
+                }
+            }
             // 日报关联的项目信息
             findAndThen(projectPair, reportVO.getProjectId(), contractName -> reportVO.setContractName(contractName));
             // 日报关联的任务信息

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

@@ -139,4 +139,7 @@ public class IotRhDailyReportPageReqVO extends PageParam {
 
     @Schema(description = "非生产时效", example = "Y")
     private String nonProductFlag;
+
+    @Schema(description = "施工区域", example = "一厂")
+    private String location;
 }

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojectinfo/IotProjectInfoDO.java

@@ -36,6 +36,10 @@ public class IotProjectInfoDO extends BaseDO {
      * 组织id
      */
     private Long deptId;
+    /**
+     * 专业公司项目部id
+     */
+    private Long projectDeptId;
     /**
      * 部门名称
      */

+ 79 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/mainworkorder/CreateMainWorkOrderJob.java

@@ -31,8 +31,13 @@ import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderB
 import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
 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.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+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.mysql.permission.UserRoleMapper;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import cn.iocoder.yudao.module.system.service.permission.RoleService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -78,6 +83,10 @@ public class CreateMainWorkOrderJob implements JobHandler {
     private PmsMessage pmsMessage;
     @Resource
     private DeptService deptService;
+    @Resource
+    private RoleService roleService;
+    @Resource
+    private UserRoleMapper userRoleMapper;
 
     @Override
     @TenantJob
@@ -360,6 +369,8 @@ public class CreateMainWorkOrderJob implements JobHandler {
                                 workOrder.setName(plan.getName() + " 工单");
                                 if (finalDeviceMap.containsKey(Long.valueOf(planIdDeviceIdStrS[1]))) {
                                     Long deptId = finalDeviceMap.get(Long.valueOf(planIdDeviceIdStrS[1])).getDeptId();
+                                    // 设备编码
+                                    String deviceCode = finalDeviceMap.get(Long.valueOf(planIdDeviceIdStrS[1])).getDeviceCode();
                                     workOrder.setDeptId(deptId);
                                     // 查询 deptId 对应的部门名称
                                     String deptName = StrUtil.EMPTY;
@@ -399,11 +410,11 @@ public class CreateMainWorkOrderJob implements JobHandler {
                                         }
                                     }
                                     String workOrderCHName = StrUtil.EMPTY;
-                                    workOrderCHName = deptCHName + "/" + responsibleName + "/"
+                                    workOrderCHName = deptCHName + "/" + responsibleName + "/" + deviceCode + "/"
                                             + deviceCHName + "/" + currentDate + "-保养工单";
                                     String workOrderENName = StrUtil.EMPTY;
                                     if (StrUtil.isNotBlank(deviceENName) && StrUtil.isNotBlank(deptENName)) {
-                                        workOrderENName = deptENName + "/" + responsibleName + "/"
+                                        workOrderENName = deptENName + "/" + responsibleName + "/" + deviceCode + "/"
                                                 + deviceENName + "/" + currentDate + "-Maintenance Work Order";
                                     }
                                     workOrder.setName(workOrderCHName + "~~en**" + workOrderENName);
@@ -468,18 +479,69 @@ public class CreateMainWorkOrderJob implements JobHandler {
             }
             // 向工单责任人发送 站内信及 钉钉消息
             if (CollUtil.isNotEmpty(workOrders)) {
+                // 查询 字段 email 值 = 新疆项目管理RY 的部门
+                DeptListReqVO deptReqVO = new DeptListReqVO();
+                deptReqVO.setEmail("新疆项目管理RY");
+                List<DeptDO> departments = deptService.getDeptList(deptReqVO);
+                Set<Long> parentDeptIds = new HashSet<>();
+                if (CollUtil.isNotEmpty(departments)) {
+                    departments.forEach(dept -> {
+                        parentDeptIds.add(dept.getId());
+                    });
+                }
+                // 查询用户手机号的用户列表
+                Set<Long> targetUserIds = new HashSet<>();
+                if (CollUtil.isNotEmpty(parentDeptIds)) {
+                    // 查询指定角色对应的用户
+                    RoleDO role = roleService.getRoleByCode("新疆项目管理RY");
+                    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());
+                            targetUserIds.addAll(roleUserIds);
+                        }
+                    }
+                }
+
                 // 先查询所有工单责任人的手机号
                 Set<Long> personIds = new HashSet<>(convertList(workOrders, order -> Long.valueOf(order.getResponsiblePerson())));
+                if (CollUtil.isNotEmpty(targetUserIds)) {
+                    personIds.addAll(targetUserIds);
+                }
                 Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(personIds);
                 // 建立保养工单与 用户手机号的 对应关系
                 Map<Long, String> orderMobilePair = new HashMap<>();
+                Set<Long> orderDeptIds = new HashSet<>();
                 workOrders.forEach(order -> {
                     if (users.containsKey(Long.valueOf(order.getResponsiblePerson()))) {
                         AdminUserRespDTO user = users.get(Long.valueOf(order.getResponsiblePerson()));
                         orderMobilePair.put(order.getId(), user.getMobile());
                     }
+                    // 收集所有工单的部门 查询上级部门是否是 瑞鹰-新疆项目部
+                    orderDeptIds.add(order.getDeptId());
                 });
+
+                // 查询工单部门信息
+                Set<Long> ryXjDeptIds = new HashSet<>();
+                if (CollUtil.isNotEmpty(orderDeptIds)) {
+                    List<DeptDO> deptInfos = deptService.getDeptList(orderDeptIds);
+                    if (CollUtil.isNotEmpty(deptInfos)) {
+                        deptInfos.forEach(dept -> {
+                            if (parentDeptIds.contains(dept.getParentId())) {
+                                ryXjDeptIds.add(dept.getId());
+                            }
+                        });
+                    }
+                }
+                System.out.println("目标部门id集合:" + ryXjDeptIds.size());
                 // 异步多线程发送 站内信 钉钉 消息
+                // 如果是 瑞鹰 新疆项目部的保养工单,需要提醒到 ‘新疆项目管理RY’ 角色
                 workOrders.forEach(order -> {
                     CountDownLatch latch = new CountDownLatch(workOrders.size());
                     pmsThreadPoolTaskExecutor.execute(() -> {
@@ -488,6 +550,21 @@ public class CreateMainWorkOrderJob implements JobHandler {
                                 String mobile = orderMobilePair.get(order.getId());
                                 pmsMessage.sendMessage(order.getId(), order.getName(), PmsConstants.GENERATE_MAINTENANCE,
                                         Long.valueOf(order.getResponsiblePerson()), mobile);
+                                // 如果是瑞鹰的 新疆项目部保养工单 同时提醒到 指定拥有指定角色 新疆项目管理RY 的人
+                                System.out.println("工单部门id:" + order.getDeptId());
+                                System.out.println("目标用户id集合:" + targetUserIds.size());
+                                if (ryXjDeptIds.contains(order.getDeptId())) {
+                                    if (CollUtil.isNotEmpty(targetUserIds)) {
+                                        List<Long> userIdList = new ArrayList<>(targetUserIds);
+                                        Long targetUserId = userIdList.get(0);
+                                        if (users.containsKey(targetUserId)) {
+                                            AdminUserRespDTO targetUser = users.get(targetUserId);
+                                            String targetUserMobile = targetUser.getMobile();
+                                            pmsMessage.sendMessage(order.getId(), order.getName(), PmsConstants.GENERATE_MAINTENANCE,
+                                                    targetUserId, targetUserMobile);
+                                        }
+                                    }
+                                }
                             }
                         } finally {
                             latch.countDown();

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java

@@ -21,4 +21,7 @@ public class DeptListReqVO {
     @Schema(description = "指定的部门id", example = "123")
     private Long deptId;
 
+    @Schema(description = "邮箱 扩展字段,模糊匹配", example = "新疆项目管理RY")
+    private String email;
+
 }

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java

@@ -17,6 +17,7 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
     default List<DeptDO> selectList(DeptListReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<DeptDO>()
                 .likeIfPresent(DeptDO::getName, reqVO.getName())
+                .eqIfPresent(DeptDO::getEmail, reqVO.getEmail())
                 .inIfPresent(DeptDO::getId, reqVO.getDeptIds())
                 .eqIfPresent(DeptDO::getStatus, reqVO.getStatus()));
     }