diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java index b5709d8..d146271 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java @@ -51,16 +51,16 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe public R insertInspectInstance(String planInspectCode, String tenantId, Long userId){ // 【重要】在主线程中先登录,确保后续所有调用都有认证上下文 StpUtil.login(userId, "login"); - + // 【关键修复】设置租户上下文,确保工作流能获取到正确的租户ID TenantHelper.setDynamic(tenantId); - + try { // 创建检查实例 R rInspectInstanceId = createInspectInstance(planInspectCode, tenantId, userId); Long inspectInstanceId = rInspectInstanceId.getData(); String businessId = inspectInstanceId.toString(); - + if (!R.isSuccess(rInspectInstanceId)) { return R.fail(); } else { @@ -68,30 +68,33 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe RemoteStartProcess remoteStartProcess = new RemoteStartProcess(); remoteStartProcess.setBusinessId(businessId); remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE); - + // 【重要】通过Dubbo隐式参数传递租户ID RpcContext.getContext().setAttachment("tenantId", tenantId); - + RemoteStartProcessReturn result = remoteWorkflowService.startWorkFlow(remoteStartProcess); - + if (ObjectUtils.isEmpty(result)) { return R.fail(); } else { + // 【关键修复】存储流程实例ID而不是任务ID + Long processInstanceId = result.getProcessInstanceId(); Long taskId = result.getTaskId(); + // 【简化方案】异步处理工作流推进,避免死锁 CompletableFuture.runAsync(TtlRunnable.get(() -> { try { // 【关键】在异步线程中重新登录相同用户 StpUtil.login(userId, "login"); - + // 【关键修复】在异步线程中重新设置租户上下文 TenantHelper.setDynamic(tenantId); - + log.info("检查工单异步线程中,当前租户ID: {}", TenantHelper.getTenantId()); - - // 【执行业务】更新检查工单的工作流信息 - updateInspectWorkflow(inspectInstanceId, taskId); - + + // 【关键修复】传递流程实例ID而不是任务ID + updateInspectWorkflow(inspectInstanceId, processInstanceId, taskId); + log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId); } catch (Exception e) { log.error("检查工单 {} 异步工作流处理失败: {}", inspectInstanceId, e.getMessage(), e); @@ -168,7 +171,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class) .eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId()); List dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw); - + // 遍历检查路线明细,生成检查实例明细 for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){ DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail(); @@ -206,29 +209,30 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe return R.ok(dmsBillsInspectInstance.getInspectInstanceId()); } - private void updateInspectWorkflow(Long businessId, Long taskId) { + private void updateInspectWorkflow(Long businessId, Long processInstanceId, Long taskId) { try { // 【关键修复】确保在工作流操作前有正确的租户上下文 String currentTenantId = TenantHelper.getTenantId(); log.info("检查工作流更新前,当前租户ID: {}", currentTenantId); - - // 1. 更新工作流ID + + // 【关键修复】更新流程实例ID而不是任务ID DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId); if (inspectInstance != null) { - inspectInstance.setWfDefinitionId(taskId); + // 【关键修复】存储流程实例ID而不是任务ID + inspectInstance.setWfDefinitionId(processInstanceId); int updateResult = dmsBillsInspectInstanceMapper.updateById(inspectInstance); if (updateResult > 0) { - log.info("检查工单 {} 工作流ID更新成功: {}", businessId, taskId); + log.info("检查工单 {} 工作流实例ID更新成功: {}", businessId, processInstanceId); } else { - log.error("检查工单 {} 工作流ID更新失败", businessId); + log.error("检查工单 {} 工作流实例ID更新失败", businessId); return; } } else { - log.error("检查工单 {} 不存在,无法更新工作流ID", businessId); + log.error("检查工单 {} 不存在,无法更新工作流实例ID", businessId); return; } - // 2. 推进工作流状态 + // 推进工作流状态 RemoteCompleteTask completeTask = new RemoteCompleteTask(); completeTask.setTaskId(taskId); completeTask.setMessage("检查工单启动,自动推进"); @@ -236,21 +240,21 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe List messageTypes = new ArrayList<>(); messageTypes.add("system"); // 系统消息 completeTask.setMessageType(messageTypes); - + // 【关键修复】在调用工作流推进前再次确认租户上下文 log.info("检查工作流推进前,当前租户ID: {}", TenantHelper.getTenantId()); - + // 【重要】通过Dubbo隐式参数传递租户ID RpcContext.getContext().setAttachment("tenantId", currentTenantId); - + // 【关键】调用工作流推进 - boolean completeResult = remoteWorkflowService.completeTask(completeTask); + boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进"); if (completeResult) { log.info("检查工单 {} 工作流推进成功", businessId); } else { log.warn("检查工单 {} 工作流推进失败,但工单已创建成功", businessId); } - + } catch (Exception e) { log.error("检查工单 {} 工作流更新失败: {}", businessId, e.getMessage(), e); // 注意:这里不抛出异常,避免影响主流程 diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java index 2c4dd9a..f96f5dc 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java @@ -92,7 +92,10 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService if(ObjectUtils.isEmpty(result)){ return R.fail(); }else { + // 【关键修复】存储流程实例ID而不是任务ID + Long processInstanceId = result.getProcessInstanceId(); Long taskId = result.getTaskId(); + // 【简化方案】直接在异步线程中重新登录相同用户,避免Token传递复杂性 CompletableFuture.runAsync(TtlRunnable.get(() -> { try { @@ -105,8 +108,8 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService log.info("异步线程中,当前租户ID: {}", TenantHelper.getTenantId()); - // 【执行业务】更新润滑工单的工作流信息 - updateWarmFlow(LubeStanceId, taskId); + // 【关键修复】传递流程实例ID而不是任务ID + updateWarmFlow(LubeStanceId, processInstanceId, taskId); log.info("润滑工单 {} 异步工作流处理完成", LubeStanceId); } catch (Exception e) { @@ -224,26 +227,27 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService } - private void updateWarmFlow(Long businessId,Long taskId){ + private void updateWarmFlow(Long businessId, Long processInstanceId, Long taskId){ try { // 【关键修复】确保在工作流操作前有正确的租户上下文 String currentTenantId = TenantHelper.getTenantId(); log.info("工作流更新前,当前租户ID: {}", currentTenantId); - // 1. 更新工作流ID + // 1. 【关键修复】更新流程实例ID而不是任务ID DmsBillsLubeInstanceVo dmsBillsLubeInstanceVo = dmsBillsLubeInstanceService.queryById(businessId); if (dmsBillsLubeInstanceVo == null) { - log.error("润滑工单 {} 不存在,无法更新工作流ID", businessId); + log.error("润滑工单 {} 不存在,无法更新工作流实例ID", businessId); return; } DmsBillsLubeInstance billsLubeInstance = MapstructUtils.convert(dmsBillsLubeInstanceVo, DmsBillsLubeInstance.class); - billsLubeInstance.setWfDefinitionId(taskId); + // 【关键修复】存储流程实例ID而不是任务ID + billsLubeInstance.setWfDefinitionId(processInstanceId); int updateResult = dmsBillsLubeInstanceMapper.updateById(billsLubeInstance); if (updateResult > 0) { - log.info("润滑工单 {} 工作流ID更新成功: {}", businessId, taskId); + log.info("润滑工单 {} 工作流实例ID更新成功: {}", businessId, processInstanceId); } else { - log.error("润滑工单 {} 工作流ID更新失败", businessId); + log.error("润滑工单 {} 工作流实例ID更新失败", businessId); return; } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java index 6750524..f254a19 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java @@ -90,7 +90,15 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic if (ObjectUtils.isEmpty(result)) { return R.fail(); } else { + // 【关键修复】获取流程实例ID和任务ID,区分存储 + Long processInstanceId = result.getProcessInstanceId(); Long taskId = result.getTaskId(); + + if (processInstanceId == null) { + log.error("保养工作流启动失败,未获取到流程实例ID"); + return R.fail(); + } + // 【简化方案】异步处理工作流推进,避免死锁 CompletableFuture.runAsync(TtlRunnable.get(() -> { try { @@ -102,8 +110,8 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic log.info("保养工单异步线程中,当前租户ID: {}", TenantHelper.getTenantId()); - // 【执行业务】更新保养工单的工作流信息 - updateMaintWorkflow(maintInstanceId, taskId); + // 【执行业务】更新保养工单的工作流信息并推进 + updateMaintWorkflow(maintInstanceId, processInstanceId, taskId); log.info("保养工单 {} 异步工作流处理完成", maintInstanceId); } catch (Exception e) { @@ -206,7 +214,7 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic billsMaintDetailProject.setMaintProjectId(project.getMaintProjectId()); billsMaintDetailProject.setMaintProjectName(project.getMaintProjectName()); billsMaintDetailProject.setMaintProjectDesc(project.getMaintProjectDesc()); - billsMaintDetailProject.setMaintProjectStatus("2");//保养项目状态(0待保养 1保养完成) + billsMaintDetailProject.setMaintProjectStatus("2");//FIXME:保养项目状态(0待保养 1保养完成) //字段没有自动填充,只能代码手动填充 billsMaintDetailProject.setCreateBy(userId); @@ -217,25 +225,32 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic } } - private void updateMaintWorkflow(Long businessId, Long taskId) { + /** + * 【参考润滑工单优化】更新保养工单的工作流信息并推进工作流 + * + * @param businessId 业务ID(保养实例ID) + * @param processInstanceId 流程实例ID + * @param taskId 工作流任务ID(用于推进工作流) + */ + private void updateMaintWorkflow(Long businessId, Long processInstanceId, Long taskId) { try { // 【关键修复】确保在工作流操作前有正确的租户上下文 String currentTenantId = TenantHelper.getTenantId(); log.info("保养工作流更新前,当前租户ID: {}", currentTenantId); - // 1. 更新工作流ID + // 1. 【关键修复】存储流程实例ID到wfDefinitionId字段,而不是任务ID DmsBillsMaintInstance maintInstance = dmsBillsMaintInstanceMapper.selectById(businessId); if (maintInstance != null) { - maintInstance.setWfDefinitionId(taskId); + maintInstance.setWfDefinitionId(processInstanceId); // 存储流程实例ID int updateResult = dmsBillsMaintInstanceMapper.updateById(maintInstance); if (updateResult > 0) { - log.info("保养工单 {} 工作流ID更新成功: {}", businessId, taskId); + log.info("保养工单 {} 流程实例ID更新成功: {}", businessId, processInstanceId); } else { - log.error("保养工单 {} 工作流ID更新失败", businessId); + log.error("保养工单 {} 流程实例ID更新失败", businessId); return; } } else { - log.error("保养工单 {} 不存在,无法更新工作流ID", businessId); + log.error("保养工单 {} 不存在,无法更新流程实例ID", businessId); return; }