@ -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 ( ) ) ;
// 完成任务,审批 通过
taskService . complete ( task . getId ( ) , instance . getProcessVariables ( ) ) ;
// 更新任务拓展表为 通过
taskExtMapper . updateByTaskId (
new BpmTaskExtDO ( ) . setTaskId ( task . getId ( ) ) . setResult ( BpmProcessInstanceResultEnum . APPROVE . getResult ( ) )
. setReason ( reqVO . getReason ( ) ) ) ;
}
}
// 更新任务拓展表为通过
/**
* 审批被委派的任务
*
* @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 . AP PROVE . 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 ;
}
}