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<String, Object> 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<String, Object> queryOrderAndDetls(ErpOpParams params) {
|
log.error("调用立库WMS Server订单信息查询接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> updateOrderDetls(List<Map<String, Object>> body) {
|
log.error("调用立库WMS Server订单修改接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> orderDel(List<Map<String, Object>> body) {
|
log.error("调用立库WMS Server取消单据接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> syncMatnrs(ErpMatnrParms params) {
|
log.error("调用立库WMS Server物料信息同步接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> queryLocsDetls(Map<String, Object> params) {
|
log.error("调用立库WMS Server库位信息查询接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> inventoryDetails(Map<String, Object> params) {
|
log.error("调用立库WMS Server库存明细查询接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> inventorySummary(Map<String, Object> params) {
|
log.error("调用立库WMS Server库存汇总查询接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
}
|