!71 czh-20260708-支持监听流程状态,并写入到业务完成状态中
Merge pull request !71 from 陈志浩/feature/feedback-20260707
This commit is contained in:
+9
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
@@ -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);
|
||||
}
|
||||
|
||||
+59
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user