package com.vincent.rsf.openApi.feign.wms.fallback; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.entity.params.ErpMatnrParms; import com.vincent.rsf.openApi.entity.params.ErpOpParams; import com.vincent.rsf.openApi.feign.wms.WmsServerFeignClient; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * WMS Server Feign 客户端降级处理,在 Feign 内统一返回错误响应(不抛异常)。 * 由 WmsServerFeignClientFallbackFactory 创建并传入异常 cause。 */ @Slf4j @Component public class WmsServerFeignClientFallback implements WmsServerFeignClient { /** 触发降级时的异常,由 FallbackFactory 传入;无 cause 时为 null */ private final Throwable cause; public WmsServerFeignClientFallback() { this.cause = null; } public WmsServerFeignClientFallback(Throwable cause) { this.cause = cause; } private Map errorResponse() { return R.error(filterErrorMessage(cause)); } /** * 过滤错误消息中的URL,只保留错误类型 * @param throwable 异常对象(可选) * @return 过滤后的完整错误消息(包含"查询失败:"前缀) */ public static String filterErrorMessage(Throwable throwable) { if (throwable == null) { return "查询失败:服务调用失败,请稍后重试"; } return filterErrorMessage(throwable.getMessage()); } /** * 过滤错误消息中的URL,只保留错误类型 * @param errorMessage 错误消息字符串(可选) * @return 过滤后的完整错误消息(包含"查询失败:"前缀) */ public static String filterErrorMessage(String errorMessage) { if (errorMessage == null || errorMessage.isEmpty()) { return "查询失败:未知错误"; } String filteredMessage = errorMessage; // 如果包含"executing",说明是HTTP请求错误,去掉URL部分 if (filteredMessage.contains("executing")) { int executingIndex = filteredMessage.indexOf("executing"); if (executingIndex > 0) { // 提取"executing"之前的部分(如"Read timed out") filteredMessage = filteredMessage.substring(0, executingIndex).trim(); } else { // 如果"executing"在开头,使用默认错误消息 filteredMessage = "请求超时"; } } // 如果包含"http://"或"https://",也尝试去掉URL部分 else if (filteredMessage.contains("http://") || filteredMessage.contains("https://")) { // 使用正则表达式去掉URL filteredMessage = filteredMessage.replaceAll("https?://[^\\s]+", "").trim(); if (filteredMessage.isEmpty()) { filteredMessage = "请求失败"; } } // 如果过滤后的消息为空,使用默认错误消息 if (filteredMessage.isEmpty()) { filteredMessage = "未知错误"; } // 返回包含"查询失败:"前缀的完整错误消息 return "查询失败:" + filteredMessage; } @Override public Map queryOrderAndDetls(ErpOpParams params) { log.error("调用立库WMS Server订单信息查询接口失败,触发降级", cause); return errorResponse(); } @Override public Map updateOrderDetls(List> body) { log.error("调用立库WMS Server订单修改接口失败,触发降级", cause); return errorResponse(); } @Override public Map orderDel(List> body) { log.error("调用立库WMS Server取消单据接口失败,触发降级", cause); return errorResponse(); } @Override public Map syncMatnrs(ErpMatnrParms params) { log.error("调用立库WMS Server物料信息同步接口失败,触发降级", cause); return errorResponse(); } @Override public Map queryLocsDetls(Map params) { log.error("调用立库WMS Server库位信息查询接口失败,触发降级", cause); return errorResponse(); } @Override public Map inventoryDetails(Map params) { log.error("调用立库WMS Server库存明细查询接口失败,触发降级", cause); return errorResponse(); } @Override public Map inventorySummary(Map params) { log.error("调用立库WMS Server库存汇总查询接口失败,触发降级", cause); return errorResponse(); } }