feat(dms): 新增AjaxResult实体类以方便PDA所有返回,新增Dict实体类并且新增接口以AjaxResult返回以方便PDA获取字段

- 添加故障报修单相关字段并优化日期格式
- 在 DmsBillsFaultInstanceMapper.xml 中添加缺失的字段映射
- 修改 DmsBillsFaultInstanceMobile 类中的字段类型
- 优化日期格式处理,使用 @JsonFormat 注解
-调整部分字段名称以适应业务需求
master
zch 3 days ago
parent a801a53c2e
commit 68a3531285

@ -5,7 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.idempotent.annotation.RepeatSubmit; 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.dms.service.*;
import org.dromara.resource.api.RemoteFileService; import org.dromara.resource.api.RemoteFileService;
import org.dromara.resource.api.domain.RemoteFile; 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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -35,7 +38,7 @@ import java.util.List;
@RestController @RestController
@RequestMapping("/mobile") @RequestMapping("/mobile")
@Slf4j @Slf4j
public class DmsMobileController extends BaseController { public class DmsMobileController extends BaseController {
private final IDmsBillsFaultInstanceService dmsBillsFaultInstanceService; private final IDmsBillsFaultInstanceService dmsBillsFaultInstanceService;
@ -50,11 +53,116 @@ public class DmsMobileController extends BaseController {
private final IDmsBillsLubeInstanceService dmsBillsLubeInstanceService; private final IDmsBillsLubeInstanceService dmsBillsLubeInstanceService;
@DubboReference(timeout = 15000, retries = 1)
private final RemoteFileService remoteFileService; 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<RemoteDictDataVo> data = remoteDictService.selectDictDataByType(dictType);
// 手动转换只映射PDA端需要的字段
List<Dict> 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 * @param files
* @return URL * @return URL
*/ */
@ -99,9 +207,7 @@ public class DmsMobileController extends BaseController {
log.error("文件上传过程中发生未知错误: {}", originalFilename, e); log.error("文件上传过程中发生未知错误: {}", originalFilename, e);
throw new ServiceException("文件上传过程中发生未知错误,请联系管理员。"); throw new ServiceException("文件上传过程中发生未知错误,请联系管理员。");
} }
} }
} }
// 返回上传文件的URL列表 // 返回上传文件的URL列表
return fileUrls; return fileUrls;
@ -115,12 +221,12 @@ public class DmsMobileController extends BaseController {
*/ */
@GetMapping("/getDeviceByDeviceCode/{deviceCode}") @GetMapping("/getDeviceByDeviceCode/{deviceCode}")
@RepeatSubmit @RepeatSubmit
public R getDeviceByDeviceCode(@PathVariable("deviceCode") String deviceCode) { public AjaxResult getDeviceByDeviceCode(@PathVariable("deviceCode") String deviceCode) {
DmsBaseMachineInfoBo dmsBaseMachineInfoBo = new DmsBaseMachineInfoBo(); DmsBaseMachineInfoBo dmsBaseMachineInfoBo = new DmsBaseMachineInfoBo();
dmsBaseMachineInfoBo.setMachineCode(deviceCode); dmsBaseMachineInfoBo.setMachineCode(deviceCode);
//TODO根据设备编号查一个设备 //TODO根据设备编号查一个设备
DmsBaseMachineInfoVo dmsBaseDeviceLedger = baseDeviceLedgerService.queryList(dmsBaseMachineInfoBo).get(0); 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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getOutsrcInfos") @GetMapping("/getOutsrcInfos")
// @RepeatSubmit // @RepeatSubmit
public R<List<Outsourcing>> getOutsrcInfos() { public AjaxResult getOutsrcInfos() {
DmsBaseOutsourcingInfoBo queryBaseOutsrcInfo = new DmsBaseOutsourcingInfoBo(); DmsBaseOutsourcingInfoBo queryBaseOutsrcInfo = new DmsBaseOutsourcingInfoBo();
//沒有外协状态,用激活状态 //沒有外协状态,用激活状态
@ -139,17 +245,6 @@ public class DmsMobileController extends BaseController {
queryBaseOutsrcInfo.setActiveFlag("1"); queryBaseOutsrcInfo.setActiveFlag("1");
List<DmsBaseOutsourcingInfoVo> baseOutsrcInfos = dmsBaseOutsrcInfoService.queryList(queryBaseOutsrcInfo); List<DmsBaseOutsourcingInfoVo> baseOutsrcInfos = dmsBaseOutsrcInfoService.queryList(queryBaseOutsrcInfo);
// 将 DmsBaseOutsourcingInfoVo 转换为 Outsourcing 对象
/* List<Outsourcing> 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<Outsourcing> outsourcingList = new ArrayList<>(); List<Outsourcing> outsourcingList = new ArrayList<>();
for (DmsBaseOutsourcingInfoVo vo : baseOutsrcInfos) { for (DmsBaseOutsourcingInfoVo vo : baseOutsrcInfos) {
Outsourcing outsourcing = new Outsourcing(); Outsourcing outsourcing = new Outsourcing();
@ -159,7 +254,7 @@ public class DmsMobileController extends BaseController {
outsourcingList.add(outsourcing); outsourcingList.add(outsourcing);
} }
return R.ok(outsourcingList); return AjaxResult.success(outsourcingList);
} }
@ -169,10 +264,10 @@ public class DmsMobileController extends BaseController {
*/ */
@GetMapping("/likeDeviceName") @GetMapping("/likeDeviceName")
@RepeatSubmit @RepeatSubmit
public R<List<DeviceBeen>> likeDeviceName(String deviceName) { public AjaxResult likeDeviceName(String deviceName) {
// 直接调用 PDA 端专用查询方法,无需对象转换 // 直接调用 PDA 端专用查询方法,无需对象转换
List<DeviceBeen> deviceBeenList = baseDeviceLedgerService.likeDeviceNameForPda(deviceName); List<DeviceBeen> 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) @Log(title = "故障报修工单", businessType = BusinessType.INSERT)
@PostMapping("/insertFaultInstsanceActivity") @PostMapping("/insertFaultInstsanceActivity")
@RepeatSubmit @RepeatSubmit
public R insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance, public AjaxResult insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance,
List<MultipartFile> files) { List<MultipartFile> files) {
List<String> fileUrls = handleFileUploads(files); List<String> 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); 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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getBillsFaultInstances") @GetMapping("/getBillsFaultInstances")
@RepeatSubmit @RepeatSubmit
public TableDataInfo getBillsFaultInstances() { public AjaxResult getBillsFaultInstances() {
DmsBillsFaultInstanceBo queryBillsFaultInstance = new DmsBillsFaultInstanceBo(); DmsBillsFaultInstanceBo queryBillsFaultInstance = new DmsBillsFaultInstanceBo();
List<DmsBillsFaultInstanceVo> billsFaultInstances = dmsBillsFaultInstanceService.queryList(queryBillsFaultInstance); List<DmsBillsFaultInstanceVo> billsFaultInstances = dmsBillsFaultInstanceService.queryList(queryBillsFaultInstance);
return TableDataInfo.build(billsFaultInstances); TableDataInfo<DmsBillsFaultInstanceVo> 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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getBillsFaultInstanceByRepairInstanceId/{repairInstanceId}") @GetMapping("/getBillsFaultInstanceByRepairInstanceId/{repairInstanceId}")
@RepeatSubmit @RepeatSubmit
public R<DmsBillsFaultInstanceMobile> getBillsFaultInstanceByRepairInstanceId(@PathVariable("repairInstanceId") Long repairInstanceId) { public AjaxResult getBillsFaultInstanceByRepairInstanceId(@PathVariable("repairInstanceId") Long repairInstanceId) {
//fixme图片地址完整路径IP //fixme图片地址完整路径IP
DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId); DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId);
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); 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) @Log(title = "故障报修工单", businessType = BusinessType.UPDATE)
@PostMapping("/updateFaultInstanceActivity") @PostMapping("/updateFaultInstanceActivity")
@RepeatSubmit @RepeatSubmit
public R<Integer> updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, public AjaxResult updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files") List<MultipartFile> files) { @RequestParam(value = "files" , required = false) List<MultipartFile> files) {
List<String> fileUrls = handleFileUploads(files); List<String> fileUrls = handleFileUploads(files);
dmsFaultInstanceActivity.setFileUrls(fileUrls); 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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getBillsFaultInstance4Repair/{repairInstanceId}") @GetMapping("/getBillsFaultInstance4Repair/{repairInstanceId}")
@RepeatSubmit @RepeatSubmit
public R<DmsBillsFaultInstanceMobile> getBillsFaultInstance4Repair(@PathVariable("repairInstanceId") Long repairInstanceId) { public AjaxResult getBillsFaultInstance4Repair(@PathVariable("repairInstanceId") Long repairInstanceId) {
DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.queryById(repairInstanceId); // DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.queryById(repairInstanceId);
DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId);
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); 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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/scanDevice4Repair") @GetMapping("/scanDevice4Repair")
@RepeatSubmit @RepeatSubmit
public R<Long> scanDevice4Repair(@Validated DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) { public AjaxResult scanDevice4Repair(@Validated DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) {
//FIXME:返回从void改为long //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) @Log(title = "故障报修工单", businessType = BusinessType.START)
@PostMapping("/startRepair") @PostMapping("/startRepair")
@RepeatSubmit @RepeatSubmit
public R<Integer> startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { public AjaxResult startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
return R.ok(dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity)); dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity);
return AjaxResult.success();
} }
/** /**
@ -293,19 +435,21 @@ public class DmsMobileController extends BaseController {
@Log(title = "故障报修工单", businessType = BusinessType.COMPLETE) @Log(title = "故障报修工单", businessType = BusinessType.COMPLETE)
@PostMapping("/completeRepair") @PostMapping("/completeRepair")
@RepeatSubmit @RepeatSubmit
public R completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files") List<MultipartFile> files) throws JsonProcessingException { @RequestParam(value = "files", required = false) List<MultipartFile> files) throws JsonProcessingException {
dmsFaultInstanceActivity.setRepairConfirm("2"); dmsFaultInstanceActivity.setRepairConfirm("2");
dmsFaultInstanceActivity.setConfirmTime(new Date()); dmsFaultInstanceActivity.setConfirmTime(new Date());
String parts1 = dmsFaultInstanceActivity.getParts1(); String parts1 = dmsFaultInstanceActivity.getParts1();
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<DmsFaultComponentsParts> parts2 = objectMapper.readValue(parts1, new TypeReference<List<DmsFaultComponentsParts>>() {}); List<DmsFaultComponentsParts> parts2 = objectMapper.readValue(parts1, new TypeReference<List<DmsFaultComponentsParts>>() {
});
dmsFaultInstanceActivity.setParts(parts2); dmsFaultInstanceActivity.setParts(parts2);
List<String> fileUrls = handleFileUploads(files); List<String> fileUrls = handleFileUploads(files);
dmsFaultInstanceActivity.setFileUrls(fileUrls); dmsFaultInstanceActivity.setFileUrls(fileUrls);
//FIXME:关于工作流相关的本页代码以及调用方法都需测试完善修改 //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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getNewestInspectInstance") @GetMapping("/getNewestInspectInstance")
@RepeatSubmit @RepeatSubmit
public R<DmsBillsInspectInstanceMobile> getNewestInspectInstance(DmsBillsInspectInstanceBo dmsBillsInspectInstance) { public AjaxResult getNewestInspectInstance(DmsBillsInspectInstanceBo dmsBillsInspectInstance) {
DmsBillsInspectInstanceVo newestInspectInstance = dmsBillsInspectInstanceService.getNewestBillsInspectInstance(dmsBillsInspectInstance); DmsBillsInspectInstanceVo newestInspectInstance = dmsBillsInspectInstanceService.getNewestBillsInspectInstance(dmsBillsInspectInstance);
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsInspectInstanceMobile mobileInstance = MapstructUtils.convert(newestInspectInstance, DmsBillsInspectInstanceMobile.class); DmsBillsInspectInstanceMobile mobileInstance = MapstructUtils.convert(newestInspectInstance, DmsBillsInspectInstanceMobile.class);
return R.ok(mobileInstance); return AjaxResult.success(mobileInstance);
} }
/** /**
* *
* */ */
// @RequiresPermissions("qms:checkrule:list") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/scanInspectInstanceDetail") @GetMapping("/scanInspectInstanceDetail")
@RepeatSubmit @RepeatSubmit
public R scanInspectInstanceDetail(@Validated DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) { public AjaxResult scanInspectInstanceDetail(@Validated DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) {
return R.ok(dmsBillsInspectInstanceService.scanInspectInstanceDetail(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") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getNewestMaintInstance") @GetMapping("/getNewestMaintInstance")
// @RepeatSubmit // @RepeatSubmit
public R<DmsBillsMaintInstanceMobile> getNewestMaintInstance(DmsBillsMaintInstanceBo dmsBillsMaintInstance) { public AjaxResult getNewestMaintInstance(DmsBillsMaintInstanceBo dmsBillsMaintInstance) {
DmsBillsMaintInstanceVo newestMaintInstance = dmsBillsMaintInstanceService.getNewestBillsMaintInstance(dmsBillsMaintInstance); DmsBillsMaintInstanceVo newestMaintInstance = dmsBillsMaintInstanceService.getNewestBillsMaintInstance(dmsBillsMaintInstance);
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsMaintInstanceMobile mobileInstance = MapstructUtils.convert(newestMaintInstance, DmsBillsMaintInstanceMobile.class); 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) @Log(title = "保养工单", businessType = BusinessType.START)
@PostMapping("/startMaint") @PostMapping("/startMaint")
@RepeatSubmit @RepeatSubmit
public R startMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { public AjaxResult startMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) {
return R.ok(dmsBillsMaintInstanceService.startMaint(dmsBillsMaintDetail)); dmsBillsMaintInstanceService.startMaint(dmsBillsMaintDetail);
return AjaxResult.success();
} }
/** /**
@ -381,8 +530,9 @@ public class DmsMobileController extends BaseController {
@Log(title = "保养工单", businessType = BusinessType.COMPLETE) @Log(title = "保养工单", businessType = BusinessType.COMPLETE)
@PostMapping("/completeMaint") @PostMapping("/completeMaint")
@RepeatSubmit @RepeatSubmit
public R completeMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) { public AjaxResult completeMaint(@RequestBody DmsBillsMaintDetail dmsBillsMaintDetail) {
return R.ok(dmsBillsMaintInstanceService.completeMaint(dmsBillsMaintDetail)); dmsBillsMaintInstanceService.completeMaint(dmsBillsMaintDetail);
return AjaxResult.success();
} }
@ -394,11 +544,15 @@ public class DmsMobileController extends BaseController {
// @RequiresPermissions("qms:checkrule:list") // @RequiresPermissions("qms:checkrule:list")
@GetMapping("/getNewestLubeInstance") @GetMapping("/getNewestLubeInstance")
// @RepeatSubmit // @RepeatSubmit
public R<DmsBillsLubeInstanceMobile> getNewestLubeInstance(DmsBillsLubeInstanceBo dmsBillsLubeInstance) { public AjaxResult getNewestLubeInstance(DmsBillsLubeInstanceBo dmsBillsLubeInstance) {
DmsBillsLubeInstanceVo newestLubeInstance = dmsBillsLubeInstanceService.getNewestBillsLubeInstance(dmsBillsLubeInstance); DmsBillsLubeInstanceVo newestLubeInstance = dmsBillsLubeInstanceService.getNewestBillsLubeInstance(dmsBillsLubeInstance);
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsLubeInstanceMobile mobileInstance = MapstructUtils.convert(newestLubeInstance, DmsBillsLubeInstanceMobile.class); 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) @Log(title = "润滑工单", businessType = BusinessType.START)
@PostMapping("/startLube") @PostMapping("/startLube")
@RepeatSubmit @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) @Log(title = "润滑工单", businessType = BusinessType.COMPLETE)
@PostMapping("/completeLube") @PostMapping("/completeLube")
@RepeatSubmit @RepeatSubmit
public R completeLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) { public AjaxResult completeLube(@RequestBody DmsBillsLubeDetailBo dmsBillsLubeDetail) {
return R.ok(dmsBillsLubeInstanceService.completeLube(dmsBillsLubeDetail)); dmsBillsLubeInstanceService.completeLube(dmsBillsLubeDetail);
return AjaxResult.success();
} }

@ -24,6 +24,7 @@ public class DmsFaultComponentsParts extends TenantEntity {
/** /**
* ID * ID
*/ */
@TableId(value = "components_parts_id", type = IdType.AUTO)
private Long componentsPartsId; private Long componentsPartsId;
/** /**

@ -1,6 +1,8 @@
package org.dromara.dms.domain; package org.dromara.dms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -28,6 +30,7 @@ public class DmsFaultInstanceActivity extends TenantEntity {
/** /**
* ID * ID
*/ */
@TableId(value = "instance_activity_id", type = IdType.AUTO)
private Long instanceActivityId; private Long instanceActivityId;
/** /**

@ -1,7 +1,8 @@
package org.dromara.dms.domain; package org.dromara.dms.domain;
import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -25,6 +26,7 @@ public class DmsInspectProjectDevice implements Serializable {
/** /**
* ID * ID
*/ */
@TableId(value = "inspect_project_id", type = IdType.AUTO)
private Long inspectProjectId; private Long inspectProjectId;
/** /**

@ -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<String, Object> {
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;
}
}

@ -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;
/**
* - PDAString
*/
private String dictCode;
}

@ -12,7 +12,6 @@ import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.List; import java.util.List;
@ -34,7 +33,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
* ; * ;
*/ */
@ExcelProperty(value = "主键标识;此表不会长期保存") @ExcelProperty(value = "主键标识;此表不会长期保存")
private Long repairInstanceId; private String repairInstanceId;
/** /**
* *
@ -61,19 +60,21 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
*/ */
@ExcelProperty(value = "报修来源ID", converter = ExcelDictConvert.class) @ExcelProperty(value = "报修来源ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "预=留字段不显示") @ExcelDictFormat(readConverterExp = "预=留字段不显示")
private Long faultSourceId; private String faultSourceId;
/** /**
* ID,wf_definition_configid * ID,wf_definition_configid
*/ */
@ExcelProperty(value = "流程定义ID,关联wf_definition_config的id") @ExcelProperty(value = "流程定义ID,关联wf_definition_config的id")
private Long wfDefinitionId; private String wfDefinitionId;
//PDA中等同于以上wfDefinitionId
private String wfProcessId;
/** /**
* IDprod_base_machine_infomachine_id * IDprod_base_machine_infomachine_id
*/ */
@ExcelProperty(value = "设备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 = "申请人") @ExcelProperty(value = "申请人")
private String applyUser; private String applyUser;
/** // /**
* // * 申请时间
*/ // */
@ExcelProperty(value = "申请时间") // @ExcelProperty(value = "申请时间")
private Date applyTime; // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
// private String applyTime;
/** //
* // /**
*/ // * 实际开始时间
@ExcelProperty(value = "实际开始时间") // */
private Date realBeginTime; // @ExcelProperty(value = "实际开始时间")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
/** // private String realBeginTime;
* //
*/ // /**
@ExcelProperty(value = "实际完成时间") // * 实际完成时间
private Date realEndTime; // */
// @ExcelProperty(value = "实际完成时间")
/** // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
* // private String realEndTime;
*/ //
@ExcelProperty(value = "要求完成时间") // /**
private Date requireEndTime; // * 要求完成时间
// */
// @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 * 0 1 2
@ -150,8 +160,9 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
private String filePath;//join private String filePath;//join
private String machineCode;//JOIN
private String machineCode;//JOIN
private String machineName;//JOIN private String machineName;//JOIN
private String machineLocation;//JOIN private String machineLocation;//JOIN
@ -161,7 +172,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
/** /**
* ID machine_id * ID machine_id
*/ */
private int deviceId; private String deviceId;
/** /**
* machine_code * machine_code
@ -182,7 +193,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
* ID machine_type * ID machine_type
* *
*/ */
private Long deviceTypeId; private String deviceTypeId;
/** /**
* machine_spec * machine_spec
@ -197,7 +208,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
private String imgUrl;//JOIN private String imgUrl;//JOIN
private Long instanceActivityId;//JOIN private String instanceActivityId;//JOIN
private String faultType;//JOIN private String faultType;//JOIN
@ -209,7 +220,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
private String repairType;//JOIN private String repairType;//JOIN
private Long outsourcingId;//JOIN private String outsourcingId;//JOIN
private String processHandleResolution;//JOIN private String processHandleResolution;//JOIN
@ -229,9 +240,7 @@ public class DmsBillsFaultInstanceMobile implements Serializable {
private String repairer;//JOIN private String repairer;//JOIN
private Date confirmTime;//JOIN private String componentsPartsId;//JOIN
private Long componentsPartsId;//JOIN
private List<DmsFaultComponentsParts> parts;//JOIN private List<DmsFaultComponentsParts> parts;//JOIN

@ -72,29 +72,29 @@ public class DmsBillsMaintInstanceMobile implements Serializable {
@ExcelDictFormat(dictType = "maint_level") @ExcelDictFormat(dictType = "maint_level")
private Long maintLevel; private Long maintLevel;
// /** /**
// * 计划保养时间 *
// */ */
// @ExcelProperty(value = "计划保养时间") @ExcelProperty(value = "计划保养时间")
// private Date planBeginTime; private String planBeginTime;
//
// /** /**
// * 实际开始时间 *
// */ */
// @ExcelProperty(value = "实际开始时间") @ExcelProperty(value = "实际开始时间")
// private Date realBeginTime; private String realBeginTime;
//
// /** /**
// * 计划完成时间;根据计划的时限计算 * ;
// */ */
// @ExcelProperty(value = "计划完成时间;根据计划的时限计算") @ExcelProperty(value = "计划完成时间;根据计划的时限计算")
// private Date planEndTime; private String planEndTime;
//
// /** /**
// * 实际完成时间 *
// */ */
// @ExcelProperty(value = "实际完成时间") @ExcelProperty(value = "实际完成时间")
// private Date realEndTime; private String realEndTime;
/** /**
* (1 2 3) * (1 2 3)

@ -2,6 +2,7 @@ package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.annotation.ExcelDictFormat;
@ -68,6 +69,8 @@ public class DmsBillsFaultInstanceVo implements Serializable {
*/ */
@ExcelProperty(value = "流程定义ID,关联wf_definition_config的id") @ExcelProperty(value = "流程定义ID,关联wf_definition_config的id")
private Long wfDefinitionId; private Long wfDefinitionId;
//PDA中等同于以上wfDefinitionId
private Long wfProcessId;
/** /**
* IDprod_base_machine_infomachine_id * IDprod_base_machine_infomachine_id
@ -84,24 +87,28 @@ public class DmsBillsFaultInstanceVo implements Serializable {
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "申请时间") @ExcelProperty(value = "申请时间")
private Date applyTime; private Date applyTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "实际开始时间") @ExcelProperty(value = "实际开始时间")
private Date realBeginTime; private Date realBeginTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "实际完成时间") @ExcelProperty(value = "实际完成时间")
private Date realEndTime; private Date realEndTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "要求完成时间") @ExcelProperty(value = "要求完成时间")
private Date requireEndTime; private Date requireEndTime;
@ -229,6 +236,7 @@ public class DmsBillsFaultInstanceVo implements Serializable {
private String repairer;//JOIN private String repairer;//JOIN
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date confirmTime;//JOIN private Date confirmTime;//JOIN
private Long componentsPartsId;//JOIN private Long componentsPartsId;//JOIN

@ -2,6 +2,7 @@ package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; 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 = "计划保养时间") @ExcelProperty(value = "计划保养时间")
private Date planBeginTime; private Date planBeginTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "实际开始时间") @ExcelProperty(value = "实际开始时间")
private Date realBeginTime; private Date realBeginTime;
/** /**
* ; * ;
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "计划完成时间;根据计划的时限计算") @ExcelProperty(value = "计划完成时间;根据计划的时限计算")
private Date planEndTime; private Date planEndTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "实际完成时间") @ExcelProperty(value = "实际完成时间")
private Date realEndTime; private Date realEndTime;
@ -141,6 +146,7 @@ public class DmsBillsMaintInstanceVo implements Serializable {
private List<DmsBillsMaintDetail> dmsBillsMaintDetailList; private List<DmsBillsMaintDetail> dmsBillsMaintDetailList;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
} }

@ -21,7 +21,12 @@ public interface DmsFaultInstanceActivityMapper extends BaseMapperPlus<DmsFaultI
List<DmsFaultComponentsPartsVo> selectPartsById(@Param("repairInstanceId") Long repairInstanceId); List<DmsFaultComponentsPartsVo> selectPartsById(@Param("repairInstanceId") Long repairInstanceId);
Long selectRepairInstanceId(@Param("repairInstanceId")Long repairInstanceId); /**
* IDID
* @param activityId ID
* @return ID
*/
Long selectRepairInstanceId(@Param("activityId") Long activityId);
int deleteByTargetId(@Param("activityId") Long activityId); int deleteByTargetId(@Param("activityId") Long activityId);

@ -1,6 +1,7 @@
package org.dromara.dms.service.impl; package org.dromara.dms.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.alibaba.ttl.TtlRunnable;
import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.seata.spring.annotation.GlobalTransactional; import io.seata.spring.annotation.GlobalTransactional;
@ -38,6 +39,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import cn.dev33.satoken.stp.StpUtil;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -54,7 +56,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
private final DmsBillsFaultInstanceMapper baseMapper; private final DmsBillsFaultInstanceMapper baseMapper;
private final DmsBillsFaultInstanceMapper dmsBillsFaultInstanceMapper;
private final DmsInstanceFileMapper dmsInstanceFileMapper; private final DmsInstanceFileMapper dmsInstanceFileMapper;
@ -194,20 +195,32 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess); RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess);
Long taskId = remoteStartProcessReturn.getTaskId(); 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 { try {
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 现在子线程就像登录过一样可以带着Token去调用其他需要权限的服务了。
updateWorkFlow(add, taskId); updateWorkFlow(add, taskId);
} catch (Exception e) { } catch (Exception e) {
// 简单记录错误,不影响主流程 // 简单记录错误,不影响主流程
System.err.println("异步更新工作流失败repairInstanceId: " + add.getRepairInstanceId() + ", 错误: " + e.getMessage()); System.err.println("异步更新工作流失败repairInstanceId: " + add.getRepairInstanceId() + ", 错误: " + e.getMessage());
// 可以考虑记录到失败表,后续补偿处理 // 可以考虑记录到失败表,后续补偿处理
} }
}); }));
// 创建故障实例活动对象 // 创建故障实例活动对象
/* DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity();
// 设置维修实例ID // 设置维修实例ID
dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId()); dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId());
// 设置流程活动ID // 设置流程活动ID
@ -238,7 +251,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
List<String> fileUrls = add.getFileUrls(); List<String> fileUrls = add.getFileUrls();
// 批量插入实例文件记录 // 批量插入实例文件记录
batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId()); batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId());
*/
return flag; return flag;
} }
@ -252,7 +264,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
*/ */
private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId){ private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId){
dmsBillsFaultInstance.setWfDefinitionId(taskId); dmsBillsFaultInstance.setWfDefinitionId(taskId);
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
// 必填字段 // 必填字段
remoteCompleteTask.setTaskId(taskId); remoteCompleteTask.setTaskId(taskId);
@ -331,8 +343,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
@Override @Override
public DmsFaultInstanceActivity selectFaults(Long repairInstanceId) { public DmsFaultInstanceActivity selectFaults(Long repairInstanceId) {
List<DmsFaultInstanceActivityVo> list = dmsBillsFaultInstanceMapper.selectFaults(repairInstanceId); List<DmsFaultInstanceActivityVo> list = baseMapper.selectFaults(repairInstanceId);
List<DmsFaultComponentsPartsVo> parts = dmsBillsFaultInstanceMapper.selectParts(repairInstanceId); List<DmsFaultComponentsPartsVo> parts = baseMapper.selectParts(repairInstanceId);
DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity(); DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity();
BeanUtils.copyProperties(list.get(0),activity); BeanUtils.copyProperties(list.get(0),activity);
// activity.setCheckedFault(list.get(0).getCheckedFault()); // activity.setCheckedFault(list.get(0).getCheckedFault());
@ -349,7 +361,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
@Override @Override
public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) { public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) {
// 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录
DmsBillsFaultInstanceVo dmsBillsFaultInstance = dmsBillsFaultInstanceMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId);
// 创建实例文件查询对象 // 创建实例文件查询对象
DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo(); DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo();
// 设置目标类型为故障实例活动 // 设置目标类型为故障实例活动
@ -425,9 +437,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
public int updateDmsFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { public int updateDmsFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
// 获取文件URL列表 // 获取文件URL列表
List<String> fileUrls = dmsFaultInstanceActivity.getFileUrls(); List<String> fileUrls = dmsFaultInstanceActivity.getFileUrls();
// 获取活动ID // 获取实例ID
Long activityId = dmsFaultInstanceActivity.getInstanceActivityId(); Long activityId = dmsFaultInstanceActivity.getInstanceActivityId();
// 根据活动ID查询对应的维修实例ID // 根据实例ID查询对应的维修实例ID
Long repairInstanceId = dmsFaultInstanceActivityMapper.selectRepairInstanceId(activityId); Long repairInstanceId = dmsFaultInstanceActivityMapper.selectRepairInstanceId(activityId);
// 创建新的DmsBillsFaultInstance对象 // 创建新的DmsBillsFaultInstance对象
DmsBillsFaultInstance dmsBillsFaultInstance = new DmsBillsFaultInstance(); DmsBillsFaultInstance dmsBillsFaultInstance = new DmsBillsFaultInstance();
@ -437,21 +449,19 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
dmsBillsFaultInstance.setFaultSourceType(dmsFaultInstanceActivity.getFaultSourceType()); dmsBillsFaultInstance.setFaultSourceType(dmsFaultInstanceActivity.getFaultSourceType());
// 设置故障类型 // 设置故障类型
dmsBillsFaultInstance.setFaultType(dmsFaultInstanceActivity.getFaultType()); dmsBillsFaultInstance.setFaultType(dmsFaultInstanceActivity.getFaultType());
// 设置维修实例ID // 设置维修工单ID主键
dmsBillsFaultInstance.setRepairInstanceId(repairInstanceId); dmsBillsFaultInstance.setRepairInstanceId(repairInstanceId);
validEntityBeforeSave(dmsBillsFaultInstance);
// 根据ID更新DmsBillsFaultInstance记录 // 根据ID更新DmsBillsFaultInstance记录
int i = dmsBillsFaultInstanceMapper.updateById(dmsBillsFaultInstance); int i = baseMapper.updateById(dmsBillsFaultInstance);
// 根据目标ID删除DmsFaultInstanceActivity记录
// 根据目标ID删除dms_instance_file表记录
int rows = dmsFaultInstanceActivityMapper.deleteByTargetId(activityId); int rows = dmsFaultInstanceActivityMapper.deleteByTargetId(activityId);
// 批量插入实例文件 // 批量插入实例文件
batchInsertInstanceFiles(fileUrls,activityId); batchInsertInstanceFiles(fileUrls,activityId);
// 将dmsFaultInstanceActivity转换为DmsBillsFaultInstance对象
DmsBillsFaultInstance update = MapstructUtils.convert(dmsFaultInstanceActivity, DmsBillsFaultInstance.class);
// 在保存之前验证实体
validEntityBeforeSave(update);
// 根据ID更新记录并返回影响行数 // 根据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 @Override
public Long scanDevice4Repair(DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) { public Long scanDevice4Repair(DmsBillsFaultInstanceScanBo dmsBillsFaultInstanceScan) {
Long count = dmsBillsFaultInstanceMapper.selectCountByRepairInstanceIdAndDeviceCode( Long count = baseMapper.selectCountByRepairInstanceIdAndDeviceCode(
dmsBillsFaultInstanceScan.getRepairInstanceId(), dmsBillsFaultInstanceScan.getDeviceCode()); dmsBillsFaultInstanceScan.getRepairInstanceId(), dmsBillsFaultInstanceScan.getDeviceCode());
if (count <= 0) { if (count <= 0) {
throw new ServiceException("扫描验证失败"); throw new ServiceException("扫描验证失败");
@ -484,7 +494,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
// 根据维修实例ID查询故障实例信息 // 根据维修实例ID查询故障实例信息
DmsBillsFaultInstance dmsBillsFaultInstance = dmsBillsFaultInstanceMapper DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper
.selectFaultInstanceJoinFirstById(dmsFaultInstanceActivity.getRepairInstanceId());//join 第一步activity .selectFaultInstanceJoinFirstById(dmsFaultInstanceActivity.getRepairInstanceId());//join 第一步activity
// 获取工单状态 // 获取工单状态
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus();
@ -504,17 +514,29 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
dmsBillsFaultInstance.setRealBeginTime(currentDate); dmsBillsFaultInstance.setRealBeginTime(currentDate);
//启动工作流 //启动工作流
Long taskId = getOrCreateTaskId(dmsBillsFaultInstance); 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 { try {
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
StpUtil.setTokenValue(tokenValue);
// 4. 【执行业务】: 现在子线程就像登录过一样可以带着Token去调用其他需要权限的服务了。
updateWorkFlow(dmsBillsFaultInstance, taskId); updateWorkFlow(dmsBillsFaultInstance, taskId);
} catch (Exception e) { } catch (Exception e) {
// 简单记录错误,不影响主流程 // 简单记录错误,不影响主流程
System.err.println("异步更新工作流失败repairInstanceId: " + dmsBillsFaultInstance.getRepairInstanceId() + ", 错误: " + e.getMessage()); System.err.println("异步更新工作流失败repairInstanceId: " + dmsBillsFaultInstance.getRepairInstanceId() + ", 错误: " + e.getMessage());
// 可以考虑记录到失败表,后续补偿处理 // 可以考虑记录到失败表,后续补偿处理
} }
}); }));
// 设置维修实例ID // 设置维修实例ID
@ -635,7 +657,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
remoteCompleteTask.setMessage("同意"); remoteCompleteTask.setMessage("同意");
remoteWorkflowService.completeTask(remoteCompleteTask); remoteWorkflowService.completeTask(remoteCompleteTask);
dmsBillsFaultInstanceMapper.updateById(faultInstance); baseMapper.updateById(faultInstance);
// 设置工单活动状态为已完成,并记录结束时间和维修人员 // 设置工单活动状态为已完成,并记录结束时间和维修人员
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH); 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); DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class);
int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity); int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity);
// 返回更新操作影响的行数 // 返回更新操作影响的行数
return i; return i;
} }

@ -38,6 +38,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="outsourcingId" column="outsourcing_id" /> <result property="outsourcingId" column="outsourcing_id" />
<result property="processHandleResolution" column="process_handle_resolution" /> <result property="processHandleResolution" column="process_handle_resolution" />
<result property="approveStatus" column="approveStatus" /> <result property="approveStatus" column="approveStatus" />
<!-- 添加缺失的字段映射 -->
<result property="checkedFault" column="checked_fault" />
<result property="repairContent" column="repair_content" />
<result property="protectedMethod" column="protected_method" />
<result property="repairer" column="repairer" />
<result property="repairConfirm" column="repair_confirm" />
<result property="confirmTime" column="confirm_time" />
<result property="componentsPartsId" column="components_parts_id" />
</resultMap> </resultMap>

Loading…
Cancel
Save