|
|
|
|
@ -0,0 +1,100 @@
|
|
|
|
|
package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.lang.Assert;
|
|
|
|
|
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
|
|
|
|
|
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
|
|
|
|
|
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
|
|
|
|
|
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
|
|
|
|
|
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.activiti.engine.HistoryService;
|
|
|
|
|
import org.activiti.engine.RepositoryService;
|
|
|
|
|
import org.activiti.engine.RuntimeService;
|
|
|
|
|
import org.activiti.engine.TaskService;
|
|
|
|
|
import org.activiti.engine.history.HistoricProcessInstanceQuery;
|
|
|
|
|
import org.activiti.engine.impl.identity.Authentication;
|
|
|
|
|
import org.activiti.engine.repository.ProcessDefinition;
|
|
|
|
|
import org.activiti.engine.runtime.ProcessInstance;
|
|
|
|
|
import org.activiti.engine.task.Task;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
|
|
|
|
|
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 流程实例 Service 实现类
|
|
|
|
|
*
|
|
|
|
|
* ProcessDefinition & ProcessInstance & Execution & Task 的关系:
|
|
|
|
|
* 1. https://blog.csdn.net/bobozai86/article/details/105210414
|
|
|
|
|
*
|
|
|
|
|
* HistoricProcessInstance & ProcessInstance 的关系:
|
|
|
|
|
* 1.https://my.oschina.net/843294669/blog/719024
|
|
|
|
|
* 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例
|
|
|
|
|
*
|
|
|
|
|
* @author 芋道源码
|
|
|
|
|
*/
|
|
|
|
|
@Service
|
|
|
|
|
@Validated
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService {
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private RepositoryService repositoryService;
|
|
|
|
|
@Resource
|
|
|
|
|
private RuntimeService runtimeService;
|
|
|
|
|
@Resource
|
|
|
|
|
private TaskService taskService;
|
|
|
|
|
@Resource
|
|
|
|
|
private HistoryService historyService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private SysUserService userService;
|
|
|
|
|
@Resource
|
|
|
|
|
private BpmProcessDefinitionService processDefinitionService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) {
|
|
|
|
|
// 校验流程定义
|
|
|
|
|
ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
|
|
|
|
|
if (definition == null) {
|
|
|
|
|
throw exception(PROCESS_DEFINITION_NOT_EXISTS);
|
|
|
|
|
}
|
|
|
|
|
if (definition.isSuspended()) {
|
|
|
|
|
throw exception(PROCESS_DEFINITION_IS_SUSPENDED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置流程发起人
|
|
|
|
|
Authentication.setAuthenticatedUserId(String.valueOf(userId));
|
|
|
|
|
|
|
|
|
|
// 创建流程实例
|
|
|
|
|
Map<String, Object> variables = createReqVO.getVariables();
|
|
|
|
|
variables.put("INITIATOR", userId); // TODO 芋艿:初始化人员
|
|
|
|
|
ProcessInstance instance = runtimeService.startProcessInstanceById(createReqVO.getProcessDefinitionId(), variables);
|
|
|
|
|
|
|
|
|
|
// 添加初始的评论 TODO 芋艿:在思考下
|
|
|
|
|
Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
|
|
|
|
|
if (task != null) {
|
|
|
|
|
SysUserDO user = userService.getUser(userId);
|
|
|
|
|
Assert.notNull(user, "用户({})不存在", userId);
|
|
|
|
|
String type = "normal";
|
|
|
|
|
taskService.addComment(task.getId(), instance.getProcessInstanceId(), type,
|
|
|
|
|
String.format("%s 发起流程申请", user.getNickname()));
|
|
|
|
|
// TODO 芋艿:应该不用下面两个步骤
|
|
|
|
|
// taskService.setAssignee(task.getId(), String.valueOf(userId));
|
|
|
|
|
// taskService.complete(task.getId(), variables);
|
|
|
|
|
}
|
|
|
|
|
return instance.getId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void getMyProcessInstancePage(Long userId) {
|
|
|
|
|
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
|
|
|
|
|
.startedBy(String.valueOf(userId)) // 发起人是自己
|
|
|
|
|
.orderByProcessInstanceStartTime().desc(); // 按照发起时间倒序
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|