package com.vincent.rsf.server.api.feign.fallback; import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam; import com.vincent.rsf.server.api.controller.erp.params.InventoryAdjustReportParam; import com.vincent.rsf.server.api.feign.CloudWmsErpFeignClient; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * 云仓WMS Feign 客户端降级处理,在 Feign 内统一返回错误响应(不抛异常)。 * 由 CloudWmsErpFeignClientFallbackFactory 创建并传入异常 cause。 */ @Slf4j @Component public class CloudWmsErpFeignClientFallback implements CloudWmsErpFeignClient { private final Throwable cause; public CloudWmsErpFeignClientFallback() { this.cause = null; } public CloudWmsErpFeignClientFallback(Throwable cause) { this.cause = cause; } private Map errorResponse() { return resultMap(500, filterErrorMessage(cause), dataFail()); } private static Map dataFail() { Map data = new HashMap<>(); data.put("result", "FAIL"); return data; } private static Map resultMap(int code, String msg, Map data) { Map map = new HashMap<>(); map.put("code", code); map.put("msg", msg); map.put("data", data); return map; } /** * 过滤错误消息中的 URL,只保留错误类型 */ public static String filterErrorMessage(Throwable throwable) { if (throwable == null) { return "请求失败:服务调用失败,请稍后重试"; } return filterErrorMessage(throwable.getMessage()); } public static String filterErrorMessage(String errorMessage) { if (errorMessage == null || errorMessage.isEmpty()) { return "请求失败:未知错误"; } String filteredMessage = errorMessage; if (filteredMessage.contains("executing")) { int i = filteredMessage.indexOf("executing"); filteredMessage = i > 0 ? filteredMessage.substring(0, i).trim() : "请求超时"; } else if (filteredMessage.contains("http://") || filteredMessage.contains("https://")) { filteredMessage = filteredMessage.replaceAll("https?://[^\\s]+", "").trim(); if (filteredMessage.isEmpty()) { filteredMessage = "请求失败"; } } if (filteredMessage.isEmpty()) { filteredMessage = "未知错误"; } return "请求失败:" + filteredMessage; } @Override public Map reportInOutResult(InOutResultReportParam body) { log.error("调用云仓WMS 入/出库结果上报接口失败,触发降级", cause); return errorResponse(); } @Override public Map reportInventoryAdjust(InventoryAdjustReportParam body) { log.error("调用云仓WMS 库存调整上报接口失败,触发降级", cause); return errorResponse(); } @Override public Map syncMatnrs(Object body) { log.error("调用云仓WMS 物料同步接口失败,触发降级", cause); return errorResponse(); } }