liusheng
2026-10-10 0afac42fb2e9d6e5291304dd0044ce3042b45d2b
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.ruoyi.message;
 
import java.io.Serializable;
 
/**
 * 统一发送结果。
 * <p>
 * 各站点原始实现用字符串标记(如 {@code "true"} / {@code "success"} / {@code Boolean})表示成败,
 * 调用方各自解析第三方返回格式,容易出错。本类把「是否成功 + 渠道 + 第三方原始码 + 原始响应」统一收口。
 * <p>
 * 注意:{@link #ok} 为 false 时,{@link #message} 已经包含可直接写入随访子任务 remark 的中文描述,
 * 但为了保持各站点线上行为不变,调用方仍可沿用原有 remark 文案。
 */
public class SendResult implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    /**
     * 是否发送成功
     */
    private boolean ok;
 
    /**
     * 渠道类型:短信 / 微信公众号
     */
    private MessageChannel channelType;
 
    /**
     * 具体发送方 key,例如 xh / ls / sltd / nhfy / hzszlyy
     */
    private String senderKey;
 
    /**
     * 第三方返回的业务码(有就带上,没有为 null),例如丽水的 Code、市一的 code
     */
    private String code;
 
    /**
     * 失败原因 / 补充说明
     */
    private String message;
 
    /**
     * 第三方原始响应,便于排查
     */
    private String rawResponse;
 
    public SendResult() {
    }
 
    /**
     * 构造成功结果
     */
    public static SendResult success(String senderKey, MessageChannel channelType, String rawResponse) {
        SendResult result = new SendResult();
        result.ok = true;
        result.senderKey = senderKey;
        result.channelType = channelType;
        result.rawResponse = rawResponse;
        return result;
    }
 
    /**
     * 构造失败结果
     */
    public static SendResult fail(String senderKey, MessageChannel channelType, String message, String rawResponse) {
        SendResult result = new SendResult();
        result.ok = false;
        result.senderKey = senderKey;
        result.channelType = channelType;
        result.message = message;
        result.rawResponse = rawResponse;
        return result;
    }
 
    /**
     * 补充第三方业务码,返回自身便于链式调用
     */
    public SendResult withCode(String code) {
        this.code = code;
        return this;
    }
 
    /**
     * 补充说明信息,返回自身便于链式调用
     */
    public SendResult withMessage(String message) {
        this.message = message;
        return this;
    }
 
    /**
     * 返回与旧代码等价的布尔标记,便于渐进式替换
     *
     * @return 成功返回 "true",失败返回 "false"
     */
    public String asLegacyFlag() {
        return ok ? "true" : "false";
    }
 
    public boolean isOk() {
        return ok;
    }
 
    public void setOk(boolean ok) {
        this.ok = ok;
    }
 
    public MessageChannel getChannelType() {
        return channelType;
    }
 
    public void setChannelType(MessageChannel channelType) {
        this.channelType = channelType;
    }
 
    public String getSenderKey() {
        return senderKey;
    }
 
    public void setSenderKey(String senderKey) {
        this.senderKey = senderKey;
    }
 
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
 
    public String getRawResponse() {
        return rawResponse;
    }
 
    public void setRawResponse(String rawResponse) {
        this.rawResponse = rawResponse;
    }
 
    @Override
    public String toString() {
        return "SendResult{ok=" + ok
                + ", channelType=" + channelType
                + ", senderKey='" + senderKey + '\''
                + ", code='" + code + '\''
                + ", message='" + message + '\''
                + ", rawResponse='" + rawResponse + '\''
                + '}';
    }
}