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)) {
return R.fail();
} else {
// 【关键修复】存储流程实例ID而不是任务ID
Long processInstanceId = result.getProcessInstanceId();
Long taskId = result.getTaskId();
// 【简化方案】异步处理工作流推进,避免死锁
CompletableFuture.runAsync(TtlRunnable.get(() -> {
try {
@ -89,8 +92,8 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
log.info("检查工单异步线程中当前租户ID: {}", TenantHelper.getTenantId());
// 【执行业务】更新检查工单的工作流信息
updateInspectWorkflow(inspectInstanceId, taskId);
// 【关键修复】传递流程实例ID而不是任务ID
updateInspectWorkflow(inspectInstanceId, processInstanceId, taskId);
log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId);
} catch (Exception e) {
@ -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("检查工单启动,自动推进");
@ -244,7 +248,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
RpcContext.getContext().setAttachment("tenantId", currentTenantId);
// 【关键】调用工作流推进
boolean completeResult = remoteWorkflowService.completeTask(completeTask);
boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进");
if (completeResult) {
log.info("检查工单 {} 工作流推进成功", businessId);
} else {

@ -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;
}

@ -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 IDID
* @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;
}

Loading…
Cancel
Save