diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java index 0a8349d3..edfd03a7 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java @@ -2,10 +2,13 @@ package ink.wgink.module.activiti.dao.oa; import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.SaveException; +import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.init.IInitBaseTable; +import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Map; /** @@ -49,4 +52,23 @@ public interface INodeAssigneeDao extends IInitBaseTable { * @throws UpdateException */ void deleteDeploymentId(String deploymentId) throws UpdateException; + + /** + * 详情 + * + * @param params + * @return + * @throws SearchException + */ + OaNodeAssigneePO getPO(Map params) throws SearchException; + + /** + * 列表 + * + * @param params + * @return + * @throws SearchException + */ + List listPO(Map params) throws SearchException; + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeCountEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeCountEnum.java new file mode 100644 index 00000000..471f86be --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeCountEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: AssigneeCountEnum + * @Description: 代理人数量 + * @Author: wanggeng + * @Date: 2022/4/7 09:39 + * @Version: 1.0 + */ +public enum AssigneeCountEnum { + SINGLE("single", "单人"), + CANDIDATE("candidate", "候选人"); + + private String value; + private String text; + + AssigneeCountEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeTypeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeTypeEnum.java new file mode 100644 index 00000000..7c930f23 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AssigneeTypeEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: AssigneeTypeEnum + * @Description: 代理人类型 + * @Author: wanggeng + * @Date: 2022/4/7 09:38 + * @Version: 1.0 + */ +public enum AssigneeTypeEnum { + APPOINT("appoint", "手动指定"), + AUTO("auto", "自动获取"); + + private String value; + private String text; + + AssigneeTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AutoAssignTypeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AutoAssignTypeEnum.java new file mode 100644 index 00000000..73a6356a --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/AutoAssignTypeEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: AutoAssignTypeEnum + * @Description: 自动方式 + * @Author: wanggeng + * @Date: 2022/4/7 09:41 + * @Version: 1.0 + */ +public enum AutoAssignTypeEnum { + SCOPE("scope", "范围指定"), + QUICK("quick", "快捷指定"); + + private String value; + private String text; + + AutoAssignTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/CompleteConditionEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/CompleteConditionEnum.java new file mode 100644 index 00000000..dc3f62c8 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/CompleteConditionEnum.java @@ -0,0 +1,31 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: CompleteConditionEnum + * @Description: 完成条件 + * @Author: wanggeng + * @Date: 2022/4/7 09:35 + * @Version: 1.0 + */ +public enum CompleteConditionEnum { + ALL_PASS("allPass", "全部通过"), + SINGLE_PASS("singlePass", "单人通过"), + CUSTOM_PASS("customPass", "自定义通过"), + COMPLETE_COUNT("completeCount", "通过数"); + + private String value; + private String text; + + CompleteConditionEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/DepartmentTypeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/DepartmentTypeEnum.java new file mode 100644 index 00000000..80dc6f9f --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/DepartmentTypeEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: DepartmentTypeEnum + * @Description: 部门类型 + * @Author: wanggeng + * @Date: 2022/4/7 09:42 + * @Version: 1.0 + */ +public enum DepartmentTypeEnum { + APPOINT("appoint", "指定"), + BELONG("belong", "所在部门"); + + private String value; + private String text; + + DepartmentTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/MultipleTypeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/MultipleTypeEnum.java new file mode 100644 index 00000000..ad21bae5 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/MultipleTypeEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: MultipleTypeEnum + * @Description: 多实例类型 + * @Author: wanggeng + * @Date: 2022/4/7 09:29 + * @Version: 1.0 + */ +public enum MultipleTypeEnum { + PARALLEL("parallel", "并行"), + SEQUENTIAL("sequential", "串行"); + + private String value; + private String text; + + MultipleTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/NodeTypeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/NodeTypeEnum.java new file mode 100644 index 00000000..351b5491 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/NodeTypeEnum.java @@ -0,0 +1,29 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: OaNodeManageEnum + * @Description: 节点类型 + * @Author: wanggeng + * @Date: 2022/4/7 09:24 + * @Version: 1.0 + */ +public enum NodeTypeEnum { + NORMAL("normal", "普通(单实例)节点"), + MULTIPLE("multiple", "多实例节点"); + + private String value; + private String text; + + NodeTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/QuickAssigneeEnum.java b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/QuickAssigneeEnum.java new file mode 100644 index 00000000..4653f75f --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/enums/oa/assignee/QuickAssigneeEnum.java @@ -0,0 +1,34 @@ +package ink.wgink.module.activiti.enums.oa.assignee; + +/** + * @ClassName: QuickAssigneeEnum + * @Description: 快捷代理人 + * @Author: wanggeng + * @Date: 2022/4/7 09:44 + * @Version: 1.0 + */ +public enum QuickAssigneeEnum { + STARTER("starter", "发起人"), + STARTER_SUPERIOR_POSITION("starterSuperiorPosition", "发起人上级岗位"), + PREVIOUS_STEP_ASSIGNEE_SUBORDINATE_POSITION("previousStepAssigneeSubordinatePosition", "上一步代理人下级岗位"), + PREVIOUS_STEP_ASSIGNEE_SUPERIOR_POSITION("previousStepAssigneeSuperiorPosition", "上一步代理人上级岗位"), + PREVIOUS_STEP_ASSIGNEE_SAME_DEPARTMENT("previousStepAssigneeSameDepartment", "上一步代理人同部门"), + PREVIOUS_N_STEP_ASSIGNEE_SUBORDINATE_POSITION("previousNStepAssigneeSubordinatePosition", "前N步代理人"), + PREVIOUS_N_STEP("previousNStep", "前N步"); + + private String value; + private String text; + + QuickAssigneeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } + + public String getText() { + return text == null ? "" : text.trim(); + } +} 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 c9f91ac7..0b0cc820 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,13 +1,32 @@ 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; +import ink.wgink.interfaces.position.IPositionUserBaseService; +import ink.wgink.interfaces.role.IRoleBaseService; +import ink.wgink.interfaces.role.IRoleUserBaseService; +import ink.wgink.interfaces.user.IUserBaseService; +import ink.wgink.module.activiti.enums.oa.assignee.*; +import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; import ink.wgink.module.activiti.service.activiti.IActivitiModelService; +import ink.wgink.module.activiti.service.oa.INodeAssigneeService; import ink.wgink.module.activiti.service.oa.IOaFormReportService; +import ink.wgink.pojo.dtos.department.DepartmentUserDTO; +import ink.wgink.pojo.dtos.position.PositionDTO; +import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.util.ArrayListUtil; import org.activiti.bpmn.model.UserTask; +import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.repository.ProcessDefinition; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +34,7 @@ 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; @@ -29,23 +49,64 @@ import java.util.Map; public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { private static final Logger LOG = LoggerFactory.getLogger(OaUserTaskCompleteListener.class); - @Autowired private RuntimeService runtimeService; - + @Autowired + private RepositoryService repositoryService; @Autowired private IActivitiModelService activitiModelService; @Autowired + private INodeAssigneeService nodeAssigneeService; + @Autowired private IOaFormReportService oaFormReportService; + @Autowired + private IUserBaseService userBaseService; + @Autowired + private IDepartmentBaseService departmentBaseService; + @Autowired + private IDepartmentUserBaseService departmentUserBaseService; + @Autowired + private IRoleBaseService roleBaseService; + @Autowired + private IRoleUserBaseService roleUserBaseService; + @Autowired + private IPositionBaseService positionBaseService; + @Autowired + private IPositionUserBaseService positionUserBaseService; @Override public void notify(DelegateTask delegateTask) { LOG.debug(">>>> userTask complete"); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + String processDefinitionId = delegateTask.getProcessDefinitionId(); + LOG.debug("查找流程定义"); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + String deploymentId = processDefinition.getDeploymentId(); + Map variables = delegateTask.getVariables(); - - LOG.debug("查询表单数据:variables: {}", variables); + LOG.debug("获取下一节点"); UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables); + if (nextUserTask == null) { + LOG.debug("下一个节点不存在"); + return; + } + LOG.debug("获取节点代理人配置"); + OaNodeAssigneePO oaNodeAssigneePO = nodeAssigneeService.getPOByDeploymentIdAndNodeId(deploymentId, taskDefinitionKey); + if (oaNodeAssigneePO == null) { + throw new OaNodeException("下一节点没有配置代理人信息"); + } + if (StringUtils.equals(oaNodeAssigneePO.getNodeType(), NodeTypeEnum.NORMAL.getValue())) { + LOG.debug("nodeType -> normal"); + normal(delegateTask, nextUserTask, oaNodeAssigneePO); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getNodeType(), NodeTypeEnum.MULTIPLE.getValue())) { + LOG.debug("nodeType -> multiple"); + multiple(delegateTask, nextUserTask, oaNodeAssigneePO); + return; + } + if (nextUserTask != null) { if (StringUtils.equals(nextUserTask.getName(), "任务3")) { // nextUserTask.setAssignee("${signUser}"); @@ -74,6 +135,280 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { } + /** + * @param userTask + * @param oaNodeAssigneePO + */ + private void normal(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.APPOINT.getValue())) { + LOG.debug("assigneeType -> appoint"); + appoint(delegateTask, userTask, oaNodeAssigneePO); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) { + LOG.debug("assigneeType -> auto"); + auto(delegateTask, userTask, oaNodeAssigneePO); + return; + } + } + + /** + * 设置多实例节点 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + */ + private void multiple(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + + } + + /** + * 手动指定 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + */ + private void appoint(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeCount(), AssigneeCountEnum.SINGLE.getValue())) { + LOG.debug("assigneeCount -> single"); + String assignee = oaNodeAssigneePO.getAssignee(); + if (StringUtils.isBlank(assignee)) { + throw new SearchException("下节点代理人未设置"); + } + UserDTO userDTO = userBaseService.get(assignee); + if (userDTO == null) { + throw new SearchException("下节点代理人不存在"); + } + LOG.debug("设置代理人"); + userTask.setAssignee(userDTO.getUserId()); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getAssigneeCount(), AssigneeCountEnum.CANDIDATE.getValue())) { + LOG.debug("assigneeCount -> candidate"); + String candidates = oaNodeAssigneePO.getCandidates(); + if (StringUtils.isBlank(candidates)) { + throw new SearchException("下节点候选人未设置"); + } + List userDTOs = userBaseService.listByUserIds(Arrays.asList(candidates.split(","))); + if (userDTOs.isEmpty()) { + throw new SearchException("下节点候选人不存在"); + } + LOG.debug("设置候选人"); + userTask.setCandidateUsers(ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class)); + return; + } + } + + /** + * 自动获取 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + */ + private void auto(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + if (StringUtils.equals(oaNodeAssigneePO.getAutoAssignType(), AutoAssignTypeEnum.SCOPE.getValue())) { + LOG.debug("autoAssigneeType -> scope"); + departmentType(delegateTask, userTask, oaNodeAssigneePO); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getAutoAssignType(), AutoAssignTypeEnum.QUICK.getValue())) { + LOG.debug("autoAssigneeType -> quick"); + quickAssignee(delegateTask, userTask, oaNodeAssigneePO); + return; + } + } + + /** + * 快捷指定 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + */ + private void quickAssignee(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + String quickAssignee = oaNodeAssigneePO.getQuickAssignee(); + if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.STARTER.getValue())) { + LOG.debug("quickAssignee -> starter:发起人"); + HistoricTaskInstance startTask = activitiModelService.getStartTask(delegateTask.getProcessInstanceId()); + userTask.setAssignee(startTask.getAssignee()); + 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); + return; + } + if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUBORDINATE_POSITION.getValue())) { + LOG.debug("quickAssignee -> previousStepAssigneeSubordinatePosition:上一步代理人下级岗位"); + return; + } + if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUPERIOR_POSITION.getValue())) { + LOG.debug("quickAssignee -> previousStepAssigneeSuperiorPosition:上一步代理人上级岗位"); + return; + } + if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_STEP_ASSIGNEE_SUPERIOR_POSITION.getValue())) { + LOG.debug("quickAssignee -> previousStepAssigneeSameDepartment:上一步代理人同部门"); + return; + } + if (StringUtils.equals(quickAssignee, QuickAssigneeEnum.PREVIOUS_N_STEP_ASSIGNEE_SUBORDINATE_POSITION.getValue())) { + LOG.debug("quickAssignee -> previousNStepAssigneeSubordinatePosition:前N步代理人"); + Integer previousNStep = oaNodeAssigneePO.getPreviousNStep(); + return; + } + } + + /** + * 部门类型 + * + * @param delegateTask + * @param userTask + * @param oaNodeAssigneePO + */ + private void departmentType(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + 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("下节点没有设置部门、角色、职位"); + } + if (!StringUtils.isBlank(departmentIds)) { + LOG.debug("查询部门用户"); + List departmentUserIds = departmentUserBaseService.listUserId(Arrays.asList(departmentIds.split(","))); + setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds); + return; + } + if (!StringUtils.isBlank(roleIds)) { + LOG.debug("查询角色用户"); + List roleUserIds = roleUserBaseService.listUserId(Arrays.asList(roleIds.split(","))); + setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds); + return; + } + LOG.debug("查询职位用户"); + List positionUserIds = positionUserBaseService.listUserId(Arrays.asList(positionIds.split(","))); + setPositionCandidateUser(delegateTask, userTask, positionUserIds); + return; + } + if (StringUtils.equals(oaNodeAssigneePO.getDepartmentType(), DepartmentTypeEnum.BELONG.getValue())) { + LOG.debug("departmentType -> belong"); + String roleIds = oaNodeAssigneePO.getRoles(); + String positionIds = oaNodeAssigneePO.getPositions(); + List departmentUserDTOs = departmentUserBaseService.listByUserIds(Arrays.asList(delegateTask.getAssignee())); + List departmentIds = ArrayListUtil.listBeanStringIdValue(departmentUserDTOs, "departmentId", DepartmentUserDTO.class); + if (departmentIds.isEmpty()) { + throw new OaNodeException("代理人不存在部门"); + } + List departmentUserIds = departmentUserBaseService.listUserId(departmentIds); + setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds); + } + } + + /** + * 设置部门候选用户 + * + * @param delegateTask + * @param userTask + * @param departmentUserIds + * @param roleIds + * @param positionIds + */ + private void setDepartmentCandidateUser(DelegateTask delegateTask, UserTask userTask, List departmentUserIds, String roleIds, String positionIds) { + if (!StringUtils.isBlank(roleIds)) { + LOG.debug("查询角色用户"); + List roleUserIds = roleUserBaseService.listUserIdByRoleIdsAndUserIds(Arrays.asList(roleIds.split(",")), departmentUserIds); + setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds); + return; + } + setCandidateUsers(delegateTask, userTask, departmentUserIds); + } + + /** + * 设置角色候选用户 + * + * @param delegateTask + * @param userTask + * @param roleUserIds + * @param positionIds + */ + private void setRoleCandidateUser(DelegateTask delegateTask, UserTask userTask, List roleUserIds, String positionIds) { + if (!StringUtils.isBlank(positionIds)) { + LOG.debug("查询职位用户"); + List positionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(Arrays.asList(positionIds.split(",")), roleUserIds); + setPositionCandidateUser(delegateTask, userTask, positionUserIds); + return; + } + setCandidateUsers(delegateTask, userTask, roleUserIds); + } + + /** + * 设置职位候选用户 + * + * @param delegateTask + * @param userTask + * @param positionUserIds + */ + private void setPositionCandidateUser(DelegateTask delegateTask, UserTask userTask, List positionUserIds) { + setCandidateUsers(delegateTask, userTask, positionUserIds); + } + + /** + * 设置候选人用户 + * + * @param delegateTask + * @param userTask + * @param userIds + */ + private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List userIds) { + List userDTOs = userBaseService.listByUserIds(userIds); + if (userDTOs.isEmpty()) { + throw new SearchException("下节点候选人不存在"); + } + LOG.debug("设置候选人"); + List existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class); + clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee()); + userTask.setCandidateUsers(existUserIds); + } + + /** + * 清除用户列表中当前任务代理人 + * + * @param userIds + * @param assignee + */ + private void clearUserIdsCurrentTaskAssignee(List userIds, String assignee) { + for (String userId : userIds) { + if (StringUtils.equals(userId, assignee)) { + userIds.remove(userId); + break; + } + } + } + + private void assigneeCount(UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) { + + } // 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量 diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/pos/oa/OaNodeAssigneePO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/pos/oa/OaNodeAssigneePO.java new file mode 100644 index 00000000..0cfaf5ab --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/pos/oa/OaNodeAssigneePO.java @@ -0,0 +1,273 @@ +package ink.wgink.module.activiti.pojo.pos.oa; + +/** + * @ClassName: OaNodeAssigneePO + * @Description: 节点代理人 + * @Author: wanggeng + * @Date: 2022/4/7 11:32 + * @Version: 1.0 + */ +public class OaNodeAssigneePO { + + private Long id; + private String nodeAssigneeId; + private String modelId; + private String modelVersion; + private String deploymentId; + private String nodeId; + private Integer nodeIndex; + private String nodeType; + private String assigneeCount; + private String assignee; + private String assigneeName; + private String candidates; + private String candidateNames; + private String multipleType; + private String completeCondition; + private Integer completeCount; + private String multipleAssignees; + private String multipleAssigneeNames; + private String assigneeType; + private String autoAssignType; + private String departmentType; + private String departments; + private String departmentNames; + private String roles; + private String roleNames; + private String positions; + private String positionNames; + private String quickAssignee; + private Integer previousNStep; + + public Long getId() { + return id == null ? 0 : id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNodeAssigneeId() { + return nodeAssigneeId == null ? "" : nodeAssigneeId.trim(); + } + + public void setNodeAssigneeId(String nodeAssigneeId) { + this.nodeAssigneeId = nodeAssigneeId; + } + + public String getModelId() { + return modelId == null ? "" : modelId.trim(); + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelVersion() { + return modelVersion == null ? "" : modelVersion.trim(); + } + + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + + public String getDeploymentId() { + return deploymentId == null ? "" : deploymentId.trim(); + } + + public void setDeploymentId(String deploymentId) { + this.deploymentId = deploymentId; + } + + public String getNodeId() { + return nodeId == null ? "" : nodeId.trim(); + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public Integer getNodeIndex() { + return nodeIndex == null ? 0 : nodeIndex; + } + + public void setNodeIndex(Integer nodeIndex) { + this.nodeIndex = nodeIndex; + } + + public String getNodeType() { + return nodeType == null ? "" : nodeType.trim(); + } + + public void setNodeType(String nodeType) { + this.nodeType = nodeType; + } + + public String getAssigneeCount() { + return assigneeCount == null ? "" : assigneeCount.trim(); + } + + public void setAssigneeCount(String assigneeCount) { + this.assigneeCount = assigneeCount; + } + + public String getAssignee() { + return assignee == null ? "" : assignee.trim(); + } + + public void setAssignee(String assignee) { + this.assignee = assignee; + } + + public String getAssigneeName() { + return assigneeName == null ? "" : assigneeName.trim(); + } + + public void setAssigneeName(String assigneeName) { + this.assigneeName = assigneeName; + } + + public String getCandidates() { + return candidates == null ? "" : candidates.trim(); + } + + public void setCandidates(String candidates) { + this.candidates = candidates; + } + + public String getCandidateNames() { + return candidateNames == null ? "" : candidateNames.trim(); + } + + public void setCandidateNames(String candidateNames) { + this.candidateNames = candidateNames; + } + + public String getMultipleType() { + return multipleType == null ? "" : multipleType.trim(); + } + + public void setMultipleType(String multipleType) { + this.multipleType = multipleType; + } + + public String getCompleteCondition() { + return completeCondition == null ? "" : completeCondition.trim(); + } + + public void setCompleteCondition(String completeCondition) { + this.completeCondition = completeCondition; + } + + public Integer getCompleteCount() { + return completeCount == null ? 0 : completeCount; + } + + public void setCompleteCount(Integer completeCount) { + this.completeCount = completeCount; + } + + public String getMultipleAssignees() { + return multipleAssignees == null ? "" : multipleAssignees.trim(); + } + + public void setMultipleAssignees(String multipleAssignees) { + this.multipleAssignees = multipleAssignees; + } + + public String getMultipleAssigneeNames() { + return multipleAssigneeNames == null ? "" : multipleAssigneeNames.trim(); + } + + public void setMultipleAssigneeNames(String multipleAssigneeNames) { + this.multipleAssigneeNames = multipleAssigneeNames; + } + + public String getAssigneeType() { + return assigneeType == null ? "" : assigneeType.trim(); + } + + public void setAssigneeType(String assigneeType) { + this.assigneeType = assigneeType; + } + + public String getAutoAssignType() { + return autoAssignType == null ? "" : autoAssignType.trim(); + } + + public void setAutoAssignType(String autoAssignType) { + this.autoAssignType = autoAssignType; + } + + public String getDepartmentType() { + return departmentType == null ? "" : departmentType.trim(); + } + + public void setDepartmentType(String departmentType) { + this.departmentType = departmentType; + } + + public String getDepartments() { + return departments == null ? "" : departments.trim(); + } + + public void setDepartments(String departments) { + this.departments = departments; + } + + public String getDepartmentNames() { + return departmentNames == null ? "" : departmentNames.trim(); + } + + public void setDepartmentNames(String departmentNames) { + this.departmentNames = departmentNames; + } + + public String getRoles() { + return roles == null ? "" : roles.trim(); + } + + public void setRoles(String roles) { + this.roles = roles; + } + + public String getRoleNames() { + return roleNames == null ? "" : roleNames.trim(); + } + + public void setRoleNames(String roleNames) { + this.roleNames = roleNames; + } + + public String getPositions() { + return positions == null ? "" : positions.trim(); + } + + public void setPositions(String positions) { + this.positions = positions; + } + + public String getPositionNames() { + return positionNames == null ? "" : positionNames.trim(); + } + + public void setPositionNames(String positionNames) { + this.positionNames = positionNames; + } + + public String getQuickAssignee() { + return quickAssignee == null ? "" : quickAssignee.trim(); + } + + public void setQuickAssignee(String quickAssignee) { + this.quickAssignee = quickAssignee; + } + + public Integer getPreviousNStep() { + return previousNStep == null ? 0 : previousNStep; + } + + public void setPreviousNStep(Integer previousNStep) { + this.previousNStep = previousNStep; + } +} 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 9abcd5d0..d0516c94 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO; import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO; import org.activiti.bpmn.model.*; +import org.activiti.engine.history.HistoricTaskInstance; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -33,6 +34,28 @@ public interface IActivitiModelService { */ String PARALLEL_GATEWAY_CONDITION_KEY = "par"; + /** + * 候选人集合 + */ + String CANDIDATES_COLLECTION = "${candidates}"; + /** + * 多实例集合 + */ + String MULTI_INSTANCE_COLLECTION = "${assigneeList}"; + /** + * 多实例变量 + */ + String MULTI_INSTANCE_VARIABLE = "assignee"; + + /** + * 完成的实例 + */ + String NR_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances"; + /** + * 实例数量 + */ + String NR_OF_INSTANCES = "nrOfInstances"; + /** * 保存模型 * @@ -93,6 +116,23 @@ public interface IActivitiModelService { */ UserTask getNextUserTask(String currentTaskDefinitionKey, String processDefinitionId, Map reportForm); + /** + * 获取前几步的任务实例 + * + * @param processInstanceId 流程实例ID + * @param prevStep 前几步 + * @return + */ + HistoricTaskInstance getPrevTask(String processInstanceId, int prevStep); + + /** + * 获取开始任务实例 + * + * @param processInstanceId + * @return + */ + HistoricTaskInstance getStartTask(String processInstanceId); + /** * 获得开始节点 * diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java index 3e7e43e5..96fb1fa8 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java @@ -3,6 +3,7 @@ package ink.wgink.module.activiti.service.activiti.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.exceptions.OaNodeException; import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.base.SystemException; @@ -20,6 +21,7 @@ import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; @@ -129,11 +131,11 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct public UserTask getNextUserTask(UserTask currentUserTask) { List outgoingFlows = currentUserTask.getOutgoingFlows(); if (outgoingFlows.size() > 1 || outgoingFlows.size() == 0) { - throw new SystemException("流程错误,下个用户任务节点数只能有1个"); + throw new OaNodeException("流程错误,下个用户任务节点数只能有1个"); } FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); if (!(targetFlowElement instanceof UserTask)) { - throw new SystemException("下个节点不是用户任务"); + throw new OaNodeException("下个节点不是用户任务"); } return (UserTask) targetFlowElement; } @@ -151,7 +153,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct return getNextUserTask(exclusiveGateway, reportForm); } } - throw new SystemException("未找到下一节点用户任务"); + throw new OaNodeException("未找到下一节点用户任务"); } @Override @@ -170,7 +172,28 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct return null; } } - throw new SystemException("未找到下一节点用户任务"); + throw new OaNodeException("未找到下一节点用户任务"); + } + + @Override + public HistoricTaskInstance getPrevTask(String processInstanceId, int prevStep) { + List historicTaskInstances = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list(); + if (historicTaskInstances == null || historicTaskInstances.isEmpty()) { + throw new OaNodeException("没有历史任务"); + } + if (prevStep > historicTaskInstances.size()) { + throw new OaNodeException("历史任务数量小于查询步数"); + } + return historicTaskInstances.get(historicTaskInstances.size() - prevStep); + } + + @Override + public HistoricTaskInstance getStartTask(String processInstanceId) { + List historicTaskInstances = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list(); + if (historicTaskInstances == null || historicTaskInstances.isEmpty()) { + throw new OaNodeException("没有历史任务"); + } + return historicTaskInstances.get(0); } @Override diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java index 01e4fcc1..8539ee6b 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java @@ -1,7 +1,11 @@ package ink.wgink.module.activiti.service.oa; +import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; +import java.util.List; +import java.util.Map; + /** * @ClassName: INodeAssigneeService * @Description: 节点代理人 @@ -56,4 +60,65 @@ public interface INodeAssigneeService { * @param modelVersion 模型版本 */ void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion); + + /** + * 节点代理人列表 + * + * @param params + * @return + */ + List listPO(Map params); + + /** + * 节点代理人列表 + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @return + */ + List listPOByModelIdAndModelVersion(String modelId, Integer modelVersion); + + /** + * 节点代理人列表 + * + * @param deploymentId 部署ID + * @return + */ + List listPOByDeploymentId(String deploymentId); + + /** + * 节点代理人详情 + * + * @param params + * @return + */ + OaNodeAssigneePO getPO(Map params); + + /** + * 节点代理人详情 + * + * @param nodeAssigneeId 主键 + * @return + */ + OaNodeAssigneePO getPO(String nodeAssigneeId); + + /** + * 节点代理人详情 + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @param nodeId 节点ID + * @return + */ + OaNodeAssigneePO getPOByModelIdAndModelVersionAndNodeId(String modelId, Integer modelVersion, String nodeId); + + /** + * 节点代理人详情 + * + * @param deploymentId 部署ID + * @param nodeId 节点ID + * @return + */ + OaNodeAssigneePO getPOByDeploymentIdAndNodeId(String deploymentId, String nodeId); + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java index 347002b5..0051a81e 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java @@ -2,6 +2,7 @@ package ink.wgink.module.activiti.service.oa.impl; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.module.activiti.dao.oa.INodeAssigneeDao; +import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; import ink.wgink.module.activiti.service.oa.INodeAssigneeService; import ink.wgink.util.UUIDUtil; @@ -9,6 +10,7 @@ import ink.wgink.util.map.HashMapUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Map; /** @@ -64,6 +66,57 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode nodeAssigneeDao.delete(params); } + @Override + public List listPO(Map params) { + params = params == null ? getHashMap(0) : params; + return nodeAssigneeDao.listPO(params); + } + + @Override + public List listPOByModelIdAndModelVersion(String modelId, Integer modelVersion) { + Map params = getHashMap(4); + params.put("modelId", modelId); + params.put("modelVersion", modelId); + return listPO(params); + } + + @Override + public List listPOByDeploymentId(String deploymentId) { + Map params = getHashMap(2); + params.put("deploymentId", deploymentId); + return listPO(params); + } + + @Override + public OaNodeAssigneePO getPO(Map params) { + params = params == null ? getHashMap(0) : params; + return nodeAssigneeDao.getPO(params); + } + + @Override + public OaNodeAssigneePO getPO(String nodeAssigneeId) { + Map params = getHashMap(2); + params.put("nodeAssigneeId", nodeAssigneeId); + return getPO(params); + } + + @Override + public OaNodeAssigneePO getPOByModelIdAndModelVersionAndNodeId(String modelId, Integer modelVersion, String nodeId) { + Map params = getHashMap(6); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); + return getPO(params); + } + + @Override + public OaNodeAssigneePO getPOByDeploymentIdAndNodeId(String deploymentId, String nodeId) { + Map params = getHashMap(4); + params.put("deploymentId", deploymentId); + params.put("nodeId", nodeId); + return getPO(params); + } + /** * 删除 * 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 632112f1..de807e09 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 @@ -2,6 +2,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CREATE TABLE IF NOT EXISTS `oa_node_assignee` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, @@ -134,4 +166,110 @@ deployment_id = #{_parameter} + + + + + + \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js index e4fa8bc8..98867de4 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js @@ -27,6 +27,12 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t // 初始化 var startNode; + var CANDIDATES_COLLECTION = '${candidates}'; + var MULTI_INSTANCE_COLLECTION = '${assigneeList}'; + var MULTI_INSTANCE_VARIABLE = 'assignee'; + var NR_OF_COMPLETED_INSTANCES = 'nrOfCompletedInstances'; + var NR_OF_INSTANCES = 'nrOfInstances'; + $scope.oaNodeManage = { assignee: { nodeType: 'normal', @@ -146,24 +152,24 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t $scope.oaNodeManage.oaUserTaskListeners.splice(index, 1); } - $scope.checkCompleteCount = function() { + $scope.checkCompleteCount = function () { var assignee = $scope.oaNodeManage.assignee; - if(!assignee.completeCount) { + if (!assignee.completeCount) { assignee.completeCount = 1; return; } - if(assignee.completeCount < 1) { + if (assignee.completeCount < 1) { assignee.completeCount = 1; } } - $scope.checkPreviousNStep = function() { + $scope.checkPreviousNStep = function () { var assignee = $scope.oaNodeManage.assignee; - if(!assignee.previousNStep) { + if (!assignee.previousNStep) { assignee.previousNStep = 1; return; } - if(assignee.previousNStep < 1) { + if (assignee.previousNStep < 1) { assignee.previousNStep = 1; } } @@ -401,7 +407,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t function updateCandidates() { assigneeProperty.value = {}; assigneeProperty.value.assignment = { - candidateUsers: [{value: '${candidates}'}] + candidateUsers: [{value: CANDIDATES_COLLECTION}] }; } @@ -420,17 +426,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t */ function updateParallel() { multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType; - multiInstanceCollection.value = '${multipleAssignees}'; - multiInstanceVariable.value = 'multipleAssignees'; + multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION; + multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE; if (assignee.completeCondition === 'allPass') { // 全部通过 - multiInstanceCondition.value = '${nrOfCompletedInstances == nrOfInstances}' + multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' == '+ NR_OF_INSTANCES +'}' } else if (assignee.completeCondition === 'singlePass') { // 单人通过 - multiInstanceCondition.value = '${nrOfCompletedInstances == 1}' + multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= 1}' } else if (assignee.completeCondition === 'customPass') { // 通过多少人 - multiInstanceCondition.value = '${nrOfCompletedInstances == '+ assignee.completeCount +'}' + multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= ' + assignee.completeCount + '}' } else { top.dialog.msg('多实例(完成)通过条件错误'); return; @@ -443,8 +449,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t */ function updateSequential() { multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType; - multiInstanceCollection.value = '${assigneeList}'; - multiInstanceVariable.value = 'assignee'; + multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION; + multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE; multiInstanceCondition.value = ''; updateMultipleInstance(); } @@ -504,7 +510,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t updateParallel(); return; } - if(assignee.multipleType === 'sequential') { + if (assignee.multipleType === 'sequential') { updateSequential(); return; } @@ -525,56 +531,56 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t $scope.save = function () { var assignee = $scope.oaNodeManage.assignee; // 验证输入内容是否设置 - if(assignee.nodeType === 'normal') { - if(assignee.assigneeType === 'appoint') { - if(assignee.assigneeCount === 'single') { - if(!assignee.assignee) { + if (assignee.nodeType === 'normal') { + if (assignee.assigneeType === 'appoint') { + if (assignee.assigneeCount === 'single') { + if (!assignee.assignee) { top.dialog.msg('请选择代理人'); return; } } - if(assignee.assigneeCount === 'candidate') { - if(!assignee.candidates) { + if (assignee.assigneeCount === 'candidate') { + if (!assignee.candidates) { top.dialog.msg('请选择候选人'); return; } } } } - if(assignee.nodeType === 'multiple') { - if(assignee.multipleType === 'parallel') { - if(assignee.completeCondition === 'customPass') { - if(!assignee.completeCount) { + if (assignee.nodeType === 'multiple') { + if (assignee.multipleType === 'parallel') { + if (assignee.completeCondition === 'customPass') { + if (!assignee.completeCount) { top.dialog.msg('请输入完成条件中的通过人数'); return; } } } - if(assignee.assigneeType === 'appoint') { - if(!assignee.multipleAssignees) { + if (assignee.assigneeType === 'appoint') { + if (!assignee.multipleAssignees) { top.dialog.msg('请选择(多实例)代理人'); return; } } } - if(assignee.autoAssignType === 'scope') { - if(assignee.departmentType === 'appoint') { - if(!assignee.departments && !assignee.roles && !assignee.positions) { + if (assignee.autoAssignType === 'scope') { + if (assignee.departmentType === 'appoint') { + if (!assignee.departments && !assignee.roles && !assignee.positions) { top.dialog.msg('请选择部门、角色、职位中的至少一个类型'); return; } } - if(assignee.departmentType === 'belong') { - if(!assignee.roles && !assignee.positions) { + if (assignee.departmentType === 'belong') { + if (!assignee.roles && !assignee.positions) { top.dialog.msg('请选择角色、职位中的至少一个类型'); return; } } } - if(assignee.assigneeType === 'auto') { - if(assignee.autoAssignType === 'quick') { - if(assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') { - if(!assignee.previousNStep) { + if (assignee.assigneeType === 'auto') { + if (assignee.autoAssignType === 'quick') { + if (assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') { + if (!assignee.previousNStep) { top.dialog.msg('请确认获取前哪一步的代理人'); return; } diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html index 29c72a3d..68e8e3cb 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html @@ -256,8 +256,7 @@