@@ -1,6 +1,7 @@
package com.njcn.bpm.service.task.impl ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.collection.CollectionUtil ;
import cn.hutool.core.date.DatePattern ;
import cn.hutool.core.date.LocalDateTimeUtil ;
import cn.hutool.core.util.StrUtil ;
@@ -13,6 +14,7 @@ import com.njcn.bpm.pojo.dto.BpmProcessInstanceCreateReqDTO;
import com.njcn.bpm.pojo.dto.PageResult ;
import com.njcn.bpm.pojo.param.instance.BpmProcessInstanceCancelParam ;
import com.njcn.bpm.pojo.param.instance.BpmProcessInstancePageParam ;
import com.njcn.bpm.pojo.param.task.BpmTaskRejectParam ;
import com.njcn.bpm.service.IBpmProcessDefinitionService ;
import com.njcn.bpm.service.task.IBpmProcessInstanceService ;
import com.njcn.bpm.strategy.BpmTaskCandidateStartUserSelectStrategy ;
@@ -30,6 +32,7 @@ import org.flowable.bpmn.model.UserTask;
import org.flowable.common.engine.impl.identity.Authentication ;
import org.flowable.engine.HistoryService ;
import org.flowable.engine.RuntimeService ;
import org.flowable.engine.TaskService ;
import org.flowable.engine.delegate.event.FlowableCancelledEvent ;
import org.flowable.engine.history.HistoricProcessInstance ;
import org.flowable.engine.repository.ProcessDefinition ;
@@ -72,7 +75,7 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
@Resource
private IBpmProcessDefinitionService processDefinitionService ;
// @Resource
// @Resource
// private BpmMessageService messageService;
//
@Resource
@@ -90,7 +93,6 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
}
@Override
public List < ProcessInstance > getProcessInstances ( Set < String > ids ) {
return runtimeService . createProcessInstanceQuery ( ) . processInstanceIds ( ids ) . list ( ) ;
@@ -115,7 +117,7 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
. orderByProcessInstanceStartTime ( ) . desc ( ) ;
if ( userId ! = null ) { // 【我的流程】菜单时,需要传递该字段
processInstanceQuery . startedBy ( userId ) ;
} else if ( bpmProcessInstancePageParam . getStartUserId ( ) ! = null ) { // 【管理流程】菜单时,才会传递该字段
} else if ( bpmProcessInstancePageParam . getStartUserId ( ) ! = null ) { // 【管理流程】菜单时,才会传递该字段
processInstanceQuery . startedBy ( bpmProcessInstancePageParam . getStartUserId ( ) ) ;
}
if ( StrUtil . isNotEmpty ( bpmProcessInstancePageParam . getName ( ) ) ) {
@@ -144,7 +146,7 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
}
// 查询列表
int offset = PageFactory . getPageSize ( bpmProcessInstancePageParam ) * ( PageFactory . getPageNum ( bpmProcessInstancePageParam ) - 1 ) ;
List < HistoricProcessInstance > processInstanceList = processInstanceQuery . listPage ( offset , PageFactory . getPageSize ( bpmProcessInstancePageParam ) ) ;
List < HistoricProcessInstance > processInstanceList = processInstanceQuery . listPage ( offset , PageFactory . getPageSize ( bpmProcessInstancePageParam ) ) ;
return new PageResult < > ( processInstanceList , processInstanceCount ) ;
}
@@ -226,7 +228,7 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
}
@Override
public void cancelProcessInstanceByStartUser ( String userId , BpmProcessInstanceCancelParam cancelReqVO ) {
public void cancelProcessInstanceByStartUser ( String userId , BpmProcessInstanceCancelParam cancelReqVO ) {
// 1.1 校验流程实例存在
ProcessInstance instance = getProcessInstance ( cancelReqVO . getProcessInstanceId ( ) ) ;
if ( instance = = null ) {
@@ -285,9 +287,18 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
@Override
public void updateProcessInstanceWhenApprove ( ProcessInstance instance ) {
//判断传入参数是否是,不通过信息不通过则需要更新流程信息为不通过
Integer processInstanceStatus = BpmProcessInstanceStatusEnum . APPROVE . getStatus ( ) ;
Map < String , Object > processVariables = instance . getProcessVariables ( ) ;
if ( processVariables . containsKey ( BpmConstants . PROCESS_INSTANCE_VARIABLE_STATUS ) ) {
Integer stata = Integer . valueOf ( processVariables . get ( BpmConstants . PROCESS_INSTANCE_VARIABLE_STATUS ) . toString ( ) ) ;
if ( BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) = = stata ) {
processInstanceStatus = BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) ;
}
}
// 1. 更新流程实例 status
runtimeService . setVariable ( instance . getId ( ) , BpmConstants . PROCESS_INSTANCE_VARIABLE_STATUS ,
BpmP rocessInstanceStatusEnum . APPROVE . getStatus ( ) ) ;
p rocessInstanceStatus) ;
// 2. 发送流程被【通过】的消息
// messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance));
@@ -296,7 +307,7 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
// 注意:此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
HistoricProcessInstance processInstance = getHistoricProcessInstance ( instance . getId ( ) ) ;
processInstanceEventPublisher . sendProcessInstanceResultEvent (
BpmProcessInstanceConvert . INSTANCE . buildProcessInstanceStatusEvent ( this , processInstance , BpmP rocessInstanceStatusEnum . APPROVE . getStatus ( ) ) ) ;
BpmProcessInstanceConvert . INSTANCE . buildProcessInstanceStatusEvent ( this , processInstance , p rocessInstanceStatus) ) ;
}
@Override
@@ -314,7 +325,31 @@ public class BpmProcessInstanceServiceImpl implements IBpmProcessInstanceService
// 4. 发送流程实例的状态事件
processInstanceEventPublisher . sendProcessInstanceResultEvent (
BpmProcessInstanceConvert . INSTANCE . buildProcessInstanceStatusEvent ( this , processInstance , reason , BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) ) ) ;
BpmProcessInstanceConvert . INSTANCE . buildProcessInstanceStatusEvent ( this , processInstance , reason , BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) ) ) ;
}
@Override
@Transactional ( rollbackFor = Exception . class )
public void updateProcessInstanceFromReject ( String id , String reason , TaskService taskService , BpmTaskRejectParam bpmTaskRejectParam ) {
// 1. 更新流程实例 status
runtimeService . setVariable ( id , BpmConstants . PROCESS_INSTANCE_VARIABLE_STATUS , BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) ) ;
// 2. 删除流程实例,以实现驳回任务时,取消整个审批流程
ProcessInstance processInstance = getProcessInstance ( id ) ;
// 3.3 调用 BPM complete 去完成任务
// 其中, variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用
if ( CollectionUtil . isNotEmpty ( bpmTaskRejectParam . getVariables ( ) ) ) {
Map < String , Object > variables = FlowableUtils . filterTaskFormVariable ( bpmTaskRejectParam . getVariables ( ) ) ;
taskService . complete ( bpmTaskRejectParam . getId ( ) , variables , false ) ;
} else {
taskService . complete ( bpmTaskRejectParam . getId ( ) ) ;
}
//这是删除所有信息,
// deleteProcessInstance(id, StrUtil.format(BpmDeleteReasonEnum.REJECT_TASK.format(reason)));
// 4. 发送流程实例的状态事件
processInstanceEventPublisher . sendProcessInstanceResultEvent (
BpmProcessInstanceConvert . INSTANCE . buildProcessInstanceStatusEvent ( this , processInstance , reason , BpmProcessInstanceStatusEnum . REJECT . getStatus ( ) ) ) ;
}
public void deleteProcessInstance ( String id , String reason ) {