Commit b5777b57f18212ea23d62f1cd1d5003bf1853fa3
Committed by
Gitee
!863 添加assigne处理器
Merge pull request !863 from 云开/feature/BPM_CC_COPY
Showing
5 changed files
with
102 additions
and
74 deletions
yudao-framework/yudao-spring-boot-starter-flowable/src/main/java/cn/iocoder/yudao/framework/flowable/core/enums/ProcessConstants.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.flowable.core.enums; | |
| 2 | + | |
| 3 | +/** | |
| 4 | + * 流程常量信息 | |
| 5 | + */ | |
| 6 | +public interface ProcessConstants { | |
| 7 | + | |
| 8 | + String BPMN_FILE_SUFFIX = ".bpmn"; | |
| 9 | + | |
| 10 | + /** | |
| 11 | + * nameapace | |
| 12 | + * bpmn中的命名空间 | |
| 13 | + * 这个东西有可能导致无法切换工作流程的实现 | |
| 14 | + */ | |
| 15 | + String NAMESPASE = "http://flowable.org/bpmn"; | |
| 16 | + | |
| 17 | + /** | |
| 18 | + * 自定义属性 dataType | |
| 19 | + */ | |
| 20 | + String PROCESS_CUSTOM_DATA_TYPE = "dataType"; | |
| 21 | + | |
| 22 | +} | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java
| ... | ... | @@ -49,7 +49,7 @@ public class BpmProcessInstanceCopyController { |
| 49 | 49 | @PostMapping("/create") |
| 50 | 50 | @Operation(summary = "抄送流程") |
| 51 | 51 | @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") |
| 52 | - public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | |
| 52 | + public CommonResult<Boolean> createProcessInstanceCopy(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | |
| 53 | 53 | processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO); |
| 54 | 54 | return success(true); |
| 55 | 55 | } |
| ... | ... | @@ -57,7 +57,7 @@ public class BpmProcessInstanceCopyController { |
| 57 | 57 | @GetMapping("/my-page") |
| 58 | 58 | @Operation(summary = "获得抄送流程分页列表") |
| 59 | 59 | @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") |
| 60 | - public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCCPage( | |
| 60 | + public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCopyPage( | |
| 61 | 61 | @Valid BpmProcessInstanceCopyMyPageReqVO pageReqVO) { |
| 62 | 62 | PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyService.getMyProcessInstanceCopyPage(getLoginUserId(), pageReqVO); |
| 63 | 63 | if (CollUtil.isEmpty(pageResult.getList())) { | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmProcessInstanceCopyVO.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.time.LocalDateTime; | |
| 7 | - | |
| 8 | -// TODO @kyle:1)明确是 Req 还是 Resp;2)注释可以合并到 swagger 里;3)example 写一下,这样一些 mock 接口平台可以读取 example | |
| 9 | -/** | |
| 10 | - * 流程抄送视图对象 | |
| 11 | - */ | |
| 12 | -@Data | |
| 13 | -public class BpmProcessInstanceCopyVO { | |
| 14 | - | |
| 15 | - /** | |
| 16 | - * 编号 | |
| 17 | - */ | |
| 18 | - @Schema(description = "抄送主键") | |
| 19 | - private Long id; | |
| 20 | - | |
| 21 | - /** | |
| 22 | - * 发起人Id | |
| 23 | - */ | |
| 24 | - @Schema(description = "发起人Id") | |
| 25 | - private Long startUserId; | |
| 26 | - | |
| 27 | - @Schema(description = "发起人别名") | |
| 28 | - private String startUserNickname; | |
| 29 | - | |
| 30 | - /** | |
| 31 | - * 流程主键 | |
| 32 | - */ | |
| 33 | - @Schema(description = "流程实例的主键") | |
| 34 | - private String processInstanceId; | |
| 35 | - | |
| 36 | - @Schema(description = "流程实例的名字") | |
| 37 | - private String processInstanceName; | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * 任务主键 | |
| 41 | - */ | |
| 42 | - @Schema(description = "发起抄送的任务编号") | |
| 43 | - private String taskId; | |
| 44 | - | |
| 45 | - @Schema(description = "发起抄送的任务名称") | |
| 46 | - private String taskName; | |
| 47 | - /** | |
| 48 | - * 用户主键 | |
| 49 | - */ | |
| 50 | - @Schema(description = "用户编号") | |
| 51 | - private Long userId; | |
| 52 | - | |
| 53 | - @Schema(description = "用户别名") | |
| 54 | - private Long userNickname; | |
| 55 | - | |
| 56 | - @Schema(description = "抄送原因") | |
| 57 | - private String reason; | |
| 58 | - | |
| 59 | - @Schema(description = "抄送人") | |
| 60 | - private String creator; | |
| 61 | - | |
| 62 | - @Schema(description = "抄送时间") | |
| 63 | - private LocalDateTime createTime; | |
| 64 | - | |
| 65 | -} |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/handler/MultiInstanceHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.bpm.framework.flowable.core.handler; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.hutool.core.util.ObjectUtil; | |
| 5 | +import cn.iocoder.yudao.framework.flowable.core.enums.ProcessConstants; | |
| 6 | +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; | |
| 7 | +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | |
| 8 | +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | |
| 9 | +import jakarta.annotation.Resource; | |
| 10 | +import lombok.AllArgsConstructor; | |
| 11 | +import org.flowable.bpmn.model.FlowElement; | |
| 12 | +import org.flowable.bpmn.model.UserTask; | |
| 13 | +import org.flowable.engine.delegate.DelegateExecution; | |
| 14 | +import org.springframework.stereotype.Component; | |
| 15 | + | |
| 16 | +import java.util.ArrayList; | |
| 17 | +import java.util.LinkedHashSet; | |
| 18 | +import java.util.List; | |
| 19 | +import java.util.Set; | |
| 20 | +import java.util.stream.Collectors; | |
| 21 | + | |
| 22 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | |
| 23 | + | |
| 24 | +/** | |
| 25 | + * 多实例处理类 | |
| 26 | + */ | |
| 27 | +@AllArgsConstructor | |
| 28 | +@Component("multiInstanceHandler") | |
| 29 | +public class MultiInstanceHandler { | |
| 30 | + | |
| 31 | + @Resource | |
| 32 | + private AdminUserApi userApi; | |
| 33 | + | |
| 34 | + @Resource | |
| 35 | + private PermissionApi permissionApi; | |
| 36 | + | |
| 37 | + /** | |
| 38 | + * 流程发起人那种情况不需要处理, | |
| 39 | + * 由 flowable 完成 | |
| 40 | + * | |
| 41 | + * @param execution flowable的执行对象 | |
| 42 | + * @return 用户ID | |
| 43 | + */ | |
| 44 | + public Set<String> getUserIds(DelegateExecution execution) { | |
| 45 | + Set<String> candidateUserIds = new LinkedHashSet<>(); | |
| 46 | + FlowElement flowElement = execution.getCurrentFlowElement(); | |
| 47 | + if (ObjectUtil.isNotEmpty(flowElement) && flowElement instanceof UserTask userTask) { | |
| 48 | + String dataType = userTask.getAttributeValue(ProcessConstants.NAMESPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); | |
| 49 | + if ("USERS".equals(dataType) && CollUtil.isNotEmpty(userTask.getCandidateUsers())) { | |
| 50 | + // 添加候选用户id | |
| 51 | + candidateUserIds.addAll(userTask.getCandidateUsers()); | |
| 52 | + } else if (CollUtil.isNotEmpty(userTask.getCandidateGroups())) { | |
| 53 | + // 获取组的ID,角色ID集合或部门ID集合 | |
| 54 | + List<Long> groups = userTask.getCandidateGroups().stream() | |
| 55 | + // 例如部门DEPT100,100才是部门id | |
| 56 | + .map(item -> Long.parseLong(item.substring(4))) | |
| 57 | + .collect(Collectors.toList()); | |
| 58 | + List<Long> userIds = new ArrayList<>(); | |
| 59 | + if ("ROLES".equals(dataType)) { | |
| 60 | + // 通过角色id,获取所有用户id集合 | |
| 61 | + Set<Long> userRoleIdListByRoleIds = permissionApi.getUserRoleIdListByRoleIds(groups); | |
| 62 | + userIds = new ArrayList<>(userRoleIdListByRoleIds); | |
| 63 | + } else if ("DEPTS".equals(dataType)) { | |
| 64 | + // 通过部门id,获取所有用户id集合 | |
| 65 | + List<AdminUserRespDTO> userListByDeptIds = userApi.getUserListByDeptIds(groups); | |
| 66 | + userIds = convertList(userListByDeptIds, AdminUserRespDTO::getId); | |
| 67 | + } | |
| 68 | + // 添加候选用户id | |
| 69 | + userIds.forEach(id -> candidateUserIds.add(String.valueOf(id))); | |
| 70 | + } | |
| 71 | + } | |
| 72 | + return candidateUserIds; | |
| 73 | + } | |
| 74 | +} | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
| ... | ... | @@ -5,8 +5,8 @@ import cn.hutool.core.util.ObjectUtil; |
| 5 | 5 | import cn.hutool.core.util.StrUtil; |
| 6 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 7 | import cn.iocoder.yudao.framework.common.util.object.PageUtils; |
| 8 | +import cn.iocoder.yudao.framework.flowable.core.enums.ProcessConstants; | |
| 8 | 9 | import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; |
| 9 | -import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | |
| 10 | 10 | import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; |
| 11 | 11 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; |
| 12 | 12 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; |
| ... | ... | @@ -17,6 +17,8 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; |
| 17 | 17 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; |
| 18 | 18 | import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; |
| 19 | 19 | import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; |
| 20 | +import jakarta.annotation.Resource; | |
| 21 | +import jakarta.validation.Valid; | |
| 20 | 22 | import lombok.extern.slf4j.Slf4j; |
| 21 | 23 | import org.flowable.bpmn.converter.BpmnXMLConverter; |
| 22 | 24 | import org.flowable.bpmn.model.BpmnModel; |
| ... | ... | @@ -29,13 +31,10 @@ import org.flowable.engine.repository.ProcessDefinitionQuery; |
| 29 | 31 | import org.springframework.stereotype.Service; |
| 30 | 32 | import org.springframework.validation.annotation.Validated; |
| 31 | 33 | |
| 32 | -import jakarta.annotation.Resource; | |
| 33 | -import jakarta.validation.Valid; | |
| 34 | 34 | import java.util.*; |
| 35 | 35 | |
| 36 | 36 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 37 | 37 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| 38 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | |
| 39 | 38 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; |
| 40 | 39 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; |
| 41 | 40 | import static java.util.Collections.emptyList; |
| ... | ... | @@ -53,8 +52,6 @@ import static java.util.Collections.emptyList; |
| 53 | 52 | @Slf4j |
| 54 | 53 | public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { |
| 55 | 54 | |
| 56 | - private static final String BPMN_FILE_SUFFIX = ".bpmn"; | |
| 57 | - | |
| 58 | 55 | @Resource |
| 59 | 56 | private RepositoryService repositoryService; |
| 60 | 57 | |
| ... | ... | @@ -125,7 +122,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ |
| 125 | 122 | // 创建 Deployment 部署 |
| 126 | 123 | Deployment deploy = repositoryService.createDeployment() |
| 127 | 124 | .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) |
| 128 | - .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) | |
| 125 | + .addBytes(createReqDTO.getKey() + ProcessConstants.BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) | |
| 129 | 126 | .tenantId(TenantContextHolder.getTenantIdStr()) |
| 130 | 127 | .deploy(); |
| 131 | 128 | ... | ... |