diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java index 0f1f2bd..ba7e275 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java @@ -24,7 +24,7 @@ import org.dromara.workflow.api.RemoteWorkflowService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; - +import io.seata.spring.annotation.GlobalTransactional; import java.math.BigDecimal; import java.util.*; @@ -223,17 +223,17 @@ 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 messageTypes = new ArrayList<>(); messageTypes.add("system"); // 系统消息 - + // 【工作流推进】完成当前活跃任务 boolean taskCompleted = remoteWorkflowService.completeTaskIgnoreAuth(currentActiveTaskId, "巡检工单完成,自动推进"); if (!taskCompleted) { @@ -330,11 +330,13 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta /** * 扫描设备验证并获取巡检项目信息 + * 【参考开始保养】完善工作流启动和推进逻辑 * * @param dmsBillsInspectInstanceScan * @return */ @Override + @GlobalTransactional(rollbackFor = Exception.class) public DmsInspectInstanceDetailVo scanInspectInstanceDetail(DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { // 根据检查实例ID和设备编码查询检查工单详细信息 DmsInspectInstanceDetailVo dmsInspectInstanceDetail = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailByUI(dmsBillsInspectInstanceScan.getInspectInstanceId(), @@ -343,6 +345,131 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta if (dmsInspectInstanceDetail == null) { 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 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 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 Long deviceId = dmsInspectInstanceDetail.getMachineId(); // 创建查询检查实例详细项目的参数对象 @@ -360,30 +487,18 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta // 将查询结果设置到检查工单详情对象中 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; - } /** * 更新点巡检工单明细项目信息 + * 【参考完成保养】添加工作流完成逻辑 * * @param dmsInspectInstanceDetail 点巡检工单明细 * @return 处理后的点巡检工单明细,包含更新后的状态信息 */ + @GlobalTransactional(rollbackFor = Exception.class) private DmsInspectInstanceDetailBo handleDmsInspectInstanceDetailProject(DmsInspectInstanceDetailBo dmsInspectInstanceDetail) { // 【初始化状态】默认设置为完成状态和通过状态 String instanceDetailStatus = DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH; @@ -451,6 +566,72 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta 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 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 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.setInstanceDetailStatus(instanceDetailStatus);