Commit 1031b78f64ec775ec6ed33ecd2ca4a71e615aace

Authored by YunaiV
1 parent 4d7ee176

1. 创建流程实例时,同时也插入流程

2. 修改 Activiti 使用 TTL 上下文
Showing 21 changed files with 212 additions and 37 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java
... ... @@ -31,7 +31,6 @@ public class BpmProcessInstanceController {
31 31 public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) {
32 32 return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO));
33 33 // processInstanceService.getMyProcessInstancePage(getLoginUserId());
34   - return null;
35 34 }
36 35  
37 36 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmDefinitionConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
4   -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
5 5 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
6 6 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
7 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
... ... @@ -25,17 +25,17 @@ public interface BpmDefinitionConvert {
25 25 BpmDefinitionConvert INSTANCE = Mappers.getMapper(BpmDefinitionConvert.class);
26 26  
27 27 default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap,
28   - Map<String, BpmProcessDefinitionDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
  28 + Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
29 29 return CollectionUtils.convertList(list, definition -> {
30 30 Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null;
31   - BpmProcessDefinitionDO definitionDO = processDefinitionDOMap.get(definition.getId());
  31 + BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId());
32 32 BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null;
33 33 return convert(definition, deployment, definitionDO, form);
34 34 });
35 35 }
36 36  
37 37 default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment,
38   - BpmProcessDefinitionDO processDefinitionDO, BpmFormDO form) {
  38 + BpmProcessDefinitionExtDO processDefinitionDO, BpmFormDO form) {
39 39 BpmProcessDefinitionPageItemRespVO respVO = convert(bean);
40 40 respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
41 41 if (deployment != null) {
... ... @@ -53,6 +53,6 @@ public interface BpmDefinitionConvert {
53 53  
54 54 BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean);
55 55  
56   - BpmProcessDefinitionDO convert2(BpmDefinitionCreateReqDTO bean);
  56 + BpmProcessDefinitionExtDO convert2(BpmDefinitionCreateReqDTO bean);
57 57  
58 58 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  4 +import org.activiti.engine.runtime.ProcessInstance;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.Mapping;
  7 +import org.mapstruct.Mappings;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +/**
  11 + * 流程实例 Convert
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Mapper
  16 +public interface BpmProcessInstanceConvert {
  17 +
  18 + BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class);
  19 +
  20 + @Mappings({
  21 + @Mapping(source = "startUserId", target = "userId"),
  22 + @Mapping(source = "id", target = "processInstanceId"),
  23 + @Mapping(source = "startTime", target = "createTime")
  24 + })
  25 + BpmProcessInstanceExtDO convert(ProcessInstance bean);
  26 +
  27 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/workflow/TaskConvert.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/TaskConvert.java
1   -package cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow;
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO;
4 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionDO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java
... ... @@ -13,14 +13,14 @@ import org.activiti.engine.repository.ProcessDefinition;
13 13 *
14 14 * @author 芋道源码
15 15 */
16   -@TableName(value = "bpm_process_definition", autoResultMap = true)
  16 +@TableName(value = "bpm_process_definition_ext", autoResultMap = true)
17 17 @Data
18 18 @EqualsAndHashCode(callSuper = true)
19 19 @ToString(callSuper = true)
20 20 @Builder
21 21 @NoArgsConstructor
22 22 @AllArgsConstructor
23   -public class BpmProcessDefinitionDO extends BaseDO {
  23 +public class BpmProcessDefinitionExtDO extends BaseDO {
24 24  
25 25 /**
26 26 * 编号
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.ProcessInstanceResultEnum;
4   -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.ProcessInstanceStatusEnum;
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum;
5 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
... ... @@ -44,13 +44,13 @@ public class BpmProcessInstanceExtDO extends BaseDO {
44 44 /**
45 45 * 流程实例的状态
46 46 *
47   - * 枚举 {@link ProcessInstanceStatusEnum}
  47 + * 枚举 {@link BpmProcessInstanceStatusEnum}
48 48 */
49 49 private Integer status;
50 50 /**
51 51 * 结果
52 52 *
53   - * 枚举 {@link ProcessInstanceResultEnum}
  53 + * 枚举 {@link BpmProcessInstanceResultEnum}
54 54 */
55 55 private Integer result;
56 56  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionMapper.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
4 4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 5 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 6 import org.apache.ibatis.annotations.Mapper;
... ... @@ -9,10 +9,10 @@ import java.util.Collection;
9 9 import java.util.List;
10 10  
11 11 @Mapper
12   -public interface BpmProcessDefinitionMapper extends BaseMapper<BpmProcessDefinitionDO> {
  12 +public interface BpmProcessDefinitionExtMapper extends BaseMapper<BpmProcessDefinitionExtDO> {
13 13  
14   - default List<BpmProcessDefinitionDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
15   - return selectList(new QueryWrapper<BpmProcessDefinitionDO>().in("process_definition_id", processDefinitionIds));
  14 + default List<BpmProcessDefinitionExtDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
  15 + return selectList(new QueryWrapper<BpmProcessDefinitionExtDO>().in("process_definition_id", processDefinitionIds));
16 16 }
17 17  
18 18 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface BpmProcessInstanceExtMapper extends BaseMapper<BpmProcessInstanceExtDO> {
  9 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/ProcessInstanceResultEnum.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java
... ... @@ -10,7 +10,7 @@ import lombok.Getter;
10 10 */
11 11 @Getter
12 12 @AllArgsConstructor
13   -public enum ProcessInstanceResultEnum {
  13 +public enum BpmProcessInstanceResultEnum {
14 14  
15 15 PROCESS(1, "处理中"),
16 16 PASS(2, "通过"),
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/ProcessInstanceStatusEnum.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceStatusEnum.java
... ... @@ -10,7 +10,7 @@ import lombok.Getter;
10 10 */
11 11 @Getter
12 12 @AllArgsConstructor
13   -public enum ProcessInstanceStatusEnum {
  13 +public enum BpmProcessInstanceStatusEnum {
14 14  
15 15 RUNNING(1, "进行中"),
16 16 FINISH(2, "已完成");
... ... @@ -18,7 +18,7 @@ public enum ProcessInstanceStatusEnum {
18 18 /**
19 19 * 状态
20 20 */
21   - private final Integer result;
  21 + private final Integer status;
22 22 /**
23 23 * 描述
24 24 */
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/BpmActivitiConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener.BpmProcessInstanceEventListener;
  4 +import org.activiti.spring.SpringProcessEngineConfiguration;
  5 +import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
  6 +import org.springframework.context.annotation.Configuration;
  7 +
  8 +import javax.annotation.Resource;
  9 +import java.util.Arrays;
  10 +
  11 +/**
  12 + * BPM 模块的 Activiti 配置类
  13 + */
  14 +@Configuration
  15 +public class BpmActivitiConfiguration implements ProcessEngineConfigurationConfigurer {
  16 +
  17 + @Resource
  18 + private BpmProcessInstanceEventListener processInstanceEventListener;
  19 +
  20 + @Override
  21 + public void configure(SpringProcessEngineConfiguration configuration) {
  22 + // 注册监听器,例如说 BpmProcessInstanceEventListener
  23 + configuration.setEventListeners(Arrays.asList(processInstanceEventListener));
  24 + }
  25 +
  26 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/package-info.java 0 → 100644
  1 +/**
  2 + * 属于 bpm 模块的 framework 封装
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.adminserver.modules.bpm.framework;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java
... ... @@ -5,9 +5,9 @@ import cn.hutool.core.util.StrUtil;
5 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
6 6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO;
7 7 import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmDefinitionConvert;
8   -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionDO;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
9 9 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
10   -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionMapper;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
11 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
12 12 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
13 13 import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
... ... @@ -56,7 +56,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
56 56 private BpmFormService bpmFormService;
57 57  
58 58 @Resource
59   - private BpmProcessDefinitionMapper processDefinitionMapper;
  59 + private BpmProcessDefinitionExtMapper processDefinitionMapper;
60 60  
61 61 @Override
62 62 public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
... ... @@ -77,14 +77,14 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
77 77 Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds);
78 78  
79 79 // 获得 BpmProcessDefinitionDO Map
80   - List<BpmProcessDefinitionDO> processDefinitionDOs = Collections.emptyList();
  80 + List<BpmProcessDefinitionExtDO> processDefinitionDOs = Collections.emptyList();
81 81 processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
82 82 convertList(processDefinitions, ProcessDefinition::getId));
83   - Map<String, BpmProcessDefinitionDO> processDefinitionDOMap = CollectionUtils.convertMap(processDefinitionDOs,
84   - BpmProcessDefinitionDO::getProcessDefinitionId);
  83 + Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = CollectionUtils.convertMap(processDefinitionDOs,
  84 + BpmProcessDefinitionExtDO::getProcessDefinitionId);
85 85  
86 86 // 获得 Form Map
87   - Set<Long> formIds = CollectionUtils.convertSet(processDefinitionDOs, BpmProcessDefinitionDO::getFormId);
  87 + Set<Long> formIds = CollectionUtils.convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId);
88 88 Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
89 89  
90 90 // 拼接结果
... ... @@ -169,7 +169,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
169 169 }
170 170  
171 171 // 插入拓展表
172   - BpmProcessDefinitionDO definitionDO = BpmDefinitionConvert.INSTANCE.convert2(createReqDTO)
  172 + BpmProcessDefinitionExtDO definitionDO = BpmDefinitionConvert.INSTANCE.convert2(createReqDTO)
173 173 .setProcessDefinitionId(definition.getId());
174 174 processDefinitionMapper.insert(definitionDO);
175 175 return definition.getId();
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
4 4 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
5   -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.ProcessInstanceResultEnum;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
6 6 import org.activiti.engine.delegate.DelegateExecution;
7 7 import org.activiti.engine.delegate.ExecutionListener;
8 8 import org.springframework.stereotype.Component;
... ... @@ -29,9 +29,9 @@ public class LeaveApplyEndProcessor implements ExecutionListener {
29 29 OALeaveDO updateDo = new OALeaveDO();
30 30 updateDo.setId(Long.valueOf(businessKey));
31 31 if (Objects.equals(approved, true)) {
32   - updateDo.setStatus(ProcessInstanceResultEnum.PASS.getResult());
  32 + updateDo.setStatus(BpmProcessInstanceResultEnum.PASS.getResult());
33 33 } else {
34   - updateDo.setStatus(ProcessInstanceResultEnum.REJECT.getResult());
  34 + updateDo.setStatus(BpmProcessInstanceResultEnum.REJECT.getResult());
35 35 }
36 36  
37 37 leaveMapper.updateById(updateDo);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java
... ... @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
6 6 import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert;
7 7 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
8 8 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
9   -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.ProcessInstanceResultEnum;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
10 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
11 11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
12 12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper;
... ... @@ -62,7 +62,7 @@ public class OALeaveServiceImpl implements OALeaveService {
62 62 public Long createLeave(OALeaveCreateReqVO createReqVO) {
63 63 // 插入 OA 请假单
64 64 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
65   - leave.setStatus(ProcessInstanceResultEnum.PROCESS.getResult());
  65 + leave.setStatus(BpmProcessInstanceResultEnum.PROCESS.getResult());
66 66 // TODO @jason:应该是存储 userId??
67 67 leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
68 68 leaveMapper.insert(leave);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener.BpmProcessInstanceEventListener;
4 5  
5 6 import javax.validation.Valid;
6 7  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
... ... @@ -2,13 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
2 2  
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum;
5 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
6 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
7 12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
8 13 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
9 14 import lombok.extern.slf4j.Slf4j;
10 15 import org.activiti.engine.HistoryService;
11   -import org.activiti.engine.RepositoryService;
12 16 import org.activiti.engine.RuntimeService;
13 17 import org.activiti.engine.TaskService;
14 18 import org.activiti.engine.history.HistoricProcessInstance;
... ... @@ -45,8 +49,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
45 49 public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService {
46 50  
47 51 @Resource
48   - private RepositoryService repositoryService;
49   - @Resource
50 52 private RuntimeService runtimeService;
51 53 @Resource
52 54 private TaskService taskService;
... ... @@ -58,7 +60,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
58 60 @Resource
59 61 private BpmProcessDefinitionService processDefinitionService;
60 62  
  63 + @Resource
  64 + private BpmProcessInstanceExtMapper processInstanceExtMapper;
  65 +
61 66 @Override
  67 +// @Transactional(rollbackFor = Exception.class)
62 68 public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) {
63 69 // 校验流程定义
64 70 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
... ... @@ -72,6 +78,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
72 78 // 创建流程实例
73 79 Map<String, Object> variables = createReqVO.getVariables();
74 80 ProcessInstance instance = runtimeService.startProcessInstanceById(createReqVO.getProcessDefinitionId(), variables);
  81 + // 设置流程名字
  82 + runtimeService.setProcessInstanceName(instance.getId(), definition.getName());
  83 + // 记录流程实例的拓展表
  84 + createProcessInstanceExt(instance, definition.getName());
75 85  
76 86 // 添加初始的评论 TODO 芋艿:在思考下
77 87 Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
... ... @@ -88,6 +98,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
88 98 return instance.getId();
89 99 }
90 100  
  101 + /**
  102 + * 创建流程实例的拓展
  103 + *
  104 + * @param instance 流程实例
  105 + * @param name 实例名。此时,instance 的 name 为空,所以需要传递该参数
  106 + */
  107 + private void createProcessInstanceExt(ProcessInstance instance, String name) {
  108 + BpmProcessInstanceExtDO instanceExt = BpmProcessInstanceConvert.INSTANCE.convert(instance);
  109 + instanceExt.setName(name);
  110 + instanceExt.setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus());
  111 + instanceExt.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
  112 + processInstanceExtMapper.insert(instanceExt);
  113 + }
  114 +
91 115 public void getMyProcessInstancePage(Long userId) {
92 116 // id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 【标题、状态】「ActBusiness」
93 117 // id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 【标题、提交时间】「HistoricProcessInstanceQuery」
... ... @@ -103,4 +127,24 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
103 127  
104 128 }
105 129  
  130 + /**
  131 + * 获得流程实例
  132 + *
  133 + * @param id 流程实例的编号
  134 + * @return 流程实例
  135 + */
  136 + private ProcessInstance getProcessInstance(String id) {
  137 + return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
  138 + }
  139 +
  140 + /**
  141 + * 获得历史的流程实例
  142 + *
  143 + * @param id 流程实例的编号
  144 + * @return 历史的流程实例
  145 + */
  146 + private HistoricProcessInstance getHistoricProcessInstance(String id) {
  147 + return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();
  148 + }
  149 +
106 150 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.io.IoUtil;
5 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
6   -import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.TaskConvert;
7 7 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
8 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/listener/BpmProcessInstanceEventListener.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
  5 +import org.activiti.engine.delegate.event.ActivitiEvent;
  6 +import org.activiti.engine.delegate.event.ActivitiEventListener;
  7 +import org.activiti.engine.delegate.event.ActivitiEventType;
  8 +import org.activiti.engine.runtime.ProcessInstance;
  9 +import org.springframework.context.annotation.Lazy;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import javax.annotation.Resource;
  13 +
  14 +/**
  15 + * 监听 {@link ProcessInstance} 的开始与完成,创建与更新对应的 {@link BpmProcessInstanceExtDO} 记录
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Component
  20 +public class BpmProcessInstanceEventListener implements ActivitiEventListener {
  21 +
  22 + @Resource
  23 + @Lazy // 解决循环依赖
  24 + private BpmProcessInstanceService processInstanceService;
  25 +
  26 + @Override
  27 + public void onEvent(ActivitiEvent event) {
  28 + // 不处理 ActivitiEventType.PROCESS_STARTED 事件。原因:事件发布时,流程实例还没进行入库,就已经发布了 ActivitiEvent 事件
  29 +
  30 + // 正常完成
  31 + if (event.getType() == ActivitiEventType.PROCESS_COMPLETED
  32 + || event.getType() == ActivitiEventType.PROCESS_COMPLETED_WITH_ERROR_END_EVENT) {
  33 + return;
  34 + }
  35 + // 取消
  36 + if (event.getType() == ActivitiEventType.PROCESS_CANCELLED) {
  37 + // TODO
  38 + System.out.println();
  39 + }
  40 + }
  41 +
  42 + @Override
  43 + public boolean isFailOnException() {
  44 + return true;
  45 + }
  46 +
  47 +}
... ...
yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
1 1 package cn.iocoder.yudao.framework.activiti.core.util;
2 2  
  3 +import cn.hutool.core.util.ReflectUtil;
  4 +import com.alibaba.ttl.TransmittableThreadLocal;
3 5 import org.activiti.engine.impl.identity.Authentication;
4 6  
5 7 /**
... ... @@ -9,6 +11,19 @@ import org.activiti.engine.impl.identity.Authentication;
9 11 */
10 12 public class ActivitiUtils {
11 13  
  14 + static {
  15 + setAuthenticationThreadLocal();
  16 + }
  17 +
  18 + /**
  19 + * 反射修改 Authentication 的 authenticatedUserIdThreadLocal 静态变量,使用 TTL 线程变量
  20 + * 目的:保证 @Async 等异步执行时,变量丢失的问题
  21 + */
  22 + private static void setAuthenticationThreadLocal() {
  23 + ReflectUtil.setFieldValue(Authentication.class, "authenticatedUserIdThreadLocal",
  24 + new TransmittableThreadLocal<String>());
  25 + }
  26 +
12 27 public static void setAuthenticatedUserId(Long userId) {
13 28 Authentication.setAuthenticatedUserId(String.valueOf(userId));
14 29 }
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/dataobject/BaseDO.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.mybatis.core.dataobject;
3 3 import com.baomidou.mybatisplus.annotation.FieldFill;
4 4 import com.baomidou.mybatisplus.annotation.TableField;
5 5 import com.baomidou.mybatisplus.annotation.TableLogic;
  6 +import lombok.Builder;
6 7 import lombok.Data;
7 8  
8 9 import java.io.Serializable;
... ...