Commit c761f5258a2a4bbc5dadb871de8d7ad216e1fa56

Authored by jason
1 parent d6455569

工作流 Flowable 流程实例 相关实现

Showing 17 changed files with 822 additions and 0 deletions
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http renamed to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java renamed to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java renamed to yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java
@@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition; @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
6 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; 7 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
7 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; 9 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
8 import io.swagger.annotations.Api; 10 import io.swagger.annotations.Api;
9 import io.swagger.annotations.ApiImplicitParam; 11 import io.swagger.annotations.ApiImplicitParam;
@@ -17,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController; @@ -17,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
17 19
18 import javax.annotation.Resource; 20 import javax.annotation.Resource;
19 21
  22 +import java.util.List;
  23 +
20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 25
22 @Api(tags = "管理后台 - 流程定义") 26 @Api(tags = "管理后台 - 流程定义")
@@ -36,6 +40,14 @@ public class BpmProcessDefinitionController { @@ -36,6 +40,14 @@ public class BpmProcessDefinitionController {
36 return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO)); 40 return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO));
37 } 41 }
38 42
  43 + @GetMapping ("/list")
  44 + @ApiOperation(value = "获得流程定义列表")
  45 + @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
  46 + public CommonResult<List<BpmProcessDefinitionRespVO>> getProcessDefinitionList(
  47 + BpmProcessDefinitionListReqVO listReqVO) {
  48 + return success(bpmDefinitionService.getProcessDefinitionList(listReqVO));
  49 + }
  50 +
39 @GetMapping ("/get-bpmn-xml") 51 @GetMapping ("/get-bpmn-xml")
40 @ApiOperation(value = "获得流程定义的 BPMN XML") 52 @ApiOperation(value = "获得流程定义的 BPMN XML")
41 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class) 53 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO;
  7 +import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService;
  8 +import io.swagger.annotations.Api;
  9 +import io.swagger.annotations.ApiImplicitParam;
  10 +import io.swagger.annotations.ApiImplicitParams;
  11 +import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.*;
  15 +
  16 +import javax.annotation.Resource;
  17 +import javax.validation.Valid;
  18 +import java.util.List;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +@Api(tags = "管理后台 - 任务分配规则")
  23 +@RestController
  24 +@RequestMapping("/bpm/task-assign-rule")
  25 +@Validated
  26 +public class BpmTaskAssignRuleController {
  27 +
  28 + @Resource
  29 + private BpmTaskAssignRuleService taskAssignRuleService;
  30 +
  31 + @GetMapping("/list")
  32 + @ApiOperation(value = "获得任务分配规则列表")
  33 + @ApiImplicitParams({
  34 + @ApiImplicitParam(name = "modelId", value = "模型编号", example = "1024", dataTypeClass = String.class),
  35 + @ApiImplicitParam(name = "processDefinitionId", value = "流程定义的编号", example = "2048", dataTypeClass = String.class)
  36 + })
  37 + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:query')")
  38 + public CommonResult<List<BpmTaskAssignRuleRespVO>> getTaskAssignRuleList(
  39 + @RequestParam(value = "modelId", required = false) String modelId,
  40 + @RequestParam(value = "processDefinitionId", required = false) String processDefinitionId) {
  41 + return success(taskAssignRuleService.getTaskAssignRuleList(modelId, processDefinitionId));
  42 + }
  43 +
  44 + @PostMapping("/create")
  45 + @ApiOperation(value = "创建任务分配规则")
  46 + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:create')")
  47 + public CommonResult<Long> createTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleCreateReqVO reqVO) {
  48 + return success(taskAssignRuleService.createTaskAssignRule(reqVO));
  49 + }
  50 +
  51 + @PutMapping("/update")
  52 + @ApiOperation(value = "更新任务分配规则")
  53 + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:update')")
  54 + public CommonResult<Boolean> updateTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleUpdateReqVO reqVO) {
  55 + taskAssignRuleService.updateTaskAssignRule(reqVO);
  56 + return success(true);
  57 + }
  58 +
  59 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
  9 +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
  10 +import io.swagger.annotations.Api;
  11 +import io.swagger.annotations.ApiImplicitParam;
  12 +import io.swagger.annotations.ApiOperation;
  13 +import org.springframework.security.access.prepost.PreAuthorize;
  14 +import org.springframework.validation.annotation.Validated;
  15 +import org.springframework.web.bind.annotation.*;
  16 +
  17 +import javax.annotation.Resource;
  18 +import javax.validation.Valid;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  22 +
  23 +@Api(tags = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请”
  24 +@RestController
  25 +@RequestMapping("/bpm/process-instance")
  26 +@Validated
  27 +public class BpmProcessInstanceController {
  28 + @Resource
  29 + private BpmProcessInstanceService processInstanceService;
  30 +
  31 + @GetMapping("/my-page")
  32 + @ApiOperation(value = "获得我的实例分页列表", notes = "在【我的流程】菜单中,进行调用")
  33 + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
  34 + public CommonResult<PageResult<BpmProcessInstancePageItemRespVO>> getMyProcessInstancePage(
  35 + @Valid BpmProcessInstanceMyPageReqVO pageReqVO) {
  36 + return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO));
  37 + }
  38 +
  39 + @PostMapping("/create")
  40 + @ApiOperation("新建流程实例")
  41 + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
  42 + public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) {
  43 + return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO));
  44 + }
  45 +
  46 + @GetMapping("/get")
  47 + @ApiOperation(value = "获得指定流程实例", notes = "在【流程详细】界面中,进行调用")
  48 + @ApiImplicitParam(name = "id", value = "流程实例的编号", required = true, dataTypeClass = String.class)
  49 + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
  50 + public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
  51 + return success(processInstanceService.getProcessInstanceVO(id));
  52 + }
  53 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  8 +import io.swagger.annotations.Api;
  9 +import io.swagger.annotations.ApiOperation;
  10 +import org.flowable.bpmn.model.BpmnModel;
  11 +import org.flowable.engine.TaskService;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.GetMapping;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RestController;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.validation.Valid;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  22 +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
  23 +
  24 +@Api(tags = "管理后台 - 流程任务实例")
  25 +@RestController
  26 +@RequestMapping("/bpm/task")
  27 +@Validated
  28 +public class BpmTaskController {
  29 +
  30 + @Resource
  31 + private BpmTaskService taskService;
  32 +
  33 + @GetMapping("todo-page")
  34 + @ApiOperation("获取 Todo 待办任务分页")
  35 + @PreAuthorize("@ss.hasPermission('bpm:task:query')")
  36 + public CommonResult<PageResult<BpmTaskTodoPageItemRespVO>> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) {
  37 + return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO));
  38 + }
  39 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java
@@ -12,6 +12,7 @@ import org.flowable.engine.repository.ProcessDefinition; @@ -12,6 +12,7 @@ import org.flowable.engine.repository.ProcessDefinition;
12 import org.mapstruct.Mapper; 12 import org.mapstruct.Mapper;
13 import org.mapstruct.Mapping; 13 import org.mapstruct.Mapping;
14 import org.mapstruct.MappingTarget; 14 import org.mapstruct.MappingTarget;
  15 +import org.mapstruct.Named;
15 import org.mapstruct.factory.Mappers; 16 import org.mapstruct.factory.Mappers;
16 17
17 import java.util.List; 18 import java.util.List;
@@ -41,6 +42,26 @@ public interface BpmProcessDefinitionConvert { @@ -41,6 +42,26 @@ public interface BpmProcessDefinitionConvert {
41 }); 42 });
42 } 43 }
43 44
  45 + default List<BpmProcessDefinitionRespVO> convertList3(List<ProcessDefinition> list,
  46 + Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap) {
  47 + return CollectionUtils.convertList(list, processDefinition -> {
  48 + BpmProcessDefinitionRespVO respVO = convert3(processDefinition);
  49 + BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId());
  50 + // 复制通用属性
  51 + copyTo(processDefinitionExtDO, respVO);
  52 + return respVO;
  53 + });
  54 + }
  55 +
  56 + @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState")
  57 + BpmProcessDefinitionRespVO convert3(ProcessDefinition bean);
  58 +
  59 + @Named("convertSuspendedToSuspensionState")
  60 + default Integer convertSuspendedToSuspensionState(boolean suspended) {
  61 + return suspended ? SuspensionState.SUSPENDED.getStateCode() :
  62 + SuspensionState.ACTIVE.getStateCode();
  63 + }
  64 +
44 default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, 65 default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment,
45 BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { 66 BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) {
46 BpmProcessDefinitionPageItemRespVO respVO = convert(bean); 67 BpmProcessDefinitionPageItemRespVO respVO = convert(bean);
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.convert.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
  6 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
  7 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  8 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  9 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  10 +import org.flowable.engine.history.HistoricProcessInstance;
  11 +import org.flowable.engine.repository.ProcessDefinition;
  12 +import org.flowable.task.api.Task;
  13 +import org.mapstruct.Mapper;
  14 +import org.mapstruct.Mapping;
  15 +import org.mapstruct.MappingTarget;
  16 +import org.mapstruct.factory.Mappers;
  17 +
  18 +import java.util.List;
  19 +import java.util.Map;
  20 +
  21 +/**
  22 + * 流程实例 Convert
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +@Mapper
  27 +public interface BpmProcessInstanceConvert {
  28 +
  29 + BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class);
  30 +
  31 + default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<BpmProcessInstanceExtDO> page,
  32 + Map<String, List<Task>> taskMap) {
  33 + List<BpmProcessInstancePageItemRespVO> list = convertList(page.getList());
  34 + list.forEach(respVO -> respVO.setTasks(convertList2(taskMap.get(respVO.getId()))));
  35 + return new PageResult<>(list, page.getTotal());
  36 + }
  37 +
  38 + List<BpmProcessInstancePageItemRespVO> convertList(List<BpmProcessInstanceExtDO> list);
  39 +
  40 + List<BpmProcessInstancePageItemRespVO.Task> convertList2(List<Task> tasks);
  41 +
  42 + default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt,
  43 + ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt,
  44 + String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
  45 + BpmProcessInstanceRespVO respVO = convert2(processInstance);
  46 + copyTo(processInstanceExt, respVO);
  47 + // definition
  48 + respVO.setProcessDefinition(convert2(processDefinition));
  49 + copyTo(processDefinitionExt, respVO.getProcessDefinition());
  50 + respVO.getProcessDefinition().setBpmnXml(bpmnXml);
  51 + // user
  52 + if (startUser != null) {
  53 + respVO.setStartUser(convert2(startUser));
  54 + if (dept != null) {
  55 + respVO.getStartUser().setDeptName(dept.getName());
  56 + }
  57 + }
  58 + return respVO;
  59 + }
  60 +
  61 + BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean);
  62 +
  63 + @Mapping(source = "from.id", target = "to.id", ignore = true)
  64 + void copyTo(BpmProcessInstanceExtDO from, @MappingTarget BpmProcessInstanceRespVO to);
  65 +
  66 + BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);
  67 +
  68 + @Mapping(source = "from.id", target = "to.id", ignore = true)
  69 + void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
  70 +
  71 + BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
  72 +
  73 +
  74 +
  75 +
  76 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.convert.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  4 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
  8 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  9 +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
  10 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  12 +
  13 +import org.flowable.common.engine.impl.db.SuspensionState;
  14 +import org.flowable.engine.history.HistoricProcessInstance;
  15 +import org.flowable.engine.runtime.ProcessInstance;
  16 +import org.flowable.task.api.Task;
  17 +import org.flowable.task.api.history.HistoricTaskInstance;
  18 +import org.mapstruct.*;
  19 +import org.mapstruct.factory.Mappers;
  20 +
  21 +import java.util.List;
  22 +import java.util.Map;
  23 +
  24 +/**
  25 + * Bpm 任务 Convert
  26 + *
  27 + * @author 芋道源码
  28 + */
  29 +@Mapper
  30 +public interface BpmTaskConvert {
  31 +
  32 + BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class);
  33 +
  34 + default List<BpmTaskTodoPageItemRespVO> convertList1(List<Task> tasks, Map<String, ProcessInstance> processInstanceMap,
  35 + Map<Long, AdminUserRespDTO> userMap) {
  36 + return CollectionUtils.convertList(tasks, task -> {
  37 + BpmTaskTodoPageItemRespVO respVO = convert1(task);
  38 + ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId());
  39 + if (processInstance != null) {
  40 + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
  41 + respVO.setProcessInstance(convert(processInstance, startUser));
  42 + }
  43 + return respVO;
  44 + });
  45 + }
  46 +
  47 + @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState")
  48 + BpmTaskTodoPageItemRespVO convert1(Task bean);
  49 +
  50 + @Named("convertSuspendedToSuspensionState")
  51 + default Integer convertSuspendedToSuspensionState(boolean suspended) {
  52 + return suspended ? SuspensionState.SUSPENDED.getStateCode() :
  53 + SuspensionState.ACTIVE.getStateCode();
  54 + }
  55 +
  56 + @Mappings({
  57 + @Mapping(source = "processInstance.id", target = "id"),
  58 + @Mapping(source = "processInstance.name", target = "name"),
  59 + @Mapping(source = "processInstance.startUserId", target = "startUserId"),
  60 + @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),
  61 + @Mapping(source = "startUser.nickname", target = "startUserNickname")
  62 + })
  63 + BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser);
  64 +
  65 +
  66 +}
  67 +
  68 +
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java
@@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.bpm.service.definition; @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.bpm.service.definition;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
6 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; 7 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
7 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
8 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; 10 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
9 import org.flowable.bpmn.model.BpmnModel; 11 import org.flowable.bpmn.model.BpmnModel;
@@ -32,6 +34,14 @@ public interface BpmProcessDefinitionService { @@ -32,6 +34,14 @@ public interface BpmProcessDefinitionService {
32 PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO); 34 PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
33 35
34 /** 36 /**
  37 + * 获得流程定义列表
  38 + *
  39 + * @param listReqVO 列表入参
  40 + * @return 流程定义列表
  41 + */
  42 + List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO);
  43 +
  44 + /**
35 * 创建流程定义 45 * 创建流程定义
36 * 46 *
37 * @param createReqDTO 创建信息 47 * @param createReqDTO 创建信息
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
@@ -5,8 +5,10 @@ import cn.hutool.core.util.ObjectUtil; @@ -5,8 +5,10 @@ import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.PageUtils; 7 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; 9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; 10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
  11 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
10 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; 12 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 13 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 14 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
@@ -229,6 +231,27 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -229,6 +231,27 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
229 } 231 }
230 232
231 @Override 233 @Override
  234 + public List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) {
  235 + // 拼接查询条件
  236 + ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
  237 + if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), listReqVO.getSuspensionState())) {
  238 + definitionQuery.suspended();
  239 + } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), listReqVO.getSuspensionState())) {
  240 + definitionQuery.active();
  241 + }
  242 + // 执行查询
  243 + List<ProcessDefinition> processDefinitions = definitionQuery.list();
  244 +
  245 + // 获得 BpmProcessDefinitionDO Map
  246 + List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
  247 + convertList(processDefinitions, ProcessDefinition::getId));
  248 + Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = convertMap(processDefinitionDOs,
  249 + BpmProcessDefinitionExtDO::getProcessDefinitionId);
  250 + // 执行查询,并返回
  251 + return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap);
  252 + }
  253 +
  254 + @Override
232 public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { 255 public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
233 ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); 256 ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
234 if (StrUtil.isNotBlank(pageVO.getKey())) { 257 if (StrUtil.isNotBlank(pageVO.getKey())) {
@@ -262,4 +285,6 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ @@ -262,4 +285,6 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
262 return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap, 285 return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
263 processDefinitionDOMap, formMap), definitionCount); 286 processDefinitionDOMap, formMap), definitionCount);
264 } 287 }
  288 +
  289 +
265 } 290 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.definition;
  2 +
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO;
  4 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO;
  6 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
  7 +import org.springframework.lang.Nullable;
  8 +
  9 +import javax.validation.Valid;
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * BPM 任务分配规则 Service 接口
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +public interface BpmTaskAssignRuleService {
  18 +
  19 + /**
  20 + * 获得流程定义的任务分配规则数组
  21 + *
  22 + * @param processDefinitionId 流程定义的编号
  23 + * @param taskDefinitionKey 流程任务定义的 Key。允许空
  24 + * @return 任务规则数组
  25 + */
  26 + List<BpmTaskAssignRuleDO> getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId,
  27 + @Nullable String taskDefinitionKey);
  28 +
  29 + /**
  30 + * 获得流程模型的任务规则数组
  31 + *
  32 + * @param modelId 流程模型的编号
  33 + * @return 任务规则数组
  34 + */
  35 + List<BpmTaskAssignRuleDO> getTaskAssignRuleListByModelId(String modelId);
  36 +
  37 + /**
  38 + * 获得流程定义的任务分配规则数组
  39 + *
  40 + * @param modelId 流程模型的编号
  41 + * @param processDefinitionId 流程定义的编号
  42 + * @return 任务规则数组
  43 + */
  44 + List<BpmTaskAssignRuleRespVO> getTaskAssignRuleList(String modelId, String processDefinitionId);
  45 +
  46 + /**
  47 + * 创建任务分配规则
  48 + *
  49 + * @param reqVO 创建信息
  50 + * @return 规则编号
  51 + */
  52 + Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO);
  53 +
  54 + /**
  55 + * 更新任务分配规则
  56 + *
  57 + * @param reqVO 创建信息
  58 + */
  59 + void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO);
  60 +
  61 + /**
  62 + * 判断指定流程模型和流程定义的分配规则是否相等
  63 + *
  64 + * @param modelId 流程模型编号
  65 + * @param processDefinitionId 流程定义编号
  66 + * @return 是否相等
  67 + */
  68 + boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId);
  69 +
  70 + /**
  71 + * 将流程流程模型的任务分配规则,复制一份给流程定义
  72 + * 目的:每次流程模型部署时,都会生成一个新的流程定义,此时考虑到每次部署的流程不可变性,所以需要复制一份给该流程定义
  73 + *
  74 + * @param fromModelId 流程模型编号
  75 + * @param toProcessDefinitionId 流程定义编号
  76 + */
  77 + void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId);
  78 +
  79 + /**
  80 + * 校验流程模型的任务分配规则全部都配置了
  81 + * 目的:如果有规则未配置,会导致流程任务找不到负责人,进而流程无法进行下去!
  82 + *
  83 + * @param id 流程模型编号
  84 + */
  85 + void checkTaskAssignRuleAllConfig(String id);
  86 +
  87 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
  9 +import org.flowable.engine.history.HistoricProcessInstance;
  10 +import org.flowable.engine.runtime.ProcessInstance;
  11 +
  12 +import javax.validation.Valid;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +import java.util.Set;
  16 +
  17 +/**
  18 + * 流程实例 Service 接口
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +public interface BpmProcessInstanceService {
  23 +
  24 + /**
  25 + * 获得流程实例列表
  26 + *
  27 + * @param ids 流程实例的编号集合
  28 + * @return 流程实例列表
  29 + */
  30 + List<ProcessInstance> getProcessInstances(Set<String> ids);
  31 +
  32 + /**
  33 + * 获得流程实例 Map
  34 + *
  35 + * @param ids 流程实例的编号集合
  36 + * @return 流程实例列表 Map
  37 + */
  38 + default Map<String, ProcessInstance> getProcessInstanceMap(Set<String> ids) {
  39 + return CollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId);
  40 + }
  41 +
  42 + /**
  43 + * 获得流程实例的分页
  44 + *
  45 + * @param userId 用户编号
  46 + * @param pageReqVO 分页请求
  47 + * @return 流程实例的分页
  48 + */
  49 + PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
  50 + @Valid BpmProcessInstanceMyPageReqVO pageReqVO);
  51 +
  52 + /**
  53 + * 创建流程实例(提供给前端)
  54 + *
  55 + * @param userId 用户编号
  56 + * @param createReqVO 创建信息
  57 + * @return 实例的编号
  58 + */
  59 + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO);
  60 +
  61 + /**
  62 + * 获得流程实例 VO 信息
  63 + *
  64 + * @param id 流程实例的编号
  65 + * @return 流程实例
  66 + */
  67 + BpmProcessInstanceRespVO getProcessInstanceVO(String id);
  68 +
  69 + /**
  70 + * 获得历史的流程实例
  71 + *
  72 + * @param id 流程实例的编号
  73 + * @return 历史的流程实例
  74 + */
  75 + HistoricProcessInstance getHistoricProcessInstance(String id);
  76 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.task;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
  9 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
  10 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
  11 +import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
  12 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
  13 +import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  14 +import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
  15 +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
  16 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  17 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  18 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  19 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  20 +import lombok.extern.slf4j.Slf4j;
  21 +import org.flowable.engine.HistoryService;
  22 +import org.flowable.engine.RuntimeService;
  23 +import org.flowable.engine.history.HistoricProcessInstance;
  24 +import org.flowable.engine.repository.ProcessDefinition;
  25 +import org.flowable.engine.runtime.ProcessInstance;
  26 +import org.flowable.task.api.Task;
  27 +import org.springframework.context.annotation.Lazy;
  28 +import org.springframework.stereotype.Service;
  29 +import org.springframework.validation.annotation.Validated;
  30 +
  31 +import javax.annotation.Resource;
  32 +import javax.validation.Valid;
  33 +import java.util.List;
  34 +import java.util.Map;
  35 +import java.util.Set;
  36 +
  37 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  38 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  39 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
  40 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
  41 +
  42 +/**
  43 + * 流程实例 Service 实现类
  44 + *
  45 + * ProcessDefinition & ProcessInstance & Execution & Task 的关系:
  46 + * 1. https://blog.csdn.net/bobozai86/article/details/105210414
  47 + *
  48 + * HistoricProcessInstance & ProcessInstance 的关系:
  49 + * 1.https://my.oschina.net/843294669/blog/719024
  50 + * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例
  51 + *
  52 + * @author 芋道源码
  53 + */
  54 +@Service
  55 +@Validated
  56 +@Slf4j
  57 +public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService {
  58 +
  59 + @Resource
  60 + private RuntimeService runtimeService;
  61 + @Resource
  62 + private BpmProcessInstanceExtMapper processInstanceExtMapper;
  63 + @Resource
  64 + @Lazy // 解决循环依赖
  65 + private BpmTaskService taskService;
  66 + @Resource
  67 + private BpmProcessDefinitionService processDefinitionService;
  68 + @Resource
  69 + private HistoryService historyService;
  70 + @Resource
  71 + private AdminUserApi adminUserApi;
  72 + @Resource
  73 + private DeptApi deptApi;
  74 + @Override
  75 + public List<ProcessInstance> getProcessInstances(Set<String> ids) {
  76 + return runtimeService.createProcessInstanceQuery().processDefinitionIds(ids).list();
  77 + }
  78 +
  79 + @Override
  80 + public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
  81 + BpmProcessInstanceMyPageReqVO pageReqVO) {
  82 + // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
  83 + PageResult<BpmProcessInstanceExtDO> pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO);
  84 + if (CollUtil.isEmpty(pageResult.getList())) {
  85 + return new PageResult<>(pageResult.getTotal());
  86 + }
  87 +
  88 + // 获得流程 Task Map
  89 + List<String> processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId);
  90 + Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds);
  91 + // 转换返回
  92 + return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap);
  93 + }
  94 +
  95 + @Override
  96 + public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) {
  97 + // 获得流程定义
  98 + ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
  99 + // 发起流程
  100 + return createProcessInstance0(userId, definition, createReqVO.getVariables(), null);
  101 + }
  102 +
  103 + @Override
  104 + public BpmProcessInstanceRespVO getProcessInstanceVO(String id) {
  105 + // 获得流程实例
  106 + HistoricProcessInstance processInstance = getHistoricProcessInstance(id);
  107 + if (processInstance == null) {
  108 + return null;
  109 + }
  110 + BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id);
  111 + Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id);
  112 +
  113 + // 获得流程定义
  114 + ProcessDefinition processDefinition = processDefinitionService
  115 + .getProcessDefinition(processInstance.getProcessDefinitionId());
  116 + Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId());
  117 + BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt(
  118 + processInstance.getProcessDefinitionId());
  119 + Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id);
  120 + String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId());
  121 +
  122 + // 获得 User
  123 + AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
  124 + DeptRespDTO dept = null;
  125 + if (startUser != null) {
  126 + dept = deptApi.getDept(startUser.getDeptId());
  127 + }
  128 +
  129 + // 拼接结果
  130 + return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt,
  131 + processDefinition, processDefinitionExt, bpmnXml, startUser, dept);
  132 + }
  133 +
  134 + /**
  135 + * 获得历史的流程实例
  136 + *
  137 + * @param id 流程实例的编号
  138 + * @return 历史的流程实例
  139 + */
  140 + @Override
  141 + public HistoricProcessInstance getHistoricProcessInstance(String id) {
  142 + return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();
  143 + }
  144 +
  145 + private String createProcessInstance0(Long userId, ProcessDefinition definition,
  146 + Map<String, Object> variables, String businessKey) {
  147 + // 校验流程定义
  148 + if (definition == null) {
  149 + throw exception(PROCESS_DEFINITION_NOT_EXISTS);
  150 + }
  151 + if (definition.isSuspended()) {
  152 + throw exception(PROCESS_DEFINITION_IS_SUSPENDED);
  153 + }
  154 +
  155 + // 创建流程实例
  156 + ProcessInstance instance = runtimeService.startProcessInstanceById(definition.getId(), businessKey, variables);
  157 + // 设置流程名字
  158 + runtimeService.setProcessInstanceName(instance.getId(), definition.getName());
  159 +
  160 + // 补全流程实例的拓展表
  161 + processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId())
  162 + .setFormVariables(variables));
  163 +
  164 +
  165 + return instance.getId();
  166 + }
  167 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO;
  7 +import org.flowable.task.api.Task;
  8 +
  9 +
  10 +import java.util.List;
  11 +import java.util.Map;
  12 +
  13 +/**
  14 + * 流程任务实例 Service 接口
  15 + *
  16 + * @author jason
  17 + * @author 芋道源码
  18 + */
  19 +public interface BpmTaskService {
  20 + /**
  21 + * 获得待办的流程任务分页
  22 + *
  23 + * @param userId 用户编号
  24 + * @param pageReqVO 分页请求
  25 + * @return 流程任务分页
  26 + */
  27 + PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO);
  28 +
  29 + /**
  30 + * 获得流程任务 Map
  31 + *
  32 + * @param processInstanceIds 流程实例的编号数组
  33 + * @return 流程任务 Map
  34 + */
  35 + default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) {
  36 + return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds),
  37 + Task::getProcessInstanceId);
  38 + }
  39 +
  40 + /**
  41 + * 获得流程任务列表
  42 + *
  43 + * @param processInstanceIds 流程实例的编号数组
  44 + * @return 流程任务列表
  45 + */
  46 + List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
  47 +}
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.task;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.PageUtils;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO;
  9 +import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
  10 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  12 +import lombok.extern.slf4j.Slf4j;
  13 +import org.flowable.engine.TaskService;
  14 +import org.flowable.engine.runtime.ProcessInstance;
  15 +import org.flowable.task.api.Task;
  16 +import org.flowable.task.api.TaskQuery;
  17 +import org.springframework.stereotype.Service;
  18 +
  19 +import javax.annotation.Resource;
  20 +import java.util.Collections;
  21 +import java.util.List;
  22 +import java.util.Map;
  23 +
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  25 +
  26 +/**
  27 + * 流程任务实例 Service 实现类
  28 + *
  29 + * @author jason
  30 + * @author 芋道源码
  31 + */
  32 +@Slf4j
  33 +@Service
  34 +public class BpmTaskServiceImpl implements BpmTaskService{
  35 +
  36 + @Resource
  37 + private TaskService taskService;
  38 + @Resource
  39 + private AdminUserApi adminUserApi;
  40 + @Resource
  41 + private BpmProcessInstanceService processInstanceService;
  42 +
  43 + @Override
  44 + public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
  45 + // 查询待办任务
  46 + TaskQuery taskQuery = taskService.createTaskQuery()
  47 + .taskAssignee(String.valueOf(userId)) // 分配给自己
  48 + .orderByTaskCreateTime().desc(); // 创建时间倒序
  49 + if (StrUtil.isNotBlank(pageVO.getName())) {
  50 + taskQuery.taskNameLike("%" + pageVO.getName() + "%");
  51 + }
  52 + if (pageVO.getBeginCreateTime() != null) {
  53 + taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime());
  54 + }
  55 + if (pageVO.getEndCreateTime() != null) {
  56 + taskQuery.taskCreatedBefore(pageVO.getEndCreateTime());
  57 + }
  58 + // 执行查询
  59 + List<Task> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
  60 + if (CollUtil.isEmpty(tasks)) {
  61 + return PageResult.empty(taskQuery.count());
  62 + }
  63 +
  64 + // 获得 ProcessInstance Map
  65 + Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
  66 + convertSet(tasks, Task::getProcessInstanceId));
  67 + // 获得 User Map
  68 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  69 + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
  70 + // 拼接结果
  71 + return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap),
  72 + taskQuery.count());
  73 + }
  74 +
  75 + @Override
  76 + public List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds) {
  77 + if (CollUtil.isEmpty(processInstanceIds)) {
  78 + return Collections.emptyList();
  79 + }
  80 + return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list();
  81 + }
  82 +}