diff --git a/src/main/java/com/gaotao/modules/erp/service/ErpInterfaceService.java b/src/main/java/com/gaotao/modules/erp/service/ErpInterfaceService.java index 2c143ac..e56b60c 100644 --- a/src/main/java/com/gaotao/modules/erp/service/ErpInterfaceService.java +++ b/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 syncCallErpInterface(String site, String buNo, String transactionId); } diff --git a/src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java b/src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java index bf969c3..a85d156 100644 --- a/src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java +++ b/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 syncCallErpInterface(String site, String buNo, String transactionId) { logger.info("同步调用ERP接口 - site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId); + Map result = new HashMap<>(); + result.put("success", false); + result.put("message", ""); + result.put("u8CCode", ""); + try { // 1. 查询StockTransactionLog数据 List 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; } /** diff --git a/src/main/java/com/gaotao/modules/warehouse/service/impl/LabelTransactionLogServiceImpl.java b/src/main/java/com/gaotao/modules/warehouse/service/impl/LabelTransactionLogServiceImpl.java index 2730fca..c205d26 100644 --- a/src/main/java/com/gaotao/modules/warehouse/service/impl/LabelTransactionLogServiceImpl.java +++ b/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> details = new ArrayList<>(); for (Map retryItem : retryList) { String site = (String) retryItem.get("site"); String buNo = (String) retryItem.get("buNo"); String transactionId = (String) retryItem.get("transactionId"); + Map detail = new HashMap<>(); + detail.put("transactionId", transactionId); + try { // 1. 校验StockTransactionLog的传输状态 Map 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); - - successCount++; - logger.info("手动重试成功,transactionId: {}", transactionId); + // 2. 同步调用ERP接口(返回调用结果) + logger.info("开始同步调用ERP接口,site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId); + Map 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++; + 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; }