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;
import java.util.Map;
/**
* ERP接口调用服务
*/
@ -22,6 +24,15 @@ public interface ErpInterfaceService {
* @param inboundTransactionId 入库事务ID如果为null则跳过
*/
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注解确保在调用线程中同步执行
*/
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);
Map<String, Object> result = new HashMap<>();
result.put("success", false);
result.put("message", "");
result.put("u8CCode", "");
try {
// 1. 查询StockTransactionLog数据
List<StockTransactionLogEntity> transactionLogs = stockTransactionLogDao.queryByTransactionId(site, buNo, transactionId);
if (transactionLogs == null || transactionLogs.isEmpty()) {
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()) {
logger.warn("接口名称为空 - transactionId: {}", transactionId);
return;
result.put("message", "接口名称为空");
return result;
}
// 2. 获取接口地址
@ -709,7 +729,8 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
if (apiInterface == null) {
logger.error("未找到接口配置 - interfaceName: {}", interfaceName);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "未找到接口配置");
return;
result.put("message", "未找到接口配置: " + interfaceName);
return result;
}
String interfaceUrl = "http://" + apiInterface.getInterfaceIp() + apiInterface.getInterfaceValue();
@ -746,22 +767,32 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
logger.info("ERP接口调用成功 - U8单号: {}", u8CCode);
stockTransactionLogDao.updateSyncedSuccess(site, buNo, transactionId);
result.put("success", true);
result.put("message", "接口调用成功");
result.put("u8CCode", u8CCode != null ? u8CCode : "");
} else {
// 失败记录到api_log
String errMsg = jsonResponse.getString("ErrMsg");
logger.error("ERP接口调用失败 - 错误: {}", errMsg);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, errMsg);
result.put("message", errMsg != null ? errMsg : "接口调用失败");
}
} catch (Exception e) {
logger.error("调用ERP接口异常 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "接口调用异常: " + e.getMessage());
result.put("message", "接口调用异常: " + e.getMessage());
}
} catch (Exception 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.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -46,41 +47,60 @@ public class LabelTransactionLogServiceImpl implements LabelTransactionLogServic
int successCount = 0;
int failureCount = 0;
List<Map<String, Object>> details = new ArrayList<>();
for (Map<String, Object> retryItem : retryList) {
String site = (String) retryItem.get("site");
String buNo = (String) retryItem.get("buNo");
String transactionId = (String) retryItem.get("transactionId");
Map<String, Object> detail = new HashMap<>();
detail.put("transactionId", transactionId);
try {
// 1. 校验StockTransactionLog的传输状态
Map<String, Object> syncStatus = stockTransactionLogDao.getSyncStatus(site, buNo, transactionId);
if (syncStatus != null) {
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)) {
logger.warn("该记录已传输成功,不允许重试,transactionId: {}", transactionId);
detail.put("status", "failure");
detail.put("message", "该记录已传输成功,不允许重试");
details.add(detail);
failureCount++;
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++;
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) {
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++;
}
}
@ -91,6 +111,7 @@ public class LabelTransactionLogServiceImpl implements LabelTransactionLogServic
result.put("successCount", successCount);
result.put("failureCount", failureCount);
result.put("totalCount", retryList.size());
result.put("details", details);
return result;
}

Loading…
Cancel
Save