完善oa用户任务完成时的业务逻辑
This commit is contained in:
parent
18c46dccf1
commit
017a50762d
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量
|
// 1、nrOfInstances 该会签环节中总共有多少个实例 2、nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。 3、nrOfCompletedInstances 已经完成的实例的数量
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得开始节点
|
* 获得开始节点
|
||||||
*
|
*
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 删除
|
||||||
*
|
*
|
||||||
|
@ -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>
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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">
|
||||||
|
Loading…
Reference in New Issue
Block a user