Commit d43006dce877cf6a2e9164ffae2ecea6808f3459

Authored by kemengkai
1 parent e52200a2

增加初步驳回功能

dom4j增加失败
Showing 50 changed files with 1079 additions and 169 deletions
sql/ruoyi-vue-pro.sql
@@ -546,6 +546,7 @@ COMMIT; @@ -546,6 +546,7 @@ COMMIT;
546 DROP TABLE IF EXISTS `bpm_task_ext`; 546 DROP TABLE IF EXISTS `bpm_task_ext`;
547 CREATE TABLE `bpm_task_ext` ( 547 CREATE TABLE `bpm_task_ext` (
548 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', 548 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  549 + `task_def_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程任务key',
549 `assignee_user_id` bigint DEFAULT NULL COMMENT '任务的审批人', 550 `assignee_user_id` bigint DEFAULT NULL COMMENT '任务的审批人',
550 `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务的名字', 551 `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务的名字',
551 `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务的编号', 552 `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务的编号',
yudao-dependencies/pom.xml
@@ -65,6 +65,7 @@ @@ -65,6 +65,7 @@
65 <tencentcloud-sdk-java.version>3.1.471</tencentcloud-sdk-java.version> 65 <tencentcloud-sdk-java.version>3.1.471</tencentcloud-sdk-java.version>
66 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version> 66 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
67 <justauth.version>1.4.0</justauth.version> 67 <justauth.version>1.4.0</justauth.version>
  68 + <dom4j.version>2.1.3</dom4j.version>
68 </properties> 69 </properties>
69 70
70 <dependencyManagement> 71 <dependencyManagement>
@@ -578,7 +579,13 @@ @@ -578,7 +579,13 @@
578 <artifactId>justauth-spring-boot-starter</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) --> 579 <artifactId>justauth-spring-boot-starter</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) -->
579 <version>${justauth.version}</version> 580 <version>${justauth.version}</version>
580 </dependency> 581 </dependency>
581 - 582 + <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
  583 + <!-- XML读写框架 -->
  584 + <dependency>
  585 + <groupId>org.dom4j</groupId>
  586 + <artifactId>dom4j</artifactId>
  587 + <version>${dom4j.version}</version>
  588 + </dependency>
582 </dependencies> 589 </dependencies>
583 </dependencyManagement> 590 </dependencyManagement>
584 591
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
@@ -58,7 +58,8 @@ public class YudaoSwaggerAutoConfiguration { @@ -58,7 +58,8 @@ public class YudaoSwaggerAutoConfiguration {
58 .build() 58 .build()
59 .securitySchemes(securitySchemes()) 59 .securitySchemes(securitySchemes())
60 .globalRequestParameters(globalRequestParameters()) 60 .globalRequestParameters(globalRequestParameters())
61 - .securityContexts(securityContexts()); 61 + .securityContexts(securityContexts())
  62 + .host("http://localhost:48080");
62 } 63 }
63 64
64 // ========== apiInfo ========== 65 // ========== apiInfo ==========
yudao-module-bpm/yudao-module-bpm-biz/pom.xml
@@ -10,6 +10,10 @@ @@ -10,6 +10,10 @@
10 <modelVersion>4.0.0</modelVersion> 10 <modelVersion>4.0.0</modelVersion>
11 <artifactId>yudao-module-bpm-biz</artifactId> 11 <artifactId>yudao-module-bpm-biz</artifactId>
12 12
  13 + <properties>
  14 + <dom4j.version>2.1.3</dom4j.version>
  15 + </properties>
  16 +
13 <name>${project.artifactId}</name> 17 <name>${project.artifactId}</name>
14 <description> 18 <description>
15 bpm-base 模块,实现公用的工作流的逻辑,提供给 bpm-activiti 和 bpm-flowable 复用 19 bpm-base 模块,实现公用的工作流的逻辑,提供给 bpm-activiti 和 bpm-flowable 复用
@@ -36,6 +40,10 @@ @@ -36,6 +40,10 @@
36 <groupId>cn.iocoder.boot</groupId> 40 <groupId>cn.iocoder.boot</groupId>
37 <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId> 41 <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
38 </dependency> 42 </dependency>
  43 + <dependency>
  44 + <groupId>cn.iocoder.boot</groupId>
  45 + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
  46 + </dependency>
39 47
40 <!-- Web 相关 --> 48 <!-- Web 相关 -->
41 <dependency> 49 <dependency>
@@ -77,5 +85,11 @@ @@ -77,5 +85,11 @@
77 <version>1.4.196</version> 85 <version>1.4.196</version>
78 <scope>test</scope> 86 <scope>test</scope>
79 </dependency> 87 </dependency>
  88 + <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
  89 + <!-- XML读写框架 -->
  90 + <dependency>
  91 + <groupId>org.dom4j</groupId>
  92 + <artifactId>dom4j</artifactId>
  93 + </dependency>
80 </dependencies> 94 </dependencies>
81 </project> 95 </project>
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
7 import io.swagger.annotations.Api; 7 import io.swagger.annotations.Api;
8 import io.swagger.annotations.ApiImplicitParam; 8 import io.swagger.annotations.ApiImplicitParam;
9 import io.swagger.annotations.ApiOperation; 9 import io.swagger.annotations.ApiOperation;
  10 +import org.apache.ibatis.annotations.Param;
10 import org.flowable.bpmn.model.BpmnModel; 11 import org.flowable.bpmn.model.BpmnModel;
11 import org.flowable.engine.TaskService; 12 import org.flowable.engine.TaskService;
12 import org.springframework.security.access.prepost.PreAuthorize; 13 import org.springframework.security.access.prepost.PreAuthorize;
@@ -17,6 +18,7 @@ import javax.annotation.Resource; @@ -17,6 +18,7 @@ import javax.annotation.Resource;
17 import javax.validation.Valid; 18 import javax.validation.Valid;
18 19
19 import java.util.List; 20 import java.util.List;
  21 +import java.util.Objects;
20 22
21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; 24 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
@@ -49,10 +51,17 @@ public class BpmTaskController { @@ -49,10 +51,17 @@ public class BpmTaskController {
49 @ApiImplicitParam(name = "processInstanceId", value = "流程实例的编号", required = true, dataTypeClass = String.class) 51 @ApiImplicitParam(name = "processInstanceId", value = "流程实例的编号", required = true, dataTypeClass = String.class)
50 @PreAuthorize("@ss.hasPermission('bpm:task:query')") 52 @PreAuthorize("@ss.hasPermission('bpm:task:query')")
51 public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId( 53 public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId(
52 - @RequestParam("processInstanceId") String processInstanceId) { 54 + @RequestParam("processInstanceId") String processInstanceId) {
53 return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); 55 return success(taskService.getTaskListByProcessInstanceId(processInstanceId));
54 } 56 }
55 57
  58 + @GetMapping("/get")
  59 + @ApiOperation(value = "获取审批单详情", notes = "包括完成的、未完成的")
  60 + @ApiImplicitParam(name = "taskId", value = "任务Id", required = true, dataTypeClass = String.class)
  61 + public CommonResult<Object> getTask(@Param("taskId") String processInstanceId) {
  62 + return success(taskService.getTaskInfo(processInstanceId));
  63 + }
  64 +
56 @PutMapping("/approve") 65 @PutMapping("/approve")
57 @ApiOperation("通过任务") 66 @ApiOperation("通过任务")
58 @PreAuthorize("@ss.hasPermission('bpm:task:update')") 67 @PreAuthorize("@ss.hasPermission('bpm:task:update')")
@@ -76,13 +85,14 @@ public class BpmTaskController { @@ -76,13 +85,14 @@ public class BpmTaskController {
76 taskService.updateTaskAssignee(getLoginUserId(), reqVO); 85 taskService.updateTaskAssignee(getLoginUserId(), reqVO);
77 return success(true); 86 return success(true);
78 } 87 }
  88 +
79 @PutMapping("/back") 89 @PutMapping("/back")
80 @ApiOperation(value = "回退") 90 @ApiOperation(value = "回退")
81 -// @PreAuthorize("@ss.hasPermission('bpm:task:back')")  
82 - public CommonResult<Boolean> backTask(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { 91 + // @PreAuthorize("@ss.hasPermission('bpm:task:back')")
  92 + public CommonResult<Boolean> backTask(@Valid @RequestBody BpmTaskBackReqVO reqVO) {
83 //先硬编码到 回退到第一个审批节点 93 //先硬编码到 回退到第一个审批节点
84 - String destinationTaskDefKey = "task01";  
85 - taskService.backTask(reqVO.getId(),destinationTaskDefKey);  
86 - return success(true); 94 + // String destinationTaskDefKey = "task01";
  95 + return taskService.backTask(reqVO);
  96 +
87 } 97 }
88 } 98 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskBackReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +/**
  12 + * @author kemengkai
  13 + * @create 2022-05-07 08:05
  14 + */
  15 +@Data
  16 +@AllArgsConstructor
  17 +@NoArgsConstructor
  18 +public class BpmTaskBackReqVO {
  19 +
  20 + @ApiModelProperty(value = "用户id", required = true, example = "1")
  21 + @NotEmpty(message = "用户id不能为空")
  22 + private String userId;
  23 +
  24 + @ApiModelProperty(value = "流程编号id", required = true, example = "730da750-cc4f-11ec-b58e-1e429355e4a0")
  25 + @NotEmpty(message = "流程编号id不能为空")
  26 + private String procInstId;
  27 +
  28 + @ApiModelProperty(value = "当前任务id", required = true, example = "730da750-cc4f-11ec-b58e-1e429355e4a0")
  29 + @NotEmpty(message = "当前任务id不能为空")
  30 + private String taskId;
  31 +
  32 + @ApiModelProperty(value = "当前流程任务id", required = true, example = "Activity_1jlembv")
  33 + @NotNull(message = "当前流程任务id不能为空")
  34 + private String oldTaskDefKey;
  35 +
  36 + @ApiModelProperty(value = "准备回退的流程任务id", required = true, example = "task01")
  37 + @NotNull(message = "准备回退流程任务id不能为空")
  38 + private String newTaskDefKey;
  39 +
  40 + @ApiModelProperty(value = "审批结果", required = true, example = "任务驳回")
  41 + @NotNull(message = "审批结果")
  42 + private String comment;
  43 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
@@ -35,5 +35,4 @@ public class BpmTaskRespVO extends BpmTaskDonePageItemRespVO { @@ -35,5 +35,4 @@ public class BpmTaskRespVO extends BpmTaskDonePageItemRespVO {
35 private String deptName; 35 private String deptName;
36 36
37 } 37 }
38 -  
39 } 38 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java
1 package cn.iocoder.yudao.module.bpm.convert.task; 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2
3 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; 3 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO;
  4 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
4 import org.flowable.engine.history.HistoricActivityInstance; 5 import org.flowable.engine.history.HistoricActivityInstance;
5 import org.mapstruct.Mapper; 6 import org.mapstruct.Mapper;
6 import org.mapstruct.Mapping; 7 import org.mapstruct.Mapping;
@@ -19,11 +20,11 @@ public interface BpmActivityConvert { @@ -19,11 +20,11 @@ public interface BpmActivityConvert {
19 20
20 BpmActivityConvert INSTANCE = Mappers.getMapper(BpmActivityConvert.class); 21 BpmActivityConvert INSTANCE = Mappers.getMapper(BpmActivityConvert.class);
21 22
22 - List<BpmActivityRespVO> convertList(List<HistoricActivityInstance> list); 23 + List<BpmActivityRespVO> convertList(List<BpmActivityDO> list);
23 24
24 @Mappings({ 25 @Mappings({
25 @Mapping(source = "activityId", target = "key"), 26 @Mapping(source = "activityId", target = "key"),
26 @Mapping(source = "activityType", target = "type") 27 @Mapping(source = "activityType", target = "type")
27 }) 28 })
28 - BpmActivityRespVO convert(HistoricActivityInstance bean); 29 + BpmActivityRespVO convert(BpmActivityDO bean);
29 } 30 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
1 package cn.iocoder.yudao.module.bpm.convert.task; 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2
  3 +import cn.hutool.core.util.BooleanUtil;
3 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO;
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
8 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  10 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
9 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; 11 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
10 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 12 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 13 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -17,9 +19,10 @@ import org.flowable.task.api.Task; @@ -17,9 +19,10 @@ import org.flowable.task.api.Task;
17 import org.flowable.task.api.history.HistoricTaskInstance; 19 import org.flowable.task.api.history.HistoricTaskInstance;
18 import org.mapstruct.*; 20 import org.mapstruct.*;
19 import org.mapstruct.factory.Mappers; 21 import org.mapstruct.factory.Mappers;
  22 +import org.springframework.beans.BeanUtils;
20 23
21 -import java.util.List;  
22 -import java.util.Map; 24 +import java.util.*;
  25 +import java.util.stream.Collectors;
23 26
24 /** 27 /**
25 * Bpm 任务 Convert 28 * Bpm 任务 Convert
@@ -31,8 +34,37 @@ public interface BpmTaskConvert { @@ -31,8 +34,37 @@ public interface BpmTaskConvert {
31 34
32 BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); 35 BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class);
33 36
34 - default List<BpmTaskTodoPageItemRespVO> convertList1(List<Task> tasks, Map<String, ProcessInstance> processInstanceMap,  
35 - Map<Long, AdminUserRespDTO> userMap) { 37 + /**
  38 + * 复制对象
  39 + *
  40 + * @param source 源 要复制的对象
  41 + * @param target 目标 复制到此对象
  42 + * @param <T>
  43 + *
  44 + * @return
  45 + */
  46 + public static <T> T copy(Object source, Class<T> target) {
  47 + if (source == null || target == null) {
  48 + return null;
  49 + }
  50 + try {
  51 + T newInstance = target.newInstance();
  52 + BeanUtils.copyProperties(source, newInstance);
  53 + return newInstance;
  54 + } catch (Exception e) {
  55 + throw new RuntimeException(e);
  56 + }
  57 + }
  58 +
  59 + default <T, K> List<K> copyList(List<T> source, Class<K> target) {
  60 + if (null == source || source.isEmpty()) {
  61 + return Collections.emptyList();
  62 + }
  63 + return source.stream().map(e -> copy(e, target)).collect(Collectors.toList());
  64 + }
  65 +
  66 + default List<BpmTaskTodoPageItemRespVO> convertList1(List<Task> tasks,
  67 + Map<String, ProcessInstance> processInstanceMap, Map<Long, AdminUserRespDTO> userMap) {
36 return CollectionUtils.convertList(tasks, task -> { 68 return CollectionUtils.convertList(tasks, task -> {
37 BpmTaskTodoPageItemRespVO respVO = convert1(task); 69 BpmTaskTodoPageItemRespVO respVO = convert1(task);
38 ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId()); 70 ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId());
@@ -49,13 +81,12 @@ public interface BpmTaskConvert { @@ -49,13 +81,12 @@ public interface BpmTaskConvert {
49 81
50 @Named("convertSuspendedToSuspensionState") 82 @Named("convertSuspendedToSuspensionState")
51 default Integer convertSuspendedToSuspensionState(boolean suspended) { 83 default Integer convertSuspendedToSuspensionState(boolean suspended) {
52 - return suspended ? SuspensionState.SUSPENDED.getStateCode() :  
53 - SuspensionState.ACTIVE.getStateCode(); 84 + return suspended ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode();
54 } 85 }
55 86
56 - default List<BpmTaskDonePageItemRespVO> convertList2(List<HistoricTaskInstance> tasks, Map<String, BpmTaskExtDO> bpmTaskExtDOMap,  
57 - Map<String, HistoricProcessInstance> historicProcessInstanceMap,  
58 - Map<Long, AdminUserRespDTO> userMap) { 87 + default List<BpmTaskDonePageItemRespVO> convertList2(List<HistoricTaskInstance> tasks,
  88 + Map<String, BpmTaskExtDO> bpmTaskExtDOMap, Map<String, HistoricProcessInstance> historicProcessInstanceMap,
  89 + Map<Long, AdminUserRespDTO> userMap) {
59 return CollectionUtils.convertList(tasks, task -> { 90 return CollectionUtils.convertList(tasks, task -> {
60 BpmTaskDonePageItemRespVO respVO = convert2(task); 91 BpmTaskDonePageItemRespVO respVO = convert2(task);
61 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); 92 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId());
@@ -71,18 +102,16 @@ public interface BpmTaskConvert { @@ -71,18 +102,16 @@ public interface BpmTaskConvert {
71 102
72 BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean); 103 BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean);
73 104
74 - @Mappings({  
75 - @Mapping(source = "processInstance.id", target = "id"),  
76 - @Mapping(source = "processInstance.name", target = "name"),  
77 - @Mapping(source = "processInstance.startUserId", target = "startUserId"),  
78 - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),  
79 - @Mapping(source = "startUser.nickname", target = "startUserNickname")  
80 - }) 105 + @Mappings({@Mapping(source = "processInstance.id", target = "id"),
  106 + @Mapping(source = "processInstance.name", target = "name"),
  107 + @Mapping(source = "processInstance.startUserId", target = "startUserId"),
  108 + @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),
  109 + @Mapping(source = "startUser.nickname", target = "startUserNickname")})
81 BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); 110 BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser);
82 111
83 - default List<BpmTaskRespVO> convertList3(List<HistoricTaskInstance> tasks, Map<String, BpmTaskExtDO> bpmTaskExtDOMap,  
84 - HistoricProcessInstance processInstance, Map<Long, AdminUserRespDTO> userMap,  
85 - Map<Long, DeptRespDTO> deptMap) { 112 + default List<BpmTaskRespVO> convertList3(List<HistoricTaskInstance> tasks,
  113 + Map<String, BpmTaskExtDO> bpmTaskExtDOMap, HistoricProcessInstance processInstance,
  114 + Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
86 return CollectionUtils.convertList(tasks, task -> { 115 return CollectionUtils.convertList(tasks, task -> {
87 BpmTaskRespVO respVO = convert3(task); 116 BpmTaskRespVO respVO = convert3(task);
88 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); 117 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId());
@@ -111,37 +140,56 @@ public interface BpmTaskConvert { @@ -111,37 +140,56 @@ public interface BpmTaskConvert {
111 @Mapping(target = "id", ignore = true) 140 @Mapping(target = "id", ignore = true)
112 void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); 141 void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to);
113 142
114 - @Mappings({  
115 - @Mapping(source = "processInstance.id", target = "id"),  
116 - @Mapping(source = "processInstance.name", target = "name"),  
117 - @Mapping(source = "processInstance.startUserId", target = "startUserId"),  
118 - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),  
119 - @Mapping(source = "startUser.nickname", target = "startUserNickname")  
120 - })  
121 - BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser);  
122 -  
123 - default BpmTaskExtDO convert2TaskExt(Task task){  
124 - BpmTaskExtDO taskExtDO = new BpmTaskExtDO()  
125 - .setTaskId(task.getId())  
126 - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee()))  
127 - .setName(task.getName())  
128 - .setProcessDefinitionId(task.getProcessDefinitionId())  
129 - .setProcessInstanceId(task.getProcessInstanceId()); 143 + @Mappings({@Mapping(source = "processInstance.id", target = "id"),
  144 + @Mapping(source = "processInstance.name", target = "name"),
  145 + @Mapping(source = "processInstance.startUserId", target = "startUserId"),
  146 + @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),
  147 + @Mapping(source = "startUser.nickname", target = "startUserNickname")})
  148 + BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance,
  149 + AdminUserRespDTO startUser);
  150 +
  151 + default BpmTaskExtDO convert2TaskExt(Task task) {
  152 + BpmTaskExtDO taskExtDO = new BpmTaskExtDO().setTaskId(task.getId()).setTaskDefKey(task.getTaskDefinitionKey())
  153 + .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setName(task.getName())
  154 + .setProcessDefinitionId(task.getProcessDefinitionId()).setProcessInstanceId(task.getProcessInstanceId());
130 taskExtDO.setCreateTime(task.getCreateTime()); 155 taskExtDO.setCreateTime(task.getCreateTime());
131 return taskExtDO; 156 return taskExtDO;
132 } 157 }
133 158
134 - default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, Task task) { 159 + default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser,
  160 + Task task) {
135 BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); 161 BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO();
136 reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId()) 162 reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId())
137 - .setProcessInstanceName(processInstance.getName())  
138 - .setStartUserId(startUser.getId())  
139 - .setStartUserNickname(startUser.getNickname())  
140 - .setTaskId(task.getId())  
141 - .setTaskName(task.getName())  
142 - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())); 163 + .setProcessInstanceName(processInstance.getName()).setStartUserId(startUser.getId())
  164 + .setStartUserNickname(startUser.getNickname()).setTaskId(task.getId()).setTaskName(task.getName())
  165 + .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee()));
143 return reqDTO; 166 return reqDTO;
144 } 167 }
145 -}  
146 -  
147 168
  169 + /**
  170 + * bpmTaskExtDo 类数据去重
  171 + *
  172 + * @param bpmTaskExtDOList bpmTaskExtDo 类列表
  173 + *
  174 + * @return 返回新的list
  175 + */
  176 + default List<BpmTaskExtDO> distinct(List<BpmTaskExtDO> bpmTaskExtDOList) {
  177 + HashMap<String, BpmTaskExtDO> tmpMap = new HashMap<>(50);
  178 + List<BpmTaskExtDO> result = new ArrayList<>();
  179 + for (BpmTaskExtDO bpmTaskExtDO : bpmTaskExtDOList) {
  180 + boolean containsResult = tmpMap.containsKey(bpmTaskExtDO.getTaskDefKey());
  181 + if (BooleanUtil.isFalse(containsResult)) {
  182 + tmpMap.put(bpmTaskExtDO.getTaskDefKey(), bpmTaskExtDO);
  183 + }
  184 + BpmTaskExtDO tmpBpmTaskExtDO = tmpMap.get(bpmTaskExtDO.getTaskDefKey());
  185 + if (bpmTaskExtDO.getTaskDefKey().equals(tmpBpmTaskExtDO.getTaskDefKey())) {
  186 + if (!bpmTaskExtDO.getResult().equals(BpmProcessInstanceResultEnum.PROCESS.getResult())) {
  187 + tmpMap.remove(bpmTaskExtDO.getTaskDefKey());
  188 + tmpMap.put(bpmTaskExtDO.getTaskDefKey(), bpmTaskExtDO);
  189 + }
  190 + }
  191 + }
  192 + tmpMap.forEach((key, var) -> result.add(var));
  193 + return result;
  194 + }
  195 +}
148 \ No newline at end of file 196 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java
1 package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 4 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmModelFormTypeEnum;
5 import com.baomidou.mybatisplus.annotation.TableField; 5 import com.baomidou.mybatisplus.annotation.TableField;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java
@@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; 4 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
5 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;  
6 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; 5 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskAssignRuleTypeEnum;
  6 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskRuleScriptEnum;
7 import com.baomidou.mybatisplus.annotation.TableField; 7 import com.baomidou.mybatisplus.annotation.TableField;
8 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java
1 package cn.iocoder.yudao.module.bpm.dal.dataobject.oa; 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
2 2
3 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 3 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
4 import lombok.*; 4 import lombok.*;
5 import java.util.*; 5 import java.util.*;
6 import com.baomidou.mybatisplus.annotation.*; 6 import com.baomidou.mybatisplus.annotation.*;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmActivityDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonFormat;
  4 +import lombok.*;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.util.Date;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;
  11 +
  12 +/**
  13 + * 任务流程关联表
  14 + *
  15 + * @author kemengkai
  16 + * @create 2022-05-09 10:33
  17 + */
  18 +@Data
  19 +@AllArgsConstructor
  20 +@NoArgsConstructor
  21 +public class BpmActivityDO {
  22 +
  23 + /**
  24 + * 任务流程关联id
  25 + */
  26 + private String id;
  27 +
  28 + /**
  29 + * 审批结果
  30 + */
  31 + private Integer rev;
  32 +
  33 + /**
  34 + * 任务流程部署id
  35 + */
  36 + private String procDefId;
  37 +
  38 + /**
  39 + * 任务流程id
  40 + */
  41 + private String processInstanceId;
  42 +
  43 + /**
  44 + * 任务执行id
  45 + */
  46 + private String executionId;
  47 +
  48 + /**
  49 + * 任务key
  50 + */
  51 + private String activityId;
  52 +
  53 + /**
  54 + * 任务id
  55 + */
  56 + private String taskId;
  57 +
  58 + /**
  59 + * 调用流程id
  60 + */
  61 + private String callProcInstId;
  62 +
  63 + /**
  64 + * 任务名称
  65 + */
  66 + private String activityName;
  67 +
  68 + /**
  69 + * 任务类型
  70 + */
  71 + private String activityType;
  72 +
  73 + /**
  74 + * 任务审批人id
  75 + */
  76 + private String assignee;
  77 +
  78 + /**
  79 + * 任务开始时间
  80 + */
  81 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  82 + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
  83 + private Date startTime;
  84 +
  85 + /**
  86 + * 任务结束时间
  87 + */
  88 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  89 + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
  90 + private Date endTime;
  91 +
  92 + private Integer transactionOrder;
  93 +
  94 + private Long duration;
  95 +
  96 + /**
  97 + * 删除结果
  98 + */
  99 + private String deleteReason;
  100 +
  101 + /**
  102 + * 租户id
  103 + */
  104 + private String tenantId;
  105 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java
1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task; 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;  
5 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; 4 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
  5 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceStatusEnum;
6 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
8 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java
1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task; 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 4 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
5 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.Data; 7 import lombok.Data;
@@ -27,6 +27,11 @@ public class BpmTaskExtDO extends BaseDO { @@ -27,6 +27,11 @@ public class BpmTaskExtDO extends BaseDO {
27 */ 27 */
28 @TableId 28 @TableId
29 private Long id; 29 private Long id;
  30 +
  31 + /**
  32 + * 流程任务key
  33 + */
  34 + private String taskDefKey;
30 /** 35 /**
31 * 任务的审批人 36 * 任务的审批人
32 * 37 *
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmActivityMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.dal.mysql.task;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +import org.apache.ibatis.annotations.Param;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * @author kemengkai
  12 + * @create 2022-05-09 09:26
  13 + */
  14 +@Mapper
  15 +public interface BpmActivityMapper extends BaseMapperX<BpmActivityDO> {
  16 +
  17 + /**
  18 + * 获取所有历史任务
  19 + *
  20 + * @return 返回历史任务
  21 + */
  22 + List<BpmActivityDO> listAll();
  23 +
  24 + /**
  25 + * 获取指定流程的历史任务
  26 + *
  27 + * @param procInstId 流程id
  28 + *
  29 + * @return 返回历史任务
  30 + */
  31 + List<BpmActivityDO> listAllByProcInstIdAndDelete(@Param("procInstId") String procInstId);
  32 +
  33 + /**
  34 + * 逻辑删除hiActInst表任务
  35 + *
  36 + * @param taskIdList 任务列表
  37 + *
  38 + * @return 返回是否成功
  39 + */
  40 + Boolean delHiActInstByTaskId(@Param("taskIdList") List<String> taskIdList);
  41 +
  42 + /**
  43 + * 逻辑删除hiTaskInst任务
  44 + *
  45 + * @param taskIdList 任务列表
  46 + *
  47 + * @return 返回是否成功
  48 + */
  49 + Boolean delHiTaskInstByTaskId(@Param("taskIdList") List<String> taskIdList);
  50 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java
1 package cn.iocoder.yudao.module.bpm.dal.mysql.task; 1 package cn.iocoder.yudao.module.bpm.dal.mysql.task;
2 2
  3 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
3 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; 4 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,14 +21,43 @@ public interface BpmTaskExtMapper extends BaseMapperX&lt;BpmTaskExtDO&gt; { @@ -20,14 +21,43 @@ public interface BpmTaskExtMapper extends BaseMapperX&lt;BpmTaskExtDO&gt; {
20 return selectList(BpmTaskExtDO::getTaskId, taskIds); 21 return selectList(BpmTaskExtDO::getTaskId, taskIds);
21 } 22 }
22 23
  24 + /**
  25 + * 查询任务
  26 + *
  27 + * @param procInstId 流程id
  28 + *
  29 + * @return 返回任务列表
  30 + */
  31 + @TenantIgnore
  32 + List<BpmTaskExtDO> listByProcInstId(@Param("procInstId") String procInstId);
  33 +
23 default List<BpmTaskExtDO> selectListByProcessInstanceId(String processInstanceId) { 34 default List<BpmTaskExtDO> selectListByProcessInstanceId(String processInstanceId) {
24 return selectList("process_instance_id", processInstanceId); 35 return selectList("process_instance_id", processInstanceId);
25 } 36 }
26 37
27 /** 38 /**
28 - * 修改或签任务信息 39 + * 删除非当前相同taskDefKey非进行中的任务
29 * 40 *
30 * @param entity 任务信息 41 * @param entity 任务信息
31 */ 42 */
32 - void updateUserOrSignTask(@Param("entity") BpmTaskExtDO entity); 43 + void delTaskByProcInstIdAndTaskIdAndTaskDefKey(@Param("entity") BpmTaskExtDO entity);
  44 +
  45 + /**
  46 + * 任务驳回
  47 + *
  48 + * @param taskId 任务列表
  49 + * @param comment 驳回理由
  50 + *
  51 + * @return 返回驳回结果,是否成功
  52 + */
  53 + Boolean backByTaskId(@Param("taskId") String taskId, @Param("comment") String comment);
  54 +
  55 + /**
  56 + * 逻辑删除任务
  57 + *
  58 + * @param taskIdList 任务id列表
  59 + *
  60 + * @return 返回是否成功
  61 + */
  62 + Boolean delByTaskIds(@Param("taskIdList") List<String> taskIdList);
33 } 63 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/definition/BpmModelFormTypeEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.definition; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.definition;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/definition/BpmTaskAssignRuleTypeEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.definition; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.definition;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/definition/BpmTaskRuleScriptEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.definition; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.definition;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/message/BpmMessageEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.message; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.message;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/task/BpmProcessInstanceDeleteReasonEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.task; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.task;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/task/BpmProcessInstanceResultEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.task; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.task;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
@@ -15,7 +15,8 @@ public enum BpmProcessInstanceResultEnum { @@ -15,7 +15,8 @@ public enum BpmProcessInstanceResultEnum {
15 PROCESS(1, "处理中"), 15 PROCESS(1, "处理中"),
16 APPROVE(2, "通过"), 16 APPROVE(2, "通过"),
17 REJECT(3, "不通过"), 17 REJECT(3, "不通过"),
18 - CANCEL(4, "已取消"); 18 + CANCEL(4, "已取消"),
  19 + BACK(5, "退回/驳回");
19 20
20 /** 21 /**
21 * 结果 22 * 结果
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/enums/task/BpmProcessInstanceStatusEnum.java
1 -package cn.iocoder.yudao.module.bpm.enums.task; 1 +package cn.iocoder.yudao.module.bpm.domain.enums.task;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/domain/vo/ApproveProcInstVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.domain.vo;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import java.time.LocalDate;
  9 +
  10 +/**
  11 + * 审批流程VO
  12 + *
  13 + * @author kemengkai
  14 + */
  15 +@Data
  16 +@AllArgsConstructor
  17 +@NoArgsConstructor
  18 +public class ApproveProcInstVO {
  19 +
  20 + @ApiModelProperty("任务id")
  21 + private String id;
  22 + @ApiModelProperty("任务部署key")
  23 + private String taskDefKey;
  24 + @ApiModelProperty("任务名称")
  25 + private String name;
  26 + @ApiModelProperty("审批人登录名")
  27 + private String assignee;
  28 + @ApiModelProperty("审批人姓名")
  29 + private String assigneeName;
  30 + @ApiModelProperty("审批回复")
  31 + private String taskComment;
  32 + @ApiModelProperty("审批完成时间")
  33 + private LocalDate endTime;
  34 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmSecurityConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.framework.bpm.config;
  2 +
  3 +import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.context.annotation.Configuration;
  6 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  7 +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
  8 +
  9 +/**
  10 + * @author kemengkai
  11 + * @create 2022-05-07 08:15
  12 + */
  13 +@Configuration("bpmSecurityConfiguration")
  14 +public class BpmSecurityConfiguration {
  15 +
  16 + @Bean("bpmAuthorizeRequestsCustomizer")
  17 + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
  18 + return new AuthorizeRequestsCustomizer() {
  19 +
  20 + @Override
  21 + public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
  22 + // 任务回退接口
  23 + registry.antMatchers(buildAdminApi("/bpm/task/back")).permitAll();
  24 + }
  25 +
  26 + };
  27 + }
  28 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceActivityBehavior.java
@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; 6 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
7 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; 7 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskAssignRuleTypeEnum;
8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; 8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
9 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; 9 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService;
10 import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; 10 import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java
@@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; 7 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
8 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO;
10 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; 10 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskAssignRuleTypeEnum;
11 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; 11 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
12 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; 12 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService;
13 import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; 13 import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java
1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script; 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script;
2 2
3 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; 3 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskRuleScriptEnum;
4 import org.flowable.task.service.impl.persistence.entity.TaskEntity; 4 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
5 5
6 import java.util.Set; 6 import java.util.Set;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java
1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
2 2
3 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; 3 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
4 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; 4 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskRuleScriptEnum;
5 import org.flowable.task.service.impl.persistence.entity.TaskEntity; 5 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
7 7
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java
1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
2 2
3 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; 3 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
4 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; 4 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskRuleScriptEnum;
5 import org.flowable.task.service.impl.persistence.entity.TaskEntity; 5 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
7 7
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl
2 2
3 import cn.iocoder.yudao.framework.common.util.collection.SetUtils; 3 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; 5 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskRuleScriptEnum;
6 6
7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; 7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
8 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 8 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java
@@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert;
9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
10 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; 10 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper;
11 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; 11 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
12 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 12 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmModelFormTypeEnum;
13 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; 13 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO;
14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
15 import cn.iocoder.yudao.framework.common.pojo.PageResult; 15 import cn.iocoder.yudao.framework.common.pojo.PageResult;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
@@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; 10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
11 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; 11 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
13 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 13 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmModelFormTypeEnum;
14 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; 14 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
15 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; 15 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
16 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java
@@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.bpm.convert.definition.BpmTaskAssignRuleConvert; @@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.bpm.convert.definition.BpmTaskAssignRuleConvert;
13 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; 13 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
14 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; 14 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
15 import cn.iocoder.yudao.module.bpm.enums.DictTypeConstants; 15 import cn.iocoder.yudao.module.bpm.enums.DictTypeConstants;
16 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; 16 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskAssignRuleTypeEnum;
17 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 17 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
18 import cn.iocoder.yudao.module.system.api.dept.PostApi; 18 import cn.iocoder.yudao.module.system.api.dept.PostApi;
19 import cn.iocoder.yudao.module.system.api.dict.DictDataApi; 19 import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java
1 package cn.iocoder.yudao.module.bpm.service.definition.dto; 1 package cn.iocoder.yudao.module.bpm.service.definition.dto;
2 2
3 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 3 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmModelFormTypeEnum;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.definition.dto; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.definition.dto;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 5 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmModelFormTypeEnum;
6 import lombok.Data; 6 import lombok.Data;
7 7
8 import javax.validation.constraints.AssertTrue; 8 import javax.validation.constraints.AssertTrue;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.message; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.message;
2 2
3 import cn.iocoder.yudao.framework.web.config.WebProperties; 3 import cn.iocoder.yudao.framework.web.config.WebProperties;
4 import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert; 4 import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert;
5 -import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum; 5 +import cn.iocoder.yudao.module.bpm.domain.enums.message.BpmMessageEnum;
6 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; 6 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
7 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; 7 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
8 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; 8 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java
@@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
9 import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; 9 import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;
10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
11 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper;
12 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 12 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
13 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
14 import org.springframework.transaction.annotation.Transactional; 14 import org.springframework.transaction.annotation.Transactional;
15 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java
1 package cn.iocoder.yudao.module.bpm.service.task; 1 package cn.iocoder.yudao.module.bpm.service.task;
2 2
3 -import cn.hutool.core.io.IoUtil;  
4 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 3 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; 4 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO;
6 import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert; 5 import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert;
7 -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; 6 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
  7 +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
8 import lombok.extern.slf4j.Slf4j; 8 import lombok.extern.slf4j.Slf4j;
9 9
10 -import org.flowable.bpmn.model.BpmnModel;  
11 import org.flowable.engine.HistoryService; 10 import org.flowable.engine.HistoryService;
12 -import org.flowable.engine.history.HistoricActivityInstance;  
13 -import org.flowable.engine.history.HistoricProcessInstance;  
14 -import org.flowable.image.ProcessDiagramGenerator;  
15 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
16 import org.springframework.validation.annotation.Validated; 12 import org.springframework.validation.annotation.Validated;
17 13
18 import javax.annotation.Resource; 14 import javax.annotation.Resource;
19 -import java.io.InputStream;  
20 -import java.util.Collections;  
21 import java.util.List; 15 import java.util.List;
22 16
23 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
24 -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_BPMN_MODEL_NOT_EXISTS;  
25 -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;  
26 17
27 /** 18 /**
28 * BPM 活动实例 Service 实现类 19 * BPM 活动实例 Service 实现类
@@ -36,14 +27,15 @@ public class BpmActivityServiceImpl implements BpmActivityService { @@ -36,14 +27,15 @@ public class BpmActivityServiceImpl implements BpmActivityService {
36 27
37 @Resource 28 @Resource
38 private HistoryService historyService; 29 private HistoryService historyService;
  30 + @Resource
  31 + private BpmActivityMapper bpmActivityMapper;
39 32
40 @Override 33 @Override
41 - public List<BpmActivityRespVO> getActivityListByProcessInstanceId(String processInstanceId) {  
42 - List<HistoricActivityInstance> activityList = historyService.createHistoricActivityInstanceQuery()  
43 - .processInstanceId(processInstanceId).list();  
44 - return BpmActivityConvert.INSTANCE.convertList(activityList); 34 + @TenantIgnore
  35 + public List<BpmActivityRespVO> getActivityListByProcessInstanceId(String procInstId) {
  36 +// List<HistoricActivityInstance> activityList = historyService.createHistoricActivityInstanceQuery()
  37 +// .processInstanceId(procInstId).list();
  38 + List<BpmActivityDO> bpmActivityDOList = bpmActivityMapper.listAllByProcInstIdAndDelete(procInstId);
  39 + return BpmActivityConvert.INSTANCE.convertList(bpmActivityDOList);
45 } 40 }
46 -  
47 -  
48 -  
49 } 41 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -11,9 +11,9 @@ import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; @@ -11,9 +11,9 @@ import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
13 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; 13 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
14 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;  
15 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;  
16 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; 14 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceDeleteReasonEnum;
  15 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
  16 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceStatusEnum;
17 import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; 17 import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher;
18 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; 18 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
19 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; 19 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
1 package cn.iocoder.yudao.module.bpm.service.task; 1 package cn.iocoder.yudao.module.bpm.service.task;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
6 import org.flowable.task.api.Task; 7 import org.flowable.task.api.Task;
7 8
8 -  
9 import javax.validation.Valid; 9 import javax.validation.Valid;
10 import java.util.List; 10 import java.util.List;
11 import java.util.Map; 11 import java.util.Map;
@@ -20,16 +20,19 @@ public interface BpmTaskService { @@ -20,16 +20,19 @@ public interface BpmTaskService {
20 /** 20 /**
21 * 获得待办的流程任务分页 21 * 获得待办的流程任务分页
22 * 22 *
23 - * @param userId 用户编号 23 + * @param userId 用户编号
24 * @param pageReqVO 分页请求 24 * @param pageReqVO 分页请求
  25 + *
25 * @return 流程任务分页 26 * @return 流程任务分页
26 */ 27 */
27 PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO); 28 PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO);
  29 +
28 /** 30 /**
29 * 获得已办的流程任务分页 31 * 获得已办的流程任务分页
30 * 32 *
31 - * @param userId 用户编号 33 + * @param userId 用户编号
32 * @param pageReqVO 分页请求 34 * @param pageReqVO 分页请求
  35 + *
33 * @return 流程任务分页 36 * @return 流程任务分页
34 */ 37 */
35 PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO); 38 PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO);
@@ -38,17 +41,19 @@ public interface BpmTaskService { @@ -38,17 +41,19 @@ public interface BpmTaskService {
38 * 获得流程任务 Map 41 * 获得流程任务 Map
39 * 42 *
40 * @param processInstanceIds 流程实例的编号数组 43 * @param processInstanceIds 流程实例的编号数组
  44 + *
41 * @return 流程任务 Map 45 * @return 流程任务 Map
42 */ 46 */
43 default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) { 47 default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) {
44 return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds), 48 return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds),
45 - Task::getProcessInstanceId); 49 + Task::getProcessInstanceId);
46 } 50 }
47 51
48 /** 52 /**
49 * 获得流程任务列表 53 * 获得流程任务列表
50 * 54 *
51 * @param processInstanceIds 流程实例的编号数组 55 * @param processInstanceIds 流程实例的编号数组
  56 + *
52 * @return 流程任务列表 57 * @return 流程任务列表
53 */ 58 */
54 List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds); 59 List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
@@ -57,15 +62,25 @@ public interface BpmTaskService { @@ -57,15 +62,25 @@ public interface BpmTaskService {
57 * 获得指令流程实例的流程任务列表,包括所有状态的 62 * 获得指令流程实例的流程任务列表,包括所有状态的
58 * 63 *
59 * @param processInstanceId 流程实例的编号 64 * @param processInstanceId 流程实例的编号
  65 + *
60 * @return 流程任务列表 66 * @return 流程任务列表
61 */ 67 */
62 List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId); 68 List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId);
63 69
64 /** 70 /**
  71 + * 获取任务详情
  72 + *
  73 + * @param processInstanceId 流程实例的编号
  74 + *
  75 + * @return 流程任务列表
  76 + */
  77 + List<BpmTaskRespVO> getTaskInfo(String processInstanceId);
  78 +
  79 + /**
65 * 通过任务 80 * 通过任务
66 * 81 *
67 * @param userId 用户编号 82 * @param userId 用户编号
68 - * @param reqVO 通过请求 83 + * @param reqVO 通过请求
69 */ 84 */
70 void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); 85 void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO);
71 86
@@ -73,28 +88,30 @@ public interface BpmTaskService { @@ -73,28 +88,30 @@ public interface BpmTaskService {
73 * 不通过任务 88 * 不通过任务
74 * 89 *
75 * @param userId 用户编号 90 * @param userId 用户编号
76 - * @param reqVO 不通过请求 91 + * @param reqVO 不通过请求
77 */ 92 */
78 void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); 93 void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO);
  94 +
79 /** 95 /**
80 * 回退任务 96 * 回退任务
81 * 97 *
82 - * @param taskId 任务编号 98 + * @param userId 用户id
  99 + * @param reqVO 回退任务信息
83 */ 100 */
84 - void backTask(String taskId,String destinationTaskDefKey); 101 + CommonResult<Boolean> backTask(BpmTaskBackReqVO reqVO);
85 102
86 /** 103 /**
87 * 将流程任务分配给指定用户 104 * 将流程任务分配给指定用户
88 * 105 *
89 * @param userId 用户编号 106 * @param userId 用户编号
90 - * @param reqVO 分配请求 107 + * @param reqVO 分配请求
91 */ 108 */
92 void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO); 109 void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO);
93 110
94 /** 111 /**
95 * 将流程任务分配给指定用户 112 * 将流程任务分配给指定用户
96 * 113 *
97 - * @param id 流程任务编号 114 + * @param id 流程任务编号
98 * @param userId 用户编号 115 * @param userId 用户编号
99 */ 116 */
100 void updateTaskAssignee(String id, Long userId); 117 void updateTaskAssignee(String id, Long userId);
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.bpm.service.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 import cn.iocoder.yudao.framework.common.util.object.PageUtils; 8 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
9 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; 11 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  13 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; 14 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
12 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; 15 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
  16 +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
13 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; 17 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper;
14 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;  
15 -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 18 +import cn.iocoder.yudao.module.bpm.domain.enums.definition.BpmTaskAssignRuleTypeEnum;
  19 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
16 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; 20 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
17 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 21 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
18 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 22 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
@@ -36,10 +40,12 @@ import org.springframework.transaction.support.TransactionSynchronizationManager @@ -36,10 +40,12 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
36 import javax.annotation.Resource; 40 import javax.annotation.Resource;
37 import javax.validation.Valid; 41 import javax.validation.Valid;
38 import java.util.*; 42 import java.util.*;
  43 +import java.util.stream.Collectors;
39 44
40 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 45 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 46 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
42 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 47 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  48 +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
43 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; 49 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
44 50
45 /** 51 /**
@@ -50,7 +56,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; @@ -50,7 +56,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
50 */ 56 */
51 @Slf4j 57 @Slf4j
52 @Service 58 @Service
53 -public class BpmTaskServiceImpl implements BpmTaskService{ 59 +public class BpmTaskServiceImpl implements BpmTaskService {
54 60
55 @Resource 61 @Resource
56 private TaskService taskService; 62 private TaskService taskService;
@@ -71,13 +77,14 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -71,13 +77,14 @@ public class BpmTaskServiceImpl implements BpmTaskService{
71 private BpmMessageService messageService; 77 private BpmMessageService messageService;
72 @Resource 78 @Resource
73 private BpmTaskAssignRuleMapper taskAssignRuleMapper; 79 private BpmTaskAssignRuleMapper taskAssignRuleMapper;
  80 + @Resource
  81 + private BpmActivityMapper bpmActivityMapper;
74 82
75 @Override 83 @Override
76 public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { 84 public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
77 // 查询待办任务 85 // 查询待办任务
78 - TaskQuery taskQuery = taskService.createTaskQuery()  
79 - .taskAssignee(String.valueOf(userId)) // 分配给自己  
80 - .orderByTaskCreateTime().desc(); // 创建时间倒序 86 + TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(String.valueOf(userId)) // 分配给自己
  87 + .orderByTaskCreateTime().desc(); // 创建时间倒序
81 if (StrUtil.isNotBlank(pageVO.getName())) { 88 if (StrUtil.isNotBlank(pageVO.getName())) {
82 taskQuery.taskNameLike("%" + pageVO.getName() + "%"); 89 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
83 } 90 }
@@ -94,23 +101,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -94,23 +101,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{
94 } 101 }
95 102
96 // 获得 ProcessInstance Map 103 // 获得 ProcessInstance Map
97 - Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(  
98 - convertSet(tasks, Task::getProcessInstanceId)); 104 + Map<String, ProcessInstance> processInstanceMap =
  105 + processInstanceService.getProcessInstanceMap(convertSet(tasks, Task::getProcessInstanceId));
99 // 获得 User Map 106 // 获得 User Map
100 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 107 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
101 - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); 108 + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
102 // 拼接结果 109 // 拼接结果
103 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), 110 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap),
104 - taskQuery.count()); 111 + taskQuery.count());
105 } 112 }
106 113
107 @Override 114 @Override
108 public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { 115 public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) {
109 // 查询已办任务 116 // 查询已办任务
110 - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery()  
111 - .finished() // 已完成  
112 - .taskAssignee(String.valueOf(userId)) // 分配给自己  
113 - .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 117 + HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成
  118 + .taskAssignee(String.valueOf(userId)) // 分配给自己
  119 + .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
114 if (StrUtil.isNotBlank(pageVO.getName())) { 120 if (StrUtil.isNotBlank(pageVO.getName())) {
115 taskQuery.taskNameLike("%" + pageVO.getName() + "%"); 121 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
116 } 122 }
@@ -127,17 +133,20 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -127,17 +133,20 @@ public class BpmTaskServiceImpl implements BpmTaskService{
127 } 133 }
128 134
129 // 获得 TaskExtDO Map 135 // 获得 TaskExtDO Map
130 - List<BpmTaskExtDO> bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); 136 + List<BpmTaskExtDO> bpmTaskExtDOs =
  137 + taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId));
131 Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); 138 Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId);
132 // 获得 ProcessInstance Map 139 // 获得 ProcessInstance Map
133 - Map<String, HistoricProcessInstance> historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( 140 + Map<String, HistoricProcessInstance> historicProcessInstanceMap =
  141 + processInstanceService.getHistoricProcessInstanceMap(
134 convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); 142 convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
135 // 获得 User Map 143 // 获得 User Map
136 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 144 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
137 - convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); 145 + convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
138 // 拼接结果 146 // 拼接结果
139 - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap),  
140 - taskQuery.count()); 147 + return new PageResult<>(
  148 + BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap),
  149 + taskQuery.count());
141 } 150 }
142 151
143 @Override 152 @Override
@@ -151,17 +160,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -151,17 +160,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{
151 @Override 160 @Override
152 public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) { 161 public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) {
153 // 获得任务列表 162 // 获得任务列表
154 - List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()  
155 - .processInstanceId(processInstanceId) 163 + List<HistoricTaskInstance> tasks =
  164 + historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId)
156 .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序 165 .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序
157 .list(); 166 .list();
158 if (CollUtil.isEmpty(tasks)) { 167 if (CollUtil.isEmpty(tasks)) {
159 return Collections.emptyList(); 168 return Collections.emptyList();
160 } 169 }
161 -  
162 // 获得 TaskExtDO Map 170 // 获得 TaskExtDO Map
163 - List<BpmTaskExtDO> bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId));  
164 - Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); 171 + // List<BpmTaskExtDO> bpmTaskExtDOList =
  172 + // taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId));
  173 +
  174 + List<BpmTaskExtDO> bpmTaskExtDOList = taskExtMapper.listByProcInstId(processInstanceId);
  175 + // List<BpmTaskExtDO> bpmTaskExtDOList = BpmTaskConvert.INSTANCE.distinct(tmpBpmTaskExtDOList);
  176 + // bpmTaskExtDOList.forEach(var -> log.info("var = " + var));
  177 +
  178 + Map<String, BpmTaskExtDO> bpmTaskExtDoMap = convertMap(bpmTaskExtDOList, BpmTaskExtDO::getTaskId);
165 // 获得 ProcessInstance Map 179 // 获得 ProcessInstance Map
166 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); 180 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
167 // 获得 User Map 181 // 获得 User Map
@@ -172,7 +186,25 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -172,7 +186,25 @@ public class BpmTaskServiceImpl implements BpmTaskService{
172 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); 186 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
173 187
174 // 拼接数据 188 // 拼接数据
175 - return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); 189 + return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDoMap, processInstance, userMap, deptMap);
  190 + }
  191 +
  192 + @Override
  193 + public List<BpmTaskRespVO> getTaskInfo(String processInstanceId) {
  194 +
  195 + List<BpmTaskExtDO> bpmTaskExtDOList = taskExtMapper.listByProcInstId(processInstanceId);
  196 +
  197 + Map<String, BpmTaskExtDO> bpmTaskExtDoMap = convertMap(bpmTaskExtDOList, BpmTaskExtDO::getTaskId);
  198 + // 获得 ProcessInstance Map
  199 + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
  200 + // 获得 User Map
  201 + Set<Long> userIds = bpmTaskExtDOList.stream().map(BpmTaskExtDO::getAssigneeUserId).collect(Collectors.toSet());
  202 + userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
  203 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  204 +
  205 +
  206 + // 拼接数据
  207 + return new ArrayList<>();
176 } 208 }
177 209
178 @Override 210 @Override
@@ -199,9 +231,9 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -199,9 +231,9 @@ public class BpmTaskServiceImpl implements BpmTaskService{
199 task.getTaskDefinitionKey()); 231 task.getTaskDefinitionKey());
200 if (CollUtil.isNotEmpty(bpmTaskAssignRuleList) && bpmTaskAssignRuleList.size() > 0) { 232 if (CollUtil.isNotEmpty(bpmTaskAssignRuleList) && bpmTaskAssignRuleList.size() > 0) {
201 if (BpmTaskAssignRuleTypeEnum.USER_OR_SIGN.getType().equals(bpmTaskAssignRuleList.get(0).getType())) { 233 if (BpmTaskAssignRuleTypeEnum.USER_OR_SIGN.getType().equals(bpmTaskAssignRuleList.get(0).getType())) {
202 - taskExtMapper.updateUserOrSignTask(  
203 - (BpmTaskExtDO)new BpmTaskExtDO().setTaskId(task.getId()).setName(task.getName())  
204 - .setProcessInstanceId(task.getProcessInstanceId()).setDeleted(true)); 234 + taskExtMapper.delTaskByProcInstIdAndTaskIdAndTaskDefKey(
  235 + new BpmTaskExtDO().setTaskId(task.getId()).setTaskDefKey(task.getTaskDefinitionKey())
  236 + .setProcessInstanceId(task.getProcessInstanceId()));
205 } 237 }
206 } 238 }
207 } 239 }
@@ -220,18 +252,45 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -220,18 +252,45 @@ public class BpmTaskServiceImpl implements BpmTaskService{
220 processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getComment()); 252 processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getComment());
221 253
222 // 更新任务拓展表为不通过 254 // 更新任务拓展表为不通过
223 - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId())  
224 - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()).setComment(reqVO.getComment())); 255 + taskExtMapper.updateByTaskId(
  256 + new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.REJECT.getResult())
  257 + .setComment(reqVO.getComment()));
225 } 258 }
226 259
227 @Override 260 @Override
228 - public void backTask(String taskId,String destinationTaskDefKey) {  
229 - Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); 261 + @Transactional(rollbackFor = Exception.class)
  262 + @TenantIgnore
  263 + public CommonResult<Boolean> backTask(BpmTaskBackReqVO reqVO) {
  264 + Long userId = Long.valueOf(reqVO.getUserId());
  265 + // 校验任务存在
  266 + Task task = checkTask(userId, reqVO.getTaskId());
  267 + ArrayList<String> oldTaskDefKeyList = CollUtil.newArrayList(reqVO.getOldTaskDefKey());
  268 +
  269 + // List<HistoricActivityInstance> hisActInstList =
  270 + // historyService.createHistoricActivityInstanceQuery().processInstanceId(reqVO.getProcInstId()).list();
  271 + List<BpmActivityDO> bpmActivityDOList = bpmActivityMapper.listAllByProcInstIdAndDelete(reqVO.getProcInstId());
  272 + // List<BpmActivityDO> bpmActivityDOList = BpmTaskConvert.INSTANCE.copyList(hisActInstList, BpmActivityDO.class);
  273 + // bpmActivityDOList.forEach(bpmActivityDO -> log.info("bpmActivityDO = " + bpmActivityDO));
  274 + List<String> taskIdList = bpmActivityDOList.stream().filter(
  275 + bpmActivityDO -> bpmActivityDO.getActivityId().equals(reqVO.getOldTaskDefKey())
  276 + && !bpmActivityDO.getTaskId().equals(reqVO.getTaskId())).map(BpmActivityDO::getTaskId)
  277 + .collect(Collectors.toList());
230 278
231 - runtimeService.createChangeActivityStateBuilder()  
232 - .processInstanceId(currentTask.getProcessInstanceId())  
233 - .moveActivityIdTo(currentTask.getTaskDefinitionKey(), destinationTaskDefKey)  
234 - .changeState(); 279 + // 使用flowable更改任务节点
  280 + runtimeService.createChangeActivityStateBuilder().processInstanceId(reqVO.getProcInstId())
  281 + .moveActivityIdsToSingleActivityId(oldTaskDefKeyList, reqVO.getNewTaskDefKey()).changeState();
  282 +
  283 + // 逻辑删除hiActInst表任务
  284 + Boolean delHiActInstResult = bpmActivityMapper.delHiActInstByTaskId(taskIdList);
  285 + // 逻辑删除hiTaskInst表任务
  286 + Boolean delHiTaskInstResult = bpmActivityMapper.delHiTaskInstByTaskId(taskIdList);
  287 + // 更新任务拓展表
  288 + Boolean backResult = taskExtMapper.backByTaskId(reqVO.getTaskId(), reqVO.getComment());
  289 + Boolean delTaskResult = taskExtMapper.delByTaskIds(taskIdList);
  290 + if (!delHiActInstResult && !delHiTaskInstResult && !backResult && !delTaskResult) {
  291 + throw new RuntimeException("任务驳回失败!!!");
  292 + }
  293 + return CommonResult.success(true);
235 } 294 }
236 295
237 @Override 296 @Override
@@ -247,40 +306,40 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -247,40 +306,40 @@ public class BpmTaskServiceImpl implements BpmTaskService{
247 taskService.setAssignee(id, String.valueOf(userId)); 306 taskService.setAssignee(id, String.valueOf(userId));
248 } 307 }
249 308
250 -  
251 @Override 309 @Override
252 public void createTaskExt(Task task) { 310 public void createTaskExt(Task task) {
253 - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)  
254 - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); 311 + BpmTaskExtDO taskExtDO =
  312 + BpmTaskConvert.INSTANCE.convert2TaskExt(task).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
255 taskExtMapper.insert(taskExtDO); 313 taskExtMapper.insert(taskExtDO);
256 } 314 }
257 315
258 @Override 316 @Override
259 public void updateTaskExtComplete(Task task) { 317 public void updateTaskExtComplete(Task task) {
260 - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)  
261 - .setEndTime(new Date()); 318 + BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task).setEndTime(new Date());
262 taskExtMapper.updateByTaskId(taskExtDO); 319 taskExtMapper.updateByTaskId(taskExtDO);
263 } 320 }
264 321
265 @Override 322 @Override
266 public void updateTaskExtAssign(Task task) { 323 public void updateTaskExtAssign(Task task) {
267 - BpmTaskExtDO taskExtDO = new BpmTaskExtDO()  
268 - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee()))  
269 - .setTaskId(task.getId()); 324 + BpmTaskExtDO taskExtDO =
  325 + new BpmTaskExtDO().setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setTaskId(task.getId());
270 taskExtMapper.updateByTaskId(taskExtDO); 326 taskExtMapper.updateByTaskId(taskExtDO);
271 // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。 327 // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。
272 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { 328 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
273 @Override 329 @Override
274 public void afterCommit() { 330 public void afterCommit() {
275 - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); 331 + ProcessInstance processInstance =
  332 + processInstanceService.getProcessInstance(task.getProcessInstanceId());
276 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); 333 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId()));
277 - messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); 334 + messageService.sendMessageWhenTaskAssigned(
  335 + BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task));
278 } 336 }
279 }); 337 });
280 } 338 }
281 339
282 /** 340 /**
283 * 校验任务是否存在, 并且是否是分配给自己的任务 341 * 校验任务是否存在, 并且是否是分配给自己的任务
  342 + *
284 * @param userId 用户 id 343 * @param userId 用户 id
285 * @param taskId task id 344 * @param taskId task id
286 */ 345 */
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/business/hi/task/inst/domain/HistoricApproveTaskDTO.java 0 → 100644
  1 +package net.lab1024.smartadmin.module.business.approve.camunda.hi.task.inst.domain;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +/**
  8 + * @author kemengkai
  9 + * @create 2022-01-11 15:09
  10 + */
  11 +@Data
  12 +@AllArgsConstructor
  13 +@NoArgsConstructor
  14 +public class HistoricApproveTaskDTO {
  15 +
  16 + private String procInstId;
  17 + private String name;
  18 + private String assignee;
  19 +
  20 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/business/hi/task/inst/domain/vo/HiTaskinstVO.java 0 → 100644
  1 +package net.lab1024.smartadmin.module.business.approve.camunda.hi.task.inst.domain.vo;
  2 +
  3 +import lombok.Data;
  4 +import java.util.Date;
  5 +import com.fasterxml.jackson.annotation.JsonFormat;
  6 +import io.swagger.annotations.ApiModelProperty;
  7 +
  8 +/**
  9 + * [ ]
  10 + *
  11 + * @author 孟凯
  12 + * @version 1.0
  13 + * @company 1024创新实验室( www.1024lab.net )
  14 + * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved.
  15 + * @date 2022-01-17 15:14:27
  16 + * @since JDK1.8
  17 + */
  18 +@Data
  19 +public class HiTaskinstVO {
  20 + @ApiModelProperty("ID_")
  21 + private String id;
  22 +
  23 + @ApiModelProperty("TASK_DEF_KEY_")
  24 + private String taskDefKey;
  25 +
  26 + @ApiModelProperty("PROC_DEF_KEY_")
  27 + private String procDefKey;
  28 +
  29 + @ApiModelProperty("PROC_DEF_ID_")
  30 + private String procDefId;
  31 +
  32 + @ApiModelProperty("ROOT_PROC_INST_ID_")
  33 + private String rootProcInstId;
  34 +
  35 + @ApiModelProperty("PROC_INST_ID_")
  36 + private String procInstId;
  37 +
  38 + @ApiModelProperty("EXECUTION_ID_")
  39 + private String executionId;
  40 +
  41 + @ApiModelProperty("CASE_DEF_KEY_")
  42 + private String caseDefKey;
  43 +
  44 + @ApiModelProperty("CASE_DEF_ID_")
  45 + private String caseDefId;
  46 +
  47 + @ApiModelProperty("CASE_INST_ID_")
  48 + private String caseInstId;
  49 +
  50 + @ApiModelProperty("CASE_EXECUTION_ID_")
  51 + private String caseExecutionId;
  52 +
  53 + @ApiModelProperty("ACT_INST_ID_")
  54 + private String actInstId;
  55 +
  56 + @ApiModelProperty("NAME_")
  57 + private String name;
  58 +
  59 + @ApiModelProperty("PARENT_TASK_ID_")
  60 + private String parentTaskId;
  61 +
  62 + @ApiModelProperty("DESCRIPTION_")
  63 + private String description;
  64 +
  65 + @ApiModelProperty("OWNER_")
  66 + private String owner;
  67 +
  68 + @ApiModelProperty("ASSIGNEE_")
  69 + private String assignee;
  70 +
  71 + @ApiModelProperty("START_TIME_")
  72 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  73 + private Date startTime;
  74 +
  75 + @ApiModelProperty("END_TIME_")
  76 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  77 + private Date endTime;
  78 +
  79 + @ApiModelProperty("DURATION_")
  80 + private Long duration;
  81 +
  82 + @ApiModelProperty("DELETE_REASON_")
  83 + private String deleteReason;
  84 +
  85 + @ApiModelProperty("PRIORITY_")
  86 + private Integer priority;
  87 +
  88 + @ApiModelProperty("DUE_DATE_")
  89 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  90 + private Date dueDate;
  91 +
  92 + @ApiModelProperty("FOLLOW_UP_DATE_")
  93 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  94 + private Date followUpDate;
  95 +
  96 + @ApiModelProperty("TENANT_ID_")
  97 + private String tenantId;
  98 +
  99 + @ApiModelProperty("REMOVAL_TIME_")
  100 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  101 + private Date removalTime;
  102 +
  103 +
  104 +
  105 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/business/hi/task/inst/service/HiTaskinstService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.business.hi.task.inst.service;
  2 +
  3 +import cn.hutool.core.bean.BeanUtil;
  4 +import cn.hutool.core.collection.CollUtil;
  5 +import cn.hutool.core.util.BooleanUtil;
  6 +import cn.hutool.json.JSONUtil;
  7 +import cn.iocoder.yudao.module.bpm.domain.vo.ApproveProcInstVO;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.flowable.common.engine.impl.de.odysseus.el.util.SimpleContext;
  10 +import org.flowable.engine.HistoryService;
  11 +import org.flowable.engine.RepositoryService;
  12 +import org.flowable.engine.TaskService;
  13 +import org.flowable.variable.api.history.HistoricVariableInstance;
  14 +import org.springframework.beans.factory.annotation.Autowired;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +import java.util.*;
  18 +
  19 +/**
  20 + * [ ]
  21 + *
  22 + * @author 孟凯
  23 + * @version 1.0
  24 + * @company 1024创新实验室(www.1024lab.net)
  25 + * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved.
  26 + * @date 2022-01-17 15:14:27
  27 + * @since JDK1.8
  28 + */
  29 +@Slf4j
  30 +@Service
  31 +public class HiTaskinstService {
  32 +
  33 +
  34 + @Autowired
  35 + private TaskService taskService;
  36 + @Autowired
  37 + private HistoryService historyService;
  38 + @Autowired
  39 + private RepositoryService repositoryService;
  40 +
  41 + /**
  42 + * 获取任务具体流程信息
  43 + *
  44 + * @param procInstId 流程id
  45 + * @param procDefId 流程部署id
  46 + *
  47 + * @return 返回流程信息
  48 + */
  49 + public List<ApproveProcInstVO> taskGetComment(String procInstId, String procDefId) {
  50 + Map<String, Object> variableMap = new HashMap<>(50);
  51 + List<HistoricVariableInstance> hisVarInstList =
  52 + historyService.createHistoricVariableInstanceQuery().processInstanceId(procInstId).list();
  53 + hisVarInstList.forEach(hisVarInst -> {
  54 + variableMap.put(hisVarInst.getName(), hisVarInst.getValue());
  55 + });
  56 +
  57 + List<ApproveProcInstVO> procInstVOList = hiTaskinstDao.listByProcInstIdAndNotDelete(procInstId);
  58 +
  59 + BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModel(procDefId);
  60 + DomElement document1 = bpmnModelInstance.getDocument().getElementById(procDefId.split(":")[0]);
  61 + LinkedHashMap<String, DomElement> domElementMap = new LinkedHashMap<>(50);
  62 + getChildElementToMap(document1, domElementMap);
  63 + getChildNode(procInstVOList, domElementMap, variableMap);
  64 + return procInstVOList;
  65 + }
  66 +
  67 + /**
  68 + * 获取子节点信息,存储到map中
  69 + *
  70 + * @param domElement 父节点
  71 + * @param domElementMap 节点map
  72 + */
  73 + private void getChildElementToMap(DomElement domElement, LinkedHashMap<String, DomElement> domElementMap) {
  74 + List<DomElement> childElements = domElement.getChildElements();
  75 + for (DomElement childElement : childElements) {
  76 + if ("BPMNDiagram".equals(childElement.getLocalName())) {
  77 + break;
  78 + }
  79 + if ("extensionElements".equals(childElement.getLocalName())) {
  80 + break;
  81 + }
  82 + if (!"outgoing".equals(childElement.getLocalName()) && !"incoming".equals(childElement.getLocalName())) {
  83 + domElementMap.put(childElement.getAttribute("id"), childElement);
  84 + }
  85 + getChildElementToMap(childElement, domElementMap);
  86 + }
  87 + }
  88 +
  89 + /**
  90 + * 获取子节点信息
  91 + *
  92 + * @param procInstVOList 流程VO列表
  93 + * @param domElementMap 节点map
  94 + * @param variableMap 流程所有的变量
  95 + */
  96 + private void getChildNode(List<ApproveProcInstVO> procInstVOList, LinkedHashMap<String, DomElement> domElementMap,
  97 + Map<String, Object> variableMap) {
  98 + DomElement domElement = domElementMap.get(procInstVOList.get(procInstVOList.size() - 1).getTaskDefKey());
  99 + for (DomElement childElement : domElement.getChildElements()) {
  100 + if ("outgoing".equals(childElement.getLocalName())) {
  101 + DomElement tmpDomElement = domElementMap.get(childElement.getTextContent());
  102 + getChildNode(procInstVOList, domElementMap, variableMap, tmpDomElement);
  103 + }
  104 + }
  105 + }
  106 +
  107 + /**
  108 + * 获取子节点信息
  109 + *
  110 + * @param procInstVOList 流程VO列表
  111 + * @param domElementMap 节点map
  112 + * @param variableMap 流程所有的变量
  113 + * @param domElement 父节点信息
  114 + */
  115 + private void getChildNode(List<ApproveProcInstVO> procInstVOList, LinkedHashMap<String, DomElement> domElementMap,
  116 + Map<String, Object> variableMap, DomElement domElement) {
  117 + if ("exclusiveGateway".equals(domElement.getLocalName())) {
  118 + DomElement domElementChild = getNodeExclusiveGateway(domElementMap, variableMap, domElement);
  119 + getChildNode(procInstVOList, domElementMap, variableMap, domElementChild);
  120 + } else if ("userTask".equals(domElement.getLocalName())) {
  121 + getProcInstVO(procInstVOList, domElement, variableMap);
  122 + for (DomElement childElement : domElement.getChildElements()) {
  123 + if ("outgoing".equals(childElement.getLocalName())) {
  124 + DomElement tmpDomElement = domElementMap.get(childElement.getTextContent());
  125 + DomElement domElementChild = getNodeBySequenceFlow(domElementMap, tmpDomElement);
  126 + if ("endEvent".equals(domElementChild.getLocalName())) {
  127 + return;
  128 + }
  129 + getChildNode(procInstVOList, domElementMap, variableMap, domElementChild);
  130 + }
  131 + }
  132 + } else {
  133 + DomElement domElementChild = getNodeBySequenceFlow(domElementMap, domElement);
  134 + if (BeanUtil.isEmpty(domElementChild)) {
  135 + throw new RuntimeException("无流程可执行!!!");
  136 + }
  137 + if ("endEvent".equals(domElementChild.getLocalName())) {
  138 + return;
  139 + }
  140 + getChildNode(procInstVOList, domElementMap, variableMap, domElementChild);
  141 + }
  142 + }
  143 +
  144 + /**
  145 + * 获取网关节点的子节点
  146 + *
  147 + * @param domElementMap 流程所有的节点
  148 + * @param variableMap 流程所有的变量
  149 + * @param domElement 父节点信息
  150 + *
  151 + * @return 返回子节点信息
  152 + */
  153 + private DomElement getNodeExclusiveGateway(LinkedHashMap<String, DomElement> domElementMap,
  154 + Map<String, Object> variableMap, DomElement domElement) {
  155 + Boolean elExpressionFlag = Boolean.FALSE;
  156 + ArrayList<DomElement> nullChildSequenceFlowList = new ArrayList<>();
  157 + for (DomElement exclusiveGatewayChild : domElement.getChildElements()) {
  158 + if ("outgoing".equals(exclusiveGatewayChild.getLocalName()) && BooleanUtil.isFalse(elExpressionFlag)) {
  159 + DomElement sequenceFlowDomElement = domElementMap.get(exclusiveGatewayChild.getTextContent());
  160 + if (CollUtil.isNotEmpty(sequenceFlowDomElement.getChildElements())
  161 + && sequenceFlowDomElement.getChildElements().size() > 0) {
  162 + for (DomElement conditionExpression : sequenceFlowDomElement.getChildElements()) {
  163 + if ("conditionExpression".equals(conditionExpression.getLocalName())) {
  164 + elExpressionFlag = elExpression(conditionExpression.getTextContent(), variableMap);
  165 + if (BooleanUtil.isTrue(elExpressionFlag)) {
  166 + break;
  167 + }
  168 + }
  169 + }
  170 + } else {
  171 + nullChildSequenceFlowList.add(sequenceFlowDomElement);
  172 + }
  173 + if (elExpressionFlag) {
  174 + return getNodeBySequenceFlow(domElementMap, sequenceFlowDomElement);
  175 + }
  176 + }
  177 + }
  178 + if (CollUtil.isEmpty(nullChildSequenceFlowList) && nullChildSequenceFlowList.size() < 1) {
  179 + throw new RuntimeException("网关缺少无条件流程可执行!!!");
  180 + }
  181 + if (nullChildSequenceFlowList.size() > 1) {
  182 + throw new RuntimeException("无条件流程大于1条!!!");
  183 + }
  184 + return getNodeBySequenceFlow(domElementMap, nullChildSequenceFlowList.get(0));
  185 + }
  186 +
  187 + /**
  188 + * 获取流程序列流的子节点
  189 + *
  190 + * @param domElementMap 流程所有节点
  191 + * @param domElement 父节点信息
  192 + *
  193 + * @return 返回子节点
  194 + */
  195 + private DomElement getNodeBySequenceFlow(LinkedHashMap<String, DomElement> domElementMap, DomElement domElement) {
  196 + String targetRef = domElement.getAttribute("targetRef");
  197 + return domElementMap.get(targetRef);
  198 + }
  199 +
  200 + /**
  201 + * 设置节点信息进ApproveProcInstVO
  202 + *
  203 + * @param procInstVOList ApproveProcInstVOList
  204 + * @param domElement 节点信息
  205 + * @param variableMap 流程所有变量
  206 + */
  207 + private void getProcInstVO(List<ApproveProcInstVO> procInstVOList, DomElement domElement,
  208 + Map<String, Object> variableMap) {
  209 + String camundaNameSpaceUri = "http://camunda.org/schema/1.0/bpmn";
  210 + boolean userListFlag = false;
  211 + List<Object> approveProcInstVOList = new ArrayList<>();
  212 + for (DomElement childElement : domElement.getChildElements()) {
  213 + if ("multiInstanceLoopCharacteristics".equals(childElement.getLocalName())) {
  214 + userListFlag = true;
  215 + String collectionVar = childElement.getAttribute(camundaNameSpaceUri, "collection");
  216 + Object taskUserList = variableMap.get(collectionVar);
  217 + approveProcInstVOList = JSONUtil.parseArray(taskUserList);
  218 + }
  219 + }
  220 +
  221 + if (userListFlag) {
  222 + approveProcInstVOList.forEach(tmpAssignee -> {
  223 + String assignee = String.valueOf(tmpAssignee);
  224 + ApproveProcInstVO approveProcInstVO = new ApproveProcInstVO();
  225 + approveProcInstVO.setName(domElement.getAttribute("name"));
  226 + approveProcInstVO.setTaskDefKey(domElement.getAttribute("id"));
  227 + approveProcInstVO.setAssignee(assignee);
  228 + approveProcInstVO.setAssigneeName(employeeDao.getByLoginName(assignee, 0).getActualName());
  229 + procInstVOList.add(approveProcInstVO);
  230 + });
  231 + } else {
  232 + ApproveProcInstVO approveProcInstVO = new ApproveProcInstVO();
  233 + approveProcInstVO.setName(domElement.getAttribute("name"));
  234 + approveProcInstVO.setTaskDefKey(domElement.getAttribute("id"));
  235 + approveProcInstVO.setAssignee(domElement.getAttribute(camundaNameSpaceUri, "assignee"));
  236 + approveProcInstVO.setAssigneeName(
  237 + employeeDao.getByLoginName(approveProcInstVO.getAssignee(), 0).getActualName());
  238 + procInstVOList.add(approveProcInstVO);
  239 + }
  240 + }
  241 +
  242 + /**
  243 + * 网关分叉条件判断,网关分叉,必须要有默认出口
  244 + *
  245 + * @param elExpression el表达式
  246 + * @param variableMap 流程所有变量
  247 + *
  248 + * @return 返回true或false
  249 + */
  250 + private Boolean elExpression(String elExpression, Map<String, Object> variableMap) {
  251 + ExpressionFactory factory = new ExpressionFactoryImpl();
  252 + SimpleContext context = new SimpleContext();
  253 + for (String k : variableMap.keySet()) {
  254 + if (variableMap.get(k) != null) {
  255 + context.setVariable(k,
  256 + factory.createValueExpression(variableMap.get(k), variableMap.get(k).getClass()));
  257 + }
  258 + }
  259 + ValueExpression e = factory.createValueExpression(context, elExpression, Boolean.class);
  260 + //el表达式和variables得到的结果
  261 + return (Boolean)e.getValue(context);
  262 + }
  263 +}
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/BpmActivityMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper">
  4 +
  5 + <update id="delHiActInstByTaskId">
  6 + UPDATE act_hi_actinst
  7 + SET delete_reason_ = 'delete task' WHERE task_id_ IN
  8 + <foreach collection="taskIdList" item="item" open="(" separator="," close=")">
  9 + #{item}
  10 + </foreach>
  11 + </update>
  12 + <delete id="delHiTaskInstByTaskId">
  13 + UPDATE act_hi_taskinst
  14 + SET delete_reason_ = 'delete task' WHERE id_ IN
  15 + <foreach collection="taskIdList" item="item" open="(" separator="," close=")">
  16 + #{item}
  17 + </foreach>
  18 + </delete>
  19 +
  20 + <select id="listAll" resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO">
  21 + SELECT *
  22 + FROM act_hi_taskinst;
  23 + </select>
  24 + <select id="listAllByProcInstIdAndDelete"
  25 + resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO">
  26 + SELECT id_ AS `id`,
  27 + rev_ AS `rev`,
  28 + proc_def_id_ AS `proc_def_id`,
  29 + proc_inst_id_ AS `process_instance_id`,
  30 + execution_id_ AS `execution_id`,
  31 + act_id_ AS `activity_id`,
  32 + task_id_ AS `task_id`,
  33 + call_proc_inst_id_ AS `call_proc_inst_id`,
  34 + act_name_ AS `activity_name`,
  35 + act_type_ AS `activity_type`,
  36 + assignee_ AS `assignee`,
  37 + start_time_ AS `start_time`,
  38 + end_time_ AS `end_time`,
  39 + transaction_order_ AS `transaction_order`,
  40 + duration_ AS `duration`,
  41 + delete_reason_ AS `delete_reason`,
  42 + tenant_id_ AS `tenant_id`
  43 + FROM act_hi_actinst aha
  44 + WHERE aha.proc_inst_id_ = #{procInstId}
  45 + AND aha.act_type_ != 'sequenceFlow'
  46 + LIMIT 500;
  47 + </select>
  48 +</mapper>
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/BpmTaskExtMapper.xml
@@ -2,8 +2,36 @@ @@ -2,8 +2,36 @@
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 <mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper"> 3 <mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper">
4 4
5 -  
6 - <update id="updateUserOrSignTask">  
7 - UPDATE bpm_task_ext SET deleted=1 WHERE process_instance_id = #{entity.processInstanceId} AND name = #{entity.name} AND task_id != #{entity.taskId} 5 +
  6 + <update id="delTaskByProcInstIdAndTaskIdAndTaskDefKey">
  7 + UPDATE bpm_task_ext
  8 + SET deleted=1
  9 + WHERE process_instance_id = #{entity.processInstanceId}
  10 + AND task_def_key = #{entity.taskDefKey}
  11 + AND task_id != #{entity.taskId}
  12 + </update>
  13 + <update id="backByTaskId">
  14 + UPDATE bpm_task_ext
  15 + SET result=2,
  16 + `comment`=#{comment}
  17 + WHERE task_id = #{taskId}
8 </update> 18 </update>
  19 + <update id="delByTaskIds">
  20 + UPDATE bpm_task_ext
  21 + SET result=1,
  22 + `deleted`= true
  23 + WHERE `task_id` IN
  24 + <foreach collection="taskIdList" item="item" open="(" separator="," close=")">
  25 + #{item}
  26 + </foreach>
  27 + </update>
  28 +
  29 + <select id="listByProcInstId" resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO">
  30 + SELECT *
  31 + FROM bpm_task_ext
  32 + WHERE `process_instance_id` = #{procInstId}
  33 + AND `deleted` = FALSE
  34 + ORDER BY create_time
  35 + LIMIT 500
  36 + </select>
9 </mapper> 37 </mapper>
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/MultiInstancesTest.java
@@ -8,13 +8,13 @@ import org.flowable.engine.repository.ProcessDefinition; @@ -8,13 +8,13 @@ import org.flowable.engine.repository.ProcessDefinition;
8 import org.flowable.engine.runtime.ProcessInstance; 8 import org.flowable.engine.runtime.ProcessInstance;
9 import org.flowable.engine.test.Deployment; 9 import org.flowable.engine.test.Deployment;
10 import org.flowable.task.api.Task; 10 import org.flowable.task.api.Task;
11 -import org.junit.Test; 11 +import org.junit.jupiter.api.Test;
12 12
13 import java.text.SimpleDateFormat; 13 import java.text.SimpleDateFormat;
14 import java.util.*; 14 import java.util.*;
15 15
16 -import static org.junit.Assert.assertEquals;  
17 -import static org.junit.Assert.assertNotNull; 16 +import static org.junit.jupiter.api.Assertions.assertEquals;
  17 +import static org.junit.jupiter.api.Assertions.assertNotNull;
18 18
19 /** 19 /**
20 * @author henryyan 20 * @author henryyan
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java
@@ -8,6 +8,7 @@ import org.springframework.security.config.annotation.web.configurers.Expression @@ -8,6 +8,7 @@ import org.springframework.security.config.annotation.web.configurers.Expression
8 8
9 /** 9 /**
10 * System 模块的 Security 配置 10 * System 模块的 Security 配置
  11 + * @author kemengkai
11 */ 12 */
12 @Configuration("systemSecurityConfiguration") 13 @Configuration("systemSecurityConfiguration")
13 public class SecurityConfiguration { 14 public class SecurityConfiguration {