diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java index 0b0cc820..596f39dc 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/listener/task/OaUserTaskCompleteListener.java @@ -1,7 +1,6 @@ package ink.wgink.module.activiti.listener.task; import ink.wgink.exceptions.OaNodeException; -import ink.wgink.exceptions.SearchException; import ink.wgink.interfaces.department.IDepartmentBaseService; import ink.wgink.interfaces.department.IDepartmentUserBaseService; import ink.wgink.interfaces.position.IPositionBaseService; @@ -33,7 +32,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -76,7 +74,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { @Override public void notify(DelegateTask delegateTask) { - LOG.debug(">>>> userTask complete"); + LOG.debug(">>>>>> 代理人任务完成 <<<<<<"); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); String processDefinitionId = delegateTask.getProcessDefinitionId(); LOG.debug("查找流程定义"); @@ -106,28 +104,6 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { multiple(delegateTask, nextUserTask, oaNodeAssigneePO); return; } - - if (nextUserTask != null) { - if (StringUtils.equals(nextUserTask.getName(), "任务3")) { -// nextUserTask.setAssignee("${signUser}"); -// MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics(); -// characteristics.setInputDataItem("signUsers"); -// characteristics.setElementVariable("signUser"); -// characteristics.setSequential(false); -// characteristics.setCompletionCondition("${nrOfCompletedInstances==nrOfInstances}"); -// nextUserTask.setLoopCharacteristics(characteristics); - - List signUsers = new ArrayList<>(); - signUsers.add("1"); - signUsers.add("e48e9c4a-995e-4061-abcd-a3c260c11333"); - -// runtimeService.setVariable(delegateTask.getExecutionId(), "signUsers", signUsers); - delegateTask.setVariable("signUsers", signUsers); - } else { - nextUserTask.setAssignee("1"); - } - } - } @Override @@ -147,7 +123,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { } if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) { LOG.debug("assigneeType -> auto"); - auto(delegateTask, userTask, oaNodeAssigneePO); + auto(delegateTask, userTask, oaNodeAssigneePO, NodeTypeEnum.NORMAL); return; } } @@ -160,7 +136,25 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param oaNodeAssigneePO */ private void multiple(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { - + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.APPOINT.getValue())) { + LOG.debug("assigneeType -> appoint"); + String multipleAssignees = oaNodeAssigneePO.getMultipleAssignees(); + if (StringUtils.isBlank(multipleAssignees)) { + throw new OaNodeException("多实例代理人未设置"); + } + List userDTOs = userBaseService.listByUserIds(Arrays.asList(multipleAssignees.split(","))); + if (userDTOs.isEmpty()) { + throw new OaNodeException("多实例代理人不存在"); + } + List existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class); + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) { + LOG.debug("assigneeType -> auto"); + auto(delegateTask, userTask, oaNodeAssigneePO, NodeTypeEnum.MULTIPLE); + return; + } } /** @@ -175,13 +169,13 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { LOG.debug("assigneeCount -> single"); String assignee = oaNodeAssigneePO.getAssignee(); if (StringUtils.isBlank(assignee)) { - throw new SearchException("下节点代理人未设置"); + throw new OaNodeException("下节点代理人未设置"); } UserDTO userDTO = userBaseService.get(assignee); if (userDTO == null) { - throw new SearchException("下节点代理人不存在"); + throw new OaNodeException("下节点代理人不存在"); } - LOG.debug("设置代理人"); + LOG.debug("设置普通节点代理人"); userTask.setAssignee(userDTO.getUserId()); return; } @@ -189,11 +183,11 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { LOG.debug("assigneeCount -> candidate"); String candidates = oaNodeAssigneePO.getCandidates(); if (StringUtils.isBlank(candidates)) { - throw new SearchException("下节点候选人未设置"); + throw new OaNodeException("下节点候选人未设置"); } List userDTOs = userBaseService.listByUserIds(Arrays.asList(candidates.split(","))); if (userDTOs.isEmpty()) { - throw new SearchException("下节点候选人不存在"); + throw new OaNodeException("下节点候选人不存在"); } LOG.debug("设置候选人"); userTask.setCandidateUsers(ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class)); @@ -208,15 +202,15 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param userTask * @param oaNodeAssigneePO */ - private void auto(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + private void auto(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { if (StringUtils.equals(oaNodeAssigneePO.getAutoAssignType(), AutoAssignTypeEnum.SCOPE.getValue())) { LOG.debug("autoAssigneeType -> scope"); - departmentType(delegateTask, userTask, oaNodeAssigneePO); + departmentType(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } if (StringUtils.equals(oaNodeAssigneePO.getAutoAssignType(), AutoAssignTypeEnum.QUICK.getValue())) { LOG.debug("autoAssigneeType -> quick"); - quickAssignee(delegateTask, userTask, oaNodeAssigneePO); + quickAssignee(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } } @@ -227,8 +221,9 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param delegateTask * @param userTask * @param oaNodeAssigneePO + * @param nodeType */ - private void quickAssignee(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + private void quickAssignee(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { String quickAssignee = oaNodeAssigneePO.getQuickAssignee(); if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.STARTER.getValue())) { LOG.debug("quickAssignee -> starter:发起人"); @@ -237,78 +232,225 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { return; } if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.STARTER_SUPERIOR_POSITION.getValue())) { - LOG.debug("quickAssignee -> starterSuperiorPosition:发起人上级岗位"); - HistoricTaskInstance startTask = activitiModelService.getStartTask(delegateTask.getProcessInstanceId()); - String starterUserId = startTask.getAssignee(); - List positionIds = positionUserBaseService.listPositionIdByUserId(starterUserId); - List parentPositionDTOs = positionBaseService.listParentByPositionIds(positionIds); - if (parentPositionDTOs.isEmpty()) { - throw new OaNodeException("发起人不存在上级岗位"); - } - List parentPositionIds = ArrayListUtil.listBeanStringIdValue(parentPositionDTOs, "positionId", PositionDTO.class); - LOG.debug("查询发起人上级岗位用户ID列表"); - List parentPositionUserIds = positionUserBaseService.listUserId(parentPositionIds); - LOG.debug("查询发起人上级岗位用户列表"); - List parentPositionUserDTOs = userBaseService.listByUserIds(parentPositionUserIds); - if (parentPositionUserDTOs.isEmpty()) { - throw new OaNodeException("发起人上级岗位没有用户"); - } - // 上级岗位可以有自己 - List existParentPositionUserIds = ArrayListUtil.listBeanStringIdValue(parentPositionUserDTOs, "userId", UserDTO.class); - LOG.debug("候选人用户列表"); - userTask.setCandidateUsers(existParentPositionUserIds); + starterSuperiorPosition(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUBORDINATE_POSITION.getValue())) { - LOG.debug("quickAssignee -> previousStepAssigneeSubordinatePosition:上一步代理人下级岗位"); + previousStepAssigneeSubordinatePosition(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUPERIOR_POSITION.getValue())) { - LOG.debug("quickAssignee -> previousStepAssigneeSuperiorPosition:上一步代理人上级岗位"); + previousStepAssigneeSuperiorPosition(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUPERIOR_POSITION.getValue())) { - LOG.debug("quickAssignee -> previousStepAssigneeSameDepartment:上一步代理人同部门"); + previousStepAssigneeSameDepartment(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_N_STEP_ASSIGNEE_SUBORDINATE_POSITION.getValue())) { - LOG.debug("quickAssignee -> previousNStepAssigneeSubordinatePosition:前N步代理人"); - Integer previousNStep = oaNodeAssigneePO.getPreviousNStep(); + previousNStepAssigneeSubordinatePosition(delegateTask, userTask, oaNodeAssigneePO, nodeType); return; } } + /** + * 发起人上级岗位 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + * @param nodeType + */ + private void starterSuperiorPosition(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { + // 同部门 + LOG.debug("quickAssignee -> starterSuperiorPosition:发起人上级岗位"); + // 开始节点代理人 + HistoricTaskInstance startTask = activitiModelService.getStartTask(delegateTask.getProcessInstanceId()); + String starterUserId = startTask.getAssignee(); + LOG.debug("查询同部门下所有用户"); + List departmentUserIds = departmentUserBaseService.listSameDepartmentUserIdByUserId(starterUserId); + List positionIds = positionUserBaseService.listPositionIdByUserId(starterUserId); + List parentPositionDTOs = positionBaseService.listParentByPositionIds(positionIds); + if (parentPositionDTOs.isEmpty()) { + throw new OaNodeException("发起人不存在上级岗位"); + } + List parentPositionIds = ArrayListUtil.listBeanStringIdValue(parentPositionDTOs, "positionId", PositionDTO.class); + LOG.debug("查询发起人同部门上级岗位用户ID列表"); + List parentPositionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(parentPositionIds, departmentUserIds); + LOG.debug("查询发起人同部门上级岗位用户列表"); + List parentPositionUserDTOs = userBaseService.listByUserIds(parentPositionUserIds); + if (parentPositionUserDTOs.isEmpty()) { + throw new OaNodeException("发起人上级岗位没有用户"); + } + // 上级岗位可以有自己 + List existParentPositionUserIds = ArrayListUtil.listBeanStringIdValue(parentPositionUserDTOs, "userId", UserDTO.class); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + LOG.debug("候选人用户列表"); + userTask.setCandidateUsers(existParentPositionUserIds); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existParentPositionUserIds); + } + } + + /** + * 上一步代理人下级岗位 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + * @param nodeType + */ + private void previousStepAssigneeSubordinatePosition(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { + // 同部门 + LOG.debug("quickAssignee -> previousStepAssigneeSubordinatePosition:上一步代理人下级岗位"); + // 当前任务人 + String assignee = delegateTask.getAssignee(); + LOG.debug("查询当前代理人同部门下所有用户"); + List departmentUserIds = departmentUserBaseService.listSameDepartmentUserIdByUserId(assignee); + LOG.debug("查询当前代理人的岗位"); + List positionIds = positionUserBaseService.listPositionIdByUserId(assignee); + LOG.debug("查询下级岗位列表"); + List childPositionDTOs = positionBaseService.listByPositionParentIds(positionIds); + if (childPositionDTOs.isEmpty()) { + throw new OaNodeException("当前代理人没有下级岗位"); + } + List childPositionIds = ArrayListUtil.listBeanStringIdValue(childPositionDTOs, "positionId", PositionDTO.class); + LOG.debug("查询下级岗位的用户ID列表"); + List childPositionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(childPositionIds, departmentUserIds); + LOG.debug("查询下级岗位用户列表"); + List childPositionUserDTOs = userBaseService.listByUserIds(childPositionUserIds); + if (childPositionUserDTOs.isEmpty()) { + throw new OaNodeException("下级岗位没有用户"); + } + List existChildPositionUserIds = ArrayListUtil.listBeanStringIdValue(childPositionUserDTOs, "userId", UserDTO.class); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + LOG.debug("设置候选人列表"); + userTask.setCandidateUsers(existChildPositionUserIds); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existChildPositionUserIds); + } + } + + /** + * 上一步代理人上级岗位 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + * @param nodeType + */ + private void previousStepAssigneeSuperiorPosition(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { + // 同部门 + LOG.debug("quickAssignee -> previousStepAssigneeSuperiorPosition:上一步代理人上级岗位"); + // 当前代理人 + String assignee = delegateTask.getAssignee(); + LOG.debug("查询当前代理人同部门下所有用户"); + List departmentUserIds = departmentUserBaseService.listSameDepartmentUserIdByUserId(assignee); + LOG.debug("查询当前代理人的岗位"); + List positionIds = positionUserBaseService.listPositionIdByUserId(assignee); + LOG.debug("查询上级岗位列表"); + List parentPositionDTOs = positionBaseService.listParentByPositionIds(positionIds); + if (parentPositionDTOs.isEmpty()) { + throw new OaNodeException("当前代理人没有上级岗位"); + } + List parentPositionIds = ArrayListUtil.listBeanStringIdValue(parentPositionDTOs, "positionId", PositionDTO.class); + LOG.debug("查询上级岗位的用户ID列表"); + List parentPositionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(parentPositionIds, departmentUserIds); + LOG.debug("查询上级岗位用户列表"); + List parentPositionUserDTOs = userBaseService.listByUserIds(parentPositionUserIds); + if (parentPositionUserDTOs.isEmpty()) { + throw new OaNodeException("上级岗位没有用户"); + } + List existParentPositionUserIds = ArrayListUtil.listBeanStringIdValue(parentPositionUserDTOs, "userId", UserDTO.class); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + LOG.debug("设置候选人列表"); + userTask.setCandidateUsers(existParentPositionUserIds); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existParentPositionUserIds); + } + } + + /** + * 上一步代理人同部门 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + * @param nodeType + */ + private void previousStepAssigneeSameDepartment(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { + // 同部门 + LOG.debug("quickAssignee -> previousStepAssigneeSameDepartment:上一步代理人同部门"); + String assignee = delegateTask.getAssignee(); + LOG.debug("查询当前代理人同部门下所有用户"); + List departmentUserIds = departmentUserBaseService.listSameDepartmentUserIdByUserId(assignee); + LOG.debug("排除自己"); + clearUserIdsCurrentTaskAssignee(departmentUserIds, assignee); + List departmentUserDTOs = userBaseService.listByUserIds(departmentUserIds); + if (departmentUserDTOs.isEmpty()) { + throw new OaNodeException("同部门下没有其他用户"); + } + List existChildPositionUserIds = ArrayListUtil.listBeanStringIdValue(departmentUserDTOs, "userId", UserDTO.class); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + LOG.debug("设置候选人列表"); + userTask.setCandidateUsers(existChildPositionUserIds); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existChildPositionUserIds); + } + } + + /** + * 前 N 步代理人 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + * @param nodeType + */ + private void previousNStepAssigneeSubordinatePosition(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { + LOG.debug("quickAssignee -> previousNStepAssigneeSubordinatePosition:前N步代理人"); + Integer previousNStep = oaNodeAssigneePO.getPreviousNStep(); + HistoricTaskInstance prevTask = activitiModelService.getPrevTask(delegateTask.getProcessInstanceId(), previousNStep - 1); + String assignee = prevTask.getAssignee(); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + userTask.setAssignee(assignee); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, Arrays.asList(assignee)); + } + } + /** * 部门类型 * * @param delegateTask * @param userTask * @param oaNodeAssigneePO + * @param nodeType */ - private void departmentType(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + private void departmentType(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO, NodeTypeEnum nodeType) { if (StringUtils.equals(oaNodeAssigneePO.getDepartmentType(), DepartmentTypeEnum.APPOINT.getValue())) { LOG.debug("departmentType -> appoint"); String departmentIds = oaNodeAssigneePO.getDepartments(); String roleIds = oaNodeAssigneePO.getRoles(); String positionIds = oaNodeAssigneePO.getPositions(); if (StringUtils.isBlank(departmentIds) && StringUtils.isBlank(roleIds) && StringUtils.isBlank(positionIds)) { - throw new SearchException("下节点没有设置部门、角色、职位"); + throw new OaNodeException("下节点没有设置部门、角色、职位"); } if (!StringUtils.isBlank(departmentIds)) { LOG.debug("查询部门用户"); List departmentUserIds = departmentUserBaseService.listUserId(Arrays.asList(departmentIds.split(","))); - setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds); + setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds, nodeType); return; } if (!StringUtils.isBlank(roleIds)) { LOG.debug("查询角色用户"); List roleUserIds = roleUserBaseService.listUserId(Arrays.asList(roleIds.split(","))); - setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds); + setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds, nodeType); return; } LOG.debug("查询职位用户"); List positionUserIds = positionUserBaseService.listUserId(Arrays.asList(positionIds.split(","))); - setPositionCandidateUser(delegateTask, userTask, positionUserIds); + setPositionCandidateUser(delegateTask, userTask, positionUserIds, nodeType); return; } if (StringUtils.equals(oaNodeAssigneePO.getDepartmentType(), DepartmentTypeEnum.BELONG.getValue())) { @@ -321,7 +463,7 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { throw new OaNodeException("代理人不存在部门"); } List departmentUserIds = departmentUserBaseService.listUserId(departmentIds); - setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds); + setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds, nodeType); } } @@ -333,15 +475,16 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param departmentUserIds * @param roleIds * @param positionIds + * @param nodeType */ - private void setDepartmentCandidateUser(DelegateTask delegateTask, UserTask userTask, List departmentUserIds, String roleIds, String positionIds) { + private void setDepartmentCandidateUser(DelegateTask delegateTask, UserTask userTask, List departmentUserIds, String roleIds, String positionIds, NodeTypeEnum nodeType) { if (!StringUtils.isBlank(roleIds)) { LOG.debug("查询角色用户"); List roleUserIds = roleUserBaseService.listUserIdByRoleIdsAndUserIds(Arrays.asList(roleIds.split(",")), departmentUserIds); - setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds); + setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds, nodeType); return; } - setCandidateUsers(delegateTask, userTask, departmentUserIds); + setCandidateUsers(delegateTask, userTask, departmentUserIds, nodeType); } /** @@ -351,15 +494,16 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param userTask * @param roleUserIds * @param positionIds + * @param nodeType */ - private void setRoleCandidateUser(DelegateTask delegateTask, UserTask userTask, List roleUserIds, String positionIds) { + private void setRoleCandidateUser(DelegateTask delegateTask, UserTask userTask, List roleUserIds, String positionIds, NodeTypeEnum nodeType) { if (!StringUtils.isBlank(positionIds)) { LOG.debug("查询职位用户"); List positionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(Arrays.asList(positionIds.split(",")), roleUserIds); - setPositionCandidateUser(delegateTask, userTask, positionUserIds); + setPositionCandidateUser(delegateTask, userTask, positionUserIds, nodeType); return; } - setCandidateUsers(delegateTask, userTask, roleUserIds); + setCandidateUsers(delegateTask, userTask, roleUserIds, nodeType); } /** @@ -368,9 +512,10 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param delegateTask * @param userTask * @param positionUserIds + * @param nodeType */ - private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List positionUserIds) { - setCandidateUsers(delegateTask, userTask, positionUserIds); + private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List positionUserIds, NodeTypeEnum nodeType) { + setCandidateUsers(delegateTask, userTask, positionUserIds, nodeType); } /** @@ -379,16 +524,21 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { * @param delegateTask * @param userTask * @param userIds + * @param nodeType */ - private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List userIds) { + private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List userIds, NodeTypeEnum nodeType) { List userDTOs = userBaseService.listByUserIds(userIds); if (userDTOs.isEmpty()) { - throw new SearchException("下节点候选人不存在"); + throw new OaNodeException("下节点候选人不存在"); } LOG.debug("设置候选人"); List existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class); clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee()); - userTask.setCandidateUsers(existUserIds); + if (NodeTypeEnum.NORMAL.equals(nodeType)) { + userTask.setCandidateUsers(existUserIds); + } else { + delegateTask.setVariable(IActivitiModelService.MULTI_INSTANCE_COLLECTION_NAME, existUserIds); + } } /** @@ -406,39 +556,4 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { } } - private void assigneeCount(UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { - - } - - // 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量 - - // 设置会签 -// // 获取多实例配置 -// MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics(); -// // 设置集合变量,统一设置成users -// characteristics.setInputDataItem(Constant.ACT_MUIT_LIST_NAME); -// // 设置变量 -// characteristics.setElementVariable(Constant.ACT_MUIT_VAR_NAME); -// // 设置为同时接收(false 表示不按顺序执行) -// characteristics.setSequential(false); -// // 设置条件(暂时处理成,全部会签完转下步) -// characteristics.setCompletionCondition("${nrOfCompletedInstances==nrOfInstances}"); -// -// userTask.setLoopCharacteristics(characteristics); - - - // 清空会签 - // 获取多实例配置 -// MultiInstanceLoopCharacteristics characteristics = userTask.getLoopCharacteristics(); -// if (characteristics != null) { -// // 清空集合 -// characteristics.setInputDataItem(""); -// // 清空变量 -// characteristics.setElementVariable(""); -// // 设置为顺序接收(true 表示不按顺序执行) -// characteristics.setSequential(true); -// // 清空条件 -// characteristics.setCompletionCondition(""); -// } - } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index d0516c94..4206e839 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -38,10 +38,14 @@ public interface IActivitiModelService { * 候选人集合 */ String CANDIDATES_COLLECTION = "${candidates}"; + /** + * 多实例集合名称 + */ + String MULTI_INSTANCE_COLLECTION_NAME = "assigneeList"; /** * 多实例集合 */ - String MULTI_INSTANCE_COLLECTION = "${assigneeList}"; + String MULTI_INSTANCE_COLLECTION = "${" + MULTI_INSTANCE_COLLECTION_NAME + "}"; /** * 多实例变量 */ diff --git a/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml b/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml index de807e09..6acf57d3 100644 --- a/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml +++ b/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml @@ -167,7 +167,7 @@ - SELECT id, node_assignee_id, @@ -224,7 +224,7 @@ - SELECT id, node_assignee_id,