czh-20260708-支持监听流程状态,并写入到业务完成状态中

This commit is contained in:
zhihao
2026-07-09 08:23:23 +08:00
parent 13f566ec9f
commit 025cb0b92d
3 changed files with 69 additions and 1 deletions
@@ -22,4 +22,5 @@ public interface ITaskTaskService extends IService<TaskTask> {
boolean deletePendingTask(String taskId);
boolean updateTitleAndDeadline(String taskId, String title, String requireFinishDate);
String getBusinessStatusByBusinessId(String businessId);
void syncBusinessBpmStatus(String processInstanceId);
}
@@ -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<TaskTaskMapper, TaskTask> 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<TaskTaskMapper, TaskTask> 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<TaskTaskMapper, TaskTask> 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<TaskTaskMapper, TaskTask> 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<TaskTask> queryWrapper = new LambdaQueryWrapper<TaskTask>()
.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);
}
}