From bd68ec888dcf506ee0f5754d3c748e9e391e8260 Mon Sep 17 00:00:00 2001 From: wsm <8454518+new-twice@user.noreply.gitee.com> Date: Tue, 11 Aug 2026 09:45:38 +0000 Subject: [PATCH] =?UTF-8?q?!123=20fix(flow):=20=E4=BF=AE=E5=A4=8D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=BF=90=E8=A1=8C=E9=98=BB=E6=96=AD=E4=B8=8E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=80=E8=87=B4=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(flow): 修复流程运行阻断与数据一致性问题 --- .../controller/BgPartymatterController.java | 8 ++----- .../service/IBgPartymatterService.java | 10 ++++++++ .../impl/BgPartymatterServiceImpl.java | 14 +++++++++-- .../controller/BgTakepulseController.java | 7 ++---- .../service/IBgTakepulseService.java | 12 +++++++++- .../service/impl/BgTakepulseServiceImpl.java | 10 ++++++++ .../flow/InspectCloseoutFlow.java | 6 ++--- .../DqInspectTaskStageIncrementListener.java | 17 +++++++++++++- .../FixedContact20260730Controller.java | 4 ++-- .../service/IFixedContact20260730Service.java | 10 ++++++++ .../impl/FixedContact20260730ServiceImpl.java | 14 ++++++++++- .../controller/BgXiSpeakController.java | 4 ++-- .../supervision/xispeak/flow/XiSpeakFlow.java | 23 +++++++++++++++---- .../AfterBgLeaderApproveListener.java | 4 +++- .../AfterImplDeptLeaderApproveListener.java | 4 +++- .../AfterImplWorkerTemStoreListener.java | 4 +++- .../xispeak/service/IBgXiSpeakService.java | 10 ++++++++ .../service/impl/BgXiSpeakServiceImpl.java | 7 ++++++ .../InspectCloseoutFlowTest.java | 2 +- 19 files changed, 139 insertions(+), 31 deletions(-) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/controller/BgPartymatterController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/controller/BgPartymatterController.java index 4189b0f..c24e475 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/controller/BgPartymatterController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/controller/BgPartymatterController.java @@ -1,7 +1,6 @@ package org.jeecg.modules.supervision.bgpartymatter.controller; import com.alibaba.fastjson.JSONObject; -import org.flowable.engine.RuntimeService; import org.jeecg.common.system.query.QueryGenerator; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.jeecg.common.system.query.QueryRuleEnum; @@ -76,9 +75,6 @@ public class BgPartymatterController extends JeecgController { */ public void delBatchMain (Collection idList); + /** + * 保存BPM办理页主表,并同步流程变量;二者同事务,setVariable 失败时回滚主表更新,保证一致 + * + * @param formData 主表数据 + * @param processInstanceId 流程实例ID + * @param varField 流程变量名 + * @param jsonData 写入流程变量的JSON字符串 + */ + void saveBpmFormAndSyncVariable(BgPartymatter formData, String processInstanceId, String varField, String jsonData); + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/service/impl/BgPartymatterServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/service/impl/BgPartymatterServiceImpl.java index 9f78a6d..4bf42e1 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/service/impl/BgPartymatterServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bgpartymatter/service/impl/BgPartymatterServiceImpl.java @@ -4,6 +4,7 @@ import org.jeecg.modules.supervision.bgpartymatter.entity.BgPartymatter; import org.jeecg.modules.supervision.bgpartymatter.mapper.BgPartymatterFeedbackMapper; import org.jeecg.modules.supervision.bgpartymatter.mapper.BgPartymatterMapper; import org.jeecg.modules.supervision.bgpartymatter.service.IBgPartymatterService; +import org.flowable.engine.RuntimeService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +26,9 @@ public class BgPartymatterServiceImpl extends ServiceImpl { * @param idList */ public void delBatchMain (Collection idList); - + + /** + * 保存BPM办理页主表,并同步流程变量;二者同事务,setVariable 失败时回滚主表更新,保证一致 + * + * @param formData 主表数据 + * @param processInstanceId 流程实例ID + * @param varField 流程变量名 + * @param jsonData 写入流程变量的JSON字符串 + */ + void saveBpmFormAndSyncVariable(BgTakepulse formData, String processInstanceId, String varField, String jsonData); + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bqtakepulse/service/impl/BgTakepulseServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bqtakepulse/service/impl/BgTakepulseServiceImpl.java index b0ee2ce..eff85cd 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bqtakepulse/service/impl/BgTakepulseServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/bqtakepulse/service/impl/BgTakepulseServiceImpl.java @@ -5,6 +5,7 @@ import org.jeecg.modules.supervision.bqtakepulse.entity.BgTakepulseFeedback; import org.jeecg.modules.supervision.bqtakepulse.mapper.BgTakepulseFeedbackMapper; import org.jeecg.modules.supervision.bqtakepulse.mapper.BgTakepulseMapper; import org.jeecg.modules.supervision.bqtakepulse.service.IBgTakepulseService; +import org.flowable.engine.RuntimeService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +27,8 @@ public class BgTakepulseServiceImpl extends ServiceImpl jjDeptLdUserIdList = this.getJJDeptLdUserIdList(); - if (jjDeptLdUserIdList != null && !jjDeptLdUserIdList.isEmpty()) { - return jjDeptLdUserIdList.size(); + List jjDeptWorkerIdList = this.getJJDeptLdWorkerIdList(); + if (jjDeptWorkerIdList != null && !jjDeptWorkerIdList.isEmpty()) { + return jjDeptWorkerIdList.size(); } log.error("【巡视整改销号-流程表达式】JJ部门WORKER角色没有对应用户"); return 0; diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/dqinspecttask/listener/DqInspectTaskStageIncrementListener.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/dqinspecttask/listener/DqInspectTaskStageIncrementListener.java index 4b999cb..632d89e 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/dqinspecttask/listener/DqInspectTaskStageIncrementListener.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/dqinspecttask/listener/DqInspectTaskStageIncrementListener.java @@ -3,6 +3,7 @@ package org.jeecg.modules.supervision.dqinspecttask.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.ExecutionListener; import org.jeecg.modules.supervision.dqinspecttask.config.InspectImproveConfig; @@ -24,8 +25,12 @@ public class DqInspectTaskStageIncrementListener implements ExecutionListener { private static final long serialVersionUID = 1L; + /** 幂等标记变量名:同一流程实例结束仅递增一次 */ + private static final String INCREMENT_FLAG_KEY = "stage_increment_done"; + private final InspectImproveConfig inspectImproveConfig; private final IDqInspectTaskService dqInspectTaskService; + private final RuntimeService runtimeService; @Override public void notify(DelegateExecution execution) { @@ -37,6 +42,16 @@ public class DqInspectTaskStageIncrementListener implements ExecutionListener { } String businessKey = businessKeyObj.toString(); + String processInstanceId = execution.getProcessInstanceId(); + + // 幂等保护:同一流程实例结束仅递增一次,避免多结束事件/命令重试导致 completedStage 重复累加 + if (Boolean.TRUE.equals(runtimeService.getVariable(processInstanceId, INCREMENT_FLAG_KEY))) { + log.info("【巡视整改-阶段递增监听器】本次流程已完成阶段递增,跳过, businessKey: {}, processInstanceId: {}", + businessKey, processInstanceId); + return; + } + runtimeService.setVariable(processInstanceId, INCREMENT_FLAG_KEY, Boolean.TRUE); + boolean updated = dqInspectTaskService.lambdaUpdate() .setSql("completed_stage = completed_stage + 1") .eq(DqInspectTask::getId, businessKey) @@ -44,7 +59,7 @@ public class DqInspectTaskStageIncrementListener implements ExecutionListener { if (updated) { log.info("【巡视整改-阶段递增监听器】completedStage 已递增, businessKey: {}, processInstanceId: {}", - businessKey, execution.getProcessInstanceId()); + businessKey, processInstanceId); } else { log.warn("【巡视整改-阶段递增监听器】递增未影响任何行,可能记录已删除, businessKey: {}", businessKey); } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/fixcontact/controller/FixedContact20260730Controller.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/fixcontact/controller/FixedContact20260730Controller.java index b2fcd62..8218447 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/fixcontact/controller/FixedContact20260730Controller.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/fixcontact/controller/FixedContact20260730Controller.java @@ -235,8 +235,8 @@ public class FixedContact20260730Controller extends JeecgController subList) { @@ -70,7 +74,8 @@ public class FixedContact20260730ServiceImpl extends ServiceImpl implUserNameList) { - FixedContact20260730 fixedContact = this.getById(mainId); + // 行锁(for update)防止多部门并发保存时读-改-写丢失更新 + FixedContact20260730 fixedContact = this.getByIdForUpdate(mainId); if (fixedContact == null) { throw new JeecgBootException("业务表单不存在"); } @@ -109,4 +114,11 @@ public class FixedContact20260730ServiceImpl extends ServiceImpl { * isEnd=1 时 implWorker 生效,isEnd=0 时 implUserNameList 生效 */ void saveSubApprove(String mainId, String deptId, Integer isEnd, String implWorker, List implUserNameList); + + /** + * 保存BPM办理页主表,并同步流程变量;二者同事务,setVariable 失败时回滚主表更新,保证一致 + * + * @param formData 主表数据 + * @param processInstanceId 流程实例ID + * @param varField 流程变量名 + * @param jsonData 写入流程变量的JSON字符串 + */ + void saveBpmFormAndSyncVariable(BgXiSpeak formData, String processInstanceId, String varField, String jsonData); } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/xispeak/service/impl/BgXiSpeakServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/xispeak/service/impl/BgXiSpeakServiceImpl.java index a69855c..c36a985 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/xispeak/service/impl/BgXiSpeakServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/supervision/xispeak/service/impl/BgXiSpeakServiceImpl.java @@ -468,4 +468,11 @@ public class BgXiSpeakServiceImpl extends ServiceImpl