Commit c1884c31967a616e55235d749638761e612c8a1e

Authored by jason
1 parent d30bf060

工作流 Flowable 通过任务,拒绝任务 实现

yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
@@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; @@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
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.task.vo.task.BpmTaskRespVO;  
6 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;  
7 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO; 5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
8 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 6 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
9 import io.swagger.annotations.Api; 7 import io.swagger.annotations.Api;
10 import io.swagger.annotations.ApiImplicitParam; 8 import io.swagger.annotations.ApiImplicitParam;
@@ -13,10 +11,7 @@ import org.flowable.bpmn.model.BpmnModel; @@ -13,10 +11,7 @@ import org.flowable.bpmn.model.BpmnModel;
13 import org.flowable.engine.TaskService; 11 import org.flowable.engine.TaskService;
14 import org.springframework.security.access.prepost.PreAuthorize; 12 import org.springframework.security.access.prepost.PreAuthorize;
15 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
16 -import org.springframework.web.bind.annotation.GetMapping;  
17 -import org.springframework.web.bind.annotation.RequestMapping;  
18 -import org.springframework.web.bind.annotation.RequestParam;  
19 -import org.springframework.web.bind.annotation.RestController; 14 +import org.springframework.web.bind.annotation.*;
20 15
21 import javax.annotation.Resource; 16 import javax.annotation.Resource;
22 import javax.validation.Valid; 17 import javax.validation.Valid;
@@ -50,4 +45,20 @@ public class BpmTaskController { @@ -50,4 +45,20 @@ public class BpmTaskController {
50 @RequestParam("processInstanceId") String processInstanceId) { 45 @RequestParam("processInstanceId") String processInstanceId) {
51 return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); 46 return success(taskService.getTaskListByProcessInstanceId(processInstanceId));
52 } 47 }
  48 +
  49 + @PutMapping("/approve")
  50 + @ApiOperation("通过任务")
  51 + @PreAuthorize("@ss.hasPermission('bpm:task:update')")
  52 + public CommonResult<Boolean> approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
  53 + taskService.approveTask(getLoginUserId(), reqVO);
  54 + return success(true);
  55 + }
  56 +
  57 + @PutMapping("/reject")
  58 + @ApiOperation("不通过任务")
  59 + @PreAuthorize("@ss.hasPermission('bpm:task:update')")
  60 + public CommonResult<Boolean> rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) {
  61 + taskService.rejectTask(getLoginUserId(), reqVO);
  62 + return success(true);
  63 + }
53 } 64 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
1 package cn.iocoder.yudao.module.bpm.convert.task; 1 package cn.iocoder.yudao.module.bpm.convert.task;
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.number.NumberUtils;
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.BpmProcessInstancePageItemRespVO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 6 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.definition.BpmProcessDefinitionExtDO;
7 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
8 import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; 9 import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
9 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; 10 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
  11 +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
10 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 12 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 13 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
12 import org.flowable.engine.history.HistoricProcessInstance; 14 import org.flowable.engine.history.HistoricProcessInstance;
@@ -87,13 +89,28 @@ public interface BpmProcessInstanceConvert { @@ -87,13 +89,28 @@ public interface BpmProcessInstanceConvert {
87 return event; 89 return event;
88 } 90 }
89 91
  92 + default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) {
  93 + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
  94 + event.setId(instance.getId());
  95 + event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
  96 + event.setBusinessKey(instance.getBusinessKey());
  97 + event.setResult(result);
  98 + return event;
  99 + }
  100 +
90 default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){ 101 default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){
91 - Long startUserId = instance.getStartUserId() == null ? null : Long.valueOf(instance.getStartUserId());  
92 - BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceApproveReqDTO()  
93 - .setStartUserId(startUserId) 102 + return new BpmMessageSendWhenProcessInstanceApproveReqDTO()
  103 + .setStartUserId(NumberUtils.parseLong(instance.getStartUserId()))
94 .setProcessInstanceId(instance.getId()) 104 .setProcessInstanceId(instance.getId())
95 .setProcessInstanceName(instance.getName()); 105 .setProcessInstanceName(instance.getName());
96 - return reqDTO; 106 + }
  107 +
  108 + default BpmMessageSendWhenProcessInstanceRejectReqDTO convert2RejectReq(ProcessInstance instance, String comment) {
  109 + return new BpmMessageSendWhenProcessInstanceRejectReqDTO()
  110 + .setProcessInstanceName(instance.getName())
  111 + .setProcessInstanceId(instance.getId())
  112 + .setComment(comment)
  113 + .setStartUserId(NumberUtils.parseLong(instance.getStartUserId()));
97 } 114 }
98 115
99 } 116 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
@@ -102,10 +102,9 @@ public interface BpmTaskConvert { @@ -102,10 +102,9 @@ public interface BpmTaskConvert {
102 BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); 102 BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser);
103 103
104 default BpmTaskExtDO convert2TaskExt(Task task){ 104 default BpmTaskExtDO convert2TaskExt(Task task){
105 - Long assigneeUserId = task.getAssignee() == null ? null : Long.valueOf(task.getAssignee());  
106 BpmTaskExtDO taskExtDO = new BpmTaskExtDO() 105 BpmTaskExtDO taskExtDO = new BpmTaskExtDO()
107 .setTaskId(task.getId()) 106 .setTaskId(task.getId())
108 - .setAssigneeUserId(assigneeUserId) 107 + .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee()))
109 .setName(task.getName()) 108 .setName(task.getName())
110 .setProcessDefinitionId(task.getProcessDefinitionId()) 109 .setProcessDefinitionId(task.getProcessDefinitionId())
111 .setProcessInstanceId(task.getProcessInstanceId()); 110 .setProcessInstanceId(task.getProcessInstanceId());
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
@@ -42,6 +42,6 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { @@ -42,6 +42,6 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
42 42
43 @Override 43 @Override
44 protected void taskCompleted(FlowableEngineEntityEvent event) { 44 protected void taskCompleted(FlowableEngineEntityEvent event) {
45 - super.taskCompleted(event); 45 + taskService.updateTaskExtComplete((Task)event.getEntity());
46 } 46 }
47 } 47 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
@@ -110,5 +110,13 @@ public interface BpmProcessInstanceService { @@ -110,5 +110,13 @@ public interface BpmProcessInstanceService {
110 */ 110 */
111 void updateProcessInstanceExtComplete(ProcessInstance instance); 111 void updateProcessInstanceExtComplete(ProcessInstance instance);
112 112
  113 + /**
  114 + * 更新 ProcessInstance 拓展记录为不通过
  115 + *
  116 + * @param id 流程编号
  117 + * @param comment 理由。例如说,审批不通过时,需要传递该值
  118 + */
  119 + void updateProcessInstanceExtReject(String id, String comment);
  120 +
113 121
114 } 122 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
  5 +import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
@@ -29,6 +30,7 @@ import org.flowable.engine.runtime.ProcessInstance; @@ -29,6 +30,7 @@ import org.flowable.engine.runtime.ProcessInstance;
29 import org.flowable.task.api.Task; 30 import org.flowable.task.api.Task;
30 import org.springframework.context.annotation.Lazy; 31 import org.springframework.context.annotation.Lazy;
31 import org.springframework.stereotype.Service; 32 import org.springframework.stereotype.Service;
  33 +import org.springframework.transaction.annotation.Transactional;
32 import org.springframework.validation.annotation.Validated; 34 import org.springframework.validation.annotation.Validated;
33 35
34 import javax.annotation.Resource; 36 import javax.annotation.Resource;
@@ -155,7 +157,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -155,7 +157,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
155 157
156 // 通过删除流程实例,实现流程实例的取消, 158 // 通过删除流程实例,实现流程实例的取消,
157 // 删除流程实例,正则执行任务ACT_RU_TASK. 任务会被删除。通过历史表查询 159 // 删除流程实例,正则执行任务ACT_RU_TASK. 任务会被删除。通过历史表查询
158 - runtimeService.deleteProcessInstance(cancelReqVO.getId(), 160 + deleteProcessInstance(cancelReqVO.getId(),
159 BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); 161 BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason()));
160 } 162 }
161 163
@@ -232,6 +234,33 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -232,6 +234,33 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
232 BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); 234 BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
233 } 235 }
234 236
  237 + @Transactional(rollbackFor = Exception.class)
  238 + public void updateProcessInstanceExtReject(String id, String comment) {
  239 + // 需要主动查询,因为 instance 只有 id 属性
  240 + ProcessInstance processInstance = getProcessInstance(id);
  241 + // 删除流程实例,以实现驳回任务时,取消整个审批流程
  242 + deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment)));
  243 +
  244 + // 更新 status + result
  245 + // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法,
  246 + // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的
  247 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id)
  248 + .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
  249 + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult());
  250 + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  251 +
  252 + // 发送流程被不通过的消息
  253 + messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, comment));
  254 +
  255 + // 发送流程实例的状态事件
  256 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  257 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
  258 + }
  259 +
  260 + private void deleteProcessInstance(String id, String reason) {
  261 + runtimeService.deleteProcessInstance(id, reason);
  262 + }
  263 +
235 private String createProcessInstance0(Long userId, ProcessDefinition definition, 264 private String createProcessInstance0(Long userId, ProcessDefinition definition,
236 Map<String, Object> variables, String businessKey) { 265 Map<String, Object> variables, String businessKey) {
237 // 校验流程定义 266 // 校验流程定义
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
@@ -2,12 +2,11 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -2,12 +2,11 @@ package cn.iocoder.yudao.module.bpm.service.task;
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.task.vo.task.BpmTaskRespVO;  
6 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;  
7 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO; 5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
8 import org.flowable.task.api.Task; 6 import org.flowable.task.api.Task;
9 7
10 8
  9 +import javax.validation.Valid;
11 import java.util.List; 10 import java.util.List;
12 import java.util.Map; 11 import java.util.Map;
13 12
@@ -55,6 +54,22 @@ public interface BpmTaskService { @@ -55,6 +54,22 @@ public interface BpmTaskService {
55 List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId); 54 List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId);
56 55
57 /** 56 /**
  57 + * 通过任务
  58 + *
  59 + * @param userId 用户编号
  60 + * @param reqVO 通过请求
  61 + */
  62 + void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO);
  63 +
  64 + /**
  65 + * 不通过任务
  66 + *
  67 + * @param userId 用户编号
  68 + * @param reqVO 不通过请求
  69 + */
  70 + void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO);
  71 +
  72 + /**
58 * 创建 Task 拓展记录 73 * 创建 Task 拓展记录
59 * 74 *
60 * @param task 任务实体 75 * @param task 任务实体
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -5,9 +5,7 @@ import cn.hutool.core.util.StrUtil; @@ -5,9 +5,7 @@ import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
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.task.vo.task.BpmTaskRespVO;  
9 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO;  
10 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO; 8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
11 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; 9 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
13 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper;
@@ -27,16 +25,19 @@ import org.flowable.task.api.history.HistoricTaskInstance; @@ -27,16 +25,19 @@ import org.flowable.task.api.history.HistoricTaskInstance;
27 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
28 26
29 import javax.annotation.Resource; 27 import javax.annotation.Resource;
  28 +import javax.validation.Valid;
30 import java.util.*; 29 import java.util.*;
31 30
  31 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
32 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 32 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
33 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 33 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  34 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
34 35
35 /** 36 /**
36 * 流程任务实例 Service 实现类 37 * 流程任务实例 Service 实现类
37 * 38 *
38 - * @author jason  
39 * @author 芋道源码 39 * @author 芋道源码
  40 + * @author jason
40 */ 41 */
41 @Slf4j 42 @Slf4j
42 @Service 43 @Service
@@ -124,6 +125,41 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -124,6 +125,41 @@ public class BpmTaskServiceImpl implements BpmTaskService{
124 } 125 }
125 126
126 @Override 127 @Override
  128 + public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) {
  129 + // 校验任务存在
  130 + Task task = checkTask(userId, reqVO.getId());
  131 + // 校验流程实例存在
  132 + ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
  133 + if (instance == null) {
  134 + throw exception(PROCESS_INSTANCE_NOT_EXISTS);
  135 + }
  136 +
  137 + // 完成任务,审批通过
  138 + taskService.complete(task.getId(), instance.getProcessVariables());
  139 + // 更新任务拓展表为通过
  140 + taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId())
  141 + .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()).setComment(reqVO.getComment()));
  142 + }
  143 +
  144 + @Override
  145 + public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) {
  146 + Task task = checkTask(userId, reqVO.getId());
  147 + // 校验流程实例存在
  148 + ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
  149 + if (instance == null) {
  150 + throw exception(PROCESS_INSTANCE_NOT_EXISTS);
  151 + }
  152 +
  153 + // 更新流程实例为不通过
  154 + processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getComment());
  155 +
  156 + // 更新任务拓展表为不通过
  157 + taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId())
  158 + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()).setComment(reqVO.getComment()));
  159 + }
  160 +
  161 +
  162 + @Override
127 public void createTaskExt(Task task) { 163 public void createTaskExt(Task task) {
128 BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) 164 BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
129 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); 165 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
@@ -133,8 +169,27 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -133,8 +169,27 @@ public class BpmTaskServiceImpl implements BpmTaskService{
133 @Override 169 @Override
134 public void updateTaskExtComplete(Task task) { 170 public void updateTaskExtComplete(Task task) {
135 BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) 171 BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
136 - .setEndTime(new Date()) // 此时不能使用 task 的 completeData,因为还是空的。  
137 - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); 172 + .setEndTime(new Date());
138 taskExtMapper.updateByTaskId(taskExtDO); 173 taskExtMapper.updateByTaskId(taskExtDO);
139 } 174 }
  175 +
  176 + /**
  177 + * 校验任务是否存在, 并且是否是分配给自己的任务
  178 + * @param userId 用户 id
  179 + * @param taskId task id
  180 + */
  181 + private Task checkTask(Long userId, String taskId) {
  182 + Task task = getTask(taskId);
  183 + if (task == null) {
  184 + throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS);
  185 + }
  186 + if (!Objects.equals(userId, NumberUtils.parseLong(task.getAssignee()))) {
  187 + throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF);
  188 + }
  189 + return task;
  190 + }
  191 +
  192 + private Task getTask(String id) {
  193 + return taskService.createTaskQuery().taskId(id).singleResult();
  194 + }
140 } 195 }