|
@@ -2,16 +2,19 @@ package cn.iocoder.yudao.module.bpm.service.task;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ArrayUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
|
|
import cn.iocoder.yudao.framework.flowable.core.util.ModelUtils;
|
|
|
+import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
|
|
|
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper;
|
|
|
+import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
|
|
|
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
|
|
|
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
|
|
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
|
|
@@ -29,6 +32,7 @@ import org.flowable.engine.RuntimeService;
|
|
|
import org.flowable.engine.TaskService;
|
|
|
import org.flowable.engine.history.HistoricProcessInstance;
|
|
|
import org.flowable.engine.runtime.ProcessInstance;
|
|
|
+import org.flowable.task.api.DelegationState;
|
|
|
import org.flowable.task.api.Task;
|
|
|
import org.flowable.task.api.TaskQuery;
|
|
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
|
@@ -192,13 +196,43 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
if (instance == null) {
|
|
|
throw exception(PROCESS_INSTANCE_NOT_EXISTS);
|
|
|
}
|
|
|
+ //被委派的任务,不调用 complete 去完成任务
|
|
|
+ if (DelegationState.PENDING.equals(task.getDelegationState())) {
|
|
|
+ this.approveDelegateTask(reqVO, task);
|
|
|
+ } else {
|
|
|
+ // 完成任务,审批通过
|
|
|
+ taskService.complete(task.getId(), instance.getProcessVariables());
|
|
|
+
|
|
|
+ // 更新任务拓展表为通过
|
|
|
+ taskExtMapper.updateByTaskId(
|
|
|
+ new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult())
|
|
|
+ .setReason(reqVO.getReason()));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 完成任务,审批通过
|
|
|
- taskService.complete(task.getId(), instance.getProcessVariables());
|
|
|
-
|
|
|
- // 更新任务拓展表为通过
|
|
|
+ /**
|
|
|
+ * 审批被委派的任务
|
|
|
+ *
|
|
|
+ * @param reqVO 前端请求参数,包含当前任务ID,审批意见等
|
|
|
+ * @param task 当前被审批的任务
|
|
|
+ */
|
|
|
+ private void approveDelegateTask(BpmTaskApproveReqVO reqVO, Task task) {
|
|
|
+ // 添加审批意见
|
|
|
+ AdminUserRespDTO currentUser = adminUserApi.getUser(WebFrameworkUtils.getLoginUserId());
|
|
|
+ //原审批人
|
|
|
+ AdminUserRespDTO sourceApproveUser = adminUserApi.getUser(NumberUtils.parseLong(task.getOwner()));
|
|
|
+ if (sourceApproveUser == null) {
|
|
|
+ throw exception(TASK_DELEGATE_APPROVE_FAIL);
|
|
|
+ }
|
|
|
+ String comment = String.format("[%s]完成委派任务,任务重新回到[%s]手中,审批意见为:%s", currentUser.getNickname(),
|
|
|
+ sourceApproveUser.getNickname(), reqVO.getReason());
|
|
|
+ taskService.addComment(reqVO.getId(), task.getProcessInstanceId(), BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment);
|
|
|
+ //调用 resolveTask 完成任务,底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner());
|
|
|
+ //将 owner 设置为 assignee
|
|
|
+ taskService.resolveTask(task.getId());
|
|
|
+ // 更新任务拓展表为【处理中】
|
|
|
taskExtMapper.updateByTaskId(
|
|
|
- new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult())
|
|
|
+ new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())
|
|
|
.setReason(reqVO.getReason()));
|
|
|
}
|
|
|
|
|
@@ -318,7 +352,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
}
|
|
|
|
|
|
private Task getTask(String id) {
|
|
|
- return taskService.createTaskQuery().taskId(id).singleResult();
|
|
|
+ Task task = taskService.createTaskQuery().taskId(id).singleResult();
|
|
|
+ if (null == task) {
|
|
|
+ throw exception(TASK_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ return task;
|
|
|
}
|
|
|
|
|
|
private HistoricTaskInstance getHistoricTask(String id) {
|
|
@@ -329,9 +367,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
public List<BpmTaskSimpleRespVO> getReturnTaskList(String taskId) {
|
|
|
// 当前任务 task
|
|
|
Task task = getTask(taskId);
|
|
|
- if (null == task) {
|
|
|
- throw exception(TASK_NOT_EXISTS);
|
|
|
- }
|
|
|
// 根据流程定义获取流程模型信息
|
|
|
BpmnModel bpmnModel = bpmModelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId());
|
|
|
// 查询该任务的前置任务节点的key集合
|
|
@@ -372,8 +407,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
return Collections.emptySet();
|
|
|
}
|
|
|
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void returnTask(BpmTaskReturnReqVO reqVO) {
|
|
|
// 当前任务 task
|
|
|
Task task = validateReturnTask(reqVO.getId());
|
|
@@ -396,9 +431,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
private Task validateReturnTask(String taskId) {
|
|
|
// 当前任务 task
|
|
|
Task task = getTask(taskId);
|
|
|
- if (null == task) {
|
|
|
- throw exception(TASK_NOT_EXISTS);
|
|
|
- }
|
|
|
if (task.isSuspended()) {
|
|
|
throw exception(TASK_IS_PENDING);
|
|
|
}
|
|
@@ -468,4 +500,41 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|
|
.changeState();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void delegateTask(BpmTaskDelegateReqVO reqVO) {
|
|
|
+ // 校验任务
|
|
|
+ Task task = this.validateTaskDelegate(reqVO);
|
|
|
+ // 添加审批意见
|
|
|
+ AdminUserRespDTO currentUser = adminUserApi.getUser(WebFrameworkUtils.getLoginUserId());
|
|
|
+ AdminUserRespDTO receiveUser = adminUserApi.getUser(reqVO.getReceiveId());
|
|
|
+ String comment = String.format("[%s]将任务委派给[%s],委派理由为:%s", currentUser.getNickname(),
|
|
|
+ receiveUser.getNickname(), reqVO.getReason());
|
|
|
+ String taskId = reqVO.getId();
|
|
|
+ taskService.addComment(taskId, task.getProcessInstanceId(), BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment);
|
|
|
+ // 设置任务所有人 (owner) 为原任务的处理人 (assignee)
|
|
|
+ taskService.setOwner(taskId, task.getAssignee());
|
|
|
+ // 执行委派,将任务委派给 receiveId
|
|
|
+ taskService.delegateTask(taskId, reqVO.getReceiveId().toString());
|
|
|
+ // 更新任务拓展表为【委派】
|
|
|
+ taskExtMapper.updateByTaskId(
|
|
|
+ new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.DELEGATE.getResult())
|
|
|
+ .setReason(reqVO.getReason()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验任务委派参数
|
|
|
+ *
|
|
|
+ * @param reqVO 任务编号,接收人ID
|
|
|
+ * @return 当前任务信息
|
|
|
+ */
|
|
|
+ private Task validateTaskDelegate(BpmTaskDelegateReqVO reqVO) {
|
|
|
+ // 校验任务
|
|
|
+ Task task = checkTask(WebFrameworkUtils.getLoginUserId(), reqVO.getId());
|
|
|
+ //校验当前审批人和被委派人不是同一人
|
|
|
+ if (task.getAssignee().equals(reqVO.getReceiveId().toString())) {
|
|
|
+ throw exception(TASK_DELEGATE_USER_REPEAT);
|
|
|
+ }
|
|
|
+ return task;
|
|
|
+ }
|
|
|
}
|