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<String, Object> errorResponse() {
|
return resultMap(500, filterErrorMessage(cause), dataFail());
|
}
|
|
private static Map<String, Object> dataFail() {
|
Map<String, Object> data = new HashMap<>();
|
data.put("result", "FAIL");
|
return data;
|
}
|
|
private static Map<String, Object> resultMap(int code, String msg, Map<String, Object> data) {
|
Map<String, Object> 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<String, Object> reportInOutResult(InOutResultReportParam body) {
|
log.error("调用云仓WMS 入/出库结果上报接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> reportInventoryAdjust(InventoryAdjustReportParam body) {
|
log.error("调用云仓WMS 库存调整上报接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
|
@Override
|
public Map<String, Object> syncMatnrs(Object body) {
|
log.error("调用云仓WMS 物料同步接口失败,触发降级", cause);
|
return errorResponse();
|
}
|
}
|