czh-20260708-支持监听流程状态,并写入到业务完成状态中
This commit is contained in:
+9
@@ -157,6 +157,15 @@ public class ProcessEndListener implements ExecutionListener{
|
|||||||
//2.修改流程中的流程变量为已完成
|
//2.修改流程中的流程变量为已完成
|
||||||
execution.setVariable(WorkFlowGlobals.BPM_STATUS,WorkFlowGlobals.BPM_BUS_STATUS_3);
|
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 deletePendingTask(String taskId);
|
||||||
boolean updateTitleAndDeadline(String taskId, String title, String requireFinishDate);
|
boolean updateTitleAndDeadline(String taskId, String title, String requireFinishDate);
|
||||||
String getBusinessStatusByBusinessId(String businessId);
|
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.extbpm.process.exception.BpmException;
|
||||||
import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion;
|
import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion;
|
||||||
import org.jeecg.modules.taskapprovalopinion.service.ITaskApprovalOpinionService;
|
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.extbpm.process.service.impl.BpmBaseExtApiImpl;
|
||||||
import org.jeecg.modules.tasktask.constant.FlowConstants;
|
import org.jeecg.modules.tasktask.constant.FlowConstants;
|
||||||
import org.jeecg.modules.tasktask.entity.TaskTask;
|
import org.jeecg.modules.tasktask.entity.TaskTask;
|
||||||
@@ -47,6 +48,8 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
|
|||||||
private HistoryService historyService;
|
private HistoryService historyService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ITaskApprovalOpinionService taskApprovalOpinionService;
|
private ITaskApprovalOpinionService taskApprovalOpinionService;
|
||||||
|
@Autowired
|
||||||
|
private ExtActProcessMapper extActProcessMapper;
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean singleFlowStart(TaskTask taskTask, String userName) throws Exception {
|
public boolean singleFlowStart(TaskTask taskTask, String userName) throws Exception {
|
||||||
String jsonString = Optional.ofNullable(taskTask.getJsonData())
|
String jsonString = Optional.ofNullable(taskTask.getJsonData())
|
||||||
@@ -265,6 +268,15 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getBusinessStatusByBusinessId(String businessId) {
|
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)) {
|
if (StringUtils.isBlank(businessId)) {
|
||||||
log.warn("【督办-查询业务状态】businessId为空, 状态: 1(未开始)");
|
log.warn("【督办-查询业务状态】businessId为空, 状态: 1(未开始)");
|
||||||
return "1";
|
return "1";
|
||||||
@@ -287,11 +299,22 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
hasAnyProcess = true;
|
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()
|
long running = runtimeService.createProcessInstanceQuery()
|
||||||
.processInstanceId(tt.getProcessInstId())
|
.processInstanceId(tt.getProcessInstId())
|
||||||
.count();
|
.count();
|
||||||
if (running > 0) {
|
if (running > 0) {
|
||||||
// 存在运行中的流程 -> 督办中
|
|
||||||
log.info("【督办-查询业务状态】存在运行中的流程实例, businessId: {}, processInstId: {}, 状态: 2(督办中)",
|
log.info("【督办-查询业务状态】存在运行中的流程实例, businessId: {}, processInstId: {}, 状态: 2(督办中)",
|
||||||
businessId, tt.getProcessInstId());
|
businessId, tt.getProcessInstId());
|
||||||
return "2";
|
return "2";
|
||||||
@@ -306,4 +329,39 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
|
|||||||
log.info("【督办-查询业务状态】仅有待发起任务记录, businessId: {}, 状态: 2(督办中)", businessId);
|
log.info("【督办-查询业务状态】仅有待发起任务记录, businessId: {}, 状态: 2(督办中)", businessId);
|
||||||
return "2";
|
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