diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 7725676..d980f2f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -9,9 +9,11 @@ import com.casic.missiles.mapper.system.SystemFlowFormMapper; import com.casic.missiles.model.system.SystemFlowForm; import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RoleMapper; import com.casic.missiles.modular.system.dao.RuRelationMapper; import com.casic.missiles.modular.system.dao.UserMapper; import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Role; import com.casic.missiles.modular.system.model.RuRelation; import com.casic.missiles.modular.system.model.User; import com.casic.missiles.utils.SysDeptAndUserUtil; @@ -54,6 +56,8 @@ @Resource private UserMapper userMapper; @Resource + private RoleMapper roleMapper; + @Resource private DeptMapper deptMapper; //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 @@ -78,6 +82,9 @@ JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); if (Objects.isNull(nodeUserJsonObject)) { + nodeUserJsonObject = getNodeUserList2(nodeConfig, taskId); + } + if (Objects.isNull(nodeUserJsonObject)) { log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); return; } @@ -101,8 +108,13 @@ ruWrapper.eq("ROLEID", targetId); List ruRelations = ruRelationMapper.selectList(ruWrapper); if (!CollectionUtils.isEmpty(ruRelations)) { - List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); - assigneeList.addAll(collect); + List collect = ruRelations.stream().map(RuRelation::getUserId).collect(Collectors.toList()); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.in("id", collect); + wrapper1.eq("status", 1); + List users = userMapper.selectList(wrapper1); + List userIdList = users.stream().map(User::getId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(userIdList); } } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { //按部门查询用户id @@ -119,9 +131,25 @@ // 选择主管作为审批人 String startUserId = execution.getVariable("root", String.class); User user = userMapper.selectById(startUserId); + + //申请人为部门部门负责人,审批人为上级部门负责人 + QueryWrapper ruRelationWrapper = new QueryWrapper<>(); + ruRelationWrapper.eq("userid", user.getId()); + List ruRelations = ruRelationMapper.selectList(ruRelationWrapper); + List roleIds = ruRelations.stream().map(RuRelation::getRoleId).collect(Collectors.toList()); + QueryWrapper roleWrapper = new QueryWrapper<>(); + roleWrapper.in("id", roleIds); + List roles = roleMapper.selectList(roleWrapper); + List collectTips = roles.stream().map(Role::getTips).collect(Collectors.toList()); + Long deptId = user.getDeptId(); + if (collectTips.contains("director")) { + Dept dept = deptMapper.selectById(deptId); + deptId = dept.getPid(); + } + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 //sys_role表tips字段区分角色,director定义为主管角色 - String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(user.getDeptId()); + String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(deptId); if(!"".equals(directorId)){ assigneeList.add(directorId); } @@ -170,9 +198,7 @@ } Map idMap = list.get(0); String id = String.valueOf(idMap.get("id")); - list.forEach(l -> { - assigneeList.add(String.valueOf(l.get("id"))); - }); + assigneeList.add(id); startUserId = id; } } @@ -229,4 +255,18 @@ return null; } + /** + * getNodeUserList分支后节点情况补充 + */ + private JSONObject getNodeUserList2(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + return getNodeUserList(childNode, taskId); + } + return null; + } + } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 7725676..d980f2f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -9,9 +9,11 @@ import com.casic.missiles.mapper.system.SystemFlowFormMapper; import com.casic.missiles.model.system.SystemFlowForm; import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RoleMapper; import com.casic.missiles.modular.system.dao.RuRelationMapper; import com.casic.missiles.modular.system.dao.UserMapper; import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Role; import com.casic.missiles.modular.system.model.RuRelation; import com.casic.missiles.modular.system.model.User; import com.casic.missiles.utils.SysDeptAndUserUtil; @@ -54,6 +56,8 @@ @Resource private UserMapper userMapper; @Resource + private RoleMapper roleMapper; + @Resource private DeptMapper deptMapper; //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 @@ -78,6 +82,9 @@ JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); if (Objects.isNull(nodeUserJsonObject)) { + nodeUserJsonObject = getNodeUserList2(nodeConfig, taskId); + } + if (Objects.isNull(nodeUserJsonObject)) { log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); return; } @@ -101,8 +108,13 @@ ruWrapper.eq("ROLEID", targetId); List ruRelations = ruRelationMapper.selectList(ruWrapper); if (!CollectionUtils.isEmpty(ruRelations)) { - List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); - assigneeList.addAll(collect); + List collect = ruRelations.stream().map(RuRelation::getUserId).collect(Collectors.toList()); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.in("id", collect); + wrapper1.eq("status", 1); + List users = userMapper.selectList(wrapper1); + List userIdList = users.stream().map(User::getId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(userIdList); } } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { //按部门查询用户id @@ -119,9 +131,25 @@ // 选择主管作为审批人 String startUserId = execution.getVariable("root", String.class); User user = userMapper.selectById(startUserId); + + //申请人为部门部门负责人,审批人为上级部门负责人 + QueryWrapper ruRelationWrapper = new QueryWrapper<>(); + ruRelationWrapper.eq("userid", user.getId()); + List ruRelations = ruRelationMapper.selectList(ruRelationWrapper); + List roleIds = ruRelations.stream().map(RuRelation::getRoleId).collect(Collectors.toList()); + QueryWrapper roleWrapper = new QueryWrapper<>(); + roleWrapper.in("id", roleIds); + List roles = roleMapper.selectList(roleWrapper); + List collectTips = roles.stream().map(Role::getTips).collect(Collectors.toList()); + Long deptId = user.getDeptId(); + if (collectTips.contains("director")) { + Dept dept = deptMapper.selectById(deptId); + deptId = dept.getPid(); + } + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 //sys_role表tips字段区分角色,director定义为主管角色 - String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(user.getDeptId()); + String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(deptId); if(!"".equals(directorId)){ assigneeList.add(directorId); } @@ -170,9 +198,7 @@ } Map idMap = list.get(0); String id = String.valueOf(idMap.get("id")); - list.forEach(l -> { - assigneeList.add(String.valueOf(l.get("id"))); - }); + assigneeList.add(id); startUserId = id; } } @@ -229,4 +255,18 @@ return null; } + /** + * getNodeUserList分支后节点情况补充 + */ + private JSONObject getNodeUserList2(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + return getNodeUserList(childNode, taskId); + } + return null; + } + } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java index 206d766..0cafcd5 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java @@ -21,7 +21,7 @@ public static String getDeptDirectorIdByDeptId(Long deptId){ List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1) " + // "WHERE sr.DEPT_ID = {0}" + "WHERE "+ "sr.TIPS = {1}" + @@ -42,7 +42,7 @@ Map resultMap = SqlRunner.db().selectOne( "SELECT su.DEPT_ID as deptId, sd.SIMPLE_NAME AS deptName FROM sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1) " + "JOIN sys_dept sd ON su.DEPT_ID = sd.ID " + "WHERE su.ID = {0}" + "AND sr.TIPS = {1}", String.valueOf(userId), "director"); @@ -52,7 +52,7 @@ public static List> getUserIdsByDeptIdAndDeptIds(List deptIds, Long deptId){ List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1)" + // "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 "WHERE "+ "sr.TIPS = {1}" + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 7725676..d980f2f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -9,9 +9,11 @@ import com.casic.missiles.mapper.system.SystemFlowFormMapper; import com.casic.missiles.model.system.SystemFlowForm; import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RoleMapper; import com.casic.missiles.modular.system.dao.RuRelationMapper; import com.casic.missiles.modular.system.dao.UserMapper; import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Role; import com.casic.missiles.modular.system.model.RuRelation; import com.casic.missiles.modular.system.model.User; import com.casic.missiles.utils.SysDeptAndUserUtil; @@ -54,6 +56,8 @@ @Resource private UserMapper userMapper; @Resource + private RoleMapper roleMapper; + @Resource private DeptMapper deptMapper; //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 @@ -78,6 +82,9 @@ JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); if (Objects.isNull(nodeUserJsonObject)) { + nodeUserJsonObject = getNodeUserList2(nodeConfig, taskId); + } + if (Objects.isNull(nodeUserJsonObject)) { log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); return; } @@ -101,8 +108,13 @@ ruWrapper.eq("ROLEID", targetId); List ruRelations = ruRelationMapper.selectList(ruWrapper); if (!CollectionUtils.isEmpty(ruRelations)) { - List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); - assigneeList.addAll(collect); + List collect = ruRelations.stream().map(RuRelation::getUserId).collect(Collectors.toList()); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.in("id", collect); + wrapper1.eq("status", 1); + List users = userMapper.selectList(wrapper1); + List userIdList = users.stream().map(User::getId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(userIdList); } } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { //按部门查询用户id @@ -119,9 +131,25 @@ // 选择主管作为审批人 String startUserId = execution.getVariable("root", String.class); User user = userMapper.selectById(startUserId); + + //申请人为部门部门负责人,审批人为上级部门负责人 + QueryWrapper ruRelationWrapper = new QueryWrapper<>(); + ruRelationWrapper.eq("userid", user.getId()); + List ruRelations = ruRelationMapper.selectList(ruRelationWrapper); + List roleIds = ruRelations.stream().map(RuRelation::getRoleId).collect(Collectors.toList()); + QueryWrapper roleWrapper = new QueryWrapper<>(); + roleWrapper.in("id", roleIds); + List roles = roleMapper.selectList(roleWrapper); + List collectTips = roles.stream().map(Role::getTips).collect(Collectors.toList()); + Long deptId = user.getDeptId(); + if (collectTips.contains("director")) { + Dept dept = deptMapper.selectById(deptId); + deptId = dept.getPid(); + } + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 //sys_role表tips字段区分角色,director定义为主管角色 - String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(user.getDeptId()); + String directorId = SysDeptAndUserUtil.getDeptDirectorIdByDeptId(deptId); if(!"".equals(directorId)){ assigneeList.add(directorId); } @@ -170,9 +198,7 @@ } Map idMap = list.get(0); String id = String.valueOf(idMap.get("id")); - list.forEach(l -> { - assigneeList.add(String.valueOf(l.get("id"))); - }); + assigneeList.add(id); startUserId = id; } } @@ -229,4 +255,18 @@ return null; } + /** + * getNodeUserList分支后节点情况补充 + */ + private JSONObject getNodeUserList2(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + return getNodeUserList(childNode, taskId); + } + return null; + } + } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java index 206d766..0cafcd5 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SysDeptAndUserUtil.java @@ -21,7 +21,7 @@ public static String getDeptDirectorIdByDeptId(Long deptId){ List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1) " + // "WHERE sr.DEPT_ID = {0}" + "WHERE "+ "sr.TIPS = {1}" + @@ -42,7 +42,7 @@ Map resultMap = SqlRunner.db().selectOne( "SELECT su.DEPT_ID as deptId, sd.SIMPLE_NAME AS deptName FROM sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1) " + "JOIN sys_dept sd ON su.DEPT_ID = sd.ID " + "WHERE su.ID = {0}" + "AND sr.TIPS = {1}", String.valueOf(userId), "director"); @@ -52,7 +52,7 @@ public static List> getUserIdsByDeptIdAndDeptIds(List deptIds, Long deptId){ List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + - "JOIN sys_user su ON srr.USERID = su.ID " + + "JOIN sys_user su ON (srr.USERID = su.ID AND su.STATUS = 1)" + // "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 "WHERE "+ "sr.TIPS = {1}" + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java index cc18fd8..f353d5a 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -741,10 +741,10 @@ // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 - //默认或签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 - if ("1".equals(examineMode)) { + //默认依次会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode) || StringUtils.isEmpty(examineMode)) { multiInstanceLoopCharacteristics.setSequential(true); - } else if (StringUtils.isEmpty(examineMode) || "3".equals(examineMode)) { + } else if ("3".equals(examineMode)) { //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}");