工作流程

master
pengqiang 2021-11-15 11:12:34 +08:00
parent 13e47b6317
commit 00ad42b448
8 changed files with 115 additions and 79 deletions

View File

@ -94,7 +94,7 @@ public class ActProcInsController extends BaseController {
variables.put(ActConstant.START_PROCESS_USERID, InterfaceUtil.getAdminId());
String procInsId = null;
try {
procInsId = actProcInsService.startProcessInstance(procDefKey, variables);
procInsId = actProcInsService.startProcessInstance(procDefKey, "", variables);
} catch (Exception e) {
logger.error("", e);
return ResponseMsg.buildFailedMsg("流程启动失败:" + e.getMessage());

View File

@ -2,9 +2,13 @@ package cn.palmte.work.service;
import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.utils.ActUtil;
import com.alibaba.fastjson.JSONObject;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -30,14 +34,20 @@ public class ActListenerService {
@Autowired
private ProjectInstanceService projectInstanceService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private ActUtil actUtil;
/**
*
*
*
* @param delegateTask
* @throws Exception
*/
public void create(DelegateTask delegateTask) throws Exception {
logger.info("--- {}", JSONObject.toJSONString(delegateTask));
logger.info("--节点创建后监听-- name:{}, {}", delegateTask.getName(), JSONObject.toJSONString(delegateTask));
String procDefId = delegateTask.getProcessDefinitionId();
String procInsId = delegateTask.getProcessInstanceId();
@ -45,41 +55,53 @@ public class ActListenerService {
List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
logger.info("addCandidateUsers : {}", candidateUsers);
Object projectIdObj = delegateTask.getVariable(ActConstant.KEY_PROJECT_ID);
logger.info("projectIdObj : {}", projectIdObj);
if (candidateUsers != null && !candidateUsers.isEmpty() && projectIdObj != null) {
try {
int adminId = Integer.parseInt(candidateUsers.get(0));
projectInstanceService.updateApprover((Integer) projectIdObj, adminId);
} catch (Exception e) {
logger.error("", e);
}
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
List<ProcessInstance> list = processInstanceQuery.list();
System.out.println(list);
ProcessInstance processInstance = processInstanceQuery.processInstanceId(delegateTask.getProcessInstanceId()).singleResult();
if (actUtil.isProjectProcessIns(processInstance)) {
updateProjectApprover(candidateUsers, processInstance);
}
delegateTask.addCandidateUsers(candidateUsers);
}
/*public void multiTaskcreate(DelegateTask delegateTask) throws Exception {
logger.info("--- {}", JSONObject.toJSONString(delegateTask));
String procDefId = delegateTask.getProcessDefinitionId();
String procInsId = delegateTask.getProcessInstanceId();
String taskDefKey = delegateTask.getTaskDefinitionKey();
Set<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
logger.info("addCandidateUsers : {}", candidateUsers);
delegateTask.addCandidateUsers(candidateUsers);
}*/
public List<String> multipleInstanceTask(DelegateExecution delegateExecution) throws Exception {
/**
*
*
* @param delegateExecution
* @throws Exception
*/
public List<String> getMultiCandidateUsers(DelegateExecution delegateExecution) throws Exception {
logger.info("--多实例任务查询办理人-- eventName:{}, {}", delegateExecution.getEventName(), delegateExecution);
String procInsId = delegateExecution.getProcessInstanceId();
String procDefId = delegateExecution.getProcessDefinitionId();
String taskDefKey = delegateExecution.getCurrentActivityId();
return actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
logger.info("--getMultiCandidateUsers-- {}", candidateUsers);
return candidateUsers;
}
/**
*
*
* @param candidateUsers
* @param processInstance
*/
private void updateProjectApprover(List<String> candidateUsers, ProcessInstance processInstance) {
String businessKey = processInstance.getBusinessKey();
logger.info("businessKey : {}", businessKey);
if (candidateUsers != null && !candidateUsers.isEmpty() && businessKey != null) {
try {
int adminId = Integer.parseInt(candidateUsers.get(0));
projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId);
} catch (Exception e) {
logger.error("", e);
}
}
}
}

View File

@ -114,6 +114,7 @@ public class ActModelService {
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
BpmnModel model = jsonConverter.convertToBpmnModel(modelNode);
//任务创建后监听器
ActivitiListener activitiListener = new ActivitiListener();
activitiListener.setEvent(TaskListener.EVENTNAME_CREATE);
activitiListener.setImplementation("${actListenerService.create(task)}");
@ -135,20 +136,25 @@ public class ActModelService {
taskDef = new ActTaskDef();
taskDef.setTaskName(element.getName());
taskDef.setTaskKey(element.getId());
MultiInstanceLoopCharacteristics loopCharacteristics = userTaskElement.getLoopCharacteristics();
if (loopCharacteristics != null) {
taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE);
loopCharacteristics.setInputDataItem("${actListenerService.multipleInstanceTask(execution)}");
if (loopCharacteristics != null) { //多实列
loopCharacteristics.setInputDataItem("${actListenerService.getMultiCandidateUsers(execution)}");
loopCharacteristics.setElementVariable("assignee");
userTaskElement.setAssignee("${assignee}");
taskDef.setTaskType(ActConstant.TASK_TYPE_MULTI);
}else {
userTaskElement.setTaskListeners(activitiListenerList);
taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE);
}
if (i == 1) {
if (i == 1) {//画流程图时,要保证第一个用户任务一定要先画
taskDef.setTaskIndex(ActConstant.TASK_INDEX_FIRST_USER_TASK);
first = taskDef;
}
taskList.add(taskDef);
}
i ++;

View File

@ -2,6 +2,7 @@ package cn.palmte.work.service;
import cn.palmte.work.bean.ApproveStatusEnum;
import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.model.ActTaskDefRepository;
import cn.palmte.work.pojo.ActProcIns;
import cn.palmte.work.utils.ActUtil;
@ -71,7 +72,7 @@ public class ActProcInsService {
* @param variables
* @return
*/
public String startProcessInstance(String procDefKey, Map<String, Object> variables) throws Exception {
public String startProcessInstance(String procDefKey, String businessKey, Map<String, Object> variables) throws Exception {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(procDefKey).active().orderByProcessDefinitionVersion().desc().list();
if (list == null || list.isEmpty()) {
throw new Exception("procDefKey(" + procDefKey + ")未定义");
@ -80,8 +81,10 @@ public class ActProcInsService {
//取最新版本的流程定义进行启动流程实列
ProcessDefinition processDefinition = list.get(0);
String adminId = InterfaceUtil.getAdminId() + "";
variables.put(ActConstant.START_PROCESS_USERID, adminId);
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variables);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), businessKey, variables);
String procInsId = processInstance.getProcessInstanceId();
Task task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult();
@ -90,18 +93,18 @@ public class ActProcInsService {
}
//设置发起人为办理人 然后完成任务 任务转入下一个审批节点
String assignee = InterfaceUtil.getAdminId() + "";
task.setAssignee(assignee);
task.setAssignee(adminId);
String taskId = task.getId();
String comment = "提交" + processDefinition.getName();
Authentication.setAuthenticatedUserId(assignee);
Authentication.setAuthenticatedUserId(adminId);
taskService.addComment(taskId, procInsId, comment);
taskService.complete(taskId);
actTaskDefRepository.updateHiTaskAssign(assignee, procInsId, taskId);
actTaskDefRepository.updateHiActAssign(assignee, procInsId, taskId);
projectTaskRecordService.saveTaskRecord(task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment);
if (actUtil.isProjectProcessIns(processInstance)) {
projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()),
task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment);
}
return processInstance.getId();
}

View File

@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
import org.activiti.engine.*;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
@ -42,6 +43,8 @@ public class ActTaskDefService {
private ActUtil actUtil;
@Autowired
private ProjectInstanceService projectInstanceService;
@Autowired
private RuntimeService runtimeService;
/**
@ -63,22 +66,22 @@ public class ActTaskDefService {
Authentication.setAuthenticatedUserId(userId);
taskService.addComment(taskId, procInsId, message);
actTaskDefRepository.updateHiTaskAssign(userId, procInsId, taskId);
actTaskDefRepository.updateHiActAssign(userId, procInsId, taskId);
Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult();
ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(currentTask.getProcessDefinitionId(), currentTask.getTaskDefinitionKey());
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
taskService.setAssignee(taskId, userId);
if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) {
//或签处理
handleSinge(taskId, procInsId, type, userId, actTaskDef);
handleSinge(processInstance, taskId, type, actTaskDef);
} else if (ActConstant.TASK_TYPE_MULTI == actTaskDef.getTaskType()) {
//会签处理
handleMulti(taskId, procInsId, type, userId, actTaskDef);
//多实列 会签处理
handleMulti(processInstance, taskId, type, actTaskDef);
}
if (actUtil.isProjectProcessIns(processInstance)) {
//保存审批记录
projectTaskRecordService.saveTaskRecord(currentTask, type, message);
projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()), currentTask, type, message);
}
}
@ -105,27 +108,24 @@ public class ActTaskDefService {
*
*
* @param taskId
* @param procInsId
* @param processInstance
* @param type
* @param userId
* @param actTaskDef
*/
private void handleMulti(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) {
/* Double instanceCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_INSTANCES))); //会签任务总数
Double instanceActiveCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_ACTIVE_INSTANCES))); //活动的会签任务数
Double instanceCompleteCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_COMPLETED_INSTANCES))); //完成会签任务数*/
private void handleMulti(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) {
if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) {
//一个人驳回 整个任务节点驳回
List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
for (int i = 0; i < taskList.size(); i++) {
TaskEntity taskEntity = (TaskEntity) taskList.get(i);
if (!taskId.equals(taskEntity.getId())) {
taskEntity.setProcessInstanceId(null);
/* taskEntity.setProcessInstanceId(null);
taskEntity.setExecutionId(null);
taskService.saveTask(taskEntity);
taskService.addComment(taskEntity.getId(), procInsId, "会签驳回,任务失效");
taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录
taskService.saveTask(taskEntity);*/
taskService.addComment(taskEntity.getId(), processInstance.getId(), "会签驳回,任务自动失效");
taskService.complete(taskEntity.getId());
//taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录
}
}
@ -141,21 +141,19 @@ public class ActTaskDefService {
*
*
* @param taskId
* @param procInsId
* @param processInstance
* @param type
* @param userId
* @param actTaskDef
*/
private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) {
private void handleSinge(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) {
if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) {
//审批通过
taskService.setAssignee(taskId, userId);
taskService.complete(taskId);
//执行配置的审批通过脚本
int endScript = actTaskDef.getEndScript();
if (endScript != 0) {
actUtil.invokeEventScript(endScript, procInsId, actTaskDef);
actUtil.invokeEventScript(endScript, processInstance.getId(), actTaskDef);
} else {
logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName());
}
@ -168,15 +166,14 @@ public class ActTaskDefService {
//执行配置的驳回脚本
int rollbackScript = actTaskDef.getRollbackScript();
if (rollbackScript != 0) {
actUtil.invokeEventScript(rollbackScript, procInsId, actTaskDef);
actUtil.invokeEventScript(rollbackScript, processInstance.getId(), actTaskDef);
} else {
logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName());
}
int projectId = actUtil.getProjectId(procInsId);
if (projectId > 0) {
projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey());
if (actUtil.isProjectProcessIns(processInstance)) {
projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey());
}
}
}

View File

@ -89,11 +89,9 @@ public class ProjectInstanceService {
private void startProcess(Project project, Admin admin, String processDefkey) throws Exception {
HashMap<String, Object> variables = new HashMap<>();
variables.put(ActConstant.START_PROCESS_USERID, admin.getId());
variables.put(ActConstant.KEY_PROJECT_ID, project.getId());
variables.put(ActConstant.KEY_PROJECT_TYPE, project.getType());
String processInstanceId = actProcInsService.startProcessInstance(processDefkey, variables);
String businessKey = String.valueOf(project.getId());
String processInstanceId = actProcInsService.startProcessInstance(processDefkey, businessKey, variables);
//保存流程实例id与项目的关联关系
ProjectInstanceRelation relation = new ProjectInstanceRelation();

View File

@ -36,11 +36,7 @@ public class ProjectTaskRecordService {
* @param status
* @param comment
*/
public void saveTaskRecord(Task task, int status, String comment) {
int projectId = actUtil.getProjectId(task.getProcessInstanceId());
if (projectId == 0) {
return;
}
public void saveTaskRecord(int projectId, Task task, int status, String comment) {
task.getProcessDefinitionId();
ProjectTaskRecord record = new ProjectTaskRecord();
record.setProjectId(projectId);

View File

@ -13,6 +13,8 @@ import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
@ -249,6 +251,18 @@ public class ActUtil {
}
public boolean isProjectProcessIns(ProcessInstance processInstance) {
if (processInstance == null) {
return false;
}
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult();
String procDefKey = processDefinition.getKey();
return procDefKey.equals(ActConstant.PROCESS_DEFKEY_ESTIMATE)
|| procDefKey.equals(ActConstant.PROCESS_DEFKEY_BUDGET)
|| procDefKey.equals(ActConstant.PROCESS_DEFKEY_SETTLE)
|| procDefKey.equals(ActConstant.PROCESS_DEFKEY_FINAL);
}
/**
* xml