Skip to content

Commit 7324b41

Browse files
committed
feat: 支持京东物流查询
1 parent 99af701 commit 7324b41

14 files changed

Lines changed: 582 additions & 2 deletions

src/main/java/net/kdks/config/ExpressConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ private ExpressConfig(Builder builder) {
3434
zhongtongConfig = builder.zhongtongConfig;
3535
jituConfig = builder.jituConfig;
3636
yundaConfig = builder.yundaConfig;
37+
jingdongConfig = builder.jingdongConfig;
3738
}
3839

3940
private ShunfengConfig shunfengConfig;
@@ -50,6 +51,8 @@ private ExpressConfig(Builder builder) {
5051

5152
private YundaConfig yundaConfig;
5253

54+
private JingdongConfig jingdongConfig;
55+
5356
public static Builder builder() {
5457
return new Builder();
5558
}
@@ -72,6 +75,8 @@ public static class Builder {
7275

7376
private YundaConfig yundaConfig;
7477

78+
private JingdongConfig jingdongConfig;
79+
7580
/**
7681
* 顺丰.
7782
*
@@ -308,6 +313,26 @@ public Builder yundaConfig(String appKey, String appSecret, int isProduct) {
308313
return this;
309314
}
310315

316+
/**
317+
* 京东.
318+
*
319+
* @param appKey appKey
320+
* @param appSecret appSecret
321+
* @param accessToken accessToken
322+
* @param isProduct isProduct
323+
* @return Builder
324+
*/
325+
public Builder jingdongConfig(String appKey, String appSecret, String accessToken,
326+
String customerCode, int isProduct) {
327+
this.jingdongConfig =
328+
JingdongConfig.builder().appKey(appKey).appSecret(appSecret)
329+
.accessToken(accessToken)
330+
.customerCode(customerCode)
331+
.isProduct(isProduct)
332+
.build();
333+
return this;
334+
}
335+
311336
public ExpressConfig build() {
312337
return new ExpressConfig(this);
313338
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.kdks.config;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
/**
9+
* 京东快递配置.
10+
*
11+
* <p>API配置,包含[appKey,appSecret,accessToken,customerCode],isProduct标识测试与生成<br>
12+
* 配置获取:<em><a href="https://cloud.jdl.com/">京东开放平台</a></em>
13+
*
14+
* @author Ze.Wang
15+
* @since 0.0.11
16+
*/
17+
@Data
18+
@Builder
19+
@NoArgsConstructor
20+
@AllArgsConstructor
21+
public class JingdongConfig {
22+
23+
private String appKey;
24+
private String appSecret;
25+
private String accessToken;
26+
/**
27+
* 月结号.
28+
*/
29+
private String customerCode;
30+
31+
private int isProduct = 1;
32+
33+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.kdks.constant;
2+
3+
/**
4+
* 京东常量.
5+
*
6+
* @author Ze.Wang
7+
* @since 0.0.11
8+
*/
9+
public interface JingdongConstant {
10+
String URL = "https://api.jdl.com";
11+
12+
String URL_TEST =
13+
"https://uat-api.jdl.com";
14+
15+
String REQUEST_SUCCESS_CODE = "0";
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.kdks.constant;
2+
3+
/**
4+
* 京东路由状态.
5+
*
6+
* @author Ze.Wang
7+
* @since 0.0.11
8+
*/
9+
public interface JingdongMethod {
10+
/**
11+
* 路由查询方法名.
12+
*/
13+
String QUERY_ROUTE = "/ecap/v1/orders/trace/query";
14+
15+
/**
16+
* 运费预估方法名.
17+
*/
18+
String QUERY_PRICE = "/ecap/v1/orders/actualfee/query";
19+
20+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package net.kdks.constant;
2+
3+
/**
4+
* 京东路由状态.
5+
*
6+
* @author Ze.Wang
7+
* @since 0.0.11
8+
*/
9+
public interface JingdongScanType {
10+
11+
/**
12+
* 下单.
13+
*/
14+
Integer ORDER = 100;
15+
16+
/**
17+
* 快件揽收中.
18+
*/
19+
Integer COLLECTING = 390;
20+
/**
21+
* 快件已揽收.
22+
*/
23+
Integer COLLECTED = 420;
24+
25+
/**
26+
* 运输中.
27+
*/
28+
Integer TRANSPORTING = 430;
29+
30+
/**
31+
* 派件.
32+
*/
33+
Integer DELIVERING = 440;
34+
35+
/**
36+
* 拒收.
37+
*/
38+
Integer REJECTED = 530;
39+
40+
/**
41+
* 已取消.
42+
*/
43+
Integer CANCELLED = 690;
44+
45+
/**
46+
* 退款.
47+
*/
48+
Integer REFUND = 700;
49+
50+
}

src/main/java/net/kdks/enums/ExpressCompanyCodeEnum.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ public enum ExpressCompanyCodeEnum implements ValueEnum<String> {
4545
/**
4646
* 极兔.
4747
*/
48-
JT("JT");
48+
JT("JT"),
49+
50+
/**
51+
* 京东.
52+
*/
53+
JD("JD");
4954

5055
private final String value;
5156

src/main/java/net/kdks/handler/ExpressHandlers.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ public ExpressHandlers(ExpressConfig expressConfig) {
5757
if (expressConfig.getYundaConfig() != null) {
5858
expressHandlerList.add(new ExpressYundaHandler(expressConfig.getYundaConfig()));
5959
}
60+
if (expressConfig.getJingdongConfig() != null) {
61+
expressHandlerList.add(new ExpressJingdongHandler(expressConfig.getJingdongConfig()));
62+
}
6063
addLogisticsHandlers(expressHandlerList);
6164
}
6265

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package net.kdks.handler;
2+
3+
import com.alibaba.fastjson.JSON;
4+
import com.alibaba.fastjson.TypeReference;
5+
import java.util.ArrayList;
6+
import java.util.Base64;
7+
import java.util.List;
8+
import java.util.Map;
9+
import net.kdks.config.JingdongConfig;
10+
import net.kdks.config.JituConfig;
11+
import net.kdks.constant.CommonConstant;
12+
import net.kdks.constant.JingdongConstant;
13+
import net.kdks.constant.JituConstant;
14+
import net.kdks.enums.ExpressCompanyCodeEnum;
15+
import net.kdks.enums.ExpressStateEnum;
16+
import net.kdks.model.CreateOrderParam;
17+
import net.kdks.model.ExpressData;
18+
import net.kdks.model.ExpressParam;
19+
import net.kdks.model.ExpressPriceParam;
20+
import net.kdks.model.ExpressPriceResult;
21+
import net.kdks.model.ExpressResponse;
22+
import net.kdks.model.ExpressResult;
23+
import net.kdks.model.OrderResult;
24+
import net.kdks.model.jd.JingdongResult;
25+
import net.kdks.model.jd.route.JingdongRouteItem;
26+
import net.kdks.model.jd.route.JingdongRouteResult;
27+
import net.kdks.model.jt.JituResult;
28+
import net.kdks.model.jt.price.JituPriceResult;
29+
import net.kdks.model.jt.route.JituRouteItem;
30+
import net.kdks.model.jt.route.JituRouteResult;
31+
import net.kdks.request.JingdongRequest;
32+
import net.kdks.request.JituRequest;
33+
import net.kdks.utils.Assert;
34+
import net.kdks.utils.DigestUtils;
35+
import net.kdks.utils.MapUtils;
36+
37+
/**
38+
* 京东.
39+
*
40+
* @author Ze.Wang
41+
* @since 0.0.11
42+
*/
43+
public class ExpressJingdongHandler implements ExpressHandler {
44+
45+
46+
private JingdongRequest jingdongRequest;
47+
48+
private JingdongConfig jingdongConfig;
49+
50+
public ExpressJingdongHandler(JingdongConfig jingdongConfig) {
51+
this.jingdongConfig = jingdongConfig;
52+
this.jingdongRequest = new JingdongRequest(jingdongConfig);
53+
}
54+
55+
/**
56+
* 查询轨迹信息.
57+
*
58+
* @param expressParam 快递号、手机、快递公司编码
59+
* @return 查询接口
60+
*/
61+
@Override
62+
public ExpressResponse<List<ExpressResult>> getExpressInfo(ExpressParam expressParam) {
63+
List<ExpressResult> expressResults = new ArrayList<>();
64+
for (String expressNo : expressParam.getExpressNos()) {
65+
Map<String, String> paramMap = MapUtils.newHashMap(3);
66+
paramMap.put("waybillCode", expressNo);
67+
paramMap.put("orderOrigin", "1");
68+
paramMap.put("customerCode", jingdongConfig.getCustomerCode());
69+
List<Map<String, String>> paramList = new ArrayList<>();
70+
paramList.add(paramMap);
71+
String param = JSON.toJSONString(paramList);
72+
String responseData = jingdongRequest.queryRouteRequest(param, expressParam.getFormat());
73+
ExpressResult expressResult = disposeResult(responseData, expressNo, expressParam);
74+
expressResults.add(expressResult);
75+
}
76+
return ExpressResponse.ok(expressResults);
77+
}
78+
79+
/**
80+
* 结果处理.
81+
*
82+
* @param responseData 响应
83+
* @return 查询结果
84+
*/
85+
private ExpressResult disposeResult(String responseData, String expressNo,
86+
ExpressParam expressParam) {
87+
88+
ExpressResult expressResult = new ExpressResult();
89+
if (expressParam.isViewOriginal()) {
90+
expressResult.setOriginalResult(responseData);
91+
}
92+
expressResult.setCom(ExpressCompanyCodeEnum.JD.getValue());
93+
expressResult.setNu(expressNo);
94+
JingdongResult<JingdongRouteResult> result =
95+
JSON.parseObject(responseData,
96+
new TypeReference<JingdongResult<JingdongRouteResult>>() {});
97+
if (!JingdongConstant.REQUEST_SUCCESS_CODE.equals(result.getCode())
98+
|| result.getData() == null) {
99+
expressResult.setState(ExpressStateEnum.NO_INFO.getValue());
100+
expressResult.setMsg(result.getMsg());
101+
return expressResult;
102+
}
103+
List<JingdongRouteItem> routes = result.getData().getTraceDetails();
104+
if (routes == null || routes.isEmpty()) {
105+
expressResult.setState(ExpressStateEnum.NO_INFO.getValue());
106+
expressResult.setMsg(CommonConstant.NO_INFO);
107+
return expressResult;
108+
}
109+
if (expressParam.isViewRoute()) {
110+
List<ExpressData> data = new ArrayList<>(routes.size());
111+
data.addAll(routes);
112+
expressResult.setData(data);
113+
}
114+
expressResult.setState(routes.get(0).getStatus());
115+
if (ExpressStateEnum.SIGNED.getValue().equals(expressResult.getState())) {
116+
expressResult.setIscheck(CommonConstant.YES);
117+
}
118+
return expressResult;
119+
120+
121+
}
122+
123+
/**
124+
* 运费预估.
125+
*
126+
* @param expressPriceParam 起始省份、起始城市、目的身份、目的城市、重量、长、宽、高
127+
* @return 运费
128+
*/
129+
@Override
130+
public ExpressResponse<ExpressPriceResult> getExpressPrice(
131+
ExpressPriceParam expressPriceParam) {
132+
return ExpressResponse.failed(CommonConstant.NO_SOPPORT);
133+
}
134+
135+
/**
136+
* 创建订单.
137+
*
138+
* @param createOrderParam 下单参数,主要包含物品信息、收件人信息、寄件人信息等
139+
* @return 快递单号等信息
140+
*/
141+
@Override
142+
public ExpressResponse<OrderResult> createOrder(CreateOrderParam createOrderParam) {
143+
return ExpressResponse.failed(CommonConstant.NO_SOPPORT);
144+
}
145+
146+
/**
147+
* 获取当前快递公司编码.
148+
*
149+
* @return 快递公司编码
150+
*/
151+
@Override
152+
public String getExpressCompanyCode() {
153+
return ExpressCompanyCodeEnum.JD.getValue();
154+
}
155+
156+
}
157+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.kdks.model.jd;
2+
3+
import lombok.Data;
4+
5+
/**
6+
* 极兔通用请求结果.
7+
*
8+
* @author Ze.Wang
9+
* @since 0.0.8
10+
*/
11+
12+
@Data
13+
public class JingdongResult<T> {
14+
/**
15+
* code.
16+
*/
17+
private String code;
18+
/**
19+
* msg.
20+
*/
21+
private String msg;
22+
/**
23+
* data.
24+
*/
25+
private T data;
26+
27+
}

0 commit comments

Comments
 (0)