Commit c761f5258a2a4bbc5dadb871de8d7ad216e1fa56
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 | +} |