Browse Source

2026-01-27

标签变动记录【手动重试】功能调整为同步调用
master
fengyuan_yang 1 month ago
parent
commit
1c7da690b7
  1. 11
      src/main/java/com/gaotao/modules/erp/service/ErpInterfaceService.java
  2. 37
      src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java
  3. 45
      src/main/java/com/gaotao/modules/warehouse/service/impl/LabelTransactionLogServiceImpl.java

11
src/main/java/com/gaotao/modules/erp/service/ErpInterfaceService.java

@ -1,5 +1,7 @@
package com.gaotao.modules.erp.service; package com.gaotao.modules.erp.service;
import java.util.Map;
/** /**
* ERP接口调用服务 * ERP接口调用服务
*/ */
@ -22,6 +24,15 @@ public interface ErpInterfaceService {
* @param inboundTransactionId 入库事务ID如果为null则跳过 * @param inboundTransactionId 入库事务ID如果为null则跳过
*/ */
void asyncCallErpInterfaceSequentially(String site, String buNo, String outboundTransactionId, String inboundTransactionId); void asyncCallErpInterfaceSequentially(String site, String buNo, String outboundTransactionId, String inboundTransactionId);
/**
* 同步调用ERP接口用于手动重试等需要同步返回结果的场景
* @param site 工厂
* @param buNo BU编号
* @param transactionId 事务ID
* @return 调用结果 {success: true/false, message: "...", u8CCode: "..."}
*/
Map<String, Object> syncCallErpInterface(String site, String buNo, String transactionId);
} }

37
src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java

@ -684,15 +684,34 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
* 这个方法不使用@Async注解确保在调用线程中同步执行 * 这个方法不使用@Async注解确保在调用线程中同步执行
*/ */
private void callErpInterfaceSync(String site, String buNo, String transactionId) { private void callErpInterfaceSync(String site, String buNo, String transactionId) {
// 直接调用公开的同步方法
syncCallErpInterface(site, buNo, transactionId);
}
/**
* 同步调用ERP接口用于手动重试等需要同步返回结果的场景
* @param site 工厂
* @param buNo BU编号
* @param transactionId 事务ID
* @return 调用结果 {success: true/false, message: "...", u8CCode: "..."}
*/
@Override
public Map<String, Object> syncCallErpInterface(String site, String buNo, String transactionId) {
logger.info("同步调用ERP接口 - site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId); logger.info("同步调用ERP接口 - site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId);
Map<String, Object> result = new HashMap<>();
result.put("success", false);
result.put("message", "");
result.put("u8CCode", "");
try { try {
// 1. 查询StockTransactionLog数据 // 1. 查询StockTransactionLog数据
List<StockTransactionLogEntity> transactionLogs = stockTransactionLogDao.queryByTransactionId(site, buNo, transactionId); List<StockTransactionLogEntity> transactionLogs = stockTransactionLogDao.queryByTransactionId(site, buNo, transactionId);
if (transactionLogs == null || transactionLogs.isEmpty()) { if (transactionLogs == null || transactionLogs.isEmpty()) {
logger.warn("未找到事务记录 - transactionId: {}", transactionId); logger.warn("未找到事务记录 - transactionId: {}", transactionId);
return;
result.put("message", "未找到事务记录");
return result;
} }
// 取第一条记录作为主表数据 // 取第一条记录作为主表数据
@ -701,7 +720,8 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
if (interfaceName == null || interfaceName.trim().isEmpty()) { if (interfaceName == null || interfaceName.trim().isEmpty()) {
logger.warn("接口名称为空 - transactionId: {}", transactionId); logger.warn("接口名称为空 - transactionId: {}", transactionId);
return;
result.put("message", "接口名称为空");
return result;
} }
// 2. 获取接口地址 // 2. 获取接口地址
@ -709,7 +729,8 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
if (apiInterface == null) { if (apiInterface == null) {
logger.error("未找到接口配置 - interfaceName: {}", interfaceName); logger.error("未找到接口配置 - interfaceName: {}", interfaceName);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "未找到接口配置"); saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "未找到接口配置");
return;
result.put("message", "未找到接口配置: " + interfaceName);
return result;
} }
String interfaceUrl = "http://" + apiInterface.getInterfaceIp() + apiInterface.getInterfaceValue(); String interfaceUrl = "http://" + apiInterface.getInterfaceIp() + apiInterface.getInterfaceValue();
@ -746,22 +767,32 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
logger.info("ERP接口调用成功 - U8单号: {}", u8CCode); logger.info("ERP接口调用成功 - U8单号: {}", u8CCode);
stockTransactionLogDao.updateSyncedSuccess(site, buNo, transactionId); stockTransactionLogDao.updateSyncedSuccess(site, buNo, transactionId);
result.put("success", true);
result.put("message", "接口调用成功");
result.put("u8CCode", u8CCode != null ? u8CCode : "");
} else { } else {
// 失败记录到api_log // 失败记录到api_log
String errMsg = jsonResponse.getString("ErrMsg"); String errMsg = jsonResponse.getString("ErrMsg");
logger.error("ERP接口调用失败 - 错误: {}", errMsg); logger.error("ERP接口调用失败 - 错误: {}", errMsg);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, errMsg); saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, errMsg);
result.put("message", errMsg != null ? errMsg : "接口调用失败");
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("调用ERP接口异常 - transactionId: {}, error: {}", transactionId, e.getMessage(), e); logger.error("调用ERP接口异常 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "接口调用异常: " + e.getMessage()); saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "接口调用异常: " + e.getMessage());
result.put("message", "接口调用异常: " + e.getMessage());
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("同步调用ERP接口失败 - transactionId: {}, error: {}", transactionId, e.getMessage(), e); logger.error("同步调用ERP接口失败 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
result.put("message", "同步调用失败: " + e.getMessage());
} }
return result;
} }
/** /**

45
src/main/java/com/gaotao/modules/warehouse/service/impl/LabelTransactionLogServiceImpl.java

@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -46,41 +47,60 @@ public class LabelTransactionLogServiceImpl implements LabelTransactionLogServic
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
List<Map<String, Object>> details = new ArrayList<>();
for (Map<String, Object> retryItem : retryList) { for (Map<String, Object> retryItem : retryList) {
String site = (String) retryItem.get("site"); String site = (String) retryItem.get("site");
String buNo = (String) retryItem.get("buNo"); String buNo = (String) retryItem.get("buNo");
String transactionId = (String) retryItem.get("transactionId"); String transactionId = (String) retryItem.get("transactionId");
Map<String, Object> detail = new HashMap<>();
detail.put("transactionId", transactionId);
try { try {
// 1. 校验StockTransactionLog的传输状态 // 1. 校验StockTransactionLog的传输状态
Map<String, Object> syncStatus = stockTransactionLogDao.getSyncStatus(site, buNo, transactionId); Map<String, Object> syncStatus = stockTransactionLogDao.getSyncStatus(site, buNo, transactionId);
if (syncStatus != null) { if (syncStatus != null) {
String syncedFlag = syncStatus.get("syncedFlag") != null ? syncStatus.get("syncedFlag").toString() : ""; String syncedFlag = syncStatus.get("syncedFlag") != null ? syncStatus.get("syncedFlag").toString() : "";
String syncedErrorMsg = syncStatus.get("syncedErrorMsg") != null ? syncStatus.get("syncedErrorMsg").toString() : "";
// 传输状态必须是"待传输"即synced_flag不为Y且传输消息必须有值
// 传输状态必须是"待传输"即synced_flag不为Y
if ("Y".equalsIgnoreCase(syncedFlag)) { if ("Y".equalsIgnoreCase(syncedFlag)) {
logger.warn("该记录已传输成功,不允许重试,transactionId: {}", transactionId); logger.warn("该记录已传输成功,不允许重试,transactionId: {}", transactionId);
detail.put("status", "failure");
detail.put("message", "该记录已传输成功,不允许重试");
details.add(detail);
failureCount++; failureCount++;
continue; continue;
} }
// if (syncedErrorMsg == null || syncedErrorMsg.trim().isEmpty()) {
// logger.warn("该记录没有错误信息,不允许重试,transactionId: {}", transactionId);
// failureCount++;
// continue;
// }
} }
// 2. 调用ERP接口参考PDA的异步调用方法
logger.info("开始调用ERP接口,site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId);
erpInterfaceService.asyncCallErpInterface(site, buNo, transactionId);
// 2. 同步调用ERP接口返回调用结果
logger.info("开始同步调用ERP接口,site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId);
Map<String, Object> callResult = erpInterfaceService.syncCallErpInterface(site, buNo, transactionId);
boolean success = callResult.get("success") != null && (Boolean) callResult.get("success");
String message = callResult.get("message") != null ? callResult.get("message").toString() : "";
String u8CCode = callResult.get("u8CCode") != null ? callResult.get("u8CCode").toString() : "";
if (success) {
successCount++; successCount++;
logger.info("手动重试成功,transactionId: {}", transactionId);
detail.put("status", "success");
detail.put("message", message);
detail.put("u8CCode", u8CCode);
logger.info("手动重试成功,transactionId: {}, U8单号: {}", transactionId, u8CCode);
} else {
failureCount++;
detail.put("status", "failure");
detail.put("message", message);
logger.warn("手动重试失败,transactionId: {}, 错误: {}", transactionId, message);
}
details.add(detail);
} catch (Exception e) { } catch (Exception e) {
logger.error("手动重试失败,transactionId: {}, error: {}", transactionId, e.getMessage(), e);
logger.error("手动重试异常,transactionId: {}, error: {}", transactionId, e.getMessage(), e);
detail.put("status", "error");
detail.put("message", "重试异常: " + e.getMessage());
details.add(detail);
failureCount++; failureCount++;
} }
} }
@ -91,6 +111,7 @@ public class LabelTransactionLogServiceImpl implements LabelTransactionLogServic
result.put("successCount", successCount); result.put("successCount", successCount);
result.put("failureCount", failureCount); result.put("failureCount", failureCount);
result.put("totalCount", retryList.size()); result.put("totalCount", retryList.size());
result.put("details", details);
return result; return result;
} }

Loading…
Cancel
Save