Browse Source

审批获取部门角色

guarantee-lsq 7 months ago
parent
commit
62f69ee29f

+ 3 - 0
platform-common/src/main/java/com/platform/common/constant/CommonConstants.java

@@ -249,4 +249,7 @@ public interface CommonConstants {
 
     int CONDITION_TYPE = 2; // 条件分支
     int VERIFY_USER_TYPE = 3; // 审核人
+
+    int VERIFY_TYPE_USER = 0; // 审批人
+    int VERIFY_TYPE_ROLE = 1; // 审批角色
 }

+ 1 - 40
platform-dao/src/main/java/com/platform/dao/dto/workflow/WorkflowTaskBomDTO.java

@@ -90,46 +90,6 @@ public class WorkflowTaskBomDTO extends BaseDTO implements Serializable {
     private Integer readFlag; // 是否已阅
 
     private Integer reminderNum; // 催办次数
-    /**
-     * 自定义字段1
-     *//*
-    private String cdefine1;
-    *//**
-     * 自定义字段2
-     *//*
-    private String cdefine2;
-    *//**
-     * 自定义字段3
-     *//*
-    private String cdefine3;
-    *//**
-     * 自定义字段4
-     *//*
-    private String cdefine4;
-    *//**
-     * 自定义字段5
-     *//*
-    private String cdefine5;
-    *//**
-     * 自定义字段6
-     *//*
-    private String cdefine6;
-    *//**
-     * 自定义字段7
-     *//*
-    private String cdefine7;
-    *//**
-     * 自定义字段8
-     *//*
-    private String cdefine8;
-    *//**
-     * 自定义字段9
-     *//*
-    private String cdefine9;
-    *//**
-     * 自定义字段10
-     *//*
-    private String cdefine10;*/
     /**
      * 关键字
      */
@@ -143,4 +103,5 @@ public class WorkflowTaskBomDTO extends BaseDTO implements Serializable {
     private LocalDateTime applyTimeStart; // 发起开始时间
     private LocalDateTime applyTimeEnd; // 发起结束时间
     private String applyUserId; // 发起人ID
+    private Integer nodeSort; // 审核层级
 }

+ 5 - 1
platform-dao/src/main/java/com/platform/dao/entity/workflow/WorkflowTaskBom.java

@@ -55,7 +55,7 @@ public class WorkflowTaskBom implements Serializable {
      */
     private String taskId;
     /**
-     * 0 待办 1 已办
+     * 0 待办 1 已办 2 会签已办
      */
     private Integer status;
     /**
@@ -71,6 +71,10 @@ public class WorkflowTaskBom implements Serializable {
 
     private Integer reminderNum; // 催办次数
 
+    private Integer nodeSort; // 审核层级
+
+    private String nodeId; // 审核节点ID
+
     /**
      * 数据权限
      */

+ 3 - 1
platform-dao/src/main/java/com/platform/dao/mapper/upms/SysUserMapper.java

@@ -62,4 +62,6 @@ public interface SysUserMapper extends MyMapper<SysUser> {
     List<SysUserVO> getSysUserList(SysUserDeptDTO sysUserDeptDTO);
 
     List<SysUserVO> getRepairUsers(SysUserDTO sysUserDTO);
-}
+
+    List<SysUserVO> selectUserByRole(SysUserDTO sysUserDTO);
+ }

+ 1 - 42
platform-dao/src/main/java/com/platform/dao/vo/query/workflow/WorkflowTaskBomVO.java

@@ -81,46 +81,5 @@ public class WorkflowTaskBomVO extends BaseVO implements Serializable {
     private JSONObject data;
     private String formDataId;
     private List<WorkflowTaskRecord> recordList;
-   /* *//**
-     * 自定义字段1
-     *//*
-    private String cdefine1;
-    *//**
-     * 自定义字段2
-     *//*
-    private String cdefine2;
-    *//**
-     * 自定义字段3
-     *//*
-    private String cdefine3;
-    *//**
-     * 自定义字段4
-     *//*
-    private String cdefine4;
-    *//**
-     * 自定义字段5
-     *//*
-    private String cdefine5;
-    *//**
-     * 自定义字段6
-     *//*
-    private String cdefine6;
-    *//**
-     * 自定义字段7
-     *//*
-    private String cdefine7;
-    *//**
-     * 自定义字段8
-     *//*
-    private String cdefine8;
-    *//**
-     * 自定义字段9
-     *//*
-    private String cdefine9;
-    *//**
-     * 自定义字段10
-     *//*
-    private String cdefine10;*/
-
-
+    private Integer nodeSort; // 审核层级
 }

+ 1 - 0
platform-dao/src/main/resources/mapper/upms/SysRoleMapper.xml

@@ -10,4 +10,5 @@
                        where user_id in (select DISTINCT user_id from t_sys_user_dept where dept_id = #{id})) t
                       on role.role_id = t.role_id
     </select>
+
 </mapper>

+ 18 - 11
platform-dao/src/main/resources/mapper/upms/SysUserMapper.xml

@@ -114,19 +114,19 @@
 
     <select id="getSysUserList" parameterType="com.platform.dao.dto.upms.SysUserDeptDTO"
             resultType="com.platform.dao.vo.SysUserVO">
-    select distinct user.username as username,user.real_name realName, user.user_id userId  from t_sys_user user
-    join t_sys_user_role urole on urole.user_id = user.user_id
-    join t_sys_role role on urole.role_id = role.role_id
-    join t_sys_user_dept dept on user.user_id = dept.user_id
-    where role.role_name = '维修人员' and user.status = 1
-    <if test="deptId != null and deptId != ''">
-        and dept.dept_id = #{deptId}
-    </if>
+        select distinct user.username as username,user.real_name realName, user.user_id userId from t_sys_user user
+        join t_sys_user_role urole on urole.user_id = user.user_id
+        join t_sys_role role on urole.role_id = role.role_id
+        join t_sys_user_dept dept on user.user_id = dept.user_id
+        where role.role_name = '维修人员' and user.status = 1
+        <if test="deptId != null and deptId != ''">
+            and dept.dept_id = #{deptId}
+        </if>
     </select>
 
     <select id="getRepairUsers" parameterType="com.platform.dao.dto.upms.SysUserDTO"
             resultType="com.platform.dao.vo.SysUserVO">
-        select distinct user.username as username,user.real_name realName, user.user_id userId  from t_sys_user user
+        select distinct user.username as username,user.real_name realName, user.user_id userId from t_sys_user user
         join t_sys_user_role urole on urole.user_id = user.user_id
         join t_sys_role role on urole.role_id = role.role_id
         join t_sys_user_dept dept on user.user_id = dept.user_id
@@ -148,7 +148,7 @@
     <select id="getSysUserVO" parameterType="com.platform.dao.dto.upms.SysUserDTO"
             resultType="com.platform.dao.vo.SysUserVO">
         SELECT user.*,dept.name as dept, GROUP_CONCAT(role.role_name) as roless
-        FROM  t_sys_user USER LEFT JOIN t_sys_user_role ur
+        FROM t_sys_user USER LEFT JOIN t_sys_user_role ur
         ON user.`user_id`=ur.`user_id`
         LEFT JOIN t_sys_role role
         ON ur.`role_id`=role.`role_id`
@@ -189,7 +189,7 @@
 
     <select id="getUnusedUsers" parameterType="com.platform.dao.dto.upms.SysUserDTO"
             resultType="com.platform.dao.vo.SysUserVO">
-        select  user.username as username,user.real_name realName, user.user_id userId  from t_sys_user user
+        select user.username as username,user.real_name realName, user.user_id userId from t_sys_user user
         join t_sys_user_role urole on urole.user_id = user.user_id
         join t_sys_role role on urole.role_id = role.role_id
         where user.status = 1
@@ -206,4 +206,11 @@
             </foreach>
         </if>
     </select>
+
+    <select id="selectUserByRole" parameterType="com.platform.dao.dto.upms.SysUserDTO"
+            resultType="com.platform.dao.vo.SysUserVO">
+        select u.user_id, u.real_name
+        from t_sys_user u
+                 join on(select DISTINCT role.user_id from t_sys_user_dept dept join t_sys_user_role role on dept.user_id = role.user_id where dept.dept_id = #{deptId} and role.role_id = #{roleId}) t u.user_id = t.user_id
+    </select>
 </mapper>

+ 7 - 4
platform-service/src/main/java/com/platform/service/custom/impl/CustomFormDataServiceImpl.java

@@ -112,9 +112,9 @@ public class CustomFormDataServiceImpl extends BaseServiceImpl<CustomFormDataMap
         // 建立task
         WorkflowTask task = new WorkflowTask();
         task.setId(IdGeneratorUtils.getObjectId());
-        saveTask(task,bom,flow);
+        String nodeId = saveTask(task,bom,flow);
         // 存储发起人taskBom
-        saveTaskBom(task.getId());
+        saveTaskBom(task.getId(),nodeId);
         // 处理记录存储
         saveTaskRecord(task.getId());
     }
@@ -135,7 +135,7 @@ public class CustomFormDataServiceImpl extends BaseServiceImpl<CustomFormDataMap
      * 存储任务bom
      * @param taskId
      */
-    private void saveTaskBom(String taskId) {
+    private void saveTaskBom(String taskId,String nodeId) {
         WorkflowTaskBom bom = new WorkflowTaskBom();
         bom.setCreatedTime(LocalDateTime.now());
         bom.setCreatedUserId(SecurityUtils.getUserInfo().getUserId());
@@ -146,6 +146,8 @@ public class CustomFormDataServiceImpl extends BaseServiceImpl<CustomFormDataMap
         bom.setPersonalType(YesNoEnum.YES.getValue());
         bom.setReminderNum(YesNoEnum.NO.getValue());
         bom.setReadFlag(YesNoEnum.NO.getValue());
+        bom.setNodeSort(YesNoEnum.YES.getValue());
+        bom.setNodeId(nodeId);
         workflowTaskBomMapper.insert(bom);
     }
     /**
@@ -153,7 +155,7 @@ public class CustomFormDataServiceImpl extends BaseServiceImpl<CustomFormDataMap
      * @param task
      * @param bom
      */
-    private void saveTask(WorkflowTask task, CustomFormData bom,Workflow flow) {
+    private String saveTask(WorkflowTask task, CustomFormData bom,Workflow flow) {
         task.setFormDataId(bom.getId());
         task.setCreatedTime(LocalDateTime.now());
         // 发起人
@@ -177,6 +179,7 @@ public class CustomFormDataServiceImpl extends BaseServiceImpl<CustomFormDataMap
         }
         task.setFrontId(node.getFrontId());
         workflowTaskMapper.insert(task);
+        return node.getId();
     }
 
     private String getTaskName(String userName,String flowName) {

+ 70 - 21
platform-service/src/main/java/com/platform/service/workflow/impl/WorkflowTaskBomServiceImpl.java

@@ -3,20 +3,16 @@ package com.platform.service.workflow.impl;
 import com.github.pagehelper.PageHelper;
 import com.platform.common.bean.AbstractPageResultBean;
 import com.platform.common.exception.DeniedException;
-import com.platform.common.util.ListUtils;
-import com.platform.common.util.SecurityUtils;
-import com.platform.common.util.StringUtils;
+import com.platform.common.util.*;
 import com.platform.dao.bean.MyPage;
 import com.platform.dao.dto.workflow.WorkflowNodeDTO;
 import com.platform.dao.dto.workflow.WorkflowTaskBomDTO;
 import com.platform.dao.dto.workflow.WorkflowTaskRecordDTO;
+import com.platform.dao.entity.workflow.WorkflowNode;
 import com.platform.dao.entity.workflow.WorkflowTask;
 import com.platform.dao.entity.workflow.WorkflowTaskBom;
 import com.platform.dao.entity.workflow.WorkflowTaskRecord;
-import com.platform.dao.enums.FlowTaskStatusEnum;
-import com.platform.dao.enums.SysFileTypeEnum;
-import com.platform.dao.enums.TaskRecordStatusEnum;
-import com.platform.dao.enums.YesNoEnum;
+import com.platform.dao.enums.*;
 import com.platform.dao.mapper.workflow.WorkflowNodeMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskBomMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskMapper;
@@ -36,6 +32,7 @@ import tk.mybatis.mapper.weekend.Weekend;
 import tk.mybatis.mapper.weekend.WeekendCriteria;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -60,6 +57,8 @@ public class WorkflowTaskBomServiceImpl extends BaseServiceImpl<WorkflowTaskBomM
     private WorkflowTaskRecordMapper workflowTaskRecordMapper;
     @Resource
     private SysFileService sysFileService;
+    @Autowired
+    private WorkflowTaskBomMapper workflowTaskBomMapper;
 
     @Override
     public int batchDelete(List<String> ids) {
@@ -128,6 +127,7 @@ public class WorkflowTaskBomServiceImpl extends BaseServiceImpl<WorkflowTaskBomM
                 item.setFileList(sysFileService.getListByTargetAndType(item.getId(), SysFileTypeEnum.VERIFY_RECORD_FILES.getValue()));
             }
         }
+        vo.setRecordList(recordList);
     }
 
     @Override
@@ -169,6 +169,13 @@ public class WorkflowTaskBomServiceImpl extends BaseServiceImpl<WorkflowTaskBomM
 
     @Override
     public void verifyTask(WorkflowTaskRecordDTO record) {
+        synchronized (record){
+            String val = RedisUtils.getString(record.getTaskId());
+            if(StringUtils.isNotBlank(val) && "Y".equals(val)){
+                throw new DeniedException("有人正在审批该任务,请刷新页面");
+            }
+            RedisUtils.setString(record.getTaskId(),"Y");
+        }
         checkPreview(record);
         WorkflowTaskBom bom = mapper.selectByPrimaryKey(record.getTaskBomId());
         WorkflowTask task = workflowTaskMapper.selectByPrimaryKey(record.getTaskId());
@@ -180,20 +187,62 @@ public class WorkflowTaskBomServiceImpl extends BaseServiceImpl<WorkflowTaskBomM
         if (taskStatus != FlowTaskStatusEnum.VERIFYING.getValue()) {
             throw new DeniedException("待办事项任务状态有误,请检查");
         }
-        // 判断审核的状态,决定处理分支
-        int currentLevel = task.getNodeSort();
-        currentLevel++;
-        // 获取下一个审批节点,为空,表示流程结束
-        WorkflowNodeDTO node = new WorkflowNodeDTO();
-        node.setFlowId(task.getFlowId());
-        node.setNodeLevel(currentLevel);
-        node.setFrontParentId(task.getFrontId());
-        List<WorkflowNodeVO> nodeList = workflowNodeMapper.selectNodeList(node);
-        // 封装请求参数
-        record.setFormDataId(task.getFormDataId()); // 表单数据ID
-        record.setFlowId(task.getFlowId()); // 流程ID
-        BaseStrategy baseStrategy = verifyStrategyList.stream().filter(strategy -> strategy.getType().equals(record.getHandleStatus())).collect(Collectors.toList()).get(0);
-        baseStrategy.verify(nodeList,record);
+        // 判断当前节点的审批类型
+        boolean continueFlag = Boolean.TRUE;
+        WorkflowNode currentNode = workflowNodeMapper.selectByPrimaryKey(bom.getNodeId());
+        int verifyType = currentNode.getVerifyType() == null ? 0 : currentNode.getVerifyType();
+        if(verifyType == YesNoEnum.YES.getValue()){
+            // 审批角色,判断审批类型
+            if (currentNode.getNodeFilterModel().intValue() == NodeFilterModelEnum.FULL.getValue()){
+                // 全签判断目前已办数量
+                WorkflowTaskBom bomQuery = new WorkflowTaskBom();
+                bomQuery.setTaskId(record.getTaskId());
+                bomQuery.setNodeId(bom.getNodeId());
+                int total = mapper.selectCount(bomQuery); // 审批总人数
+                bomQuery.setStatus(YesNoEnum.YES.getValue());
+                int verifyNum = mapper.selectCount(bomQuery); // 已审批人数
+                --total;
+                if (total > verifyNum){
+                    continueFlag = Boolean.FALSE;
+                }
+            }
+        }
+        if(continueFlag){
+            // 判断审核的状态,决定处理分支
+            int currentLevel = task.getNodeSort();
+            currentLevel++;
+            // 获取下一个审批节点,为空,表示流程结束
+            WorkflowNodeDTO node = new WorkflowNodeDTO();
+            node.setFlowId(task.getFlowId());
+            node.setNodeLevel(currentLevel);
+            node.setFrontParentId(task.getFrontId());
+            List<WorkflowNodeVO> nodeList = workflowNodeMapper.selectNodeList(node);
+            // 封装请求参数
+            record.setFormDataId(task.getFormDataId()); // 表单数据ID
+            record.setFlowId(task.getFlowId()); // 流程ID
+            BaseStrategy baseStrategy = verifyStrategyList.stream().filter(strategy -> strategy.getType().equals(record.getHandleStatus())).collect(Collectors.toList()).get(0);
+            baseStrategy.verify(nodeList,record);
+        }else{
+            saveTaskRecord(record);
+        }
+    }
+
+    private void saveTaskRecord(WorkflowTaskRecordDTO record) {
+        WorkflowTaskRecord item = new WorkflowTaskRecord();
+        item.setId(IdGeneratorUtils.getObjectId());
+        item.setCreatedUserId(SecurityUtils.getUserInfo().getUserId());
+        item.setCreatedTime(LocalDateTime.now());
+        item.setCreatedUserName(SecurityUtils.getUserInfo().getRealName());
+        item.setHandleStatus(record.getHandleStatus());
+        item.setTaskId(record.getTaskId());
+        item.setHandleRemark(record.getHandleRemark());
+        if(CollectionUtils.isNotEmpty(record.getImageList())){
+            sysFileService.saveFile(item.getId(), SysFileTypeEnum.VERIFY_RECORD_IMAGES.getValue(), record.getImageList());
+        }
+        if(CollectionUtils.isNotEmpty(record.getFileList())){
+            sysFileService.saveFile(item.getId(), SysFileTypeEnum.VERIFY_RECORD_FILES.getValue(), record.getFileList());
+        }
+        workflowTaskRecordMapper.insert(item);
     }
 
     private void checkPreview(WorkflowTaskRecordDTO record) {

+ 97 - 12
platform-service/src/main/java/com/platform/service/workflow/verifyStrategy/impl/VerifyPassStrategy.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.platform.common.constant.CommonConstants;
 import com.platform.common.exception.DeniedException;
 import com.platform.common.util.*;
+import com.platform.dao.dto.upms.SysUserDTO;
 import com.platform.dao.dto.workflow.WorkflowNodeDTO;
 import com.platform.dao.dto.workflow.WorkflowTaskRecordDTO;
 import com.platform.dao.entity.custom.CustomClassName;
@@ -15,9 +16,11 @@ import com.platform.dao.enums.TaskRecordStatusEnum;
 import com.platform.dao.enums.YesNoEnum;
 import com.platform.dao.mapper.custom.CustomClassNameMapper;
 import com.platform.dao.mapper.custom.CustomFormDataMapper;
+import com.platform.dao.mapper.upms.SysUserMapper;
 import com.platform.dao.mapper.workflow.WorkflowNodeMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskBomMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskMapper;
+import com.platform.dao.vo.SysUserVO;
 import com.platform.dao.vo.query.workflow.WorkflowNodeVO;
 import com.platform.service.workflow.verifyStrategy.AbstractBaseStrategy;
 import lombok.extern.slf4j.Slf4j;
@@ -49,6 +52,8 @@ public class VerifyPassStrategy extends AbstractBaseStrategy {
     private WorkflowTaskBomMapper workflowTaskBomMapper;
     @Resource
     private WorkflowTaskMapper workflowTaskMapper;
+    @Resource
+    private SysUserMapper sysUserMapper;
 
     @Override
     public Integer getType() {
@@ -72,6 +77,7 @@ public class VerifyPassStrategy extends AbstractBaseStrategy {
         }
         // 存储记录
         saveTaskRecord(record);
+        RedisUtils.del(record.getTaskId());
     }
 
     @Override
@@ -93,19 +99,19 @@ public class VerifyPassStrategy extends AbstractBaseStrategy {
         workflowTaskMapper.updateByPrimaryKeySelective(updTask);
     }
 
-    private WorkflowTaskBom generateTaskBom(List<WorkflowNodeVO> nodeList, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
-        WorkflowTaskBom bom = null;
+    private boolean generateTaskBom(List<WorkflowNodeVO> nodeList, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
+        boolean generateFlag = Boolean.FALSE;
         for (WorkflowNodeVO nodeVO : nodeList) {
-            bom = generateTaskBom(nodeVO, updTask, updBom, data);
-            if (bom != null) {
+            generateFlag = generateTaskBom(nodeVO, updTask, updBom, data);
+            if (generateFlag) {
                 break;
             }
         }
-        return bom;
+        return generateFlag;
     }
 
-    private WorkflowTaskBom generateTaskBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
-        WorkflowTaskBom bom = null;
+    private boolean generateTaskBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
+        boolean generateFlag = Boolean.FALSE;
         switch (node.getType()) {
             case CommonConstants.CONDITION_TYPE: // 条件分支
                 JSONObject switchJson = JSONObject.parseObject(node.getSwitchJson());
@@ -147,17 +153,32 @@ public class VerifyPassStrategy extends AbstractBaseStrategy {
                     nextNode.setFlowId(data.getFlowId());
                     nextNode.setFrontParentId(node.getFrontId());
                     List<WorkflowNodeVO> nodeList = workflowNodeMapper.selectNodeList(nextNode);
-                    bom = getBomByNode(nodeList.get(0), updTask, updBom);
+                    generateFlag = getBomByNode(nodeList.get(0), updTask, updBom);
                 }
                 break;
             case CommonConstants.VERIFY_USER_TYPE: // 审核人处理
-                bom = getBomByNode(node, updTask, updBom);
+                generateFlag = getBomByNode(node, updTask, updBom);
                 break;
         }
-        return bom;
+        return generateFlag;
     }
 
-    private WorkflowTaskBom getBomByNode(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
+    private Boolean getBomByNode(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
+        boolean generateFlag = Boolean.FALSE;
+        // 分流根据是角色还是个人审批
+        int verifyType = node.getVerifyType() == null ? 0 : node.getVerifyType();
+        switch (verifyType){
+            case CommonConstants.VERIFY_TYPE_USER: // 审批人
+                generateFlag = generateUserBom(node, updTask, updBom);
+                break;
+            case CommonConstants.VERIFY_TYPE_ROLE: // 审批角色
+                generateFlag = generateRoleBom(node, updTask, updBom);
+                break;
+        }
+        return generateFlag;
+    }
+
+    private Boolean generateUserBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
         WorkflowTaskBom bom = new WorkflowTaskBom();
         bom.setId(IdGeneratorUtils.getObjectId());
         bom.setTaskId(updTask.getId());
@@ -187,7 +208,71 @@ public class VerifyPassStrategy extends AbstractBaseStrategy {
         workflowTaskBomMapper.updateByPrimaryKeySelective(updBom);
         // 修改任务
         workflowTaskMapper.updateByPrimaryKeySelective(updTask);
-        return bom;
+        return true;
+    }
+
+    private boolean generateRoleBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom){
+        List<WorkflowTaskBom> bomList = ListUtils.newArrayList();
+        // 根据角色和部门获取审批人员集合
+        SysUserDTO queryDTO = new SysUserDTO();
+        queryDTO.setDeptId(node.getDeptId());
+        queryDTO.setRoleId(node.getRoleId());
+        List<SysUserVO> userList = sysUserMapper.selectUserByRole(queryDTO);
+        if(CollectionUtils.isEmpty(userList)){
+            return false;
+        }
+        StringBuffer userName = new StringBuffer("【");
+        List<String> userId = ListUtils.newArrayList();
+        for(SysUserVO user : userList){
+            userName.append(user.getRealName()).append("、");
+            userId.add(user.getUserId());
+            WorkflowTaskBom bom = new WorkflowTaskBom();
+            bom.setId(IdGeneratorUtils.getObjectId());
+            bom.setTaskId(updTask.getId());
+            bom.setStatus(YesNoEnum.NO.getValue());
+            bom.setPersonalType(YesNoEnum.YES.getValue() + 1);
+            bom.setCreatedUserName(user.getRealName());
+            bom.setCreatedUserId(user.getUserId());
+            bom.setCreatedTime(LocalDateTime.now());
+            bom.setReadFlag(YesNoEnum.NO.getValue());
+            bom.setReminderNum(YesNoEnum.NO.getValue());
+            bom.setNodeSort(node.getNodeLevel());
+            bomList.add(bom);
+        }
+        // 存入bom
+        workflowTaskBomMapper.insertListforComplex(bomList);
+        // 修改已有taskBom,获取历史taskBom
+        WorkflowTaskBom bomQuery = workflowTaskBomMapper.selectByPrimaryKey(updBom.getId());
+        WorkflowTaskBom queryBom = new WorkflowTaskBom();
+        queryBom.setTaskId(bomQuery.getTaskId());
+        queryBom.setNodeId(bomQuery.getNodeId());
+        List<WorkflowTaskBom> historyList = workflowTaskBomMapper.select(queryBom);
+        historyList.forEach(item->{
+            if(!item.getId().equals(bomQuery.getNodeId())){
+                item.setStatus(YesNoEnum.YES.getValue() + 1); // 会签已办
+                item.setHandleTime(LocalDateTime.now());
+                item.setHandleRemark("会签已办、" + SecurityUtils.getUserInfo().getRealName() + "已审批");
+                workflowTaskBomMapper.updateByPrimaryKeySelective(item);
+            }
+        });
+        updBom.setStatus(YesNoEnum.YES.getValue());
+        updBom.setHandleTime(LocalDateTime.now());
+        // 修改Task
+        updTask.setStatus(FlowTaskStatusEnum.VERIFYING.getValue());
+        updTask.setNodeSort(node.getNodeLevel());
+        updTask.setFrontId(node.getFrontId());
+        updTask.setLastTime(LocalDateTime.now());
+        updTask.setLastUserName(SecurityUtils.getUserInfo().getRealName());
+        updTask.setLastUserId(SecurityUtils.getUserInfo().getUserId());
+        updTask.setCurrentUserId(JsonUtils.objectToJson(userId));
+        String currentUserName = userName.substring(0, userName.length()-1) + "】";
+        updTask.setCurrentUserName(currentUserName);
+        updTask.setRemark("待" + currentUserName + "处理");
+        // 修改老节点
+        workflowTaskBomMapper.updateByPrimaryKeySelective(updBom);
+        // 修改任务
+        workflowTaskMapper.updateByPrimaryKeySelective(updTask);
+        return CollectionUtils.isNotEmpty(bomList);
     }
 
     private String getPrimaryKey(String json, String fieldName) {

+ 99 - 27
platform-service/src/main/java/com/platform/service/workflow/verifyStrategy/impl/VerifyPublishStrategy.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.platform.common.constant.CommonConstants;
 import com.platform.common.exception.DeniedException;
 import com.platform.common.util.*;
+import com.platform.dao.dto.upms.SysUserDTO;
 import com.platform.dao.dto.workflow.WorkflowNodeDTO;
 import com.platform.dao.dto.workflow.WorkflowTaskRecordDTO;
 import com.platform.dao.entity.custom.CustomClassName;
@@ -15,12 +16,15 @@ import com.platform.dao.enums.TaskRecordStatusEnum;
 import com.platform.dao.enums.YesNoEnum;
 import com.platform.dao.mapper.custom.CustomClassNameMapper;
 import com.platform.dao.mapper.custom.CustomFormDataMapper;
+import com.platform.dao.mapper.upms.SysUserMapper;
 import com.platform.dao.mapper.workflow.WorkflowNodeMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskBomMapper;
 import com.platform.dao.mapper.workflow.WorkflowTaskMapper;
+import com.platform.dao.vo.SysUserVO;
 import com.platform.dao.vo.query.workflow.WorkflowNodeVO;
 import com.platform.service.workflow.verifyStrategy.AbstractBaseStrategy;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
@@ -48,6 +52,8 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
     private WorkflowTaskBomMapper workflowTaskBomMapper;
     @Resource
     private WorkflowTaskMapper workflowTaskMapper;
+    @Resource
+    private SysUserMapper sysUserMapper;
 
     @Override
     public Integer getType() {
@@ -64,7 +70,9 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
         updBom.setId(record.getTaskBomId());
         updBom.setHandleRemark(record.getHandleRemark());
         // 生成taskBom
-        generateTaskBom(nodeList, updTask, updBom, customFormDataMapper.selectByPrimaryKey(record.getFormDataId()));
+        if(!generateTaskBom(nodeList, updTask, updBom, customFormDataMapper.selectByPrimaryKey(record.getFormDataId()))){
+            throw new DeniedException("任务发送失败");
+        }
         // 存储记录
         saveTaskRecord(record);
     }
@@ -74,33 +82,19 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
         super.saveTaskRecord(record);
     }
 
-    private void finishTask(WorkflowTaskBom updBom, WorkflowTask updTask) {
-        updBom.setStatus(YesNoEnum.YES.getValue());
-        updBom.setHandleTime(LocalDateTime.now());
-        // 修改老节点
-        workflowTaskBomMapper.updateByPrimaryKeySelective(updBom);
-        // 修改任务
-        updTask.setStatus(FlowTaskStatusEnum.FINISH.getValue());
-        updTask.setLastTime(LocalDateTime.now());
-        updTask.setLastUserName(SecurityUtils.getUserInfo().getRealName());
-        updTask.setLastUserId(SecurityUtils.getUserInfo().getUserId());
-        updTask.setRemark("已结束");
-        workflowTaskMapper.updateByPrimaryKeySelective(updTask);
-    }
-
-    private WorkflowTaskBom generateTaskBom(List<WorkflowNodeVO> nodeList, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
-        WorkflowTaskBom bom = null;
+    private boolean generateTaskBom(List<WorkflowNodeVO> nodeList, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
+        boolean generateFlag = Boolean.FALSE;
         for (WorkflowNodeVO nodeVO : nodeList) {
-            bom = generateTaskBom(nodeVO, updTask, updBom, data);
-            if (bom != null) {
+            if (generateTaskBom(nodeVO, updTask, updBom, data)) {
+                generateFlag = Boolean.TRUE;
                 break;
             }
         }
-        return bom;
+        return generateFlag;
     }
 
-    private WorkflowTaskBom generateTaskBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
-        WorkflowTaskBom bom = null;
+    private boolean generateTaskBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
+        boolean generateFlag = Boolean.FALSE;
         switch (node.getType()) {
             case CommonConstants.CONDITION_TYPE: // 条件分支
                 JSONObject switchJson = JSONObject.parseObject(node.getSwitchJson());
@@ -142,17 +136,40 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
                     nextNode.setFlowId(data.getFlowId());
                     nextNode.setFrontParentId(node.getFrontId());
                     List<WorkflowNodeVO> nodeList = workflowNodeMapper.selectNodeList(nextNode);
-                    bom = getBomByNode(nodeList.get(0), updTask, updBom);
+                    generateFlag = getBomByNode(nodeList.get(0), updTask, updBom);
                 }
                 break;
             case CommonConstants.VERIFY_USER_TYPE: // 审核人处理
-                bom = getBomByNode(node, updTask, updBom);
+                generateFlag = getBomByNode(node, updTask, updBom);
+                break;
+        }
+        return generateFlag;
+    }
+
+    private Boolean getBomByNode(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
+        boolean generateFlag = Boolean.FALSE;
+        // 分流根据是角色还是个人审批
+        int verifyType = node.getVerifyType() == null ? 0 : node.getVerifyType();
+        switch (verifyType){
+            case CommonConstants.VERIFY_TYPE_USER: // 审批人
+                generateFlag = generateUserBom(node, updTask, updBom);
+                break;
+            case CommonConstants.VERIFY_TYPE_ROLE: // 审批角色
+                generateFlag = generateRoleBom(node, updTask, updBom);
                 break;
+
         }
-        return bom;
+        return generateFlag;
     }
 
-    private WorkflowTaskBom getBomByNode(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
+    /**
+     * 审批人生成bom
+     * @param node
+     * @param updTask
+     * @param updBom
+     * @return
+     */
+    private Boolean generateUserBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom){
         WorkflowTaskBom bom = new WorkflowTaskBom();
         bom.setId(IdGeneratorUtils.getObjectId());
         bom.setTaskId(updTask.getId());
@@ -163,6 +180,8 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
         bom.setCreatedTime(LocalDateTime.now());
         bom.setReadFlag(YesNoEnum.NO.getValue());
         bom.setReminderNum(YesNoEnum.NO.getValue());
+        bom.setNodeSort(node.getNodeLevel());
+        bom.setNodeId(node.getId());
         // 修改已有taskBom
         updBom.setStatus(YesNoEnum.YES.getValue());
         updBom.setHandleTime(LocalDateTime.now());
@@ -182,7 +201,60 @@ public class VerifyPublishStrategy extends AbstractBaseStrategy {
         workflowTaskBomMapper.updateByPrimaryKeySelective(updBom);
         // 修改任务
         workflowTaskMapper.updateByPrimaryKeySelective(updTask);
-        return bom;
+        return true;
+    }
+
+
+    private boolean generateRoleBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom){
+        List<WorkflowTaskBom> bomList = ListUtils.newArrayList();
+        // 根据角色和部门获取审批人员集合
+        SysUserDTO queryDTO = new SysUserDTO();
+        queryDTO.setDeptId(node.getDeptId());
+        queryDTO.setRoleId(node.getRoleId());
+        List<SysUserVO> userList = sysUserMapper.selectUserByRole(queryDTO);
+        if(CollectionUtils.isEmpty(userList)){
+            return false;
+        }
+        StringBuffer userName = new StringBuffer("【");
+        List<String> userId = ListUtils.newArrayList();
+        for(SysUserVO user : userList){
+            userName.append(user.getRealName()).append("、");
+            userId.add(user.getUserId());
+            WorkflowTaskBom bom = new WorkflowTaskBom();
+            bom.setId(IdGeneratorUtils.getObjectId());
+            bom.setTaskId(updTask.getId());
+            bom.setStatus(YesNoEnum.NO.getValue());
+            bom.setPersonalType(YesNoEnum.YES.getValue() + 1);
+            bom.setCreatedUserName(user.getRealName());
+            bom.setCreatedUserId(user.getUserId());
+            bom.setCreatedTime(LocalDateTime.now());
+            bom.setReadFlag(YesNoEnum.NO.getValue());
+            bom.setReminderNum(YesNoEnum.NO.getValue());
+            bom.setNodeSort(node.getNodeLevel());
+            bom.setNodeId(node.getId());
+            bomList.add(bom);
+        }
+        // 存入bom
+        workflowTaskBomMapper.insertListforComplex(bomList);
+        // 修改已有taskBom
+        updBom.setStatus(YesNoEnum.YES.getValue());
+        updBom.setHandleTime(LocalDateTime.now());
+        // 修改Task
+        updTask.setStatus(FlowTaskStatusEnum.VERIFYING.getValue());
+        updTask.setNodeSort(node.getNodeLevel());
+        updTask.setFrontId(node.getFrontId());
+        updTask.setLastTime(LocalDateTime.now());
+        updTask.setLastUserName(SecurityUtils.getUserInfo().getRealName());
+        updTask.setLastUserId(SecurityUtils.getUserInfo().getUserId());
+        updTask.setCurrentUserId(JsonUtils.objectToJson(userId));
+        String currentUserName = userName.substring(0, userName.length()-1) + "】";
+        updTask.setCurrentUserName(currentUserName);
+        updTask.setRemark("待" + currentUserName + "处理");
+        // 修改老节点
+        workflowTaskBomMapper.updateByPrimaryKeySelective(updBom);
+        // 修改任务
+        workflowTaskMapper.updateByPrimaryKeySelective(updTask);
+        return CollectionUtils.isNotEmpty(bomList);
     }
 
     private String getPrimaryKey(String json, String fieldName) {