完善oa用户任务完成时的业务逻辑

This commit is contained in:
wanggeng 2022-04-07 23:31:09 +08:00
parent 18c46dccf1
commit 017a50762d
18 changed files with 1239 additions and 46 deletions

View File

@ -2,10 +2,13 @@ package ink.wgink.module.activiti.dao.oa;
import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.RemoveException;
import ink.wgink.exceptions.SaveException; import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.exceptions.UpdateException; import ink.wgink.exceptions.UpdateException;
import ink.wgink.interfaces.init.IInitBaseTable; import ink.wgink.interfaces.init.IInitBaseTable;
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -49,4 +52,23 @@ public interface INodeAssigneeDao extends IInitBaseTable {
* @throws UpdateException * @throws UpdateException
*/ */
void deleteDeploymentId(String deploymentId) throws UpdateException; void deleteDeploymentId(String deploymentId) throws UpdateException;
/**
* 详情
*
* @param params
* @return
* @throws SearchException
*/
OaNodeAssigneePO getPO(Map<String, Object> params) throws SearchException;
/**
* 列表
*
* @param params
* @return
* @throws SearchException
*/
List<OaNodeAssigneePO> listPO(Map<String, Object> params) throws SearchException;
} }

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -1,13 +1,32 @@
package ink.wgink.module.activiti.listener.task; 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.activiti.IActivitiModelService;
import ink.wgink.module.activiti.service.oa.INodeAssigneeService;
import ink.wgink.module.activiti.service.oa.IOaFormReportService; 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.bpmn.model.UserTask;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService; import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.delegate.JavaDelegate;
import org.activiti.engine.delegate.TaskListener; 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.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -15,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -29,23 +49,64 @@ import java.util.Map;
public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate { public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
private static final Logger LOG = LoggerFactory.getLogger(OaUserTaskCompleteListener.class); private static final Logger LOG = LoggerFactory.getLogger(OaUserTaskCompleteListener.class);
@Autowired @Autowired
private RuntimeService runtimeService; private RuntimeService runtimeService;
@Autowired
private RepositoryService repositoryService;
@Autowired @Autowired
private IActivitiModelService activitiModelService; private IActivitiModelService activitiModelService;
@Autowired @Autowired
private INodeAssigneeService nodeAssigneeService;
@Autowired
private IOaFormReportService oaFormReportService; 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 @Override
public void notify(DelegateTask delegateTask) { public void notify(DelegateTask delegateTask) {
LOG.debug(">>>> userTask complete"); LOG.debug(">>>> userTask complete");
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String processDefinitionId = delegateTask.getProcessDefinitionId();
LOG.debug("查找流程定义");
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
String deploymentId = processDefinition.getDeploymentId();
Map<String, Object> variables = delegateTask.getVariables(); Map<String, Object> variables = delegateTask.getVariables();
LOG.debug("查询表单数据variables: {}", variables); LOG.debug("查询表单数据variables: {}", variables);
LOG.debug("获取下一节点");
UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables); 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 (nextUserTask != null) {
if (StringUtils.equals(nextUserTask.getName(), "任务3")) { if (StringUtils.equals(nextUserTask.getName(), "任务3")) {
// nextUserTask.setAssignee("${signUser}"); // 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<UserDTO> 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<String> positionIds = positionUserBaseService.listPositionIdByUserId(starterUserId);
List<PositionDTO> parentPositionDTOs = positionBaseService.listParentByPositionIds(positionIds);
if (parentPositionDTOs.isEmpty()) {
throw new OaNodeException("发起人不存在上级岗位");
}
List<String> parentPositionIds = ArrayListUtil.listBeanStringIdValue(parentPositionDTOs, "positionId", PositionDTO.class);
LOG.debug("查询发起人上级岗位用户ID列表");
List<String> parentPositionUserIds = positionUserBaseService.listUserId(parentPositionIds);
LOG.debug("查询发起人上级岗位用户列表");
List<UserDTO> parentPositionUserDTOs = userBaseService.listByUserIds(parentPositionUserIds);
if (parentPositionUserDTOs.isEmpty()) {
throw new OaNodeException("发起人上级岗位没有用户");
}
// 上级岗位可以有自己
List<String> 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<String> departmentUserIds = departmentUserBaseService.listUserId(Arrays.asList(departmentIds.split(",")));
setDepartmentCandidateUser(delegateTask, userTask, departmentUserIds, roleIds, positionIds);
return;
}
if (!StringUtils.isBlank(roleIds)) {
LOG.debug("查询角色用户");
List<String> roleUserIds = roleUserBaseService.listUserId(Arrays.asList(roleIds.split(",")));
setRoleCandidateUser(delegateTask, userTask, roleUserIds, positionIds);
return;
}
LOG.debug("查询职位用户");
List<String> 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<DepartmentUserDTO> departmentUserDTOs = departmentUserBaseService.listByUserIds(Arrays.asList(delegateTask.getAssignee()));
List<String> departmentIds = ArrayListUtil.listBeanStringIdValue(departmentUserDTOs, "departmentId", DepartmentUserDTO.class);
if (departmentIds.isEmpty()) {
throw new OaNodeException("代理人不存在部门");
}
List<String> 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<String> departmentUserIds, String roleIds, String positionIds) {
if (!StringUtils.isBlank(roleIds)) {
LOG.debug("查询角色用户");
List<String> 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<String> roleUserIds, String positionIds) {
if (!StringUtils.isBlank(positionIds)) {
LOG.debug("查询职位用户");
List<String> 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<String> positionUserIds) {
setCandidateUsers(delegateTask, userTask, positionUserIds);
}
/**
* 设置候选人用户
*
* @param delegateTask
* @param userTask
* @param userIds
*/
private void setCandidateUsers(DelegateTask delegateTask, UserTask userTask, List<String> userIds) {
List<UserDTO> userDTOs = userBaseService.listByUserIds(userIds);
if (userDTOs.isEmpty()) {
throw new SearchException("下节点候选人不存在");
}
LOG.debug("设置候选人");
List<String> existUserIds = ArrayListUtil.listBeanStringIdValue(userDTOs, "userId", UserDTO.class);
clearUserIdsCurrentTaskAssignee(existUserIds, delegateTask.getAssignee());
userTask.setCandidateUsers(existUserIds);
}
/**
* 清除用户列表中当前任务代理人
*
* @param userIds
* @param assignee
*/
private void clearUserIdsCurrentTaskAssignee(List<String> userIds, String assignee) {
for (String userId : userIds) {
if (StringUtils.equals(userId, assignee)) {
userIds.remove(userId);
break;
}
}
}
private void assigneeCount(UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) {
}
// 1nrOfInstances 该会签环节中总共有多少个实例 2nrOfActiveInstances 当前活动的实例的数量即还没有 完成的实例数量 3nrOfCompletedInstances 已经完成的实例的数量 // 1nrOfInstances 该会签环节中总共有多少个实例 2nrOfActiveInstances 当前活动的实例的数量即还没有 完成的实例数量 3nrOfCompletedInstances 已经完成的实例的数量

View File

@ -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;
}
}

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO; import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO;
import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO; import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO;
import org.activiti.bpmn.model.*; import org.activiti.bpmn.model.*;
import org.activiti.engine.history.HistoricTaskInstance;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -33,6 +34,28 @@ public interface IActivitiModelService {
*/ */
String PARALLEL_GATEWAY_CONDITION_KEY = "par"; 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<String, Object> reportForm); UserTask getNextUserTask(String currentTaskDefinitionKey, String processDefinitionId, Map<String, Object> reportForm);
/**
* 获取前几步的任务实例
*
* @param processInstanceId 流程实例ID
* @param prevStep 前几步
* @return
*/
HistoricTaskInstance getPrevTask(String processInstanceId, int prevStep);
/**
* 获取开始任务实例
*
* @param processInstanceId
* @return
*/
HistoricTaskInstance getStartTask(String processInstanceId);
/** /**
* 获得开始节点 * 获得开始节点
* *

View File

@ -3,6 +3,7 @@ package ink.wgink.module.activiti.service.activiti.impl;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.OaNodeException;
import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.RemoveException;
import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.SearchException;
import ink.wgink.exceptions.base.SystemException; import ink.wgink.exceptions.base.SystemException;
@ -20,6 +21,7 @@ import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService; import org.activiti.engine.RuntimeService;
import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Model; import org.activiti.engine.repository.Model;
import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstance;
@ -129,11 +131,11 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
public UserTask getNextUserTask(UserTask currentUserTask) { public UserTask getNextUserTask(UserTask currentUserTask) {
List<SequenceFlow> outgoingFlows = currentUserTask.getOutgoingFlows(); List<SequenceFlow> outgoingFlows = currentUserTask.getOutgoingFlows();
if (outgoingFlows.size() > 1 || outgoingFlows.size() == 0) { if (outgoingFlows.size() > 1 || outgoingFlows.size() == 0) {
throw new SystemException("流程错误下个用户任务节点数只能有1个"); throw new OaNodeException("流程错误下个用户任务节点数只能有1个");
} }
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
if (!(targetFlowElement instanceof UserTask)) { if (!(targetFlowElement instanceof UserTask)) {
throw new SystemException("下个节点不是用户任务"); throw new OaNodeException("下个节点不是用户任务");
} }
return (UserTask) targetFlowElement; return (UserTask) targetFlowElement;
} }
@ -151,7 +153,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
return getNextUserTask(exclusiveGateway, reportForm); return getNextUserTask(exclusiveGateway, reportForm);
} }
} }
throw new SystemException("未找到下一节点用户任务"); throw new OaNodeException("未找到下一节点用户任务");
} }
@Override @Override
@ -170,7 +172,28 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
return null; return null;
} }
} }
throw new SystemException("未找到下一节点用户任务"); throw new OaNodeException("未找到下一节点用户任务");
}
@Override
public HistoricTaskInstance getPrevTask(String processInstanceId, int prevStep) {
List<HistoricTaskInstance> 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<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list();
if (historicTaskInstances == null || historicTaskInstances.isEmpty()) {
throw new OaNodeException("没有历史任务");
}
return historicTaskInstances.get(0);
} }
@Override @Override

View File

@ -1,7 +1,11 @@
package ink.wgink.module.activiti.service.oa; 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 ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO;
import java.util.List;
import java.util.Map;
/** /**
* @ClassName: INodeAssigneeService * @ClassName: INodeAssigneeService
* @Description: 节点代理人 * @Description: 节点代理人
@ -56,4 +60,65 @@ public interface INodeAssigneeService {
* @param modelVersion 模型版本 * @param modelVersion 模型版本
*/ */
void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion); void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion);
/**
* 节点代理人列表
*
* @param params
* @return
*/
List<OaNodeAssigneePO> listPO(Map<String, Object> params);
/**
* 节点代理人列表
*
* @param modelId 模型ID
* @param modelVersion 模型版本
* @return
*/
List<OaNodeAssigneePO> listPOByModelIdAndModelVersion(String modelId, Integer modelVersion);
/**
* 节点代理人列表
*
* @param deploymentId 部署ID
* @return
*/
List<OaNodeAssigneePO> listPOByDeploymentId(String deploymentId);
/**
* 节点代理人详情
*
* @param params
* @return
*/
OaNodeAssigneePO getPO(Map<String, Object> 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);
} }

View File

@ -2,6 +2,7 @@ package ink.wgink.module.activiti.service.oa.impl;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.module.activiti.dao.oa.INodeAssigneeDao; 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.pojo.vos.oa.nodemanage.config.AssigneeVO;
import ink.wgink.module.activiti.service.oa.INodeAssigneeService; import ink.wgink.module.activiti.service.oa.INodeAssigneeService;
import ink.wgink.util.UUIDUtil; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -64,6 +66,57 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode
nodeAssigneeDao.delete(params); nodeAssigneeDao.delete(params);
} }
@Override
public List<OaNodeAssigneePO> listPO(Map<String, Object> params) {
params = params == null ? getHashMap(0) : params;
return nodeAssigneeDao.listPO(params);
}
@Override
public List<OaNodeAssigneePO> listPOByModelIdAndModelVersion(String modelId, Integer modelVersion) {
Map<String, Object> params = getHashMap(4);
params.put("modelId", modelId);
params.put("modelVersion", modelId);
return listPO(params);
}
@Override
public List<OaNodeAssigneePO> listPOByDeploymentId(String deploymentId) {
Map<String, Object> params = getHashMap(2);
params.put("deploymentId", deploymentId);
return listPO(params);
}
@Override
public OaNodeAssigneePO getPO(Map<String, Object> params) {
params = params == null ? getHashMap(0) : params;
return nodeAssigneeDao.getPO(params);
}
@Override
public OaNodeAssigneePO getPO(String nodeAssigneeId) {
Map<String, Object> params = getHashMap(2);
params.put("nodeAssigneeId", nodeAssigneeId);
return getPO(params);
}
@Override
public OaNodeAssigneePO getPOByModelIdAndModelVersionAndNodeId(String modelId, Integer modelVersion, String nodeId) {
Map<String, Object> 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<String, Object> params = getHashMap(4);
params.put("deploymentId", deploymentId);
params.put("nodeId", nodeId);
return getPO(params);
}
/** /**
* 删除 * 删除
* *

View File

@ -2,6 +2,38 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ink.wgink.module.activiti.dao.oa.INodeAssigneeDao"> <mapper namespace="ink.wgink.module.activiti.dao.oa.INodeAssigneeDao">
<resultMap id="oaNodeAssigneePO" type="ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO">
<id column="id" property="id"/>
<result column="node_assignee_id" property="nodeAssigneeId"/>
<result column="model_id" property="modelId"/>
<result column="model_version" property="modelVersion"/>
<result column="deployment_id" property="deploymentId"/>
<result column="node_id" property="nodeId"/>
<result column="node_index" property="nodeIndex"/>
<result column="node_type" property="nodeType"/>
<result column="assignee_count" property="assigneeCount"/>
<result column="assignee" property="assignee"/>
<result column="assignee_name" property="assigneeName"/>
<result column="candidates" property="candidates"/>
<result column="candidate_names" property="candidateNames"/>
<result column="multiple_type" property="multipleType"/>
<result column="complete_condition" property="completeCondition"/>
<result column="complete_count" property="completeCount"/>
<result column="multiple_assignees" property="multipleAssignees"/>
<result column="multiple_assignee_names" property="multipleAssigneeNames"/>
<result column="assignee_type" property="assigneeType"/>
<result column="auto_assign_type" property="autoAssignType"/>
<result column="department_type" property="departmentType"/>
<result column="departments" property="departments"/>
<result column="department_names" property="departmentNames"/>
<result column="roles" property="roles"/>
<result column="role_names" property="roleNames"/>
<result column="positions" property="positions"/>
<result column="position_names" property="positionNames"/>
<result column="quick_assignee" property="quickAssignee"/>
<result column="previous_n_step" property="previousNStep"/>
</resultMap>
<update id="createTable"> <update id="createTable">
CREATE TABLE IF NOT EXISTS `oa_node_assignee` ( CREATE TABLE IF NOT EXISTS `oa_node_assignee` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
@ -134,4 +166,110 @@
deployment_id = #{_parameter} deployment_id = #{_parameter}
</update> </update>
<!-- 详情 -->
<select id="getPO" parameterType="map" resultMap="">
SELECT
id,
node_assignee_id,
model_id,
model_version,
deployment_id,
node_id,
node_index,
node_type,
assignee_count,
assignee,
assignee_name,
candidates,
candidate_names,
multiple_type,
complete_condition,
complete_count,
multiple_assignees,
multiple_assignee_names,
assignee_type,
auto_assign_type,
department_type,
departments,
department_names,
roles,
role_names,
positions,
position_names,
quick_assignee,
previous_n_step
FROM
oa_node_assignee
<where>
<if test="nodeAssigneeId != null and nodeAssigneeId != ''">
node_assignee_id = #{nodeAssigneeId}
</if>
<if test="modelId != null and modelId != ''">
AND
model_id = #{modelId}
</if>
<if test="modelVersion != null">
AND
model_version = #{modelVersion}
</if>
<if test="deploymentId != null and deploymentId != ''">
AND
deployment_id = #{deploymentId}
</if>
<if test="nodeId != null and nodeId != ''">
AND
node_id = #{nodeId}
</if>
</where>
</select>
<!-- 列表 -->
<select id="listPO" parameterType="map" resultMap="">
SELECT
id,
node_assignee_id,
model_id,
model_version,
deployment_id,
node_id,
node_index,
node_type,
assignee_count,
assignee,
assignee_name,
candidates,
candidate_names,
multiple_type,
complete_condition,
complete_count,
multiple_assignees,
multiple_assignee_names,
assignee_type,
auto_assign_type,
department_type,
departments,
department_names,
roles,
role_names,
positions,
position_names,
quick_assignee,
previous_n_step
FROM
oa_node_assignee
<where>
<if test="modelId != null and modelId != ''">
model_id = #{modelId}
</if>
<if test="modelVersion != null">
AND
model_version = #{modelVersion}
</if>
<if test="deploymentId != null and deploymentId != ''">
AND
deployment_id = #{deploymentId}
</if>
</where>
</select>
</mapper> </mapper>

View File

@ -27,6 +27,12 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
// 初始化 // 初始化
var startNode; 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 = { $scope.oaNodeManage = {
assignee: { assignee: {
nodeType: 'normal', nodeType: 'normal',
@ -146,24 +152,24 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1); $scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
} }
$scope.checkCompleteCount = function() { $scope.checkCompleteCount = function () {
var assignee = $scope.oaNodeManage.assignee; var assignee = $scope.oaNodeManage.assignee;
if(!assignee.completeCount) { if (!assignee.completeCount) {
assignee.completeCount = 1; assignee.completeCount = 1;
return; return;
} }
if(assignee.completeCount < 1) { if (assignee.completeCount < 1) {
assignee.completeCount = 1; assignee.completeCount = 1;
} }
} }
$scope.checkPreviousNStep = function() { $scope.checkPreviousNStep = function () {
var assignee = $scope.oaNodeManage.assignee; var assignee = $scope.oaNodeManage.assignee;
if(!assignee.previousNStep) { if (!assignee.previousNStep) {
assignee.previousNStep = 1; assignee.previousNStep = 1;
return; return;
} }
if(assignee.previousNStep < 1) { if (assignee.previousNStep < 1) {
assignee.previousNStep = 1; assignee.previousNStep = 1;
} }
} }
@ -401,7 +407,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
function updateCandidates() { function updateCandidates() {
assigneeProperty.value = {}; assigneeProperty.value = {};
assigneeProperty.value.assignment = { assigneeProperty.value.assignment = {
candidateUsers: [{value: '${candidates}'}] candidateUsers: [{value: CANDIDATES_COLLECTION}]
}; };
} }
@ -420,17 +426,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
*/ */
function updateParallel() { function updateParallel() {
multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType; multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType;
multiInstanceCollection.value = '${multipleAssignees}'; multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION;
multiInstanceVariable.value = 'multipleAssignees'; multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE;
if (assignee.completeCondition === 'allPass') { if (assignee.completeCondition === 'allPass') {
// 全部通过 // 全部通过
multiInstanceCondition.value = '${nrOfCompletedInstances == nrOfInstances}' multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' == '+ NR_OF_INSTANCES +'}'
} else if (assignee.completeCondition === 'singlePass') { } else if (assignee.completeCondition === 'singlePass') {
// 单人通过 // 单人通过
multiInstanceCondition.value = '${nrOfCompletedInstances == 1}' multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= 1}'
} else if (assignee.completeCondition === 'customPass') { } else if (assignee.completeCondition === 'customPass') {
// 通过多少人 // 通过多少人
multiInstanceCondition.value = '${nrOfCompletedInstances == '+ assignee.completeCount +'}' multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= ' + assignee.completeCount + '}'
} else { } else {
top.dialog.msg('多实例(完成)通过条件错误'); top.dialog.msg('多实例(完成)通过条件错误');
return; return;
@ -443,8 +449,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
*/ */
function updateSequential() { function updateSequential() {
multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType; multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType;
multiInstanceCollection.value = '${assigneeList}'; multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION;
multiInstanceVariable.value = 'assignee'; multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE;
multiInstanceCondition.value = ''; multiInstanceCondition.value = '';
updateMultipleInstance(); updateMultipleInstance();
} }
@ -504,7 +510,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
updateParallel(); updateParallel();
return; return;
} }
if(assignee.multipleType === 'sequential') { if (assignee.multipleType === 'sequential') {
updateSequential(); updateSequential();
return; return;
} }
@ -525,56 +531,56 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
$scope.save = function () { $scope.save = function () {
var assignee = $scope.oaNodeManage.assignee; var assignee = $scope.oaNodeManage.assignee;
// 验证输入内容是否设置 // 验证输入内容是否设置
if(assignee.nodeType === 'normal') { if (assignee.nodeType === 'normal') {
if(assignee.assigneeType === 'appoint') { if (assignee.assigneeType === 'appoint') {
if(assignee.assigneeCount === 'single') { if (assignee.assigneeCount === 'single') {
if(!assignee.assignee) { if (!assignee.assignee) {
top.dialog.msg('请选择代理人'); top.dialog.msg('请选择代理人');
return; return;
} }
} }
if(assignee.assigneeCount === 'candidate') { if (assignee.assigneeCount === 'candidate') {
if(!assignee.candidates) { if (!assignee.candidates) {
top.dialog.msg('请选择候选人'); top.dialog.msg('请选择候选人');
return; return;
} }
} }
} }
} }
if(assignee.nodeType === 'multiple') { if (assignee.nodeType === 'multiple') {
if(assignee.multipleType === 'parallel') { if (assignee.multipleType === 'parallel') {
if(assignee.completeCondition === 'customPass') { if (assignee.completeCondition === 'customPass') {
if(!assignee.completeCount) { if (!assignee.completeCount) {
top.dialog.msg('请输入完成条件中的通过人数'); top.dialog.msg('请输入完成条件中的通过人数');
return; return;
} }
} }
} }
if(assignee.assigneeType === 'appoint') { if (assignee.assigneeType === 'appoint') {
if(!assignee.multipleAssignees) { if (!assignee.multipleAssignees) {
top.dialog.msg('请选择(多实例)代理人'); top.dialog.msg('请选择(多实例)代理人');
return; return;
} }
} }
} }
if(assignee.autoAssignType === 'scope') { if (assignee.autoAssignType === 'scope') {
if(assignee.departmentType === 'appoint') { if (assignee.departmentType === 'appoint') {
if(!assignee.departments && !assignee.roles && !assignee.positions) { if (!assignee.departments && !assignee.roles && !assignee.positions) {
top.dialog.msg('请选择部门、角色、职位中的至少一个类型'); top.dialog.msg('请选择部门、角色、职位中的至少一个类型');
return; return;
} }
} }
if(assignee.departmentType === 'belong') { if (assignee.departmentType === 'belong') {
if(!assignee.roles && !assignee.positions) { if (!assignee.roles && !assignee.positions) {
top.dialog.msg('请选择角色、职位中的至少一个类型'); top.dialog.msg('请选择角色、职位中的至少一个类型');
return; return;
} }
} }
} }
if(assignee.assigneeType === 'auto') { if (assignee.assigneeType === 'auto') {
if(assignee.autoAssignType === 'quick') { if (assignee.autoAssignType === 'quick') {
if(assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') { if (assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') {
if(!assignee.previousNStep) { if (!assignee.previousNStep) {
top.dialog.msg('请确认获取前哪一步的代理人'); top.dialog.msg('请确认获取前哪一步的代理人');
return; return;
} }

View File

@ -256,8 +256,7 @@
<td> <td>
<div class="radio"> <div class="radio">
<label> <label>
<input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="starter"> <input ng-model="oaNodeManage.assignee.quickAssignee" type="radio" name="quickAssignee" value="starter"> 发起人
发起人
</label> </label>
</div> </div>
<div class="radio"> <div class="radio">