fix(dms): 修复工作流启动和推进的相关问题

- 润滑工单和保养工单的工作流启动逻辑优化
- 增加对已启动工作流的处理逻辑
- 修复工作流任务完成和推进的问题
- 优化设备 ID 类型,改为 Long 类型
- 新增润滑标准编码字段
- 保养标准编号相关接口定义更新
master
zch 2 weeks ago
parent 9311b5e2ee
commit 8f6249e843

@ -23,7 +23,7 @@ public class DeviceBeen {
* ID machine_id
*/
@TableId("machine_id")
private int deviceId;
private Long deviceId;
/**
* machine_code

@ -66,7 +66,7 @@ public class DmsBillsLubeInstanceMobile implements Serializable {
*/
@ExcelProperty(value = "润滑级别", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "lube_level")
private String lubeLevel;
private Long lubeLevel;
// /**
// * 计划润滑开始时间
@ -97,7 +97,7 @@ public class DmsBillsLubeInstanceMobile implements Serializable {
*/
@ExcelProperty(value = "润滑状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "lube_status")
private String lubeStatus;
private Long lubeStatus;
/**
* 1 0

@ -49,10 +49,10 @@ public class DmsInspectInstanceDetailMobile implements Serializable {
private Long realLineStep;
/**
* ID - machineIdPDAint
* ID - machineIdPDADeviceInspectionDetail
*/
@ExcelProperty(value = "设备ID")
private int deviceId;
private Long deviceId;
/**
* 1 2 3

@ -90,4 +90,9 @@ public class LubricationDetail {
*/
private String lubeOperationDescription;
/**
*
*/
private String lubeStandardCode;
}

@ -2,6 +2,7 @@ package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;

@ -223,6 +223,27 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
if (count==0||count==1){
// 如果没有未完成的检查实例设置状态为3
dmsBillsInspectInstance.setInspectStatus("3");
// 【参考润滑工单】工作流完成处理
Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId();
String businessId = inspectInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) {
// 【关键】设置消息类型为非null的List避免原始错误
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
// 【工作流推进】完成当前活跃任务
boolean taskCompleted = remoteWorkflowService.completeTaskIgnoreAuth(currentActiveTaskId, "巡检工单完成,自动推进");
if (!taskCompleted) {
log.error("巡检工作流完成失败当前活跃任务ID: {}", currentActiveTaskId);
} else {
log.info("巡检工单 {} 工作流完成成功任务ID: {}", inspectInstanceId, currentActiveTaskId);
}
} else {
log.warn("巡检工单 {} 无法获取当前活跃任务ID工作流可能已完成或异常", inspectInstanceId);
}
}else{
// 如果有未完成的检查实例设置状态为2
dmsBillsInspectInstance.setInspectStatus("2");
@ -299,9 +320,9 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
List<DmsInspectInstanceDetailVo> inspectInstanceDetails = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailJoinList(queryInspectInstanceDetail);
// 设置巡检实例详情列表到newestBillsInspectInstance对象中
newestBillsInspectInstance.setDmsInspectInstanceDetailList(inspectInstanceDetails);
// 设置新的巡检编码为计划巡检编码
newestBillsInspectInstance.setBillsInspectCode(newestBillsInspectInstance.getPlanInspectCode());
}
// 设置新的巡检编码为计划巡检编码
newestBillsInspectInstance.setBillsInspectCode(newestBillsInspectInstance.getPlanInspectCode());
// 返回最新的未完成巡检工单
return newestBillsInspectInstance;
}

@ -335,39 +335,83 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
updateInstance.setLubeStatus(DmsConstants.DMS_BILLS_LUBE_INSTANCE_STATUS_LUBING);
updateInstance.setRealBeginTime(currentDate);
// 【工作流启动】创建远程启动流程对象
RemoteStartProcess startProcess = new RemoteStartProcess();
// 设置润滑工作流程代码
startProcess.setFlowCode(DmsConstants.DMS_BILLS_LUBE_INSTANCE_WF_CODE);
// 获取业务ID润滑实例ID
String businessId = dmsBillsLubeInstance.getLubeInstanceId().toString();
// 设置业务ID
startProcess.setBusinessId(businessId);
// 启动工作流程
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 获取任务ID
Long taskId = remoteStartProcessReturn.getTaskId();
// 如果任务ID为空抛出流程启动失败异常
if (StringUtils.isNull(taskId)) {
throw new ServiceException("润滑工作流启动失败");
// 【关键修复】检查工作流是否已经启动
if(StringUtils.isNull(dmsBillsLubeInstance.getWfDefinitionId()))
{
// 【工作流启动】创建远程启动流程对象
RemoteStartProcess startProcess = new RemoteStartProcess();
// 设置润滑工作流程代码
startProcess.setFlowCode(DmsConstants.DMS_BILLS_LUBE_INSTANCE_WF_CODE);
// 获取业务ID润滑实例ID
String businessId = dmsBillsLubeInstance.getLubeInstanceId().toString();
// 设置业务ID
startProcess.setBusinessId(businessId);
// 启动工作流程
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 【关键修复】获取流程实例ID和任务ID
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
Long taskId = remoteStartProcessReturn.getTaskId();
// 如果流程实例ID为空抛出流程启动失败异常
if (StringUtils.isNull(processInstanceId)) {
throw new ServiceException("润滑工作流启动失败");
} else {
// 【关键修复】存储流程实例ID到wfDefinitionId
updateInstance.setWfDefinitionId(processInstanceId);
// 【异步线程上下文传递】解决Sa-Token在异步线程中丢失的问题
// 1. 【捕获Token】: 在主线程中获取当前用户的Token
final String tokenValue = StpUtil.getTokenValue();
// 2. 【异步更新工作流】: 使用TtlRunnable包装异步任务确保ThreadLocal变量传递
CompletableFuture.runAsync(TtlRunnable.get(() -> {
try {
// 3. 【设置上下文】: 在异步线程中恢复Token上下文
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 更新润滑工单的工作流信息并推进工作流
updateLubeWorkFlow(updateInstance, taskId);
} catch (Exception e) {
// 【错误处理】记录异常但不影响主流程
log.error("异步更新润滑工作流失败getBillsLubeCode: {}, 错误: {}",
dmsBillsLubeInstance.getBillsLubeCode(), e.getMessage(), e);
// 可以考虑记录到失败表,后续补偿处理
}
}));
}
} else {
// 【异步线程上下文传递】解决Sa-Token在异步线程中丢失的问题
// 1. 【捕获Token】: 在主线程中获取当前用户的Token
final String tokenValue = StpUtil.getTokenValue();
// 2. 【异步更新工作流】: 使用TtlRunnable包装异步任务确保ThreadLocal变量传递
CompletableFuture.runAsync(TtlRunnable.get(() -> {
try {
// 3. 【设置上下文】: 在异步线程中恢复Token上下文
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 更新润滑工单的工作流信息
updateLubeWorkFlow(updateInstance, taskId);
} catch (Exception e) {
// 【错误处理】记录异常但不影响主流程
log.error("异步更新润滑工作流失败getBillsLubeCode: {}, 错误: {}",
dmsBillsLubeInstance.getBillsLubeCode(), e.getMessage(), e);
// 可以考虑记录到失败表,后续补偿处理
// 【关键修复】工作流已启动根据流程实例ID查询当前活跃任务
Long processInstanceId = dmsBillsLubeInstance.getWfDefinitionId();
log.info("润滑工单 {} 工作流已启动流程实例ID: {},查询当前活跃任务",
dmsBillsLubeInstance.getLubeInstanceId(), processInstanceId);
// 根据流程实例ID获取当前活跃任务ID
Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId);
if (currentActiveTaskId != null) {
log.info("润滑工单 {} 找到当前活跃任务ID: {}",
dmsBillsLubeInstance.getLubeInstanceId(), currentActiveTaskId);
// 直接推进工作流
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId);
remoteCompleteTask.setMessage("润滑开始,推进工作流");
// 设置消息类型为非null的List
List<String> messageTypes = new ArrayList<>();
messageTypes.add("user"); // 用户操作
remoteCompleteTask.setMessageType(messageTypes);
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!taskCompleted) {
log.error("润滑工作流推进失败任务ID: {}", currentActiveTaskId);
} else {
log.info("润滑工单 {} 工作流推进成功", dmsBillsLubeInstance.getLubeInstanceId());
}
}));
} else {
log.warn("润滑工单 {} 无法获取当前活跃任务,流程可能已完成", dmsBillsLubeInstance.getLubeInstanceId());
}
// 更新润滑工单状态
this.updateByBo(updateInstance);
}
// 更新润滑工单明细状态
@ -440,10 +484,14 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
updateInstance.setRealEndTime(currentDate);
// 【工作流完成】完成润滑工作流
Long taskId = dmsBillsLubeInstance.getWfDefinitionId();
if (taskId != null) {
// 【关键修复】不再使用存储的wfDefinitionId那是第一个已完成的任务ID
// 而是根据业务ID动态获取当前活跃的任务ID
String businessId = lubeInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) {
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(taskId);
remoteCompleteTask.setTaskId(currentActiveTaskId); // 使用当前活跃任务ID
remoteCompleteTask.setMessage("润滑工单完成,自动推进");
// 【关键】设置消息类型为非null的List避免原始错误
List<String> messageTypes = new ArrayList<>();
@ -452,8 +500,12 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
// 完成工作流任务
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!taskCompleted) {
log.error("润滑工作流完成失败taskId: {}", taskId);
log.error("润滑工作流完成失败当前活跃任务ID: {}", currentActiveTaskId);
} else {
log.info("润滑工单 {} 工作流完成成功任务ID: {}", lubeInstanceId, currentActiveTaskId);
}
} else {
log.warn("润滑工单 {} 无法获取当前活跃任务ID工作流可能已完成或异常", lubeInstanceId);
}
// 更新润滑工单状态
@ -494,16 +546,15 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
}
/**
*
*
*
* @param updateInstance
* @param taskId ID
* @param updateInstance ID
* @param taskId ID
* @return
*/
private Boolean updateLubeWorkFlow(DmsBillsLubeInstanceBo updateInstance, Long taskId) {
// 【设置工作流任务ID】将工作流任务ID设置到润滑工单中
updateInstance.setWfDefinitionId(taskId);
// 【更新润滑工单信息】保存工作流相关信息
// 【关键修复】不再设置工作流ID因为流程实例ID已经在主方法中设置
// 【更新润滑工单信息】保存工作流相关信息包含流程实例ID
DmsBillsLubeInstanceVo dmsBillsLubeInstanceVo = this.updateByBo(updateInstance);
if (ObjectUtils.isEmpty(dmsBillsLubeInstanceVo)){
// 【更新失败处理】润滑工单更新失败记录错误并返回false

@ -322,46 +322,104 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_MAINTING);
// 设置实际开始保养时间为当前时间
dmsBillsMaintInstance.setRealBeginTime(currentDate);
// FIXME:工作流相关
// 创建远程启动流程对象
RemoteStartProcess startProcess = new RemoteStartProcess();
// 设置流程代码
startProcess.setFlowCode(DmsConstants.DMS_BILLS_MAINT_INSTANCE_WF_CODE);
// 获取业务ID保养实例ID
String businessId = dmsBillsMaintInstance.getMaintInstanceId().toString();
// 设置业务ID
startProcess.setBusinessId(businessId);
// 启动工作流程
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 获取任务ID
Long taskId = remoteStartProcessReturn.getTaskId();
// 如果任务ID为空抛出流程启动失败异常
if (StringUtils.isNull(taskId)) {
throw new ServiceException("流程启动失败");
}else{
// ** 异步线程上下文传递【核心问题】 **
// 在主线程中,用户的登录信息(Token)是存放在一个叫 ThreadLocal 的"线程口袋"里的。
// 当我们使用 CompletableFuture.runAsync() 开启一个异步线程(子线程)时,
// 这个"口袋"里的东西默认是不会被带到子线程去的。
//
// ** 【解决方案】 **
// 1. 【捕获Token】: 在主线程里,我们先用 StpUtil.getTokenValue() 把Token拿出来存好。
final String tokenValue = StpUtil.getTokenValue();
// 2. 【传递与恢复】: 使用 TtlRunnable (TransmittableThreadLocal Runnable) 包装我们的异步任务。
// 它就像一个特殊的"接力棒",能在线程切换时把主线程"口袋"里的东西包括Token传递给子线程。
CompletableFuture.runAsync(TtlRunnable.get(() -> {
try {
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 现在子线程就像登录过一样可以带着Token去调用其他需要权限的服务了。
updateWorkFlow(dmsBillsMaintInstance, taskId);
} catch (Exception e) {
// 简单记录错误,不影响主流程
log.error("异步更新保养工作流失败getBillsMaintCode: {}, 错误: {}",
dmsBillsMaintInstance.getBillsMaintCode(), e.getMessage(), e);
// 可以考虑记录到失败表,后续补偿处理
// 【关键修复】检查工作流是否已经启动 - 先重新查询最新数据
// 重新查询保养实例确保获取到最新的工作流ID避免使用缓存中的旧数据
DmsBillsMaintInstance latestInstance = baseMapper.selectById(dmsBillsMaintInstance.getMaintInstanceId());
if (latestInstance != null && latestInstance.getWfDefinitionId() == null) {
// 【工作流启动】创建远程启动流程对象
RemoteStartProcess startProcess = new RemoteStartProcess();
// 设置流程代码
startProcess.setFlowCode(DmsConstants.DMS_BILLS_MAINT_INSTANCE_WF_CODE);
// 获取业务ID保养实例ID
String businessId = dmsBillsMaintInstance.getMaintInstanceId().toString();
// 设置业务ID
startProcess.setBusinessId(businessId);
try {
// 启动工作流程
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 【关键修复】获取流程实例ID和任务ID
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
Long taskId = remoteStartProcessReturn.getTaskId();
// 如果流程实例ID为空抛出流程启动失败异常
if (processInstanceId == null) {
throw new ServiceException("保养工作流启动失败");
} else {
// 【关键修复】存储流程实例ID到wfDefinitionId
dmsBillsMaintInstance.setWfDefinitionId(processInstanceId);
// ** 异步线程上下文传递【核心问题】 **
// 1. 【捕获Token】: 在主线程里,我们先用 StpUtil.getTokenValue() 把Token拿出来存好。
final String tokenValue = StpUtil.getTokenValue();
// 2. 【传递与恢复】: 使用 TtlRunnable 包装我们的异步任务。
CompletableFuture.runAsync(TtlRunnable.get(() -> {
try {
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 现在子线程就像登录过一样可以带着Token去调用其他需要权限的服务了。
updateWorkFlow(dmsBillsMaintInstance, taskId);
} catch (Exception e) {
// 简单记录错误,不影响主流程
log.error("异步更新保养工作流失败getBillsMaintCode: {}, 错误: {}",
dmsBillsMaintInstance.getBillsMaintCode(), e.getMessage(), e);
// 可以考虑记录到失败表,后续补偿处理
}
}));
}
} catch (Exception e) {
// 【关键修复】捕获工作流启动异常,避免重复启动导致的错误
if (e.getMessage() != null && e.getMessage().contains("该单据已提交过申请")) {
log.warn("保养工单 {} 工作流已存在,跳过启动: {}", dmsBillsMaintInstance.getMaintInstanceId(), e.getMessage());
// 重新查询获取工作流ID
DmsBillsMaintInstance updatedInstance = baseMapper.selectById(dmsBillsMaintInstance.getMaintInstanceId());
if (updatedInstance != null && updatedInstance.getWfDefinitionId() != null) {
dmsBillsMaintInstance.setWfDefinitionId(updatedInstance.getWfDefinitionId());
}
} else {
log.error("保养工单 {} 工作流启动失败: {}", dmsBillsMaintInstance.getMaintInstanceId(), e.getMessage());
throw new ServiceException("保养工作流启动失败: " + e.getMessage());
}
}));
}
} else if (latestInstance != null) {
// 【关键修复】工作流已启动根据流程实例ID查询当前活跃任务
// 使用最新查询到的工作流ID
Long processInstanceId = latestInstance.getWfDefinitionId();
dmsBillsMaintInstance.setWfDefinitionId(processInstanceId); // 同步更新到当前对象
log.info("保养工单 {} 工作流已启动流程实例ID: {},查询当前活跃任务",
dmsBillsMaintInstance.getMaintInstanceId(), processInstanceId);
// 根据流程实例ID获取当前活跃任务ID
Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId);
if (currentActiveTaskId != null) {
log.info("保养工单 {} 找到当前活跃任务ID: {}",
dmsBillsMaintInstance.getMaintInstanceId(), currentActiveTaskId);
// 直接推进工作流
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId);
remoteCompleteTask.setMessage("保养开始,推进工作流");
// 设置消息类型为非null的List
List<String> messageTypes = new ArrayList<>();
messageTypes.add("user"); // 用户操作
remoteCompleteTask.setMessageType(messageTypes);
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!taskCompleted) {
log.error("保养工作流推进失败任务ID: {}", currentActiveTaskId);
} else {
log.info("保养工单 {} 工作流推进成功", dmsBillsMaintInstance.getMaintInstanceId());
}
} else {
log.warn("保养工单 {} 无法获取当前活跃任务,流程可能已完成", dmsBillsMaintInstance.getMaintInstanceId());
}
} else {
log.error("保养工单 {} 不存在,无法处理工作流", dmsBillsMaintInstance.getMaintInstanceId());
}
// 设置保养明细的实际开始时间为当前时间
@ -409,23 +467,35 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
return dmsBillsMaintDetail;
}
/**
*
*
* @param dmsBillsMaintInstance ID
* @param taskId ID
* @return
*/
private Boolean updateWorkFlow(DmsBillsMaintInstance dmsBillsMaintInstance, Long taskId){
// 设置工作流定义ID
dmsBillsMaintInstance.setWfDefinitionId(taskId);
// 重新设置实际开始时间为当前时间(可能已变化)
// 【关键修复】不再设置工作流ID因为流程实例ID已经在主方法中设置
// 【更新保养工单信息】保存实际开始时间
dmsBillsMaintInstance.setRealBeginTime(new Date());
// FIXME:完成第一步,待测试待完善
// 创建远程完成任务对象
int updateResult = baseMapper.updateById(dmsBillsMaintInstance);
if (updateResult <= 0) {
log.error("保养工单工作流信息更新失败maintInstanceId: {}", dmsBillsMaintInstance.getMaintInstanceId());
return false;
}
// 【自动推进工作流】完成第一步任务,推进到下一步
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
// 设置任务ID
remoteCompleteTask.setTaskId(taskId);
// 设置完成后的消息
remoteCompleteTask.setMessage("自动推进");
// 关键设置messageType为非null的List解决原始错误)
// 设置完成消息
remoteCompleteTask.setMessage("保养工单启动,自动推进");
// 【关键】设置消息类型为非null的List避免原始错误)
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
remoteCompleteTask.setMessageType(messageTypes);
// 完成该任务
// 【执行任务完成】推进工作流到下一步
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!b){
return false;
@ -489,14 +559,30 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
// 设置实际结束时间为当前时间
dmsBillsMaintInstance.setRealEndTime(currentDate);
//FIXME:工作流相关
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(dmsBillsMaintInstance.getWfDefinitionId());
remoteCompleteTask.setMessage("自动推进");
List<String> messageTypes = new ArrayList<>() ;
messageTypes.add("system");
remoteCompleteTask.setMessageType(messageTypes);
remoteWorkflowService.completeTask(remoteCompleteTask);
// 【工作流完成】完成保养工作流
// 【关键修复】不再使用存储的wfDefinitionId那是流程实例ID
// 而是根据业务ID动态获取当前活跃的任务ID
String businessId = maintInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) {
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId); // 使用当前活跃任务ID
remoteCompleteTask.setMessage("保养工单完成,自动推进");
// 【关键】设置消息类型为非null的List避免原始错误
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
remoteCompleteTask.setMessageType(messageTypes);
// 完成工作流任务
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!taskCompleted) {
log.error("保养工作流完成失败当前活跃任务ID: {}", currentActiveTaskId);
} else {
log.info("保养工单 {} 工作流完成成功任务ID: {}", maintInstanceId, currentActiveTaskId);
}
} else {
log.warn("保养工单 {} 无法获取当前活跃任务ID工作流可能已完成或异常", maintInstanceId);
}
// 更新保养实例信息
baseMapper.updateById(dmsBillsMaintInstance);

Loading…
Cancel
Save