Commit b083795ad6d35f64ddc36992b2abca177045b8ed

Authored by YunaiV
1 parent 1ab15dd1

实现 bpm 待办任务的后端接口

Showing 18 changed files with 299 additions and 160 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.http 0 → 100644
  1 +### 请求 /bpm/task/todo-page 接口 => 成功
  2 +GET {{baseUrl}}/bpm/task/todo-page
  3 +tenant-id: 1
  4 +Authorization: Bearer {{token}}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/TaskController.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 7 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
8 import io.swagger.annotations.Api; 8 import io.swagger.annotations.Api;
9 import io.swagger.annotations.ApiOperation; 9 import io.swagger.annotations.ApiOperation;
  10 +import org.springframework.validation.annotation.Validated;
10 import org.springframework.web.bind.annotation.*; 11 import org.springframework.web.bind.annotation.*;
11 12
12 import javax.annotation.Resource; 13 import javax.annotation.Resource;
@@ -16,48 +17,39 @@ import java.io.IOException; @@ -16,48 +17,39 @@ import java.io.IOException;
16 import java.util.List; 17 import java.util.List;
17 18
18 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  20 +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
19 21
20 -// TODO @json:swagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后  
21 -@Api(tags = "工作流待办任务") 22 +@Api(tags = "流程任务")
22 @RestController 23 @RestController
23 -@RequestMapping("/workflow/task")  
24 -public class TaskController { 24 +@RequestMapping("/bpm/task")
  25 +@Validated
  26 +public class BpmTaskController {
25 27
26 @Resource 28 @Resource
27 - private BpmTaskService bpmTaskService; 29 + private BpmTaskService taskService;
28 30
29 - @GetMapping("/todo/page")  
30 - @ApiOperation("获取待办任务分页")  
31 - public CommonResult<PageResult<TodoTaskRespVO>> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) {  
32 - return success(bpmTaskService.getTodoTaskPage(pageVO));  
33 - } 31 + // TODO 芋艿:权限、validation;
34 32
35 - @GetMapping("/claim")  
36 - @ApiOperation("签收任务")  
37 - public CommonResult<Boolean> claimTask(@RequestParam("id") String taskId) {  
38 - bpmTaskService.claimTask(taskId);  
39 - return success(true); 33 + @GetMapping("todo-page")
  34 + @ApiOperation("获取 TODO 待办任务分页")
  35 + public CommonResult<PageResult<BpmTaskTodoPageItemRespVO>> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) {
  36 + return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO));
40 } 37 }
41 38
42 @PostMapping("/task-steps") 39 @PostMapping("/task-steps")
43 public CommonResult<TaskHandleVO> getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) { 40 public CommonResult<TaskHandleVO> getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) {
44 - return success(bpmTaskService.getTaskSteps(taskQuery));  
45 - }  
46 -  
47 - @PostMapping("/formKey")  
48 - public CommonResult<TodoTaskRespVO> getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) {  
49 - return success(bpmTaskService.getTaskFormKey(taskQuery)); 41 + return success(taskService.getTaskSteps(taskQuery));
50 } 42 }
51 43
52 @PostMapping("/complete") 44 @PostMapping("/complete")
53 public CommonResult<Boolean> complete(@RequestBody TaskReqVO taskReq) { 45 public CommonResult<Boolean> complete(@RequestBody TaskReqVO taskReq) {
54 - bpmTaskService.completeTask(taskReq); 46 + taskService.completeTask(taskReq);
55 return success(true); 47 return success(true);
56 } 48 }
57 49
58 @GetMapping("/process/history-steps") 50 @GetMapping("/process/history-steps")
59 public CommonResult<List<TaskStepVO>> getHistorySteps(@RequestParam("id") String processInstanceId) { 51 public CommonResult<List<TaskStepVO>> getHistorySteps(@RequestParam("id") String processInstanceId) {
60 - return success(bpmTaskService.getHistorySteps(processInstanceId)); 52 + return success(taskService.getHistorySteps(processInstanceId));
61 } 53 }
62 54
63 /** 55 /**
@@ -66,7 +58,7 @@ public class TaskController { @@ -66,7 +58,7 @@ public class TaskController {
66 */ 58 */
67 @GetMapping("/process/highlight-img") 59 @GetMapping("/process/highlight-img")
68 public void getHighlightImg(@RequestParam String processInstanceId, HttpServletResponse response) throws IOException { 60 public void getHighlightImg(@RequestParam String processInstanceId, HttpServletResponse response) throws IOException {
69 - FileResp fileResp = bpmTaskService.getHighlightImg(processInstanceId); 61 + FileResp fileResp = taskService.getHighlightImg(processInstanceId);
70 ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte()); 62 ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte());
71 } 63 }
72 64
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import java.util.Date;
  8 +
  9 +@ApiModel(value = "流程任务的 Running 进行中的分页项 Response VO", description = "待办任务")
  10 +@Data
  11 +public class BpmTaskTodoPageItemRespVO {
  12 +
  13 + @ApiModelProperty(value = "任务编号", required = true, example = "1024")
  14 + private String id;
  15 +
  16 + @ApiModelProperty(value = "任务名字", required = true, example = "芋道")
  17 + private String name;
  18 +
  19 + @ApiModelProperty(value = "接收时间", required = true)
  20 + private Date claimTime;
  21 +
  22 + @ApiModelProperty(value = "任务状态", notes = "参见 bpm_process_instance_status", example = "1")
  23 + private Integer status;
  24 +
  25 + /**
  26 + * 所属流程实例
  27 + */
  28 + private ProcessInstance processInstance;
  29 +
  30 + @Data
  31 + @ApiModel("流程实例")
  32 + public static class ProcessInstance {
  33 +
  34 + @ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
  35 + private String id;
  36 +
  37 + @ApiModelProperty(value = "发起人的用户编号", required = true, example = "1024")
  38 + private Long startUserId;
  39 +
  40 + @ApiModelProperty(value = "发起人的用户昵称", required = true, example = "芋艿")
  41 + private String startUserNickname;
  42 +
  43 + @ApiModelProperty(value = "流程定义的编号", required = true, example = "2048")
  44 + private String processDefinitionId;
  45 +
  46 + }
  47 +
  48 + // 任务编号、任务名称、任务节点、流程版本、流程发起人、接收时间【名称、开始时间】「处理」
  49 + // 任务编号、任务名称、所属流程、委托代办人、流程发起人、优先级、状态、创建时间【名称、开始时间】「申请详情、通过、驳回、转办、历史」
  50 +
  51 + // 任务编号、任务名称、流程名称、流程发起人、接收时间、状态【名称、接收时间】【处理、委托】
  52 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/TodoTaskPageReqVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java
@@ -2,15 +2,31 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task; @@ -2,15 +2,31 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.annotations.ApiModel; 4 import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
5 import lombok.Data; 6 import lombok.Data;
6 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
7 import lombok.ToString; 8 import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
8 10
9 -@ApiModel("待办任务申请分页 Request VO") 11 +import java.util.Date;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  14 +
  15 +@ApiModel("流程任务的 TODO 待办的分页 Request VO")
10 @Data 16 @Data
11 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
12 @ToString(callSuper = true) 18 @ToString(callSuper = true)
13 -public class TodoTaskPageReqVO extends PageParam { 19 +public class BpmTaskTodoPageReqVO extends PageParam {
  20 +
  21 + @ApiModelProperty(value = "流程任务名", example = "芋道")
  22 + private String name;
  23 +
  24 + @ApiModelProperty(value = "开始的创建收间")
  25 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  26 + private Date beginCreateTime;
  27 +
  28 + @ApiModelProperty(value = "结束的创建时间")
  29 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  30 + private Date endCreateTime;
14 31
15 - private String assignee;  
16 } 32 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/TodoTaskRespVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;  
2 -  
3 -import io.swagger.annotations.ApiModel;  
4 -import lombok.Data;  
5 -import lombok.ToString;  
6 -  
7 -@ApiModel("待办任务 Response VO")  
8 -@Data  
9 -@ToString  
10 -public class TodoTaskRespVO {  
11 -  
12 - // TODO @jason:swagger 注解。这样接口文档才完整哈  
13 -  
14 - private String id;  
15 -  
16 -  
17 - private String processInstanceId;  
18 -  
19 - /**  
20 - * 1:未签收  
21 - * 2:已签收  
22 - */  
23 - private Integer status;  
24 -  
25 -  
26 - private String processName;  
27 -  
28 -  
29 - private String processKey;  
30 -  
31 -  
32 - private String businessKey;  
33 -  
34 -  
35 - private String formKey;  
36 -  
37 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java
@@ -26,7 +26,7 @@ public interface BpmProcessInstanceConvert { @@ -26,7 +26,7 @@ public interface BpmProcessInstanceConvert {
26 BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); 26 BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class);
27 27
28 @Mappings({ 28 @Mappings({
29 - @Mapping(source = "instance.startUserId", target = "userId"), 29 + @Mapping(source = "instance.startUserId", target = "startUserId"),
30 @Mapping(source = "instance.id", target = "processInstanceId"), 30 @Mapping(source = "instance.id", target = "processInstanceId"),
31 @Mapping(source = "instance.startTime", target = "createTime"), 31 @Mapping(source = "instance.startTime", target = "createTime"),
32 @Mapping(source = "definition.id", target = "processDefinitionId"), 32 @Mapping(source = "definition.id", target = "processDefinitionId"),
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.TaskStepVO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  6 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  7 +import org.activiti.engine.history.HistoricActivityInstance;
  8 +import org.activiti.engine.impl.persistence.entity.SuspensionState;
  9 +import org.activiti.engine.runtime.ProcessInstance;
  10 +import org.activiti.engine.task.Task;
  11 +import org.mapstruct.Mapper;
  12 +import org.mapstruct.Mapping;
  13 +import org.mapstruct.Mappings;
  14 +import org.mapstruct.Named;
  15 +import org.mapstruct.factory.Mappers;
  16 +
  17 +import java.util.List;
  18 +import java.util.Map;
  19 +
  20 +/**
  21 + * Bpm 任务 Convert
  22 + *
  23 + * @author 芋道源码
  24 + */
  25 +@Mapper
  26 +public interface BpmTaskConvert {
  27 +
  28 + BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class);
  29 +
  30 + @Mappings(value = {
  31 + @Mapping(source = "activityName", target = "stepName"),
  32 + @Mapping(source = "assignee", target = "assignee")
  33 + })
  34 + TaskStepVO convert(HistoricActivityInstance instance);
  35 +
  36 + default List<BpmTaskTodoPageItemRespVO> convertList(List<Task> tasks, Map<String, ProcessInstance> processInstanceMap,
  37 + Map<Long, SysUserDO> userMap) {
  38 + return CollectionUtils.convertList(tasks, task -> {
  39 + ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId());
  40 + return convert(task, processInstance, userMap.get(Long.valueOf(processInstance.getStartUserId())));
  41 + });
  42 + }
  43 +
  44 + @Mappings({
  45 + @Mapping(source = "task.id", target = "id"),
  46 + @Mapping(source = "task.name", target = "name"),
  47 + @Mapping(source = "task.claimTime", target = "claimTime"),
  48 + @Mapping(source = "task.suspended", target = "status", qualifiedByName = "convertSuspendedToStatus"),
  49 + @Mapping(source = "processInstance.id", target = "processInstance.id"),
  50 + @Mapping(source = "processInstance.startUserId", target = "processInstance.startUserId"),
  51 + @Mapping(source = "processInstance.processDefinitionId", target = "processInstance.processDefinitionId"),
  52 + @Mapping(source = "user.nickname", target = "processInstance.startUserNickname")
  53 + })
  54 + BpmTaskTodoPageItemRespVO convert(Task task, ProcessInstance processInstance, SysUserDO user);
  55 +
  56 + @Named("convertSuspendedToStatus")
  57 + default Integer convertAssigneeToStatus(boolean suspended) {
  58 + return suspended ? SuspensionState.SUSPENDED.getStateCode() :
  59 + SuspensionState.ACTIVE.getStateCode();
  60 + }
  61 +
  62 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/TaskConvert.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.TaskStepVO;  
4 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.TodoTaskRespVO;  
5 -import org.activiti.api.task.model.Task;  
6 -import org.activiti.engine.history.HistoricActivityInstance;  
7 -import org.activiti.engine.repository.ProcessDefinition;  
8 -import org.mapstruct.Mapper;  
9 -import org.mapstruct.Mapping;  
10 -import org.mapstruct.Mappings;  
11 -import org.mapstruct.Named;  
12 -import org.mapstruct.factory.Mappers;  
13 -  
14 -@Mapper  
15 -public interface TaskConvert {  
16 - TaskConvert INSTANCE = Mappers.getMapper(TaskConvert.class);  
17 -  
18 - @Mappings(value = {  
19 - @Mapping(source = "task.id", target = "id"),  
20 - @Mapping(source = "task.businessKey", target = "businessKey"),  
21 - @Mapping(source = "task.assignee", target = "status",qualifiedByName = "convertAssigneeToStatus"),  
22 - @Mapping(source = "definition.name", target = "processName"),  
23 - @Mapping(source = "definition.key", target = "processKey"),  
24 - @Mapping(source = "definition.id", target = "processInstanceId")  
25 - })  
26 - TodoTaskRespVO convert(Task task, ProcessDefinition definition);  
27 -  
28 - @Mappings(value = {  
29 - @Mapping(source = "assignee", target = "status",qualifiedByName = "convertAssigneeToStatus")  
30 - })  
31 - TodoTaskRespVO convert(Task task);  
32 -  
33 - @Named("convertAssigneeToStatus")  
34 - default Integer convertAssigneeToStatus(String assignee) {  
35 - //TODO 不应该通过 assignee 定义状态 需要定义更多的状态  
36 - return assignee == null ? 1 : 2;  
37 - }  
38 -  
39 - @Mappings(value = {  
40 - @Mapping(source = "activityName", target = "stepName"),  
41 - @Mapping(source = "assignee", target = "assignee")  
42 - })  
43 - TaskStepVO convert(HistoricActivityInstance instance);  
44 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java
@@ -33,7 +33,7 @@ public class BpmProcessInstanceExtDO extends BaseDO { @@ -33,7 +33,7 @@ public class BpmProcessInstanceExtDO extends BaseDO {
33 * 33 *
34 * 冗余 {@link HistoricProcessInstance#getStartUserId()} 34 * 冗余 {@link HistoricProcessInstance#getStartUserId()}
35 */ 35 */
36 - private Long userId; 36 + private Long startUserId;
37 /** 37 /**
38 * 流程实例的名字 38 * 流程实例的名字
39 * 39 *
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java
@@ -12,7 +12,7 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX&lt;BpmProcessInsta @@ -12,7 +12,7 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX&lt;BpmProcessInsta
12 12
13 default PageResult<BpmProcessInstanceExtDO> selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) { 13 default PageResult<BpmProcessInstanceExtDO> selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) {
14 return selectPage(reqVO, new QueryWrapperX<BpmProcessInstanceExtDO>() 14 return selectPage(reqVO, new QueryWrapperX<BpmProcessInstanceExtDO>()
15 - .eqIfPresent("user_id", userId) 15 + .eqIfPresent("start_user_id", userId)
16 .likeIfPresent("name", reqVO.getName()) 16 .likeIfPresent("name", reqVO.getName())
17 .eqIfPresent("process_definition_id", reqVO.getProcessDefinitionId()) 17 .eqIfPresent("process_definition_id", reqVO.getProcessDefinitionId())
18 .eqIfPresent("category", reqVO.getCategory()) 18 .eqIfPresent("category", reqVO.getCategory())
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
@@ -4,8 +4,13 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP @@ -4,8 +4,13 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO;
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO;
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.collection.CollectionUtils;
  8 +import org.activiti.engine.runtime.ProcessInstance;
7 9
8 import javax.validation.Valid; 10 import javax.validation.Valid;
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +import java.util.Set;
9 14
10 /** 15 /**
11 * 流程实例 Service 接口 16 * 流程实例 Service 接口
@@ -33,4 +38,22 @@ public interface BpmProcessInstanceService { @@ -33,4 +38,22 @@ public interface BpmProcessInstanceService {
33 PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId, 38 PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
34 @Valid BpmProcessInstanceMyPageReqVO pageReqVO); 39 @Valid BpmProcessInstanceMyPageReqVO pageReqVO);
35 40
  41 + /**
  42 + * 获得流程实例列表
  43 + *
  44 + * @param ids 流程实例的编号集合
  45 + * @return 流程实例列表
  46 + */
  47 + List<ProcessInstance> getProcessInstances(Set<String> ids);
  48 +
  49 + /**
  50 + * 获得流程实例 Map
  51 + *
  52 + * @param ids 流程实例的编号集合
  53 + * @return 流程实例列表 Map
  54 + */
  55 + default Map<String, ProcessInstance> getProcessInstanceMap(Set<String> ids) {
  56 + return CollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId);
  57 + }
  58 +
36 } 59 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -8,7 +7,6 @@ import org.activiti.engine.task.Task; @@ -8,7 +7,6 @@ import org.activiti.engine.task.Task;
8 7
9 import java.util.List; 8 import java.util.List;
10 import java.util.Map; 9 import java.util.Map;
11 -import java.util.Set;  
12 10
13 /** 11 /**
14 * 工作任务 Service 接口 12 * 工作任务 Service 接口
@@ -21,6 +19,14 @@ public interface BpmTaskService { @@ -21,6 +19,14 @@ public interface BpmTaskService {
21 /** 19 /**
22 * 获得流程任务列表 20 * 获得流程任务列表
23 * 21 *
  22 + * @param processInstanceId 流程实例的编号
  23 + * @return 流程任务列表
  24 + */
  25 + List<Task> getTasksByProcessInstanceId(String processInstanceId);
  26 +
  27 + /**
  28 + * 获得流程任务列表
  29 + *
24 * @param processInstanceIds 流程实例的编号数组 30 * @param processInstanceIds 流程实例的编号数组
25 * @return 流程任务列表 31 * @return 流程任务列表
26 */ 32 */
@@ -38,15 +44,28 @@ public interface BpmTaskService { @@ -38,15 +44,28 @@ public interface BpmTaskService {
38 } 44 }
39 45
40 /** 46 /**
41 - * 获取当前用户的待办任务, 分页 47 + * 获得流程任务分页
  48 + *
  49 + * @param userId 用户编号
  50 + * @param pageReqVO 分页请求
  51 + * @return 流程任务分页
  52 + */
  53 + PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO);
  54 +
  55 + /**
  56 + * 将流程任务分配给指定用户
  57 + *
  58 + * @param id 流程任务编号
  59 + * @param userId 用户编号
42 */ 60 */
43 - PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO); 61 + void updateTaskAssign(String id, Long userId);
44 62
45 /** 63 /**
46 * 签收任务 64 * 签收任务
47 - * @param taskId 用户任务id 65 + *
  66 + * @param id 任务编号
48 */ 67 */
49 - void claimTask(String taskId); 68 + void claimTask(String id);
50 69
51 /** 70 /**
52 * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment) 71 * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment)
@@ -68,13 +87,6 @@ public interface BpmTaskService { @@ -68,13 +87,6 @@ public interface BpmTaskService {
68 List<TaskStepVO> getHistorySteps(String processInstanceId); 87 List<TaskStepVO> getHistorySteps(String processInstanceId);
69 88
70 /** 89 /**
71 - * 获取用户任务的 formKey, 对应外置表单, 需要根据formKey 对应业务表单  
72 - * @param taskQuery 查询参数 ,一般taskId  
73 - */  
74 - TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);  
75 -  
76 -  
77 - /**  
78 * 返回高亮的流转进程 90 * 返回高亮的流转进程
79 * @param processInstanceId 实例Id 91 * @param processInstanceId 实例Id
80 * @return {@link FileResp} 返回文件 92 * @return {@link FileResp} 返回文件
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
@@ -26,12 +26,16 @@ import org.activiti.engine.history.HistoricProcessInstanceQuery; @@ -26,12 +26,16 @@ import org.activiti.engine.history.HistoricProcessInstanceQuery;
26 import org.activiti.engine.repository.ProcessDefinition; 26 import org.activiti.engine.repository.ProcessDefinition;
27 import org.activiti.engine.runtime.ProcessInstance; 27 import org.activiti.engine.runtime.ProcessInstance;
28 import org.activiti.engine.task.Task; 28 import org.activiti.engine.task.Task;
  29 +import org.springframework.context.annotation.Lazy;
29 import org.springframework.stereotype.Service; 30 import org.springframework.stereotype.Service;
  31 +import org.springframework.transaction.annotation.Transactional;
30 import org.springframework.validation.annotation.Validated; 32 import org.springframework.validation.annotation.Validated;
31 33
32 import javax.annotation.Resource; 34 import javax.annotation.Resource;
33 import java.util.List; 35 import java.util.List;
34 import java.util.Map; 36 import java.util.Map;
  37 +import java.util.Set;
  38 +import java.util.function.Consumer;
35 39
36 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED; 40 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
37 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS; 41 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
@@ -58,20 +62,21 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -58,20 +62,21 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
58 @Resource 62 @Resource
59 private RuntimeService runtimeService; 63 private RuntimeService runtimeService;
60 @Resource 64 @Resource
61 - private BpmTaskService taskService;  
62 - @Resource  
63 private HistoryService historyService; 65 private HistoryService historyService;
64 66
65 @Resource 67 @Resource
66 private SysUserService userService; 68 private SysUserService userService;
67 @Resource 69 @Resource
  70 + @Lazy // 解决循环依赖
  71 + private BpmTaskService taskService;
  72 + @Resource
68 private BpmProcessDefinitionService processDefinitionService; 73 private BpmProcessDefinitionService processDefinitionService;
69 74
70 @Resource 75 @Resource
71 private BpmProcessInstanceExtMapper processInstanceExtMapper; 76 private BpmProcessInstanceExtMapper processInstanceExtMapper;
72 77
73 @Override 78 @Override
74 -// @Transactional(rollbackFor = Exception.class) 79 + @Transactional(rollbackFor = Exception.class)
75 public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) { 80 public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) {
76 // 校验流程定义 81 // 校验流程定义
77 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); 82 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId());
@@ -90,6 +95,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -90,6 +95,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
90 // 记录流程实例的拓展表 95 // 记录流程实例的拓展表
91 createProcessInstanceExt(instance, definition); 96 createProcessInstanceExt(instance, definition);
92 97
  98 + // TODO 芋艿:临时使用, 保证分配
  99 + List<Task> tasks = taskService.getTasksByProcessInstanceId(instance.getId());
  100 + tasks.forEach(task -> taskService.updateTaskAssign(task.getId(), userId));
  101 +
93 // 添加初始的评论 TODO 芋艿:在思考下 102 // 添加初始的评论 TODO 芋艿:在思考下
94 // Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); 103 // Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
95 // if (task != null) { 104 // if (task != null) {
@@ -134,6 +143,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -134,6 +143,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
134 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); 143 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap);
135 } 144 }
136 145
  146 + @Override
  147 + public List<ProcessInstance> getProcessInstances(Set<String> ids) {
  148 + return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list();
  149 + }
  150 +
137 /** 151 /**
138 * 获得流程实例 152 * 获得流程实例
139 * 153 *
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
@@ -2,16 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; @@ -2,16 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.io.IoUtil; 4 import cn.hutool.core.io.IoUtil;
  5 +import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*; 6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
6 -import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.TaskConvert; 7 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmTaskConvert;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
7 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; 9 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
  10 +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 12 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 13 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
10 -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 14 +import cn.iocoder.yudao.framework.common.util.object.PageUtils;
11 import lombok.extern.slf4j.Slf4j; 15 import lombok.extern.slf4j.Slf4j;
12 -import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;  
13 -import org.activiti.api.task.model.builders.TaskPayloadBuilder;  
14 -import org.activiti.api.task.runtime.TaskRuntime;  
15 import org.activiti.bpmn.constants.BpmnXMLConstants; 16 import org.activiti.bpmn.constants.BpmnXMLConstants;
16 import org.activiti.bpmn.model.BpmnModel; 17 import org.activiti.bpmn.model.BpmnModel;
17 import org.activiti.bpmn.model.FlowNode; 18 import org.activiti.bpmn.model.FlowNode;
@@ -26,7 +27,9 @@ import org.activiti.engine.repository.ProcessDefinition; @@ -26,7 +27,9 @@ import org.activiti.engine.repository.ProcessDefinition;
26 import org.activiti.engine.runtime.ProcessInstance; 27 import org.activiti.engine.runtime.ProcessInstance;
27 import org.activiti.engine.task.Comment; 28 import org.activiti.engine.task.Comment;
28 import org.activiti.engine.task.Task; 29 import org.activiti.engine.task.Task;
  30 +import org.activiti.engine.task.TaskQuery;
29 import org.activiti.image.ProcessDiagramGenerator; 31 import org.activiti.image.ProcessDiagramGenerator;
  32 +import org.springframework.context.annotation.Lazy;
30 import org.springframework.stereotype.Service; 33 import org.springframework.stereotype.Service;
31 import org.springframework.transaction.annotation.Transactional; 34 import org.springframework.transaction.annotation.Transactional;
32 import org.springframework.util.ObjectUtils; 35 import org.springframework.util.ObjectUtils;
@@ -39,14 +42,13 @@ import java.util.*; @@ -39,14 +42,13 @@ import java.util.*;
39 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.HIGHLIGHT_IMG_ERROR; 42 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.HIGHLIGHT_IMG_ERROR;
40 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS; 43 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;
41 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 44 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  45 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
42 46
43 @Slf4j 47 @Slf4j
44 @Service 48 @Service
45 public class BpmTaskServiceImpl implements BpmTaskService { 49 public class BpmTaskServiceImpl implements BpmTaskService {
46 50
47 @Resource 51 @Resource
48 - private TaskRuntime taskRuntime;  
49 - @Resource  
50 private TaskService taskService; 52 private TaskService taskService;
51 @Resource 53 @Resource
52 private RuntimeService runtimeService; 54 private RuntimeService runtimeService;
@@ -58,6 +60,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -58,6 +60,17 @@ public class BpmTaskServiceImpl implements BpmTaskService {
58 @Resource 60 @Resource
59 private ProcessDiagramGenerator processDiagramGenerator; 61 private ProcessDiagramGenerator processDiagramGenerator;
60 62
  63 + @Resource
  64 + private SysUserService userService;
  65 + @Resource
  66 + @Lazy // 解决循环依赖
  67 + private BpmProcessInstanceService processInstanceService;
  68 +
  69 + @Override
  70 + public List<Task> getTasksByProcessInstanceId(String processInstanceId) {
  71 + return taskService.createTaskQuery().processInstanceId(processInstanceId).list();
  72 + }
  73 +
61 @Override 74 @Override
62 public List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds) { 75 public List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds) {
63 if (CollUtil.isEmpty(processInstanceIds)) { 76 if (CollUtil.isEmpty(processInstanceIds)) {
@@ -67,30 +80,52 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -67,30 +80,52 @@ public class BpmTaskServiceImpl implements BpmTaskService {
67 } 80 }
68 81
69 @Override 82 @Override
70 - public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {  
71 - // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象  
72 -// final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());  
73 -// Page<Task> pageTasks = taskRuntime.tasks(pageable);  
74 -// int totalItems = pageTasks.getTotalItems();  
75 -// List<Task> tasks = pageTasks.getContent();  
76 -// final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {  
77 -// ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());  
78 -// return TaskConvert.INSTANCE.convert(task, definition);  
79 -// }).collect(Collectors.toList());  
80 -// return new PageResult<>(respVOList, (long)totalItems);  
81 - return null; 83 + public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
  84 + // 查询待办任务
  85 + TaskQuery taskQuery = taskService.createTaskQuery()
  86 + .taskAssignee(String.valueOf(userId));
  87 + if (StrUtil.isNotBlank(pageVO.getName())) {
  88 + taskQuery.taskName("%s" + pageVO.getName() + "%s");
  89 + }
  90 + if (pageVO.getBeginCreateTime() != null) {
  91 + taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime());
  92 + }
  93 + if (pageVO.getEndCreateTime() != null) {
  94 + taskQuery.taskCreatedBefore(pageVO.getEndCreateTime());
  95 + }
  96 + // 执行查询
  97 + List<Task> tasks = taskQuery.orderByTaskCreateTime().desc() // 创建时间倒序
  98 + .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
  99 + if (CollUtil.isEmpty(tasks)) {
  100 + return PageResult.empty(taskQuery.count());
  101 + }
  102 +
  103 + // 获得 ProcessInstance Map
  104 + Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
  105 + convertSet(tasks, Task::getProcessInstanceId));
  106 +
  107 + // 获得 User Map
  108 + Map<Long, SysUserDO> userMap = userService.getUserMap(
  109 + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
  110 + // 拼接结果
  111 + return new PageResult<>(BpmTaskConvert.INSTANCE.convertList(tasks, processInstanceMap, userMap),
  112 + taskQuery.count());
82 } 113 }
83 114
  115 + @Override
  116 + public void updateTaskAssign(String id, Long userId) {
  117 + taskService.setAssignee(id, String.valueOf(userId));
  118 + }
84 119
85 @Override 120 @Override
86 - public void claimTask(String taskId) {  
87 - taskRuntime.claim(new ClaimTaskPayloadBuilder()  
88 - .withTaskId(taskId)  
89 - .withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername())  
90 - .build()); 121 + public void claimTask(String id) {
  122 +
91 } 123 }
92 124
  125 + // 任务编号、流程名称、任务节点、流程发起人、接收时间、审批时间、耗时【名称、开始时间】「流程记录、撤回」
  126 + // 任务编号、任务名称、所属流程、委托代办人、流程发起人、优先级、审批操作、审批意见、耗时、创建时间【名称、开始时间】「申请详情」
93 127
  128 + // 任务编号、任务名称、流程名称、流程发起人、接收时间、审批时间、耗时【名称、接收时间】「详情」TODO 撤回
94 129
95 @Override 130 @Override
96 @Transactional 131 @Transactional
@@ -126,7 +161,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -126,7 +161,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
126 // 获得对应的步骤 161 // 获得对应的步骤
127 List<TaskStepVO> steps = new ArrayList<>(); 162 List<TaskStepVO> steps = new ArrayList<>();
128 finished.forEach(instance -> { 163 finished.forEach(instance -> {
129 - TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); 164 + TaskStepVO stepVO = BpmTaskConvert.INSTANCE.convert(instance);
130 stepVO.setStatus(1); // TODO @jason:1 这个 magic number 要枚举起来。 165 stepVO.setStatus(1); // TODO @jason:1 这个 magic number 要枚举起来。
131 // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈? 166 // TODO @jason:可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈?
132 List<Comment> comments = taskService.getTaskComments(instance.getTaskId()); 167 List<Comment> comments = taskService.getTaskComments(instance.getTaskId());
@@ -144,7 +179,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -144,7 +179,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
144 .unfinished().list(); 179 .unfinished().list();
145 // 获得对应的步骤 180 // 获得对应的步骤
146 for (HistoricActivityInstance instance : unfinished) { 181 for (HistoricActivityInstance instance : unfinished) {
147 - TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance); 182 + TaskStepVO stepVO = BpmTaskConvert.INSTANCE.convert(instance);
148 stepVO.setComment(""); 183 stepVO.setComment("");
149 stepVO.setStatus(0); 184 stepVO.setStatus(0);
150 steps.add(stepVO); 185 steps.add(stepVO);
@@ -159,13 +194,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -159,13 +194,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
159 } 194 }
160 195
161 @Override 196 @Override
162 - public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {  
163 -// final Task task = taskRuntime.task(taskQuery.getTaskId());  
164 -// return TaskConvert.INSTANCE.convert(task);  
165 - return null;  
166 - }  
167 -  
168 - @Override  
169 public FileResp getHighlightImg(String processInstanceId) { 197 public FileResp getHighlightImg(String processInstanceId) {
170 // 查询历史 198 // 查询历史
171 //TODO 云扬四海 貌似流程结束后,点击审批进度会报错 199 //TODO 云扬四海 貌似流程结束后,点击审批进度会报错
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java
@@ -176,6 +176,9 @@ public class SysUserServiceImpl implements SysUserService { @@ -176,6 +176,9 @@ public class SysUserServiceImpl implements SysUserService {
176 176
177 @Override 177 @Override
178 public List<SysUserDO> getUsers(Collection<Long> ids) { 178 public List<SysUserDO> getUsers(Collection<Long> ids) {
  179 + if (CollUtil.isEmpty(ids)) {
  180 + return Collections.emptyList();
  181 + }
179 return userMapper.selectBatchIds(ids); 182 return userMapper.selectBatchIds(ids);
180 } 183 }
181 184
yudao-admin-ui/src/api/bpm/task.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function getTodoTaskPage(query) {
  4 + return request({
  5 + url: '/bpm/task/todo-page',
  6 + method: 'get',
  7 + params: query
  8 + })
  9 +}
  10 +
yudao-admin-ui/src/views/oa/todo/index.vue renamed to yudao-admin-ui/src/views/bpm/task/todo.vue
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageResult.java
@@ -35,4 +35,8 @@ public final class PageResult&lt;T&gt; implements Serializable { @@ -35,4 +35,8 @@ public final class PageResult&lt;T&gt; implements Serializable {
35 return new PageResult<>(0L); 35 return new PageResult<>(0L);
36 } 36 }
37 37
  38 + public static <T> PageResult<T> empty(Long total) {
  39 + return new PageResult<>(total);
  40 + }
  41 +
38 } 42 }