chen.lin
2 天以前 9140aee230de0ef41de9682a9353fbd372e2bcaa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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();
    }
}