refactor(dms): 优化消息通知和工作流推进逻辑

- 修改消息类型为站内信(1)
- 添加消息通知内容,根据不同场景设置相应的通知文本
- 修复设备编码标签字段映射问题
- 优化外协单位ID和维修类型转换逻辑
- 增加对未知字段的兼容性处理
- 优化文件上传和JSON解析逻辑
- 统一检查、润滑、保养工单的消息类型和通知内容
master
zangchenhao 4 days ago
parent f95724ba65
commit b0a8c023ed

@ -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());
}
}
/**
* JSONamount
* "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());
}
}

@ -235,11 +235,13 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
// 推进工作流状态
RemoteCompleteTask completeTask = new RemoteCompleteTask();
completeTask.setTaskId(taskId);
completeTask.setMessage("检查工单启动,自动推进");
completeTask.setMessage("系统自动创建检查工单,请及时处理");
// 设置消息类型为非null的List
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
messageTypes.add("1"); // 站内信
completeTask.setMessageType(messageTypes);
// 设置消息通知内容
completeTask.setNotice("您有新的检查工单需要处理,工单编号:" + businessId);
// 【关键修复】在调用工作流推进前再次确认租户上下文
log.info("检查工作流推进前当前租户ID: {}", TenantHelper.getTenantId());

@ -254,11 +254,13 @@ public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService
// 2. 推进工作流状态
RemoteCompleteTask completeTask = new RemoteCompleteTask();
completeTask.setTaskId(taskId);
completeTask.setMessage("润滑工单启动,自动推进");
completeTask.setMessage("系统自动创建润滑工单,请及时处理");
// 设置消息类型为非null的List
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
messageTypes.add("1"); // 站内信
completeTask.setMessageType(messageTypes);
// 设置消息通知内容
completeTask.setNotice("您有新的润滑工单需要处理,工单编号:" + businessId);
// 【关键修复】在调用工作流推进前再次确认租户上下文
log.info("工作流推进前当前租户ID: {}", TenantHelper.getTenantId());

@ -257,11 +257,13 @@ public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceServic
// 2. 推进工作流状态
RemoteCompleteTask completeTask = new RemoteCompleteTask();
completeTask.setTaskId(taskId);
completeTask.setMessage("保养工单启动,自动推进");
completeTask.setMessage("系统自动创建保养工单,请及时处理");
// 设置消息类型为非null的List
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system"); // 系统消息
messageTypes.add("1"); // 站内信
completeTask.setMessageType(messageTypes);
// 设置消息通知内容
completeTask.setNotice("您有新的保养工单需要处理,工单编号:" + businessId);
// 【关键修复】在调用工作流推进前再次确认租户上下文
log.info("保养工作流推进前当前租户ID: {}", TenantHelper.getTenantId());

@ -339,9 +339,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
// 设置消息类型
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system");
messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes);
// 设置消息通知内容
if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) {
remoteCompleteTask.setNotice("故障报修工单审批通过,请及时处理,工单编号:" + workOrder.getBillsFaultCode());
} else {
remoteCompleteTask.setNotice("故障报修工单审批被拒绝,工单编号:" + workOrder.getBillsFaultCode());
}
// 设置工作流变量 - approveStatus用于互斥网关判断
Map<String, Object> variables = new HashMap<>();
variables.put("approveStatus", approveStatus);
@ -413,8 +420,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
remoteCompleteTask.setTaskId(currentTaskId);
remoteCompleteTask.setMessage("开始维修");
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system");
messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes);
remoteCompleteTask.setNotice("故障报修工单已开始维修,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode());
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!b) {
throw new ServiceException("工作流推进失败");
@ -491,8 +499,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
remoteCompleteTask.setTaskId(currentTaskId);
remoteCompleteTask.setMessage("完成维修");
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system");
messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes);
remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode());
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!b) {
throw new ServiceException("工作流推进失败");
@ -581,9 +590,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
remoteCompleteTask.setVariables(variables);
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system");
messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes);
// 设置消息通知内容
if ("1".equals(confirmResult)) {
remoteCompleteTask.setNotice("故障报修工单已完成,工单编号:" + workOrder.getBillsFaultCode());
} else {
remoteCompleteTask.setNotice("故障报修工单确认不通过,需重新维修,工单编号:" + workOrder.getBillsFaultCode());
}
boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!workflowResult) {
log.warn("工作流推进失败但业务状态已更新成功repairInstanceId: {}, confirmResult: {}",
@ -627,9 +643,12 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
// 设置消息类型
List<String> messageTypes = new ArrayList<>();
messageTypes.add("system");
messageTypes.add("1"); // 站内信
remoteCompleteTask.setMessageType(messageTypes);
// 设置消息通知内容
remoteCompleteTask.setNotice("您有新的故障报修工单需要审批,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode());
// 设置工作流变量(如果需要)
Map<String, Object> variables = new HashMap<>();
variables.put("businessId", dmsBillsFaultInstance.getRepairInstanceId().toString());

Loading…
Cancel
Save