fix(dms): 修复 PDA 端获取维修工单详情接口返回值问题

- 增加 outsrcId 字段转换逻辑,确保外协单位 ID 正确返回
- 优化设备信息字段设置,提高接口兼容性
- 改进日志输出,便于问题追踪和调试
- 修复文件上传相关代码,确保附件正确保存
master
zangchenhao 2 weeks ago
parent b0a8c023ed
commit cc42d8783f

@ -456,14 +456,24 @@ public class DmsMobileController extends BaseController {
public AjaxResult 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); DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId);
// 【调试日志】输出查询结果
log.info("PDA获取工单详情repairInstanceId: {}, outsourcingId: {}",
repairInstanceId, billsFaultInstance.getOutsourcingId());
// 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题 // 使用MapstructUtils进行高性能对象转换避免时间字段序列化问题
DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class); DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class);
billsFaultInstance.setDeviceCode(mobileInstance.getMachineCode()); billsFaultInstance.setDeviceCode(mobileInstance.getMachineCode());
billsFaultInstance.setDeviceId(Integer.parseInt(mobileInstance.getMachineId()));
billsFaultInstance.setDeviceName(mobileInstance.getMachineName()); billsFaultInstance.setDeviceName(mobileInstance.getMachineName());
billsFaultInstance.setDeviceLocation(mobileInstance.getMachineLocation()); billsFaultInstance.setDeviceLocation(mobileInstance.getMachineLocation());
billsFaultInstance.setDeviceSpec(mobileInstance.getMachineSpec()); billsFaultInstance.setDeviceSpec(mobileInstance.getMachineSpec());
// 手动格式化时间字段确保PDA客户端兼容性 // 手动格式化时间字段确保PDA客户端兼容性
formatTimeFields(mobileInstance, billsFaultInstance); formatTimeFields(mobileInstance, billsFaultInstance);
// 【调试日志】输出转换后的结果
log.info("PDA转换后结果outsrcId: {}", mobileInstance.getOutsrcId());
return AjaxResult.success(mobileInstance); return AjaxResult.success(mobileInstance);
} }
@ -532,21 +542,15 @@ public class DmsMobileController extends BaseController {
@Log(title = "故障报修工单", businessType = BusinessType.COMPLETE) @Log(title = "故障报修工单", businessType = BusinessType.COMPLETE)
@PostMapping("/completeRepair") @PostMapping("/completeRepair")
@RepeatSubmit @RepeatSubmit
public AjaxResult completeRepair(@RequestParam("dmsFaultInstanceActivity") String activityJson, public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
@RequestParam(value = "files", required = false) List<MultipartFile> files) throws JsonProcessingException { @RequestParam(value = "files", required = false) List<MultipartFile> files) throws JsonProcessingException {
try { try {
// 预处理 "amount" 字段
String processedJson = preprocessAmountFields(activityJson);
ObjectMapper objectMapper = new ObjectMapper();
// 【修复】 忽略未知字段,增强兼容性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DmsFaultInstanceActivityBo dmsFaultInstanceActivity = objectMapper.readValue(processedJson, DmsFaultInstanceActivityBo.class);
// 注意这里不再设置repairConfirm因为在Service层会自动设置为0待确认 // 注意这里不再设置repairConfirm因为在Service层会自动设置为0待确认
dmsFaultInstanceActivity.setConfirmTime(new Date()); dmsFaultInstanceActivity.setConfirmTime(new Date());
String parts1 = dmsFaultInstanceActivity.getParts1(); String parts1 = dmsFaultInstanceActivity.getParts1();
ObjectMapper objectMapper = new ObjectMapper();
// 忽略未知字段,增强兼容性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 由于PDA端传递的parts1是一个JSON字符串这里需要特殊处理 // 由于PDA端传递的parts1是一个JSON字符串这里需要特殊处理
if (parts1 != null && !parts1.isEmpty()) { if (parts1 != null && !parts1.isEmpty()) {
@ -557,16 +561,11 @@ public class DmsMobileController extends BaseController {
dmsFaultInstanceActivity.setParts(parts2); dmsFaultInstanceActivity.setParts(parts2);
} }
List<String> fileUrls = handleFileUploads(files); int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity, files);
dmsFaultInstanceActivity.setFileUrls(fileUrls);
int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity);
return AjaxResult.success(i); return AjaxResult.success(i);
} catch (ServiceException e) { } catch (ServiceException e) {
log.error("完成维修失败:{}", e.getMessage()); log.error("完成维修失败:{}", e.getMessage());
return AjaxResult.error(e.getMessage()); return AjaxResult.error(e.getMessage());
} catch (Exception e) {
log.error("数据处理失败:{}", e.getMessage());
return AjaxResult.error("数据处理失败:" + e.getMessage());
} }
} }

@ -14,9 +14,9 @@ import java.io.Serial;
* @date 2025-04-07 * @date 2025-04-07
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode
@TableName("dms_fault_components_parts") @TableName("dms_fault_components_parts")
public class DmsFaultComponentsParts extends TenantEntity { public class DmsFaultComponentsParts {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

@ -30,7 +30,7 @@ public class DmsFaultInstanceActivity extends TenantEntity {
/** /**
* ID * ID
*/ */
@TableId(value = "instance_activity_id") @TableId(value = "instance_activity_id",type = IdType.ASSIGN_ID)
private Long instanceActivityId; private Long instanceActivityId;
/** /**

@ -1,5 +1,6 @@
package org.dromara.dms.domain.bo; package org.dromara.dms.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
@ -8,6 +9,8 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.dms.domain.DmsBillsFaultInstance; import org.dromara.dms.domain.DmsBillsFaultInstance;
import org.dromara.dms.domain.DmsFaultComponentsParts;
import org.dromara.dms.domain.DmsInstanceFile;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -121,6 +124,10 @@ public class DmsBillsFaultInstanceBo extends BaseEntity {
*/ */
private Long outsourcingId; private Long outsourcingId;
/**
* IDPDAintoutsourcingId
*/
private Integer outsrcId;
/** /**
* ID machine_id * ID machine_id
@ -158,4 +165,81 @@ public class DmsBillsFaultInstanceBo extends BaseEntity {
* String int * String int
*/ */
private int deviceStatus;//DeviceBeen映射 private int deviceStatus;//DeviceBeen映射
private String machineCode;//JOIN
private String machineName;//JOIN
private String machineLocation;//JOIN
private String machineSpec;//JOIN
private String imgUrl;//JOIN
private Long instanceActivityId;//JOIN
private String faultType;//JOIN
private String faultDescription;//JOIN
private String designOperations;//JOIN
private String repairType;//JOIN
/**
* dms_base_outsourcing_infooutsourcing_id;12212
*/
private String processHandleResolution;//JOIN
// private List<SysFile> sysFiles;
private List<DmsInstanceFile> dmsInstanceFiles;//JOIN
private List<DmsInstanceFile> dmsInstanceFiles1;//JOIN
private String checkedFault;//JOIN
private String repairContent;//JOIN
private String protectedMethod;//JOIN
private String repairer;//JOIN
private Date confirmTime;//JOIN
private Long componentsPartsId;//JOIN
private List<DmsFaultComponentsParts> parts;//JOIN
/**
*
*/
private String filePath;//join
/**
*
*/
private String partName;//JOIN
/**
*
*/
private String partSpecifications;//JOIN
/**
*
*/
private Long amount;//JOIN
} }

@ -46,6 +46,8 @@ import cn.dev33.satoken.stp.StpUtil;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import org.springframework.web.multipart.MultipartFile;
import org.dromara.dms.mapper.DmsFaultComponentsPartsMapper;
/** /**
* Service * Service
@ -75,6 +77,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
@DubboReference(timeout = 15000, retries = 1) @DubboReference(timeout = 15000, retries = 1)
private final RemoteFileService remoteFileService; private final RemoteFileService remoteFileService;
private final DmsFaultComponentsPartsMapper dmsFaultComponentsPartsMapper;
/** /**
* *
* *
@ -176,6 +180,12 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
@GlobalTransactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public Boolean insertByBo(DmsBillsFaultInstanceBo bo) { public Boolean insertByBo(DmsBillsFaultInstanceBo bo) {
bo.setMachineId((long) bo.getDeviceId()); bo.setMachineId((long) bo.getDeviceId());
// 【关键修复】处理PDA端outsrcId到outsourcingId的转换
if (bo.getOutsrcId() != null && bo.getOutsrcId() > 0) {
bo.setOutsourcingId(Long.valueOf(bo.getOutsrcId()));
}
DmsBillsFaultInstance add = MapstructUtils.convert(bo, DmsBillsFaultInstance.class); DmsBillsFaultInstance add = MapstructUtils.convert(bo, DmsBillsFaultInstance.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
// 获取当前日期时间 // 获取当前日期时间
@ -253,7 +263,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
})); }));
// 创建故障实例活动对象 // 【重要修改】创建故障实例活动对象 - 只有PDA创建工单时才生成
DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity(); DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity();
// 设置维修实例ID // 设置维修实例ID
dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId()); dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId());
@ -269,9 +279,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
dmsFaultInstanceActivity.setMachineId(add.getMachineId()); dmsFaultInstanceActivity.setMachineId(add.getMachineId());
// 设置维修类型 // 设置维修类型
dmsFaultInstanceActivity.setRepairType(add.getRepairType()); dmsFaultInstanceActivity.setRepairType(add.getRepairType());
// 如果外部资源ID不为空则设置外部资源ID // 【关键修复】如果外部资源ID不为空则设置外部资源ID
if (add.getOutsourcingId() != null) { if (bo.getOutsourcingId() != null) {
dmsFaultInstanceActivity.setOutsourcingId(add.getOutsourcingId()); dmsFaultInstanceActivity.setOutsourcingId(bo.getOutsourcingId());
} }
// 设置处理状态为待审批 // 设置处理状态为待审批
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK); dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK);
@ -281,7 +291,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
dmsFaultInstanceActivityMapper.insert(dmsFaultInstanceActivity); dmsFaultInstanceActivityMapper.insert(dmsFaultInstanceActivity);
//存储图片 //存储图片
// 获取文件URL列表 // 获取文件URL列表
List<String> fileUrls = add.getFileUrls(); List<String> fileUrls = bo.getFileUrls();
// 批量插入实例文件记录 // 批量插入实例文件记录
batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId()); batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId());
return flag; return flag;
@ -443,6 +453,14 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
dmsFaultInstanceActivity.setHandleBy(userName); dmsFaultInstanceActivity.setHandleBy(userName);
dmsFaultInstanceActivity.setHandleTime(currentDate); dmsFaultInstanceActivity.setHandleTime(currentDate);
// 【调试日志】打印传入的活动ID以确认问题根源
log.info("调用startRepair时从控制器传入的instanceActivityId为: {}", dmsFaultInstanceActivity.getInstanceActivityId());
// 【关键修复】在插入新的活动记录前必须将ID设置为空。
// 这是因为传入的dmsFaultInstanceActivity对象可能包含了由PDA端getBillsFaultInstance4Repair接口返回的
// 第一个活动节点process_step_order=1的ID。如果不清空MyBatis会尝试使用这个旧ID插入新记录
// 如果instance_activity_id不是主键或唯一键就会导致数据重复如果是则会抛出主键冲突异常。
dmsFaultInstanceActivity.setInstanceActivityId(null);
// 插入新的故障实例活动记录 // 插入新的故障实例活动记录
boolean result = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity); boolean result = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity);
@ -457,43 +475,55 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) { public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, List<MultipartFile> files) {
// 批量插入实例的附件文件信息 // 更新 dms_fault_instance_activity 表
batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(), dmsFaultInstanceActivity.getInstanceActivityId()); DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity();
activity.setInstanceActivityId(dmsFaultInstanceActivity.getInstanceActivityId());
activity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH);
activity.setEndTime(new Date());
activity.setRepairer(LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname());
dmsFaultInstanceActivityMapper.updateById(activity);
// 获取需要插入的备件列表 // 批量保存处理的零部件
List<DmsFaultComponentsParts> parts = dmsFaultInstanceActivity.getParts(); List<DmsFaultComponentsParts> parts = dmsFaultInstanceActivity.getParts();
if (!CollectionUtils.isEmpty(parts)) { if (parts != null && !parts.isEmpty()) {
for (DmsFaultComponentsParts part : parts) { parts.forEach(part -> {
part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId()); part.setRepairInstanceId(dmsFaultInstanceActivity.getRepairInstanceId());
dmsFaultComponentsPartsMapper.insert(part);
});
}
// 处理文件上传
if (files != null && !files.isEmpty()) {
List<DmsInstanceFile> fileList = new ArrayList<>();
for (MultipartFile file : files) {
try {
RemoteFile remoteFile = remoteFileService.upload(file.getName(), file.getOriginalFilename(), file.getContentType(), file.getBytes());
DmsInstanceFile instanceFile = new DmsInstanceFile();
instanceFile.setTargetId(dmsFaultInstanceActivity.getInstanceActivityId());
instanceFile.setFilePath(remoteFile.getUrl());
instanceFile.setTargetType("1"); // 维修完成图片
fileList.add(instanceFile);
dmsInstanceFileMapper.insert(instanceFile);
} catch (Exception e) {
throw new ServiceException("文件上传失败");
}
} }
dmsFaultInstanceActivityMapper.insertParts(parts);
} }
// 根据维修实例ID查询对应的工单实例 // 更新 dms_bills_fault_instance 表
DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId()); DmsBillsFaultInstance instance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId());
if (dmsBillsFaultInstance == null) { if (instance == null) {
throw new ServiceException("工单不存在"); throw new ServiceException("工单不存在: " + dmsFaultInstanceActivity.getRepairInstanceId());
} }
instance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH);
// 检查工单状态 instance.setRealEndTime(new Date());
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus(); instance.setRepairConfirm("0"); // 设置为待确认状态
if (!dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING)) { baseMapper.updateById(instance);
throw new ServiceException("工单状态不允许完成维修,请先开始维修");
}
// 获取当前日期和时间
Date currentDate = new Date();
String userName = LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname();
// 设置工单状态为维修完成,确认状态为待确认
dmsBillsFaultInstance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH);
dmsBillsFaultInstance.setRealEndTime(currentDate);
dmsBillsFaultInstance.setRepairConfirm("0"); // 设置为待确认状态
// 推进工作流 // 推进工作流
if (dmsBillsFaultInstance.getWfDefinitionId() != null) { if (instance.getWfDefinitionId() != null) {
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId()); Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(instance.getWfDefinitionId());
if (currentTaskId != null) { if (currentTaskId != null) {
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentTaskId); remoteCompleteTask.setTaskId(currentTaskId);
@ -501,7 +531,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
List<String> messageTypes = new ArrayList<>(); List<String> messageTypes = new ArrayList<>();
messageTypes.add("1"); // 站内信 messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes); remoteCompleteTask.setMessageType(messageTypes);
remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode()); remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + instance.getBillsFaultCode());
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask); boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!b) { if (!b) {
throw new ServiceException("工作流推进失败"); throw new ServiceException("工作流推进失败");
@ -509,19 +539,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
} }
// 更新工单状态 return 1;
baseMapper.updateById(dmsBillsFaultInstance);
// 设置工单活动状态为已完成,并记录结束时间和维修人员
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH);
dmsFaultInstanceActivity.setEndTime(currentDate);
dmsFaultInstanceActivity.setRepairer(userName);
// 更新故障实例活动记录
DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class);
int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity);
return i;
} }
/** /**
@ -754,54 +772,101 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
*/ */
@Override @Override
public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) { public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) {
// 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录 try {
DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId); // 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录
DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId);
// 【关键修复】查询零部件信息确保PDA端兼容性 if (dmsBillsFaultInstance == null) {
List<DmsFaultComponentsPartsVo> partsVoList = baseMapper.selectParts(repairInstanceId); throw new ServiceException("工单不存在repairInstanceId: " + repairInstanceId);
if (partsVoList == null) {
partsVoList = new ArrayList<>(); // 确保不为null
}
// 转换为实体对象并设置到工单中
List<DmsFaultComponentsParts> partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class);
dmsBillsFaultInstance.setParts(partsList);
// 创建实例文件查询对象
DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo();
// 设置目标类型为故障实例活动
queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY);
// 设置目标ID为故障实例的活动ID
queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId());
// 查询实例文件列表
List<DmsInstanceFileVo> dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile);
// 遍历实例文件列表FIXME
for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){
// 获取文件路径
String filePath = dmsInstanceFile.getFilePath();
// 如果文件路径不包含"9005"
if(!filePath.contains("9005")){
// 如果文件路径包含"https",将其替换为"http"
if(filePath.contains("https")){
filePath.replaceFirst("https","http");
}
// 找到"/statics"的索引位置
int index= filePath.indexOf("/statics");
// 修改文件路径为新的地址
filePath = "http://118.25.106.99:9005"+filePath.substring(index);
// 设置新的URL和文件路径
dmsInstanceFile.setFilePath(filePath);
}else{
// 如果文件路径包含"9005"直接设置URL为文件路径
dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath());
} }
}
List<DmsInstanceFile> InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class);
// 将修改后的实例文件列表设置到故障实例中
dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles);
// 返回故障实例对象 // 【调试日志】输出查询结果确认outsourcingId是否正确获取
return dmsBillsFaultInstance; log.info("查询工单详情repairInstanceId: {}, outsourcingId: {}, instanceActivityId: {}",
repairInstanceId, dmsBillsFaultInstance.getOutsourcingId(), dmsBillsFaultInstance.getInstanceActivityId());
// 【关键修复】查询零部件信息确保PDA端兼容性
List<DmsFaultComponentsPartsVo> partsVoList = baseMapper.selectParts(repairInstanceId);
if (partsVoList == null) {
partsVoList = new ArrayList<>(); // 确保不为null
}
// 转换为实体对象并设置到工单中
List<DmsFaultComponentsParts> partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class);
dmsBillsFaultInstance.setParts(partsList);
// 创建实例文件查询对象
DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo();
// 设置目标类型为故障实例活动
queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY);
// 设置目标ID为故障实例的活动ID
queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId());
// 查询实例文件列表
List<DmsInstanceFileVo> dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile);
// 遍历实例文件列表FIXME
for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){
// 获取文件路径
String filePath = dmsInstanceFile.getFilePath();
// 如果文件路径不包含"9005"
if(!filePath.contains("9005")){
// 如果文件路径包含"https",将其替换为"http"
if(filePath.contains("https")){
filePath.replaceFirst("https","http");
}
// 找到"/statics"的索引位置
int index= filePath.indexOf("/statics");
// 修改文件路径为新的地址
filePath = "http://118.25.106.99:9005"+filePath.substring(index);
// 设置新的URL和文件路径
dmsInstanceFile.setFilePath(filePath);
}else{
// 如果文件路径包含"9005"直接设置URL为文件路径
dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath());
}
}
List<DmsInstanceFile> InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class);
// 将修改后的实例文件列表设置到故障实例中
dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles);
// 返回故障实例对象
return dmsBillsFaultInstance;
} catch (Exception e) {
log.error("查询工单详情异常repairInstanceId: {}", repairInstanceId, e);
// 如果是查询返回多条记录的异常,尝试备用查询方案
if (e.getMessage() != null && e.getMessage().contains("Expected one result")) {
log.warn("检测到查询返回多条记录异常尝试备用查询方案repairInstanceId: {}", repairInstanceId);
// 备用方案:查询工单基本信息和最新的活动记录
DmsBillsFaultInstanceVo workOrder = baseMapper.selectVoById(repairInstanceId);
if (workOrder != null) {
// 查询最新的活动记录
MPJLambdaWrapper<DmsFaultInstanceActivity> wrapper = JoinWrappers.lambda(DmsFaultInstanceActivity.class)
.eq(DmsFaultInstanceActivity::getRepairInstanceId, repairInstanceId)
.orderByDesc(DmsFaultInstanceActivity::getProcessStepOrder)
.orderByDesc(DmsFaultInstanceActivity::getInstanceActivityId)
.last("LIMIT 1");
DmsFaultInstanceActivity latestActivity = dmsFaultInstanceActivityMapper.selectOne(wrapper);
if (latestActivity != null) {
// 设置活动相关信息
workOrder.setInstanceActivityId(latestActivity.getInstanceActivityId());
workOrder.setFaultType(latestActivity.getFaultType());
workOrder.setFaultDescription(latestActivity.getFaultDescription());
workOrder.setDesignOperations(latestActivity.getDesignOperations());
workOrder.setRepairType(latestActivity.getRepairType());
workOrder.setOutsourcingId(latestActivity.getOutsourcingId());
workOrder.setProcessHandleResolution(latestActivity.getProcessHandleResolution());
}
log.info("备用查询方案成功repairInstanceId: {}, instanceActivityId: {}",
repairInstanceId, workOrder.getInstanceActivityId());
return workOrder;
}
}
throw new ServiceException("查询工单详情失败:" + e.getMessage());
}
} }

@ -78,7 +78,8 @@ public class DmsFaultComponentsPartsServiceImpl implements IDmsFaultComponentsPa
.like(StringUtils.isNotBlank(bo.getPartName()), DmsFaultComponentsParts::getPartName, bo.getPartName()) .like(StringUtils.isNotBlank(bo.getPartName()), DmsFaultComponentsParts::getPartName, bo.getPartName())
.eq(StringUtils.isNotBlank(bo.getPartSpecifications()), DmsFaultComponentsParts::getPartSpecifications, bo.getPartSpecifications()) .eq(StringUtils.isNotBlank(bo.getPartSpecifications()), DmsFaultComponentsParts::getPartSpecifications, bo.getPartSpecifications())
.eq(bo.getAmount() != null, DmsFaultComponentsParts::getAmount, bo.getAmount()) .eq(bo.getAmount() != null, DmsFaultComponentsParts::getAmount, bo.getAmount())
.orderByDesc(DmsFaultComponentsParts::getCreateTime); //.orderByDesc(DmsFaultComponentsParts::getCreateTime)
;
return lqw; return lqw;
} }

@ -134,10 +134,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from dms_bills_fault_instance dbfi from dms_bills_fault_instance dbfi
left join prod_base_machine_info dbdl on dbfi.machine_id=dbdl.machine_id left join prod_base_machine_info dbdl on dbfi.machine_id=dbdl.machine_id
left join dms_fault_instance_activity dfia on (dbfi.repair_instance_id=dfia.repair_instance_id left join dms_fault_instance_activity dfia on (dbfi.repair_instance_id=dfia.repair_instance_id
and dfia.process_step_order = ( and dfia.instance_activity_id = (
select max(process_step_order) select max(instance_activity_id)
from dms_fault_instance_activity dfia2 from dms_fault_instance_activity dfia2
where dfia2.repair_instance_id = dbfi.repair_instance_id where dfia2.repair_instance_id = dbfi.repair_instance_id
and dfia2.process_step_order = (
select max(process_step_order)
from dms_fault_instance_activity dfia3
where dfia3.repair_instance_id = dbfi.repair_instance_id
)
)) ))
where dbfi.repair_instance_id = #{repairInstanceId} where dbfi.repair_instance_id = #{repairInstanceId}
</select> </select>

Loading…
Cancel
Save