diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmTaskExtMapper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmTaskExtMapper.java index 16d66a16c..6cd2694b7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmTaskExtMapper.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmTaskExtMapper.java @@ -9,21 +9,21 @@ import java.util.Collection; import java.util.List; @Mapper -public interface BpmTaskExtMapper extends BaseMapper { +public interface BpmTaskExtMapper extends BaseMapperX { default void updateByTaskId(BpmTaskExtDO entity) { update(entity, new LambdaQueryWrapper().eq(BpmTaskExtDO::getTaskId, entity.getTaskId())); } -// default List selectListByTaskIds(Collection taskIds) { -// return selectList(BpmTaskExtDO::getTaskId, taskIds); -// } -// -// default List selectListByProcessInstanceId(String processInstanceId) { -// return selectList("process_instance_id", processInstanceId); -// } -// -// default BpmTaskExtDO selectByTaskId(String taskId) { -// return selectOne(BpmTaskExtDO::getTaskId, taskId); -// } + default List selectListByTaskIds(Collection taskIds) { + return selectList(BpmTaskExtDO::getTaskId, taskIds); + } + + default List selectListByProcessInstanceId(String processInstanceId) { + return selectList("process_instance_id", processInstanceId); + } + + default BpmTaskExtDO selectByTaskId(String taskId) { + return selectOne(BpmTaskExtDO::getTaskId, taskId); + } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineProcessInstanceEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineProcessInstanceEventListener.java new file mode 100644 index 000000000..3381e4373 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineProcessInstanceEventListener.java @@ -0,0 +1,6 @@ +package cn.axzo.workflow.core.service.engine; + +import cn.axzo.workflow.core.listener.BpmProcessEventListener; + +public class EngineProcessInstanceEventListener implements BpmProcessEventListener { +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineTaskEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineTaskEventListener.java index 80aea5b69..4236a4af0 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineTaskEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineTaskEventListener.java @@ -28,19 +28,27 @@ public class EngineTaskEventListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { - if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_CREATE)) { - taskEventListener.created(delegateTask); - taskService.createTaskExt(delegateTask); - // 审批创建 - } else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_ASSIGNMENT)) { - taskEventListener.assigned(delegateTask); - } else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_COMPLETE)) { - //审批完成 - taskEventListener.completed(delegateTask); - taskService.updateTaskExtComplete(delegateTask); - } else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_DELETE)) { - // 审批删除 - taskEventListener.deleted(delegateTask); + switch (delegateTask.getEventName()) { + case TaskListener.EVENTNAME_CREATE: + taskEventListener.created(delegateTask); + taskService.createTaskExt(delegateTask); + // 审批创建 + break; + case TaskListener.EVENTNAME_ASSIGNMENT: + taskEventListener.assigned(delegateTask); + taskService.updateTaskExtAssign(delegateTask); + break; + case TaskListener.EVENTNAME_COMPLETE: + //审批完成 + taskEventListener.completed(delegateTask); + taskService.updateTaskExtComplete(delegateTask); + break; + case TaskListener.EVENTNAME_DELETE: + // 审批删除 + taskService.updateTaskExtCancel(delegateTask); + taskEventListener.deleted(delegateTask); + break; + default: } log.info("Task.notify {} taskDelegate:{}", delegateTask.getId(),taskDelegate); taskDelegate.calculateAssignerAtExecution(delegateTask); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmTaskServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmTaskServiceImpl.java index 1bbb5e87f..15964fd88 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmTaskServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmTaskServiceImpl.java @@ -1,6 +1,7 @@ package cn.axzo.workflow.core.service.impl; import cn.axzo.workflow.core.common.BpmConstants; +import cn.axzo.workflow.core.common.enums.BpmProcessInstanceDeleteReasonEnum; import cn.axzo.workflow.core.common.enums.BpmProcessInstanceResultEnum; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.repository.entity.BpmTaskExtDO; @@ -15,6 +16,7 @@ import cn.axzo.workflow.core.service.dto.response.task.BpmTaskDonePageItemVO; import cn.axzo.workflow.core.service.dto.response.task.BpmTaskTodoPageItemVO; import cn.azxo.framework.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; @@ -26,6 +28,8 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.delegate.DelegateTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import javax.annotation.Resource; import java.util.*; @@ -34,6 +38,7 @@ import static cn.axzo.workflow.core.common.BpmConstants.*; import static cn.axzo.workflow.core.common.enums.BpmErrorCode.*; @Service +@Slf4j public class BpmTaskServiceImpl implements BpmTaskService { @Autowired @@ -192,4 +197,58 @@ public class BpmTaskServiceImpl implements BpmTaskService { taskExtDO.setEndTime(new Date()); taskExtMapper.updateByTaskId(taskExtDO); } + + public void updateTaskExtAssign(DelegateTask task) { + String assignee = task.getAssignee(); + String processDefinitionId = task.getProcessDefinitionId(); + String taskDefinitionKey = task.getTaskDefinitionKey(); + // 在获取候选人列表时,向bpm_task_assignee_info表中插入选择的审批人的信息,在这里更新bpm_task_exe表时,通过task_id从bpm_task_assigner_info表中获取审批人的完整信息 + BpmTaskExtDO taskExtDO = new BpmTaskExtDO(); + taskExtDO.setTaskId(task.getId()); + taskExtDO.setTenantId(task.getTenantId()); + taskExtDO.setIdentityId(Long.valueOf(task.getAssignee())); + taskExtDO.setProcessDefinitionId(processDefinitionId); + taskExtDO.setUserName(task.getOwner()); + taskExtMapper.updateByTaskId(taskExtDO); + } + + public void updateTaskExtCancel(DelegateTask task) { + // 需要在事务提交后,才进行查询。不然查询不到历史的原因 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + // 可能只是活动,不是任务,所以查询不到 + String taskId = task.getId(); + HistoricTaskInstance task = getHistoricTask(taskId); + if (task == null) { + return; + } + + // 如果任务拓展表已经是完成的状态,则跳过 + BpmTaskExtDO taskExt = taskExtMapper.selectByTaskId(taskId); + if (taskExt == null) { + log.error("[updateTaskExtCancel][taskId({}) 查找不到对应的记录,可能存在问题]", taskId); + return; + } + // 如果已经是最终的结果,则跳过 + if (BpmProcessInstanceResultEnum.isEndResult(taskExt.getResult())) { + log.warn("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, + taskExt.getResult()); + return; + } + taskExt.setEndTime(new Date()); + taskExt.setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); + taskExt.setComment(BpmProcessInstanceDeleteReasonEnum.translateReason(task.getDeleteReason())); + + // 更新任务 + taskExtMapper.updateById(taskExt); + } + + }); + } + + public HistoricTaskInstance getHistoricTask(String id) { + return historyService.createHistoricTaskInstanceQuery().taskId(id).singleResult(); + } }