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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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();
    }
}