|
|
|
@ -1,6 +1,7 @@ |
|
|
|
package com.gaotao.modules.autoWareHourceHaian.api.service.impl; |
|
|
|
|
|
|
|
import com.alibaba.fastjson2.JSONObject; |
|
|
|
import com.alibaba.fastjson2.JSONWriter; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.gaotao.modules.autoWareHourceHaian.staticData.HaiAnAgvCallbackTypeStaticData; |
|
|
|
import com.gaotao.modules.autoWareHourceHaian.staticData.HaiAnAreaStaticData; |
|
|
|
@ -47,7 +48,9 @@ import com.gaotao.modules.check.service.PhysicalInventoryService; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.PlatformTransactionManager; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.transaction.support.TransactionTemplate; |
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
@ -92,6 +95,10 @@ public class HaiAnWmsMessageServiceImpl implements HaiAnWmsMessageService { |
|
|
|
@Autowired |
|
|
|
private HaiAnInterfaceCallLogService haiAnInterfaceCallLogService; |
|
|
|
|
|
|
|
/** RFID复核业务事务管理器;在事务提交或回滚后记录接口结果,避免把提交失败误记为调用成功。- rqrq */ |
|
|
|
@Autowired |
|
|
|
private PlatformTransactionManager transactionManager; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private HaiAnSysErrorLogService haiAnSysErrorLogService; |
|
|
|
|
|
|
|
@ -185,11 +192,51 @@ public class HaiAnWmsMessageServiceImpl implements HaiAnWmsMessageService { |
|
|
|
/** |
|
|
|
* @Description 立库同步RFID复核:在线表同site+taskNo+RFID复核动作已有记录时复用首次结果,否则比对并写入已录入明细后返回立库报文。- rqrq |
|
|
|
* @param data site、搬运taskNo、palletId必填;rfidBarcodes空值按空盘比对,不要求运输主表已存在。- rqrq |
|
|
|
* @return 首次响应的完整字段;重复调用返回已保存的首次响应,不因再次扫描改变运输动作。- rqrq |
|
|
|
* @return 首次响应的完整字段;每次调用独立记录请求、完整响应或异常和耗时,重复调用仍返回已保存的首次响应。- rqrq |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public HaiAnInboundRfidVerifyResult verifyInboundPalletRfid(HaiAnInboundRfidVerifyRequest data) { |
|
|
|
long startTime = System.currentTimeMillis(); |
|
|
|
// 日志以请求site及taskNo定位;缺site时仅日志归属回落54,业务事务仍严格校验原请求,禁止用日志兜底值执行业务。- rqrq |
|
|
|
String logSite = resolveSite(data == null ? null : data.getSite()); |
|
|
|
String businessKey = data == null ? null : normalizeText(data.getTaskNo()); |
|
|
|
String requestJson = JSONObject.toJSONString(data); |
|
|
|
HaiAnInboundRfidVerifyResult result = null; |
|
|
|
String callStatus = "ERROR"; |
|
|
|
String errorMessage = null; |
|
|
|
try { |
|
|
|
// 每次调用新建事务模板,由模板统一提交或回滚复核明细;私有方法不依赖同类事务代理,提交失败进入异常日志分支。- rqrq |
|
|
|
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); |
|
|
|
result = transactionTemplate.execute(transactionStatus -> verifyInboundPalletRfidInTransaction(data)); |
|
|
|
// verifyPassed=false是已完成的业务复核结论,调用状态仍为SUCCESS;标签差异保留在完整响应中供日志页面查看。- rqrq |
|
|
|
callStatus = "SUCCESS"; |
|
|
|
return result; |
|
|
|
} catch (RuntimeException ex) { |
|
|
|
// 校验、数据库及事务提交异常保持原样抛给统一异常处理器;独立日志保存异常原因,不改变原接口错误协议。- rqrq |
|
|
|
errorMessage = ex.getMessage(); |
|
|
|
throw ex; |
|
|
|
} finally { |
|
|
|
try { |
|
|
|
// 每次首次复核或幂等返回均落一条完整海安日志;响应包含null字段,异常保存errorMessage,耗时包含业务事务提交。- rqrq |
|
|
|
String responseJson = "SUCCESS".equals(callStatus) |
|
|
|
? JSONObject.toJSONString(result, JSONWriter.Feature.WriteNulls) : null; |
|
|
|
// 通过独立日志服务事务写haian_interface_call_log;业务回滚不丢失日志,日志事务异常仅告警,不覆盖原响应或异常。- rqrq |
|
|
|
haiAnInterfaceCallLogService.haiAnLogCompleteCall( |
|
|
|
"HaiAnWmsMessageService", "verifyInboundPalletRfid", requestJson, |
|
|
|
responseJson, callStatus, errorMessage, System.currentTimeMillis() - startTime, |
|
|
|
logSite, businessKey, "海安入库RFID同步复核 /api/wms54/inbound/verifyPalletRfid"); |
|
|
|
} catch (RuntimeException logException) { |
|
|
|
log.warn("海安RFID复核接口日志写入失败 - rqrq,site=" + logSite + ",taskNo=" + businessKey, logException); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @Description 在调用方事务模板内执行RFID复核与在线幂等判断;本方法不申请应用锁,不读取历史表,异常交由外层回滚并记接口日志。- rqrq |
|
|
|
* @param data 原始立库请求,site、taskNo和palletId在本方法中校验,不使用日志兜底参数。- rqrq |
|
|
|
* @return 已在线保存的首次完整复核响应;在线无记录时完成本次比对并写入明细。- rqrq |
|
|
|
*/ |
|
|
|
private HaiAnInboundRfidVerifyResult verifyInboundPalletRfidInTransaction(HaiAnInboundRfidVerifyRequest data) { |
|
|
|
if (data == null || !StringUtils.hasText(data.getSite()) |
|
|
|
|| !StringUtils.hasText(data.getTaskNo()) |
|
|
|
|| !StringUtils.hasText(data.getPalletId())) { |
|
|
|
|