feat(dms): 完善巡检工单工作流逻辑

- 添加巡检工单开始和完成的完整工作流处理逻辑
- 实现巡检工单状态的自动更新
- 优化工作流启动和推进的异常处理
- 增加日志记录,提高系统可监控性
master
zangchenhao 1 week ago
parent 640ab25e5e
commit c775d29452

@ -24,7 +24,7 @@ import org.dromara.workflow.api.RemoteWorkflowService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import io.seata.spring.annotation.GlobalTransactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
@ -223,17 +223,17 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
if (count==0||count==1){ if (count==0||count==1){
// 如果没有未完成的检查实例设置状态为3 // 如果没有未完成的检查实例设置状态为3
dmsBillsInspectInstance.setInspectStatus("3"); dmsBillsInspectInstance.setInspectStatus("3");
// 【参考润滑工单】工作流完成处理 // 【参考润滑工单】工作流完成处理
Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId(); Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId();
String businessId = inspectInstanceId.toString(); String businessId = inspectInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId); Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) { if (currentActiveTaskId != null) {
// 【关键】设置消息类型为非null的List避免原始错误 // 【关键】设置消息类型为非null的List避免原始错误
List<String> messageTypes = new ArrayList<>(); List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息 messageTypes.add("system"); // 系统消息
// 【工作流推进】完成当前活跃任务 // 【工作流推进】完成当前活跃任务
boolean taskCompleted = remoteWorkflowService.completeTaskIgnoreAuth(currentActiveTaskId, "巡检工单完成,自动推进"); boolean taskCompleted = remoteWorkflowService.completeTaskIgnoreAuth(currentActiveTaskId, "巡检工单完成,自动推进");
if (!taskCompleted) { if (!taskCompleted) {
@ -330,11 +330,13 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
/** /**
* *
*
* *
* @param dmsBillsInspectInstanceScan * @param dmsBillsInspectInstanceScan
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public DmsInspectInstanceDetailVo scanInspectInstanceDetail(DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { public DmsInspectInstanceDetailVo scanInspectInstanceDetail(DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) {
// 根据检查实例ID和设备编码查询检查工单详细信息 // 根据检查实例ID和设备编码查询检查工单详细信息
DmsInspectInstanceDetailVo dmsInspectInstanceDetail = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailByUI(dmsBillsInspectInstanceScan.getInspectInstanceId(), DmsInspectInstanceDetailVo dmsInspectInstanceDetail = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailByUI(dmsBillsInspectInstanceScan.getInspectInstanceId(),
@ -343,6 +345,131 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
if (dmsInspectInstanceDetail == null) { if (dmsInspectInstanceDetail == null) {
throw new ServiceException("无此设备的检查工单"); throw new ServiceException("无此设备的检查工单");
} }
// 【参考开始保养】查询巡检工单实例信息
DmsBillsInspectInstance inspectInstance = baseMapper.selectById(dmsBillsInspectInstanceScan.getInspectInstanceId());
if (inspectInstance == null) {
throw new ServiceException("巡检工单不存在");
}
// 【参考开始保养】获取当前巡检状态
String inspectStatus = inspectInstance.getInspectStatus() == null ?
DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT : inspectInstance.getInspectStatus();
// 【参考开始保养】如果巡检状态为已完成,抛出异常
if (inspectStatus.equals(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_FINISH)) {
throw new ServiceException("已经巡检完成");
}
// 获取当前日期时间
Date currentDate = new Date();
// 【参考开始保养】如果巡检状态为待巡检,进行工作流启动处理
if (inspectStatus.equals(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT)) {
// 设置巡检状态为巡检中
inspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_INSPECTING);
// 设置实际开始巡检时间为当前时间
inspectInstance.setRealBeginTime(currentDate);
// 【参考开始保养】检查工作流是否已经启动
DmsBillsInspectInstance latestInstance = baseMapper.selectById(inspectInstance.getInspectInstanceId());
if (latestInstance != null && latestInstance.getWfDefinitionId() == null) {
// 【参考开始保养】工作流未启动,需要启动
try {
// 创建远程启动流程对象
org.dromara.workflow.api.domain.RemoteStartProcess startProcess = new org.dromara.workflow.api.domain.RemoteStartProcess();
// 设置流程代码(需要根据实际的巡检工作流代码设置)
startProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE);
// 获取业务ID巡检实例ID
String businessId = inspectInstance.getInspectInstanceId().toString();
startProcess.setBusinessId(businessId);
// 启动工作流程
org.dromara.workflow.api.domain.RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 获取流程实例ID和任务ID
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
Long taskId = remoteStartProcessReturn.getTaskId();
if (processInstanceId == null) {
throw new ServiceException("巡检工作流启动失败");
} else {
// 存储流程实例ID
inspectInstance.setWfDefinitionId(processInstanceId);
// 【参考开始保养】异步推进工作流
if (taskId != null) {
// 自动推进工作流
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.RemoteCompleteTask();
remoteCompleteTask.setTaskId(taskId);
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: {}", taskId);
} else {
log.info("巡检工单 {} 工作流推进成功", inspectInstance.getInspectInstanceId());
}
}
}
} catch (Exception e) {
// 【参考开始保养】捕获工作流启动异常
if (e.getMessage() != null && e.getMessage().contains("该单据已提交过申请")) {
log.warn("巡检工单 {} 工作流已存在,跳过启动: {}", inspectInstance.getInspectInstanceId(), e.getMessage());
// 重新查询获取工作流ID
DmsBillsInspectInstance updatedInstance = baseMapper.selectById(inspectInstance.getInspectInstanceId());
if (updatedInstance != null && updatedInstance.getWfDefinitionId() != null) {
inspectInstance.setWfDefinitionId(updatedInstance.getWfDefinitionId());
}
} else {
log.error("巡检工单 {} 工作流启动失败: {}", inspectInstance.getInspectInstanceId(), e.getMessage());
throw new ServiceException("巡检工作流启动失败: " + e.getMessage());
}
}
} else if (latestInstance != null && latestInstance.getWfDefinitionId() != null) {
// 【参考开始保养】工作流已启动,推进当前活跃任务
Long processInstanceId = latestInstance.getWfDefinitionId();
inspectInstance.setWfDefinitionId(processInstanceId);
log.info("巡检工单 {} 工作流已启动流程实例ID: {},查询当前活跃任务",
inspectInstance.getInspectInstanceId(), processInstanceId);
// 根据流程实例ID获取当前活跃任务ID
Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId);
if (currentActiveTaskId != null) {
log.info("巡检工单 {} 找到当前活跃任务ID: {}",
inspectInstance.getInspectInstanceId(), currentActiveTaskId);
// 直接推进工作流
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.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("巡检工单 {} 工作流推进成功", inspectInstance.getInspectInstanceId());
}
} else {
log.warn("巡检工单 {} 无法获取当前活跃任务,流程可能已完成", inspectInstance.getInspectInstanceId());
}
}
// 更新巡检实例信息
baseMapper.updateById(inspectInstance);
}
// 获取设备ID // 获取设备ID
Long deviceId = dmsInspectInstanceDetail.getMachineId(); Long deviceId = dmsInspectInstanceDetail.getMachineId();
// 创建查询检查实例详细项目的参数对象 // 创建查询检查实例详细项目的参数对象
@ -360,30 +487,18 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
// 将查询结果设置到检查工单详情对象中 // 将查询结果设置到检查工单详情对象中
dmsInspectInstanceDetail.setDmsInspectInstanceDetailProjectList(dmsInspectInstanceDetailProjects); dmsInspectInstanceDetail.setDmsInspectInstanceDetailProjectList(dmsInspectInstanceDetailProjects);
// 更新检查工单的开始时间
DmsBillsInspectInstanceBo dmsBillsInspectInstance = new DmsBillsInspectInstanceBo();
// 设置检查实例ID
dmsBillsInspectInstance.setInspectInstanceId(dmsBillsInspectInstanceScan.getInspectInstanceId());
// 设置实际开始时间为当前时间
dmsBillsInspectInstance.setRealBeginTime(new Date());
// dmsBillsInspectInstance.setInspectStatus("2");
// FIXME: 梳理流程,完善更新方法
// int i = dmsBillsInspectInstanceMapper.updateDmsBillsInspectInstance(dmsBillsInspectInstance);
// 使用BO更新检查实例信息
this.updateByBo(dmsBillsInspectInstance);
// 返回检查实例详情对象 // 返回检查实例详情对象
return dmsInspectInstanceDetail; return dmsInspectInstanceDetail;
} }
/** /**
* *
*
* *
* @param dmsInspectInstanceDetail * @param dmsInspectInstanceDetail
* @return * @return
*/ */
@GlobalTransactional(rollbackFor = Exception.class)
private DmsInspectInstanceDetailBo handleDmsInspectInstanceDetailProject(DmsInspectInstanceDetailBo dmsInspectInstanceDetail) { private DmsInspectInstanceDetailBo handleDmsInspectInstanceDetailProject(DmsInspectInstanceDetailBo dmsInspectInstanceDetail) {
// 【初始化状态】默认设置为完成状态和通过状态 // 【初始化状态】默认设置为完成状态和通过状态
String instanceDetailStatus = DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH; String instanceDetailStatus = DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH;
@ -451,6 +566,72 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
toUpdatedList.add(inspectInstanceDetailProject); toUpdatedList.add(inspectInstanceDetailProject);
} }
// 【参考完成保养】如果当前明细已完成,检查是否需要完成整个巡检工单
if (instanceDetailStatus.equals(DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH)) {
Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId();
// 【参考完成保养】查询所有明细的完成情况
try {
// 查询同一巡检工单下的所有明细
DmsInspectInstanceDetailBo queryDetail = new DmsInspectInstanceDetailBo();
queryDetail.setInspectInstanceId(inspectInstanceId);
// 这里需要查询所有明细的状态,判断是否全部完成
// 注意:需要排除当前正在处理的明细
List<DmsInspectInstanceDetailVo> allDetails = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailJoinList(queryDetail);
// 统计未完成的明细数量(排除当前处理的明细)
long incompleteCount = allDetails.stream()
.filter(detail -> !detail.getInstanceDetailId().equals(dmsInspectInstanceDetail.getInstanceDetailId()))
.filter(detail -> detail.getInstanceDetailStatus() == null
|| !detail.getInstanceDetailStatus().equals(DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH))
.count();
// 【参考完成保养】如果所有明细都已完成,完成工作流
if (incompleteCount == 0) {
log.info("巡检工单 {} 所有明细已完成,开始完成工作流", inspectInstanceId);
// 【参考完成保养】完成巡检工作流
String businessId = inspectInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) {
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId);
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: {}", inspectInstanceId, currentActiveTaskId);
// 【参考完成保养】更新巡检工单主表状态为已完成
DmsBillsInspectInstance inspectInstance = baseMapper.selectById(inspectInstanceId);
if (inspectInstance != null) {
inspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_FINISH);
inspectInstance.setRealEndTime(new Date());
baseMapper.updateById(inspectInstance);
log.info("巡检工单 {} 状态已更新为完成", inspectInstanceId);
}
}
} else {
log.warn("巡检工单 {} 无法获取当前活跃任务ID工作流可能已完成或异常", inspectInstanceId);
}
} else {
log.info("巡检工单 {} 还有 {} 个明细未完成,暂不完成工作流", inspectInstanceId, incompleteCount);
}
} catch (Exception e) {
log.error("检查巡检工单完成状态时发生异常: {}", e.getMessage(), e);
// 不影响主流程,继续执行
}
}
// 【设置返回结果】设置处理后的状态和项目列表 // 【设置返回结果】设置处理后的状态和项目列表
returnInspectInstanceDetail.setInspectStatus(inspectStatus); returnInspectInstanceDetail.setInspectStatus(inspectStatus);
returnInspectInstanceDetail.setInstanceDetailStatus(instanceDetailStatus); returnInspectInstanceDetail.setInstanceDetailStatus(instanceDetailStatus);

Loading…
Cancel
Save