fix(dms): 修复工作流相关问题

- 修复了检查工单、润滑工单和保养工单在创建时未正确存储流程实例ID的问题
- 优化了工作流推进逻辑,确保在异步线程中正确处理租户上下文
- 改进了日志信息,使其更加准确地反映流程实例ID和任务ID
master
zch 1 week ago
parent 269219e976
commit df28ff1633

@ -77,7 +77,10 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
if (ObjectUtils.isEmpty(result)) { if (ObjectUtils.isEmpty(result)) {
return R.fail(); return R.fail();
} else { } else {
// 【关键修复】存储流程实例ID而不是任务ID
Long processInstanceId = result.getProcessInstanceId();
Long taskId = result.getTaskId(); Long taskId = result.getTaskId();
// 【简化方案】异步处理工作流推进,避免死锁 // 【简化方案】异步处理工作流推进,避免死锁
CompletableFuture.runAsync(TtlRunnable.get(() -> { CompletableFuture.runAsync(TtlRunnable.get(() -> {
try { try {
@ -89,8 +92,8 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
log.info("检查工单异步线程中当前租户ID: {}", TenantHelper.getTenantId()); log.info("检查工单异步线程中当前租户ID: {}", TenantHelper.getTenantId());
// 【执行业务】更新检查工单的工作流信息 // 【关键修复】传递流程实例ID而不是任务ID
updateInspectWorkflow(inspectInstanceId, taskId); updateInspectWorkflow(inspectInstanceId, processInstanceId, taskId);
log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId); log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId);
} catch (Exception e) { } catch (Exception e) {
@ -206,29 +209,30 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
return R.ok(dmsBillsInspectInstance.getInspectInstanceId()); return R.ok(dmsBillsInspectInstance.getInspectInstanceId());
} }
private void updateInspectWorkflow(Long businessId, Long taskId) { private void updateInspectWorkflow(Long businessId, Long processInstanceId, Long taskId) {
try { try {
// 【关键修复】确保在工作流操作前有正确的租户上下文 // 【关键修复】确保在工作流操作前有正确的租户上下文
String currentTenantId = TenantHelper.getTenantId(); String currentTenantId = TenantHelper.getTenantId();
log.info("检查工作流更新前当前租户ID: {}", currentTenantId); log.info("检查工作流更新前当前租户ID: {}", currentTenantId);
// 1. 更新工作流ID // 【关键修复】更新流程实例ID而不是任务ID
DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId); DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId);
if (inspectInstance != null) { if (inspectInstance != null) {
inspectInstance.setWfDefinitionId(taskId); // 【关键修复】存储流程实例ID而不是任务ID
inspectInstance.setWfDefinitionId(processInstanceId);
int updateResult = dmsBillsInspectInstanceMapper.updateById(inspectInstance); int updateResult = dmsBillsInspectInstanceMapper.updateById(inspectInstance);
if (updateResult > 0) { if (updateResult > 0) {
log.info("检查工单 {} 工作流ID更新成功: {}", businessId, taskId); log.info("检查工单 {} 工作流实例ID更新成功: {}", businessId, processInstanceId);
} else { } else {
log.error("检查工单 {} 工作流ID更新失败", businessId); log.error("检查工单 {} 工作流实例ID更新失败", businessId);
return; return;
} }
} else { } else {
log.error("检查工单 {} 不存在,无法更新工作流ID", businessId); log.error("检查工单 {} 不存在,无法更新工作流实例ID", businessId);
return; return;
} }
// 2. 推进工作流状态 // 推进工作流状态
RemoteCompleteTask completeTask = new RemoteCompleteTask(); RemoteCompleteTask completeTask = new RemoteCompleteTask();
completeTask.setTaskId(taskId); completeTask.setTaskId(taskId);
completeTask.setMessage("检查工单启动,自动推进"); completeTask.setMessage("检查工单启动,自动推进");
@ -244,7 +248,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
RpcContext.getContext().setAttachment("tenantId", currentTenantId); RpcContext.getContext().setAttachment("tenantId", currentTenantId);
// 【关键】调用工作流推进 // 【关键】调用工作流推进
boolean completeResult = remoteWorkflowService.completeTask(completeTask); boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进");
if (completeResult) { if (completeResult) {
log.info("检查工单 {} 工作流推进成功", businessId); log.info("检查工单 {} 工作流推进成功", businessId);
} else { } else {

@ -92,7 +92,10 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService
if(ObjectUtils.isEmpty(result)){ if(ObjectUtils.isEmpty(result)){
return R.fail(); return R.fail();
}else { }else {
// 【关键修复】存储流程实例ID而不是任务ID
Long processInstanceId = result.getProcessInstanceId();
Long taskId = result.getTaskId(); Long taskId = result.getTaskId();
// 【简化方案】直接在异步线程中重新登录相同用户避免Token传递复杂性 // 【简化方案】直接在异步线程中重新登录相同用户避免Token传递复杂性
CompletableFuture.runAsync(TtlRunnable.get(() -> { CompletableFuture.runAsync(TtlRunnable.get(() -> {
try { try {
@ -105,8 +108,8 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService
log.info("异步线程中当前租户ID: {}", TenantHelper.getTenantId()); log.info("异步线程中当前租户ID: {}", TenantHelper.getTenantId());
// 【执行业务】更新润滑工单的工作流信息 // 【关键修复】传递流程实例ID而不是任务ID
updateWarmFlow(LubeStanceId, taskId); updateWarmFlow(LubeStanceId, processInstanceId, taskId);
log.info("润滑工单 {} 异步工作流处理完成", LubeStanceId); log.info("润滑工单 {} 异步工作流处理完成", LubeStanceId);
} catch (Exception e) { } 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 { try {
// 【关键修复】确保在工作流操作前有正确的租户上下文 // 【关键修复】确保在工作流操作前有正确的租户上下文
String currentTenantId = TenantHelper.getTenantId(); String currentTenantId = TenantHelper.getTenantId();
log.info("工作流更新前当前租户ID: {}", currentTenantId); log.info("工作流更新前当前租户ID: {}", currentTenantId);
// 1. 更新工作流ID // 1. 【关键修复】更新流程实例ID而不是任务ID
DmsBillsLubeInstanceVo dmsBillsLubeInstanceVo = dmsBillsLubeInstanceService.queryById(businessId); DmsBillsLubeInstanceVo dmsBillsLubeInstanceVo = dmsBillsLubeInstanceService.queryById(businessId);
if (dmsBillsLubeInstanceVo == null) { if (dmsBillsLubeInstanceVo == null) {
log.error("润滑工单 {} 不存在,无法更新工作流ID", businessId); log.error("润滑工单 {} 不存在,无法更新工作流实例ID", businessId);
return; return;
} }
DmsBillsLubeInstance billsLubeInstance = MapstructUtils.convert(dmsBillsLubeInstanceVo, DmsBillsLubeInstance.class); DmsBillsLubeInstance billsLubeInstance = MapstructUtils.convert(dmsBillsLubeInstanceVo, DmsBillsLubeInstance.class);
billsLubeInstance.setWfDefinitionId(taskId); // 【关键修复】存储流程实例ID而不是任务ID
billsLubeInstance.setWfDefinitionId(processInstanceId);
int updateResult = dmsBillsLubeInstanceMapper.updateById(billsLubeInstance); int updateResult = dmsBillsLubeInstanceMapper.updateById(billsLubeInstance);
if (updateResult > 0) { if (updateResult > 0) {
log.info("润滑工单 {} 工作流ID更新成功: {}", businessId, taskId); log.info("润滑工单 {} 工作流实例ID更新成功: {}", businessId, processInstanceId);
} else { } else {
log.error("润滑工单 {} 工作流ID更新失败", businessId); log.error("润滑工单 {} 工作流实例ID更新失败", businessId);
return; return;
} }

@ -90,7 +90,15 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic
if (ObjectUtils.isEmpty(result)) { if (ObjectUtils.isEmpty(result)) {
return R.fail(); return R.fail();
} else { } else {
// 【关键修复】获取流程实例ID和任务ID区分存储
Long processInstanceId = result.getProcessInstanceId();
Long taskId = result.getTaskId(); Long taskId = result.getTaskId();
if (processInstanceId == null) {
log.error("保养工作流启动失败未获取到流程实例ID");
return R.fail();
}
// 【简化方案】异步处理工作流推进,避免死锁 // 【简化方案】异步处理工作流推进,避免死锁
CompletableFuture.runAsync(TtlRunnable.get(() -> { CompletableFuture.runAsync(TtlRunnable.get(() -> {
try { try {
@ -102,8 +110,8 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic
log.info("保养工单异步线程中当前租户ID: {}", TenantHelper.getTenantId()); log.info("保养工单异步线程中当前租户ID: {}", TenantHelper.getTenantId());
// 【执行业务】更新保养工单的工作流信息 // 【执行业务】更新保养工单的工作流信息并推进
updateMaintWorkflow(maintInstanceId, taskId); updateMaintWorkflow(maintInstanceId, processInstanceId, taskId);
log.info("保养工单 {} 异步工作流处理完成", maintInstanceId); log.info("保养工单 {} 异步工作流处理完成", maintInstanceId);
} catch (Exception e) { } catch (Exception e) {
@ -206,7 +214,7 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic
billsMaintDetailProject.setMaintProjectId(project.getMaintProjectId()); billsMaintDetailProject.setMaintProjectId(project.getMaintProjectId());
billsMaintDetailProject.setMaintProjectName(project.getMaintProjectName()); billsMaintDetailProject.setMaintProjectName(project.getMaintProjectName());
billsMaintDetailProject.setMaintProjectDesc(project.getMaintProjectDesc()); billsMaintDetailProject.setMaintProjectDesc(project.getMaintProjectDesc());
billsMaintDetailProject.setMaintProjectStatus("2");//保养项目状态0待保养 1保养完成 billsMaintDetailProject.setMaintProjectStatus("2");//FIXME:保养项目状态0待保养 1保养完成
//字段没有自动填充,只能代码手动填充 //字段没有自动填充,只能代码手动填充
billsMaintDetailProject.setCreateBy(userId); billsMaintDetailProject.setCreateBy(userId);
@ -217,25 +225,32 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic
} }
} }
private void updateMaintWorkflow(Long businessId, Long taskId) { /**
*
*
* @param businessId IDID
* @param processInstanceId ID
* @param taskId ID
*/
private void updateMaintWorkflow(Long businessId, Long processInstanceId, Long taskId) {
try { try {
// 【关键修复】确保在工作流操作前有正确的租户上下文 // 【关键修复】确保在工作流操作前有正确的租户上下文
String currentTenantId = TenantHelper.getTenantId(); String currentTenantId = TenantHelper.getTenantId();
log.info("保养工作流更新前当前租户ID: {}", currentTenantId); log.info("保养工作流更新前当前租户ID: {}", currentTenantId);
// 1. 更新工作流ID // 1. 【关键修复】存储流程实例ID到wfDefinitionId字段而不是任务ID
DmsBillsMaintInstance maintInstance = dmsBillsMaintInstanceMapper.selectById(businessId); DmsBillsMaintInstance maintInstance = dmsBillsMaintInstanceMapper.selectById(businessId);
if (maintInstance != null) { if (maintInstance != null) {
maintInstance.setWfDefinitionId(taskId); maintInstance.setWfDefinitionId(processInstanceId); // 存储流程实例ID
int updateResult = dmsBillsMaintInstanceMapper.updateById(maintInstance); int updateResult = dmsBillsMaintInstanceMapper.updateById(maintInstance);
if (updateResult > 0) { if (updateResult > 0) {
log.info("保养工单 {} 工作流ID更新成功: {}", businessId, taskId); log.info("保养工单 {} 程实例ID更新成功: {}", businessId, processInstanceId);
} else { } else {
log.error("保养工单 {} 工作流ID更新失败", businessId); log.error("保养工单 {} 程实例ID更新失败", businessId);
return; return;
} }
} else { } else {
log.error("保养工单 {} 不存在,无法更新工作流ID", businessId); log.error("保养工单 {} 不存在,无法更新程实例ID", businessId);
return; return;
} }

Loading…
Cancel
Save