完善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.SaveException;
|
||||
import ink.wgink.exceptions.SearchException;
|
||||
import ink.wgink.exceptions.UpdateException;
|
||||
import ink.wgink.interfaces.init.IInitBaseTable;
|
||||
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -49,4 +52,23 @@ public interface INodeAssigneeDao extends IInitBaseTable {
|
||||
* @throws UpdateException
|
||||
*/
|
||||
void deleteDeploymentId(String deploymentId) throws UpdateException;
|
||||
|
||||
/**
|
||||
* 详情
|
||||
*
|
||||
* @param params
|
||||
* @return
|
||||
* @throws SearchException
|
||||
*/
|
||||
OaNodeAssigneePO getPO(Map<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;
|
||||
|
||||
import ink.wgink.exceptions.OaNodeException;
|
||||
import ink.wgink.exceptions.SearchException;
|
||||
import ink.wgink.interfaces.department.IDepartmentBaseService;
|
||||
import ink.wgink.interfaces.department.IDepartmentUserBaseService;
|
||||
import ink.wgink.interfaces.position.IPositionBaseService;
|
||||
import ink.wgink.interfaces.position.IPositionUserBaseService;
|
||||
import ink.wgink.interfaces.role.IRoleBaseService;
|
||||
import ink.wgink.interfaces.role.IRoleUserBaseService;
|
||||
import ink.wgink.interfaces.user.IUserBaseService;
|
||||
import ink.wgink.module.activiti.enums.oa.assignee.*;
|
||||
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
|
||||
import ink.wgink.module.activiti.service.activiti.IActivitiModelService;
|
||||
import ink.wgink.module.activiti.service.oa.INodeAssigneeService;
|
||||
import ink.wgink.module.activiti.service.oa.IOaFormReportService;
|
||||
import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
|
||||
import ink.wgink.pojo.dtos.position.PositionDTO;
|
||||
import ink.wgink.pojo.dtos.user.UserDTO;
|
||||
import ink.wgink.util.ArrayListUtil;
|
||||
import org.activiti.bpmn.model.UserTask;
|
||||
import org.activiti.engine.RepositoryService;
|
||||
import org.activiti.engine.RuntimeService;
|
||||
import org.activiti.engine.delegate.DelegateExecution;
|
||||
import org.activiti.engine.delegate.DelegateTask;
|
||||
import org.activiti.engine.delegate.JavaDelegate;
|
||||
import org.activiti.engine.delegate.TaskListener;
|
||||
import org.activiti.engine.history.HistoricTaskInstance;
|
||||
import org.activiti.engine.repository.ProcessDefinition;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -15,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -29,23 +49,64 @@ import java.util.Map;
|
||||
public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OaUserTaskCompleteListener.class);
|
||||
|
||||
@Autowired
|
||||
private RuntimeService runtimeService;
|
||||
|
||||
@Autowired
|
||||
private RepositoryService repositoryService;
|
||||
@Autowired
|
||||
private IActivitiModelService activitiModelService;
|
||||
@Autowired
|
||||
private INodeAssigneeService nodeAssigneeService;
|
||||
@Autowired
|
||||
private IOaFormReportService oaFormReportService;
|
||||
@Autowired
|
||||
private IUserBaseService userBaseService;
|
||||
@Autowired
|
||||
private IDepartmentBaseService departmentBaseService;
|
||||
@Autowired
|
||||
private IDepartmentUserBaseService departmentUserBaseService;
|
||||
@Autowired
|
||||
private IRoleBaseService roleBaseService;
|
||||
@Autowired
|
||||
private IRoleUserBaseService roleUserBaseService;
|
||||
@Autowired
|
||||
private IPositionBaseService positionBaseService;
|
||||
@Autowired
|
||||
private IPositionUserBaseService positionUserBaseService;
|
||||
|
||||
@Override
|
||||
public void notify(DelegateTask delegateTask) {
|
||||
LOG.debug(">>>> userTask complete");
|
||||
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
|
||||
String processDefinitionId = delegateTask.getProcessDefinitionId();
|
||||
LOG.debug("查找流程定义");
|
||||
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
|
||||
String deploymentId = processDefinition.getDeploymentId();
|
||||
|
||||
Map<String, Object> variables = delegateTask.getVariables();
|
||||
|
||||
|
||||
LOG.debug("查询表单数据:variables: {}", variables);
|
||||
LOG.debug("获取下一节点");
|
||||
UserTask nextUserTask = activitiModelService.getNextUserTask(delegateTask.getTaskDefinitionKey(), delegateTask.getProcessDefinitionId(), variables);
|
||||
if (nextUserTask == null) {
|
||||
LOG.debug("下一个节点不存在");
|
||||
return;
|
||||
}
|
||||
LOG.debug("获取节点代理人配置");
|
||||
OaNodeAssigneePO oaNodeAssigneePO = nodeAssigneeService.getPOByDeploymentIdAndNodeId(deploymentId, taskDefinitionKey);
|
||||
if (oaNodeAssigneePO == null) {
|
||||
throw new OaNodeException("下一节点没有配置代理人信息");
|
||||
}
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getNodeType(), NodeTypeEnum.NORMAL.getValue())) {
|
||||
LOG.debug("nodeType -> normal");
|
||||
normal(delegateTask, nextUserTask, oaNodeAssigneePO);
|
||||
return;
|
||||
}
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getNodeType(), NodeTypeEnum.MULTIPLE.getValue())) {
|
||||
LOG.debug("nodeType -> multiple");
|
||||
multiple(delegateTask, nextUserTask, oaNodeAssigneePO);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nextUserTask != null) {
|
||||
if (StringUtils.equals(nextUserTask.getName(), "任务3")) {
|
||||
// nextUserTask.setAssignee("${signUser}");
|
||||
@ -74,6 +135,280 @@ public class OaUserTaskCompleteListener implements TaskListener, JavaDelegate {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param userTask
|
||||
* @param oaNodeAssigneePO
|
||||
*/
|
||||
private void normal(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) {
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.APPOINT.getValue())) {
|
||||
LOG.debug("assigneeType -> appoint");
|
||||
appoint(delegateTask, userTask, oaNodeAssigneePO);
|
||||
return;
|
||||
}
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.AUTO.getValue())) {
|
||||
LOG.debug("assigneeType -> auto");
|
||||
auto(delegateTask, userTask, oaNodeAssigneePO);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置多实例节点
|
||||
*
|
||||
* @param delegateTask
|
||||
* @param userTask
|
||||
* @param oaNodeAssigneePO
|
||||
*/
|
||||
private void multiple(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 手动指定
|
||||
*
|
||||
* @param delegateTask
|
||||
* @param userTask
|
||||
* @param oaNodeAssigneePO
|
||||
*/
|
||||
private void appoint(DelegateTask delegateTask, UserTask userTask, OaNodeAssigneePO oaNodeAssigneePO) {
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeCount(), AssigneeCountEnum.SINGLE.getValue())) {
|
||||
LOG.debug("assigneeCount -> single");
|
||||
String assignee = oaNodeAssigneePO.getAssignee();
|
||||
if (StringUtils.isBlank(assignee)) {
|
||||
throw new SearchException("下节点代理人未设置");
|
||||
}
|
||||
UserDTO userDTO = userBaseService.get(assignee);
|
||||
if (userDTO == null) {
|
||||
throw new SearchException("下节点代理人不存在");
|
||||
}
|
||||
LOG.debug("设置代理人");
|
||||
userTask.setAssignee(userDTO.getUserId());
|
||||
return;
|
||||
}
|
||||
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeCount(), AssigneeCountEnum.CANDIDATE.getValue())) {
|
||||
LOG.debug("assigneeCount -> candidate");
|
||||
String candidates = oaNodeAssigneePO.getCandidates();
|
||||
if (StringUtils.isBlank(candidates)) {
|
||||
throw new SearchException("下节点候选人未设置");
|
||||
}
|
||||
List<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 已经完成的实例的数量
|
||||
|
||||
|
@ -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.vos.ActivitiModelVO;
|
||||
import org.activiti.bpmn.model.*;
|
||||
import org.activiti.engine.history.HistoricTaskInstance;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
@ -33,6 +34,28 @@ public interface IActivitiModelService {
|
||||
*/
|
||||
String PARALLEL_GATEWAY_CONDITION_KEY = "par";
|
||||
|
||||
/**
|
||||
* 候选人集合
|
||||
*/
|
||||
String CANDIDATES_COLLECTION = "${candidates}";
|
||||
/**
|
||||
* 多实例集合
|
||||
*/
|
||||
String MULTI_INSTANCE_COLLECTION = "${assigneeList}";
|
||||
/**
|
||||
* 多实例变量
|
||||
*/
|
||||
String MULTI_INSTANCE_VARIABLE = "assignee";
|
||||
|
||||
/**
|
||||
* 完成的实例
|
||||
*/
|
||||
String NR_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
|
||||
/**
|
||||
* 实例数量
|
||||
*/
|
||||
String NR_OF_INSTANCES = "nrOfInstances";
|
||||
|
||||
/**
|
||||
* 保存模型
|
||||
*
|
||||
@ -93,6 +116,23 @@ public interface IActivitiModelService {
|
||||
*/
|
||||
UserTask getNextUserTask(String currentTaskDefinitionKey, String processDefinitionId, Map<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.JSONObject;
|
||||
import ink.wgink.common.base.DefaultBaseService;
|
||||
import ink.wgink.exceptions.OaNodeException;
|
||||
import ink.wgink.exceptions.RemoveException;
|
||||
import ink.wgink.exceptions.SearchException;
|
||||
import ink.wgink.exceptions.base.SystemException;
|
||||
@ -20,6 +21,7 @@ import org.activiti.engine.RepositoryService;
|
||||
import org.activiti.engine.RuntimeService;
|
||||
import org.activiti.engine.history.HistoricActivityInstance;
|
||||
import org.activiti.engine.history.HistoricProcessInstance;
|
||||
import org.activiti.engine.history.HistoricTaskInstance;
|
||||
import org.activiti.engine.repository.Model;
|
||||
import org.activiti.engine.repository.ProcessDefinition;
|
||||
import org.activiti.engine.runtime.ProcessInstance;
|
||||
@ -129,11 +131,11 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
|
||||
public UserTask getNextUserTask(UserTask currentUserTask) {
|
||||
List<SequenceFlow> outgoingFlows = currentUserTask.getOutgoingFlows();
|
||||
if (outgoingFlows.size() > 1 || outgoingFlows.size() == 0) {
|
||||
throw new SystemException("流程错误,下个用户任务节点数只能有1个");
|
||||
throw new OaNodeException("流程错误,下个用户任务节点数只能有1个");
|
||||
}
|
||||
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
|
||||
if (!(targetFlowElement instanceof UserTask)) {
|
||||
throw new SystemException("下个节点不是用户任务");
|
||||
throw new OaNodeException("下个节点不是用户任务");
|
||||
}
|
||||
return (UserTask) targetFlowElement;
|
||||
}
|
||||
@ -151,7 +153,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
|
||||
return getNextUserTask(exclusiveGateway, reportForm);
|
||||
}
|
||||
}
|
||||
throw new SystemException("未找到下一节点用户任务");
|
||||
throw new OaNodeException("未找到下一节点用户任务");
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -170,7 +172,28 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
|
||||
return null;
|
||||
}
|
||||
}
|
||||
throw new SystemException("未找到下一节点用户任务");
|
||||
throw new OaNodeException("未找到下一节点用户任务");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HistoricTaskInstance getPrevTask(String processInstanceId, int prevStep) {
|
||||
List<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
|
||||
|
@ -1,7 +1,11 @@
|
||||
package ink.wgink.module.activiti.service.oa;
|
||||
|
||||
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
|
||||
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @ClassName: INodeAssigneeService
|
||||
* @Description: 节点代理人
|
||||
@ -56,4 +60,65 @@ public interface INodeAssigneeService {
|
||||
* @param modelVersion 模型版本
|
||||
*/
|
||||
void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion);
|
||||
|
||||
/**
|
||||
* 节点代理人列表
|
||||
*
|
||||
* @param params
|
||||
* @return
|
||||
*/
|
||||
List<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.module.activiti.dao.oa.INodeAssigneeDao;
|
||||
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
|
||||
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO;
|
||||
import ink.wgink.module.activiti.service.oa.INodeAssigneeService;
|
||||
import ink.wgink.util.UUIDUtil;
|
||||
@ -9,6 +10,7 @@ import ink.wgink.util.map.HashMapUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -64,6 +66,57 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode
|
||||
nodeAssigneeDao.delete(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<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">
|
||||
<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">
|
||||
CREATE TABLE IF NOT EXISTS `oa_node_assignee` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
@ -134,4 +166,110 @@
|
||||
deployment_id = #{_parameter}
|
||||
</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>
|
@ -27,6 +27,12 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
|
||||
// 初始化
|
||||
var startNode;
|
||||
var CANDIDATES_COLLECTION = '${candidates}';
|
||||
var MULTI_INSTANCE_COLLECTION = '${assigneeList}';
|
||||
var MULTI_INSTANCE_VARIABLE = 'assignee';
|
||||
var NR_OF_COMPLETED_INSTANCES = 'nrOfCompletedInstances';
|
||||
var NR_OF_INSTANCES = 'nrOfInstances';
|
||||
|
||||
$scope.oaNodeManage = {
|
||||
assignee: {
|
||||
nodeType: 'normal',
|
||||
@ -146,24 +152,24 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
|
||||
}
|
||||
|
||||
$scope.checkCompleteCount = function() {
|
||||
$scope.checkCompleteCount = function () {
|
||||
var assignee = $scope.oaNodeManage.assignee;
|
||||
if(!assignee.completeCount) {
|
||||
if (!assignee.completeCount) {
|
||||
assignee.completeCount = 1;
|
||||
return;
|
||||
}
|
||||
if(assignee.completeCount < 1) {
|
||||
if (assignee.completeCount < 1) {
|
||||
assignee.completeCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$scope.checkPreviousNStep = function() {
|
||||
$scope.checkPreviousNStep = function () {
|
||||
var assignee = $scope.oaNodeManage.assignee;
|
||||
if(!assignee.previousNStep) {
|
||||
if (!assignee.previousNStep) {
|
||||
assignee.previousNStep = 1;
|
||||
return;
|
||||
}
|
||||
if(assignee.previousNStep < 1) {
|
||||
if (assignee.previousNStep < 1) {
|
||||
assignee.previousNStep = 1;
|
||||
}
|
||||
}
|
||||
@ -401,7 +407,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
function updateCandidates() {
|
||||
assigneeProperty.value = {};
|
||||
assigneeProperty.value.assignment = {
|
||||
candidateUsers: [{value: '${candidates}'}]
|
||||
candidateUsers: [{value: CANDIDATES_COLLECTION}]
|
||||
};
|
||||
}
|
||||
|
||||
@ -420,17 +426,17 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
*/
|
||||
function updateParallel() {
|
||||
multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType;
|
||||
multiInstanceCollection.value = '${multipleAssignees}';
|
||||
multiInstanceVariable.value = 'multipleAssignees';
|
||||
multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION;
|
||||
multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE;
|
||||
if (assignee.completeCondition === 'allPass') {
|
||||
// 全部通过
|
||||
multiInstanceCondition.value = '${nrOfCompletedInstances == nrOfInstances}'
|
||||
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' == '+ NR_OF_INSTANCES +'}'
|
||||
} else if (assignee.completeCondition === 'singlePass') {
|
||||
// 单人通过
|
||||
multiInstanceCondition.value = '${nrOfCompletedInstances == 1}'
|
||||
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= 1}'
|
||||
} else if (assignee.completeCondition === 'customPass') {
|
||||
// 通过多少人
|
||||
multiInstanceCondition.value = '${nrOfCompletedInstances == '+ assignee.completeCount +'}'
|
||||
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= ' + assignee.completeCount + '}'
|
||||
} else {
|
||||
top.dialog.msg('多实例(完成)通过条件错误');
|
||||
return;
|
||||
@ -443,8 +449,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
*/
|
||||
function updateSequential() {
|
||||
multiInstanceType.value = $scope.oaNodeManage.assignee.multipleType;
|
||||
multiInstanceCollection.value = '${assigneeList}';
|
||||
multiInstanceVariable.value = 'assignee';
|
||||
multiInstanceCollection.value = MULTI_INSTANCE_COLLECTION;
|
||||
multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE;
|
||||
multiInstanceCondition.value = '';
|
||||
updateMultipleInstance();
|
||||
}
|
||||
@ -504,7 +510,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
updateParallel();
|
||||
return;
|
||||
}
|
||||
if(assignee.multipleType === 'sequential') {
|
||||
if (assignee.multipleType === 'sequential') {
|
||||
updateSequential();
|
||||
return;
|
||||
}
|
||||
@ -525,56 +531,56 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
|
||||
$scope.save = function () {
|
||||
var assignee = $scope.oaNodeManage.assignee;
|
||||
// 验证输入内容是否设置
|
||||
if(assignee.nodeType === 'normal') {
|
||||
if(assignee.assigneeType === 'appoint') {
|
||||
if(assignee.assigneeCount === 'single') {
|
||||
if(!assignee.assignee) {
|
||||
if (assignee.nodeType === 'normal') {
|
||||
if (assignee.assigneeType === 'appoint') {
|
||||
if (assignee.assigneeCount === 'single') {
|
||||
if (!assignee.assignee) {
|
||||
top.dialog.msg('请选择代理人');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(assignee.assigneeCount === 'candidate') {
|
||||
if(!assignee.candidates) {
|
||||
if (assignee.assigneeCount === 'candidate') {
|
||||
if (!assignee.candidates) {
|
||||
top.dialog.msg('请选择候选人');
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(assignee.nodeType === 'multiple') {
|
||||
if(assignee.multipleType === 'parallel') {
|
||||
if(assignee.completeCondition === 'customPass') {
|
||||
if(!assignee.completeCount) {
|
||||
if (assignee.nodeType === 'multiple') {
|
||||
if (assignee.multipleType === 'parallel') {
|
||||
if (assignee.completeCondition === 'customPass') {
|
||||
if (!assignee.completeCount) {
|
||||
top.dialog.msg('请输入完成条件中的通过人数');
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(assignee.assigneeType === 'appoint') {
|
||||
if(!assignee.multipleAssignees) {
|
||||
if (assignee.assigneeType === 'appoint') {
|
||||
if (!assignee.multipleAssignees) {
|
||||
top.dialog.msg('请选择(多实例)代理人');
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(assignee.autoAssignType === 'scope') {
|
||||
if(assignee.departmentType === 'appoint') {
|
||||
if(!assignee.departments && !assignee.roles && !assignee.positions) {
|
||||
if (assignee.autoAssignType === 'scope') {
|
||||
if (assignee.departmentType === 'appoint') {
|
||||
if (!assignee.departments && !assignee.roles && !assignee.positions) {
|
||||
top.dialog.msg('请选择部门、角色、职位中的至少一个类型');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(assignee.departmentType === 'belong') {
|
||||
if(!assignee.roles && !assignee.positions) {
|
||||
if (assignee.departmentType === 'belong') {
|
||||
if (!assignee.roles && !assignee.positions) {
|
||||
top.dialog.msg('请选择角色、职位中的至少一个类型');
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(assignee.assigneeType === 'auto') {
|
||||
if(assignee.autoAssignType === 'quick') {
|
||||
if(assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') {
|
||||
if(!assignee.previousNStep) {
|
||||
if (assignee.assigneeType === 'auto') {
|
||||
if (assignee.autoAssignType === 'quick') {
|
||||
if (assignee.quickAssignee === 'previousNStepAssigneeSubordinatePosition') {
|
||||
if (!assignee.previousNStep) {
|
||||
top.dialog.msg('请确认获取前哪一步的代理人');
|
||||
return;
|
||||
}
|
||||
|
@ -256,8 +256,7 @@
|
||||
<td>
|
||||
<div class="radio">
|
||||
<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>
|
||||
</div>
|
||||
<div class="radio">
|
||||
|
Loading…
Reference in New Issue
Block a user