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,7 +31,6 @@ public class BpmProcessInstanceController {
31 public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { 31 public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) {
32 return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); 32 return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO));
33 // processInstanceService.getMyProcessInstancePage(getLoginUserId()); 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 package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition; 1 package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO; 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 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO; 5 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO;
6 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO; 6 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -25,17 +25,17 @@ public interface BpmDefinitionConvert { @@ -25,17 +25,17 @@ public interface BpmDefinitionConvert {
25 BpmDefinitionConvert INSTANCE = Mappers.getMapper(BpmDefinitionConvert.class); 25 BpmDefinitionConvert INSTANCE = Mappers.getMapper(BpmDefinitionConvert.class);
26 26
27 default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap, 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 return CollectionUtils.convertList(list, definition -> { 29 return CollectionUtils.convertList(list, definition -> {
30 Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; 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 BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; 32 BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null;
33 return convert(definition, deployment, definitionDO, form); 33 return convert(definition, deployment, definitionDO, form);
34 }); 34 });
35 } 35 }
36 36
37 default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, 37 default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment,
38 - BpmProcessDefinitionDO processDefinitionDO, BpmFormDO form) { 38 + BpmProcessDefinitionExtDO processDefinitionDO, BpmFormDO form) {
39 BpmProcessDefinitionPageItemRespVO respVO = convert(bean); 39 BpmProcessDefinitionPageItemRespVO respVO = convert(bean);
40 respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); 40 respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
41 if (deployment != null) { 41 if (deployment != null) {
@@ -53,6 +53,6 @@ public interface BpmDefinitionConvert { @@ -53,6 +53,6 @@ public interface BpmDefinitionConvert {
53 53
54 BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean); 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 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO; 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO;
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO; 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,14 +13,14 @@ import org.activiti.engine.repository.ProcessDefinition;
13 * 13 *
14 * @author 芋道源码 14 * @author 芋道源码
15 */ 15 */
16 -@TableName(value = "bpm_process_definition", autoResultMap = true) 16 +@TableName(value = "bpm_process_definition_ext", autoResultMap = true)
17 @Data 17 @Data
18 @EqualsAndHashCode(callSuper = true) 18 @EqualsAndHashCode(callSuper = true)
19 @ToString(callSuper = true) 19 @ToString(callSuper = true)
20 @Builder 20 @Builder
21 @NoArgsConstructor 21 @NoArgsConstructor
22 @AllArgsConstructor 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 package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task; 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 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
@@ -44,13 +44,13 @@ public class BpmProcessInstanceExtDO extends BaseDO { @@ -44,13 +44,13 @@ public class BpmProcessInstanceExtDO extends BaseDO {
44 /** 44 /**
45 * 流程实例的状态 45 * 流程实例的状态
46 * 46 *
47 - * 枚举 {@link ProcessInstanceStatusEnum} 47 + * 枚举 {@link BpmProcessInstanceStatusEnum}
48 */ 48 */
49 private Integer status; 49 private Integer status;
50 /** 50 /**
51 * 结果 51 * 结果
52 * 52 *
53 - * 枚举 {@link ProcessInstanceResultEnum} 53 + * 枚举 {@link BpmProcessInstanceResultEnum}
54 */ 54 */
55 private Integer result; 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 package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; 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 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
@@ -9,10 +9,10 @@ import java.util.Collection; @@ -9,10 +9,10 @@ import java.util.Collection;
9 import java.util.List; 9 import java.util.List;
10 10
11 @Mapper 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,7 +10,7 @@ import lombok.Getter;
10 */ 10 */
11 @Getter 11 @Getter
12 @AllArgsConstructor 12 @AllArgsConstructor
13 -public enum ProcessInstanceResultEnum { 13 +public enum BpmProcessInstanceResultEnum {
14 14
15 PROCESS(1, "处理中"), 15 PROCESS(1, "处理中"),
16 PASS(2, "通过"), 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,7 +10,7 @@ import lombok.Getter;
10 */ 10 */
11 @Getter 11 @Getter
12 @AllArgsConstructor 12 @AllArgsConstructor
13 -public enum ProcessInstanceStatusEnum { 13 +public enum BpmProcessInstanceStatusEnum {
14 14
15 RUNNING(1, "进行中"), 15 RUNNING(1, "进行中"),
16 FINISH(2, "已完成"); 16 FINISH(2, "已完成");
@@ -18,7 +18,7 @@ public enum ProcessInstanceStatusEnum { @@ -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,9 +5,9 @@ import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO; 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageItemRespVO;
6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO; 6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.BpmProcessDefinitionPageReqVO;
7 import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmDefinitionConvert; 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 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.form.BpmFormDO; 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 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
12 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO; 12 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
13 import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService; 13 import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
@@ -56,7 +56,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -56,7 +56,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
56 private BpmFormService bpmFormService; 56 private BpmFormService bpmFormService;
57 57
58 @Resource 58 @Resource
59 - private BpmProcessDefinitionMapper processDefinitionMapper; 59 + private BpmProcessDefinitionExtMapper processDefinitionMapper;
60 60
61 @Override 61 @Override
62 public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { 62 public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
@@ -77,14 +77,14 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -77,14 +77,14 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
77 Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds); 77 Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds);
78 78
79 // 获得 BpmProcessDefinitionDO Map 79 // 获得 BpmProcessDefinitionDO Map
80 - List<BpmProcessDefinitionDO> processDefinitionDOs = Collections.emptyList(); 80 + List<BpmProcessDefinitionExtDO> processDefinitionDOs = Collections.emptyList();
81 processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( 81 processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
82 convertList(processDefinitions, ProcessDefinition::getId)); 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 // 获得 Form Map 86 // 获得 Form Map
87 - Set<Long> formIds = CollectionUtils.convertSet(processDefinitionDOs, BpmProcessDefinitionDO::getFormId); 87 + Set<Long> formIds = CollectionUtils.convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId);
88 Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds); 88 Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
89 89
90 // 拼接结果 90 // 拼接结果
@@ -169,7 +169,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -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 .setProcessDefinitionId(definition.getId()); 173 .setProcessDefinitionId(definition.getId());
174 processDefinitionMapper.insert(definitionDO); 174 processDefinitionMapper.insert(definitionDO);
175 return definition.getId(); 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,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; 3 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
4 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper; 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 import org.activiti.engine.delegate.DelegateExecution; 6 import org.activiti.engine.delegate.DelegateExecution;
7 import org.activiti.engine.delegate.ExecutionListener; 7 import org.activiti.engine.delegate.ExecutionListener;
8 import org.springframework.stereotype.Component; 8 import org.springframework.stereotype.Component;
@@ -29,9 +29,9 @@ public class LeaveApplyEndProcessor implements ExecutionListener { @@ -29,9 +29,9 @@ public class LeaveApplyEndProcessor implements ExecutionListener {
29 OALeaveDO updateDo = new OALeaveDO(); 29 OALeaveDO updateDo = new OALeaveDO();
30 updateDo.setId(Long.valueOf(businessKey)); 30 updateDo.setId(Long.valueOf(businessKey));
31 if (Objects.equals(approved, true)) { 31 if (Objects.equals(approved, true)) {
32 - updateDo.setStatus(ProcessInstanceResultEnum.PASS.getResult()); 32 + updateDo.setStatus(BpmProcessInstanceResultEnum.PASS.getResult());
33 } else { 33 } else {
34 - updateDo.setStatus(ProcessInstanceResultEnum.REJECT.getResult()); 34 + updateDo.setStatus(BpmProcessInstanceResultEnum.REJECT.getResult());
35 } 35 }
36 36
37 leaveMapper.updateById(updateDo); 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,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
6 import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert; 6 import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert;
7 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; 7 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
8 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper; 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 import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService; 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; 11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; 12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper;
@@ -62,7 +62,7 @@ public class OALeaveServiceImpl implements OALeaveService { @@ -62,7 +62,7 @@ public class OALeaveServiceImpl implements OALeaveService {
62 public Long createLeave(OALeaveCreateReqVO createReqVO) { 62 public Long createLeave(OALeaveCreateReqVO createReqVO) {
63 // 插入 OA 请假单 63 // 插入 OA 请假单
64 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO); 64 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
65 - leave.setStatus(ProcessInstanceResultEnum.PROCESS.getResult()); 65 + leave.setStatus(BpmProcessInstanceResultEnum.PROCESS.getResult());
66 // TODO @jason:应该是存储 userId?? 66 // TODO @jason:应该是存储 userId??
67 leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername()); 67 leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
68 leaveMapper.insert(leave); 68 leaveMapper.insert(leave);
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; 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 import javax.validation.Valid; 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,13 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; 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 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
6 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
7 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
8 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; 13 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
9 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
10 import org.activiti.engine.HistoryService; 15 import org.activiti.engine.HistoryService;
11 -import org.activiti.engine.RepositoryService;  
12 import org.activiti.engine.RuntimeService; 16 import org.activiti.engine.RuntimeService;
13 import org.activiti.engine.TaskService; 17 import org.activiti.engine.TaskService;
14 import org.activiti.engine.history.HistoricProcessInstance; 18 import org.activiti.engine.history.HistoricProcessInstance;
@@ -45,8 +49,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -45,8 +49,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
45 public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { 49 public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService {
46 50
47 @Resource 51 @Resource
48 - private RepositoryService repositoryService;  
49 - @Resource  
50 private RuntimeService runtimeService; 52 private RuntimeService runtimeService;
51 @Resource 53 @Resource
52 private TaskService taskService; 54 private TaskService taskService;
@@ -58,7 +60,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -58,7 +60,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
58 @Resource 60 @Resource
59 private BpmProcessDefinitionService processDefinitionService; 61 private BpmProcessDefinitionService processDefinitionService;
60 62
  63 + @Resource
  64 + private BpmProcessInstanceExtMapper processInstanceExtMapper;
  65 +
61 @Override 66 @Override
  67 +// @Transactional(rollbackFor = Exception.class)
62 public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) { 68 public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) {
63 // 校验流程定义 69 // 校验流程定义
64 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); 70 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
@@ -72,6 +78,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -72,6 +78,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
72 // 创建流程实例 78 // 创建流程实例
73 Map<String, Object> variables = createReqVO.getVariables(); 79 Map<String, Object> variables = createReqVO.getVariables();
74 ProcessInstance instance = runtimeService.startProcessInstanceById(createReqVO.getProcessDefinitionId(), variables); 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 // 添加初始的评论 TODO 芋艿:在思考下 86 // 添加初始的评论 TODO 芋艿:在思考下
77 Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); 87 Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
@@ -88,6 +98,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -88,6 +98,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
88 return instance.getId(); 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 public void getMyProcessInstancePage(Long userId) { 115 public void getMyProcessInstancePage(Long userId) {
92 // id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 【标题、状态】「ActBusiness」 116 // id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 【标题、状态】「ActBusiness」
93 // id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 【标题、提交时间】「HistoricProcessInstanceQuery」 117 // id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 【标题、提交时间】「HistoricProcessInstanceQuery」
@@ -103,4 +127,24 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -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,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.io.IoUtil; 4 import cn.hutool.core.io.IoUtil;
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; 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 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; 7 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 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 package cn.iocoder.yudao.framework.activiti.core.util; 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 import org.activiti.engine.impl.identity.Authentication; 5 import org.activiti.engine.impl.identity.Authentication;
4 6
5 /** 7 /**
@@ -9,6 +11,19 @@ import org.activiti.engine.impl.identity.Authentication; @@ -9,6 +11,19 @@ import org.activiti.engine.impl.identity.Authentication;
9 */ 11 */
10 public class ActivitiUtils { 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 public static void setAuthenticatedUserId(Long userId) { 27 public static void setAuthenticatedUserId(Long userId) {
13 Authentication.setAuthenticatedUserId(String.valueOf(userId)); 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,6 +3,7 @@ package cn.iocoder.yudao.framework.mybatis.core.dataobject;
3 import com.baomidou.mybatisplus.annotation.FieldFill; 3 import com.baomidou.mybatisplus.annotation.FieldFill;
4 import com.baomidou.mybatisplus.annotation.TableField; 4 import com.baomidou.mybatisplus.annotation.TableField;
5 import com.baomidou.mybatisplus.annotation.TableLogic; 5 import com.baomidou.mybatisplus.annotation.TableLogic;
  6 +import lombok.Builder;
6 import lombok.Data; 7 import lombok.Data;
7 8
8 import java.io.Serializable; 9 import java.io.Serializable;