diff --git a/ruoyi-api/hwmom-api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java b/ruoyi-api/hwmom-api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java index 379fb25..31a2b16 100644 --- a/ruoyi-api/hwmom-api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java +++ b/ruoyi-api/hwmom-api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java @@ -111,4 +111,5 @@ public interface RemoteWorkflowService { * @return 当前活跃任务ID,如果没有找到返回null */ Long getCurrentTaskIdByInstanceId(Long instanceId); + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DmsConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DmsConstants.java index 79a6f48..2319e57 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DmsConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DmsConstants.java @@ -15,6 +15,11 @@ public class DmsConstants { public static final String DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING = "1";//维修中 public static final String DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH = "2";//维修完成 + /**故障报修工单审批状态(按照PDA标准,在PDA实体类DeviceRepair中)*/ + public static final String DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING = "1";//待审批 + public static final String DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED = "2";//审批成功 + public static final String DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_REJECTED = "3";//审批失败 + /**故障报修工单实例状态*/ public static final String DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH = "0";//已结束 public static final String DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_EXECUTING = "1";//执行中 diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsBillsFaultInstanceController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsBillsFaultInstanceController.java index d1dec27..b94bf9d 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsBillsFaultInstanceController.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsBillsFaultInstanceController.java @@ -14,6 +14,7 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.dromara.dms.domain.bo.DmsBillsFaultInstanceBo; import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo; @@ -67,7 +68,7 @@ public class DmsBillsFaultInstanceController extends BaseController { @GetMapping("/{repairInstanceId}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long repairInstanceId) { - return R.ok(dmsBillsFaultInstanceService.queryById(repairInstanceId)); + return R.ok(dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId)); } /** @@ -128,6 +129,37 @@ public class DmsBillsFaultInstanceController extends BaseController { return toAjax(dmsBillsFaultInstanceService.updateWfDefinitionIdById(repairInstanceId, wfDefinitionId)); } + /** + * 审批故障报修工单 + * + * @param repairInstanceId 工单ID + * @param approveStatus 审批状态(2-审批成功,3-审批失败) + * @param message 审批意见 + */ + //@SaCheckPermission("dms:dmsBillsFaultInstance:approve") + @Log(title = "故障报修工单审批", businessType = BusinessType.UPDATE) + @PostMapping("/approve") + public R approve(@RequestParam Long repairInstanceId, + @RequestParam String approveStatus, + @RequestParam(required = false) String message) { + return toAjax(dmsBillsFaultInstanceService.approveWorkOrder(repairInstanceId, approveStatus, message)); + } + + /** + * 主管确认维修结果 + * + * @param repairInstanceId 工单ID + * @param confirmResult 确认结果(1-确认完成) + */ + //@SaCheckPermission("dms:dmsBillsFaultInstance:confirm") + @Log(title = "故障报修工单确认", businessType = BusinessType.UPDATE) + @PostMapping("/confirm") + public R confirm(@RequestParam Long repairInstanceId, + @RequestParam String confirmResult) { + String confirmUser = LoginHelper.getUsername(); + return toAjax(dmsBillsFaultInstanceService.confirmRepairResult(repairInstanceId, confirmResult, confirmUser)); + } + // @PostMapping("faultRecordExport") // public void faultRecordExport(DmsBillsFaultInstance dmsBillsFaultInstance, HttpServletResponse response) throws Exception { // Map beanParams = new HashMap<>(); 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 a53b12e..ac26ee3 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; @@ -97,6 +98,13 @@ public class DmsMobileController extends BaseController { mobileInstance.setDeviceLocation(voInstance.getMachineLocation()); mobileInstance.setDeviceSpec(voInstance.getMachineSpec()); + // 设置审批状态字段,确保PDA端能获取到审批信息 + mobileInstance.setApproveStatus(voInstance.getApproveStatus()); + + // 【修复】设置设备编码标签字段,用于PDA端验证扫描设备编码 + // 该字段用于PDA端startRepair方法中验证扫描的设备编码与工单中的设备编码是否一致 + mobileInstance.setDeviceCodeTag(voInstance.getMachineCode()); + // ID字段类型转换 - Long到String,并处理字段映射差异 if (voInstance.getRepairInstanceId() != null) { mobileInstance.setRepairInstanceId(String.valueOf(voInstance.getRepairInstanceId())); @@ -114,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); + } } /** @@ -159,7 +206,6 @@ public class DmsMobileController extends BaseController { dictList.add(dict); } } - return AjaxResult.success(dictList); } @@ -238,7 +284,7 @@ public class DmsMobileController extends BaseController { DeviceBeen deviceBeen = MapstructUtils.convert(dmsBaseDeviceLedger, DeviceBeen.class); // 手动处理字段映射差异:machineId -> deviceId,确保类型安全转换 if (dmsBaseDeviceLedger.getMachineId() != null) { - deviceBeen.setDeviceId(dmsBaseDeviceLedger.getMachineId().intValue()); + deviceBeen.setDeviceId(dmsBaseDeviceLedger.getMachineId()); } return AjaxResult.success(deviceBeen); } @@ -410,10 +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); } @@ -441,9 +501,38 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.START) @PostMapping("/startRepair") @RepeatSubmit - public AjaxResult startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { - int i = dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity); - return AjaxResult.success(i); + 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"); } /** @@ -455,18 +544,29 @@ public class DmsMobileController extends BaseController { @RepeatSubmit public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, @RequestParam(value = "files", required = false) List files) throws JsonProcessingException { - dmsFaultInstanceActivity.setRepairConfirm("2"); - dmsFaultInstanceActivity.setConfirmTime(new Date()); - String parts1 = dmsFaultInstanceActivity.getParts1(); - ObjectMapper objectMapper = new ObjectMapper(); - List parts2 = objectMapper.readValue(parts1, new TypeReference>() { - }); - dmsFaultInstanceActivity.setParts(parts2); - List fileUrls = handleFileUploads(files); - dmsFaultInstanceActivity.setFileUrls(fileUrls); - //FIXME:关于工作流相关的本页代码以及调用方法都需测试完善修改 - int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity); - return AjaxResult.success(i); + try { + // 注意:这里不再设置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" 字段 + String processedPartsJson = preprocessAmountFields(parts1); + List parts2 = objectMapper.readValue(processedPartsJson, new TypeReference>() { + }); + dmsFaultInstanceActivity.setParts(parts2); + } + + int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity, files); + return AjaxResult.success(i); + } catch (ServiceException e) { + log.error("完成维修失败:{}", e.getMessage()); + return AjaxResult.error(e.getMessage()); + } } @@ -490,13 +590,13 @@ public class DmsMobileController extends BaseController { DmsInspectInstanceDetailMobile detailMobile = MapstructUtils.convert(detailVo, DmsInspectInstanceDetailMobile.class); // 手动处理字段映射差异:machineId -> deviceId if (detailVo.getMachineId() != null) { - detailMobile.setDeviceId(detailVo.getMachineId().intValue()); + detailMobile.setDeviceId(detailVo.getMachineId()); } detailMobileList.add(detailMobile); } mobileInstance.setDmsInspectInstanceDetailList(detailMobileList); } - + //mobileInstance.setCreateTime(newestInspectInstance.getCreateTime()); return AjaxResult.success(mobileInstance); } @@ -509,10 +609,10 @@ public class DmsMobileController extends BaseController { @RepeatSubmit public AjaxResult scanInspectInstanceDetail(@Validated DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { DmsInspectInstanceDetailVo dmsInspectInstanceDetailVo = dmsBillsInspectInstanceService.scanInspectInstanceDetail(dmsBillsInspectInstanceScan); - + // 【关键修复】完全避免使用MapstructUtils自动转换,采用手动映射 DmsInspectInstanceDetailMobile dmsInspectInstanceDetailMobile = new DmsInspectInstanceDetailMobile(); - + // 手动映射基本字段 dmsInspectInstanceDetailMobile.setInstanceDetailId(dmsInspectInstanceDetailVo.getInstanceDetailId()); dmsInspectInstanceDetailMobile.setInspectInstanceId(dmsInspectInstanceDetailVo.getInspectInstanceId()); @@ -527,18 +627,18 @@ public class DmsMobileController extends BaseController { // 手动处理字段映射差异:machineId -> deviceId if (dmsInspectInstanceDetailVo.getMachineId() != null) { - dmsInspectInstanceDetailMobile.setDeviceId(dmsInspectInstanceDetailVo.getMachineId().intValue()); + dmsInspectInstanceDetailMobile.setDeviceId(dmsInspectInstanceDetailVo.getMachineId()); } // 【方案对比实现】处理项目列表:使用流和类型过滤 vs 强制转换 if (dmsInspectInstanceDetailVo.getDmsInspectInstanceDetailProjectList() != null) { List deviceInspectionItemList = new ArrayList<>(); - + // 【方案A:流和类型过滤 - 类型安全,性能稍低】 List rawProjectList = dmsInspectInstanceDetailVo.getDmsInspectInstanceDetailProjectList(); for (Object projectObj : rawProjectList) { DeviceInspectionItem deviceInspectionItem = new DeviceInspectionItem(); - + // 运行时类型检查,支持多种类型 if (projectObj instanceof DmsInspectInstanceDetailProject) { DmsInspectInstanceDetailProject project = (DmsInspectInstanceDetailProject) projectObj; @@ -550,16 +650,16 @@ public class DmsMobileController extends BaseController { log.warn("未知的项目类型: {}", projectObj.getClass().getName()); continue; // 跳过未知类型,保证程序稳定性 } - + deviceInspectionItemList.add(deviceInspectionItem); } - + dmsInspectInstanceDetailMobile.setDmsInspectInstanceDetailProjectList(deviceInspectionItemList); } return AjaxResult.success(dmsInspectInstanceDetailMobile); } - + /** * 映射DmsInspectInstanceDetailProject字段到DeviceInspectionItem */ @@ -569,15 +669,15 @@ public class DmsMobileController extends BaseController { deviceInspectionItem.setInspectProjectName(project.getInspectProjectName()); deviceInspectionItem.setInspectProjectProperty(project.getInspectProjectProperty()); deviceInspectionItem.setInspectProjectDesc(project.getInspectProjectDesc()); - - + + if (project.getInspectProjectResult() != null) { deviceInspectionItem.setInspectProjectResult(project.getInspectProjectResult().toString()); } else { // 【PDA适配】确保为null而不是空字符串 deviceInspectionItem.setInspectProjectResult(null); } - + if (project.getDefValue() != null) { deviceInspectionItem.setDefValue(project.getDefValue().doubleValue()); } @@ -588,7 +688,7 @@ public class DmsMobileController extends BaseController { deviceInspectionItem.setLowLimit(project.getLowLimit().doubleValue()); } } - + /** * 映射DmsInspectInstanceDetailProjectVo字段到DeviceInspectionItem */ @@ -598,17 +698,17 @@ public class DmsMobileController extends BaseController { deviceInspectionItem.setInspectProjectName(projectVo.getInspectProjectName()); deviceInspectionItem.setInspectProjectProperty(projectVo.getInspectProjectProperty()); deviceInspectionItem.setInspectProjectDesc(projectVo.getInspectProjectDesc()); - + // 【PDA适配】不设置statusName,让PDA端自己计算 // deviceInspectionItem.setStatusName() 由PDA端的getStatusName()方法自动计算 - + if (projectVo.getInspectProjectResult() != null) { deviceInspectionItem.setInspectProjectResult(projectVo.getInspectProjectResult().toString()); } else { // 【PDA适配】确保为null而不是空字符串 deviceInspectionItem.setInspectProjectResult(null); } - + if (projectVo.getDefValue() != null) { deviceInspectionItem.setDefValue(projectVo.getDefValue().doubleValue()); } @@ -625,6 +725,7 @@ public class DmsMobileController extends BaseController { */ @Log(title = "点巡检工单明细", businessType = BusinessType.INSERT) @PostMapping("/saveInspectInstanceDetail") + @RepeatSubmit public AjaxResult saveInspectInstanceDetail(@RequestBody DmsInspectInstanceDetailBo dmsInspectInstanceDetail) { return AjaxResult.success(dmsBillsInspectInstanceService.updateDmsInspectInstanceDetail(dmsInspectInstanceDetail)); } @@ -689,7 +790,6 @@ public class DmsMobileController extends BaseController { DmsBillsMaintDetail result = dmsBillsMaintInstanceService.startMaint(dmsBillsMaintDetail); // 转换为Mobile对象,确保与PDA端兼容 MaintainDetail maintainDetail = MapstructUtils.convert(result, MaintainDetail.class); - // 手动处理字段映射差异:machineId -> deviceId if (result.getMachineId() != null) { maintainDetail.setDeviceId(result.getMachineId()); @@ -706,7 +806,6 @@ public class DmsMobileController extends BaseController { maintainDetail.setMaintProtocol(result.getMaintProtocol()); maintainDetail.setMaintOperationDescription(result.getMaintOperationDescription()); maintainDetail.setOperationDescription(result.getOperationDescription()); - // 处理嵌套对象的字段映射:dmsBillsMaintDetailProjectList if (result.getDmsBillsMaintDetailProjectList() != null) { List maintainProjectList = new ArrayList<>(); @@ -730,7 +829,6 @@ public class DmsMobileController extends BaseController { } maintainDetail.setDmsBillsMaintDetailProjectList(maintainProjectList); } - return AjaxResult.success(maintainDetail); } @@ -744,7 +842,7 @@ public class DmsMobileController extends BaseController { public AjaxResult completeMaint(@RequestBody DmsBillsMaintDetailMobileBo dmsBillsMaintDetailMobileBo) { // 将PDA端Bo转换为后端实体,处理字段名差异和项目列表 DmsBillsMaintDetail dmsBillsMaintDetail = dmsBillsMaintDetailMobileBo.toEntity(); - + // 处理项目列表的转换 if (dmsBillsMaintDetailMobileBo.getDmsBillsMaintDetailProjectList() != null) { List projectList = new ArrayList<>(); @@ -755,7 +853,7 @@ public class DmsMobileController extends BaseController { } dmsBillsMaintDetail.setDmsBillsMaintDetailProjectList(projectList); } - + int i = dmsBillsMaintInstanceService.completeMaint(dmsBillsMaintDetail); return AjaxResult.success(i); } @@ -771,29 +869,88 @@ public class DmsMobileController extends BaseController { // @RepeatSubmit public AjaxResult getNewestLubeInstance(DmsBillsLubeInstanceBo dmsBillsLubeInstance) { DmsBillsLubeInstanceVo newestLubeInstance = dmsBillsLubeInstanceService.getNewestBillsLubeInstance(dmsBillsLubeInstance); - // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 - DmsBillsLubeInstanceMobile mobileInstance = MapstructUtils.convert(newestLubeInstance, DmsBillsLubeInstanceMobile.class); + + // 【PDA适配】如果查询结果为空,直接返回 + if (newestLubeInstance == null) { + return AjaxResult.success(null); + } + + // 【关键修复】使用手动转换而不是MapstructUtils,避免序列化问题 + DmsBillsLubeInstanceMobile mobileInstance = new DmsBillsLubeInstanceMobile(); + + // 手动设置基本字段 + mobileInstance.setLubeInstanceId(newestLubeInstance.getLubeInstanceId()); + mobileInstance.setPlanLubeId(newestLubeInstance.getPlanLubeId()); + mobileInstance.setBillsLubeCode(newestLubeInstance.getBillsLubeCode()); + mobileInstance.setLubeGroup(newestLubeInstance.getLubeGroup()); + mobileInstance.setLubeSupervisor(newestLubeInstance.getLubeSupervisor()); + mobileInstance.setRemark(newestLubeInstance.getRemark()); + + // 【类型转换】处理状态字段的类型转换:String -> Long + if (newestLubeInstance.getLubeLevel() != null) { + try { + mobileInstance.setLubeLevel(Long.valueOf(newestLubeInstance.getLubeLevel())); + } catch (NumberFormatException e) { + log.warn("润滑级别转换失败: {}", newestLubeInstance.getLubeLevel()); + mobileInstance.setLubeLevel(null); + } + } + + if (newestLubeInstance.getLubeStatus() != null) { + try { + mobileInstance.setLubeStatus(Long.valueOf(newestLubeInstance.getLubeStatus())); + } catch (NumberFormatException e) { + log.warn("润滑状态转换失败: {}", newestLubeInstance.getLubeStatus()); + mobileInstance.setLubeStatus(null); + } + } // 处理嵌套对象的字段映射:dmsBillsLubeDetailList if (newestLubeInstance.getDmsBillsLubeDetailList() != null) { List lubricationDetailList = new ArrayList<>(); for (var detailVo : newestLubeInstance.getDmsBillsLubeDetailList()) { - LubricationDetail lubricationDetail = MapstructUtils.convert(detailVo, LubricationDetail.class); + LubricationDetail lubricationDetail = new LubricationDetail(); + + // 手动设置字段,确保类型匹配 + lubricationDetail.setBillsLubeDetailId(detailVo.getBillsLubeDetailId()); + lubricationDetail.setLubeInstanceId(detailVo.getLubeInstanceId()); + lubricationDetail.setLubeStationId(detailVo.getLubeStationId()); + lubricationDetail.setLubeStandardId(detailVo.getLubeStandardId()); + lubricationDetail.setOperationDescription(detailVo.getOperationDescription()); + // 手动处理字段映射差异:machineId -> deviceId if (detailVo.getMachineId() != null) { lubricationDetail.setDeviceId(detailVo.getMachineId()); } + // 处理其他字段映射:machineCode -> deviceCode, machineName -> deviceName lubricationDetail.setDeviceCode(detailVo.getMachineCode()); lubricationDetail.setDeviceName(detailVo.getMachineName()); lubricationDetail.setTypeName(detailVo.getDeviceTypeName()); + + // 【关键修复】确保润滑部位和润滑标准字段正确映射 + lubricationDetail.setLubeStationName(detailVo.getLubeStationName()); + lubricationDetail.setLubeProtocol(detailVo.getLubeProtocol()); + lubricationDetail.setLubeOperationDescription(detailVo.getLubeOperationDescription()); + lubricationDetail.setLubeStandardCode(detailVo.getLubeStandardCode()); + + // 【类型转换】处理维护状态字段的类型转换:String -> Long + if (detailVo.getMaintStatus() != null) { + try { + lubricationDetail.setMaintStatus(Long.valueOf(detailVo.getMaintStatus())); + } catch (NumberFormatException e) { + log.warn("润滑明细维护状态转换失败: {}", detailVo.getMaintStatus()); + lubricationDetail.setMaintStatus(null); + } + } else { + lubricationDetail.setMaintStatus(null); + } + lubricationDetailList.add(lubricationDetail); } mobileInstance.setDmsBillsLubeDetailList(lubricationDetailList); } - - // 注意:润滑Mobile类中的时间字段已被注释,无需格式化 - // 如果将来启用时间字段,请添加相应的格式化方法 + // 【PDA兼容性】直接返回标准的AjaxResult,让Spring Boot自动序列化为JSON return AjaxResult.success(mobileInstance); } @@ -821,5 +978,4 @@ public class DmsMobileController extends BaseController { return AjaxResult.success(i); } - } 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 c1d219c..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", type = IdType.AUTO) + @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/domain/mobile/DmsBillsInspectInstanceMobile.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsInspectInstanceMobile.java index 55f1561..1c4ee5e 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsInspectInstanceMobile.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsInspectInstanceMobile.java @@ -10,6 +10,7 @@ import org.dromara.dms.domain.vo.DmsBillsInspectInstanceVo; import java.io.Serial; import java.io.Serializable; +import java.util.Date; import java.util.List; @@ -128,5 +129,6 @@ public class DmsBillsInspectInstanceMobile implements Serializable { private String inspectStatusStr; + private Date CreateTime; } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsMaintInstanceMobile.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsMaintInstanceMobile.java index 062cdcd..144c478 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsMaintInstanceMobile.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsMaintInstanceMobile.java @@ -13,6 +13,7 @@ import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; +import java.util.Date; /** diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintDetailProjectVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintDetailProjectVo.java index cb94fad..cf4eb9e 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintDetailProjectVo.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintDetailProjectVo.java @@ -2,6 +2,8 @@ package org.dromara.dms.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; @@ -10,6 +12,7 @@ import org.dromara.dms.domain.DmsBillsMaintDetailProject; import java.io.Serial; import java.io.Serializable; +import java.util.Date; import java.util.List; @@ -73,4 +76,29 @@ public class DmsBillsMaintDetailProjectVo implements Serializable { /** 保养工单明细项目信息;检查每个项目的点巡检结果详情信息 */ /* private List dmsBillsMaintDetailProjectList;*/ + /** + * 创建部门 + */ + private Long createDept; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + } 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 d146271..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()); @@ -248,7 +250,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe RpcContext.getContext().setAttachment("tenantId", currentTenantId); // 【关键】调用工作流推进 - boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进"); + boolean completeResult = remoteWorkflowService.completeTask(completeTask); if (completeResult) { log.info("检查工单 {} 工作流推进成功", businessId); } else { 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/mapper/DmsBillsMaintDetailProjectMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsBillsMaintDetailProjectMapper.java index 1a5ab8c..bd54d62 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsBillsMaintDetailProjectMapper.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsBillsMaintDetailProjectMapper.java @@ -4,6 +4,8 @@ import org.dromara.dms.domain.DmsBillsMaintDetailProject; import org.dromara.dms.domain.vo.DmsBillsMaintDetailProjectVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 保养工单明细项目信息;检查每个项目的点巡检结果详情Mapper接口 * @@ -12,4 +14,12 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ public interface DmsBillsMaintDetailProjectMapper extends BaseMapperPlus { + /** + * 查询保养工单明细项目列表,关联保养项目表获取项目名称 + * + * @param dmsBillsMaintDetailProject 保养工单明细项目 + * @return 保养工单明细项目集合 + */ + List selectDmsBillsMaintDetailProjectWithProjectName(DmsBillsMaintDetailProject dmsBillsMaintDetailProject); + } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsBillsFaultInstanceService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsBillsFaultInstanceService.java index 94f176e..04cfde9 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsBillsFaultInstanceService.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsBillsFaultInstanceService.java @@ -11,6 +11,7 @@ import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo; import java.util.Collection; import java.util.List; +import org.springframework.web.multipart.MultipartFile; /** * 故障报修工单Service接口 @@ -109,7 +110,7 @@ public interface IDmsBillsFaultInstanceService { * @param dmsFaultInstanceActivity 报修工单实例节点 * @return 结果 */ - public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity); + public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, List files); /** * 更新故障报修工单的工作流定义ID @@ -117,5 +118,25 @@ public interface IDmsBillsFaultInstanceService { * @param wfDefinitionId 工作流定义的ID * @return 如果更新成功返回true,否则返回false */ - public Boolean updateWfDefinitionIdById(Long repairInstanceId, Long wfDefinitionId); + Boolean updateWfDefinitionIdById(Long repairInstanceId, Long wfDefinitionId); + + /** + * 审批故障报修工单 + * + * @param repairInstanceId 工单ID + * @param approveStatus 审批状态(2-审批成功,3-审批失败) + * @param message 审批意见 + * @return 是否审批成功 + */ + Boolean approveWorkOrder(Long repairInstanceId, String approveStatus, String message); + + /** + * 主管确认维修结果 + * + * @param repairInstanceId 工单ID + * @param confirmResult 确认结果(1-确认完成) + * @param confirmUser 确认人 + * @return 是否确认成功 + */ + Boolean confirmRepairResult(Long repairInstanceId, String confirmResult, String confirmUser); } 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 3541a2f..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业务层处理 @@ -65,7 +67,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS private final IDmsInstanceFileService DmsInstanceFileService; - @DubboReference(timeout = 15000, retries = 1) + @DubboReference(timeout = 30000, retries = 2) private final RemoteWorkflowService remoteWorkflowService; private final DmsFaultInstanceActivityMapper dmsFaultInstanceActivityMapper; @@ -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); // 获取当前日期时间 @@ -185,20 +195,28 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS add.setBillsFaultCode(Seq.getId(Seq.dmsBillsFaultInstanceSeqType, Seq.dmsBillsFaultInstanceSeqCode)); // 设置报修状态为待维修 add.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR); + // 设置审批状态为待审批(按照PDA标准) + add.setApproveStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING); // 设置实例类型为手动录入 add.setInstanceType(DmsConstants.DMS_BILLS_FAULT_INSTANCE_TYPE_MAUAL); + // 【修复】工单创建时确认状态应该为null,不设置任何值 + add.setRepairConfirm(null); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setRepairInstanceId(add.getRepairInstanceId()); } - //FIXME:工作流相关 + //工作流相关:自动启动工作流 RemoteStartProcess remoteStartProcess = new RemoteStartProcess(); remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_FAULT_INSTANCE_WF_CODE); remoteStartProcess.setBusinessId(add.getRepairInstanceId().toString()); RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess); Long taskId = remoteStartProcessReturn.getTaskId(); + Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId(); + + // // 更新工作流实例ID + // add.setWfDefinitionId(processInstanceId); // ** 异步线程上下文传递【核心问题】 ** // 在主线程中,用户的登录信息(Token)是存放在一个叫 ThreadLocal 的"线程口袋"里的。 @@ -214,15 +232,38 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS try { // 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。 StpUtil.setTokenValue(tokenValue); - // 4. 【执行业务】: 现在子线程就像登录过一样,可以带着Token去调用其他需要权限的服务了。 - updateWorkFlow(add, taskId); + + // 4. 【延迟执行】: 稍微延迟,确保主事务完全提交 + Thread.sleep(100); + + // 5. 【重试机制】: 最多重试3次,每次间隔递增 + int maxRetries = 3; + for (int i = 0; i < maxRetries; i++) { + try { + // 执行业务:现在子线程就像登录过一样,可以带着Token去调用其他需要权限的服务了 + updateWorkFlow(add, taskId, processInstanceId); + log.info("异步工作流推进成功,repairInstanceId: {}, 重试次数: {}", add.getRepairInstanceId(), i); + break; // 成功则退出重试循环 + } catch (Exception retryException) { + log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}", + add.getRepairInstanceId(), i + 1, maxRetries, retryException.getMessage()); + + if (i == maxRetries - 1) { + // 最后一次重试失败,记录错误 + log.error("异步工作流推进最终失败,repairInstanceId: {}, 请手动处理", add.getRepairInstanceId(), retryException); + // TODO: 可以考虑记录到失败表,后续补偿处理 + } else { + // 等待后重试,递增延迟时间 + Thread.sleep((i + 1) * 1000); + } + } + } } catch (Exception e) { - // 简单记录错误,不影响主流程 - System.err.println("异步更新工作流失败,repairInstanceId: " + add.getRepairInstanceId() + ", 错误: " + e.getMessage()); - // 可以考虑记录到失败表,后续补偿处理 + log.error("异步更新工作流异常,repairInstanceId: {}", add.getRepairInstanceId(), e); } })); - // 创建故障实例活动对象 + + // 【重要修改】创建故障实例活动对象 - 只有PDA创建工单时才生成 DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); // 设置维修实例ID dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId()); @@ -238,11 +279,11 @@ 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); // 设置流程步骤顺序 dmsFaultInstanceActivity.setProcessStepOrder(1l); @@ -250,35 +291,405 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsFaultInstanceActivityMapper.insert(dmsFaultInstanceActivity); //存储图片 // 获取文件URL列表 - List fileUrls = add.getFileUrls(); + List fileUrls = bo.getFileUrls(); // 批量插入实例文件记录 batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId()); return flag; } + /** + * 审批故障报修工单 + * + * @param repairInstanceId 工单ID + * @param approveStatus 审批状态(2-审批成功,3-审批失败) + * @param message 审批意见 + * @return 是否审批成功 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public Boolean approveWorkOrder(Long repairInstanceId, String approveStatus, String message) { + // 查询工单信息 + DmsBillsFaultInstance workOrder = baseMapper.selectById(repairInstanceId); + if (workOrder == null) { + throw new ServiceException("工单不存在"); + } + + // 检查当前状态是否可以审批(必须是待审批状态) + if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING.equals(workOrder.getApproveStatus())) { + throw new ServiceException("工单当前状态不允许审批"); + } + + // 更新审批状态和工单状态 + workOrder.setApproveStatus(approveStatus); + + if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) { + // 审批通过:保持待维修状态 + workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR); + } else if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_REJECTED.equals(approveStatus)) { + // 审批拒绝:设置为维修完成状态(终止工单) + workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH); + } + + // 先更新工单状态,确保业务数据一致性 + boolean updateResult = baseMapper.updateById(workOrder) > 0; + + if (!updateResult) { + throw new ServiceException("工单状态更新失败"); + } + + // 业务状态更新成功后,再推进工作流 + if (workOrder.getWfDefinitionId() != null) { + try { + // 获取当前任务ID + Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(workOrder.getWfDefinitionId()); + if (currentTaskId != null) { + 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: {}", + repairInstanceId, approveStatus); + // 工作流推进失败不影响业务操作的成功 + } else { + log.info("审批工单成功,repairInstanceId: {}, approveStatus: {}", repairInstanceId, approveStatus); + } + } else { + log.warn("未找到当前活跃任务,跳过工作流推进,repairInstanceId: {}", repairInstanceId); + } + } catch (Exception e) { + log.error("工作流推进异常,repairInstanceId: {}, approveStatus: {}", repairInstanceId, approveStatus, e); + // 工作流推进失败不影响业务操作的成功,但需要记录日志 + } + } + + return updateResult; + } + + /** + * 开始维修 + * + * @param dmsFaultInstanceActivity 报修工单实例节点 + * @return 结果 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public int startRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { + // 根据维修实例ID查询故障实例信息 + DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId()); + if (dmsBillsFaultInstance == null) { + throw new ServiceException("工单不存在"); + } + + // 检查审批状态(按照PDA标准,只有状态为"2"审批成功才可以开始维修) + if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(dmsBillsFaultInstance.getApproveStatus())) { + throw new ServiceException("工单未审批通过,无法开始维修"); + } + + // 检查工单状态 + String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); + if (!dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) { + 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_REPAIRING); + // 设置实际开始时间 + dmsBillsFaultInstance.setRealBeginTime(currentDate); + + // 推进工作流 + if (dmsBillsFaultInstance.getWfDefinitionId() != null) { + Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId()); + if (currentTaskId != null) { + RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); + remoteCompleteTask.setTaskId(currentTaskId); + remoteCompleteTask.setMessage("开始维修"); + List messageTypes = new ArrayList<>(); + messageTypes.add("1"); // 站内信 + remoteCompleteTask.setMessageType(messageTypes); + remoteCompleteTask.setNotice("故障报修工单已开始维修,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); + boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); + if (!b) { + throw new ServiceException("工作流推进失败"); + } + } + } + + // 更新工单状态 + baseMapper.updateById(dmsBillsFaultInstance); + + // 设置维修实例活动记录 + dmsFaultInstanceActivity.setRepairInstanceId(dmsBillsFaultInstance.getRepairInstanceId()); + dmsFaultInstanceActivity.setMachineId(dmsBillsFaultInstance.getMachineId()); + dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_EXECUTING); + dmsFaultInstanceActivity.setProcessStepOrder(2L); + dmsFaultInstanceActivity.setStartTime(currentDate); + dmsFaultInstanceActivity.setHandleUserId(LoginHelper.getUserId()); + 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); + + return result ? 1 : 0; + } + + /** + * 完成维修 + * + * @param dmsFaultInstanceActivity 报修工单实例节点 + * @return 结果 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + 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 (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("文件上传失败"); + } + } + } + + // 更新 dms_bills_fault_instance 表 + DmsBillsFaultInstance instance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId()); + if (instance == null) { + throw new ServiceException("工单不存在: " + dmsFaultInstanceActivity.getRepairInstanceId()); + } + instance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH); + instance.setRealEndTime(new Date()); + instance.setRepairConfirm("0"); // 设置为待确认状态 + baseMapper.updateById(instance); + + // 推进工作流 + if (instance.getWfDefinitionId() != null) { + Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(instance.getWfDefinitionId()); + if (currentTaskId != null) { + RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); + remoteCompleteTask.setTaskId(currentTaskId); + remoteCompleteTask.setMessage("完成维修"); + List messageTypes = new ArrayList<>(); + messageTypes.add("1"); // 站内信 + remoteCompleteTask.setMessageType(messageTypes); + remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + instance.getBillsFaultCode()); + boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); + if (!b) { + throw new ServiceException("工作流推进失败"); + } + } + } + + return 1; + } + + /** + * 主管确认维修结果 + * + * @param repairInstanceId 工单ID + * @param confirmResult 确认结果(1-确认通过,2-确认不通过) + * @param confirmUser 确认人 + * @return 是否确认成功 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public Boolean confirmRepairResult(Long repairInstanceId, String confirmResult, String confirmUser) { + // 查询工单信息 + DmsBillsFaultInstance workOrder = baseMapper.selectById(repairInstanceId); + if (workOrder == null) { + throw new ServiceException("工单不存在"); + } + + // 检查当前状态是否可以确认 + if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH.equals(workOrder.getBillsStatus())) { + throw new ServiceException("工单尚未完成维修,无法确认"); + } + + if (!"0".equals(workOrder.getRepairConfirm())) { + throw new ServiceException("工单已经确认过了"); + } + + // 根据确认结果设置不同的业务状态 + if ("1".equals(confirmResult)) { + // 确认通过:完成工单 + workOrder.setRepairConfirm(confirmResult); + workOrder.setConfirmUser(confirmUser != null ? confirmUser : LoginHelper.getUsername()); + workOrder.setConfirmTime(new Date()); + } else { + // 确认不通过:返回到维修环节,重置相关状态 + workOrder.setRepairConfirm(confirmResult); + workOrder.setConfirmUser(confirmUser != null ? confirmUser : LoginHelper.getUsername()); + workOrder.setConfirmTime(new Date()); + // 重置工单状态为待维修,让维修人员重新维修 + workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR); + // 清空实际结束时间,因为需要重新维修 + workOrder.setRealEndTime(null); + } + + // 推进工作流:业务状态和工作流分支变量分离处理 + if (workOrder.getWfDefinitionId() != null) { + Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(workOrder.getWfDefinitionId()); + if (currentTaskId != null) { + RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); + remoteCompleteTask.setTaskId(currentTaskId); + + // 设置工作流变量 - 用于互斥网关判断分支走向 + Map variables = new HashMap<>(); + if ("1".equals(confirmResult)) { + // 确认通过:工作流分支变量=0(走确认通过分支,结束流程) + remoteCompleteTask.setMessage("主管确认通过,工单完成"); + variables.put("repairConfirm", "0"); + } else { + // 确认不通过:工作流分支变量=1(走确认不通过分支,返回维修环节) + 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: {}", + repairInstanceId, confirmResult); + } else { + log.info("主管确认完成,工作流推进成功,repairInstanceId: {}, confirmResult: {}", + repairInstanceId, confirmResult); + } + } + } + + return baseMapper.updateById(workOrder) > 0; + } /** * 更新工作流 - * @param dmsBillsFaultInstance + * @param dmsBillsFaultInstance 工单实例 * @param taskId 任务ID + * @param processInstanceId 流程实例ID * @return 是否更新成功 */ - private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId){ - dmsBillsFaultInstance.setWfDefinitionId(taskId); + private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId, Long processInstanceId){ + try { + // 1. 首先更新工单的工作流实例ID,确保关联关系建立 + dmsBillsFaultInstance.setWfDefinitionId(processInstanceId); + boolean updateResult = baseMapper.updateById(dmsBillsFaultInstance) > 0; + if (!updateResult) { + log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}", + dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId); + return false; + } + + log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}", + dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId); + + // 2. 然后推进工作流(工单创建后自动推进到审批节点) RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); - // 必填字段 remoteCompleteTask.setTaskId(taskId); - remoteCompleteTask.setMessage("自动推进"); - // 关键:设置messageType为非null的List(解决原始错误) + remoteCompleteTask.setMessage("工单创建完成,自动推进到审批节点"); + + // 设置消息类型 List messageTypes = new ArrayList<>(); - messageTypes.add("system"); // 系统消息 + messageTypes.add("1"); // 站内信 remoteCompleteTask.setMessageType(messageTypes); - boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); - if (!b) { + + // 设置消息通知内容 + 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: {}", + dmsBillsFaultInstance.getRepairInstanceId(), taskId); + return false; + } + + log.info("工作流推进成功,repairInstanceId: {}, taskId: {}", + dmsBillsFaultInstance.getRepairInstanceId(), taskId); + + return true; + + } catch (Exception e) { + log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}", + dmsBillsFaultInstance.getRepairInstanceId(), taskId, processInstanceId, e); return false; - }else { - return baseMapper.updateById(dmsBillsFaultInstance) > 0; } } @@ -361,44 +772,101 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS */ @Override public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) { - // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 - DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); - // 创建实例文件查询对象 - 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()); + } } @@ -481,201 +949,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS } } - /** - * 开始维修 - * - * @param dmsFaultInstanceActivity 报修工单实例节点 - * @return 结果 - */ - @Override - @GlobalTransactional(rollbackFor = Exception.class) - public int startRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { - // 定义一个布尔变量b,用于存储更新结果 - Boolean b = false; - - - // 根据维修实例ID查询故障实例信息 - DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper - .selectFaultInstanceJoinFirstById(dmsFaultInstanceActivity.getRepairInstanceId());//join 第一步activity - // 获取工单状态 - String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); - // 如果工单状态为已完成,抛出异常 - if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH)) {//维修完成 - throw new ServiceException("已经维修完成"); - } - // 获取当前日期和登录用户名 - Date currentDate = new Date(); - String userName = LoginHelper.getLoginUser()==null ? LoginHelper.getUsername() :LoginHelper.getLoginUser().getNickname(); - - // 如果工单状态为待维修 - if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) {//待维修 - // 设置工单状态为维修中 - dmsBillsFaultInstance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING); - // 设置实际开始时间 - dmsBillsFaultInstance.setRealBeginTime(currentDate); - //启动工作流 - Long taskId = getOrCreateTaskId(dmsBillsFaultInstance); - - // ** 异步线程上下文传递【核心问题】 ** - // 在主线程中,用户的登录信息(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(dmsBillsFaultInstance, taskId); - } catch (Exception e) { - // 简单记录错误,不影响主流程 - System.err.println("异步更新工作流失败,repairInstanceId: " + dmsBillsFaultInstance.getRepairInstanceId() + ", 错误: " + e.getMessage()); - // 可以考虑记录到失败表,后续补偿处理 - } - })); - - - // 设置维修实例ID - dmsFaultInstanceActivity.setRepairInstanceId(dmsBillsFaultInstance.getRepairInstanceId()); - // FIXME: 工作流相关代码(暂时注释掉) -// dmsFaultInstanceActivity.setProcessActivityId(WfConstants.WF_BILLS_FAULT_INSTANCE_PROCESS_ACTIVITY_SECOND_ID); - - // 设置机器ID - dmsFaultInstanceActivity.setMachineId(dmsBillsFaultInstance.getMachineId()); - // 设置处理状态为执行中 - dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_EXECUTING); - // 设置步骤顺序 - dmsFaultInstanceActivity.setProcessStepOrder(2L); - // 设置开始时间 - dmsFaultInstanceActivity.setStartTime(currentDate); - // 设置处理用户ID - dmsFaultInstanceActivity.setHandleUserId(LoginHelper.getUserId()); - // 设置处理人名称 - dmsFaultInstanceActivity.setHandleBy(userName); - // 设置处理时间 - dmsFaultInstanceActivity.setHandleTime(currentDate); - - // 插入新的故障实例活动记录 - b = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity); - - // 创建第一个实例活动对象并设置其属性 - DmsFaultInstanceActivityBo firstInstanceActivity = new DmsFaultInstanceActivityBo(); - firstInstanceActivity.setInstanceActivityId(dmsBillsFaultInstance.getInstanceActivityId()); - // 设置处理状态为已完成 - firstInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH); - // 设置结束时间 - firstInstanceActivity.setEndTime(currentDate); - // FIXME: 需重新梳理代码dmsFaultInstanceActivityService - // 更新第一个实例活动记录 - dmsFaultInstanceActivityService.updateByBo(firstInstanceActivity); - - } else {// 如果工单状态为维修中 - // 更新故障实例活动记录 - b = dmsFaultInstanceActivityService.updateByBo(dmsFaultInstanceActivity); - } - - // 返回结果1表示成功 - return b ? 1 : 0; - } - - // startRepair方法内提取的获取或创建taskId的方法 - private Long getOrCreateTaskId(DmsBillsFaultInstance dmsBillsFaultInstance) { - Long taskId = dmsBillsFaultInstance.getWfDefinitionId(); - if (StringUtils.isNull(taskId)) { - // 启动工作流 - RemoteStartProcess startProcess = new RemoteStartProcess(); - startProcess.setFlowCode(DmsConstants.DMS_BILLS_FAULT_INSTANCE_WF_CODE); - String businessId = dmsBillsFaultInstance.getRepairInstanceId().toString(); - startProcess.setBusinessId(businessId); - RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess); - taskId = remoteStartProcessReturn.getTaskId(); - if (StringUtils.isNull(taskId)) { - throw new ServiceException("流程启动失败"); - } - } - return taskId; - } - - - - - /** - * 完成维修 - * - * @param dmsFaultInstanceActivity 报修工单实例节点 - * @return 结果 - */ - @Override - @GlobalTransactional(rollbackFor = Exception.class) - public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { - // 批量插入实例的附件文件信息 - batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(),dmsFaultInstanceActivity.getInstanceActivityId()); - // 获取需要插入的备件列表 - List parts = dmsFaultInstanceActivity.getParts(); - // 如果备件列表不为空,则设置每个备件的故障ID并插入数据库 - if (!CollectionUtils.isEmpty(parts)){ - for (DmsFaultComponentsParts part : parts) { - part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId()); - } - dmsFaultInstanceActivityMapper.insertParts(parts); - } - // 根据维修实例ID查询对应的工单实例 - DmsBillsFaultInstanceVo dmsBillsFaultInstance = this. - queryById(dmsFaultInstanceActivity.getRepairInstanceId()); - - // 获取当前工单的状态 - String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); - // 如果状态为已完成,抛出异常提示已经维修完成 - if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH)) {//维修完成 - throw new ServiceException("已经维修完成"); - } - // 如果状态为待维修,抛出异常提示请先开始维修 - if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) {//待维修 - 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 faultInstance = MapstructUtils.convert(dmsBillsFaultInstance, DmsBillsFaultInstance.class); - - if(StringUtils.isNull(dmsBillsFaultInstance.getWfDefinitionId())){ - throw new ServiceException("流程未启动"); - }else{ - //FIXME:完成第一步,待测试待完善 - RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); - remoteCompleteTask.setTaskId(dmsBillsFaultInstance.getWfDefinitionId()); - remoteCompleteTask.setMessage("同意"); - remoteWorkflowService.completeTask(remoteCompleteTask); - - baseMapper.updateById(faultInstance); - - // 设置工单活动状态为已完成,并记录结束时间和维修人员 - 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; - } - - } - - - public void batchInsertInstanceAfterFiles(List fileUrls, Long instanceActivityId) { // 判断文件URL列表是否不为空且非空集合 if (fileUrls != null && !fileUrls.isEmpty()) { 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..3bbaf11 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"); // 系统消息 - + messageTypes.add("1"); // 系统消息 + // 【工作流推进】完成当前活跃任务 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("1"); // 站内信 + 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("1"); // 站内信 + 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("1"); // 站内信 + 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); diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintDetailProjectServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintDetailProjectServiceImpl.java index d7d8cca..59a97d7 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintDetailProjectServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintDetailProjectServiceImpl.java @@ -65,6 +65,25 @@ public class DmsBillsMaintDetailProjectServiceImpl implements IDmsBillsMaintDeta */ @Override public List queryList(DmsBillsMaintDetailProjectBo bo) { + // 【修复保养项目名称为空问题】优先使用关联查询方法获取完整项目信息 + if (bo.getBillsMaintDetailId() != null) { + // 转换为实体对象用于查询 + DmsBillsMaintDetailProject queryEntity = MapstructUtils.convert(bo, DmsBillsMaintDetailProject.class); + queryEntity.setBillsMaintDetailId(bo.getBillsMaintDetailId()); + queryEntity.setMaintDetailProjectId(bo.getMaintDetailProjectId()); + queryEntity.setMaintProjectId(bo.getMaintProjectId()); + queryEntity.setMaintProjectStatus(bo.getMaintProjectStatus()); + + // 使用关联查询方法,确保获取到项目名称 + List result = baseMapper.selectDmsBillsMaintDetailProjectWithProjectName(queryEntity); + + // 如果关联查询有结果,直接返回 + if (result != null && !result.isEmpty()) { + return result; + } + } + + // 降级到默认查询方法 MPJLambdaWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } @@ -132,6 +151,6 @@ public class DmsBillsMaintDetailProjectServiceImpl implements IDmsBillsMaintDeta if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteByIds(ids) > 0; + return baseMapper.deleteBatchIds(ids) > 0; } } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java index 492f809..2ea100d 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java @@ -17,6 +17,7 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.uuid.Seq; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.dms.domain.*; import org.dromara.dms.domain.bo.DmsBillsMaintDetailBo; import org.dromara.dms.domain.bo.DmsBillsMaintDetailProjectBo; @@ -322,11 +323,11 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_MAINTING); // 设置实际开始保养时间为当前时间 dmsBillsMaintInstance.setRealBeginTime(currentDate); - + // 【关键修复】检查工作流是否已经启动 - 先重新查询最新数据 // 重新查询保养实例,确保获取到最新的工作流ID(避免使用缓存中的旧数据) DmsBillsMaintInstance latestInstance = baseMapper.selectById(dmsBillsMaintInstance.getMaintInstanceId()); - + if (latestInstance != null && latestInstance.getWfDefinitionId() == null) { // 【工作流启动】创建远程启动流程对象 RemoteStartProcess startProcess = new RemoteStartProcess(); @@ -336,22 +337,22 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS 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(); @@ -385,21 +386,22 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS } } } else if (latestInstance != null) { + // 【关键修复】工作流已启动,根据流程实例ID查询当前活跃任务 // 使用最新查询到的工作流ID Long processInstanceId = latestInstance.getWfDefinitionId(); dmsBillsMaintInstance.setWfDefinitionId(processInstanceId); // 同步更新到当前对象 - - log.info("保养工单 {} 工作流已启动,流程实例ID: {},查询当前活跃任务", + + log.info("保养工单 {} 工作流已启动,流程实例ID: {},查询当前活跃任务", dmsBillsMaintInstance.getMaintInstanceId(), processInstanceId); - + // 根据流程实例ID获取当前活跃任务ID Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId); - + if (currentActiveTaskId != null) { - log.info("保养工单 {} 找到当前活跃任务ID: {}", + log.info("保养工单 {} 找到当前活跃任务ID: {}", dmsBillsMaintInstance.getMaintInstanceId(), currentActiveTaskId); - + // 直接推进工作流 RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(currentActiveTaskId); @@ -408,7 +410,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS List messageTypes = new ArrayList<>(); messageTypes.add("user"); // 用户操作 remoteCompleteTask.setMessageType(messageTypes); - + boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask); if (!taskCompleted) { log.error("保养工作流推进失败,任务ID: {}", currentActiveTaskId); @@ -429,13 +431,15 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS // 更新保养明细信息 dmsBillsMaintDetailMapper.updateById(dmsBillsMaintDetail); + // 更新保养工单信息 + baseMapper.updateById(dmsBillsMaintInstance); } -// else {//保养中 -// // 更新人不为空,则设置更新人为当前用户,更新时间为当前时间 -// dmsBillsMaintDetail.setUpdateBy(userName); -// dmsBillsMaintDetail.setUpdateTime(currentDate); -// dmsBillsMaintDetailMapper.updateDmsBillsMaintDetail(dmsBillsMaintDetail); -// } + else {//保养中 + // 更新人不为空,则设置更新人为当前用户,更新时间为当前时间 + dmsBillsMaintDetail.setUpdateBy(LoginHelper.getUserId()); + dmsBillsMaintDetail.setUpdateTime(currentDate); + dmsBillsMaintDetailMapper.updateById(dmsBillsMaintDetail); + } // 创建查询保养明细项目的对象 DmsBillsMaintDetailProjectBo queryBillsMaintDetailProject = new DmsBillsMaintDetailProjectBo(); @@ -445,13 +449,13 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS List dmsBillsMaintDetailProjects = dmsBillsMaintInstanceProjectService.queryList(queryBillsMaintDetailProject); // 设置保养明细的项目列表 dmsBillsMaintDetail.setDmsBillsMaintDetailProjectList(dmsBillsMaintDetailProjects); - + // 【关键修复】重新查询完整的保养明细信息,包含关联字段 // 使用关联查询方法获取完整的保养明细信息,包括设备名称、保养部位名称等 DmsBillsMaintDetail queryDetail = new DmsBillsMaintDetail(); queryDetail.setBillsMaintDetailId(dmsBillsMaintDetail.getBillsMaintDetailId()); List detailVoList = dmsBillsMaintDetailMapper.selectDmsBillsMaintDetailJoinList(queryDetail); - + if (!detailVoList.isEmpty()) { DmsBillsMaintDetailVo detailVo = detailVoList.get(0); // 将关联查询到的字段赋值给返回对象 @@ -462,7 +466,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS dmsBillsMaintDetail.setMaintProtocol(detailVo.getMaintProtocol()); dmsBillsMaintDetail.setMaintOperationDescription(detailVo.getMaintOperationDescription()); } - + // 返回更新后的保养明细对象 return dmsBillsMaintDetail; } @@ -483,7 +487,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS log.error("保养工单工作流信息更新失败,maintInstanceId: {}", dmsBillsMaintInstance.getMaintInstanceId()); return false; } - + // 【自动推进工作流】完成第一步任务,推进到下一步 RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); // 设置任务ID @@ -500,7 +504,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS if (!b){ return false; }else{ - // 更新保养实例信息 + // 更新保养工单信息 int i = baseMapper.updateById(dmsBillsMaintInstance); return i > 0; } @@ -517,6 +521,9 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS @Override @GlobalTransactional(rollbackFor = Exception.class) public int completeMaint(DmsBillsMaintDetail dmsBillsMaintDetail) { + if(!dmsBillsMaintDetail.getMaintStatus().equals(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_MAINTING)){ + throw new ServiceException("非保养中状态,不能完成保养"); + } // 获取保养工单明细中的项目列表 List dmsBillsMaintDetailProjects = dmsBillsMaintDetail.getDmsBillsMaintDetailProjectList(); // 获取保养实例ID @@ -564,7 +571,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS // 而是根据业务ID动态获取当前活跃的任务ID String businessId = maintInstanceId.toString(); Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId); - + if (currentActiveTaskId != null) { RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); remoteCompleteTask.setTaskId(currentActiveTaskId); // 使用当前活跃任务ID 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/java/org/dromara/dms/service/impl/DmsPlanInspectServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanInspectServiceImpl.java index 2e7dac2..ce426eb 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanInspectServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanInspectServiceImpl.java @@ -203,7 +203,7 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService { .setExecutorInfo("stanceInspect")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 @@ -297,7 +297,7 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService { .setExecutorInfo("stanceInspect")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanLubeServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanLubeServiceImpl.java index 9830c74..f38ad70 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanLubeServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanLubeServiceImpl.java @@ -188,7 +188,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService { .setExecutorInfo("stanceLube")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 @@ -251,7 +251,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService { .setExecutorInfo("stanceLube")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 @@ -274,7 +274,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService { .setExecutorInfo("stanceLube")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanMaintServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanMaintServiceImpl.java index c06f471..6f91b12 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanMaintServiceImpl.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsPlanMaintServiceImpl.java @@ -214,7 +214,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService { .setExecutorInfo("stanceMaint")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 @@ -303,7 +303,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService { .setExecutorInfo("stanceMaint")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 @@ -323,7 +323,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService { .setExecutorInfo("stanceMaint")//执行器名称 .setExecutorTimeout(30)//执行超时时间 .setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行 - .setMaxRetryTimes(2)//最大重试次数 + .setMaxRetryTimes(0)//最大重试次数 .setTriggerType(TriggerTypeEnum.CRON)//触发器类型:cron .setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式 .setRetryInterval(10)//重试间隔时长 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 f5ae816..cd583f7 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 @@ -38,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -129,15 +129,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" dfia.repair_content repair_content, dfia.protected_method protected_method, dfia.repairer repairer, - dfia.repair_confirm repair_confirm, + dbfi.repair_confirm repair_confirm, dfia.confirm_time confirm_time,dfia.components_parts_id components_parts_id 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} @@ -222,7 +227,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + and dbmdp.maint_detail_project_id = #{maintDetailProjectId} + and dbmdp.bills_maint_detail_id = #{billsMaintDetailId} + and dbmdp.maint_project_id = #{maintProjectId} + and dbmdp.maint_project_status = #{maintProjectStatus} + + order by dbmdp.create_time desc + + diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsFaultInstanceActivityMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsFaultInstanceActivityMapper.xml index f09cf01..cf92351 100644 --- a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsFaultInstanceActivityMapper.xml +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsFaultInstanceActivityMapper.xml @@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into dms_fault_compents_parts(fault_id,part_name,part_specifications,amount) + insert into dms_fault_components_parts(repair_instance_id,part_name,part_specifications,amount) values (#{item.faultId},#{item.partName},#{item.partSpecifications},#{item.amount}) diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanInspectMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanInspectMapper.xml index 6f22c0c..74b76cb 100644 --- a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanInspectMapper.xml +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanInspectMapper.xml @@ -30,9 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select a.plan_inspect_id, a.plan_inspect_code, a.plan_inspect_name, a.inspect_type, a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id, a.performer, a.remark, a.create_by, a.create_time, a.update_by, a.update_time, - b.cron_expression +-- '' as cron_expression from dms_plan_inspect a - left join sys_job b on a.job_id = b.job_id where a.plan_inspect_id = #{planInspectId} @@ -42,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id, a.performer, a.remark, a.create_by, a.create_time, a.update_by, a.update_time - from dms_plan_inspect a left join sys_job b on a.job_id = b.job_id + from dms_plan_inspect a where a.plan_inspect_code = #{planInspectCode} diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanLubeMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanLubeMapper.xml index 324cf02..66b53df 100644 --- a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanLubeMapper.xml +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsPlanLubeMapper.xml @@ -72,10 +72,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/BaseToolingTypeController.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/BaseToolingTypeController.java new file mode 100644 index 0000000..ae45a92 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/BaseToolingTypeController.java @@ -0,0 +1,116 @@ +package org.dromara.mes.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.mes.domain.vo.BaseToolingTypeVo; +import org.dromara.mes.domain.bo.BaseToolingTypeBo; +import org.dromara.mes.service.IBaseToolingTypeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 载具工装类型 + * 前端访问路由地址为:/mes/toolingType + * + * @author Yinq + * @date 2025-07-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/toolingType") +public class BaseToolingTypeController extends BaseController { + + private final IBaseToolingTypeService baseToolingTypeService; + + /** + * 查询载具工装类型列表 + */ + @SaCheckPermission("mes:toolingType:list") + @GetMapping("/list") + public TableDataInfo list(BaseToolingTypeBo bo, PageQuery pageQuery) { + return baseToolingTypeService.queryPageList(bo, pageQuery); + } + + /** + * 导出载具工装类型列表 + */ + @SaCheckPermission("mes:toolingType:export") + @Log(title = "载具工装类型", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BaseToolingTypeBo bo, HttpServletResponse response) { + List list = baseToolingTypeService.queryList(bo); + ExcelUtil.exportExcel(list, "载具工装类型", BaseToolingTypeVo.class, response); + } + + /** + * 获取载具工装类型详细信息 + * + * @param toolingTypeId 主键 + */ + @SaCheckPermission("mes:toolingType:query") + @GetMapping("/{toolingTypeId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long toolingTypeId) { + return R.ok(baseToolingTypeService.queryById(toolingTypeId)); + } + + /** + * 新增载具工装类型 + */ + @SaCheckPermission("mes:toolingType:add") + @Log(title = "载具工装类型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BaseToolingTypeBo bo) { + return toAjax(baseToolingTypeService.insertByBo(bo)); + } + + /** + * 修改载具工装类型 + */ + @SaCheckPermission("mes:toolingType:edit") + @Log(title = "载具工装类型", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BaseToolingTypeBo bo) { + return toAjax(baseToolingTypeService.updateByBo(bo)); + } + + /** + * 删除载具工装类型 + * + * @param toolingTypeIds 主键串 + */ + @SaCheckPermission("mes:toolingType:remove") + @Log(title = "载具工装类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{toolingTypeIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] toolingTypeIds) { + return toAjax(baseToolingTypeService.deleteWithValidByIds(List.of(toolingTypeIds), true)); + } + + + /** + * 下拉框查询载具工装类型列表 + */ + @GetMapping("/getBaseToolingTypeList") + public R> getBaseToolingTypeList(BaseToolingTypeBo bo) { + List list = baseToolingTypeService.queryList(bo); + return R.ok(list); + } +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseShiftInfo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseShiftInfo.java index 2cdb4ef..6b94791 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseShiftInfo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseShiftInfo.java @@ -67,6 +67,11 @@ public class BaseShiftInfo extends TenantEntity { */ private String activeFlag; + /** + * 班制类型(2两班 3三班) + */ + private String classType; + /** * 删除标志(0代表存在 2代表删除) */ diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingInfo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingInfo.java index 57da41c..b78b92c 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingInfo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingInfo.java @@ -1,9 +1,6 @@ package org.dromara.mes.domain; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.tenant.core.TenantEntity; @@ -41,11 +38,6 @@ public class BaseToolingInfo extends TenantEntity { */ private String toolingName; - /** - * 工装类型(用字典) - */ - private String toolingTypeCode; - /** * 工装规格(用字典) */ @@ -81,9 +73,21 @@ public class BaseToolingInfo extends TenantEntity { */ private String activeFlag; + /** + * 工装类型ID + */ + private Long toolingTypeId; + /** * 删除标志(0代表存在 2代表删除) */ @TableLogic private String delFlag; + + /** + * 工装类型名称 + */ + @TableField(exist = false) + private String toolingTypeName; + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingType.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingType.java new file mode 100644 index 0000000..7a83c2f --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingType.java @@ -0,0 +1,69 @@ +package org.dromara.mes.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.List; + +/** + * 载具工装类型对象 base_tooling_type + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("base_tooling_type") +public class BaseToolingType extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识 + */ + @TableId(value = "tooling_type_id", type = IdType.AUTO) + private Long toolingTypeId; + + /** + * 工装类型编号 + */ + private String toolingTypeCode; + + /** + * 工装类型名称 + */ + private String toolingTypeName; + + /** + * 工装类型规格 + */ + private String toolingSpecCode; + + /** + * 标准使用次数/秒 + */ + private Long standardLife; + + /** + * 标准重量(kg) + */ + private Long standardWeight; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + @TableField(exist = false) + private List typeRelationList; +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingTypeRelation.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingTypeRelation.java new file mode 100644 index 0000000..9b5d904 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseToolingTypeRelation.java @@ -0,0 +1,56 @@ +package org.dromara.mes.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 载具工装类型关联信息对象 base_tooling_type_relation + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("base_tooling_type_relation") +public class BaseToolingTypeRelation extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识 + */ + @TableId(value = "relation_id", type = IdType.AUTO) + private Long relationId; + + /** + * 工装类型ID + */ + private Long toolingTypeId; + + /** + * 关联信息类型(1物料 2工序) + */ + private String relationInfoType; + + /** + * 关联信息ID + */ + private Long relationInfoId; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 物料名称 + */ + @TableField(exist = false) + private String materialName; +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdBaseMachineInfo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdBaseMachineInfo.java index 49f9a1b..d3b9f02 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdBaseMachineInfo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdBaseMachineInfo.java @@ -122,6 +122,11 @@ public class ProdBaseMachineInfo extends TenantEntity { */ private Long requestInterval; + /** + * 班制类型(2两班 3三班) + */ + private String classType; + /** * 删除标志(0代表存在 2代表删除) */ @@ -144,4 +149,5 @@ public class ProdBaseMachineInfo extends TenantEntity { */ @TableField(exist = false) private String deviceModeName; + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseShiftInfoBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseShiftInfoBo.java index 444b1be..e4caa92 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseShiftInfoBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseShiftInfoBo.java @@ -74,5 +74,9 @@ public class BaseShiftInfoBo extends BaseEntity { /* @NotBlank(message = "激活标识(1是 0否)不能为空", groups = { AddGroup.class, EditGroup.class })*/ private String activeFlag; - + /** + * 班制类型(2两班 3三班) + */ + @NotBlank(message = "班制类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String classType; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingInfoBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingInfoBo.java index 79f4dee..1b3684b 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingInfoBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingInfoBo.java @@ -74,5 +74,14 @@ public class BaseToolingInfoBo extends BaseEntity { */ private String activeFlag; + /** + * 工装类型ID + */ + private Long toolingTypeId; + + /** + * 工装类型名称 + */ + private String toolingTypeName; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeBo.java new file mode 100644 index 0000000..3ee01ad --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeBo.java @@ -0,0 +1,66 @@ +package org.dromara.mes.domain.bo; + +import org.dromara.mes.domain.BaseToolingType; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import org.dromara.mes.domain.BaseToolingTypeRelation; + +import java.util.List; + +/** + * 载具工装类型业务对象 base_tooling_type + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BaseToolingType.class, reverseConvertGenerate = false) +public class BaseToolingTypeBo extends BaseEntity { + + /** + * 主键标识 + */ + private Long toolingTypeId; + + /** + * 工装类型编号 + */ + @NotBlank(message = "工装类型编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String toolingTypeCode; + + /** + * 工装类型名称 + */ + @NotBlank(message = "工装类型名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String toolingTypeName; + + /** + * 工装类型规格 + */ + private String toolingSpecCode; + + /** + * 标准使用次数/秒 + */ + private Long standardLife; + + /** + * 标准重量(kg) + */ + private Long standardWeight; + + /** + * 备注 + */ + private String remark; + + private List typeRelationList; + + private List processList; +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeRelationBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeRelationBo.java new file mode 100644 index 0000000..70be4ab --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseToolingTypeRelationBo.java @@ -0,0 +1,47 @@ +package org.dromara.mes.domain.bo; + +import org.dromara.mes.domain.BaseToolingTypeRelation; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 载具工装类型关联信息业务对象 base_tooling_type_relation + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BaseToolingTypeRelation.class, reverseConvertGenerate = false) +public class BaseToolingTypeRelationBo extends BaseEntity { + + /** + * 主键标识 + */ + private Long relationId; + + /** + * 工装类型ID + */ + @NotNull(message = "工装类型ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long toolingTypeId; + + /** + * 关联信息类型(1物料 2工序) + */ + @NotBlank(message = "关联信息类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String relationInfoType; + + /** + * 关联信息ID + */ + @NotNull(message = "关联信息ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long relationInfoId; + + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdBaseMachineInfoBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdBaseMachineInfoBo.java index bc7c754..ab7d7c4 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdBaseMachineInfoBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdBaseMachineInfoBo.java @@ -145,5 +145,11 @@ public class ProdBaseMachineInfoBo extends BaseEntity { */ private String instockType; + /** + * 班制类型(2两班 3三班) + */ + @NotBlank(message = "班制类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String classType; + private List baseMachineProcessList; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseShiftInfoVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseShiftInfoVo.java index cbd0953..9469adc 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseShiftInfoVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseShiftInfoVo.java @@ -122,5 +122,10 @@ public class BaseShiftInfoVo implements Serializable { @ExcelProperty(value = "更新时间") private Date updateTime; - + /** + * 班制类型(2两班 3三班) + */ + @ExcelProperty(value = "班制类型(2两班 3三班)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "mes_class_type") + private String classType; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingInfoVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingInfoVo.java index 28763dd..3b4d371 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingInfoVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingInfoVo.java @@ -2,6 +2,7 @@ package org.dromara.mes.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; @@ -53,13 +54,6 @@ public class BaseToolingInfoVo implements Serializable { @ExcelProperty(value = "工装名称") private String toolingName; - /** - * 工装类型(用字典) - */ - @ExcelProperty(value = "工装类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "tooling_type_code") - private String toolingTypeCode; - /** * 工装规格(用字典) */ @@ -133,5 +127,11 @@ public class BaseToolingInfoVo implements Serializable { @ExcelProperty(value = "更新时间") private Date updateTime; + /** + * 工装类型名称 + */ + @ExcelProperty(value = "工装类型名称") + private String toolingTypeName; + private Long toolingTypeId; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeRelationVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeRelationVo.java new file mode 100644 index 0000000..fe9f5be --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeRelationVo.java @@ -0,0 +1,56 @@ +package org.dromara.mes.domain.vo; + +import org.dromara.mes.domain.BaseToolingTypeRelation; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 载具工装类型关联信息视图对象 base_tooling_type_relation + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BaseToolingTypeRelation.class) +public class BaseToolingTypeRelationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识 + */ + @ExcelProperty(value = "主键标识") + private Long relationId; + + /** + * 工装类型ID + */ + @ExcelProperty(value = "工装类型ID") + private Long toolingTypeId; + + /** + * 关联信息类型(1物料 2工序) + */ + @ExcelProperty(value = "关联信息类型(1物料 2工序)") + private String relationInfoType; + + /** + * 关联信息ID + */ + @ExcelProperty(value = "关联信息ID") + private Long relationInfoId; + + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeVo.java new file mode 100644 index 0000000..53a2575 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseToolingTypeVo.java @@ -0,0 +1,76 @@ +package org.dromara.mes.domain.vo; + +import org.dromara.mes.domain.BaseToolingType; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.mes.domain.BaseToolingTypeRelation; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 载具工装类型视图对象 base_tooling_type + * + * @author Yinq + * @date 2025-07-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BaseToolingType.class) +public class BaseToolingTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识 + */ + @ExcelProperty(value = "主键标识") + private Long toolingTypeId; + + /** + * 工装类型编号 + */ + @ExcelProperty(value = "工装类型编号") + private String toolingTypeCode; + + /** + * 工装类型名称 + */ + @ExcelProperty(value = "工装类型名称") + private String toolingTypeName; + + /** + * 工装类型规格 + */ + @ExcelProperty(value = "工装类型规格") + private String toolingSpecCode; + + /** + * 标准使用次数/秒 + */ + @ExcelProperty(value = "标准使用次数/秒") + private Long standardLife; + + /** + * 标准重量(kg) + */ + @ExcelProperty(value = "标准重量(kg)") + private Long standardWeight; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + + private List typeRelationList; + + private List processList; + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdBaseMachineInfoVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdBaseMachineInfoVo.java index bdbaae8..4283aec 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdBaseMachineInfoVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdBaseMachineInfoVo.java @@ -197,6 +197,13 @@ public class ProdBaseMachineInfoVo implements Serializable { @ExcelProperty(value = "设备模型名称") private String deviceModeName; + /** + * 班制类型(2两班 3三班) + */ + @ExcelProperty(value = "班制类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "mes_class_type") + private String classType; + /** * 入库类型(1直接入库 2扫描入库) */ diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdPlanInfoVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdPlanInfoVo.java index 0e9471c..6bcab8c 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdPlanInfoVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdPlanInfoVo.java @@ -255,4 +255,9 @@ public class ProdPlanInfoVo implements Serializable { @ExcelProperty(value = "班次名称") private String shiftName;// + /** + * 单位名称 + */ + @ExcelProperty(value = "单位名称") + private String unitName; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeMapper.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeMapper.java new file mode 100644 index 0000000..d3d4dd3 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mes.mapper; + +import org.dromara.mes.domain.BaseToolingType; +import org.dromara.mes.domain.vo.BaseToolingTypeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 载具工装类型Mapper接口 + * + * @author Yinq + * @date 2025-07-03 + */ +public interface BaseToolingTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeRelationMapper.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeRelationMapper.java new file mode 100644 index 0000000..ff5ebbc --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/BaseToolingTypeRelationMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mes.mapper; + +import org.dromara.mes.domain.BaseToolingTypeRelation; +import org.dromara.mes.domain.vo.BaseToolingTypeRelationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 载具工装类型关联信息Mapper接口 + * + * @author Yinq + * @date 2025-07-03 + */ +public interface BaseToolingTypeRelationMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeRelationService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeRelationService.java new file mode 100644 index 0000000..c6f6ba2 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeRelationService.java @@ -0,0 +1,69 @@ +package org.dromara.mes.service; + +import org.dromara.mes.domain.BaseToolingTypeRelation; +import org.dromara.mes.domain.vo.BaseToolingTypeRelationVo; +import org.dromara.mes.domain.bo.BaseToolingTypeRelationBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 载具工装类型关联信息Service接口 + * + * @author Yinq + * @date 2025-07-03 + */ +public interface IBaseToolingTypeRelationService { + + /** + * 查询载具工装类型关联信息 + * + * @param relationId 主键 + * @return 载具工装类型关联信息 + */ + BaseToolingTypeRelationVo queryById(Long relationId); + + /** + * 分页查询载具工装类型关联信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 载具工装类型关联信息分页列表 + */ + TableDataInfo queryPageList(BaseToolingTypeRelationBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的载具工装类型关联信息列表 + * + * @param bo 查询条件 + * @return 载具工装类型关联信息列表 + */ + List queryList(BaseToolingTypeRelationBo bo); + + /** + * 新增载具工装类型关联信息 + * + * @param bo 载具工装类型关联信息 + * @return 是否新增成功 + */ + Boolean insertByBo(BaseToolingTypeRelationBo bo); + + /** + * 修改载具工装类型关联信息 + * + * @param bo 载具工装类型关联信息 + * @return 是否修改成功 + */ + Boolean updateByBo(BaseToolingTypeRelationBo bo); + + /** + * 校验并批量删除载具工装类型关联信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeService.java new file mode 100644 index 0000000..e94ab03 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IBaseToolingTypeService.java @@ -0,0 +1,69 @@ +package org.dromara.mes.service; + +import org.dromara.mes.domain.BaseToolingType; +import org.dromara.mes.domain.vo.BaseToolingTypeVo; +import org.dromara.mes.domain.bo.BaseToolingTypeBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 载具工装类型Service接口 + * + * @author Yinq + * @date 2025-07-03 + */ +public interface IBaseToolingTypeService { + + /** + * 查询载具工装类型 + * + * @param toolingTypeId 主键 + * @return 载具工装类型 + */ + BaseToolingTypeVo queryById(Long toolingTypeId); + + /** + * 分页查询载具工装类型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 载具工装类型分页列表 + */ + TableDataInfo queryPageList(BaseToolingTypeBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的载具工装类型列表 + * + * @param bo 查询条件 + * @return 载具工装类型列表 + */ + List queryList(BaseToolingTypeBo bo); + + /** + * 新增载具工装类型 + * + * @param bo 载具工装类型 + * @return 是否新增成功 + */ + Boolean insertByBo(BaseToolingTypeBo bo); + + /** + * 修改载具工装类型 + * + * @param bo 载具工装类型 + * @return 是否修改成功 + */ + Boolean updateByBo(BaseToolingTypeBo bo); + + /** + * 校验并批量删除载具工装类型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingInfoServiceImpl.java index 4398e9a..037decb 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingInfoServiceImpl.java @@ -10,6 +10,7 @@ import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.mes.domain.BaseToolingType; import org.springframework.stereotype.Service; import org.dromara.mes.domain.bo.BaseToolingInfoBo; import org.dromara.mes.domain.vo.BaseToolingInfoVo; @@ -40,7 +41,7 @@ public class BaseToolingInfoServiceImpl implements IBaseToolingInfoService { * @return 载具工装信息 */ @Override - public BaseToolingInfoVo queryById(Long toolingId){ + public BaseToolingInfoVo queryById(Long toolingId) { return baseMapper.selectVoById(toolingId); } @@ -73,18 +74,19 @@ public class BaseToolingInfoServiceImpl implements IBaseToolingInfoService { private MPJLambdaWrapper buildQueryWrapper(BaseToolingInfoBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseToolingInfo.class) - .selectAll(BaseToolingInfo.class) - .eq(bo.getToolingId() != null, BaseToolingInfo::getToolingId, bo.getToolingId()) - .eq(StringUtils.isNotBlank(bo.getToolingCode()), BaseToolingInfo::getToolingCode, bo.getToolingCode()) - .like(StringUtils.isNotBlank(bo.getToolingName()), BaseToolingInfo::getToolingName, bo.getToolingName()) - .eq(StringUtils.isNotBlank(bo.getToolingTypeCode()), BaseToolingInfo::getToolingTypeCode, bo.getToolingTypeCode()) - .eq(StringUtils.isNotBlank(bo.getToolingSpecCode()), BaseToolingInfo::getToolingSpecCode, bo.getToolingSpecCode()) - .eq(StringUtils.isNotBlank(bo.getToolingBarcode()), BaseToolingInfo::getToolingBarcode, bo.getToolingBarcode()) - .eq(StringUtils.isNotBlank(bo.getToolingRfidBarcode()), BaseToolingInfo::getToolingRfidBarcode, bo.getToolingRfidBarcode()) - .eq(StringUtils.isNotBlank(bo.getMaterialCode()), BaseToolingInfo::getMaterialCode, bo.getMaterialCode()) - .eq(bo.getWeight() != null, BaseToolingInfo::getWeight, bo.getWeight()) - .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseToolingInfo::getActiveFlag, bo.getActiveFlag()) - .orderByDesc(BaseToolingInfo::getCreateTime); + .selectAll(BaseToolingInfo.class) + .select(BaseToolingType::getToolingTypeName) + .leftJoin(BaseToolingType.class, BaseToolingType::getToolingTypeId, BaseToolingType::getToolingTypeId) + .eq(bo.getToolingId() != null, BaseToolingInfo::getToolingId, bo.getToolingId()) + .eq(StringUtils.isNotBlank(bo.getToolingCode()), BaseToolingInfo::getToolingCode, bo.getToolingCode()) + .like(StringUtils.isNotBlank(bo.getToolingName()), BaseToolingInfo::getToolingName, bo.getToolingName()) + .eq(StringUtils.isNotBlank(bo.getToolingSpecCode()), BaseToolingInfo::getToolingSpecCode, bo.getToolingSpecCode()) + .eq(StringUtils.isNotBlank(bo.getToolingBarcode()), BaseToolingInfo::getToolingBarcode, bo.getToolingBarcode()) + .eq(StringUtils.isNotBlank(bo.getToolingRfidBarcode()), BaseToolingInfo::getToolingRfidBarcode, bo.getToolingRfidBarcode()) + .eq(StringUtils.isNotBlank(bo.getMaterialCode()), BaseToolingInfo::getMaterialCode, bo.getMaterialCode()) + .eq(bo.getWeight() != null, BaseToolingInfo::getWeight, bo.getWeight()) + .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseToolingInfo::getActiveFlag, bo.getActiveFlag()) + .orderByDesc(BaseToolingInfo::getCreateTime); return lqw; } @@ -121,14 +123,14 @@ public class BaseToolingInfoServiceImpl implements IBaseToolingInfoService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(BaseToolingInfo entity){ + private void validEntityBeforeSave(BaseToolingInfo entity) { //TODO 做一些数据校验,如唯一约束 // 校验编码是否已存在 if (StringUtils.isNotBlank(entity.getToolingCode())) { BaseToolingInfoBo query = new BaseToolingInfoBo(); query.setToolingCode(entity.getToolingCode()); MPJLambdaWrapper lqw = buildQueryWrapper(query); - BaseToolingInfo baseToolingInfo = baseMapper.selectOne(lqw); + BaseToolingInfo baseToolingInfo = baseMapper.selectOne(lqw); if (baseToolingInfo != null && !baseToolingInfo.getToolingId().equals(entity.getToolingId())) { throw new ServiceException("编码已存在"); } @@ -144,7 +146,7 @@ public class BaseToolingInfoServiceImpl implements IBaseToolingInfoService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeRelationServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeRelationServiceImpl.java new file mode 100644 index 0000000..c7b3f9d --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeRelationServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.mes.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.mes.domain.bo.BaseToolingTypeRelationBo; +import org.dromara.mes.domain.vo.BaseToolingTypeRelationVo; +import org.dromara.mes.domain.BaseToolingTypeRelation; +import org.dromara.mes.mapper.BaseToolingTypeRelationMapper; +import org.dromara.mes.service.IBaseToolingTypeRelationService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 载具工装类型关联信息Service业务层处理 + * + * @author Yinq + * @date 2025-07-03 + */ +@RequiredArgsConstructor +@Service +public class BaseToolingTypeRelationServiceImpl implements IBaseToolingTypeRelationService { + + private final BaseToolingTypeRelationMapper baseMapper; + + /** + * 查询载具工装类型关联信息 + * + * @param relationId 主键 + * @return 载具工装类型关联信息 + */ + @Override + public BaseToolingTypeRelationVo queryById(Long relationId){ + return baseMapper.selectVoById(relationId); + } + + /** + * 分页查询载具工装类型关联信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 载具工装类型关联信息分页列表 + */ + @Override + public TableDataInfo queryPageList(BaseToolingTypeRelationBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的载具工装类型关联信息列表 + * + * @param bo 查询条件 + * @return 载具工装类型关联信息列表 + */ + @Override + public List queryList(BaseToolingTypeRelationBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(BaseToolingTypeRelationBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseToolingTypeRelation.class) + .selectAll(BaseToolingTypeRelation.class) + .eq(bo.getRelationId() != null, BaseToolingTypeRelation::getRelationId, bo.getRelationId()) + .eq(bo.getToolingTypeId() != null, BaseToolingTypeRelation::getToolingTypeId, bo.getToolingTypeId()) + .eq(StringUtils.isNotBlank(bo.getRelationInfoType()), BaseToolingTypeRelation::getRelationInfoType, bo.getRelationInfoType()) + .eq(bo.getRelationInfoId() != null, BaseToolingTypeRelation::getRelationInfoId, bo.getRelationInfoId()) + .orderByAsc(BaseToolingTypeRelation::getCreateTime); + return lqw; + } + + /** + * 新增载具工装类型关联信息 + * + * @param bo 载具工装类型关联信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BaseToolingTypeRelationBo bo) { + BaseToolingTypeRelation add = MapstructUtils.convert(bo, BaseToolingTypeRelation.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRelationId(add.getRelationId()); + } + return flag; + } + + /** + * 修改载具工装类型关联信息 + * + * @param bo 载具工装类型关联信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BaseToolingTypeRelationBo bo) { + BaseToolingTypeRelation update = MapstructUtils.convert(bo, BaseToolingTypeRelation.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BaseToolingTypeRelation entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除载具工装类型关联信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeServiceImpl.java new file mode 100644 index 0000000..570290e --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseToolingTypeServiceImpl.java @@ -0,0 +1,235 @@ +package org.dromara.mes.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.mes.domain.BaseMaterialInfo; +import org.dromara.mes.domain.BaseToolingTypeRelation; +import org.dromara.mes.domain.ProdBaseRouteMaterial; +import org.dromara.mes.mapper.BaseToolingTypeRelationMapper; +import org.springframework.stereotype.Service; +import org.dromara.mes.domain.bo.BaseToolingTypeBo; +import org.dromara.mes.domain.vo.BaseToolingTypeVo; +import org.dromara.mes.domain.BaseToolingType; +import org.dromara.mes.mapper.BaseToolingTypeMapper; +import org.dromara.mes.service.IBaseToolingTypeService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 载具工装类型Service业务层处理 + * + * @author Yinq + * @date 2025-07-03 + */ +@RequiredArgsConstructor +@Service +public class BaseToolingTypeServiceImpl implements IBaseToolingTypeService { + + private final BaseToolingTypeMapper baseMapper; + + private final BaseToolingTypeRelationMapper relationMapper; + + /** + * 查询载具工装类型 + * + * @param toolingTypeId 主键 + * @return 载具工装类型 + */ + @Override + public BaseToolingTypeVo queryById(Long toolingTypeId){ + BaseToolingTypeVo baseToolingTypeVo = baseMapper.selectVoById(toolingTypeId); + // 关联物料 + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseToolingTypeRelation.class); + lqw.selectAll(BaseToolingTypeRelation.class) + .select(BaseMaterialInfo::getMaterialName) + .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, BaseToolingTypeRelation::getRelationInfoId) + .eq(BaseToolingTypeRelation::getToolingTypeId, toolingTypeId) + .eq(BaseToolingTypeRelation::getRelationInfoType, "1"); + List relationList = relationMapper.selectList(lqw); + baseToolingTypeVo.setTypeRelationList(relationList); + + // 关联工序 + MPJLambdaWrapper lqwProcess = JoinWrappers.lambda(BaseToolingTypeRelation.class); + lqwProcess.selectAll(BaseToolingTypeRelation.class) + .eq(BaseToolingTypeRelation::getToolingTypeId, toolingTypeId) + .eq(BaseToolingTypeRelation::getRelationInfoType, "2"); + List relationProcessList = relationMapper.selectList(lqwProcess); + baseToolingTypeVo.setProcessList(relationProcessList); + return baseToolingTypeVo; + } + + /** + * 分页查询载具工装类型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 载具工装类型分页列表 + */ + @Override + public TableDataInfo queryPageList(BaseToolingTypeBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的载具工装类型列表 + * + * @param bo 查询条件 + * @return 载具工装类型列表 + */ + @Override + public List queryList(BaseToolingTypeBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(BaseToolingTypeBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseToolingType.class) + .selectAll(BaseToolingType.class) + .eq(bo.getToolingTypeId() != null, BaseToolingType::getToolingTypeId, bo.getToolingTypeId()) + .eq(StringUtils.isNotBlank(bo.getToolingTypeCode()), BaseToolingType::getToolingTypeCode, bo.getToolingTypeCode()) + .like(StringUtils.isNotBlank(bo.getToolingTypeName()), BaseToolingType::getToolingTypeName, bo.getToolingTypeName()) + .eq(StringUtils.isNotBlank(bo.getToolingSpecCode()), BaseToolingType::getToolingSpecCode, bo.getToolingSpecCode()) + .eq(bo.getStandardLife() != null, BaseToolingType::getStandardLife, bo.getStandardLife()) + .eq(bo.getStandardWeight() != null, BaseToolingType::getStandardWeight, bo.getStandardWeight()) + .orderByAsc(BaseToolingType::getCreateTime); + return lqw; + } + + /** + * 新增载具工装类型 + * + * @param bo 载具工装类型 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BaseToolingTypeBo bo) { + BaseToolingType add = MapstructUtils.convert(bo, BaseToolingType.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + assert add != null; + bo.setToolingTypeId(add.getToolingTypeId()); + // 插入关联物料 + List typeRelationList = bo.getTypeRelationList(); + if (typeRelationList != null && !typeRelationList.isEmpty()) { + for (BaseToolingTypeRelation typeRelation : typeRelationList) { + typeRelation.setToolingTypeId(add.getToolingTypeId()); + relationMapper.insert(typeRelation); + } + } + } + return flag; + } + + /** + * 修改载具工装类型 + * + * @param bo 载具工装类型 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BaseToolingTypeBo bo) { + BaseToolingType update = MapstructUtils.convert(bo, BaseToolingType.class); + validEntityBeforeSave(update); + // 更新工艺路线关联物料 + List typeRelationList = bo.getTypeRelationList(); + MPJLambdaWrapper lqwMaterial = JoinWrappers.lambda(BaseToolingTypeRelation.class); + lqwMaterial.eq(BaseToolingTypeRelation::getToolingTypeId, bo.getToolingTypeId()) + .eq(BaseToolingTypeRelation::getRelationInfoType, "1"); + List dbTypeRelationList = relationMapper.selectList(lqwMaterial); + if (typeRelationList != null && !typeRelationList.isEmpty()) { + for (BaseToolingTypeRelation typeRelation : typeRelationList) { + typeRelation.setToolingTypeId(bo.getToolingTypeId()); + if (typeRelation.getRelationId() == null) { + relationMapper.insert(typeRelation); + } else { + relationMapper.updateById(typeRelation); + } + } + Set existingIds = typeRelationList.stream() + .filter(m -> m.getRelationId() != null) + .map(BaseToolingTypeRelation::getRelationId) + .collect(Collectors.toSet()); + List filteredIds = dbTypeRelationList.stream() + .filter(field -> !existingIds.contains(field.getRelationId())) + .toList(); + for (BaseToolingTypeRelation typeRelation : filteredIds) { + relationMapper.deleteById(typeRelation.getRelationId()); + } + } else if (dbTypeRelationList != null && !dbTypeRelationList.isEmpty()) { + // 如果前端传空,全部删除 + for (BaseToolingTypeRelation typeRelation : dbTypeRelationList) { + relationMapper.deleteById(typeRelation.getRelationId()); + } + } + + // 更新关联工序 + List typeProessList = bo.getProcessList(); + MPJLambdaWrapper lqwMaterialProess = JoinWrappers.lambda(BaseToolingTypeRelation.class); + lqwMaterialProess.eq(BaseToolingTypeRelation::getToolingTypeId, bo.getToolingTypeId()) + .eq(BaseToolingTypeRelation::getRelationInfoType, "2"); + List dbTypeProessList = relationMapper.selectList(lqwMaterialProess); + if (typeProessList != null && !typeProessList.isEmpty()) { + for (BaseToolingTypeRelation typeRelation : typeProessList) { + typeRelation.setToolingTypeId(bo.getToolingTypeId()); + if (typeRelation.getRelationId() == null) { + relationMapper.insert(typeRelation); + } else { + relationMapper.updateById(typeRelation); + } + } + Set existingIds = typeProessList.stream() + .filter(m -> m.getRelationId() != null) + .map(BaseToolingTypeRelation::getRelationId) + .collect(Collectors.toSet()); + List filteredIds = dbTypeProessList.stream() + .filter(field -> !existingIds.contains(field.getRelationId())) + .toList(); + for (BaseToolingTypeRelation typeRelation : filteredIds) { + relationMapper.deleteById(typeRelation.getRelationId()); + } + } else if (dbTypeProessList != null && !dbTypeProessList.isEmpty()) { + // 如果前端传空,全部删除 + for (BaseToolingTypeRelation typeRelation : dbTypeProessList) { + relationMapper.deleteById(typeRelation.getRelationId()); + } + } + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BaseToolingType entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除载具工装类型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdPlanInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdPlanInfoServiceImpl.java index a8011b4..14788ec 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdPlanInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdPlanInfoServiceImpl.java @@ -53,9 +53,6 @@ public class ProdPlanInfoServiceImpl implements IProdPlanInfoService { private final Logger log = LoggerFactory.getLogger(ProdPlanInfoServiceImpl.class); - - private static final String PLAN_ID_HEADER = "planId"; - private final ProdPlanInfoMapper baseMapper; private final DynamicBaseSqlMapper dynamicBaseSqlMapper; diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeMapper.xml new file mode 100644 index 0000000..6889afc --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeRelationMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeRelationMapper.xml new file mode 100644 index 0000000..e37d4d3 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/BaseToolingTypeRelationMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdPlanInfoMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdPlanInfoMapper.xml index 9859341..9e24ed6 100644 --- a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdPlanInfoMapper.xml +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdPlanInfoMapper.xml @@ -64,6 +64,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -87,13 +88,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" end as release_name, pbpi.process_name, bsi.shift_name, - bcti.team_name + bcti.team_name, + bmui.unit_name * from ${tableName} t left join base_material_info bmi on bmi.material_id = t.material_id + left join base_measurement_unit_info bmui on bmui.unit_id = bmi.material_unit_id left join prod_material_bom pmb on pmb.material_bom_id = t.material_bom_id left join base_material_info bomi on bomi.material_id = pmb.material_id left join prod_base_process_info pbpi on pbpi.process_id = t.process_id