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

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

@ -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<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
* @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<List<Outsourcing>> getOutsrcInfos() {
public AjaxResult getOutsrcInfos() {
DmsBaseOutsourcingInfoBo queryBaseOutsrcInfo = new DmsBaseOutsourcingInfoBo();
//沒有外协状态,用激活状态
@ -139,17 +245,6 @@ public class DmsMobileController extends BaseController {
queryBaseOutsrcInfo.setActiveFlag("1");
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<>();
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<List<DeviceBeen>> likeDeviceName(String deviceName) {
public AjaxResult likeDeviceName(String deviceName) {
// 直接调用 PDA 端专用查询方法,无需对象转换
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)
@PostMapping("/insertFaultInstsanceActivity")
@RepeatSubmit
public R insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance,
List<MultipartFile> files) {
List<String> fileUrls = handleFileUploads(files);
public AjaxResult insertFaultInstsanceActivity(DmsBillsFaultInstanceBo dmsBillsFaultInstance,
List<MultipartFile> 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);
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<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")
@GetMapping("/getBillsFaultInstanceByRepairInstanceId/{repairInstanceId}")
@RepeatSubmit
public R<DmsBillsFaultInstanceMobile> 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<Integer> updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files") List<MultipartFile> files) {
public AjaxResult updateFaultInstanceActivity(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files" , required = false) List<MultipartFile> files) {
List<String> 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<DmsBillsFaultInstanceMobile> 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<Long> 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<Integer> 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<MultipartFile> files) throws JsonProcessingException {
public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files", required = false) List<MultipartFile> files) throws JsonProcessingException {
dmsFaultInstanceActivity.setRepairConfirm("2");
dmsFaultInstanceActivity.setConfirmTime(new Date());
String parts1 = dmsFaultInstanceActivity.getParts1();
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);
List<String> 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<DmsBillsInspectInstanceMobile> 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<DmsBillsMaintInstanceMobile> 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<DmsBillsLubeInstanceMobile> 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();
}

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

@ -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;
/**

@ -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;
/**

@ -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.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_configid
*/
@ExcelProperty(value = "流程定义ID,关联wf_definition_config的id")
private Long wfDefinitionId;
private String wfDefinitionId;
//PDA中等同于以上wfDefinitionId
private String wfProcessId;
/**
* IDprod_base_machine_infomachine_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<DmsFaultComponentsParts> parts;//JOIN

@ -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)

@ -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;
/**
* IDprod_base_machine_infomachine_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

@ -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<DmsBillsMaintDetail> dmsBillsMaintDetailList;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}

@ -21,7 +21,12 @@ public interface DmsFaultInstanceActivityMapper extends BaseMapperPlus<DmsFaultI
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);

@ -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<String> 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<DmsFaultInstanceActivityVo> list = dmsBillsFaultInstanceMapper.selectFaults(repairInstanceId);
List<DmsFaultComponentsPartsVo> parts = dmsBillsFaultInstanceMapper.selectParts(repairInstanceId);
List<DmsFaultInstanceActivityVo> list = baseMapper.selectFaults(repairInstanceId);
List<DmsFaultComponentsPartsVo> 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<String> 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;
}

@ -38,6 +38,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="outsourcingId" column="outsourcing_id" />
<result property="processHandleResolution" column="process_handle_resolution" />
<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>

Loading…
Cancel
Save