@@ -189,25 +189,27 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional ( rollbackFor = Exception . class )
public void approveTask ( Long userId , @Valid BpmTaskApproveReqVO reqVO ) {
// 校验任务存在
Task task = check Task( userId , reqVO . getId ( ) ) ;
// 校验流程实例存在
// 1.1 校验任务存在
Task task = validate Task( userId , reqVO . getId ( ) ) ;
// 1.2 校验流程实例存在
ProcessInstance instance = processInstanceService . getProcessInstance ( task . getProcessInstanceId ( ) ) ;
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 ( ) . set TaskId ( task . getId ( ) ) . setResult ( BpmProcessInstanceResultEnum . APPROVE . getResult ( ) )
. setReason ( reqVO . getReason ( ) ) ) ;
// 情况一:被委派的任务,不调用 complete 去完成任务
if ( DelegationState . PENDING . equals ( task . getDelegationState ( ) ) ) {
approveDelegate Task ( reqVO , task ) ;
return ;
}
// 情况二:自己审批的任务,调用 complete 去完成任务
// 完成任务,审批通过
taskService . complete ( task . getId ( ) , instance . getProcessVariables ( ) ) ;
// 更新任务拓展表为通过
taskExtMapper . updateByTaskId (
new BpmTaskExtDO ( ) . setTaskId ( task . getId ( ) ) . setResult ( BpmProcessInstanceResultEnum . APPROVE . getResult ( ) )
. setReason ( reqVO . getReason ( ) ) ) ;
}
/**
@@ -217,19 +219,19 @@ public class BpmTaskServiceImpl implements BpmTaskService {
* @param task 当前被审批的任务
*/
private void approveDelegateTask ( BpmTaskApproveReqVO reqVO , Task task ) {
// 添加审批意见
// 1. 添加审批意见
AdminUserRespDTO currentUser = adminUserApi . getUser ( WebFrameworkUtils . getLoginUserId ( ) ) ;
//原审批人
AdminUserRespDTO sourceApproveUser = adminUserApi . getUser ( NumberUtils . parseLong ( task . getOwner ( ) ) ) ;
Assert . notNull ( sourceApproveUser , " 委派任务找不到原审批人,需要检查数据 " ) ;
//添加审批意见
String comment = StrUtil . format ( " [{}]完成委派任务,任务重新回到[{}]手中,审批意见为:{} " , 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 . addComment ( reqVO . getId ( ) , task . getProcessInstanceId ( ) ,
BpmProcessInstanceResultEnum . DELEGATE . getResult ( ) . toString ( ) , comment ) ;
// 2.1 调用 resolveTask 完成任务。
// 底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()):将 owner 设置为 assignee
taskService . resolveTask ( task . getId ( ) ) ;
// 更新任务拓展表为【处理中】
// 2.2 更新任务拓展表为【处理中】
taskExtMapper . updateByTaskId (
new BpmTaskExtDO ( ) . setTaskId ( task . getId ( ) ) . setResult ( BpmProcessInstanceResultEnum . PROCESS . getResult ( ) )
. setReason ( reqVO . getReason ( ) ) ) ;
@@ -238,7 +240,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional ( rollbackFor = Exception . class )
public void rejectTask ( Long userId , @Valid BpmTaskRejectReqVO reqVO ) {
Task task = check Task( userId , reqVO . getId ( ) ) ;
Task task = validate Task( userId , reqVO . getId ( ) ) ;
// 校验流程实例存在
ProcessInstance instance = processInstanceService . getProcessInstance ( task . getProcessInstanceId ( ) ) ;
if ( instance = = null ) {
@@ -257,7 +259,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
public void updateTaskAssignee ( Long userId , BpmTaskUpdateAssigneeReqVO reqVO ) {
// 校验任务存在
Task task = check Task( userId , reqVO . getId ( ) ) ;
Task task = validate Task( userId , reqVO . getId ( ) ) ;
// 更新负责人
updateTaskAssignee ( task . getId ( ) , reqVO . getAssigneeUserId ( ) ) ;
}
@@ -273,13 +275,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
* @param userId 用户 id
* @param taskId task id
*/
private Task check Task( Long userId , String taskId ) {
private Task validate Task( Long userId , String taskId ) {
Task task = getTask ( taskId ) ;
if ( task = = null ) {
throw exception ( TASK_COMPLETE_FAIL_ NOT_EXISTS ) ;
throw exception ( TASK_NOT_EXISTS ) ;
}
if ( ! Objects . equals ( userId , NumberUtils . parseLong ( task . getAssignee ( ) ) ) ) {
throw exception ( TASK_COMPLE TE_FAIL_ASSIGN_NOT_SELF ) ;
throw exception ( TASK_OPERA TE_FAIL_ASSIGN_NOT_SELF ) ;
}
return task ;
}
@@ -358,24 +360,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return task ;
}
/**
* 校验任务是否合法
*
* @param taskId 任务编号
* @return 任务
*/
private Task validateTask ( String taskId ) {
// 当前任务 task
Task task = getTask ( taskId ) ;
if ( task = = null ) {
throw exception ( TASK_NOT_EXISTS ) ;
}
if ( task . isSuspended ( ) ) {
throw exception ( TASK_IS_PENDING ) ;
}
return task ;
}
private HistoricTaskInstance getHistoricTask ( String id ) {
return historyService . createHistoricTaskInstanceQuery ( ) . taskId ( id ) . singleResult ( ) ;
}
@@ -406,9 +390,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional ( rollbackFor = Exception . class )
public void returnTask ( BpmTaskReturnReqVO reqVO ) {
public void returnTask ( Long userId , BpmTaskReturnReqVO reqVO ) {
// 1.1 当前任务 task
Task task = validateTask ( reqVO . getId ( ) ) ;
Task task = validateTask ( userId , reqVO. getId ( ) ) ;
if ( task . isSuspended ( ) ) {
throw exception ( TASK_IS_PENDING ) ;
}
// 1.2 校验源头和目标节点的关系,并返回目标元素
FlowElement targetElement = validateTargetTaskCanReturn ( task . getTaskDefinitionKey ( ) , reqVO . getTargetDefinitionKey ( ) , task . getProcessDefinitionId ( ) ) ;
@@ -484,24 +471,29 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional ( rollbackFor = Exception . class )
public void delegateTask ( BpmTaskDelegateReqVO reqVO , Long userId ) {
// 校验任务
Task task = this . validateTaskDelegate( reqVO ) ;
// 添加审批意见
AdminUserRespDTO currentUser = adminUserApi . getUser ( userId ) ;
public void delegateTask ( BpmTaskDelegateReqVO reqVO , Long userId ) {
// 1.1 校验任务
Task task = validateTaskCan Delegate(userId , reqVO ) ;
// 1.2 校验目标用户存在
AdminUserRespDTO delegateUser = adminUserApi . getUser ( reqVO . getDelegateUserId ( ) ) ;
if ( delegateUser = = null ) {
throw exception ( TASK_DELEGATE_USER_NULL ) ;
throw exception ( TASK_DELEGATE_FAIL_ USER_NOT_EXISTS ) ;
}
// 2. 添加审批意见
AdminUserRespDTO currentUser = adminUserApi . getUser ( userId ) ;
String comment = StrUtil . format ( " [{}]将任务委派给[{}],委派理由为:{} " , currentUser . getNickname ( ) ,
delegateUser . getNickname ( ) , reqVO . getReason ( ) ) ;
String taskId = reqVO . getId ( ) ;
taskService . addComment ( taskId , task . getProcessInstanceId ( ) , BpmProcessInstanceResultEnum . DELEGATE . getResult ( ) . toString ( ) , comment ) ;
// 设置任务所有人 (owner) 为原任务的处理人 (assignee)
// TODO 海:后面改;感觉 comment 应该 type 做个枚举;不和 result 耦合在一起;
taskService . addComment ( taskId , task . getProcessInstanceId ( ) ,
BpmProcessInstanceResultEnum . DELEGATE . getResult ( ) . toString ( ) , comment ) ;
// 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee)
taskService . setOwner ( taskId , task . getAssignee ( ) ) ;
// 执行委派, 将任务委派给 receiveId
// 3.2 执行委派, 将任务委派给 receiveId
taskService . delegateTask ( taskId , reqVO . getDelegateUserId ( ) . toString ( ) ) ;
// 更新任务拓展表为【委派】
// 3.3 更新任务拓展表为【委派】
taskExtMapper . updateByTaskId (
new BpmTaskExtDO ( ) . setTaskId ( task . getId ( ) ) . setResult ( BpmProcessInstanceResultEnum . DELEGATE . getResult ( ) )
. setReason ( reqVO . getReason ( ) ) ) ;
@@ -510,16 +502,18 @@ public class BpmTaskServiceImpl implements BpmTaskService {
/**
* 校验任务委派参数
*
* @param userId 用户编号
* @param reqVO 任务编号, 接收人ID
* @return 当前任务信息
*/
private Task validateTaskDelegate ( BpmTaskDelegateReqVO reqVO ) {
private Task validateTaskCan Delegate (Long userId , BpmTaskDelegateReqVO reqVO ) {
// 校验任务
Task task = check Task( WebFrameworkUtils . getLoginUserId ( ) , reqVO . getId ( ) ) ;
//校验当前审批人和被委派人不是同一人
Task task = validate Task( userId , reqVO . getId ( ) ) ;
// 校验当前审批人和被委派人不是同一人
if ( task . getAssignee ( ) . equals ( reqVO . getDelegateUserId ( ) . toString ( ) ) ) {
throw exception ( TASK_DELEGATE_USER_REPEAT ) ;
throw exception ( TASK_DELEGATE_FAIL_ USER_REPEAT ) ;
}
return task ;
}
}