|
|
@@ -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
|
}
|