Explorar el Código

巡检模块-审批流程

chenshudong hace 2 meses
padre
commit
3a41aa9776

+ 1 - 1
airport-check/src/main/java/com/sundot/airport/check/handler/CheckCorrectionApprovalHandler.java

@@ -43,7 +43,7 @@ public class CheckCorrectionApprovalHandler implements BusinessApprovalHandler {
43 43
     public boolean supports(String businessType) {
44 44
         return "PERSONAL_CHECK".equals(businessType)
45 45
                 || "GROUP_CHECK".equals(businessType)
46
-                || "SECTION_CHECK".equals(businessType)
46
+                || "DEPARTMENT_CHECK".equals(businessType)
47 47
                 || "BRIGADE_CHECK".equals(businessType);
48 48
     }
49 49
 

+ 1 - 1
airport-check/src/main/java/com/sundot/airport/check/service/impl/CheckCorrectionServiceImpl.java

@@ -380,7 +380,7 @@ public class CheckCorrectionServiceImpl extends ServiceImpl<CheckCorrectionMappe
380 380
         } else if (StringUtils.equals(CheckLevelEnum.DEPARTMENT_LEVEL.getCode(), checkCorrection.getCheckedLevel())) {
381 381
             Map<String, Object> requestData = new HashMap<>();
382 382
             requestData.put("businessId", checkCorrection.getId());//业务ID
383
-            requestData.put("checkType", "SECURITY_BREACH");//检查类型
383
+            requestData.put("checkType", CheckLevelEnum.DEPARTMENT_LEVEL.getCode());//检查类型
384 384
             requestData.put("severity", "");//严重程度
385 385
             requestData.put("location", checkCorrection.getChannelName());//位置
386 386
             requestData.put("sectionLeaderId", checkCorrection.getResponsibleUserId());//责任人

+ 79 - 7
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/ApprovalEngineServiceImpl.java

@@ -9,8 +9,11 @@ import java.util.stream.Collectors;
9 9
 import java.util.regex.Pattern;
10 10
 import java.util.regex.Matcher;
11 11
 
12
+import cn.hutool.core.collection.CollUtil;
12 13
 import cn.hutool.core.util.ObjectUtil;
14
+import com.sundot.airport.common.core.domain.entity.SysDept;
13 15
 import com.sundot.airport.common.enums.RoleTypeEnum;
16
+import com.sundot.airport.system.service.ISysDeptService;
14 17
 import org.slf4j.Logger;
15 18
 import org.slf4j.LoggerFactory;
16 19
 import com.sundot.airport.common.utils.DateUtils;
@@ -23,7 +26,6 @@ import org.springframework.stereotype.Service;
23 26
 import org.springframework.transaction.annotation.Transactional;
24 27
 import com.fasterxml.jackson.databind.ObjectMapper;
25 28
 import com.sundot.airport.system.domain.approval.*;
26
-import com.sundot.airport.system.domain.approval.constants.ApprovalConstants;
27 29
 import com.sundot.airport.system.mapper.approval.*;
28 30
 import com.sundot.airport.system.service.approval.IApprovalEngineService;
29 31
 import com.sundot.airport.common.core.domain.entity.SysUser;
@@ -68,6 +70,10 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
68 70
 
69 71
     private ObjectMapper objectMapper = new ObjectMapper();
70 72
 
73
+    @Autowired
74
+    private ISysDeptService sysDeptService;
75
+
76
+
71 77
     /**
72 78
      * 启动审批流程
73 79
      */
@@ -204,7 +210,10 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
204 210
         // 5. 查找任务的原始创建者或更新者
205 211
         Long originalUserId = approvalUserService.getTaskCreatorOrUpdaterByTaskId(taskId);
206 212
 
207
-        if (originalUserId != null) {
213
+        if (isSectionCheckWorkflow(instance) && ("DEPARTMENT_LEVEL_LEADER_XINGZHENG".equals(currentNode.getNodeCode()) || "DEPARTMENT_LEVEL_LEADER_JINGLI_ONE".equals(currentNode.getNodeCode()) || "DEPARTMENT_LEVEL_LEADER_JINGLI_TWO".equals(currentNode.getNodeCode()))) {
214
+            currentNode.setSortOrder(1);
215
+            moveToNextNode(instance, currentNode, operatorId, operatorName, comment, null, task);
216
+        } else if (originalUserId != null) {
208 217
             // 5.1. 不结束流程,而是创建回流任务给原始操作者
209 218
             instance.setStatus("RUNNING"); // 保持运行状态
210 219
             instance.setUpdateBy(SecurityUtils.getUsername());
@@ -414,9 +423,9 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
414 423
     public ApprovalInstance startSectionLevelProcess(String businessType, Long businessId, String title,
415 424
                                                      Long submitterId, String submitterName, Long sectionLeaderId,
416 425
                                                      Map<String, Object> formData, Map<String, Object> businessData) {
417
-        ApprovalWorkflowDefinition workflow = workflowDefinitionMapper.selectApprovalWorkflowDefinitionByCode("SECTION_LEVEL");
426
+        ApprovalWorkflowDefinition workflow = workflowDefinitionMapper.selectApprovalWorkflowDefinitionByCode("DEPARTMENT_LEVEL");
418 427
         if (workflow == null) {
419
-            throw new RuntimeException("流程定义不存在: SECTION_LEVEL");
428
+            throw new RuntimeException("流程定义不存在: DEPARTMENT_LEVEL");
420 429
         }
421 430
 
422 431
         ApprovalInstance instance = new ApprovalInstance();
@@ -753,7 +762,11 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
753 762
                 }
754 763
                 // 科级检查流程的特殊处理
755 764
                 else if (isSectionCheckWorkflow(instance)) {
756
-                    handleSectionCheckNodeAssignment(instance, nextNode, formData);
765
+                    boolean isNext = handleSectionCheckNodeAssignment(instance, nextNode, formData);
766
+                    if (isNext) {
767
+                        currentNode.setSortOrder(nextNode.getSortOrder() + 1);
768
+                        moveToNextNode(instance, currentNode, operatorId, operatorName, comment, formData, currentTask);
769
+                    }
757 770
                 }
758 771
                 // 检查下一节点是否需要动态分配
759 772
                 else if (isSeizureReportWorkflow(instance) && "SECTION_KEZHANG".equals(nextNode.getApproverType())) {
@@ -1154,7 +1167,7 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1154 1167
      * 检查是否为科级检查流程
1155 1168
      */
1156 1169
     private boolean isSectionCheckWorkflow(ApprovalInstance instance) {
1157
-        return "SECTION_CHECK".equals(instance.getBusinessType());
1170
+        return "DEPARTMENT_CHECK".equals(instance.getBusinessType());
1158 1171
     }
1159 1172
 
1160 1173
     /**
@@ -1182,7 +1195,8 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1182 1195
     /**
1183 1196
      * 处理科级检查流程的节点分配
1184 1197
      */
1185
-    private void handleSectionCheckNodeAssignment(ApprovalInstance instance, ApprovalNodeDefinition nextNode, Map<String, Object> formData) {
1198
+    private boolean handleSectionCheckNodeAssignment(ApprovalInstance instance, ApprovalNodeDefinition nextNode, Map<String, Object> formData) {
1199
+        boolean isNext = false;
1186 1200
         String nodeCode = nextNode.getNodeCode();
1187 1201
 
1188 1202
         switch (nodeCode) {
@@ -1203,11 +1217,35 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1203 1217
                 // 责任人审批后 → 发起人审批
1204 1218
                 createTaskForInitiatorFinalReview(instance, nextNode, formData);
1205 1219
                 break;
1220
+            case "DEPARTMENT_LEVEL_LEADER_KEZHANG":
1221
+                // 开始 → 责任人(主管)审批
1222
+                createTaskForResponsiblePerson(instance, nextNode, formData);
1223
+                break;
1224
+            case "DEPARTMENT_LEVEL_LEADER_XINGZHENG":
1225
+                // 责任人(主管)审批 → 发起人(大队行政)审批
1226
+                createTaskForInitiator(instance, nextNode, formData);
1227
+                break;
1228
+            case "DEPARTMENT_LEVEL_LEADER_JINGLI_ONE":
1229
+                // 大队行政审批 → 大队经理1审批
1230
+                createTaskForDept(instance, nextNode, formData);
1231
+                break;
1232
+            case "DEPARTMENT_LEVEL_LEADER_JINGLI_TWO":
1233
+                // 发起人(大队行政)审批 → 大队经理1审批
1234
+                Long deptId = extractTargetDeptIdFromBusinessData(instance.getBusinessData());
1235
+                SysDept sysDept = sysDeptService.selectDeptById(deptId);
1236
+                List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdAndRoleKeyList(sysDept.getParentId(), Arrays.asList(RoleTypeEnum.jingli.getCode()));
1237
+                if (CollUtil.isNotEmpty(sysUserList) && sysUserList.size() > 1) {
1238
+                    createTaskForDeptTwo(instance, nextNode, formData);
1239
+                } else {
1240
+                    isNext = true;
1241
+                }
1242
+                break;
1206 1243
             default:
1207 1244
                 // 使用默认分配逻辑
1208 1245
                 createTasksForNode(instance, nextNode, formData, null);
1209 1246
                 break;
1210 1247
         }
1248
+        return isNext;
1211 1249
     }
1212 1250
 
1213 1251
     /**
@@ -1772,4 +1810,38 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1772 1810
             throw new RuntimeException("创建违禁品审批任务失败:" + e.getMessage(), e);
1773 1811
         }
1774 1812
     }
1813
+
1814
+    /**
1815
+     * 为大队经理1创建审批任务
1816
+     */
1817
+    private void createTaskForDept(ApprovalInstance instance, ApprovalNodeDefinition node, Map<String, Object> formData) {
1818
+        try {
1819
+            Long deptId = extractTargetDeptIdFromBusinessData(instance.getBusinessData());
1820
+            SysDept sysDept = sysDeptService.selectDeptById(deptId);
1821
+            List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdAndRoleKeyList(sysDept.getParentId(), Arrays.asList(RoleTypeEnum.jingli.getCode()));
1822
+            if (CollUtil.isEmpty(sysUserList)) {
1823
+                throw new RuntimeException("未找到部门上级领导,无法分配审批任务");
1824
+            }
1825
+            createSingleApprovalTaskForNode(instance, node, sysUserList.get(0).getUserId(), sysUserList.get(0).getNickName());
1826
+        } catch (Exception e) {
1827
+            logger.error("创建经理1审批任务失败", e);
1828
+        }
1829
+    }
1830
+
1831
+    /**
1832
+     * 为大队经理2创建审批任务
1833
+     */
1834
+    private void createTaskForDeptTwo(ApprovalInstance instance, ApprovalNodeDefinition node, Map<String, Object> formData) {
1835
+        try {
1836
+            Long deptId = extractTargetDeptIdFromBusinessData(instance.getBusinessData());
1837
+            SysDept sysDept = sysDeptService.selectDeptById(deptId);
1838
+            List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdAndRoleKeyList(sysDept.getParentId(), Arrays.asList(RoleTypeEnum.jingli.getCode()));
1839
+            if (CollUtil.isEmpty(sysUserList) || sysUserList.size() < 2) {
1840
+                throw new RuntimeException("未找到部门上级领导,无法分配审批任务");
1841
+            }
1842
+            createSingleApprovalTaskForNode(instance, node, sysUserList.get(1).getUserId(), sysUserList.get(1).getNickName());
1843
+        } catch (Exception e) {
1844
+            logger.error("创建经理1审批任务失败", e);
1845
+        }
1846
+    }
1775 1847
 }

+ 4 - 6
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/CheckApprovalServiceImpl.java

@@ -184,9 +184,9 @@ public class CheckApprovalServiceImpl implements ICheckApprovalService {
184 184
         //Long businessId = System.currentTimeMillis();
185 185
 
186 186
         Map<String, Object> params = new HashMap<>();
187
-        params.put("businessType", "SECTION_CHECK");
187
+        params.put("businessType", "DEPARTMENT_CHECK");
188 188
         params.put("businessId", businessId);
189
-        params.put("title", "级检查");
189
+        params.put("title", "被检查级别为主管级检查");
190 190
         params.put("checkType", checkType);
191 191
         params.put("severity", severity);
192 192
         params.put("targetDeptId", targetDeptId);
@@ -199,9 +199,7 @@ public class CheckApprovalServiceImpl implements ICheckApprovalService {
199 199
         Map<String, Object> businessData = new HashMap<>();
200 200
         businessData.put("checkType", checkType);
201 201
         businessData.put("severity", severity);
202
-        if (targetDeptId != null) {
203
-            businessData.put("targetDeptId", targetDeptId);
204
-        }
202
+        businessData.put("targetDeptId", targetDeptId);
205 203
         businessData.put("sectionLeaderId", sectionLeaderId);
206 204
         params.put("businessData", businessData);
207 205
 
@@ -267,7 +265,7 @@ public class CheckApprovalServiceImpl implements ICheckApprovalService {
267 265
         Map<String, Object> params = new HashMap<>();
268 266
         params.put("businessType", "BRIGADE_CHECK");
269 267
         params.put("businessId", businessId);
270
-        params.put("title", "大队级检查");
268
+        params.put("title", "被检查级别为大队级检查");
271 269
         params.put("checkType", checkType);
272 270
         params.put("severity", severity);
273 271
         params.put("targetDeptId", targetDeptId);