Commit 4e7f5489a5b57bb6d99ebb69cc8ac2c414a5034c

Authored by YunaiV
1 parent 95ce628c

BPM 模型重构 6:增加任务分配规则的列表 API 接口

Showing 22 changed files with 336 additions and 98 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.http 0 → 100644
  1 +### 请求 /bpm/task-assign-rule/list 接口 => 成功
  2 +GET {{baseUrl}}/bpm/task-assign-rule/list?processDefinitionId=leave:9:59689ba0-7284-11ec-965c-a2380e71991a
  3 +tenant-id: 1
  4 +Authorization: Bearer {{token}}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/BpmTaskAssignRuleController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
  6 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  7 +import io.swagger.annotations.Api;
  8 +import org.springframework.validation.annotation.Validated;
  9 +import org.springframework.web.bind.annotation.GetMapping;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RequestParam;
  12 +import org.springframework.web.bind.annotation.RestController;
  13 +
  14 +import javax.annotation.Resource;
  15 +import java.util.Collections;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  19 +
  20 +@Api(tags = "任务分配规则")
  21 +@RestController
  22 +@RequestMapping("/bpm/task-assign-rule")
  23 +@Validated
  24 +public class BpmTaskAssignRuleController {
  25 +
  26 + @Resource
  27 + private BpmTaskAssignRuleService taskAssignRuleService;
  28 +
  29 + @GetMapping("/list")
  30 + public CommonResult<List<BpmTaskAssignRuleRespVO>> getTaskAssignRuleList(
  31 + @RequestParam(value = "modelId", required = false) String modelId,
  32 + @RequestParam(value = "processDefinitionId", required = false) String processDefinitionId) {
  33 + return success(taskAssignRuleService.getTaskAssignRules(modelId, processDefinitionId));
  34 + }
  35 +
  36 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.util.Set;
  6 +
  7 +@Data
  8 +public class BpmTaskAssignRuleBaseVO {
  9 +
  10 + private Integer type;
  11 +
  12 + private Set<Long> options;
  13 +
  14 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule;
  2 +
  3 +import java.util.Set;
  4 +
  5 +public class BpmTaskAssignRuleCreateReqVO extends BpmTaskAssignRuleBaseVO {
  6 +
  7 + private String modelId;
  8 +
  9 + private String taskDefinitionKey;
  10 +
  11 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule;
  2 +
  3 +import lombok.Data;
  4 +
  5 +@Data
  6 +public class BpmTaskAssignRuleRespVO extends BpmTaskAssignRuleBaseVO {
  7 +
  8 + private Long id;
  9 +
  10 + private String modelId;
  11 +
  12 + private String processDefinitionId;
  13 +
  14 + private String taskDefinitionKey;
  15 + private String taskDefinitionName;
  16 +
  17 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule;
  2 +
  3 +import java.util.Set;
  4 +
  5 +public class BpmTaskAssignRuleUpdateReqVO extends BpmTaskAssignRuleBaseVO {
  6 +
  7 + private Long id;
  8 +
  9 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmDefinitionConvert.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmProcessDefinitionConvert.java
@@ -23,9 +23,9 @@ import java.util.Map; @@ -23,9 +23,9 @@ import java.util.Map;
23 * @author yunlong.li 23 * @author yunlong.li
24 */ 24 */
25 @Mapper 25 @Mapper
26 -public interface BpmDefinitionConvert { 26 +public interface BpmProcessDefinitionConvert {
27 27
28 - BpmDefinitionConvert INSTANCE = Mappers.getMapper(BpmDefinitionConvert.class); 28 + BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class);
29 29
30 default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap, 30 default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap,
31 Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) { 31 Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/definition/BpmTaskAssignRuleConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.definition;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  6 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  7 +import org.activiti.bpmn.model.UserTask;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +import java.util.function.Function;
  14 +
  15 +@Mapper
  16 +public interface BpmTaskAssignRuleConvert {
  17 +
  18 + BpmTaskAssignRuleConvert INSTANCE = Mappers.getMapper(BpmTaskAssignRuleConvert.class);
  19 +
  20 + default List<BpmTaskAssignRuleRespVO> convertList(List<UserTask> tasks, List<BpmTaskAssignRuleDO> rules) {
  21 + Map<String, BpmTaskAssignRuleDO> ruleMap = CollectionUtils.convertMap(rules, BpmTaskAssignRuleDO::getTaskDefinitionKey);
  22 + // 以 UserTask 为主维度,原因是:流程图编辑后,一些规则实际就没用了。
  23 + return CollectionUtils.convertList(tasks, task -> {
  24 + BpmTaskAssignRuleRespVO respVO = convert(ruleMap.get(task.getId()));
  25 + if (respVO == null) {
  26 + respVO = new BpmTaskAssignRuleRespVO();
  27 + respVO.setTaskDefinitionKey(task.getId());
  28 + }
  29 + respVO.setTaskDefinitionName(task.getName());
  30 + return respVO;
  31 + });
  32 + }
  33 +
  34 + BpmTaskAssignRuleRespVO convert(BpmTaskAssignRuleDO bean);
  35 +
  36 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskRuleDO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition; 1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum; 3 import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleScriptEnum;
4 -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleTypeEnum; 4 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; 6 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
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;
10 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
11 import lombok.*; 10 import lombok.*;
12 import org.activiti.engine.repository.Model; 11 import org.activiti.engine.repository.Model;
13 import org.activiti.engine.repository.ProcessDefinition; 12 import org.activiti.engine.repository.ProcessDefinition;
14 import org.activiti.engine.task.Task; 13 import org.activiti.engine.task.Task;
15 14
16 -import java.util.List;  
17 import java.util.Set; 15 import java.util.Set;
18 16
19 /** 17 /**
20 - * Bpm 任务规则表,用于自定义配置每个任务的负责人的分配规则。 18 + * Bpm 任务分配的规则表,用于自定义配置每个任务的负责人、候选人的分配规则。
21 * 也就是说,废弃 BPMN 原本的 UserTask 设置的 assignee、candidateUsers 等配置,而是通过使用该规则进行计算对应的负责人。 19 * 也就是说,废弃 BPMN 原本的 UserTask 设置的 assignee、candidateUsers 等配置,而是通过使用该规则进行计算对应的负责人。
22 * 20 *
23 * 1. 默认情况下,{@link #processDefinitionId} 为 {@link #PROCESS_DEFINITION_ID_NULL} 值,表示贵改则与流程模型关联 21 * 1. 默认情况下,{@link #processDefinitionId} 为 {@link #PROCESS_DEFINITION_ID_NULL} 值,表示贵改则与流程模型关联
@@ -25,19 +23,19 @@ import java.util.Set; @@ -25,19 +23,19 @@ import java.util.Set;
25 * 23 *
26 * @author 芋道源码 24 * @author 芋道源码
27 */ 25 */
28 -@TableName(value = "bpm_task_rule", autoResultMap = true) 26 +@TableName(value = "bpm_task_assign_rule", autoResultMap = true)
29 @Data 27 @Data
30 @EqualsAndHashCode(callSuper = true) 28 @EqualsAndHashCode(callSuper = true)
31 @ToString(callSuper = true) 29 @ToString(callSuper = true)
32 @Builder 30 @Builder
33 @NoArgsConstructor 31 @NoArgsConstructor
34 @AllArgsConstructor 32 @AllArgsConstructor
35 -public class BpmTaskRuleDO extends BaseDO { 33 +public class BpmTaskAssignRuleDO extends BaseDO {
36 34
37 /** 35 /**
38 * {@link #processDefinitionId} 空串,用于标识属于流程模型,而不属于流程定义 36 * {@link #processDefinitionId} 空串,用于标识属于流程模型,而不属于流程定义
39 */ 37 */
40 - private static final String PROCESS_DEFINITION_ID_NULL = ""; 38 + public static final String PROCESS_DEFINITION_ID_NULL = "";
41 39
42 /** 40 /**
43 * 编号 41 * 编号
@@ -67,7 +65,7 @@ public class BpmTaskRuleDO extends BaseDO { @@ -67,7 +65,7 @@ public class BpmTaskRuleDO extends BaseDO {
67 /** 65 /**
68 * 规则类型 66 * 规则类型
69 * 67 *
70 - * 枚举 {@link BpmTaskRuleTypeEnum} 68 + * 枚举 {@link BpmTaskAssignRuleTypeEnum}
71 */ 69 */
72 @TableField("`type`") 70 @TableField("`type`")
73 private Integer type; 71 private Integer type;
@@ -75,12 +73,12 @@ public class BpmTaskRuleDO extends BaseDO { @@ -75,12 +73,12 @@ public class BpmTaskRuleDO extends BaseDO {
75 * 规则值数组,一般关联指定表的编号 73 * 规则值数组,一般关联指定表的编号
76 * 根据 type 不同,对应的值是不同的: 74 * 根据 type 不同,对应的值是不同的:
77 * 75 *
78 - * 1. {@link BpmTaskRuleTypeEnum#ROLE} 时:角色编号  
79 - * 2. {@link BpmTaskRuleTypeEnum#DEPT} 时:部门编号  
80 - * 3. {@link BpmTaskRuleTypeEnum#DEPT_LEADER} 时:部门编号  
81 - * 4. {@link BpmTaskRuleTypeEnum#USER} 时:用户编号  
82 - * 5. {@link BpmTaskRuleTypeEnum#USER_GROUP} 时:用户组编号  
83 - * 6. {@link BpmTaskRuleTypeEnum#SCRIPT} 时:脚本编号,目前通过 {@link BpmTaskRuleScriptEnum#getId()} 标识 76 + * 1. {@link BpmTaskAssignRuleTypeEnum#ROLE} 时:角色编号
  77 + * 2. {@link BpmTaskAssignRuleTypeEnum#DEPT} 时:部门编号
  78 + * 3. {@link BpmTaskAssignRuleTypeEnum#DEPT_LEADER} 时:部门编号
  79 + * 4. {@link BpmTaskAssignRuleTypeEnum#USER} 时:用户编号
  80 + * 5. {@link BpmTaskAssignRuleTypeEnum#USER_GROUP} 时:用户组编号
  81 + * 6. {@link BpmTaskAssignRuleTypeEnum#SCRIPT} 时:脚本编号,目前通过 {@link BpmTaskRuleScriptEnum#getId()} 标识
84 */ 82 */
85 @TableField(typeHandler = JsonLongSetTypeHandler.class) 83 @TableField(typeHandler = JsonLongSetTypeHandler.class)
86 private Set<Long> options; 84 private Set<Long> options;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition;
  2 +
  3 +// TODO 芋艿:先埋个坑。任务消息的配置规则。说白了,就是不同的
  4 +public class BpmTaskMessageRuleDO {
  5 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskRuleMapper.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition; 1 package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskRuleDO; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
@@ -9,13 +9,19 @@ import org.springframework.lang.Nullable; @@ -9,13 +9,19 @@ import org.springframework.lang.Nullable;
9 import java.util.List; 9 import java.util.List;
10 10
11 @Mapper 11 @Mapper
12 -public interface BpmTaskRuleMapper extends BaseMapperX<BpmTaskRuleDO> { 12 +public interface BpmTaskAssignRuleMapper extends BaseMapperX<BpmTaskAssignRuleDO> {
13 13
14 - default List<BpmTaskRuleDO> selectListByProcessDefinitionId(String processDefinitionId,  
15 - @Nullable String taskDefinitionKey) {  
16 - return selectList(new QueryWrapperX<BpmTaskRuleDO>() 14 + default List<BpmTaskAssignRuleDO> selectListByProcessDefinitionId(String processDefinitionId,
  15 + @Nullable String taskDefinitionKey) {
  16 + return selectList(new QueryWrapperX<BpmTaskAssignRuleDO>()
17 .eq("process_definition_id", processDefinitionId) 17 .eq("process_definition_id", processDefinitionId)
18 .eqIfPresent("task_definition_key", taskDefinitionKey)); 18 .eqIfPresent("task_definition_key", taskDefinitionKey));
19 } 19 }
20 20
  21 + default List<BpmTaskAssignRuleDO> selectListByModelId(String modelId) {
  22 + return selectList(new QueryWrapperX<BpmTaskAssignRuleDO>()
  23 + .eq("model_id", modelId)
  24 + .eq("process_definition_id", BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL));
  25 + }
  26 +
21 } 27 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskRuleTypeEnum.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java
@@ -4,13 +4,13 @@ import lombok.AllArgsConstructor; @@ -4,13 +4,13 @@ import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
5 5
6 /** 6 /**
7 - * BPM 任务规则的类型枚举 7 + * BPM 任务分配规则的类型枚举
8 * 8 *
9 * @author 芋道源码 9 * @author 芋道源码
10 */ 10 */
11 @Getter 11 @Getter
12 @AllArgsConstructor 12 @AllArgsConstructor
13 -public enum BpmTaskRuleTypeEnum { 13 +public enum BpmTaskAssignRuleTypeEnum {
14 14
15 ROLE(10, "指定角色"), 15 ROLE(10, "指定角色"),
16 16
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; 3 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory;
4 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; 4 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener;
5 -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskRuleService; 5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
6 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; 6 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
7 import org.springframework.context.annotation.Bean; 7 import org.springframework.context.annotation.Bean;
8 import org.springframework.context.annotation.Configuration; 8 import org.springframework.context.annotation.Configuration;
@@ -45,7 +45,7 @@ public class BpmActivitiConfiguration { @@ -45,7 +45,7 @@ public class BpmActivitiConfiguration {
45 } 45 }
46 46
47 @Bean 47 @Bean
48 - public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskRuleService taskRuleService) { 48 + public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService) {
49 BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); 49 BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory();
50 bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); 50 bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService);
51 return bpmActivityBehaviorFactory; 51 return bpmActivityBehaviorFactory;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; 1 package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmUserTaskActivitiBehavior;  
4 -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskRuleService; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
5 import lombok.Data; 4 import lombok.Data;
6 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
7 import lombok.Setter; 6 import lombok.Setter;
@@ -22,7 +21,7 @@ import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFacto @@ -22,7 +21,7 @@ import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFacto
22 public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { 21 public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory {
23 22
24 @Setter 23 @Setter
25 - private BpmTaskRuleService bpmTaskRuleService; 24 + private BpmTaskAssignRuleService bpmTaskRuleService;
26 25
27 @Override 26 @Override
28 public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { 27 public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) {
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java
@@ -3,11 +3,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio @@ -3,11 +3,10 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavio
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.RandomUtil; 4 import cn.hutool.core.util.RandomUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskRuleDO;  
7 -import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskRuleTypeEnum;  
8 -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskRuleService; 6 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
10 -import cn.iocoder.yudao.framework.common.util.collection.SetUtils;  
11 import lombok.Setter; 10 import lombok.Setter;
12 import org.activiti.bpmn.model.UserTask; 11 import org.activiti.bpmn.model.UserTask;
13 import org.activiti.engine.ActivitiException; 12 import org.activiti.engine.ActivitiException;
@@ -29,7 +28,7 @@ import java.util.Set; @@ -29,7 +28,7 @@ import java.util.Set;
29 public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { 28 public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
30 29
31 @Setter 30 @Setter
32 - private BpmTaskRuleService bpmTaskRuleService; 31 + private BpmTaskAssignRuleService bpmTaskRuleService;
33 32
34 public BpmUserTaskActivitiBehavior(UserTask userTask) { 33 public BpmUserTaskActivitiBehavior(UserTask userTask) {
35 super(userTask); 34 super(userTask);
@@ -40,7 +39,7 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @@ -40,7 +39,7 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
40 String assignee, String owner, List<String> candidateUsers, List<String> candidateGroups, 39 String assignee, String owner, List<String> candidateUsers, List<String> candidateGroups,
41 TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution) { 40 TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution) {
42 // 获得任务的规则 41 // 获得任务的规则
43 - BpmTaskRuleDO rule = getTaskRule(task); 42 + BpmTaskAssignRuleDO rule = getTaskRule(task);
44 // 获得任务的候选用户们 43 // 获得任务的候选用户们
45 Set<Long> candidateUserIds = calculateTaskCandidateUsers(task, rule); 44 Set<Long> candidateUserIds = calculateTaskCandidateUsers(task, rule);
46 // 设置负责人 45 // 设置负责人
@@ -53,8 +52,8 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @@ -53,8 +52,8 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
53 } 52 }
54 } 53 }
55 54
56 - private BpmTaskRuleDO getTaskRule(TaskEntity task) {  
57 - List<BpmTaskRuleDO> taskRules = bpmTaskRuleService.getTaskRulesByProcessDefinitionId(task.getProcessDefinitionId(), 55 + private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) {
  56 + List<BpmTaskAssignRuleDO> taskRules = bpmTaskRuleService.getTaskAssignRulesByProcessDefinitionId(task.getProcessDefinitionId(),
58 task.getTaskDefinitionKey()); 57 task.getTaskDefinitionKey());
59 if (CollUtil.isEmpty(taskRules)) { 58 if (CollUtil.isEmpty(taskRules)) {
60 throw new ActivitiException(StrUtil.format("流程任务({}/{}/{}) 找不到符合的任务规则", 59 throw new ActivitiException(StrUtil.format("流程任务({}/{}/{}) 找不到符合的任务规则",
@@ -73,17 +72,17 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @@ -73,17 +72,17 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
73 return CollUtil.get(candidateUserIds, index); 72 return CollUtil.get(candidateUserIds, index);
74 } 73 }
75 74
76 - private Set<Long> calculateTaskCandidateUsers(TaskEntity task, BpmTaskRuleDO rule) { 75 + private Set<Long> calculateTaskCandidateUsers(TaskEntity task, BpmTaskAssignRuleDO rule) {
77 Set<Long> assigneeUserIds = null; 76 Set<Long> assigneeUserIds = null;
78 - if (Objects.equals(BpmTaskRuleTypeEnum.ROLE.getType(), rule.getType())) { 77 + if (Objects.equals(BpmTaskAssignRuleTypeEnum.ROLE.getType(), rule.getType())) {
79 assigneeUserIds = calculateTaskCandidateUsersByRole(task, rule); 78 assigneeUserIds = calculateTaskCandidateUsersByRole(task, rule);
80 - } else if (Objects.equals(BpmTaskRuleTypeEnum.DEPT.getType(), rule.getType())) { 79 + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT.getType(), rule.getType())) {
81 assigneeUserIds = calculateTaskCandidateUsersByDept(task, rule); 80 assigneeUserIds = calculateTaskCandidateUsersByDept(task, rule);
82 - } else if (Objects.equals(BpmTaskRuleTypeEnum.DEPT_LEADER.getType(), rule.getType())) { 81 + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType(), rule.getType())) {
83 assigneeUserIds = calculateTaskCandidateUsersByDept(task, rule); 82 assigneeUserIds = calculateTaskCandidateUsersByDept(task, rule);
84 - } else if (Objects.equals(BpmTaskRuleTypeEnum.USER.getType(), rule.getType())) { 83 + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER.getType(), rule.getType())) {
85 assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule); 84 assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule);
86 - } else if (Objects.equals(BpmTaskRuleTypeEnum.USER_GROUP.getType(), rule.getType())) { 85 + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType(), rule.getType())) {
87 assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule); 86 assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule);
88 } 87 }
89 88
@@ -96,28 +95,28 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { @@ -96,28 +95,28 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
96 return assigneeUserIds; 95 return assigneeUserIds;
97 } 96 }
98 97
99 - private Set<Long> calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskRuleDO rule) { 98 + private Set<Long> calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskAssignRuleDO rule) {
100 throw new UnsupportedOperationException("暂不支持该任务规则"); 99 throw new UnsupportedOperationException("暂不支持该任务规则");
101 } 100 }
102 101
103 102
104 - private Set<Long> calculateTaskCandidateUsersByDept(TaskEntity task, BpmTaskRuleDO rule) { 103 + private Set<Long> calculateTaskCandidateUsersByDept(TaskEntity task, BpmTaskAssignRuleDO rule) {
105 throw new UnsupportedOperationException("暂不支持该任务规则"); 104 throw new UnsupportedOperationException("暂不支持该任务规则");
106 } 105 }
107 106
108 - private Set<Long> calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskRuleDO rule) { 107 + private Set<Long> calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskAssignRuleDO rule) {
109 throw new UnsupportedOperationException("暂不支持该任务规则"); 108 throw new UnsupportedOperationException("暂不支持该任务规则");
110 } 109 }
111 110
112 - private Set<Long> calculateTaskCandidateUsersByUser(TaskEntity task, BpmTaskRuleDO rule) { 111 + private Set<Long> calculateTaskCandidateUsersByUser(TaskEntity task, BpmTaskAssignRuleDO rule) {
113 return rule.getOptions(); 112 return rule.getOptions();
114 } 113 }
115 114
116 - private Set<Long> calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskRuleDO rule) { 115 + private Set<Long> calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskAssignRuleDO rule) {
117 throw new UnsupportedOperationException("暂不支持该任务规则"); 116 throw new UnsupportedOperationException("暂不支持该任务规则");
118 } 117 }
119 118
120 - private Set<Long> calculateTaskCandidateUsersByScript(TaskEntity task, BpmTaskRuleDO rule) { 119 + private Set<Long> calculateTaskCandidateUsersByScript(TaskEntity task, BpmTaskAssignRuleDO rule) {
121 throw new UnsupportedOperationException("暂不支持该任务规则"); 120 throw new UnsupportedOperationException("暂不支持该任务规则");
122 } 121 }
123 122
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import org.activiti.bpmn.model.BpmnModel;
5 6
6 import javax.validation.Valid; 7 import javax.validation.Valid;
7 8
@@ -66,4 +67,12 @@ public interface BpmModelService { @@ -66,4 +67,12 @@ public interface BpmModelService {
66 */ 67 */
67 void updateModelState(String id, Integer state); 68 void updateModelState(String id, Integer state);
68 69
  70 + /**
  71 + * 获得流程模型编号对应的 BPMN Model
  72 + *
  73 + * @param id 流程模型编号
  74 + * @return BPMN Model
  75 + */
  76 + BpmnModel getBpmnModel(String id);
  77 +
69 } 78 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskRuleService.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmTaskAssignRuleService.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskRuleDO; 3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
4 import org.springframework.lang.Nullable; 5 import org.springframework.lang.Nullable;
5 6
6 import java.util.List; 7 import java.util.List;
7 8
8 /** 9 /**
9 - * BPM 任务规则 Service 接口 10 + * BPM 任务分配规则 Service 接口
10 * 11 *
11 * @author 芋道源码 12 * @author 芋道源码
12 */ 13 */
13 -public interface BpmTaskRuleService { 14 +public interface BpmTaskAssignRuleService {
14 15
15 /** 16 /**
16 - * 获得流程定义的任务规则数组 17 + * 获得流程定义的任务分配规则数组
17 * 18 *
18 * @param processDefinitionId 流程定义的编号 19 * @param processDefinitionId 流程定义的编号
19 * @param taskDefinitionKey 流程任务定义的 Key。允许空 20 * @param taskDefinitionKey 流程任务定义的 Key。允许空
20 * @return 任务规则数组 21 * @return 任务规则数组
21 */ 22 */
22 - List<BpmTaskRuleDO> getTaskRulesByProcessDefinitionId(String processDefinitionId,  
23 - @Nullable String taskDefinitionKey); 23 + List<BpmTaskAssignRuleDO> getTaskAssignRulesByProcessDefinitionId(String processDefinitionId,
  24 + @Nullable String taskDefinitionKey);
24 25
25 /** 26 /**
26 * 获得流程模型的任务规则数组 27 * 获得流程模型的任务规则数组
@@ -28,7 +29,17 @@ public interface BpmTaskRuleService { @@ -28,7 +29,17 @@ public interface BpmTaskRuleService {
28 * @param modelId 流程模型的编号 29 * @param modelId 流程模型的编号
29 * @return 任务规则数组 30 * @return 任务规则数组
30 */ 31 */
31 - List<BpmTaskRuleDO> getTaskRulesByModelId(Long modelId); 32 + List<BpmTaskAssignRuleDO> getTaskAssignRulesByModelId(String modelId);
  33 +
  34 +
  35 + /**
  36 + * 获得流程定义的任务分配规则数组
  37 + *
  38 + * @param processDefinitionId 流程模型的编号
  39 + * @param processDefinitionId 流程定义的编号
  40 + * @return 任务规则数组
  41 + */
  42 + List<BpmTaskAssignRuleRespVO> getTaskAssignRules(String modelId, String processDefinitionId);
32 43
33 // TODO 芋艿:创建任务规则 44 // TODO 芋艿:创建任务规则
34 // TODO 芋艿:复制任务规则 45 // TODO 芋艿:复制任务规则
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl;
2 2
  3 +import cn.hutool.core.util.ArrayUtil;
3 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*; 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.model.*;
5 import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert; 6 import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmModelConvert;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefini @@ -9,6 +10,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefini
9 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService; 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmFormService;
10 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService;
11 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; 12 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
  13 +import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils;
12 import cn.iocoder.yudao.framework.common.pojo.PageResult; 14 import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 15 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
14 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 16 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
@@ -210,6 +212,15 @@ public class BpmModelServiceImpl implements BpmModelService { @@ -210,6 +212,15 @@ public class BpmModelServiceImpl implements BpmModelService {
210 bpmProcessDefinitionService.updateProcessDefinitionState(definition.getId(), state); 212 bpmProcessDefinitionService.updateProcessDefinitionState(definition.getId(), state);
211 } 213 }
212 214
  215 + @Override
  216 + public BpmnModel getBpmnModel(String id) {
  217 + byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
  218 + if (ArrayUtil.isEmpty(bpmnBytes)) {
  219 + return null;
  220 + }
  221 + return ActivitiUtils.buildBpmnModel(bpmnBytes);
  222 + }
  223 +
213 private Model getModelByKey(String key) { 224 private Model getModelByKey(String key) {
214 return repositoryService.createModelQuery().modelKey(key).singleResult(); 225 return repositoryService.createModelQuery().modelKey(key).singleResult();
215 } 226 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmProcessDefinitionServiceImpl.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process
6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; 6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
7 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; 7 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO;
8 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; 8 import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO;
9 -import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmDefinitionConvert; 9 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmProcessDefinitionConvert;
10 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 10 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
11 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; 11 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO;
12 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; 12 import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
@@ -90,7 +90,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -90,7 +90,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
90 90
91 // 拼接结果 91 // 拼接结果
92 long definitionCount = definitionQuery.count(); 92 long definitionCount = definitionQuery.count();
93 - return new PageResult<>(BpmDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap, 93 + return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
94 processDefinitionDOMap, formMap), definitionCount); 94 processDefinitionDOMap, formMap), definitionCount);
95 } 95 }
96 96
@@ -112,7 +112,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -112,7 +112,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
112 Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = CollectionUtils.convertMap(processDefinitionDOs, 112 Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = CollectionUtils.convertMap(processDefinitionDOs,
113 BpmProcessDefinitionExtDO::getProcessDefinitionId); 113 BpmProcessDefinitionExtDO::getProcessDefinitionId);
114 // 执行查询,并返回 114 // 执行查询,并返回
115 - return BpmDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap); 115 + return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap);
116 } 116 }
117 117
118 @Override 118 @Override
@@ -196,7 +196,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -196,7 +196,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
196 } 196 }
197 197
198 // 插入拓展表 198 // 插入拓展表
199 - BpmProcessDefinitionExtDO definitionDO = BpmDefinitionConvert.INSTANCE.convert2(createReqDTO) 199 + BpmProcessDefinitionExtDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO)
200 .setProcessDefinitionId(definition.getId()); 200 .setProcessDefinitionId(definition.getId());
201 processDefinitionMapper.insert(definitionDO); 201 processDefinitionMapper.insert(definitionDO);
202 return definition.getId(); 202 return definition.getId();
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskAssignRuleServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmTaskAssignRuleConvert;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
  9 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService;
  10 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  11 +import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
  12 +import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils;
  13 +import lombok.extern.slf4j.Slf4j;
  14 +import org.activiti.bpmn.model.BpmnModel;
  15 +import org.activiti.bpmn.model.UserTask;
  16 +import org.springframework.context.annotation.Lazy;
  17 +import org.springframework.stereotype.Service;
  18 +import org.springframework.validation.annotation.Validated;
  19 +
  20 +import javax.annotation.Resource;
  21 +import java.util.Collections;
  22 +import java.util.List;
  23 +
  24 +/**
  25 + * BPM 任务分配规则 Service 实现类
  26 + */
  27 +@Service
  28 +@Validated
  29 +@Slf4j
  30 +public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
  31 +
  32 + @Resource
  33 + private BpmTaskAssignRuleMapper taskRuleMapper;
  34 +
  35 + @Resource
  36 + @Lazy // 解决循环依赖
  37 + private BpmModelService modelService;
  38 + @Resource
  39 + @Lazy // 解决循环依赖
  40 + private BpmProcessDefinitionService processDefinitionService;
  41 +
  42 + @Override
  43 + public List<BpmTaskAssignRuleDO> getTaskAssignRulesByProcessDefinitionId(String processDefinitionId,
  44 + String taskDefinitionKey) {
  45 + return taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, taskDefinitionKey);
  46 + }
  47 +
  48 + @Override
  49 + public List<BpmTaskAssignRuleDO> getTaskAssignRulesByModelId(String modelId) {
  50 + return taskRuleMapper.selectListByModelId(modelId);
  51 + }
  52 +
  53 + @Override
  54 + public List<BpmTaskAssignRuleRespVO> getTaskAssignRules(String modelId, String processDefinitionId) {
  55 + // 获得规则
  56 + List<BpmTaskAssignRuleDO> rules = Collections.emptyList();
  57 + BpmnModel model = null;
  58 + if (StrUtil.isNotEmpty(modelId)) {
  59 + rules = getTaskAssignRulesByModelId(modelId);
  60 + model = modelService.getBpmnModel(modelId);
  61 + } else if (StrUtil.isNotEmpty(processDefinitionId)) {
  62 + rules = getTaskAssignRulesByProcessDefinitionId(processDefinitionId, null);
  63 + model = processDefinitionService.getBpmnModel(processDefinitionId);
  64 + }
  65 + if (CollUtil.isEmpty(rules) || model == null) {
  66 + return Collections.emptyList();
  67 + }
  68 +
  69 + // 获得用户任务,只有用户任务才可以设置分配规则
  70 + List<UserTask> userTasks = ActivitiUtils.getBpmnModelElements(model, UserTask.class);
  71 + if (CollUtil.isEmpty(userTasks)) {
  72 + return Collections.emptyList();
  73 + }
  74 +
  75 + // 转换数据
  76 + return BpmTaskAssignRuleConvert.INSTANCE.convertList(userTasks, rules);
  77 + }
  78 +
  79 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmTaskRuleServiceImpl.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskRuleDO;  
4 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmTaskRuleMapper;  
5 -import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskRuleService;  
6 -import lombok.extern.slf4j.Slf4j;  
7 -import org.springframework.stereotype.Service;  
8 -import org.springframework.validation.annotation.Validated;  
9 -  
10 -import javax.annotation.Resource;  
11 -import java.util.List;  
12 -  
13 -/**  
14 - * BPM 任务规则 Service 实现类  
15 - */  
16 -@Service  
17 -@Validated  
18 -@Slf4j  
19 -public class BpmTaskRuleServiceImpl implements BpmTaskRuleService {  
20 -  
21 - @Resource  
22 - private BpmTaskRuleMapper taskRuleMapper;  
23 -  
24 - @Override  
25 - public List<BpmTaskRuleDO> getTaskRulesByProcessDefinitionId(String processDefinitionId,  
26 - String taskDefinitionKey) {  
27 - return taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, taskDefinitionKey);  
28 - }  
29 -  
30 - @Override  
31 - public List<BpmTaskRuleDO> getTaskRulesByModelId(Long modelId) {  
32 - return null;  
33 - }  
34 -  
35 -}  
yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
@@ -4,11 +4,15 @@ import cn.hutool.core.util.ReflectUtil; @@ -4,11 +4,15 @@ import cn.hutool.core.util.ReflectUtil;
4 import com.alibaba.ttl.TransmittableThreadLocal; 4 import com.alibaba.ttl.TransmittableThreadLocal;
5 import org.activiti.bpmn.converter.BpmnXMLConverter; 5 import org.activiti.bpmn.converter.BpmnXMLConverter;
6 import org.activiti.bpmn.model.BpmnModel; 6 import org.activiti.bpmn.model.BpmnModel;
7 -import org.activiti.engine.history.HistoricProcessInstance; 7 +import org.activiti.bpmn.model.FlowElement;
  8 +import org.activiti.bpmn.model.Process;
8 import org.activiti.engine.impl.identity.Authentication; 9 import org.activiti.engine.impl.identity.Authentication;
9 -import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntityImpl;  
10 -import org.activiti.engine.impl.persistence.entity.HistoricScopeInstanceEntityImpl;  
11 -import org.activiti.engine.impl.util.io.StringStreamSource; 10 +import org.activiti.engine.impl.util.io.BytesStreamSource;
  11 +
  12 +import javax.xml.bind.Element;
  13 +import java.util.ArrayList;
  14 +import java.util.List;
  15 +import java.util.function.Consumer;
12 16
13 /** 17 /**
14 * Activiti 工具类 18 * Activiti 工具类
@@ -42,4 +46,29 @@ public class ActivitiUtils { @@ -42,4 +46,29 @@ public class ActivitiUtils {
42 46
43 // ========== BPMN XML 相关 ========== 47 // ========== BPMN XML 相关 ==========
44 48
  49 +
  50 + /**
  51 + * 构建对应的 BPMN Model
  52 + *
  53 + * @param bpmnBytes 原始的 BPMN XML 字节数组
  54 + * @return BPMN Model
  55 + */
  56 + public static BpmnModel buildBpmnModel(byte[] bpmnBytes) {
  57 + // 转换成 BpmnModel 对象
  58 + BpmnXMLConverter converter = new BpmnXMLConverter();
  59 + return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true);
  60 + }
  61 +
  62 + public static <T extends FlowElement> List<T> getBpmnModelElements(BpmnModel model, Class<T> clazz) {
  63 + List<T> result = new ArrayList<>();
  64 + model.getProcesses().forEach(process -> {
  65 + process.getFlowElements().forEach(flowElement -> {
  66 + if (flowElement.getClass().isAssignableFrom(clazz)) {
  67 + result.add((T) flowElement);
  68 + }
  69 + });
  70 + });
  71 + return result;
  72 + }
  73 +
45 } 74 }