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 546 DROP TABLE IF EXISTS `bpm_task_ext`;
547 547 CREATE TABLE `bpm_task_ext` (
548 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 550 `assignee_user_id` bigint DEFAULT NULL COMMENT '任务的审批人',
550 551 `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务的名字',
551 552 `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务的编号',
... ...
yudao-dependencies/pom.xml
... ... @@ -65,6 +65,7 @@
65 65 <tencentcloud-sdk-java.version>3.1.471</tencentcloud-sdk-java.version>
66 66 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
67 67 <justauth.version>1.4.0</justauth.version>
  68 + <dom4j.version>2.1.3</dom4j.version>
68 69 </properties>
69 70  
70 71 <dependencyManagement>
... ... @@ -578,7 +579,13 @@
578 579 <artifactId>justauth-spring-boot-starter</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) -->
579 580 <version>${justauth.version}</version>
580 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 589 </dependencies>
583 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 58 .build()
59 59 .securitySchemes(securitySchemes())
60 60 .globalRequestParameters(globalRequestParameters())
61   - .securityContexts(securityContexts());
  61 + .securityContexts(securityContexts())
  62 + .host("http://localhost:48080");
62 63 }
63 64  
64 65 // ========== apiInfo ==========
... ...
yudao-module-bpm/yudao-module-bpm-biz/pom.xml
... ... @@ -10,6 +10,10 @@
10 10 <modelVersion>4.0.0</modelVersion>
11 11 <artifactId>yudao-module-bpm-biz</artifactId>
12 12  
  13 + <properties>
  14 + <dom4j.version>2.1.3</dom4j.version>
  15 + </properties>
  16 +
13 17 <name>${project.artifactId}</name>
14 18 <description>
15 19 bpm-base 模块,实现公用的工作流的逻辑,提供给 bpm-activiti 和 bpm-flowable 复用
... ... @@ -36,6 +40,10 @@
36 40 <groupId>cn.iocoder.boot</groupId>
37 41 <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
38 42 </dependency>
  43 + <dependency>
  44 + <groupId>cn.iocoder.boot</groupId>
  45 + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
  46 + </dependency>
39 47  
40 48 <!-- Web 相关 -->
41 49 <dependency>
... ... @@ -77,5 +85,11 @@
77 85 <version>1.4.196</version>
78 86 <scope>test</scope>
79 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 94 </dependencies>
81 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 7 import io.swagger.annotations.Api;
8 8 import io.swagger.annotations.ApiImplicitParam;
9 9 import io.swagger.annotations.ApiOperation;
  10 +import org.apache.ibatis.annotations.Param;
10 11 import org.flowable.bpmn.model.BpmnModel;
11 12 import org.flowable.engine.TaskService;
12 13 import org.springframework.security.access.prepost.PreAuthorize;
... ... @@ -17,6 +18,7 @@ import javax.annotation.Resource;
17 18 import javax.validation.Valid;
18 19  
19 20 import java.util.List;
  21 +import java.util.Objects;
20 22  
21 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 24 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
... ... @@ -49,10 +51,17 @@ public class BpmTaskController {
49 51 @ApiImplicitParam(name = "processInstanceId", value = "流程实例的编号", required = true, dataTypeClass = String.class)
50 52 @PreAuthorize("@ss.hasPermission('bpm:task:query')")
51 53 public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId(
52   - @RequestParam("processInstanceId") String processInstanceId) {
  54 + @RequestParam("processInstanceId") String processInstanceId) {
53 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 65 @PutMapping("/approve")
57 66 @ApiOperation("通过任务")
58 67 @PreAuthorize("@ss.hasPermission('bpm:task:update')")
... ... @@ -76,13 +85,14 @@ public class BpmTaskController {
76 85 taskService.updateTaskAssignee(getLoginUserId(), reqVO);
77 86 return success(true);
78 87 }
  88 +
79 89 @PutMapping("/back")
80 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 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 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
3 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 5 import org.flowable.engine.history.HistoricActivityInstance;
5 6 import org.mapstruct.Mapper;
6 7 import org.mapstruct.Mapping;
... ... @@ -19,11 +20,11 @@ public interface BpmActivityConvert {
19 20  
20 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 25 @Mappings({
25 26 @Mapping(source = "activityId", target = "key"),
26 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 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
  3 +import cn.hutool.core.util.BooleanUtil;
3 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO;
6 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
7 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
8 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  10 +import cn.iocoder.yudao.module.bpm.domain.enums.task.BpmProcessInstanceResultEnum;
9 11 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
10 12 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
11 13 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -17,9 +19,10 @@ import org.flowable.task.api.Task;
17 19 import org.flowable.task.api.history.HistoricTaskInstance;
18 20 import org.mapstruct.*;
19 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 28 * Bpm 任务 Convert
... ... @@ -31,8 +34,37 @@ public interface BpmTaskConvert {
31 34  
32 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 68 return CollectionUtils.convertList(tasks, task -> {
37 69 BpmTaskTodoPageItemRespVO respVO = convert1(task);
38 70 ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId());
... ... @@ -49,13 +81,12 @@ public interface BpmTaskConvert {
49 81  
50 82 @Named("convertSuspendedToSuspensionState")
51 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 90 return CollectionUtils.convertList(tasks, task -> {
60 91 BpmTaskDonePageItemRespVO respVO = convert2(task);
61 92 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId());
... ... @@ -71,18 +102,16 @@ public interface BpmTaskConvert {
71 102  
72 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 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 115 return CollectionUtils.convertList(tasks, task -> {
87 116 BpmTaskRespVO respVO = convert3(task);
88 117 BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId());
... ... @@ -111,37 +140,56 @@ public interface BpmTaskConvert {
111 140 @Mapping(target = "id", ignore = true)
112 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 155 taskExtDO.setCreateTime(task.getCreateTime());
131 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 161 BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO();
136 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 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 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 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
2 2  
3 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 5 import com.baomidou.mybatisplus.annotation.TableField;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
7 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 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 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 7 import com.baomidou.mybatisplus.annotation.TableField;
8 8 import com.baomidou.mybatisplus.annotation.TableId;
9 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 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 4 import lombok.*;
5 5 import java.util.*;
6 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 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
2 2  
3 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 6 import com.baomidou.mybatisplus.annotation.TableField;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 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 1 package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
2 2  
3 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 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.Data;
... ... @@ -27,6 +27,11 @@ public class BpmTaskExtDO extends BaseDO {
27 27 */
28 28 @TableId
29 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 1 package cn.iocoder.yudao.module.bpm.dal.mysql.task;
2 2  
  3 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
3 4 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
... ... @@ -20,14 +21,43 @@ public interface BpmTaskExtMapper extends BaseMapperX&lt;BpmTaskExtDO&gt; {
20 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 34 default List<BpmTaskExtDO> selectListByProcessInstanceId(String processInstanceId) {
24 35 return selectList("process_instance_id", processInstanceId);
25 36 }
26 37  
27 38 /**
28   - * 修改或签任务信息
  39 + * 删除非当前相同taskDefKey非进行中的任务
29 40 *
30 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 3 import lombok.AllArgsConstructor;
4 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 3 import lombok.AllArgsConstructor;
4 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 3 import lombok.AllArgsConstructor;
4 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 3 import lombok.AllArgsConstructor;
4 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 3 import cn.hutool.core.util.StrUtil;
4 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 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ... @@ -15,7 +15,8 @@ public enum BpmProcessInstanceResultEnum {
15 15 PROCESS(1, "处理中"),
16 16 APPROVE(2, "通过"),
17 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 3 import lombok.AllArgsConstructor;
4 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 4 import cn.hutool.core.util.StrUtil;
5 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 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 8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
9 9 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService;
10 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 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
8 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
9 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 11 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
12 12 import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService;
13 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 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 4 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
5 5  
6 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 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
2 2  
3 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 5 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
6 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 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
2 2  
3 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 5 import org.flowable.task.service.impl.persistence.entity.TaskEntity;
6 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 2  
3 3 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
4 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 7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
8 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 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
10 10 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper;
11 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 13 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO;
14 14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
15 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 10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
11 11 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
12 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 14 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
15 15 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
16 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 13 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
14 14 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
15 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 17 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
18 18 import cn.iocoder.yudao.module.system.api.dept.PostApi;
19 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 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 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 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 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 6 import lombok.Data;
7 7  
8 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 2  
3 3 import cn.iocoder.yudao.framework.web.config.WebProperties;
4 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 6 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
7 7 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
8 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 9 import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;
10 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
11 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 13 import org.springframework.stereotype.Service;
14 14 import org.springframework.transaction.annotation.Transactional;
15 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 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 4 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO;
6 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 8 import lombok.extern.slf4j.Slf4j;
9 9  
10   -import org.flowable.bpmn.model.BpmnModel;
11 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 11 import org.springframework.stereotype.Service;
16 12 import org.springframework.validation.annotation.Validated;
17 13  
18 14 import javax.annotation.Resource;
19   -import java.io.InputStream;
20   -import java.util.Collections;
21 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 19 * BPM 活动实例 Service 实现类
... ... @@ -36,14 +27,15 @@ public class BpmActivityServiceImpl implements BpmActivityService {
36 27  
37 28 @Resource
38 29 private HistoryService historyService;
  30 + @Resource
  31 + private BpmActivityMapper bpmActivityMapper;
39 32  
40 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 11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
12 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
13 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 17 import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher;
18 18 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
19 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 1 package cn.iocoder.yudao.module.bpm.service.task;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
6 7 import org.flowable.task.api.Task;
7 8  
8   -
9 9 import javax.validation.Valid;
10 10 import java.util.List;
11 11 import java.util.Map;
... ... @@ -20,16 +20,19 @@ public interface BpmTaskService {
20 20 /**
21 21 * 获得待办的流程任务分页
22 22 *
23   - * @param userId 用户编号
  23 + * @param userId 用户编号
24 24 * @param pageReqVO 分页请求
  25 + *
25 26 * @return 流程任务分页
26 27 */
27 28 PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO);
  29 +
28 30 /**
29 31 * 获得已办的流程任务分页
30 32 *
31   - * @param userId 用户编号
  33 + * @param userId 用户编号
32 34 * @param pageReqVO 分页请求
  35 + *
33 36 * @return 流程任务分页
34 37 */
35 38 PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO);
... ... @@ -38,17 +41,19 @@ public interface BpmTaskService {
38 41 * 获得流程任务 Map
39 42 *
40 43 * @param processInstanceIds 流程实例的编号数组
  44 + *
41 45 * @return 流程任务 Map
42 46 */
43 47 default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) {
44 48 return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds),
45   - Task::getProcessInstanceId);
  49 + Task::getProcessInstanceId);
46 50 }
47 51  
48 52 /**
49 53 * 获得流程任务列表
50 54 *
51 55 * @param processInstanceIds 流程实例的编号数组
  56 + *
52 57 * @return 流程任务列表
53 58 */
54 59 List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
... ... @@ -57,15 +62,25 @@ public interface BpmTaskService {
57 62 * 获得指令流程实例的流程任务列表,包括所有状态的
58 63 *
59 64 * @param processInstanceId 流程实例的编号
  65 + *
60 66 * @return 流程任务列表
61 67 */
62 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 82 * @param userId 用户编号
68   - * @param reqVO 通过请求
  83 + * @param reqVO 通过请求
69 84 */
70 85 void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO);
71 86  
... ... @@ -73,28 +88,30 @@ public interface BpmTaskService {
73 88 * 不通过任务
74 89 *
75 90 * @param userId 用户编号
76   - * @param reqVO 不通过请求
  91 + * @param reqVO 不通过请求
77 92 */
78 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 106 * @param userId 用户编号
90   - * @param reqVO 分配请求
  107 + * @param reqVO 分配请求
91 108 */
92 109 void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO);
93 110  
94 111 /**
95 112 * 将流程任务分配给指定用户
96 113 *
97   - * @param id 流程任务编号
  114 + * @param id 流程任务编号
98 115 * @param userId 用户编号
99 116 */
100 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 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 8 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
8 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
9 11 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
10 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  13 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
11 14 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
12 15 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
  16 +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
13 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 20 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
17 21 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
18 22 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
... ... @@ -36,10 +40,12 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
36 40 import javax.annotation.Resource;
37 41 import javax.validation.Valid;
38 42 import java.util.*;
  43 +import java.util.stream.Collectors;
39 44  
40 45 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
41 46 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
42 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 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 56 */
51 57 @Slf4j
52 58 @Service
53   -public class BpmTaskServiceImpl implements BpmTaskService{
  59 +public class BpmTaskServiceImpl implements BpmTaskService {
54 60  
55 61 @Resource
56 62 private TaskService taskService;
... ... @@ -71,13 +77,14 @@ public class BpmTaskServiceImpl implements BpmTaskService{
71 77 private BpmMessageService messageService;
72 78 @Resource
73 79 private BpmTaskAssignRuleMapper taskAssignRuleMapper;
  80 + @Resource
  81 + private BpmActivityMapper bpmActivityMapper;
74 82  
75 83 @Override
76 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 88 if (StrUtil.isNotBlank(pageVO.getName())) {
82 89 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
83 90 }
... ... @@ -94,23 +101,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{
94 101 }
95 102  
96 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 106 // 获得 User Map
100 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 110 return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap),
104   - taskQuery.count());
  111 + taskQuery.count());
105 112 }
106 113  
107 114 @Override
108 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 120 if (StrUtil.isNotBlank(pageVO.getName())) {
115 121 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
116 122 }
... ... @@ -127,17 +133,20 @@ public class BpmTaskServiceImpl implements BpmTaskService{
127 133 }
128 134  
129 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 138 Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId);
132 139 // 获得 ProcessInstance Map
133   - Map<String, HistoricProcessInstance> historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
  140 + Map<String, HistoricProcessInstance> historicProcessInstanceMap =
  141 + processInstanceService.getHistoricProcessInstanceMap(
134 142 convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
135 143 // 获得 User Map
136 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 152 @Override
... ... @@ -151,17 +160,22 @@ public class BpmTaskServiceImpl implements BpmTaskService{
151 160 @Override
152 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 165 .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序
157 166 .list();
158 167 if (CollUtil.isEmpty(tasks)) {
159 168 return Collections.emptyList();
160 169 }
161   -
162 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 179 // 获得 ProcessInstance Map
166 180 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
167 181 // 获得 User Map
... ... @@ -172,7 +186,25 @@ public class BpmTaskServiceImpl implements BpmTaskService{
172 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 210 @Override
... ... @@ -199,9 +231,9 @@ public class BpmTaskServiceImpl implements BpmTaskService{
199 231 task.getTaskDefinitionKey());
200 232 if (CollUtil.isNotEmpty(bpmTaskAssignRuleList) && bpmTaskAssignRuleList.size() > 0) {
201 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 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 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 296 @Override
... ... @@ -247,40 +306,40 @@ public class BpmTaskServiceImpl implements BpmTaskService{
247 306 taskService.setAssignee(id, String.valueOf(userId));
248 307 }
249 308  
250   -
251 309 @Override
252 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 313 taskExtMapper.insert(taskExtDO);
256 314 }
257 315  
258 316 @Override
259 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 319 taskExtMapper.updateByTaskId(taskExtDO);
263 320 }
264 321  
265 322 @Override
266 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 326 taskExtMapper.updateByTaskId(taskExtDO);
271 327 // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。
272 328 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
273 329 @Override
274 330 public void afterCommit() {
275   - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
  331 + ProcessInstance processInstance =
  332 + processInstanceService.getProcessInstance(task.getProcessInstanceId());
276 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 343 * @param userId 用户 id
285 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 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 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 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 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 8 import org.flowable.engine.runtime.ProcessInstance;
9 9 import org.flowable.engine.test.Deployment;
10 10 import org.flowable.task.api.Task;
11   -import org.junit.Test;
  11 +import org.junit.jupiter.api.Test;
12 12  
13 13 import java.text.SimpleDateFormat;
14 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 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 8  
9 9 /**
10 10 * System 模块的 Security 配置
  11 + * @author kemengkai
11 12 */
12 13 @Configuration("systemSecurityConfiguration")
13 14 public class SecurityConfiguration {
... ...