Ver código fonte

巡检模块-审批流程

chenshudong 4 meses atrás
pai
commit
8141dab46d

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

@@ -43,7 +43,8 @@ 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
+                || "SECTION_CHECK".equals(businessType)
47
+                || "BRIGADE_CHECK".equals(businessType);
47 48
     }
48 49
 
49 50
     @Override

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

@@ -390,6 +390,19 @@ public class CheckCorrectionServiceImpl extends ServiceImpl<CheckCorrectionMappe
390 390
             checkCorrection.setInstanceId(approvalInstance.getId());
391 391
             checkCorrectionMapper.updateCheckCorrection(checkCorrection);
392 392
             log.info("科级:{}", approvalInstance);
393
+        } else if (StringUtils.equals(CheckLevelEnum.BRIGADE_LEVEL.getCode(), checkCorrection.getCheckedLevel())) {
394
+            Map<String, Object> requestData = new HashMap<>();
395
+            requestData.put("businessId", checkCorrection.getId());//业务ID
396
+            requestData.put("checkType", CheckLevelEnum.BRIGADE_LEVEL.getCode());//检查类型
397
+            requestData.put("severity", "");//严重程度
398
+            requestData.put("location", checkCorrection.getChannelName());//位置
399
+            requestData.put("sectionLeaderId", checkCorrection.getResponsibleUserId());//责任人
400
+            requestData.put("targetDeptId", checkCorrection.getCheckedDeptId());//目标部门ID
401
+            requestData.put("formData", BeanUtil.beanToMap(checkCorrection));
402
+            ApprovalInstance approvalInstance = checkApprovalService.submitBrigadeCheck(requestData, SecurityUtils.getLoginUser().getUserId(), SecurityUtils.getLoginUser().getUsername(), CheckLevelEnum.DEPARTMENT_LEVEL.getDesc());
403
+            checkCorrection.setInstanceId(approvalInstance.getId());
404
+            checkCorrectionMapper.updateCheckCorrection(checkCorrection);
405
+            log.info("大队级:{}", approvalInstance);
393 406
         } else {
394 407
             throw new ServiceException("被检查级别数据异常");
395 408
         }

+ 17 - 0
airport-system/src/main/java/com/sundot/airport/system/service/approval/IApprovalEngineService.java

@@ -134,6 +134,23 @@ public interface IApprovalEngineService {
134 134
                                               Map<String, Object> formData, Map<String, Object> businessData);
135 135
 
136 136
     /**
137
+     * 大队级审批流程
138
+     *
139
+     * @param businessType    业务类型
140
+     * @param businessId      业务ID
141
+     * @param title           标题
142
+     * @param submitterId     提交人ID
143
+     * @param submitterName   提交人姓名
144
+     * @param sectionLeaderId 责任人ID(大队行政人员)
145
+     * @param formData        表单数据
146
+     * @param businessData    业务数据
147
+     * @return 审批实例
148
+     */
149
+    ApprovalInstance startBrigadeLevelProcess(String businessType, Long businessId, String title,
150
+                                              Long submitterId, String submitterName, Long sectionLeaderId,
151
+                                              Map<String, Object> formData, Map<String, Object> businessData);
152
+
153
+    /**
137 154
      * 班组级审批流程
138 155
      *
139 156
      * @param businessType  业务类型

+ 12 - 0
airport-system/src/main/java/com/sundot/airport/system/service/approval/ICheckApprovalService.java

@@ -38,6 +38,18 @@ public interface ICheckApprovalService {
38 38
     ApprovalInstance submitSectionCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;
39 39
 
40 40
     /**
41
+     * 启动大队级检查审批流程
42
+     *
43
+     * @param requestData 请求数据,包含checkType、severity、targetDeptId、sectionLeaderId、formData等
44
+     * @param userId      当前用户ID
45
+     * @param username    当前用户名
46
+     * @param remark      备注
47
+     * @return ApprovalInstance 审批实例
48
+     * @throws Exception 启动流程失败时抛出异常
49
+     */
50
+    ApprovalInstance submitBrigadeCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;
51
+
52
+    /**
41 53
      * 启动班组级检查审批流程
42 54
      *
43 55
      * @param requestData 请求数据,包含checkType、severity、groupLeaderId、formData等

+ 126 - 3
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/ApprovalEngineServiceImpl.java

@@ -1,5 +1,6 @@
1 1
 package com.sundot.airport.system.service.approval.impl;
2 2
 
3
+import java.util.Arrays;
3 4
 import java.util.Date;
4 5
 import java.util.HashMap;
5 6
 import java.util.List;
@@ -9,6 +10,7 @@ import java.util.regex.Pattern;
9 10
 import java.util.regex.Matcher;
10 11
 
11 12
 import cn.hutool.core.util.ObjectUtil;
13
+import com.sundot.airport.common.enums.RoleTypeEnum;
12 14
 import org.slf4j.Logger;
13 15
 import org.slf4j.LoggerFactory;
14 16
 import com.sundot.airport.common.utils.DateUtils;
@@ -458,6 +460,65 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
458 460
     }
459 461
 
460 462
     /**
463
+     * 大队级审批流程
464
+     */
465
+    @Override
466
+    @Transactional
467
+    public ApprovalInstance startBrigadeLevelProcess(String businessType, Long businessId, String title,
468
+                                                     Long submitterId, String submitterName, Long sectionLeaderId,
469
+                                                     Map<String, Object> formData, Map<String, Object> businessData) {
470
+        ApprovalWorkflowDefinition workflow = workflowDefinitionMapper.selectApprovalWorkflowDefinitionByCode("BRIGADE_LEVEL");
471
+        if (workflow == null) {
472
+            throw new RuntimeException("流程定义不存在: SECTION_LEVEL");
473
+        }
474
+
475
+        ApprovalInstance instance = new ApprovalInstance();
476
+        instance.setInstanceNo(instanceMapper.generateInstanceNo());
477
+        instance.setWorkflowId(workflow.getId());
478
+        instance.setTitle(title);
479
+        instance.setBusinessType(businessType);
480
+        instance.setBusinessId(businessId);
481
+        instance.setSubmitterId(submitterId);
482
+        instance.setSubmitterName(submitterName);
483
+        instance.setSubmitTime(DateUtils.getNowDate());
484
+        instance.setStatus("RUNNING");
485
+
486
+        try {
487
+            instance.setFormData(formData != null ? objectMapper.writeValueAsString(formData) : null);
488
+        } catch (Exception e) {
489
+            throw new RuntimeException("表单数据序列化失败", e);
490
+        }
491
+
492
+        try {
493
+            instance.setBusinessData(objectMapper.writeValueAsString(businessData));
494
+        } catch (Exception e) {
495
+            throw new RuntimeException("业务数据序列化失败", e);
496
+        }
497
+
498
+        instance.setCreateBy(SecurityUtils.getUsername());
499
+        instance.setCreateTime(DateUtils.getNowDate());
500
+
501
+        instanceMapper.insertApprovalInstance(instance);
502
+
503
+        // 获取第一个节点
504
+        ApprovalNodeDefinition firstNode = nodeDefinitionMapper.selectFirstNodeByWorkflowId(workflow.getId());
505
+        if (firstNode != null) {
506
+            instance.setCurrentNodeId(firstNode.getId());
507
+            instanceMapper.updateApprovalInstance(instance);
508
+
509
+            // 如果是开始节点,直接流转到下一个节点(科长审批)
510
+            if ("START".equals(firstNode.getNodeType())) {
511
+                moveToNextNode(instance, firstNode, submitterId, submitterName, "提交", formData, null);
512
+            }
513
+        }
514
+
515
+        // 记录提交历史
516
+        recordHistory(instance.getId(), null, null, null, "SUBMIT", submitterId, submitterName, "提交大队级审批流程", formData);
517
+
518
+        return instance;
519
+    }
520
+
521
+    /**
461 522
      * 班组级审批流程
462 523
      */
463 524
     @Override
@@ -669,8 +730,12 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
669 730
                 // 结束节点,完成流程
670 731
                 completeProcess(instance, operatorId, operatorName);
671 732
             } else {
733
+                // 大队级别检查流程的特殊处理
734
+                if (isBrigadeCheckWorkflow(instance)) {
735
+                    handleBrigadeCheckNodeAssignment(instance, nextNode, formData);
736
+                }
672 737
                 // 个人级别检查流程的特殊处理
673
-                if (isPersonalCheckWorkflow(instance)) {
738
+                else if (isPersonalCheckWorkflow(instance)) {
674 739
                     handlePersonalCheckNodeAssignment(instance, nextNode, formData);
675 740
                 }
676 741
                 // 科级检查流程的特殊处理
@@ -727,7 +792,6 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
727 792
         if (!"SEIZURE_REPORT".equals(instance.getBusinessType())) {
728 793
             createCcRecords(instance);
729 794
         }
730
-        ;
731 795
 
732 796
         // 执行业务处理逻辑
733 797
         executeBusinessLogic(instance, "APPROVED");
@@ -1331,7 +1395,9 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1331 1395
             java.util.Set<Long> ccUserIds = new java.util.HashSet<>();
1332 1396
 
1333 1397
             // 根据业务类型决定抄送对象
1334
-            if ("PERSONAL_CHECK".equals(instance.getBusinessType())) {
1398
+            if ("BRIGADE_CHECK".equals(instance.getBusinessType())) {
1399
+                createBrigadeCheckCcRecords(instance, ccUserIds);
1400
+            } else if ("PERSONAL_CHECK".equals(instance.getBusinessType())) {
1335 1401
                 // 个人级别检查:抄送质检科、组长发起人、审批科长
1336 1402
                 createPersonalCheckCcRecords(instance, ccUserIds);
1337 1403
             } else {
@@ -1578,4 +1644,61 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1578 1644
         }
1579 1645
     }
1580 1646
 
1647
+    /**
1648
+     * 检查是否为大队级别检查流程
1649
+     */
1650
+    private boolean isBrigadeCheckWorkflow(ApprovalInstance instance) {
1651
+        return "BRIGADE_CHECK".equals(instance.getBusinessType());
1652
+    }
1653
+
1654
+    /**
1655
+     * 处理科级检查流程的节点分配
1656
+     */
1657
+    private void handleBrigadeCheckNodeAssignment(ApprovalInstance instance, ApprovalNodeDefinition nextNode, Map<String, Object> formData) {
1658
+        String nodeCode = nextNode.getNodeCode();
1659
+        switch (nodeCode) {
1660
+            case "RESPONSIBLE_PERSON_REVIEW":
1661
+                // 质检科 → 责任人(大队行政人员)整改审批
1662
+                createTaskForResponsiblePerson(instance, nextNode, formData);
1663
+                break;
1664
+            case "INITIATOR_FINAL_REVIEW":
1665
+                // 责任人(大队行政人员) → 发起人审批
1666
+                createTaskForInitiatorFinalReview(instance, nextNode, formData);
1667
+                break;
1668
+            default:
1669
+                // 使用默认分配逻辑
1670
+                createTasksForNode(instance, nextNode, formData, null);
1671
+                break;
1672
+        }
1673
+    }
1674
+
1675
+    /**
1676
+     * 为大队级别检查创建抄送记录
1677
+     */
1678
+    private void createBrigadeCheckCcRecords(ApprovalInstance instance, java.util.Set<Long> ccUserIds) {
1679
+        Long deptId = extractTargetDeptIdFromBusinessData(instance.getBusinessData());
1680
+        List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdAndRoleKeyList(deptId, Arrays.asList(RoleTypeEnum.jingli.getCode()));
1681
+        for (SysUser user : sysUserList) {
1682
+            ccUserIds.add(user.getUserId());
1683
+        }
1684
+    }
1685
+
1686
+    /**
1687
+     * 从业务数据中提取目标部门
1688
+     */
1689
+    private Long extractTargetDeptIdFromBusinessData(String businessData) {
1690
+        try {
1691
+            if (businessData.contains("\"targetDeptId\"")) {
1692
+                java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\"targetDeptId\"\\s*:\\s*(\\d+)");
1693
+                java.util.regex.Matcher matcher = pattern.matcher(businessData);
1694
+                if (matcher.find()) {
1695
+                    return Long.valueOf(matcher.group(1));
1696
+                }
1697
+            }
1698
+        } catch (Exception e) {
1699
+            logger.warn("解析targetDeptId失败", e);
1700
+        }
1701
+        return null;
1702
+    }
1703
+
1581 1704
 }

+ 82 - 0
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/CheckApprovalServiceImpl.java

@@ -1,5 +1,6 @@
1 1
 package com.sundot.airport.system.service.approval.impl;
2 2
 
3
+import com.sundot.airport.common.exception.ServiceException;
3 4
 import com.sundot.airport.system.domain.approval.ApprovalInstance;
4 5
 import com.sundot.airport.system.domain.approval.ApprovalTask;
5 6
 import com.sundot.airport.system.domain.approval.ApprovalCc;
@@ -217,6 +218,87 @@ public class CheckApprovalServiceImpl implements ICheckApprovalService {
217 218
     }
218 219
 
219 220
     @Override
221
+    public ApprovalInstance submitBrigadeCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception {
222
+        // 提取系统控制参数
223
+        String checkType = (String) requestData.get("checkType");
224
+        String severity = (String) requestData.get("severity");
225
+        Object targetDeptIdObj = requestData.get("targetDeptId");
226
+        Object sectionLeaderIdObj = requestData.get("sectionLeaderId");
227
+        Object businessIdObj = requestData.get("businessId");
228
+        Map<String, Object> userFormData = (Map<String, Object>) requestData.get("formData");
229
+
230
+        if (businessIdObj == null) {
231
+            throw new ServiceException("businessId参数不能为空");
232
+        }
233
+
234
+        if (targetDeptIdObj == null) {
235
+            throw new ServiceException("targetDeptId参数不能为空");
236
+        }
237
+
238
+        if (sectionLeaderIdObj == null) {
239
+            throw new ServiceException("sectionLeaderId参数不能为空");
240
+        }
241
+
242
+        if (userFormData == null) {
243
+            throw new ServiceException("formData参数不能为空");
244
+        }
245
+
246
+        Long businessId = null;
247
+        if (businessIdObj instanceof Number) {
248
+            businessId = ((Number) businessIdObj).longValue();
249
+        } else if (businessIdObj instanceof String) {
250
+            businessId = Long.parseLong((String) businessIdObj);
251
+        }
252
+
253
+        Long targetDeptId = null;
254
+        if (targetDeptIdObj instanceof Number) {
255
+            targetDeptId = ((Number) targetDeptIdObj).longValue();
256
+        } else if (targetDeptIdObj instanceof String) {
257
+            targetDeptId = Long.parseLong((String) targetDeptIdObj);
258
+        }
259
+
260
+        Long sectionLeaderId = null;
261
+        if (sectionLeaderIdObj instanceof Number) {
262
+            sectionLeaderId = ((Number) sectionLeaderIdObj).longValue();
263
+        } else if (sectionLeaderIdObj instanceof String) {
264
+            sectionLeaderId = Long.parseLong((String) sectionLeaderIdObj);
265
+        }
266
+
267
+        Map<String, Object> params = new HashMap<>();
268
+        params.put("businessType", "BRIGADE_CHECK");
269
+        params.put("businessId", businessId);
270
+        params.put("title", "大队级检查");
271
+        params.put("checkType", checkType);
272
+        params.put("severity", severity);
273
+        params.put("targetDeptId", targetDeptId);
274
+        params.put("sectionLeaderId", sectionLeaderId);
275
+
276
+        // 组装最终的表单数据
277
+        Map<String, Object> formData = new HashMap<>(userFormData);
278
+        params.put("formData", formData);
279
+
280
+        // 业务数据
281
+        Map<String, Object> businessData = new HashMap<>();
282
+        businessData.put("checkType", checkType);
283
+        businessData.put("severity", severity);
284
+        businessData.put("targetDeptId", targetDeptId);
285
+        businessData.put("sectionLeaderId", sectionLeaderId);
286
+        businessData.put("initiatorId", userId);
287
+        params.put("businessData", businessData);
288
+
289
+        return approvalEngineService.startBrigadeLevelProcess(
290
+                (String) params.get("businessType"),
291
+                (Long) params.get("businessId"),
292
+                (String) params.get("title"),
293
+                userId,
294
+                username,
295
+                sectionLeaderId,
296
+                formData,
297
+                businessData
298
+        );
299
+    }
300
+
301
+    @Override
220 302
     public ApprovalInstance submitGroupCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception {
221 303
         // 提取系统控制参数
222 304
         String checkType = (String) requestData.get("checkType");