|
|
|
@ -3,6 +3,7 @@ package org.dromara.dms.controller;
|
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
|
|
import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
|
@ -99,6 +100,10 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
|
|
|
|
|
// 设置审批状态字段,确保PDA端能获取到审批信息
|
|
|
|
|
mobileInstance.setApproveStatus(voInstance.getApproveStatus());
|
|
|
|
|
|
|
|
|
|
// 【修复】设置设备编码标签字段,用于PDA端验证扫描设备编码
|
|
|
|
|
// 该字段用于PDA端startRepair方法中验证扫描的设备编码与工单中的设备编码是否一致
|
|
|
|
|
mobileInstance.setDeviceCodeTag(voInstance.getMachineCode());
|
|
|
|
|
|
|
|
|
|
// ID字段类型转换 - Long到String,并处理字段映射差异
|
|
|
|
|
if (voInstance.getRepairInstanceId() != null) {
|
|
|
|
@ -117,6 +122,45 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
mobileInstance.setMachineId(String.valueOf(voInstance.getMachineId()));
|
|
|
|
|
mobileInstance.setDeviceId(String.valueOf(voInstance.getMachineId()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【关键修复】处理外协单位ID转换:Long outsourcingId -> int outsrcId
|
|
|
|
|
if (voInstance.getOutsourcingId() != null) {
|
|
|
|
|
try {
|
|
|
|
|
mobileInstance.setOutsrcId(Math.toIntExact(voInstance.getOutsourcingId()));
|
|
|
|
|
} catch (ArithmeticException e) {
|
|
|
|
|
log.warn("外协单位ID转换失败,值过大: {}", voInstance.getOutsourcingId());
|
|
|
|
|
mobileInstance.setOutsrcId(0); // 设置为0作为默认值
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
mobileInstance.setOutsrcId(0); // 当outsourcingId为null时,明确设置为0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【关键修复】处理维修类型转换:String repairType -> int repairType 并设置radioState
|
|
|
|
|
int repairTypeInt = 1; // 默认为内部维修
|
|
|
|
|
if (voInstance.getRepairType() != null) {
|
|
|
|
|
try {
|
|
|
|
|
repairTypeInt = Integer.parseInt(voInstance.getRepairType());
|
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
|
log.warn("维修类型转换失败,无效值: {}, 使用默认值1", voInstance.getRepairType());
|
|
|
|
|
repairTypeInt = 1; // 默认为内部维修
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mobileInstance.setRepairType(String.valueOf(repairTypeInt));
|
|
|
|
|
|
|
|
|
|
// 【关键修复】根据维修类型设置单选按钮状态(模拟PDA端的repairTypeSelect逻辑)
|
|
|
|
|
if (repairTypeInt == 1) {
|
|
|
|
|
// 内部维修
|
|
|
|
|
mobileInstance.setRadioState1(true);
|
|
|
|
|
mobileInstance.setRadioState2(false);
|
|
|
|
|
} else if (repairTypeInt == 2) {
|
|
|
|
|
// 委外维修
|
|
|
|
|
mobileInstance.setRadioState1(false);
|
|
|
|
|
mobileInstance.setRadioState2(true);
|
|
|
|
|
} else {
|
|
|
|
|
// 未知类型,默认为内部维修
|
|
|
|
|
mobileInstance.setRadioState1(true);
|
|
|
|
|
mobileInstance.setRadioState2(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -414,6 +458,10 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
DmsBillsFaultInstanceVo billsFaultInstance = dmsBillsFaultInstanceService.selectDmsBillsFaultInstanceByRepairInstanceId(repairInstanceId);
|
|
|
|
|
// 使用MapstructUtils进行高性能对象转换,避免时间字段序列化问题
|
|
|
|
|
DmsBillsFaultInstanceMobile mobileInstance = MapstructUtils.convert(billsFaultInstance, DmsBillsFaultInstanceMobile.class);
|
|
|
|
|
billsFaultInstance.setDeviceCode(mobileInstance.getMachineCode());
|
|
|
|
|
billsFaultInstance.setDeviceName(mobileInstance.getMachineName());
|
|
|
|
|
billsFaultInstance.setDeviceLocation(mobileInstance.getMachineLocation());
|
|
|
|
|
billsFaultInstance.setDeviceSpec(mobileInstance.getMachineSpec());
|
|
|
|
|
// 手动格式化时间字段,确保PDA客户端兼容性
|
|
|
|
|
formatTimeFields(mobileInstance, billsFaultInstance);
|
|
|
|
|
return AjaxResult.success(mobileInstance);
|
|
|
|
@ -443,16 +491,40 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
@Log(title = "故障报修工单", businessType = BusinessType.START)
|
|
|
|
|
@PostMapping("/startRepair")
|
|
|
|
|
@RepeatSubmit
|
|
|
|
|
public AjaxResult startRepair(@RequestBody DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
public AjaxResult startRepair(@RequestBody String json) {
|
|
|
|
|
try {
|
|
|
|
|
// 预处理 "amount" 字段
|
|
|
|
|
String processedJson = preprocessAmountFields(json);
|
|
|
|
|
|
|
|
|
|
// 手动反序列化
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
// 【修复】 忽略未知字段,增强兼容性
|
|
|
|
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
|
|
|
|
DmsFaultInstanceActivityBo dmsFaultInstanceActivity = objectMapper.readValue(processedJson, DmsFaultInstanceActivityBo.class);
|
|
|
|
|
|
|
|
|
|
int i = dmsBillsFaultInstanceService.startRepair(dmsFaultInstanceActivity);
|
|
|
|
|
return AjaxResult.success(i);
|
|
|
|
|
} catch (ServiceException e) {
|
|
|
|
|
log.error("开始维修失败:{}", e.getMessage());
|
|
|
|
|
return AjaxResult.error(e.getMessage());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("数据处理失败:{}", e.getMessage());
|
|
|
|
|
return AjaxResult.error("数据处理失败:" + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 预处理JSON字符串中的amount字段,将小数格式转换为整数格式
|
|
|
|
|
* 例如:将"1.0"转换为"1"
|
|
|
|
|
*/
|
|
|
|
|
private String preprocessAmountFields(String json) {
|
|
|
|
|
if (json == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
// 将 "amount":"1.0" 转换成 "amount":1
|
|
|
|
|
return json.replaceAll("\"amount\"\\s*:\\s*\"?([0-9]+)\\.0+\"?", "\"amount\":$1");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 完成维修
|
|
|
|
|
*/
|
|
|
|
@ -460,16 +532,31 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
@Log(title = "故障报修工单", businessType = BusinessType.COMPLETE)
|
|
|
|
|
@PostMapping("/completeRepair")
|
|
|
|
|
@RepeatSubmit
|
|
|
|
|
public AjaxResult completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity,
|
|
|
|
|
public AjaxResult completeRepair(@RequestParam("dmsFaultInstanceActivity") String activityJson,
|
|
|
|
|
@RequestParam(value = "files", required = false) List<MultipartFile> files) throws JsonProcessingException {
|
|
|
|
|
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(待确认)
|
|
|
|
|
dmsFaultInstanceActivity.setConfirmTime(new Date());
|
|
|
|
|
String parts1 = dmsFaultInstanceActivity.getParts1();
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
List<DmsFaultComponentsParts> parts2 = objectMapper.readValue(parts1, new TypeReference<List<DmsFaultComponentsParts>>() {
|
|
|
|
|
});
|
|
|
|
|
dmsFaultInstanceActivity.setParts(parts2);
|
|
|
|
|
|
|
|
|
|
// 由于PDA端传递的parts1是一个JSON字符串,这里需要特殊处理
|
|
|
|
|
if (parts1 != null && !parts1.isEmpty()) {
|
|
|
|
|
// 预处理 "amount" 字段
|
|
|
|
|
String processedPartsJson = preprocessAmountFields(parts1);
|
|
|
|
|
List<DmsFaultComponentsParts> parts2 = objectMapper.readValue(processedPartsJson, new TypeReference<List<DmsFaultComponentsParts>>() {
|
|
|
|
|
});
|
|
|
|
|
dmsFaultInstanceActivity.setParts(parts2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<String> fileUrls = handleFileUploads(files);
|
|
|
|
|
dmsFaultInstanceActivity.setFileUrls(fileUrls);
|
|
|
|
|
int i = dmsBillsFaultInstanceService.completeRepair(dmsFaultInstanceActivity);
|
|
|
|
@ -477,6 +564,9 @@ public class DmsMobileController extends BaseController {
|
|
|
|
|
} catch (ServiceException e) {
|
|
|
|
|
log.error("完成维修失败:{}", e.getMessage());
|
|
|
|
|
return AjaxResult.error(e.getMessage());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("数据处理失败:{}", e.getMessage());
|
|
|
|
|
return AjaxResult.error("数据处理失败:" + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|