工作流程
parent
13e47b6317
commit
00ad42b448
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ++;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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流
|
||||
|
|
Loading…
Reference in New Issue