Explorar el Código

查获记录表-审批流程

chenshudong hace 4 meses
padre
commit
e2d6bdec26

+ 16 - 0
airport-system/src/main/java/com/sundot/airport/system/service/approval/IApprovalUserService.java

@@ -107,4 +107,20 @@ public interface IApprovalUserService {
107 107
      * @return 直接上级的用户ID列表
108 108
      */
109 109
     List<Long> getDirectSuperiorIds(Long userId);
110
+
111
+    /**
112
+     * 判断用户是否为安检员角色
113
+     *
114
+     * @param userId 用户ID
115
+     * @return 是否为班组长
116
+     */
117
+    boolean isSecurityCheck(Long userId);
118
+
119
+    /**
120
+     * 根据用户ID查找其主管(违禁品审批用)
121
+     *
122
+     * @param userId 用户ID
123
+     * @return 主管的用户ID列表
124
+     */
125
+    List<Long> getKeZhangByUserId(Long userId);
110 126
 }

+ 64 - 2
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/ApprovalEngineServiceImpl.java

@@ -339,7 +339,9 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
339 339
     @Override
340 340
     public String getWorkflowCodeByBusinessAndLevel(String businessType, String level, String submitterRole) {
341 341
         if ("SEIZURE_REPORT".equals(businessType)) {
342
-            if ("SEIZURE_REPORT_LEADER".equals(submitterRole)) {
342
+            if ("SEIZURE_REPORT_DEFAULT".equals(submitterRole)) {
343
+                return "SEIZURE_REPORT_DEFAULT";
344
+            } else if ("SEIZURE_REPORT_LEADER".equals(submitterRole)) {
343 345
                 return "SEIZURE_REPORT_LEADER";
344 346
             } else {
345 347
                 return "SEIZURE_REPORT_STAFF";
@@ -353,6 +355,8 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
353 355
                 return "SECTION_LEVEL";
354 356
             case "GROUP":
355 357
                 return "GROUP_LEVEL";
358
+            case "BRIGADE":
359
+                return "BRIGADE_LEVEL";
356 360
             default:
357 361
                 throw new RuntimeException("未知的级别类型:" + level);
358 362
         }
@@ -743,7 +747,14 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
743 747
                     handleSectionCheckNodeAssignment(instance, nextNode, formData);
744 748
                 }
745 749
                 // 检查下一节点是否需要动态分配
746
-                else if (isSeizureReportWorkflow(instance) && ("GROUP_LEADER".equals(nextNode.getApproverType()) || "SECTION_LEADER".equals(nextNode.getApproverType()))) {
750
+                else if (isSeizureReportWorkflow(instance) && "SECTION_KEZHANG".equals(nextNode.getApproverType())) {
751
+                    Long submitterId = instance.getSubmitterId();
752
+                    if (ObjectUtil.isNotEmpty(currentTask) && ObjectUtil.isNotEmpty(currentTask.getAssigneeId())) {
753
+                        submitterId = currentTask.getAssigneeId();
754
+                    }
755
+                    // 违禁品审批流程:根据提交人角色分配给其主管
756
+                    createTasksForNodeWithKeZhang(instance, nextNode, formData, null, submitterId);
757
+                } else if (isSeizureReportWorkflow(instance) && ("GROUP_LEADER".equals(nextNode.getApproverType()) || "SECTION_LEADER".equals(nextNode.getApproverType()))) {
747 758
                     Long submitterId = instance.getSubmitterId();
748 759
                     if ("SECTION_LEADER".equals(nextNode.getApproverType()) && ObjectUtil.isNotEmpty(currentTask) && ObjectUtil.isNotEmpty(currentTask.getAssigneeId())) {
749 760
                         submitterId = currentTask.getAssigneeId();
@@ -1701,4 +1712,55 @@ public class ApprovalEngineServiceImpl implements IApprovalEngineService {
1701 1712
         return null;
1702 1713
     }
1703 1714
 
1715
+    /**
1716
+     * 为违禁品审批节点创建任务(根据提交人分配给其主管)
1717
+     */
1718
+    private void createTasksForNodeWithKeZhang(ApprovalInstance instance, ApprovalNodeDefinition node, Map<String, Object> formData, String remark, Long submitterId) {
1719
+        try {
1720
+            // 根据提交人查找其主管
1721
+            List<Long> assigneeIds = approvalUserService.getKeZhangByUserId(submitterId);
1722
+            if (assigneeIds.isEmpty()) {
1723
+                throw new RuntimeException("未找到提交人的主管,无法分配审批任务");
1724
+            }
1725
+
1726
+            for (Long assigneeId : assigneeIds) {
1727
+                SysUser user = sysUserMapper.selectUserById(assigneeId);
1728
+                if (user != null) {
1729
+                    ApprovalTask task = new ApprovalTask();
1730
+                    task.setTaskNo(taskMapper.generateTaskNo());
1731
+                    task.setInstanceId(instance.getId());
1732
+                    task.setNodeId(node.getId());
1733
+                    task.setTaskName(node.getNodeName());
1734
+                    task.setAssigneeId(assigneeId);
1735
+                    task.setAssigneeName(user.getNickName());
1736
+                    task.setAssignTime(DateUtils.getNowDate());
1737
+                    task.setStatus("PENDING");
1738
+
1739
+                    // 设置表单数据 - 如果formData为空,使用当前实例的formData
1740
+                    try {
1741
+                        if (formData != null) {
1742
+                            task.setFormData(objectMapper.writeValueAsString(formData));
1743
+                        } else {
1744
+                            task.setFormData(instance.getFormData());
1745
+                        }
1746
+                    } catch (Exception e) {
1747
+                        // 序列化失败时使用实例的formData
1748
+                        task.setFormData(instance.getFormData());
1749
+                    }
1750
+
1751
+                    // 设置超时时间
1752
+                    if (node.getTimeoutHours() != null && node.getTimeoutHours() > 0) {
1753
+                        task.setTimeoutTime(DateUtils.addHours(DateUtils.getNowDate(), node.getTimeoutHours()));
1754
+                    }
1755
+
1756
+                    task.setCreateBy(SecurityUtils.getUsername());
1757
+                    task.setCreateTime(DateUtils.getNowDate());
1758
+
1759
+                    taskMapper.insertApprovalTask(task);
1760
+                }
1761
+            }
1762
+        } catch (Exception e) {
1763
+            throw new RuntimeException("创建违禁品审批任务失败:" + e.getMessage(), e);
1764
+        }
1765
+    }
1704 1766
 }

+ 36 - 0
airport-system/src/main/java/com/sundot/airport/system/service/approval/impl/ApprovalUserServiceImpl.java

@@ -1,9 +1,11 @@
1 1
 package com.sundot.airport.system.service.approval.impl;
2 2
 
3 3
 import java.util.ArrayList;
4
+import java.util.Collections;
4 5
 import java.util.List;
5 6
 import java.util.stream.Collectors;
6 7
 
8
+import com.sundot.airport.common.enums.RoleTypeEnum;
7 9
 import org.springframework.beans.factory.annotation.Autowired;
8 10
 import org.springframework.stereotype.Service;
9 11
 import com.sundot.airport.common.core.domain.entity.SysUser;
@@ -569,4 +571,38 @@ public class ApprovalUserServiceImpl implements IApprovalUserService {
569 571
 
570 572
         return superiorIds;
571 573
     }
574
+
575
+    /**
576
+     * 判断用户是否为安检员角色
577
+     */
578
+    @Override
579
+    public boolean isSecurityCheck(Long userId) {
580
+        if (userId == null) {
581
+            return false;
582
+        }
583
+
584
+        List<Long> groupLeaderIds = getUserIdsByRoleKey("SecurityCheck");
585
+        return groupLeaderIds.contains(userId);
586
+    }
587
+
588
+    /**
589
+     * 根据用户ID查找其主管(违禁品审批用)
590
+     *
591
+     * @param userId 用户ID
592
+     * @return 主管的用户ID列表
593
+     */
594
+    @Override
595
+    public List<Long> getKeZhangByUserId(Long userId) {
596
+        if (userId == null) {
597
+            return Collections.emptyList();
598
+        }
599
+
600
+        if (!isGroupLeader(userId) && !isSecurityCheck(userId)) {
601
+            return Collections.emptyList();
602
+        }
603
+
604
+        SysUser user = userMapper.selectUserById(userId);
605
+        List<SysUser> sysUserList = userMapper.selectUserByDeptIdAndRoleKeyList(user.getDept().getParentId(), Collections.singletonList(RoleTypeEnum.kezhang.getCode()));
606
+        return sysUserList.stream().map(SysUser::getUserId).distinct().collect(Collectors.toList());
607
+    }
572 608
 }