diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsMobileController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsMobileController.java index d20dbe6..14f12d7 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsMobileController.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsMobileController.java @@ -100,7 +100,7 @@ public class DmsMobileController extends BaseController { // 设置审批状态字段,确保PDA端能获取到审批信息 mobileInstance.setApproveStatus(voInstance.getApproveStatus()); - + // 【修复】设置设备编码标签字段,用于PDA端验证扫描设备编码 // 该字段用于PDA端startRepair方法中验证扫描的设备编码与工单中的设备编码是否一致 mobileInstance.setDeviceCodeTag(voInstance.getMachineCode()); @@ -122,7 +122,7 @@ public class DmsMobileController extends BaseController { mobileInstance.setMachineId(String.valueOf(voInstance.getMachineId())); mobileInstance.setDeviceId(String.valueOf(voInstance.getMachineId())); } - + // 【关键修复】处理外协单位ID转换:Long outsourcingId -> int outsrcId if (voInstance.getOutsourcingId() != null) { try { @@ -146,7 +146,7 @@ public class DmsMobileController extends BaseController { } } mobileInstance.setRepairType(String.valueOf(repairTypeInt)); - + // 【关键修复】根据维修类型设置单选按钮状态(模拟PDA端的repairTypeSelect逻辑) if (repairTypeInt == 1) { // 内部维修 @@ -456,14 +456,24 @@ public class DmsMobileController extends BaseController { public AjaxResult getBillsFaultInstance4Repair(@PathVariable("repairInstanceId") Long repairInstanceId) { // DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.queryById(repairInstanceId); DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId); + + // 【调试日志】输出查询结果 + log.info("PDA获取工单详情,repairInstanceId: {}, outsourcingId: {}", + repairInstanceId, billsFaultInstance.getOutsourcingId()); + // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); billsFaultInstance.setDeviceCode(mobileInstance.getMachineCode()); + billsFaultInstance.setDeviceId(Integer.parseInt(mobileInstance.getMachineId())); billsFaultInstance.setDeviceName(mobileInstance.getMachineName()); billsFaultInstance.setDeviceLocation(mobileInstance.getMachineLocation()); billsFaultInstance.setDeviceSpec(mobileInstance.getMachineSpec()); // 手动格式化时间字段,确保PDA客户端兼容性 formatTimeFields(mobileInstance, billsFaultInstance); + + // 【调试日志】输出转换后的结果 + log.info("PDA转换后结果,outsrcId: {}", mobileInstance.getOutsrcId()); + return AjaxResult.success(mobileInstance); } @@ -532,22 +542,16 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.COMPLETE) @PostMapping("/completeRepair") @RepeatSubmit - public AjaxResult completeRepair(@RequestParam("dmsFaultInstanceActivity") String activityJson, + public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, @RequestParam(value = "files", required = false) List files) throws JsonProcessingException { try { - - // 预处理 "amount" 字段 - String processedJson = preprocessAmountFields(activityJson); - - ObjectMapper objectMapper = new ObjectMapper(); - // 【修复】 忽略未知字段,增强兼容性 - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - DmsFaultInstanceActivityBo dmsFaultInstanceActivity = objectMapper.readValue(processedJson, DmsFaultInstanceActivityBo.class); - // 注意:这里不再设置repairConfirm,因为在Service层会自动设置为0(待确认) dmsFaultInstanceActivity.setConfirmTime(new Date()); String parts1 = dmsFaultInstanceActivity.getParts1(); - + ObjectMapper objectMapper = new ObjectMapper(); + // 忽略未知字段,增强兼容性 + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // 由于PDA端传递的parts1是一个JSON字符串,这里需要特殊处理 if (parts1 != null && !parts1.isEmpty()) { // 预处理 "amount" 字段 @@ -556,17 +560,12 @@ public class DmsMobileController extends BaseController { }); dmsFaultInstanceActivity.setParts(parts2); } - - List fileUrls = handleFileUploads(files); - dmsFaultInstanceActivity.setFileUrls(fileUrls); - int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity); + + int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity, files); return AjaxResult.success(i); } catch (ServiceException e) { log.error("完成维修失败:{}", e.getMessage()); return AjaxResult.error(e.getMessage()); - } catch (Exception e) { - log.error("数据处理失败:{}", e.getMessage()); - return AjaxResult.error("数据处理失败:" + e.getMessage()); } } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultComponentsParts.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultComponentsParts.java index 67d6581..6d87c1f 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultComponentsParts.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultComponentsParts.java @@ -14,9 +14,9 @@ import java.io.Serial; * @date 2025-04-07 */ @Data -@EqualsAndHashCode(callSuper = true) +@EqualsAndHashCode @TableName("dms_fault_components_parts") -public class DmsFaultComponentsParts extends TenantEntity { +public class DmsFaultComponentsParts { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultInstanceActivity.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultInstanceActivity.java index 4c6a676..f4bea90 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultInstanceActivity.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsFaultInstanceActivity.java @@ -30,7 +30,7 @@ public class DmsFaultInstanceActivity extends TenantEntity { /** * 维修工单实例节点ID */ - @TableId(value = "instance_activity_id") + @TableId(value = "instance_activity_id",type = IdType.ASSIGN_ID) private Long instanceActivityId; /** diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsBillsFaultInstanceBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsBillsFaultInstanceBo.java index 62be1d3..4b56d97 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsBillsFaultInstanceBo.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsBillsFaultInstanceBo.java @@ -1,5 +1,6 @@ package org.dromara.dms.domain.bo; +import com.baomidou.mybatisplus.annotation.TableField; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -8,6 +9,8 @@ import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.dms.domain.DmsBillsFaultInstance; +import org.dromara.dms.domain.DmsFaultComponentsParts; +import org.dromara.dms.domain.DmsInstanceFile; import java.util.Date; import java.util.List; @@ -121,6 +124,10 @@ public class DmsBillsFaultInstanceBo extends BaseEntity { */ private Long outsourcingId; + /** + * 外协ID(PDA端传递的int类型,需要转换为outsourcingId) + */ + private Integer outsrcId; /** * 设备ID,映射到数据库的 machine_id 字段 @@ -158,4 +165,81 @@ public class DmsBillsFaultInstanceBo extends BaseEntity { * 注意:数据库中是 String 类型,这里是 int 类型,可能需要转换 */ private int deviceStatus;//DeviceBeen映射 + + + private String machineCode;//JOIN + + private String machineName;//JOIN + + private String machineLocation;//JOIN + + private String machineSpec;//JOIN + + private String imgUrl;//JOIN + + private Long instanceActivityId;//JOIN + + private String faultType;//JOIN + + private String faultDescription;//JOIN + + private String designOperations;//JOIN + + + + private String repairType;//JOIN + + /** + * 外协单位,关联dms_base_outsourcing_info的outsourcing_id;最后一步自动复制第1步的,可在第2步修改,修改保存后为第2步的记录,第1步为要求的,第2步为实际的 + */ + + + private String processHandleResolution;//JOIN + + + // private List sysFiles; + + private List dmsInstanceFiles;//JOIN + + private List dmsInstanceFiles1;//JOIN + + private String checkedFault;//JOIN + + private String repairContent;//JOIN + + private String protectedMethod;//JOIN + + private String repairer;//JOIN + + private Date confirmTime;//JOIN + + private Long componentsPartsId;//JOIN + + private List parts;//JOIN + + /** + * 故障文件地址,一般是图片 + */ + + private String filePath;//join + + /** + * 零部件名称 + */ + + private String partName;//JOIN + + /** + * 零部件规格 + */ + + private String partSpecifications;//JOIN + + /** + * 数量 + */ + + private Long amount;//JOIN + + } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsFaultInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsFaultInstanceServiceImpl.java index 15fadd8..25a43c4 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsFaultInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsFaultInstanceServiceImpl.java @@ -46,6 +46,8 @@ import cn.dev33.satoken.stp.StpUtil; import java.util.*; import java.util.concurrent.CompletableFuture; +import org.springframework.web.multipart.MultipartFile; +import org.dromara.dms.mapper.DmsFaultComponentsPartsMapper; /** * 故障报修工单Service业务层处理 @@ -75,6 +77,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS @DubboReference(timeout = 15000, retries = 1) private final RemoteFileService remoteFileService; + private final DmsFaultComponentsPartsMapper dmsFaultComponentsPartsMapper; + /** * 查询故障报修工单 * @@ -176,6 +180,12 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS @GlobalTransactional(rollbackFor = Exception.class) public Boolean insertByBo(DmsBillsFaultInstanceBo bo) { bo.setMachineId((long) bo.getDeviceId()); + + // 【关键修复】处理PDA端outsrcId到outsourcingId的转换 + if (bo.getOutsrcId() != null && bo.getOutsrcId() > 0) { + bo.setOutsourcingId(Long.valueOf(bo.getOutsrcId())); + } + DmsBillsFaultInstance add = MapstructUtils.convert(bo, DmsBillsFaultInstance.class); validEntityBeforeSave(add); // 获取当前日期时间 @@ -222,10 +232,10 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS try { // 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。 StpUtil.setTokenValue(tokenValue); - + // 4. 【延迟执行】: 稍微延迟,确保主事务完全提交 Thread.sleep(100); - + // 5. 【重试机制】: 最多重试3次,每次间隔递增 int maxRetries = 3; for (int i = 0; i < maxRetries; i++) { @@ -235,9 +245,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS log.info("异步工作流推进成功,repairInstanceId: {}, 重试次数: {}", add.getRepairInstanceId(), i); break; // 成功则退出重试循环 } catch (Exception retryException) { - log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}", + log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}", add.getRepairInstanceId(), i + 1, maxRetries, retryException.getMessage()); - + if (i == maxRetries - 1) { // 最后一次重试失败,记录错误 log.error("异步工作流推进最终失败,repairInstanceId: {}, 请手动处理", add.getRepairInstanceId(), retryException); @@ -253,7 +263,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS } })); - // 创建故障实例活动对象 + // 【重要修改】创建故障实例活动对象 - 只有PDA创建工单时才生成 DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); // 设置维修实例ID dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId()); @@ -269,9 +279,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsFaultInstanceActivity.setMachineId(add.getMachineId()); // 设置维修类型 dmsFaultInstanceActivity.setRepairType(add.getRepairType()); - // 如果外部资源ID不为空,则设置外部资源ID - if (add.getOutsourcingId() != null) { - dmsFaultInstanceActivity.setOutsourcingId(add.getOutsourcingId()); + // 【关键修复】如果外部资源ID不为空,则设置外部资源ID + if (bo.getOutsourcingId() != null) { + dmsFaultInstanceActivity.setOutsourcingId(bo.getOutsourcingId()); } // 设置处理状态为待审批 dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK); @@ -281,7 +291,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsFaultInstanceActivityMapper.insert(dmsFaultInstanceActivity); //存储图片 // 获取文件URL列表 - List fileUrls = add.getFileUrls(); + List fileUrls = bo.getFileUrls(); // 批量插入实例文件记录 batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId()); return flag; @@ -311,7 +321,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 更新审批状态和工单状态 workOrder.setApproveStatus(approveStatus); - + if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) { // 审批通过:保持待维修状态 workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR); @@ -322,7 +332,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 先更新工单状态,确保业务数据一致性 boolean updateResult = baseMapper.updateById(workOrder) > 0; - + if (!updateResult) { throw new ServiceException("工单状态更新失败"); } @@ -336,30 +346,30 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(currentTaskId); remoteCompleteTask.setMessage(message != null ? message : "审批完成"); - + // 设置消息类型 List messageTypes = new ArrayList<>(); messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); - + // 设置消息通知内容 if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) { remoteCompleteTask.setNotice("故障报修工单审批通过,请及时处理,工单编号:" + workOrder.getBillsFaultCode()); } else { remoteCompleteTask.setNotice("故障报修工单审批被拒绝,工单编号:" + workOrder.getBillsFaultCode()); } - + // 设置工作流变量 - approveStatus用于互斥网关判断 Map variables = new HashMap<>(); variables.put("approveStatus", approveStatus); variables.put("businessId", repairInstanceId.toString()); - + remoteCompleteTask.setVariables(variables); - + // 推进工作流 boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask); if (!workflowResult) { - log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, approveStatus: {}", + log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, approveStatus: {}", repairInstanceId, approveStatus); // 工作流推进失败不影响业务操作的成功 } else { @@ -443,6 +453,14 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsFaultInstanceActivity.setHandleBy(userName); dmsFaultInstanceActivity.setHandleTime(currentDate); + // 【调试日志】打印传入的活动ID,以确认问题根源 + log.info("调用startRepair时,从控制器传入的instanceActivityId为: {}", dmsFaultInstanceActivity.getInstanceActivityId()); + + // 【关键修复】在插入新的活动记录前,必须将ID设置为空。 + // 这是因为传入的dmsFaultInstanceActivity对象可能包含了由PDA端getBillsFaultInstance4Repair接口返回的 + // 第一个活动节点(process_step_order=1)的ID。如果不清空,MyBatis会尝试使用这个旧ID插入新记录, + // 如果instance_activity_id不是主键或唯一键,就会导致数据重复;如果是,则会抛出主键冲突异常。 + dmsFaultInstanceActivity.setInstanceActivityId(null); // 插入新的故障实例活动记录 boolean result = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity); @@ -457,43 +475,55 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS */ @Override @GlobalTransactional(rollbackFor = Exception.class) - public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { - // 批量插入实例的附件文件信息 - batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(), dmsFaultInstanceActivity.getInstanceActivityId()); - - // 获取需要插入的备件列表 + public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, List files) { + // 更新 dms_fault_instance_activity 表 + DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity(); + activity.setInstanceActivityId(dmsFaultInstanceActivity.getInstanceActivityId()); + activity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH); + activity.setEndTime(new Date()); + activity.setRepairer(LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname()); + dmsFaultInstanceActivityMapper.updateById(activity); + + // 批量保存处理的零部件 List parts = dmsFaultInstanceActivity.getParts(); - if (!CollectionUtils.isEmpty(parts)) { - for (DmsFaultComponentsParts part : parts) { - part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId()); + if (parts != null && !parts.isEmpty()) { + parts.forEach(part -> { + part.setRepairInstanceId(dmsFaultInstanceActivity.getRepairInstanceId()); + dmsFaultComponentsPartsMapper.insert(part); + }); + } + + // 处理文件上传 + if (files != null && !files.isEmpty()) { + List fileList = new ArrayList<>(); + for (MultipartFile file : files) { + try { + RemoteFile remoteFile = remoteFileService.upload(file.getName(), file.getOriginalFilename(), file.getContentType(), file.getBytes()); + DmsInstanceFile instanceFile = new DmsInstanceFile(); + instanceFile.setTargetId(dmsFaultInstanceActivity.getInstanceActivityId()); + instanceFile.setFilePath(remoteFile.getUrl()); + instanceFile.setTargetType("1"); // 维修完成图片 + fileList.add(instanceFile); + dmsInstanceFileMapper.insert(instanceFile); + } catch (Exception e) { + throw new ServiceException("文件上传失败"); + } } - dmsFaultInstanceActivityMapper.insertParts(parts); } - // 根据维修实例ID查询对应的工单实例 - DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId()); - if (dmsBillsFaultInstance == null) { - throw new ServiceException("工单不存在"); + // 更新 dms_bills_fault_instance 表 + DmsBillsFaultInstance instance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId()); + if (instance == null) { + throw new ServiceException("工单不存在: " + dmsFaultInstanceActivity.getRepairInstanceId()); } - - // 检查工单状态 - String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); - if (!dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING)) { - throw new ServiceException("工单状态不允许完成维修,请先开始维修"); - } - - // 获取当前日期和时间 - Date currentDate = new Date(); - String userName = LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname(); - - // 设置工单状态为维修完成,确认状态为待确认 - dmsBillsFaultInstance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH); - dmsBillsFaultInstance.setRealEndTime(currentDate); - dmsBillsFaultInstance.setRepairConfirm("0"); // 设置为待确认状态 + instance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH); + instance.setRealEndTime(new Date()); + instance.setRepairConfirm("0"); // 设置为待确认状态 + baseMapper.updateById(instance); // 推进工作流 - if (dmsBillsFaultInstance.getWfDefinitionId() != null) { - Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId()); + if (instance.getWfDefinitionId() != null) { + Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(instance.getWfDefinitionId()); if (currentTaskId != null) { RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(currentTaskId); @@ -501,7 +531,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS List messageTypes = new ArrayList<>(); messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); - remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); + remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + instance.getBillsFaultCode()); boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); if (!b) { throw new ServiceException("工作流推进失败"); @@ -509,19 +539,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS } } - // 更新工单状态 - baseMapper.updateById(dmsBillsFaultInstance); - - // 设置工单活动状态为已完成,并记录结束时间和维修人员 - dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH); - dmsFaultInstanceActivity.setEndTime(currentDate); - dmsFaultInstanceActivity.setRepairer(userName); - - // 更新故障实例活动记录 - DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class); - int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity); - - return i; + return 1; } /** @@ -573,7 +591,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS if (currentTaskId != null) { RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(currentTaskId); - + // 设置工作流变量 - 用于互斥网关判断分支走向 Map variables = new HashMap<>(); if ("1".equals(confirmResult)) { @@ -585,27 +603,27 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS remoteCompleteTask.setMessage("主管确认不通过,返回维修环节"); variables.put("repairConfirm", "1"); } - + variables.put("businessId", repairInstanceId.toString()); remoteCompleteTask.setVariables(variables); - + List messageTypes = new ArrayList<>(); messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); - + // 设置消息通知内容 if ("1".equals(confirmResult)) { remoteCompleteTask.setNotice("故障报修工单已完成,工单编号:" + workOrder.getBillsFaultCode()); } else { remoteCompleteTask.setNotice("故障报修工单确认不通过,需重新维修,工单编号:" + workOrder.getBillsFaultCode()); } - + boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask); if (!workflowResult) { - log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, confirmResult: {}", + log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, confirmResult: {}", repairInstanceId, confirmResult); } else { - log.info("主管确认完成,工作流推进成功,repairInstanceId: {}, confirmResult: {}", + log.info("主管确认完成,工作流推进成功,repairInstanceId: {}, confirmResult: {}", repairInstanceId, confirmResult); } } @@ -626,50 +644,50 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 1. 首先更新工单的工作流实例ID,确保关联关系建立 dmsBillsFaultInstance.setWfDefinitionId(processInstanceId); boolean updateResult = baseMapper.updateById(dmsBillsFaultInstance) > 0; - + if (!updateResult) { - log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}", + log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}", dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId); return false; } - - log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}", + + log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}", dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId); // 2. 然后推进工作流(工单创建后自动推进到审批节点) RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(taskId); remoteCompleteTask.setMessage("工单创建完成,自动推进到审批节点"); - + // 设置消息类型 List messageTypes = new ArrayList<>(); messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); - + // 设置消息通知内容 remoteCompleteTask.setNotice("您有新的故障报修工单需要审批,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); - + // 设置工作流变量(如果需要) Map variables = new HashMap<>(); variables.put("businessId", dmsBillsFaultInstance.getRepairInstanceId().toString()); variables.put("initiator", LoginHelper.getUsername()); remoteCompleteTask.setVariables(variables); - + boolean completeResult = remoteWorkflowService.completeTask(remoteCompleteTask); - + if (!completeResult) { - log.error("工作流推进失败,repairInstanceId: {}, taskId: {}", + log.error("工作流推进失败,repairInstanceId: {}, taskId: {}", dmsBillsFaultInstance.getRepairInstanceId(), taskId); return false; } - - log.info("工作流推进成功,repairInstanceId: {}, taskId: {}", + + log.info("工作流推进成功,repairInstanceId: {}, taskId: {}", dmsBillsFaultInstance.getRepairInstanceId(), taskId); - + return true; - + } catch (Exception e) { - log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}", + log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}", dmsBillsFaultInstance.getRepairInstanceId(), taskId, processInstanceId, e); return false; } @@ -754,54 +772,101 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS */ @Override public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) { - // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 - DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); - - // 【关键修复】查询零部件信息,确保PDA端兼容性 - List partsVoList = baseMapper.selectParts(repairInstanceId); - if (partsVoList == null) { - partsVoList = new ArrayList<>(); // 确保不为null - } - // 转换为实体对象并设置到工单中 - List partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class); - dmsBillsFaultInstance.setParts(partsList); - - // 创建实例文件查询对象 - DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo(); - // 设置目标类型为故障实例活动 - queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY); - // 设置目标ID为故障实例的活动ID - queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId()); - // 查询实例文件列表 - List dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile); - - // 遍历实例文件列表FIXME - for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){ - // 获取文件路径 - String filePath = dmsInstanceFile.getFilePath(); - // 如果文件路径不包含"9005" - if(!filePath.contains("9005")){ - // 如果文件路径包含"https",将其替换为"http" - if(filePath.contains("https")){ - filePath.replaceFirst("https","http"); - } - // 找到"/statics"的索引位置 - int index= filePath.indexOf("/statics"); - // 修改文件路径为新的地址 - filePath = "http://118.25.106.99:9005"+filePath.substring(index); - // 设置新的URL和文件路径 - dmsInstanceFile.setFilePath(filePath); - }else{ - // 如果文件路径包含"9005",直接设置URL为文件路径 - dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath()); + try { + // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 + DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); + + if (dmsBillsFaultInstance == null) { + throw new ServiceException("工单不存在,repairInstanceId: " + repairInstanceId); } - } - List InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class); - // 将修改后的实例文件列表设置到故障实例中 - dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles); - // 返回故障实例对象 - return dmsBillsFaultInstance; + // 【调试日志】输出查询结果,确认outsourcingId是否正确获取 + log.info("查询工单详情,repairInstanceId: {}, outsourcingId: {}, instanceActivityId: {}", + repairInstanceId, dmsBillsFaultInstance.getOutsourcingId(), dmsBillsFaultInstance.getInstanceActivityId()); + + // 【关键修复】查询零部件信息,确保PDA端兼容性 + List partsVoList = baseMapper.selectParts(repairInstanceId); + if (partsVoList == null) { + partsVoList = new ArrayList<>(); // 确保不为null + } + // 转换为实体对象并设置到工单中 + List partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class); + dmsBillsFaultInstance.setParts(partsList); + + // 创建实例文件查询对象 + DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo(); + // 设置目标类型为故障实例活动 + queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY); + // 设置目标ID为故障实例的活动ID + queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId()); + // 查询实例文件列表 + List dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile); + + // 遍历实例文件列表FIXME + for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){ + // 获取文件路径 + String filePath = dmsInstanceFile.getFilePath(); + // 如果文件路径不包含"9005" + if(!filePath.contains("9005")){ + // 如果文件路径包含"https",将其替换为"http" + if(filePath.contains("https")){ + filePath.replaceFirst("https","http"); + } + // 找到"/statics"的索引位置 + int index= filePath.indexOf("/statics"); + // 修改文件路径为新的地址 + filePath = "http://118.25.106.99:9005"+filePath.substring(index); + // 设置新的URL和文件路径 + dmsInstanceFile.setFilePath(filePath); + }else{ + // 如果文件路径包含"9005",直接设置URL为文件路径 + dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath()); + } + } + List InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class); + // 将修改后的实例文件列表设置到故障实例中 + dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles); + + // 返回故障实例对象 + return dmsBillsFaultInstance; + + } catch (Exception e) { + log.error("查询工单详情异常,repairInstanceId: {}", repairInstanceId, e); + + // 如果是查询返回多条记录的异常,尝试备用查询方案 + if (e.getMessage() != null && e.getMessage().contains("Expected one result")) { + log.warn("检测到查询返回多条记录异常,尝试备用查询方案,repairInstanceId: {}", repairInstanceId); + + // 备用方案:查询工单基本信息和最新的活动记录 + DmsBillsFaultInstanceVo workOrder = baseMapper.selectVoById(repairInstanceId); + if (workOrder != null) { + // 查询最新的活动记录 + MPJLambdaWrapper wrapper = JoinWrappers.lambda(DmsFaultInstanceActivity.class) + .eq(DmsFaultInstanceActivity::getRepairInstanceId, repairInstanceId) + .orderByDesc(DmsFaultInstanceActivity::getProcessStepOrder) + .orderByDesc(DmsFaultInstanceActivity::getInstanceActivityId) + .last("LIMIT 1"); + DmsFaultInstanceActivity latestActivity = dmsFaultInstanceActivityMapper.selectOne(wrapper); + + if (latestActivity != null) { + // 设置活动相关信息 + workOrder.setInstanceActivityId(latestActivity.getInstanceActivityId()); + workOrder.setFaultType(latestActivity.getFaultType()); + workOrder.setFaultDescription(latestActivity.getFaultDescription()); + workOrder.setDesignOperations(latestActivity.getDesignOperations()); + workOrder.setRepairType(latestActivity.getRepairType()); + workOrder.setOutsourcingId(latestActivity.getOutsourcingId()); + workOrder.setProcessHandleResolution(latestActivity.getProcessHandleResolution()); + } + + log.info("备用查询方案成功,repairInstanceId: {}, instanceActivityId: {}", + repairInstanceId, workOrder.getInstanceActivityId()); + return workOrder; + } + } + + throw new ServiceException("查询工单详情失败:" + e.getMessage()); + } } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsFaultComponentsPartsServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsFaultComponentsPartsServiceImpl.java index fddeb06..8a20422 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsFaultComponentsPartsServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsFaultComponentsPartsServiceImpl.java @@ -78,7 +78,8 @@ public class DmsFaultComponentsPartsServiceImpl implements IDmsFaultComponentsPa .like(StringUtils.isNotBlank(bo.getPartName()), DmsFaultComponentsParts::getPartName, bo.getPartName()) .eq(StringUtils.isNotBlank(bo.getPartSpecifications()), DmsFaultComponentsParts::getPartSpecifications, bo.getPartSpecifications()) .eq(bo.getAmount() != null, DmsFaultComponentsParts::getAmount, bo.getAmount()) - .orderByDesc(DmsFaultComponentsParts::getCreateTime); + //.orderByDesc(DmsFaultComponentsParts::getCreateTime) + ; return lqw; } diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsBillsFaultInstanceMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsBillsFaultInstanceMapper.xml index a746dc5..cdfdc64 100644 --- a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsBillsFaultInstanceMapper.xml +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsBillsFaultInstanceMapper.xml @@ -134,10 +134,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from dms_bills_fault_instance dbfi left join prod_base_machine_info dbdl on dbfi.machine_id=dbdl.machine_id left join dms_fault_instance_activity dfia on (dbfi.repair_instance_id=dfia.repair_instance_id - and dfia.process_step_order = ( - select max(process_step_order) + and dfia.instance_activity_id = ( + select max(instance_activity_id) from dms_fault_instance_activity dfia2 where dfia2.repair_instance_id = dbfi.repair_instance_id + and dfia2.process_step_order = ( + select max(process_step_order) + from dms_fault_instance_activity dfia3 + where dfia3.repair_instance_id = dbfi.repair_instance_id + ) )) where dbfi.repair_instance_id = #{repairInstanceId}