diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/listener/execution/ProcessEndListener.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/listener/execution/ProcessEndListener.java index 94e04fe..faf1e3a 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/listener/execution/ProcessEndListener.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/listener/execution/ProcessEndListener.java @@ -157,6 +157,15 @@ public class ProcessEndListener implements ExecutionListener{ //2.修改流程中的流程变量为已完成 execution.setVariable(WorkFlowGlobals.BPM_STATUS,WorkFlowGlobals.BPM_BUS_STATUS_3); } + + // 综合重算主表 bpmStatus(一个事项可能有多个流程,需根据所有流程状态综合判断) + try { + Object taskTaskService = SpringContextUtils.getBean("taskTaskServiceImpl"); + taskTaskService.getClass().getMethod("syncBusinessBpmStatus", String.class) + .invoke(taskTaskService, execution.getProcessInstanceId()); + } catch (Exception e) { + log.error("【督办-同步业务状态】综合重算主表状态失败, processInstanceId: {}", execution.getProcessInstanceId(), e); + } } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java index 45ae72a..30900bc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java @@ -22,4 +22,5 @@ public interface ITaskTaskService extends IService { boolean deletePendingTask(String taskId); boolean updateTitleAndDeadline(String taskId, String title, String requireFinishDate); String getBusinessStatusByBusinessId(String businessId); + void syncBusinessBpmStatus(String processInstanceId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java index 4effb6f..ea4fdb7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java @@ -14,6 +14,7 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.modules.extbpm.process.exception.BpmException; import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion; import org.jeecg.modules.taskapprovalopinion.service.ITaskApprovalOpinionService; +import org.jeecg.modules.extbpm.process.mapper.ExtActProcessMapper; import org.jeecg.modules.extbpm.process.service.impl.BpmBaseExtApiImpl; import org.jeecg.modules.tasktask.constant.FlowConstants; import org.jeecg.modules.tasktask.entity.TaskTask; @@ -47,6 +48,8 @@ public class TaskTaskServiceImpl extends ServiceImpl i private HistoryService historyService; @Autowired private ITaskApprovalOpinionService taskApprovalOpinionService; + @Autowired + private ExtActProcessMapper extActProcessMapper; @Transactional(rollbackFor = Exception.class) public boolean singleFlowStart(TaskTask taskTask, String userName) throws Exception { String jsonString = Optional.ofNullable(taskTask.getJsonData()) @@ -265,6 +268,15 @@ public class TaskTaskServiceImpl extends ServiceImpl i @Override public String getBusinessStatusByBusinessId(String businessId) { + return getBusinessStatusByBusinessId(businessId, null); + } + + /** + * 查询业务综合状态,排除指定流程实例(ProcessEndListener 回调时使用) + * @param businessId 主表记录 ID + * @param excludeProcessInstanceId 需排除的流程实例 ID(正在结束中,runtime 表暂未清理) + */ + private String getBusinessStatusByBusinessId(String businessId, String excludeProcessInstanceId) { if (StringUtils.isBlank(businessId)) { log.warn("【督办-查询业务状态】businessId为空, 状态: 1(未开始)"); return "1"; @@ -287,11 +299,22 @@ public class TaskTaskServiceImpl extends ServiceImpl i continue; } hasAnyProcess = true; + // 排除正在结束的流程(ProcessEndListener 回调时 runtime 记录暂未清理) + if (tt.getProcessInstId().equals(excludeProcessInstanceId)) { + continue; + } + // 先查历史表:已结束的流程直接跳过(runtime 记录可能因异步清理而残留) + long finished = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(tt.getProcessInstId()) + .finished() + .count(); + if (finished > 0) { + continue; + } long running = runtimeService.createProcessInstanceQuery() .processInstanceId(tt.getProcessInstId()) .count(); if (running > 0) { - // 存在运行中的流程 -> 督办中 log.info("【督办-查询业务状态】存在运行中的流程实例, businessId: {}, processInstId: {}, 状态: 2(督办中)", businessId, tt.getProcessInstId()); return "2"; @@ -306,4 +329,39 @@ public class TaskTaskServiceImpl extends ServiceImpl i log.info("【督办-查询业务状态】仅有待发起任务记录, businessId: {}, 状态: 2(督办中)", businessId); return "2"; } + + /** + * 流程状态变化后,综合重算并更新主表的 bpm_status + * @param processInstanceId Flowable 流程实例 ID + */ + public void syncBusinessBpmStatus(String processInstanceId) { + if (StringUtils.isBlank(processInstanceId)) { + log.warn("【督办-同步业务状态】processInstanceId为空,跳过"); + return; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(TaskTask::getProcessInstId, processInstanceId); + TaskTask taskTask = this.getOne(queryWrapper); + + if (taskTask == null) { + log.info("【督办-同步业务状态】未找到对应的 task_task 记录, processInstanceId: {}", processInstanceId); + return; + } + + String businessId = taskTask.getBusinessId(); + String businessTablename = taskTask.getBusinessTablename(); + + if (StringUtils.isBlank(businessId) || StringUtils.isBlank(businessTablename)) { + log.warn("【督办-同步业务状态】businessId 或 businessTablename 为空, processInstanceId: {}", processInstanceId); + return; + } + + // 排除正在结束的流程,避免 runtime 表残留导致误判为"督办中" + String newStatus = getBusinessStatusByBusinessId(businessId, processInstanceId); + extActProcessMapper.updateBpmStatusById(businessTablename, businessId, "BPM_STATUS", newStatus); + + log.info("【督办-同步业务状态】已更新主表状态, businessTablename: {}, businessId: {}, 新状态: {}", + businessTablename, businessId, newStatus); + } }