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 889a24f..d20dbe6 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 @@ -3,6 +3,7 @@ package org.dromara.dms.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.DeserializationFeature; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -99,6 +100,10 @@ public class DmsMobileController extends BaseController { // 设置审批状态字段,确保PDA端能获取到审批信息 mobileInstance.setApproveStatus(voInstance.getApproveStatus()); + + // 【修复】设置设备编码标签字段,用于PDA端验证扫描设备编码 + // 该字段用于PDA端startRepair方法中验证扫描的设备编码与工单中的设备编码是否一致 + mobileInstance.setDeviceCodeTag(voInstance.getMachineCode()); // ID字段类型转换 - Long到String,并处理字段映射差异 if (voInstance.getRepairInstanceId() != null) { @@ -117,6 +122,45 @@ 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 { + mobileInstance.setOutsrcId(Math.toIntExact(voInstance.getOutsourcingId())); + } catch (ArithmeticException e) { + log.warn("外协单位ID转换失败,值过大: {}", voInstance.getOutsourcingId()); + mobileInstance.setOutsrcId(0); // 设置为0作为默认值 + } + } else { + mobileInstance.setOutsrcId(0); // 当outsourcingId为null时,明确设置为0 + } + + // 【关键修复】处理维修类型转换:String repairType -> int repairType 并设置radioState + int repairTypeInt = 1; // 默认为内部维修 + if (voInstance.getRepairType() != null) { + try { + repairTypeInt = Integer.parseInt(voInstance.getRepairType()); + } catch (NumberFormatException e) { + log.warn("维修类型转换失败,无效值: {}, 使用默认值1", voInstance.getRepairType()); + repairTypeInt = 1; // 默认为内部维修 + } + } + mobileInstance.setRepairType(String.valueOf(repairTypeInt)); + + // 【关键修复】根据维修类型设置单选按钮状态(模拟PDA端的repairTypeSelect逻辑) + if (repairTypeInt == 1) { + // 内部维修 + mobileInstance.setRadioState1(true); + mobileInstance.setRadioState2(false); + } else if (repairTypeInt == 2) { + // 委外维修 + mobileInstance.setRadioState1(false); + mobileInstance.setRadioState2(true); + } else { + // 未知类型,默认为内部维修 + mobileInstance.setRadioState1(true); + mobileInstance.setRadioState2(false); + } } /** @@ -414,6 +458,10 @@ public class DmsMobileController extends BaseController { DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); + billsFaultInstance.setDeviceCode(mobileInstance.getMachineCode()); + billsFaultInstance.setDeviceName(mobileInstance.getMachineName()); + billsFaultInstance.setDeviceLocation(mobileInstance.getMachineLocation()); + billsFaultInstance.setDeviceSpec(mobileInstance.getMachineSpec()); // 手动格式化时间字段,确保PDA客户端兼容性 formatTimeFields(mobileInstance, billsFaultInstance); return AjaxResult.success(mobileInstance); @@ -443,16 +491,40 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.START) @PostMapping("/startRepair") @RepeatSubmit - public AjaxResult startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { + public AjaxResult startRepair(@RequestBody String json) { try { + // 预处理 "amount" 字段 + String processedJson = preprocessAmountFields(json); + + // 手动反序列化 + ObjectMapper objectMapper = new ObjectMapper(); + // 【修复】 忽略未知字段,增强兼容性 + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + DmsFaultInstanceActivityBo dmsFaultInstanceActivity = objectMapper.readValue(processedJson, DmsFaultInstanceActivityBo.class); + int i = dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity); 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()); } } + /** + * 预处理JSON字符串中的amount字段,将小数格式转换为整数格式 + * 例如:将"1.0"转换为"1" + */ + private String preprocessAmountFields(String json) { + if (json == null) { + return null; + } + // 将 "amount":"1.0" 转换成 "amount":1 + return json.replaceAll("\"amount\"\\s*:\\s*\"?([0-9]+)\\.0+\"?", "\"amount\":$1"); + } + /** * 完成维修 */ @@ -460,16 +532,31 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.COMPLETE) @PostMapping("/completeRepair") @RepeatSubmit - public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, + public AjaxResult completeRepair(@RequestParam("dmsFaultInstanceActivity") String activityJson, @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(); - List parts2 = objectMapper.readValue(parts1, new TypeReference>() { - }); - dmsFaultInstanceActivity.setParts(parts2); + + // 由于PDA端传递的parts1是一个JSON字符串,这里需要特殊处理 + if (parts1 != null && !parts1.isEmpty()) { + // 预处理 "amount" 字段 + String processedPartsJson = preprocessAmountFields(parts1); + List parts2 = objectMapper.readValue(processedPartsJson, new TypeReference>() { + }); + dmsFaultInstanceActivity.setParts(parts2); + } + List fileUrls = handleFileUploads(files); dmsFaultInstanceActivity.setFileUrls(fileUrls); int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity); @@ -477,6 +564,9 @@ public class DmsMobileController extends BaseController { } 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/dubbo/RemoteInspectInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java index 84c8854..f185a7f 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteInspectInstanceServiceImpl.java @@ -235,11 +235,13 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe // 推进工作流状态 RemoteCompleteTask completeTask = new RemoteCompleteTask(); completeTask.setTaskId(taskId); - completeTask.setMessage("检查工单启动,自动推进"); + completeTask.setMessage("系统自动创建检查工单,请及时处理"); // 设置消息类型为非null的List List messageTypes = new ArrayList<>(); - messageTypes.add("system"); // 系统消息 + messageTypes.add("1"); // 站内信 completeTask.setMessageType(messageTypes); + // 设置消息通知内容 + completeTask.setNotice("您有新的检查工单需要处理,工单编号:" + businessId); // 【关键修复】在调用工作流推进前再次确认租户上下文 log.info("检查工作流推进前,当前租户ID: {}", TenantHelper.getTenantId()); diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java index f96f5dc..f38a523 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteLubeInstanceServiceImpl.java @@ -254,11 +254,13 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService // 2. 推进工作流状态 RemoteCompleteTask completeTask = new RemoteCompleteTask(); completeTask.setTaskId(taskId); - completeTask.setMessage("润滑工单启动,自动推进"); + completeTask.setMessage("系统自动创建润滑工单,请及时处理"); // 设置消息类型为非null的List List messageTypes = new ArrayList<>(); - messageTypes.add("system"); // 系统消息 + messageTypes.add("1"); // 站内信 completeTask.setMessageType(messageTypes); + // 设置消息通知内容 + completeTask.setNotice("您有新的润滑工单需要处理,工单编号:" + businessId); // 【关键修复】在调用工作流推进前再次确认租户上下文 log.info("工作流推进前,当前租户ID: {}", TenantHelper.getTenantId()); diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java index f254a19..2afa433 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/dubbo/RemoteMaintInstanceServiceImpl.java @@ -257,11 +257,13 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic // 2. 推进工作流状态 RemoteCompleteTask completeTask = new RemoteCompleteTask(); completeTask.setTaskId(taskId); - completeTask.setMessage("保养工单启动,自动推进"); + completeTask.setMessage("系统自动创建保养工单,请及时处理"); // 设置消息类型为非null的List List messageTypes = new ArrayList<>(); - messageTypes.add("system"); // 系统消息 + messageTypes.add("1"); // 站内信 completeTask.setMessageType(messageTypes); + // 设置消息通知内容 + completeTask.setNotice("您有新的保养工单需要处理,工单编号:" + businessId); // 【关键修复】在调用工作流推进前再次确认租户上下文 log.info("保养工作流推进前,当前租户ID: {}", TenantHelper.getTenantId()); 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 fd41ffc..15fadd8 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 @@ -339,9 +339,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 设置消息类型 List messageTypes = new ArrayList<>(); - messageTypes.add("system"); + 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); @@ -413,8 +420,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS remoteCompleteTask.setTaskId(currentTaskId); remoteCompleteTask.setMessage("开始维修"); List messageTypes = new ArrayList<>(); - messageTypes.add("system"); + messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); + remoteCompleteTask.setNotice("故障报修工单已开始维修,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); if (!b) { throw new ServiceException("工作流推进失败"); @@ -491,8 +499,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS remoteCompleteTask.setTaskId(currentTaskId); remoteCompleteTask.setMessage("完成维修"); List messageTypes = new ArrayList<>(); - messageTypes.add("system"); + messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); + remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); if (!b) { throw new ServiceException("工作流推进失败"); @@ -581,9 +590,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS remoteCompleteTask.setVariables(variables); List messageTypes = new ArrayList<>(); - messageTypes.add("system"); + 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: {}", @@ -627,9 +643,12 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 设置消息类型 List messageTypes = new ArrayList<>(); - messageTypes.add("system"); + messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); + // 设置消息通知内容 + remoteCompleteTask.setNotice("您有新的故障报修工单需要审批,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); + // 设置工作流变量(如果需要) Map variables = new HashMap<>(); variables.put("businessId", dmsBillsFaultInstance.getRepairInstanceId().toString());