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 cc22a9f..4918896 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 @@ -5,7 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -21,11 +21,14 @@ import org.dromara.dms.domain.vo.*; import org.dromara.dms.service.*; import org.dromara.resource.api.RemoteFileService; import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -35,7 +38,7 @@ import java.util.List; @RestController @RequestMapping("/mobile") @Slf4j -public class DmsMobileController extends BaseController { +public class DmsMobileController extends BaseController { private final IDmsBillsFaultInstanceService dmsBillsFaultInstanceService; @@ -50,11 +53,116 @@ public class DmsMobileController extends BaseController { private final IDmsBillsLubeInstanceService dmsBillsLubeInstanceService; + @DubboReference(timeout = 15000, retries = 1) private final RemoteFileService remoteFileService; + @DubboReference(timeout = 15000, retries = 1) + private RemoteDictService remoteDictService; + + /** + * 标准时间格式化器,用于PDA客户端兼容 + */ + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + /** + * 格式化时间字段,确保PDA客户端兼容性 + * + * @param mobileInstance Mobile实例 + * @param voInstance VO实例 + */ + private void formatTimeFields(DmsBillsFaultInstanceMobile mobileInstance, DmsBillsFaultInstanceVo voInstance) { + // 时间字段格式化 +// if (voInstance.getApplyTime() != null) { +// mobileInstance.setApplyTime(DATE_FORMAT.format(voInstance.getApplyTime())); +// } +// if (voInstance.getRealBeginTime() != null) { +// mobileInstance.setRealBeginTime(DATE_FORMAT.format(voInstance.getRealBeginTime())); +// } +// if (voInstance.getRealEndTime() != null) { +// mobileInstance.setRealEndTime(DATE_FORMAT.format(voInstance.getRealEndTime())); +// } +// if (voInstance.getRequireEndTime() != null) { +// mobileInstance.setRequireEndTime(DATE_FORMAT.format(voInstance.getRequireEndTime())); +// } +// if (voInstance.getConfirmTime() != null) { +// mobileInstance.setConfirmTime(DATE_FORMAT.format(voInstance.getConfirmTime())); +// } + + // PDA客户端字段映射 - 从voInstance正确获取数据 + mobileInstance.setDeviceCode(voInstance.getMachineCode()); + mobileInstance.setDeviceName(voInstance.getMachineName()); + mobileInstance.setDeviceLocation(voInstance.getMachineLocation()); + mobileInstance.setDeviceSpec(voInstance.getMachineSpec()); + + // ID字段类型转换 - Long到String + if (voInstance.getRepairInstanceId() != null) { + mobileInstance.setRepairInstanceId(String.valueOf(voInstance.getRepairInstanceId())); + } + if (voInstance.getFaultSourceId() != null) { + mobileInstance.setFaultSourceId(String.valueOf(voInstance.getFaultSourceId())); + } + if (voInstance.getWfDefinitionId() != null) { + mobileInstance.setWfDefinitionId(String.valueOf(voInstance.getWfDefinitionId())); + // PDA客户端兼容字段 + mobileInstance.setWfProcessId(String.valueOf(voInstance.getWfDefinitionId())); + } + if (voInstance.getMachineId() != null) { + mobileInstance.setMachineId(String.valueOf(voInstance.getMachineId())); + } + + + } + + /** + * 格式化保养工单时间字段,确保PDA客户端兼容性 + * + * @param mobileInstance Mobile实例 + * @param voInstance VO实例 + */ + private void formatMaintTimeFields(DmsBillsMaintInstanceMobile mobileInstance, DmsBillsMaintInstanceVo voInstance) { + if (voInstance.getPlanBeginTime() != null) { + mobileInstance.setPlanBeginTime(DATE_FORMAT.format(voInstance.getPlanBeginTime())); + } + if (voInstance.getRealBeginTime() != null) { + mobileInstance.setRealBeginTime(DATE_FORMAT.format(voInstance.getRealBeginTime())); + } + if (voInstance.getPlanEndTime() != null) { + mobileInstance.setPlanEndTime(DATE_FORMAT.format(voInstance.getPlanEndTime())); + } + if (voInstance.getRealEndTime() != null) { + mobileInstance.setRealEndTime(DATE_FORMAT.format(voInstance.getRealEndTime())); + } + } + + /** + * 根据字典类型查询字典数据信息 (适配PDA) + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/dict/type/{dictType}") + public AjaxResult getDictType(@PathVariable String dictType) { + List data = remoteDictService.selectDictDataByType(dictType); + + // 手动转换,只映射PDA端需要的字段 + List dictList = new ArrayList<>(); + if (data != null) { + for (RemoteDictDataVo vo : data) { + Dict dict = new Dict(); + dict.setDictLabel(vo.getDictLabel()); + dict.setDictValue(vo.getDictValue()); + dict.setDictType(vo.getDictType()); + // PDA端兼容:将Long类型的dictCode转换为String + dict.setDictCode(vo.getDictCode() != null ? String.valueOf(vo.getDictCode()) : null); + dictList.add(dict); + } + } + + return AjaxResult.success(dictList); + } /** * 处理文件上传的函数 + * * @param files 多部分文件列表 * @return 上传文件的URL列表 */ @@ -99,9 +207,7 @@ public class DmsMobileController extends BaseController { log.error("文件上传过程中发生未知错误: {}", originalFilename, e); throw new ServiceException("文件上传过程中发生未知错误,请联系管理员。"); } - } - } // 返回上传文件的URL列表 return fileUrls; @@ -115,12 +221,12 @@ public class DmsMobileController extends BaseController { */ @GetMapping("/getDeviceByDeviceCode/{deviceCode}") @RepeatSubmit - public R getDeviceByDeviceCode(@PathVariable("deviceCode") String deviceCode) { + public AjaxResult getDeviceByDeviceCode(@PathVariable("deviceCode") String deviceCode) { DmsBaseMachineInfoBo dmsBaseMachineInfoBo = new DmsBaseMachineInfoBo(); dmsBaseMachineInfoBo.setMachineCode(deviceCode); //TODO:根据设备编号查一个设备 DmsBaseMachineInfoVo dmsBaseDeviceLedger = baseDeviceLedgerService.queryList(dmsBaseMachineInfoBo).get(0); - return R.ok(dmsBaseDeviceLedger); + return AjaxResult.success(dmsBaseDeviceLedger); } /** @@ -131,7 +237,7 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getOutsrcInfos") // @RepeatSubmit - public R> getOutsrcInfos() { + public AjaxResult getOutsrcInfos() { DmsBaseOutsourcingInfoBo queryBaseOutsrcInfo = new DmsBaseOutsourcingInfoBo(); //沒有外协状态,用激活状态 @@ -139,17 +245,6 @@ public class DmsMobileController extends BaseController { queryBaseOutsrcInfo.setActiveFlag("1"); List baseOutsrcInfos = dmsBaseOutsrcInfoService.queryList(queryBaseOutsrcInfo); - // 将 DmsBaseOutsourcingInfoVo 转换为 Outsourcing 对象 -/* List outsourcingList = baseOutsrcInfos.stream() - .map(vo -> { - Outsourcing outsourcing = new Outsourcing(); - // 手动设置每个字段,确保正确映射 - outsourcing.setOutsrcId(vo.getOutsourcingId().intValue()); // Long转int - outsourcing.setOutsrcCode(vo.getOutsourcingCode()); - outsourcing.setOutsrcName(vo.getOutsourcingName()); - return outsourcing; - }) - .collect(Collectors.toList());*/ List outsourcingList = new ArrayList<>(); for (DmsBaseOutsourcingInfoVo vo : baseOutsrcInfos) { Outsourcing outsourcing = new Outsourcing(); @@ -159,7 +254,7 @@ public class DmsMobileController extends BaseController { outsourcingList.add(outsourcing); } - return R.ok(outsourcingList); + return AjaxResult.success(outsourcingList); } @@ -169,10 +264,10 @@ public class DmsMobileController extends BaseController { */ @GetMapping("/likeDeviceName") @RepeatSubmit - public R> likeDeviceName(String deviceName) { + public AjaxResult likeDeviceName(String deviceName) { // 直接调用 PDA 端专用查询方法,无需对象转换 List deviceBeenList = baseDeviceLedgerService.likeDeviceNameForPda(deviceName); - return R.ok(deviceBeenList); + return AjaxResult.success(deviceBeenList); } @@ -192,11 +287,46 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.INSERT) @PostMapping("/insertFaultInstsanceActivity") @RepeatSubmit - public R insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance, - List files) { - List fileUrls = handleFileUploads(files); + public AjaxResult insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance, + List files) { + List fileUrls = new ArrayList<>(); + if (files != null) { + for (MultipartFile file : files) { + // 从 MultipartFile 中提取 RemoteFileService 所需的参数 + String originalFilename = file.getOriginalFilename(); + String contentType = file.getContentType(); + byte[] fileBytes; + try { + fileBytes = file.getBytes(); + } catch (IOException e) { + log.error("获取文件字节失败: {}", originalFilename, e); + return AjaxResult.error("文件获取失败,请重试。"); + } + + try { + // 'name' 参数在当前RemoteFileServiceImpl实现中并非强制决定最终文件名, + // 这里传入originalFilename以保持一致性或作为备用标识 + RemoteFile sysFile = remoteFileService.upload(originalFilename, originalFilename, contentType, fileBytes); + if (sysFile != null && sysFile.getUrl() != null) { + fileUrls.add(sysFile.getUrl()); + } else { + log.warn("文件上传成功但未返回URL或返回数据为空: {}", originalFilename); + // 可以选择返回失败,或继续处理其他文件 + } + } catch (ServiceException e) { + log.error("文件上传服务异常: {}", originalFilename, e); + return AjaxResult.error("文件上传服务异常:" + e.getMessage()); + } catch (Exception e) { // 捕获其他未知异常 + log.error("文件上传过程中发生未知错误: {}", originalFilename, e); + return AjaxResult.error("文件上传过程中发生未知错误,请联系管理员。"); + } + } + } + + //TODO:文件存储待测试 dmsBillsFaultInstance.setFileUrls(fileUrls); - return R.ok(dmsBillsFaultInstanceService.insertByBo(dmsBillsFaultInstance)); + dmsBillsFaultInstanceService.insertByBo(dmsBillsFaultInstance); + return AjaxResult.success(); } @@ -208,10 +338,11 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getBillsFaultInstances") @RepeatSubmit - public TableDataInfo getBillsFaultInstances() { + public AjaxResult getBillsFaultInstances() { DmsBillsFaultInstanceBo queryBillsFaultInstance = new DmsBillsFaultInstanceBo(); List billsFaultInstances = dmsBillsFaultInstanceService.queryList(queryBillsFaultInstance); - return TableDataInfo.build(billsFaultInstances); + TableDataInfo dataTable = TableDataInfo.build(billsFaultInstances); + return AjaxResult.success().put("rows", dataTable.getRows()).put("total", dataTable.getTotal()); } /** @@ -222,12 +353,16 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getBillsFaultInstanceByRepairInstanceId/{repairInstanceId}") @RepeatSubmit - public R getBillsFaultInstanceByRepairInstanceId(@PathVariable("repairInstanceId") Long repairInstanceId) { + public AjaxResult getBillsFaultInstanceByRepairInstanceId(@PathVariable("repairInstanceId") Long repairInstanceId) { //fixme:图片地址完整路径(IP) DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); - return R.ok(mobileInstance); + + // 手动格式化时间字段,确保PDA客户端兼容性 + formatTimeFields(mobileInstance, billsFaultInstance); + + return AjaxResult.success(mobileInstance); } @@ -238,11 +373,12 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.UPDATE) @PostMapping("/updateFaultInstanceActivity") @RepeatSubmit - public R updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, - @RequestParam(value = "files") List files) { + public AjaxResult updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, + @RequestParam(value = "files" , required = false) List files) { List fileUrls = handleFileUploads(files); dmsFaultInstanceActivity.setFileUrls(fileUrls); - return R.ok(dmsBillsFaultInstanceService.updateDmsFaultInstanceActivity(dmsFaultInstanceActivity)); + dmsBillsFaultInstanceService.updateDmsFaultInstanceActivity(dmsFaultInstanceActivity); + return AjaxResult.success(); } /** @@ -253,11 +389,16 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getBillsFaultInstance4Repair/{repairInstanceId}") @RepeatSubmit - public R getBillsFaultInstance4Repair(@PathVariable("repairInstanceId") Long repairInstanceId) { - DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.queryById(repairInstanceId); + public AjaxResult getBillsFaultInstance4Repair(@PathVariable("repairInstanceId") Long repairInstanceId) { +// DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.queryById(repairInstanceId); + DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); - return R.ok(mobileInstance); + + // 手动格式化时间字段,确保PDA客户端兼容性 + formatTimeFields(mobileInstance, billsFaultInstance); + + return AjaxResult.success(mobileInstance); } @@ -269,9 +410,9 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/scanDevice4Repair") @RepeatSubmit - public R scanDevice4Repair(@Validated DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) { + public AjaxResult scanDevice4Repair(@Validated DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) { //FIXME:返回从void改为long - return R.ok(dmsBillsFaultInstanceService.scanDevice4Repair(dmsBillsFaultInstanceScan)); + return AjaxResult.success(dmsBillsFaultInstanceService.scanDevice4Repair(dmsBillsFaultInstanceScan)); } @@ -282,8 +423,9 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.START) @PostMapping("/startRepair") @RepeatSubmit - public R startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { - return R.ok(dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity)); + public AjaxResult startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { + dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity); + return AjaxResult.success(); } /** @@ -293,19 +435,21 @@ public class DmsMobileController extends BaseController { @Log(title = "故障报修工单", businessType = BusinessType.COMPLETE) @PostMapping("/completeRepair") @RepeatSubmit - public R completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, - @RequestParam(value = "files") List files) throws JsonProcessingException { + 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>() {}); + List parts2 = objectMapper.readValue(parts1, new TypeReference>() { + }); dmsFaultInstanceActivity.setParts(parts2); List fileUrls = handleFileUploads(files); dmsFaultInstanceActivity.setFileUrls(fileUrls); //FIXME:关于工作流相关的本页代码以及调用方法都需测试完善修改 - return R.ok(dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity)); + dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity); + return AjaxResult.success(); } @@ -317,22 +461,23 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getNewestInspectInstance") @RepeatSubmit - public R getNewestInspectInstance(DmsBillsInspectInstanceBo dmsBillsInspectInstance) { + public AjaxResult getNewestInspectInstance(DmsBillsInspectInstanceBo dmsBillsInspectInstance) { DmsBillsInspectInstanceVo newestInspectInstance = dmsBillsInspectInstanceService.getNewestBillsInspectInstance(dmsBillsInspectInstance); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsInspectInstanceMobile mobileInstance = MapstructUtils.convert(newestInspectInstance, DmsBillsInspectInstanceMobile.class); - return R.ok(mobileInstance); + return AjaxResult.success(mobileInstance); } /** * 扫描设备编号或者输入设备编号进行巡检验证 - * */ + */ // @RequiresPermissions("qms:checkrule:list") @GetMapping("/scanInspectInstanceDetail") @RepeatSubmit - public R scanInspectInstanceDetail(@Validated DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { - return R.ok(dmsBillsInspectInstanceService.scanInspectInstanceDetail(dmsBillsInspectInstanceScan)); + public AjaxResult scanInspectInstanceDetail(@Validated DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { + dmsBillsInspectInstanceService.scanInspectInstanceDetail(dmsBillsInspectInstanceScan); + return AjaxResult.success(); } /** @@ -346,7 +491,6 @@ public class DmsMobileController extends BaseController { // } - /** * 获取最新一条待保养或保养中的保养工单 * @@ -355,11 +499,15 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getNewestMaintInstance") // @RepeatSubmit - public R getNewestMaintInstance(DmsBillsMaintInstanceBo dmsBillsMaintInstance) { + public AjaxResult getNewestMaintInstance(DmsBillsMaintInstanceBo dmsBillsMaintInstance) { DmsBillsMaintInstanceVo newestMaintInstance = dmsBillsMaintInstanceService.getNewestBillsMaintInstance(dmsBillsMaintInstance); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsMaintInstanceMobile mobileInstance = MapstructUtils.convert(newestMaintInstance, DmsBillsMaintInstanceMobile.class); - return R.ok(mobileInstance); + + // 手动格式化时间字段,确保PDA客户端兼容性 + formatMaintTimeFields(mobileInstance, newestMaintInstance); + + return AjaxResult.success(mobileInstance); } @@ -370,8 +518,9 @@ public class DmsMobileController extends BaseController { @Log(title = "保养工单", businessType = BusinessType.START) @PostMapping("/startMaint") @RepeatSubmit - public R startMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { - return R.ok(dmsBillsMaintInstanceService.startMaint(dmsBillsMaintDetail)); + public AjaxResult startMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { + dmsBillsMaintInstanceService.startMaint(dmsBillsMaintDetail); + return AjaxResult.success(); } /** @@ -381,8 +530,9 @@ public class DmsMobileController extends BaseController { @Log(title = "保养工单", businessType = BusinessType.COMPLETE) @PostMapping("/completeMaint") @RepeatSubmit - public R completeMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { - return R.ok(dmsBillsMaintInstanceService.completeMaint(dmsBillsMaintDetail)); + public AjaxResult completeMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { + dmsBillsMaintInstanceService.completeMaint(dmsBillsMaintDetail); + return AjaxResult.success(); } @@ -394,11 +544,15 @@ public class DmsMobileController extends BaseController { // @RequiresPermissions("qms:checkrule:list") @GetMapping("/getNewestLubeInstance") // @RepeatSubmit - public R getNewestLubeInstance(DmsBillsLubeInstanceBo dmsBillsLubeInstance) { + public AjaxResult getNewestLubeInstance(DmsBillsLubeInstanceBo dmsBillsLubeInstance) { DmsBillsLubeInstanceVo newestLubeInstance = dmsBillsLubeInstanceService.getNewestBillsLubeInstance(dmsBillsLubeInstance); // 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题 DmsBillsLubeInstanceMobile mobileInstance = MapstructUtils.convert(newestLubeInstance, DmsBillsLubeInstanceMobile.class); - return R.ok(mobileInstance); + + // 注意:润滑Mobile类中的时间字段已被注释,无需格式化 + // 如果将来启用时间字段,请添加相应的格式化方法 + + return AjaxResult.success(mobileInstance); } /** @@ -408,9 +562,10 @@ public class DmsMobileController extends BaseController { @Log(title = "润滑工单", businessType = BusinessType.START) @PostMapping("/startLube") @RepeatSubmit - public R startLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) { + public AjaxResult startLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) { - return R.ok(dmsBillsLubeInstanceService.startLube(dmsBillsLubeDetail)); + dmsBillsLubeInstanceService.startLube(dmsBillsLubeDetail); + return AjaxResult.success(); } /** @@ -420,8 +575,9 @@ public class DmsMobileController extends BaseController { @Log(title = "润滑工单", businessType = BusinessType.COMPLETE) @PostMapping("/completeLube") @RepeatSubmit - public R completeLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) { - return R.ok(dmsBillsLubeInstanceService.completeLube(dmsBillsLubeDetail)); + public AjaxResult completeLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) { + dmsBillsLubeInstanceService.completeLube(dmsBillsLubeDetail); + return AjaxResult.success(); } 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 f676a60..67d6581 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 @@ -24,6 +24,7 @@ public class DmsFaultComponentsParts extends TenantEntity { /** * 故障报修零部件内容ID */ + @TableId(value = "components_parts_id", type = IdType.AUTO) private Long componentsPartsId; /** 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 0e77558..c1d219c 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 @@ -1,6 +1,8 @@ package org.dromara.dms.domain; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class DmsFaultInstanceActivity extends TenantEntity { /** * 维修工单实例节点ID */ + @TableId(value = "instance_activity_id", type = IdType.AUTO) private Long instanceActivityId; /** diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsInspectProjectDevice.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsInspectProjectDevice.java index a590274..aa32a37 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsInspectProjectDevice.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsInspectProjectDevice.java @@ -1,7 +1,8 @@ package org.dromara.dms.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,6 +26,7 @@ public class DmsInspectProjectDevice implements Serializable { /** * 点巡检项目ID */ + @TableId(value = "inspect_project_id", type = IdType.AUTO) private Long inspectProjectId; /** diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/AjaxResult.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/AjaxResult.java new file mode 100644 index 0000000..5bfd3e1 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/AjaxResult.java @@ -0,0 +1,204 @@ +package org.dromara.dms.domain.mobile; + +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.utils.StringUtils; + +import java.util.HashMap; +import java.util.Objects; + +/** + * 操作消息提醒 (兼容旧版PDA) + * + * @author Lion Li + */ +public class AjaxResult extends HashMap { + private static final long serialVersionUID = 1L; + + /** + * 状态码 + */ + public static final String CODE_TAG = "code"; + + /** + * 返回内容 + */ + public static final String MSG_TAG = "msg"; + + /** + * 数据对象 + */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) { + return new AjaxResult(HttpStatus.WARN, msg, data); + } + + /** + * 返回错误消息 + * + * @return 错误消息 + */ + public static AjaxResult error() { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(String msg) { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 错误消息 + */ + public static AjaxResult error(String msg, Object data) { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(int code, String msg) { + return new AjaxResult(code, msg, null); + } + + /** + * 是否为成功消息 + * + * @return 结果 + */ + public boolean isSuccess() { + return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); + } + + /** + * 是否为警告消息 + * + * @return 结果 + */ + public boolean isWarn() { + return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); + } + + /** + * 是否为错误消息 + * + * @return 结果 + */ + public boolean isError() { + return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); + } + + /** + * 方便链式调用 + * + * @param key + * @param value + * @return + */ + @Override + public AjaxResult put(String key, Object value) { + super.put(key, value); + return this; + } +} \ No newline at end of file diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/Dict.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/Dict.java new file mode 100644 index 0000000..787b16d --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/Dict.java @@ -0,0 +1,31 @@ +package org.dromara.dms.domain.mobile; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +@Data +@AutoMapper(target = RemoteDictDataVo.class, reverseConvertGenerate = true) +public class Dict { + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 字典编码 - 为了与PDA端兼容,保持String类型 + */ + private String dictCode; + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsFaultInstanceMobile.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsFaultInstanceMobile.java index 81dfbe7..62d71a3 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsFaultInstanceMobile.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/mobile/DmsBillsFaultInstanceMobile.java @@ -12,7 +12,6 @@ import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo; import java.io.Serial; import java.io.Serializable; -import java.util.Date; import java.util.List; @@ -34,7 +33,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { * 主键标识;此表不会长期保存 */ @ExcelProperty(value = "主键标识;此表不会长期保存") - private Long repairInstanceId; + private String repairInstanceId; /** * 工单编号 @@ -61,19 +60,21 @@ public class DmsBillsFaultInstanceMobile implements Serializable { */ @ExcelProperty(value = "报修来源ID", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "预=留字段不显示") - private Long faultSourceId; + private String faultSourceId; /** * 流程定义ID,关联wf_definition_config的id */ @ExcelProperty(value = "流程定义ID,关联wf_definition_config的id") - private Long wfDefinitionId; + private String wfDefinitionId; + //PDA中等同于以上wfDefinitionId + private String wfProcessId; /** * 设备ID,关联prod_base_machine_info的machine_id */ @ExcelProperty(value = "设备ID,关联prod_base_machine_info的machine_id") - private Long machineId; + private String machineId; /** * 申请人 @@ -81,29 +82,38 @@ public class DmsBillsFaultInstanceMobile implements Serializable { @ExcelProperty(value = "申请人") private String applyUser; - /** - * 申请时间 - */ - @ExcelProperty(value = "申请时间") - private Date applyTime; - - /** - * 实际开始时间 - */ - @ExcelProperty(value = "实际开始时间") - private Date realBeginTime; - - /** - * 实际完成时间 - */ - @ExcelProperty(value = "实际完成时间") - private Date realEndTime; - - /** - * 要求完成时间 - */ - @ExcelProperty(value = "要求完成时间") - private Date requireEndTime; +// /** +// * 申请时间 +// */ +// @ExcelProperty(value = "申请时间") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// private String applyTime; +// +// /** +// * 实际开始时间 +// */ +// @ExcelProperty(value = "实际开始时间") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// private String realBeginTime; +// +// /** +// * 实际完成时间 +// */ +// @ExcelProperty(value = "实际完成时间") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// private String realEndTime; +// +// /** +// * 要求完成时间 +// */ +// @ExcelProperty(value = "要求完成时间") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// private String requireEndTime; +// +// +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// @ExcelProperty(value = "确认时间") +// private String confirmTime; /** * 工单状态(0待维修 1维修中 2维修完成) @@ -150,8 +160,9 @@ public class DmsBillsFaultInstanceMobile implements Serializable { private String filePath;//join - private String machineCode;//JOIN + + private String machineCode;//JOIN private String machineName;//JOIN private String machineLocation;//JOIN @@ -161,7 +172,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { /** * 设备ID,映射到数据库的 machine_id 字段 */ - private int deviceId; + private String deviceId; /** * 设备编码,映射到数据库的 machine_code 字段 @@ -182,7 +193,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { * 设备类型ID,映射到数据库的 machine_type 字段 * 注意:这里可能需要根据实际业务调整数据类型 */ - private Long deviceTypeId; + private String deviceTypeId; /** * 设备规格,映射到数据库的 machine_spec 字段 @@ -197,7 +208,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { private String imgUrl;//JOIN - private Long instanceActivityId;//JOIN + private String instanceActivityId;//JOIN private String faultType;//JOIN @@ -209,7 +220,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { private String repairType;//JOIN - private Long outsourcingId;//JOIN + private String outsourcingId;//JOIN private String processHandleResolution;//JOIN @@ -229,9 +240,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable { private String repairer;//JOIN - private Date confirmTime;//JOIN - - private Long componentsPartsId;//JOIN + private String componentsPartsId;//JOIN private List parts;//JOIN 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 b2fb26a..e7fec7b 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 @@ -72,29 +72,29 @@ public class DmsBillsMaintInstanceMobile implements Serializable { @ExcelDictFormat(dictType = "maint_level") private Long maintLevel; -// /** -// * 计划保养时间 -// */ -// @ExcelProperty(value = "计划保养时间") -// private Date planBeginTime; -// -// /** -// * 实际开始时间 -// */ -// @ExcelProperty(value = "实际开始时间") -// private Date realBeginTime; -// -// /** -// * 计划完成时间;根据计划的时限计算 -// */ -// @ExcelProperty(value = "计划完成时间;根据计划的时限计算") -// private Date planEndTime; -// -// /** -// * 实际完成时间 -// */ -// @ExcelProperty(value = "实际完成时间") -// private Date realEndTime; + /** + * 计划保养时间 + */ + @ExcelProperty(value = "计划保养时间") + private String planBeginTime; + + /** + * 实际开始时间 + */ + @ExcelProperty(value = "实际开始时间") + private String realBeginTime; + + /** + * 计划完成时间;根据计划的时限计算 + */ + @ExcelProperty(value = "计划完成时间;根据计划的时限计算") + private String planEndTime; + + /** + * 实际完成时间 + */ + @ExcelProperty(value = "实际完成时间") + private String realEndTime; /** * 保养状态(1待保养 2保养中 3已完成) diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsFaultInstanceVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsFaultInstanceVo.java index f30f7c4..8e1637b 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsFaultInstanceVo.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsFaultInstanceVo.java @@ -2,6 +2,7 @@ package org.dromara.dms.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; @@ -68,6 +69,8 @@ public class DmsBillsFaultInstanceVo implements Serializable { */ @ExcelProperty(value = "流程定义ID,关联wf_definition_config的id") private Long wfDefinitionId; + //PDA中等同于以上wfDefinitionId + private Long wfProcessId; /** * 设备ID,关联prod_base_machine_info的machine_id @@ -84,24 +87,28 @@ public class DmsBillsFaultInstanceVo implements Serializable { /** * 申请时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "申请时间") private Date applyTime; /** * 实际开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "实际开始时间") private Date realBeginTime; /** * 实际完成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "实际完成时间") private Date realEndTime; /** * 要求完成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "要求完成时间") private Date requireEndTime; @@ -229,6 +236,7 @@ public class DmsBillsFaultInstanceVo implements Serializable { private String repairer;//JOIN + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date confirmTime;//JOIN private Long componentsPartsId;//JOIN diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintInstanceVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintInstanceVo.java index 4f39166..e6e4716 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintInstanceVo.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsBillsMaintInstanceVo.java @@ -2,6 +2,7 @@ package org.dromara.dms.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; @@ -76,24 +77,28 @@ public class DmsBillsMaintInstanceVo implements Serializable { /** * 计划保养时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "计划保养时间") private Date planBeginTime; /** * 实际开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "实际开始时间") private Date realBeginTime; /** * 计划完成时间;根据计划的时限计算 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "计划完成时间;根据计划的时限计算") private Date planEndTime; /** * 实际完成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "实际完成时间") private Date realEndTime; @@ -141,6 +146,7 @@ public class DmsBillsMaintInstanceVo implements Serializable { private List dmsBillsMaintDetailList; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; } diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsFaultInstanceActivityMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsFaultInstanceActivityMapper.java index c98362b..2415bf2 100644 --- a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsFaultInstanceActivityMapper.java +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsFaultInstanceActivityMapper.java @@ -21,7 +21,12 @@ public interface DmsFaultInstanceActivityMapper extends BaseMapperPlus selectPartsById(@Param("repairInstanceId") Long repairInstanceId); - Long selectRepairInstanceId(@Param("repairInstanceId")Long repairInstanceId); + /** + * 根据活动ID查询对应的维修实例ID + * @param activityId 实例活动ID + * @return 维修实例ID + */ + Long selectRepairInstanceId(@Param("activityId") Long activityId); int deleteByTargetId(@Param("activityId") Long activityId); 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 02b1f55..431c740 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 @@ -1,6 +1,7 @@ package org.dromara.dms.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.alibaba.ttl.TtlRunnable; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import io.seata.spring.annotation.GlobalTransactional; @@ -38,6 +39,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import cn.dev33.satoken.stp.StpUtil; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -54,7 +56,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS private final DmsBillsFaultInstanceMapper baseMapper; - private final DmsBillsFaultInstanceMapper dmsBillsFaultInstanceMapper; private final DmsInstanceFileMapper dmsInstanceFileMapper; @@ -194,20 +195,32 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess); Long taskId = remoteStartProcessReturn.getTaskId(); - //TODO:异步线程内执行updateWrokFlow - CompletableFuture.runAsync(() -> { + // ** 异步线程上下文传递【核心问题】 ** + // 在主线程中,用户的登录信息(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(add, taskId); } catch (Exception e) { // 简单记录错误,不影响主流程 System.err.println("异步更新工作流失败,repairInstanceId: " + add.getRepairInstanceId() + ", 错误: " + e.getMessage()); // 可以考虑记录到失败表,后续补偿处理 } - }); + })); // 创建故障实例活动对象 -/* DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); + DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); // 设置维修实例ID dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId()); // 设置流程活动ID @@ -238,7 +251,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS List fileUrls = add.getFileUrls(); // 批量插入实例文件记录 batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId()); -*/ return flag; } @@ -252,7 +264,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS */ private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId){ dmsBillsFaultInstance.setWfDefinitionId(taskId); - + RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); // 必填字段 remoteCompleteTask.setTaskId(taskId); @@ -331,8 +343,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS @Override public DmsFaultInstanceActivity selectFaults(Long repairInstanceId) { - List list = dmsBillsFaultInstanceMapper.selectFaults(repairInstanceId); - List parts = dmsBillsFaultInstanceMapper.selectParts(repairInstanceId); + List list = baseMapper.selectFaults(repairInstanceId); + List parts = baseMapper.selectParts(repairInstanceId); DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity(); BeanUtils.copyProperties(list.get(0),activity); // activity.setCheckedFault(list.get(0).getCheckedFault()); @@ -349,7 +361,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS @Override public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) { // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 - DmsBillsFaultInstanceVo dmsBillsFaultInstance = dmsBillsFaultInstanceMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); + DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); // 创建实例文件查询对象 DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo(); // 设置目标类型为故障实例活动 @@ -425,9 +437,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS public int updateDmsFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { // 获取文件URL列表 List fileUrls = dmsFaultInstanceActivity.getFileUrls(); - // 获取活动ID + // 获取实例ID Long activityId = dmsFaultInstanceActivity.getInstanceActivityId(); - // 根据活动ID查询对应的维修实例ID + // 根据实例ID查询对应的维修实例ID Long repairInstanceId = dmsFaultInstanceActivityMapper.selectRepairInstanceId(activityId); // 创建新的DmsBillsFaultInstance对象 DmsBillsFaultInstance dmsBillsFaultInstance = new DmsBillsFaultInstance(); @@ -437,21 +449,19 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsBillsFaultInstance.setFaultSourceType(dmsFaultInstanceActivity.getFaultSourceType()); // 设置故障类型 dmsBillsFaultInstance.setFaultType(dmsFaultInstanceActivity.getFaultType()); - // 设置维修实例ID + // 设置维修工单ID(主键) dmsBillsFaultInstance.setRepairInstanceId(repairInstanceId); + validEntityBeforeSave(dmsBillsFaultInstance); // 根据ID更新DmsBillsFaultInstance记录 - int i = dmsBillsFaultInstanceMapper.updateById(dmsBillsFaultInstance); - // 根据目标ID删除DmsFaultInstanceActivity记录 + int i = baseMapper.updateById(dmsBillsFaultInstance); + + // 根据目标ID删除dms_instance_file表记录 int rows = dmsFaultInstanceActivityMapper.deleteByTargetId(activityId); // 批量插入实例文件 batchInsertInstanceFiles(fileUrls,activityId); - - // 将dmsFaultInstanceActivity转换为DmsBillsFaultInstance对象 - DmsBillsFaultInstance update = MapstructUtils.convert(dmsFaultInstanceActivity, DmsBillsFaultInstance.class); - // 在保存之前验证实体 - validEntityBeforeSave(update); // 根据ID更新记录并返回影响行数 - return baseMapper.updateById(update); + DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class); + return dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity); } /** @@ -461,7 +471,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS */ @Override public Long scanDevice4Repair(DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) { - Long count = dmsBillsFaultInstanceMapper.selectCountByRepairInstanceIdAndDeviceCode( + Long count = baseMapper.selectCountByRepairInstanceIdAndDeviceCode( dmsBillsFaultInstanceScan.getRepairInstanceId(), dmsBillsFaultInstanceScan.getDeviceCode()); if (count <= 0) { throw new ServiceException("扫描验证失败"); @@ -484,7 +494,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 根据维修实例ID查询故障实例信息 - DmsBillsFaultInstance dmsBillsFaultInstance = dmsBillsFaultInstanceMapper + DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper .selectFaultInstanceJoinFirstById(dmsFaultInstanceActivity.getRepairInstanceId());//join 第一步activity // 获取工单状态 String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); @@ -504,17 +514,29 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS dmsBillsFaultInstance.setRealBeginTime(currentDate); //启动工作流 Long taskId = getOrCreateTaskId(dmsBillsFaultInstance); - - //TODO:异步线程内执行updateWrokFlow - CompletableFuture.runAsync(() -> { + + // ** 异步线程上下文传递【核心问题】 ** + // 在主线程中,用户的登录信息(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 @@ -635,7 +657,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS remoteCompleteTask.setMessage("同意"); remoteWorkflowService.completeTask(remoteCompleteTask); - dmsBillsFaultInstanceMapper.updateById(faultInstance); + baseMapper.updateById(faultInstance); // 设置工单活动状态为已完成,并记录结束时间和维修人员 dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH); @@ -644,7 +666,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS // 将工单活动实例转换为数据库实体对象并更新数据库 DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class); int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity); - + // 返回更新操作影响的行数 return i; } 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 6e0ccd8..f5ae816 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,6 +38,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + +