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