wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(YxStoreOrder::getOrderId, orderId);
+ YxStoreOrder yxStoreOrder=yxStoreOrderMapper.selectOne(wrapper);
if (ObjectUtil.isEmpty(yxStoreOrder)) {
throw new BadRequestException("订单详情不存在");
}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/express/ExpressService.java b/zsw-bxg/src/main/java/co/yixiang/tools/express/ExpressService.java
index cb062169..94191ce8 100644
--- a/zsw-bxg/src/main/java/co/yixiang/tools/express/ExpressService.java
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/express/ExpressService.java
@@ -5,57 +5,42 @@
*/
package co.yixiang.tools.express;
-import cn.hutool.http.HttpUtil;
-import co.yixiang.enums.ShipperCodeEnum;
-import co.yixiang.tools.express.config.ExpressProperties;
+import cn.hutool.json.JSONUtil;
+import co.yixiang.tools.express.config.Kuaidi100Properties;
import co.yixiang.tools.express.dao.ExpressInfo;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import co.yixiang.tools.express.dao.Traces;
+import co.yixiang.tools.utils.kuaidi100.sdk.api.QueryTrack;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.IBaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.QueryTrackParam;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.QueryTrackReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.QueryTrackData;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.QueryTrackResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.SignUtils;
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import java.io.Serializable;
-import java.net.URLEncoder;
import java.security.MessageDigest;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.List;
/**
* 物流查询服务
*
* 快递鸟即时查询API http://www.kdniao.com/api-track
*/
+@Component
+@Slf4j
+@EnableConfigurationProperties(Kuaidi100Properties.class)
public class ExpressService implements Serializable {
- private final Log logger = LogFactory.getLog(ExpressService.class);
- //请求url
- private String ReqURL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
-
- private ExpressProperties properties;
-
- public ExpressProperties getProperties() {
- return properties;
- }
-
- public void setProperties(ExpressProperties properties) {
- this.properties = properties;
- }
-
- /**
- * 获取物流供应商名
- *
- * @param vendorCode
- * @return
- */
- public String getVendorName(String vendorCode) {
- for (Map item : properties.getVendors()) {
- if (item.get("code").equals(vendorCode)) {
- return item.get("name");
- }
- }
- return null;
- }
-
+ @Autowired
+ private Kuaidi100Properties properties;
/**
* 获取物流信息
*
@@ -63,53 +48,93 @@ public class ExpressService implements Serializable {
* @param ShipperCode
* @return
*/
- public ExpressInfo getExpressInfo(String OrderCode,String ShipperCode, String LogisticCode,String lastFourNumber) {
+ public ExpressInfo getExpressInfo(String OrderCode,String ShipperCode, String LogisticCode) {
try {
- String result = getOrderTracesByJson(OrderCode,ShipperCode, LogisticCode,lastFourNumber);
- ObjectMapper objMap = new ObjectMapper();
- ExpressInfo ei = objMap.readValue(result, ExpressInfo.class);
- ei.setShipperName(getVendorName(ShipperCode));
- return ei;
+ QueryTrackResp result = getOrderTraceByJson(OrderCode,ShipperCode, LogisticCode);
+ ExpressInfo info = new ExpressInfo();
+ assert result != null;
+ if (!result.getMessage().equals("ok")){
+ info.setSuccess(false);
+ info.setReason(result.getMessage());
+ return info;
+ }
+ info.setLogisticCode(LogisticCode);
+ info.setSuccess(result.getIscheck().equals("1"));
+ List tracesList = Lists.newArrayList();
+
+ for (QueryTrackData t: result.getData()){
+ Traces traces = new Traces();
+ traces.setAcceptStation(t.getContext());
+ traces.setAcceptTime(t.getTime());
+ tracesList.add(traces);
+ }
+ info.setSuccess(true);
+ info.setTraces(tracesList);
+ return info;
} catch (Exception e) {
- logger.error(e.getMessage(), e);
+ log.error(e.getMessage(), e);
}
-
return null;
}
-
/**
- * Json方式 查询订单物流轨迹
+ * Json方式 快递100查询订单物流轨迹
*
* @throws Exception
*/
- private String getOrderTracesByJson(String OrderCode,String ShipperCode, String LogisticCode,String lastFourNumber) throws Exception {
- if (!properties.isEnable()) {
+ private QueryTrackResp getOrderTraceByJson(String OrderCode,String ShipperCode, String LogisticCode) throws Exception {
+ if (!properties.getEnable()) {
return null;
}
- //处理顺丰查询轨迹需手机号码后4位
- String requestData;
- if (ShipperCode.equals(ShipperCodeEnum.SF.getValue())) {
- requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "','CustomerName':'" + lastFourNumber + "'}";
- } else {
- requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "'}";
- }
-
- Map params = new HashMap<>();
- params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
- params.put("EBusinessID", properties.getAppId());
- params.put("RequestType", "1002");
- String dataSign = encrypt(requestData, properties.getAppKey(), "UTF-8");
- params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
- params.put("DataType", "2");
+ QueryTrackReq queryTrackReq = new QueryTrackReq();
+ QueryTrackParam queryTrackParam = new QueryTrackParam();
+ queryTrackParam.setCom(ShipperCode);
+ queryTrackParam.setNum(LogisticCode);
+ String param = new Gson().toJson(queryTrackParam);
- String result = HttpUtil.post(ReqURL, params);
+ queryTrackReq.setParam(param);
+ queryTrackReq.setCustomer(this.properties.getCustomer());
+ queryTrackReq.setSign(SignUtils.querySign(param ,this.properties.getKey(),this.properties.getCustomer()));
- //根据公司业务处理返回的信息......
+ IBaseClient baseClient = new QueryTrack();
- return result;
+ HttpResult rsp = baseClient.execute(queryTrackReq);
+ return JSONUtil.toBean(rsp.getBody(),QueryTrackResp.class);
}
+// /**
+// * Json方式 快递鸟查询订单物流轨迹
+// *
+// * @throws Exception
+// */
+// private String getOrderTracesByJson(String OrderCode,String ShipperCode, String LogisticCode,String lastFourNumber) throws Exception {
+// if (!properties.isEnable()) {
+// return null;
+// }
+//
+// //处理顺丰查询轨迹需手机号码后4位(改为都需要手机号后四位)
+// String requestData;
+// if (ShipperCode.equals(ShipperCodeEnum.SF.getValue())) {
+// requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "','CustomerName':'" + lastFourNumber + "'}";
+// } else {
+// requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "'}";
+// }
+//
+// Map params = new HashMap<>();
+// params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
+// params.put("EBusinessID", properties.getAppId());
+// params.put("RequestType", "8001");
+// String dataSign = encrypt(requestData, properties.getAppKey(), "UTF-8");
+// params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
+// params.put("DataType", "2");
+//
+// String result = HttpUtil.post(ReqURL, params);
+//
+// //根据公司业务处理返回的信息......
+//
+// return result;
+// }
+
/**
* MD5加密
*
@@ -132,28 +157,28 @@ public class ExpressService implements Serializable {
return sb.toString().toLowerCase();
}
- /**
- * Sign签名生成
- *
- * @param content 内容
- * @param keyValue Appkey
- * @param charset 编码方式
- * @return DataSign签名
- */
- private String encrypt(String content, String keyValue, String charset) {
- if (keyValue != null) {
- content = content + keyValue;
- }
- byte[] src;
- try {
- src = MD5(content, charset).getBytes(charset);
- return Base64Utils.encodeToString(src);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
-
- return null;
- }
+// /**
+// * Sign签名生成
+// *
+// * @param content 内容
+// * @param keyValue Appkey
+// * @param charset 编码方式
+// * @return DataSign签名
+// */
+// private String encrypt(String content, String keyValue, String charset) {
+// if (keyValue != null) {
+// content = content + keyValue;
+// }
+// byte[] src;
+// try {
+// src = MD5(content, charset).getBytes(charset);
+// return Base64Utils.encodeToString(src);
+// } catch (Exception e) {
+// logger.error(e.getMessage(), e);
+// }
+//
+// return null;
+// }
}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressAutoConfiguration.java b/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressAutoConfiguration.java
deleted file mode 100644
index 25a1bc31..00000000
--- a/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressAutoConfiguration.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (C) 2018-2022
- * All rights reserved, Designed By www.yixiang.co
- * 注意:
- * 本软件为www.yixiang.co开发研制,未经购买不得使用
- * 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台)
- * 一经发现盗用、分享等行为,将追究法律责任,后果自负
- */
-package co.yixiang.tools.express.config;
-
-
-import co.yixiang.constant.ShopConstants;
-import co.yixiang.enums.ShopCommonEnum;
-import co.yixiang.tools.express.ExpressService;
-import co.yixiang.utils.RedisUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration(proxyBeanMethods = false)
-public class ExpressAutoConfiguration {
-
-
- private static RedisUtils redisUtil;
-
- @Autowired
- public ExpressAutoConfiguration(RedisUtils redisUtil) {
- ExpressAutoConfiguration.redisUtil = redisUtil;
- }
-
- public static ExpressService expressService() {
- ExpressService expressService = (ExpressService)redisUtil.get(ShopConstants.ZSW_EXPRESS_SERVICE);
- if(expressService != null) {
- return expressService;
- }
-
- ExpressProperties properties = new ExpressProperties();
- String enable = redisUtil.getY("exp_enable");
- String appId = redisUtil.getY("exp_appId");
- String appKey = redisUtil.getY("exp_appKey");
- properties.setAppId(appId);
- properties.setAppKey(appKey);
-
- if(ShopCommonEnum.ENABLE_2.getValue().toString().equals(enable)){
- properties.setEnable(false);
- }else{
- properties.setEnable(true);
- }
- ExpressService service = new ExpressService();
- service.setProperties(properties);
- redisUtil.set(ShopConstants.ZSW_EXPRESS_SERVICE,service);
- return service;
- }
-
-}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressProperties.java b/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressProperties.java
index 877d8c83..6c232759 100644
--- a/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressProperties.java
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/express/config/ExpressProperties.java
@@ -5,6 +5,7 @@
*/
package co.yixiang.tools.express.config;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/express/config/Kuaidi100Properties.java b/zsw-bxg/src/main/java/co/yixiang/tools/express/config/Kuaidi100Properties.java
new file mode 100644
index 00000000..9fbec698
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/express/config/Kuaidi100Properties.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.express.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "kuaidi100")
+@Data
+public class Kuaidi100Properties {
+
+ private String key;
+
+ private String customer;
+
+ private String secret;
+
+ private String userid;
+
+ private Boolean enable;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/express/dao/ExpressInfo.java b/zsw-bxg/src/main/java/co/yixiang/tools/express/dao/ExpressInfo.java
index b4f0e871..f14134c9 100644
--- a/zsw-bxg/src/main/java/co/yixiang/tools/express/dao/ExpressInfo.java
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/express/dao/ExpressInfo.java
@@ -41,6 +41,14 @@ public class ExpressInfo {
@ApiModelProperty(value = "物流状态:2-在途中,3-签收,4-问题件")
private String State;
+// @JsonProperty("Location")
+// @ApiModelProperty(value = "不知道干啥的")
+// private String Location;
+//
+// @JsonProperty("StateEx")
+// @ApiModelProperty(value = "不知道干啥的")
+// private String StateEx;
+
@JsonProperty("EBusinessID")
@ApiModelProperty(value = "用户ID")
private String EBusinessID;
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/service/impl/QiNiuServiceImpl.java b/zsw-bxg/src/main/java/co/yixiang/tools/service/impl/QiNiuServiceImpl.java
index e1d49218..d4917a2e 100644
--- a/zsw-bxg/src/main/java/co/yixiang/tools/service/impl/QiNiuServiceImpl.java
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/service/impl/QiNiuServiceImpl.java
@@ -103,10 +103,12 @@ public class QiNiuServiceImpl implements QiNiuService {
Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
String upToken = auth.uploadToken(qiniuConfig.getBucket());
try {
- String key = file.getOriginalFilename();
- if(qiniuContentService.getOne(new LambdaQueryWrapper().eq(QiniuContent::getName,key)) != null) {
- key = QiNiuUtil.getKey(key);
- }
+ String key = QiNiuUtil.getKey(file.getOriginalFilename());;
+// String key = file.getOriginalFilename();
+ //key不能重复
+// if(qiniuContentService.getOne(new LambdaQueryWrapper().eq(QiniuContent::getName,key)) != null) {
+// key = QiNiuUtil.getKey(key);
+// }
Response response = uploadManager.put(file.getBytes(), key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = JSON.parseObject(response.bodyString(), DefaultPutRet.class);
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/AutoNum.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/AutoNum.java
new file mode 100644
index 00000000..01927b18
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/AutoNum.java
@@ -0,0 +1,54 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.AutoNumReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.AutoNumResp;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.util.List;
+
+/**
+ * 快递100智能判断接口(只提供给正式用户使用)
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 9:59
+ */
+public class AutoNum extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ AutoNumReq autoNumReq = (AutoNumReq) request;
+ return String.format(ApiInfoConstant.AUTO_NUM_URL,autoNumReq.getNum(),autoNumReq.getKey());
+ }
+
+ /**
+ * 根据单号获取快递公司列表
+ *
+ * @return
+ */
+ public List getComByNumList(BaseRequest request) throws Exception{
+ HttpResult httpResult = this.execute(request);
+ if ( httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+
+ /**
+ * 根据单号获取第一个快递公司
+ *
+ * @return
+ */
+ public String getFirstComByNum(BaseRequest request) throws Exception{
+ List comByNumList = this.getComByNumList(request);
+ if (comByNumList != null && comByNumList.size()>0){
+ return comByNumList.get(0).getComCode();
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrder.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrder.java
new file mode 100644
index 00000000..aeedc1ca
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrder.java
@@ -0,0 +1,63 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.BOrderQueryData;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.BOrderResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.util.Map;
+
+/**
+ * 商家寄件(优选寄件)
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 11:14
+ */
+public class BOrder extends BaseClient {
+
+ @Override
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.B_ORDER_URL;
+ }
+
+ public PrintBaseResp transportCapacity(PrintReq param) throws Exception{
+ HttpResult httpResult = execute(param);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+
+ public PrintBaseResp order(PrintReq param) throws Exception{
+ HttpResult httpResult = execute(param);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+
+ public PrintBaseResp getCode(PrintReq param) throws Exception{
+ HttpResult httpResult = execute(param);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>>(){}.getType());
+ }
+ return null;
+ }
+
+ public PrintBaseResp cancel(PrintReq param) throws Exception{
+ HttpResult httpResult = execute(param);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken(){}.getType());
+ }
+ return null;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrderOfficial.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrderOfficial.java
new file mode 100644
index 00000000..cb98582d
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/BOrderOfficial.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+
+/**
+ * 商家寄件(官方快递)
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-01-21 15:55
+ */
+public class BOrderOfficial extends BaseClient {
+
+ @Override
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.B_ORDER_OFFICIAL_URL;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintAttachment.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintAttachment.java
new file mode 100644
index 00000000..b92e1753
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintAttachment.java
@@ -0,0 +1,52 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.CloudAttachmentReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.HttpUtils;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.net.URLEncoder;
+import java.util.Map;
+
+/**
+ * 附件云打印
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:26
+ */
+public class CloudPrintAttachment extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return null;
+ }
+
+ @Override
+ public HttpResult execute(BaseRequest request) throws Exception{
+ if (request instanceof CloudAttachmentReq){
+ CloudAttachmentReq cloudPrintAttachmentReq = (CloudAttachmentReq)request;
+ String url = String.format(ApiInfoConstant.CLOUD_PRINT_URL,
+ cloudPrintAttachmentReq.getMethod(),
+ cloudPrintAttachmentReq.getT(),
+ cloudPrintAttachmentReq.getKey(),
+ cloudPrintAttachmentReq.getSign(),
+ URLEncoder.encode(cloudPrintAttachmentReq.getParam(), "UTF-8"));
+ return HttpUtils.doPostFile(url,cloudPrintAttachmentReq.getFile(),super.getConnectTimeout(),super.getSocketTimeout());
+ }
+ throw new ClassCastException();
+ }
+
+ public PrintBaseResp print(CloudAttachmentReq cloudPrintAttachmentReq) throws Exception{
+ HttpResult httpResult = this.execute(cloudPrintAttachmentReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>>(){}.getType());
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintCustom.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintCustom.java
new file mode 100644
index 00000000..026257b9
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintCustom.java
@@ -0,0 +1,54 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.HttpUtils;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.net.URLEncoder;
+
+/**
+ * 自定义云打印
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:22
+ */
+public class CloudPrintCustom extends BaseClient {
+ private int connectTimeout = 3000;
+
+ private int socketTimeout = 3000;
+
+ public String getApiUrl(BaseRequest request) {
+ return null;
+ }
+
+ @Override
+ public HttpResult execute(BaseRequest request) throws Exception{
+ if (request instanceof PrintReq){
+ PrintReq printReq = (PrintReq)request;
+ String url = String.format(ApiInfoConstant.CLOUD_PRINT_URL,
+ printReq.getMethod(),
+ printReq.getT(),
+ printReq.getKey(),
+ printReq.getSign(),
+ URLEncoder.encode(printReq.getParam(), "UTF-8"));
+ return HttpUtils.doPost(url,printReq,super.getConnectTimeout(),super.getSocketTimeout());
+ }
+ throw new ClassCastException();
+ }
+
+ public PrintBaseResp print(PrintReq printReq) throws Exception {
+ HttpResult httpResult = execute(printReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())) {
+ return new Gson().fromJson(httpResult.getBody(), PrintBaseResp.class);
+ }
+ return null;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintOld.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintOld.java
new file mode 100644
index 00000000..7645b336
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/CloudPrintOld.java
@@ -0,0 +1,52 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.HttpUtils;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.net.URLEncoder;
+
+/**
+ * 复打
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:26
+ */
+public class CloudPrintOld extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return null;
+ }
+
+ @Override
+ public HttpResult execute(BaseRequest request) throws Exception{
+ if (request instanceof PrintReq){
+ PrintReq printReq = (PrintReq)request;
+ String url = String.format(ApiInfoConstant.CLOUD_PRINT_URL,
+ printReq.getMethod(),
+ printReq.getT(),
+ printReq.getKey(),
+ printReq.getSign(),
+ URLEncoder.encode(printReq.getParam(), "UTF-8"));
+ return HttpUtils.doPost(url,printReq,super.getConnectTimeout(),super.getSocketTimeout());
+ }
+ throw new ClassCastException();
+ }
+
+ public PrintBaseResp print(PrintReq request) throws Exception{
+ HttpResult httpResult = this.execute(request);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+
+ return new Gson().fromJson(httpResult.getBody(),PrintBaseResp.class);
+ }
+ return null;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintCloud.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintCloud.java
new file mode 100644
index 00000000..e755fcf6
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintCloud.java
@@ -0,0 +1,39 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintCloudData;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 15:46
+ */
+public class PrintCloud extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.ELECTRONIC_ORDER_PRINT_URL;
+ }
+
+ /**
+ * 电子面单打印
+ *
+ * @param printReq
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/17 17:15
+ */
+ public PrintBaseResp print(PrintReq printReq) throws Exception{
+ HttpResult httpResult = execute(printReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintHtml.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintHtml.java
new file mode 100644
index 00000000..97721481
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintHtml.java
@@ -0,0 +1,39 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintHtmlResp;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 17:20
+ */
+public class PrintHtml extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.ELECTRONIC_ORDER_HTML_URL;
+ }
+
+ /**
+ * 电子面单打印
+ *
+ * @param printReq
+ * @return: java.lang.String
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/17 17:15
+ */
+ public PrintHtmlResp print(PrintReq printReq) throws Exception{
+ HttpResult httpResult = execute(printReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+
+ return new Gson().fromJson(httpResult.getBody(),PrintHtmlResp.class);
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintImg.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintImg.java
new file mode 100644
index 00000000..d59dbe61
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/PrintImg.java
@@ -0,0 +1,61 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.PrintReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintBaseResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.PrintImgData;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 15:46
+ */
+public class PrintImg extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.ELECTRONIC_ORDER_PIC_URL;
+ }
+
+ /**
+ * 获取电子面单图片(BASE64)
+ *
+ * @param printReq
+ * @return: java.lang.String
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/17 17:15
+ */
+ public PrintBaseResp printImG(PrintReq printReq) throws Exception{
+ HttpResult httpResult = execute(printReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+
+ /**
+ * 处理返回的base64字符串(返回的是一个字符串json数组,多个子单时会有多个)
+ *
+ * @param imgBase64 base64 json字符串数组
+ * @return
+ */
+ public List getBase64Img(String imgBase64){
+ List stringList= new Gson().fromJson(imgBase64, new TypeToken>() {}.getType());
+ List base64Img = new ArrayList();
+ if (stringList != null && stringList.size()>0){
+ for (String s : stringList) {
+ s = "data:image/png;base64,"+s.replace("\\\\n","");
+ base64Img.add(s);
+ }
+ }
+ return base64Img;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrack.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrack.java
new file mode 100644
index 00000000..cbc1efbb
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrack.java
@@ -0,0 +1,33 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.QueryTrackReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.QueryTrackResp;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+/**
+ * 实时查询
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:27
+ */
+public class QueryTrack extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.QUERY_URL;
+ }
+
+ public QueryTrackResp queryTrack(QueryTrackReq queryTrackReq) throws Exception{
+ HttpResult httpResult = execute(queryTrackReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),QueryTrackResp.class);
+ }
+ return null;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrackMap.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrackMap.java
new file mode 100644
index 00000000..47abdea1
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/QueryTrackMap.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+
+/**
+ * 快递信息地图轨迹
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:27
+ */
+public class QueryTrackMap extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.QUERY_MAP_VIEW_URL;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SameCityOrder.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SameCityOrder.java
new file mode 100644
index 00000000..8addef73
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SameCityOrder.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+
+/**
+ * 同城配送
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 16:37
+ */
+public class SameCityOrder extends BaseClient {
+
+ @Override
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.SAME_CITY_ORDER_URL;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SendSms.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SendSms.java
new file mode 100644
index 00000000..91bcf1e4
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SendSms.java
@@ -0,0 +1,59 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.SendSmsReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SendSmsResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SmsCallbackResp;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 19:00
+ */
+public class SendSms extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.SEND_SMS_URL;
+ }
+
+ /**
+ * 发送短信
+ *
+ * @param sendSmsReq
+ * @return
+ */
+ public SendSmsResp sendSms(SendSmsReq sendSmsReq) throws Exception{
+ HttpResult httpResult = execute(sendSmsReq);
+ if (StringUtils.isNotBlank(httpResult.getBody()) && httpResult.getStatus() == HttpStatus.SC_OK){
+ return new Gson().fromJson(httpResult.getBody(),SendSmsResp.class);
+ }
+ return null;
+ }
+
+ /**
+ * 短信回调接口 例子
+ * @param
+ * @return: java.util.Map
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/21 10:11
+ */
+ public Map callback(SmsCallbackResp smsCallbackResp){
+ //建议记录一下这个回调的内容,方便出问题后双方排查问题
+ //log.debug("快递100短信回调结果|{}",new Gson().toJson(smsCallbackResp));
+ Map result = new HashMap();
+ if (smsCallbackResp == null){
+ return result;
+ }
+
+ result.put("status",Boolean.TRUE);
+ return result;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/Subscribe.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/Subscribe.java
new file mode 100644
index 00000000..7de32538
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/Subscribe.java
@@ -0,0 +1,79 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.SubscribeReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SubscribePushParamResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SubscribeResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.SignUtils;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 订阅
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 14:38
+ */
+public class Subscribe extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.SUBSCRIBE_URL;
+ }
+
+ /**
+ * 订阅接口
+ *
+ * @param subscribeReq
+ * @return
+ */
+ public SubscribeResp subscribe(SubscribeReq subscribeReq) throws Exception{
+ HttpResult httpResult = execute(subscribeReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(), SubscribeResp.class);
+ }
+ return null;
+ }
+
+ /**
+ * 订阅推送处理(参照)
+ * 订阅成功后,如果该快递单号有轨迹(包括已经签收的单),快递100将会在15分钟-4个小时推送;后面将会4个小时跟踪一次,跟踪到有轨迹变化则推送;
+ * 如果订阅成功后,3天查无结果(录错单/快递公司错了/揽收比较晚),快递100将会推送3天查无结果,可以继续重新订阅。
+ *
+ * 回调接口支持自定义参数,比如订阅时回调地址填写的是 http://www.xxx.com?orderId=1233333
+ * 可以通过下面这种方式获取到orderId: String orderId = request.getParameter("orderId");
+ *
+ * 返回值必须是下面这样的格式,否则快递100将认为该推送失败,快递100将会重试3次该推送,时间间隔35分钟;
+ * 成功结果返回例子: {"result":true,"returnCode":"200","message":"提交成功"}
+ *
+ * @param request
+ * @return: com.zsw.tools.utils.kuaidi100.sdk.response.SubscribeResp
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/16 19:48
+ */
+ public SubscribeResp callBackUrl(HttpServletRequest request){
+ String param = request.getParameter("param");
+ String sign = request.getParameter("sign");
+ //建议记录一下这个回调的内容,方便出问题后双方排查问题
+ //log.debug("快递100订阅推送回调结果|{}|{}",param,sign);
+ //订阅时传的salt,没有可以忽略
+ String salt = "";
+ String ourSign = SignUtils.sign(param + salt);
+ SubscribeResp subscribeResp = new SubscribeResp();
+ subscribeResp.setResult(Boolean.TRUE);
+ subscribeResp.setReturnCode("200");
+ subscribeResp.setMessage("成功");
+ //加密如果相等,属于快递100推送;否则可以忽略掉当前请求
+ if (ourSign.equals(sign)){
+ //TODO 业务处理
+ SubscribePushParamResp subscribePushParamResp = new Gson().fromJson(param, SubscribePushParamResp.class);
+ return subscribeResp;
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SubscribeWithMap.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SubscribeWithMap.java
new file mode 100644
index 00000000..77313634
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/SubscribeWithMap.java
@@ -0,0 +1,79 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.SubscribeReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SubscribeResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.SubscribeWithMapPushParamResp;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.SignUtils;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 订阅(地图)
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 14:38
+ */
+public class SubscribeWithMap extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.SUBSCRIBE_WITH_MAP_URL;
+ }
+
+ /**
+ * 订阅接口
+ *
+ * @param subscribeReq
+ * @return
+ */
+ public SubscribeResp subscribe(SubscribeReq subscribeReq) throws Exception{
+ HttpResult httpResult = execute(subscribeReq);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(), SubscribeResp.class);
+ }
+ return null;
+ }
+
+ /**
+ * 订阅推送处理(参照)
+ * 订阅成功后,如果该快递单号有轨迹(包括已经签收的单),快递100将会在15分钟-4个小时推送;后面将会4个小时跟踪一次,跟踪到有轨迹变化则推送;
+ * 如果订阅成功后,3天查无结果(录错单/快递公司错了/揽收比较晚),快递100将会推送3天查无结果,可以继续重新订阅。
+ *
+ * 回调接口支持自定义参数,比如订阅时回调地址填写的是 http://www.xxx.com?orderId=1233333
+ * 可以通过下面这种方式获取到orderId: String orderId = request.getParameter("orderId");
+ *
+ * 返回值必须是下面这样的格式,否则快递100将认为该推送失败,快递100将会重试3次该推送,时间间隔35分钟;
+ * 成功结果返回例子: {"result":true,"returnCode":"200","message":"提交成功"}
+ *
+ * @param request
+ * @return: com.zsw.tools.utils.kuaidi100.sdk.response.SubscribeResp
+ * @author: api.kuaidi100.com
+ * @time: 2020/7/16 19:48
+ */
+ public SubscribeResp callBackUrl(HttpServletRequest request){
+ String param = request.getParameter("param");
+ String sign = request.getParameter("sign");
+ //建议记录一下这个回调的内容,方便出问题后双方排查问题
+ //log.debug("快递100订阅推送回调结果|{}|{}",param,sign);
+ //订阅时传的salt,没有可以忽略
+ String salt = "";
+ String ourSign = SignUtils.sign(param + salt);
+ SubscribeResp subscribeResp = new SubscribeResp();
+ subscribeResp.setResult(Boolean.TRUE);
+ subscribeResp.setReturnCode("200");
+ subscribeResp.setMessage("成功");
+ //加密如果相等,属于快递100推送;否则可以忽略掉当前请求
+ if (ourSign.equals(sign)){
+ //TODO 业务处理
+ SubscribeWithMapPushParamResp mapPushParamResp = new Gson().fromJson(param, SubscribeWithMapPushParamResp.class);
+ return subscribeResp;
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/ThirdAuth.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/ThirdAuth.java
new file mode 100644
index 00000000..75743d5d
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/api/ThirdAuth.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.api;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+
+/**
+ * 第三方平台账号授权
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-01-06 14:12
+ */
+public class ThirdAuth extends BaseClient {
+
+ @Override
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.THIRD_AUTH_URL;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/cloud/CloudBase.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/cloud/CloudBase.java
new file mode 100644
index 00000000..945f292d
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/cloud/CloudBase.java
@@ -0,0 +1,31 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.cloud;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.contant.ApiInfoConstant;
+import co.yixiang.tools.utils.kuaidi100.sdk.core.BaseClient;
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.cloud.CloudBaseReq;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.cloud.CloudBaseResp;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-20 10:36
+ */
+public class CloudBase extends BaseClient {
+
+ public String getApiUrl(BaseRequest request) {
+ return ApiInfoConstant.CLOUD_NORMAL_URL;
+ }
+
+ public CloudBaseResp executeToObject(CloudBaseReq param) throws Exception{
+ HttpResult httpResult = execute(param);
+ if (httpResult.getStatus() == HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){
+ return new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType());
+ }
+ return null;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/ApiInfoConstant.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/ApiInfoConstant.java
new file mode 100644
index 00000000..1f319972
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/ApiInfoConstant.java
@@ -0,0 +1,144 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.contant;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-15 17:43
+ */
+public class ApiInfoConstant {
+ /**
+ * 查询url
+ */
+ public static final String QUERY_URL = "https://poll.kuaidi100.com/poll/query.do";
+ /**
+ * 快递查询地图轨迹url
+ */
+ public static final String QUERY_MAP_VIEW_URL = "https://poll.kuaidi100.com/poll/maptrack.do";
+ /**
+ * 订阅url
+ */
+ public static final String SUBSCRIBE_URL = "https://poll.kuaidi100.com/poll";
+ /**
+ * 订阅带地图url
+ */
+ public static final String SUBSCRIBE_WITH_MAP_URL = "http://poll.kuaidi100.com/pollmap";
+ /**
+ * 订阅SCHEMA
+ */
+ public static final String SUBSCRIBE_SCHEMA = "json";
+ /**
+ * 智能单号识别url
+ */
+ public static final String AUTO_NUM_URL = "http://www.kuaidi100.com/autonumber/auto?num=%s&key=%s";
+ /**
+ * 电子面单html url
+ */
+ public static final String ELECTRONIC_ORDER_HTML_URL = "http://poll.kuaidi100.com/eorderapi.do";
+ /**
+ * 电子面单html方法
+ */
+ public static final String ELECTRONIC_ORDER_HTML_METHOD = "getElecOrder";
+ /**
+ * 电子面单获取图片 url
+ */
+ public static final String ELECTRONIC_ORDER_PIC_URL = "https://poll.kuaidi100.com/printapi/printtask.do";
+ /**
+ * 电子面单获取图片
+ */
+ public static final String ELECTRONIC_ORDER_PIC_METHOD = "getPrintImg";
+ /**
+ * 电子面单打印 url
+ */
+ public static final String ELECTRONIC_ORDER_PRINT_URL = "https://poll.kuaidi100.com/printapi/printtask.do";
+ /**
+ * 电子面单打印方法
+ */
+ public static final String ELECTRONIC_ORDER_PRINT_METHOD = "eOrder";
+ /**
+ * 菜鸟淘宝账号授权
+ */
+ public static final String AUTH_THIRD_URL = "https://poll.kuaidi100.com/printapi/authThird.do";
+ /**
+ * 云打印url
+ */
+ public static final String CLOUD_PRINT_URL = "http://poll.kuaidi100.com/printapi/printtask.do?method=%s&t=%s&key=%s&sign=%s¶m=%s";
+ /**
+ * 自定义打印方法
+ */
+ public static final String CLOUD_PRINT_CUSTOM_METHOD = "printOrder";
+ /**
+ * 附件打印方法
+ */
+ public static final String CLOUD_PRINT_ATTACHMENT_METHOD = "imgOrder";
+ /**
+ * 复打方法
+ */
+ public static final String CLOUD_PRINT_OLD_METHOD = "printOld";
+ /**
+ * 复打方法
+ */
+ public static final String SEND_SMS_URL = "http://apisms.kuaidi100.com:9502/sms/send.do";
+ /**
+ * 商家寄件
+ */
+ public static final String B_ORDER_URL = "https://order.kuaidi100.com/order/borderbestapi.do";
+ /**
+ * 商家寄件查询运力
+ */
+ public static final String B_ORDER_QUERY_TRANSPORT_CAPACITY_METHOD = "querymkt";
+ /**
+ * 商家寄件下单
+ */
+ public static final String B_ORDER_SEND_METHOD = "bOrderBest";
+ /**
+ * 商家寄件获取验证码
+ */
+ public static final String B_ORDER_CODE_METHOD = "getCode";
+ /**
+ * 商家寄件取消
+ */
+ public static final String B_ORDER_CANCEL_METHOD = "cancelBest";
+ /**
+ * 云平台通用请求url
+ */
+ public static final String CLOUD_NORMAL_URL = "http://cloud.kuaidi100.com/api";
+ /**
+ * 第三方电商平台账号授权请求url
+ */
+ public static final String THIRD_AUTH_URL = "https://poll.kuaidi100.com/printapi/authThird.do";
+ /**
+ * 商家寄件(官方寄件)请求url
+ */
+ public static final String B_ORDER_OFFICIAL_URL = "https://poll.kuaidi100.com/order/borderapi.do";
+ /**
+ * 商家寄件(官方寄件)下单
+ */
+ public static final String B_ORDER_OFFICIAL_ORDER_METHOD = "bOrder";
+ /**
+ * 商家寄件(官方寄件)取消
+ */
+ public static final String B_ORDER_OFFICIAL_CANCEL_METHOD = "cancel";
+ /**
+ * 商家寄件(官方寄件)查询价格
+ */
+ public static final String B_ORDER_OFFICIAL_PRICE_METHOD = "queryPrice";
+ /**
+ * 同城配送请求url
+ */
+ public static final String SAME_CITY_ORDER_URL = "https://order.kuaidi100.com/sameCity/order";
+ /**
+ * 同城配送授权方法
+ */
+ public static final String SAME_CITY_AUTH_METHOD = "auth";
+ /**
+ * 同城配送下单方法
+ */
+ public static final String SAME_CITY_ORDER_METHOD = "order";
+ /**
+ * 同城配送查询订单方法
+ */
+ public static final String SAME_CITY_QUERY_METHOD = "query";
+ /**
+ * 同城配送取消订单方法
+ */
+ public static final String SAME_CITY_CANCEL_METHOD = "cancel";
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CloudApiCodeConstant.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CloudApiCodeConstant.java
new file mode 100644
index 00000000..bc904f35
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CloudApiCodeConstant.java
@@ -0,0 +1,40 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.contant;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-27 9:27
+ */
+public class CloudApiCodeConstant {
+ /**
+ * 快递寄件查询运力
+ */
+ public final static String ORDER_QUERY_EXPRESS = "7c5c49c5e51a4b75bd960f4997d2846a";
+ /**
+ * 快递寄件
+ */
+ public final static String ORDER = "ddffadd3df4b4c0d8d6f9942c7a8c990";
+ /**
+ * 快递寄件取消寄件
+ */
+ public final static String ORDER_CANCEL = "bcb0428c1dd84aca9d6e19ea4dcf683d";
+ /**
+ * 快递时效查询V1版
+ */
+ public final static String AGING_V1 = "8ffb952184224877a561b300dc57b935";
+ /**
+ * 快递时效查询V2版
+ */
+ public final static String AGING_V2 = "4cdfccdf64ea4088a94eb2ea1ef40c97";
+ /**
+ * 快递时效详情查询V1版
+ */
+ public final static String AGING_DETAILS_V1 = "60d6fa8809134c40879e5f0a7228183e";
+ /**
+ * 快递时效详情查询V2版
+ */
+ public final static String AGING_DETAILS_V2 = "81bb0620fbaf460db4e6dab84a05ec00";
+ /**
+ * 实时快递查询
+ */
+ public final static String SYNC_QUERY = "c3e50f627ff6452ba44688ba8883f2dc";
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CompanyConstant.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CompanyConstant.java
new file mode 100644
index 00000000..ec77e452
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/contant/CompanyConstant.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.contant;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-15 17:24
+ */
+public class CompanyConstant {
+
+ public static final String SF = "shunfeng";
+ public static final String ZT = "zhongtong";
+ public static final String YT = "yuantong";
+ public static final String HT = "huitongkuaidi";
+ public static final String ST = "shentong";
+ public static final String YD = "yunda";
+ public static final String EMS = "ems";
+ public static final String JD = "jd";
+ public static final String ZJS = "zhaijisong";
+ public static final String DB = "debangkuaidi";
+
+
+ public static final String SS = "shansong";
+ public static final String KFW = "kfw";
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/BaseClient.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/BaseClient.java
new file mode 100644
index 00000000..b02f31de
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/BaseClient.java
@@ -0,0 +1,42 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.core;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.BaseResponse;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.HttpUtils;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-25 16:02
+ */
+public abstract class BaseClient implements IBaseClient{
+
+ private int connectTimeout = 3000;
+
+ private int socketTimeout = 3000;
+
+ public HttpResult execute(BaseRequest request) throws Exception{
+
+ return HttpUtils.doPost(getApiUrl(request),request,connectTimeout,socketTimeout);
+ }
+
+ public BaseResponse executeToObject(BaseRequest request) throws Exception{
+
+ return null;
+ }
+
+ public void setTimeOut(int connectTimeout, int socketTimeout) {
+ this.connectTimeout = connectTimeout;
+ this.socketTimeout = socketTimeout;
+ }
+
+ public abstract String getApiUrl(BaseRequest request);
+
+ public int getConnectTimeout() {
+ return connectTimeout;
+ }
+
+ public int getSocketTimeout() {
+ return socketTimeout;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/IBaseClient.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/IBaseClient.java
new file mode 100644
index 00000000..ae340997
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/core/IBaseClient.java
@@ -0,0 +1,18 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.core;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.response.BaseResponse;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-25 16:09
+ */
+public interface IBaseClient {
+
+ HttpResult execute(BaseRequest request) throws Exception;
+
+ BaseResponse executeToObject(BaseRequest request) throws Exception;
+
+ void setTimeOut(int connectTimeout,int socketTimeout);
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/pojo/HttpResult.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/pojo/HttpResult.java
new file mode 100644
index 00000000..f4e8a98b
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/pojo/HttpResult.java
@@ -0,0 +1,20 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.pojo;
+
+import lombok.Data;
+
+
+@Data
+public class HttpResult {
+ private int status;
+ private String body;
+ private String error;
+
+ public HttpResult() {
+ }
+
+ public HttpResult(int status, String body, String error) {
+ this.status = status;
+ this.body = body;
+ this.error = error;
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/AutoNumReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/AutoNumReq.java
new file mode 100644
index 00000000..38467c28
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/AutoNumReq.java
@@ -0,0 +1,15 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-12-04 11:11
+ */
+@Data
+public class AutoNumReq extends BaseRequest {
+
+ private String key;
+
+ private String num;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderCancelReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderCancelReq.java
new file mode 100644
index 00000000..621aa11d
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderCancelReq.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:37
+ */
+@Data
+public class BOrderCancelReq {
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+ /**
+ * 取消原因,例:暂时不寄件了
+ */
+ private String cancelMsg;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderGetCodeReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderGetCodeReq.java
new file mode 100644
index 00000000..641e7d7e
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderGetCodeReq.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:37
+ */
+@Data
+public class BOrderGetCodeReq {
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderOfficialQueryPriceReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderOfficialQueryPriceReq.java
new file mode 100644
index 00000000..8c0ffa74
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderOfficialQueryPriceReq.java
@@ -0,0 +1,21 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * 商家寄件(官方快递)
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 15:29
+ */
+@Data
+public class BOrderOfficialQueryPriceReq {
+ /**
+ * 快递公司编码
+ */
+ private String kuaidiCom;
+ /**
+ * 出发地地址,最小颗粒到市级,例如:广东省深圳市
+ */
+ private String address;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderQueryReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderQueryReq.java
new file mode 100644
index 00000000..e0c874d0
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderQueryReq.java
@@ -0,0 +1,13 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 11:17
+ */
+@Data
+public class BOrderQueryReq {
+
+ private String sendAddr;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderReq.java
new file mode 100644
index 00000000..03a3ca56
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BOrderReq.java
@@ -0,0 +1,64 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:33
+ */
+@Data
+public class BOrderReq {
+
+ /**
+ * 快递公司的编码,一律用小写字母,见《快递公司编码》
+ */
+ private String kuaidicom;
+ /**
+ * 收件人姓名
+ */
+ private String recManName;
+ /**
+ * 收件人的手机号,手机号和电话号二者其一必填
+ */
+ private String recManMobile;
+ /**
+ * 收件人所在完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园
+ */
+ private String recManPrintAddr;
+ /**
+ * 寄件人姓名
+ */
+ private String sendManName;
+ /**
+ * 寄件人的手机号,手机号和电话号二者其一必填
+ */
+ private String sendManMobile;
+ /**
+ * 寄件人所在的完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园B10
+ */
+ private String sendManPrintAddr;
+ /**
+ * 物品名称,例:文件
+ */
+ private String cargo;
+ /**
+ * 物品总重量KG,例:1.5,单位kg
+ */
+ private String weight;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * callBackUrl订单信息回调
+ */
+ private String callBackUrl;
+ /**
+ * 快递业务服务类型,例:标准快递,默认为标准快递
+ */
+ private String serviceType;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BaseRequest.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BaseRequest.java
new file mode 100644
index 00000000..25a21679
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/BaseRequest.java
@@ -0,0 +1,13 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-25 16:12
+ */
+@Data
+public class BaseRequest {
+
+ private String url;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudAttachmentReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudAttachmentReq.java
new file mode 100644
index 00000000..abd163ea
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudAttachmentReq.java
@@ -0,0 +1,14 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+import java.io.File;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:36
+ */
+@Data
+public class CloudAttachmentReq extends PrintReq {
+ private File file;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintAttachmentParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintAttachmentParam.java
new file mode 100644
index 00000000..5aeca4d2
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintAttachmentParam.java
@@ -0,0 +1,47 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:37
+ */
+@Data
+public class CloudPrintAttachmentParam {
+ /**
+ * 贵司内部自定义的订单编号,需要保证唯一性,非必填
+ */
+ private String orderId;
+ /**
+ * 打印纸的高度,以mm为单位
+ */
+ private String height;
+ /**
+ * 打印纸的宽度,以mm为单位
+ */
+ private String width;
+ /**
+ * 需要打印的份数,默认是一份
+ */
+ private String copyNum;
+ /**
+ * 打印范围,起始页,仅对多页文件支持,默认是打印整个文档
+ */
+ private String startPage;
+ /**
+ * 打印范围,结束页,仅对多页文件支持,默认是打印整个文档
+ */
+ private String endPage;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * 打印设备,通过打印机输出的设备码进行获取
+ */
+ private String siid;
+ /**
+ * 打印状态回调地址
+ */
+ private String callBackUrl;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomParam.java
new file mode 100644
index 00000000..9af19719
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomParam.java
@@ -0,0 +1,39 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:38
+ */
+@Data
+public class CloudPrintCustomParam {
+ /**
+ * 贵司内部自定义的订单编号,需要保证唯一性,非必填
+ */
+ private String orderId;
+ /**
+ * 通过管理后台的打印摸版配置信息获取
+ */
+ private String tempid;
+ /**
+ * 打印设备,通过打印机输出的设备码进行获取
+ */
+ private String siid;
+ /**
+ * 打印纸的高度
+ */
+ private String height;
+ /**
+ * 打印纸的宽度
+ */
+ private String width;
+ /**
+ * 打印状态回调地址
+ */
+ private String callBackUrl;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomReq.java
new file mode 100644
index 00000000..5d6bc28a
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintCustomReq.java
@@ -0,0 +1,8 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:37
+ */
+public class CloudPrintCustomReq {
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintOldParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintOldParam.java
new file mode 100644
index 00000000..8345b619
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/CloudPrintOldParam.java
@@ -0,0 +1,13 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 10:43
+ */
+@Data
+public class CloudPrintOldParam {
+
+ private String taskId;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ManInfo.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ManInfo.java
new file mode 100644
index 00000000..da354348
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ManInfo.java
@@ -0,0 +1,27 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 16:30
+ */
+@Data
+public class ManInfo {
+ /**
+ * 收件人姓名 (必填)
+ */
+ private String name;
+ /**
+ * 收件人的手机号,手机号和电话号二者其一必填 (必填)
+ */
+ private String mobile;
+ /**
+ * 收件人所在完整地址 (必填)
+ */
+ private String printAddr;
+ /**
+ * 收件人所在公司名称(可选)
+ */
+ private String company;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudParam.java
new file mode 100644
index 00000000..2cc866e8
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudParam.java
@@ -0,0 +1,181 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 17:05
+ */
+@Data
+public class PrintCloudParam {
+
+ /**
+ * 业务类型,默认为10
+ */
+ private String type;
+ /**
+ * 电子面单客户账户或月结账号,需贵司向当地快递公司网点申请
+ */
+ private String partnerId;
+ /**
+ * 电子面单密码,需贵司向当地快递公司网点申请
+ */
+ private String partnerKey;
+ /**
+ * 收件网点名称,由快递公司当地网点分配,
+ * 若使用淘宝授权填入(taobao),使用菜鸟授权填入(cainiao)
+ */
+ private String net;
+ /**
+ * 快递公司的编码,一律用小写字母
+ */
+ private String kuaidicom;
+ /**
+ * 收件人信息
+ */
+ private ManInfo recMan;
+ /**
+ * 收件人信息
+ */
+ private ManInfo sendMan;
+ /**
+ * 物品名称(部分快递公司必填)
+ */
+ private String cargo;
+ /**
+ * 物品总数量。
+ * 另外该属性与子单有关,如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号),
+ * needChild = 1、count 需要大于1,如count = 2 则一个主单 一个子单,
+ * count = 3则一个主单 二个子单;返回的子单号码见返回结果的childNum字段
+ */
+ private String count;
+ /**
+ * 物品总重量,单位:KG (例子:0.5)
+ */
+ private String weight;
+ /**
+ * 支付方式:
+ * SHIPPER:寄方付(默认)
+ * CONSIGNEE:到付
+ * MONTHLY:月结
+ * THIRDPARTY:第三方支付
+ */
+ private String payType;
+ /**
+ * 快递类型:
+ * 标准快递(默认)
+ * 顺丰特惠
+ * EMS经济
+ */
+ private String expType;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 电子面单模板编码
+ */
+ private String tempid;
+ /**
+ * 打印设备编码。通过打印机输出的设备码进行获取
+ */
+ private String siid;
+ /**
+ * 保价额度
+ */
+ private String valinsPay;
+ /**
+ * 代收货款额度
+ */
+ private String collection;
+ /**
+ * 是否需要子单(支持子单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号);
+ * needChild = 1、count 需要大于1,如count = 2 一个主单 一个子单,
+ * count = 3 一个主单 二个子单,返回的子单号码见返回结果的childNum字段
+ */
+ private String needChild;
+ /**
+ * 是否需要回单(支持回单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 返回的回单号见返回结果的returnNum字段
+ */
+ private String needBack;
+ /**
+ * 贵司内部自定义的订单编号,需要保证唯一性
+ */
+ private String orderId;
+ /**
+ * 生成图片的高,以mm为单位(默认100)
+ */
+ private String height;
+ /**
+ * 生成图片的宽,以mm为单位(默认180)
+ */
+ private String width;
+ /**
+ * 打印状态回调地址
+ */
+ private String callBackUrl;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * 是否开启订阅功能:
+ * 0:不开启(默认)
+ * 1:开启
+ * 说明开启订阅功能时:pollCallBackUrl必须填入
+ * 此功能只针对有快递单号的单
+ */
+ private String op;
+ /**
+ * 如果op设置为1时,pollCallBackUrl必须填入,用于跟踪回调
+ */
+ private String pollCallBackUrl;
+ /**
+ * 添加此字段表示开通行政区域解析功能:0:关闭(默认);1:开通行政区域解析功能
+ */
+ private String resultv2;
+ /**
+ * 扩展字段,不同快递公司具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String code;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerSecret;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerName;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String checkMan;
+
+ /**
+ * 打印方向(默认0) 0-正方向 1-反方向
+ */
+ private String direction;
+
+ /**
+ * 打印时间
+ */
+ private String printTime;
+ /**
+ * 额外服务(类似部分物流公司的需定义派送方式,包装等)
+ */
+ private String addService;
+ /*
+ * 到付金额(单位:元)
+ */
+ private String freight;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudReq.java
new file mode 100644
index 00000000..bdf0fd6a
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintCloudReq.java
@@ -0,0 +1,32 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 16:21
+ */
+@Data
+public class PrintCloudReq extends PrintReq{
+
+ /**
+ * 业务类型(默认:getPrintImg)
+ */
+ private String method;
+ /**
+ * 快递100分配给贵司的的授权key
+ */
+ private String key;
+ /**
+ * 加密签名信息:MD5(param+t+key+secret);加密后字符串转大写
+ */
+ private String sign;
+ /**
+ * 当前请求时间戳
+ */
+ private String t;
+ /**
+ * 其他参数组合成的json对象
+ */
+ private String param;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlParam.java
new file mode 100644
index 00000000..fcad18a0
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlParam.java
@@ -0,0 +1,145 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 16:55
+ */
+@Data
+public class PrintHtmlParam {
+ /**
+ * 电子面单客户账户或月结账号,需贵司向当地快递公司网点申请
+ */
+ private String partnerId;
+ /**
+ * 电子面单密码,需贵司向当地快递公司网点申请
+ */
+ private String partnerKey;
+ /**
+ * 收件网点名称,由快递公司当地网点分配,
+ * 若使用淘宝授权填入(taobao),使用菜鸟授权填入(cainiao)
+ */
+ private String net;
+ /**
+ * 快递公司的编码,一律用小写字母
+ */
+ private String kuaidicom;
+ /**
+ * 收件人信息
+ */
+ private ManInfo recMan;
+ /**
+ * 收件人信息
+ */
+ private ManInfo sendMan;
+ /**
+ * 物品名称(部分快递公司必填)
+ */
+ private String cargo;
+ /**
+ * 物品总数量。
+ * 另外该属性与子单有关,如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号),
+ * needChild = 1、count 需要大于1,如count = 2 则一个主单 一个子单,
+ * count = 3则一个主单 二个子单;返回的子单号码见返回结果的childNum字段
+ */
+ private int count;
+ /**
+ * 物品总重量,单位:KG (例子:0.5)
+ */
+ private String weight;
+ /**
+ * 支付方式:
+ * SHIPPER:寄方付(默认)
+ * CONSIGNEE:到付
+ * MONTHLY:月结
+ * THIRDPARTY:第三方支付
+ */
+ private String payType;
+ /**
+ * 快递类型:
+ * 标准快递(默认)
+ * 顺丰特惠
+ * EMS经济
+ */
+ private String expType;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 保价额度
+ */
+ private String valinsPay;
+ /**
+ * 代收货款额度
+ */
+ private String collection;
+ /**
+ * 是否需要子单(支持子单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号);
+ * needChild = 1、count 需要大于1,如count = 2 一个主单 一个子单,
+ * count = 3 一个主单 二个子单,返回的子单号码见返回结果的childNum字段
+ */
+ private int needChild;
+ /**
+ * 是否需要回单(支持回单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 返回的回单号见返回结果的returnNum字段
+ */
+ private String needBack;
+ /**
+ * 贵司内部自定义的订单编号,需要保证唯一性
+ */
+ private String orderId;
+ /**
+ * 是否返回面单
+ * 0:不需要(默认)
+ * 1:需要
+ * 如果需要,则返回要打印的模版的HTML代码,贵司可以直接将之显示到IE等浏览器,然后通过浏览器进行打印
+ */
+ private String needTemplate;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * 是否开启订阅功能:
+ * 0:不开启(默认)
+ * 1:开启
+ * 说明开启订阅功能时:pollCallBackUrl必须填入
+ * 此功能只针对有快递单号的单
+ */
+ private String op;
+ /**
+ * 如果op设置为1时,pollCallBackUrl必须填入,用于跟踪回调
+ */
+ private String pollCallBackUrl;
+ /**
+ * 添加此字段表示开通行政区域解析功能:0:关闭(默认);1:开通行政区域解析功能
+ */
+ private String resultv2;
+ /**
+ * 扩展字段,不同快递公司具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String code;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerSecret;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerName;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String checkMan;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlReq.java
new file mode 100644
index 00000000..c4160d1e
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintHtmlReq.java
@@ -0,0 +1,32 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 16:14
+ */
+@Data
+public class PrintHtmlReq {
+
+ /**
+ * 业务类型(默认:getPrintImg)
+ */
+ private String method;
+ /**
+ * 快递100分配给贵司的的授权key
+ */
+ private String key;
+ /**
+ * 加密签名信息:MD5(param+t+key+secret);加密后字符串转大写
+ */
+ private String sign;
+ /**
+ * 当前请求时间戳
+ */
+ private String t;
+ /**
+ * 其他参数组合成的json对象
+ */
+ private String param;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgParam.java
new file mode 100644
index 00000000..94d080f1
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgParam.java
@@ -0,0 +1,179 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 15:49
+ */
+@Data
+public class PrintImgParam {
+ /**
+ * 业务类型,默认为10
+ */
+ private String type;
+ /**
+ * 电子面单客户账户或月结账号,需贵司向当地快递公司网点申请
+ */
+ private String partnerId;
+ /**
+ * 电子面单密码,需贵司向当地快递公司网点申请
+ */
+ private String partnerKey;
+ /**
+ * 收件网点名称,由快递公司当地网点分配,
+ * 若使用淘宝授权填入(taobao),使用菜鸟授权填入(cainiao)
+ */
+ private String net;
+ /**
+ * 快递公司的编码,一律用小写字母
+ */
+ private String kuaidicom;
+ /**
+ * 收件人姓名
+ */
+ private String recManName;
+ /**
+ * 收件人的手机号
+ */
+ private String recManMobile;
+ /**
+ * 收件人的手机号
+ */
+ private String recManTel;
+ /**
+ * 收件人所在完整地址
+ */
+ private String recManPrintAddr;
+ /**
+ * 寄件人姓名
+ */
+ private String sendManName;
+ /**
+ * 寄件人的手机号
+ */
+ private String sendManMobile;
+ /**
+ * 寄件人所在的完整地址
+ */
+ private String sendManPrintAddr;
+ /**
+ * 打印电子面单模板编码(登录快递100管理后台查看)
+ */
+ private String tempid;
+ /**
+ * 物品名称(部分快递公司必填)
+ */
+ private String cargo;
+ /**
+ * 物品总数量。
+ * 另外该属性与子单有关,如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号),
+ * needChild = 1、count 需要大于1,如count = 2 则一个主单 一个子单,
+ * count = 3则一个主单 二个子单;返回的子单号码见返回结果的childNum字段
+ */
+ private String count;
+ /**
+ * 物品总重量,单位:KG (例子:0.5)
+ */
+ private String weight;
+ /**
+ * 支付方式:
+ * SHIPPER:寄方付(默认)
+ * CONSIGNEE:到付
+ * MONTHLY:月结
+ * THIRDPARTY:第三方支付
+ */
+ private String payType;
+ /**
+ * 快递类型:
+ * 标准快递(默认)
+ * 顺丰特惠
+ * EMS经济
+ */
+ private String expType;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 保价额度
+ */
+ private String valinsPay;
+ /**
+ * 代收货款额度
+ */
+ private String collection;
+ /**
+ * 是否需要子单(支持子单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 如果需要子单(指同一个订单打印出多张电子面单,即同一个订单返回多个面单号);
+ * needChild = 1、count 需要大于1,如count = 2 一个主单 一个子单,
+ * count = 3 一个主单 二个子单,返回的子单号码见返回结果的childNum字段
+ */
+ private String needChild;
+ /**
+ * 是否需要回单(支持回单的快递公司才可以用,是否支持可以参考参数字典)
+ * 1:需要
+ * 0:不需要(默认)
+ * 返回的回单号见返回结果的returnNum字段
+ */
+ private String needBack;
+ /**
+ * 贵司内部自定义的订单编号,需要保证唯一性
+ */
+ private String orderId;
+ /**
+ * 生成图片的高,以mm为单位(默认100)
+ */
+ private String height;
+ /**
+ * 生成图片的宽,以mm为单位(默认180)
+ */
+ private String width;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * 是否开启订阅功能:
+ * 0:不开启(默认)
+ * 1:开启
+ * 说明开启订阅功能时:pollCallBackUrl必须填入
+ * 此功能只针对有快递单号的单
+ */
+ private String op;
+ /**
+ * 如果op设置为1时,pollCallBackUrl必须填入,用于跟踪回调
+ */
+ private String pollCallBackUrl;
+ /**
+ * 添加此字段表示开通行政区域解析功能:0:关闭(默认);1:开通行政区域解析功能
+ */
+ private String resultv2;
+ /**
+ * 打印时间
+ */
+ private String printTime;
+
+ /**
+ * 扩展字段,不同快递公司具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String code;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerSecret;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String partnerName;
+ /**
+ * 扩展字段,具体详情看参数字典
+ * https://api.kuaidi100.com/help/doc/?code=5f0ff6e82977d50a94e10237&openKey=%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95
+ */
+ private String checkMan;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgReq.java
new file mode 100644
index 00000000..4e5b8432
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintImgReq.java
@@ -0,0 +1,31 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 15:49
+ */
+@Data
+public class PrintImgReq extends PrintReq{
+ /**
+ * 业务类型(默认:getPrintImg)
+ */
+ private String method;
+ /**
+ * 快递100分配给贵司的的授权key
+ */
+ private String key;
+ /**
+ * 加密签名信息:MD5(param+t+key+secret);加密后字符串转大写
+ */
+ private String sign;
+ /**
+ * 当前请求时间戳
+ */
+ private String t;
+ /**
+ * 其他参数组合成的json对象
+ */
+ private String param;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintReq.java
new file mode 100644
index 00000000..5aa94533
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/PrintReq.java
@@ -0,0 +1,36 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-20 9:41
+ */
+@Data
+public class PrintReq extends BaseRequest {
+
+ /**
+ * 业务类型(默认:getPrintImg)
+ */
+ private String method;
+ /**
+ * 快递100分配给贵司的的授权key
+ */
+ private String key;
+ /**
+ * 加密签名信息:MD5(param+t+key+secret);加密后字符串转大写
+ */
+ private String sign;
+ /**
+ * 当前请求时间戳
+ */
+ private String t;
+ /**
+ * 其他参数
+ */
+ private String param;
+ /**
+ * 快递100分配给贵司的的授权key
+ */
+ private String secret;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackParam.java
new file mode 100644
index 00000000..8c554744
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackParam.java
@@ -0,0 +1,43 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 15:58
+ */
+@Data
+public class QueryTrackParam {
+ /**
+ * 查询的快递公司的编码,一律用小写字母
+ */
+ private String com;
+ /**
+ * 查询的快递单号, 单号的最大长度是32个字符
+ */
+ private String num;
+ /**
+ * 收件人或寄件人的手机号或固话
+ */
+ private String phone;
+ /**
+ * 出发地城市,省-市-区
+ */
+ private String from;
+ /**
+ * 目的地城市,省-市-区
+ */
+ private String to;
+ /**
+ * 添加此字段表示开通行政区域解析功能。0:关闭(默认),1:开通行政区域解析功能,2:开通行政解析功能并且返回出发、目的及当前城市信息
+ */
+ private String resultv2 = "0";
+ /**
+ * 返回数据格式。0:json(默认),1:xml,2:html,3:text
+ */
+ private String show = "0";
+ /**
+ * 返回结果排序方式。desc:降序(默认),asc:升序
+ */
+ private String order = "desc";
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackReq.java
new file mode 100644
index 00000000..95c58639
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/QueryTrackReq.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 15:56
+ */
+@Data
+public class QueryTrackReq extends BaseRequest {
+ /**
+ * 我方分配给贵司的的公司编号, 点击查看账号信息
+ */
+ private String customer;
+ /**
+ * 签名, 用于验证身份, 按param + key + customer 的顺序进行MD5加密(注意加密后字符串要转大写), 不需要“+”号
+ */
+ private String sign;
+ /**
+ * 其他参数组合成的json对象
+ */
+ private String param;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SendSmsReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SendSmsReq.java
new file mode 100644
index 00000000..e6e5f259
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SendSmsReq.java
@@ -0,0 +1,44 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-21 9:14
+ */
+@Data
+public class SendSmsReq extends BaseRequest {
+ /**
+ * 加密签名信息:MD5(key + userid);加密后字符串转大写
+ */
+ private String sign;
+ /**
+ * 我方分配给贵司的的短信接口用户ID,点击查看账号信息
+ */
+ private String userid;
+ /**
+ * 商户名称签名;最好用简称,该字段信息会在短信标签处显示。不要超过5个字符
+ */
+ private String seller;
+ /**
+ * 接收短信手机号
+ */
+ private String phone;
+ /**
+ * 短信模板ID
+ */
+ private String tid;
+ /**
+ * 短信模板替换内容
+ */
+ private String content;
+ /**
+ * 外部订单号:当该短信发送模板有回调地址时,外部订单号会返回给调用者,方便用户更新数据
+ */
+ private String outorder;
+ /**
+ * 回调地址:如果客户在发送短信时填写该参数,将按照这个参数回调短信发送状态;
+ * 如果为空,将按照模板配置的地址回调短信发送状态;如果两个参数都不填写,将不会回调通知状态
+ */
+ private String callback;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParam.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParam.java
new file mode 100644
index 00000000..36fab5d1
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParam.java
@@ -0,0 +1,36 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 13:41
+ */
+@Data
+public class SubscribeParam {
+
+ /**
+ * 订阅的快递公司的编码,一律用小写字母
+ */
+ private String company;
+ /**
+ * 订阅的快递单号,单号的最大长度是32个字符
+ */
+ private String number;
+ /**
+ * 出发地城市,省-市-区,非必填,填了有助于提升签收状态的判断的准确率,请尽量提供
+ */
+ private String from;
+ /**
+ * 目的地城市,省-市-区,非必填,填了有助于提升签收状态的判断的准确率,且到达目的地后会加大监控频率,请尽量提供
+ */
+ private String to;
+ /**
+ * 我方分配给贵司的的授权key
+ */
+ private String key;
+ /**
+ * 附加参数信息
+ */
+ private SubscribeParameters parameters;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParameters.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParameters.java
new file mode 100644
index 00000000..9822f041
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeParameters.java
@@ -0,0 +1,57 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 13:42
+ */
+@Data
+public class SubscribeParameters {
+ /**
+ * 回调接口的地址。如果需要在推送信息回传自己业务参数,可以在回调地址URL后面拼接上去,如示例中的orderId
+ * http://www.xxxxx.com/callback?orderId=123
+ */
+ private String callbackurl;
+ /**
+ * 签名用随机字符串。32位自定义字符串。添加该参数,则推送的时候会增加sign给贵司校验消息的可靠性
+ */
+ private String salt;
+ /**
+ * 添加此字段表示开通行政区域解析功能。0:关闭(默认),1:开通行政区域解析功能
+ */
+ private String resultv2;
+ /**
+ * 添加此字段且将此值设为1,则表示开始智能判断单号所属公司的功能,
+ * 开启后,company字段可为空,即只传运单号(number字段),我方收到后会根据单号判断出其所属的快递公司(即company字段)。
+ * 建议只有在无法知道单号对应的快递公司(即company的值)的情况下才开启此功能。
+ */
+ private String autoCom;
+ /**
+ * 添加此字段表示开启国际版
+ * 开启后,若订阅的单号(即number字段)属于国际单号,会返回出发国与目的国两个国家的跟踪信息;
+ * 本功能暂时只支持邮政体系(国际类的邮政小包、EMS)内的快递公司;
+ * 若单号我方识别为非国际单,即使添加本字段,也不会返回destResult元素组.
+ */
+ private String interCom;
+ /**
+ * 出发国家编码
+ */
+ private String departureCountry;
+ /**
+ * 出发国家快递公司的编码
+ */
+ private String departureCom;
+ /**
+ * 目的国家编码
+ */
+ private String destinationCountry;
+ /**
+ * 目的国家快递公司的编码
+ */
+ private String destinationCom;
+ /**
+ * 收件人或寄件人的手机号或固话(顺丰单号必填,也可以填写后四位,如果是固话,请不要上传分机号)
+ */
+ private String phone;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeReq.java
new file mode 100644
index 00000000..e59050cc
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/SubscribeReq.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 13:41
+ */
+@Data
+public class SubscribeReq extends BaseRequest {
+ /**
+ * 返回数据格式(json、xml、text)
+ */
+ private String schema;
+ /**
+ * 其他参数
+ */
+ private String param;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ThirdAuthReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ThirdAuthReq.java
new file mode 100644
index 00000000..bd31c06d
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/ThirdAuthReq.java
@@ -0,0 +1,25 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-01-06 14:16
+ */
+@Getter
+@Setter
+public class ThirdAuthReq {
+ /**
+ * 请求的第三方平台,淘宝:taobao,菜鸟:cainiao,京东:jdalpha,拼多多:pinduoduoWx
+ */
+ private String net;
+ /**
+ * 授权完后的信息回调地址
+ */
+ private String callBackUrl;
+ /**
+ * 已经授权完需要重新获取授权信息
+ */
+ private String partnerId;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderCancelReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderCancelReq.java
new file mode 100644
index 00000000..fd9ac5f7
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderCancelReq.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.cloud;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-25 15:47
+ */
+@Data
+public class COrderCancelReq extends CloudBaseReq{
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+ /**
+ * 取消原因,例:暂时不寄件了
+ */
+ private String cancelMsg;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderQueryReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderQueryReq.java
new file mode 100644
index 00000000..b79f1820
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderQueryReq.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.cloud;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-20 11:09
+ */
+@Data
+public class COrderQueryReq extends CloudBaseReq{
+ /**
+ *
+ */
+ private String sendManPrintAddr;
+
+ private String recManPrintAddr;
+
+ private String address;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderReq.java
new file mode 100644
index 00000000..227a314a
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/COrderReq.java
@@ -0,0 +1,75 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.cloud;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-10-27 15:47
+ */
+@Data
+public class COrderReq extends CloudBaseReq{
+ /**
+ * 快递公司的编码,一律用小写字母,见《快递公司编码》
+ */
+ private String com;
+ /**
+ * 收件人姓名
+ */
+ private String recManName;
+ /**
+ * 收件人的手机号,手机号和电话号二者其一必填
+ */
+ private String recManMobile;
+ /**
+ * 收件人所在完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园
+ */
+ private String recManPrintAddr;
+ /**
+ * 寄件人姓名
+ */
+ private String sendManName;
+ /**
+ * 寄件人的手机号,手机号和电话号二者其一必填
+ */
+ private String sendManMobile;
+ /**
+ * 寄件人所在的完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园B10
+ */
+ private String sendManPrintAddr;
+ /**
+ * 物品名称,例:文件
+ */
+ private String cargo;
+ /**
+ * 物品总重量KG,例:1.5,单位kg
+ */
+ private String weight;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * callBackUrl订单信息回调
+ */
+ private String callBackUrl;
+ /**
+ * 预约日期,例如:今天/明天/后天
+ */
+ private String dayType;
+ /**
+ * 预约起始时间(HH:mm),例如:09:00
+ */
+ private String pickupStartTime;
+ /**
+ * 预约截止时间(HH:mm),例如:10:00
+ */
+ private String pickupEndTime;
+ /**
+ * 支付方式,SHIPPER: 寄付(默认),CONSIGNEE: 到付
+ */
+ private String payment;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/CloudBaseReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/CloudBaseReq.java
new file mode 100644
index 00000000..fbf04ad0
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/cloud/CloudBaseReq.java
@@ -0,0 +1,31 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.cloud;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.request.BaseRequest;
+import co.yixiang.tools.utils.kuaidi100.sdk.utils.SignUtils;
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-10-27 15:45
+ */
+@Data
+public class CloudBaseReq extends BaseRequest {
+ /**
+ * 用户授权key
+ */
+ private String secret_key;
+ /**
+ * 接口编号
+ */
+ private String secret_code;
+ /**
+ * 加密签名:md5(secret_key+secret_secret)转大写
+ */
+ private String secret_sign;
+
+ private String secret_secret;
+
+ public String getSecret_sign() {
+ return SignUtils.sign(secret_key+secret_secret);
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/AuthReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/AuthReq.java
new file mode 100644
index 00000000..c5319662
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/AuthReq.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 16:57
+ */
+@Data
+public class AuthReq {
+ /**
+ * 快递公司,一律用小写字母,见参数字典
+ */
+ private String com;
+ /**
+ * 授权店铺id
+ */
+ private String storeId;
+ /**
+ * 授权后信息的信息回调地址
+ */
+ private String callbackUrl;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/CancelReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/CancelReq.java
new file mode 100644
index 00000000..d59e6ae3
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/CancelReq.java
@@ -0,0 +1,24 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 17:24
+ */
+@Data
+public class CancelReq {
+
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+ /**
+ * 取消原因
+ */
+ private String cancelMsg;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderGoods.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderGoods.java
new file mode 100644
index 00000000..88b34456
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderGoods.java
@@ -0,0 +1,27 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-09 10:15
+ */
+@Data
+public class OrderGoods {
+ /**
+ * 商品名称
+ */
+ private String name;
+ /**
+ * 商品价格(分)
+ */
+ private Integer price;
+ /**
+ * 商品数量
+ */
+ private Integer count;
+ /**
+ * 商品单位
+ */
+ private String unit;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderReq.java
new file mode 100644
index 00000000..3d995f7b
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/OrderReq.java
@@ -0,0 +1,115 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.samecity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 17:25
+ */
+@Data
+public class OrderReq {
+ /**
+ * 快递公司的编码,一律用小写字母,见《快递公司编码》
+ */
+ private String com;
+ /**
+ * 收件人姓名
+ */
+ private String recManName;
+ /**
+ * 收件人的手机号,手机号和电话号二者其一必填
+ */
+ private String recManMobile;
+ /**
+ * 收件人所在完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园
+ */
+ private String recManPrintAddr;
+ /**
+ * 寄件人姓名
+ */
+ private String sendManName;
+ /**
+ * 寄件人的手机号,手机号和电话号二者其一必填
+ */
+ private String sendManMobile;
+ /**
+ * 寄件人所在的完整地址,如广东深圳市深圳市南山区科技南十二路2号金蝶软件园B10
+ */
+ private String sendManPrintAddr;
+ /**
+ * 服务类型
+ */
+ private String serviceType;
+ /**
+ * 物品总重量KG,例:1.5,单位kg
+ */
+ private Double weight;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 签名用随机字符串
+ */
+ private String salt;
+ /**
+ * callBackUrl订单信息回调
+ */
+ private String callbackUrl;
+ /**
+ * 订单类型,默认为0 0: 立即单 1: 预约单
+ */
+ private Integer orderType;
+ /**
+ * 取货时间(2020-02-02 22:00,指的是预约取件时间)
+ */
+
+ private String pickupTime;
+ /**
+ * 支付方式,SHIPPER: 寄付(默认),CONSIGNEE: 到付
+ */
+ private String payment;
+ /**
+ * 对应商家版物品来源流水号
+ */
+ private String orderSourceNo;
+ /**
+ * 物品来源
+ */
+ private String orderSourceType;
+ /**
+ * 店铺ID
+ */
+ private String storeId;
+ /**
+ * 小费(分)
+ */
+ private Integer additionFee;
+ /**
+ * 保险费用(闪送支持)
+ */
+ private Integer insurance;
+ /**
+ * 保险产品ID(闪送支持)
+ */
+ private String insuranceProId;
+ /**
+ * 商品价格
+ */
+ private Integer price;
+ /**
+ * 代收价格
+ */
+ private Integer CollectionPrice;
+
+ private String partnerId;
+
+ private String partnerKey;
+
+ /**
+ * 商品详情(强烈建议提供,方便骑手在取货时确认货品信息 ;顺丰时必填)
+ */
+ private List goods;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/QueryReq.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/QueryReq.java
new file mode 100644
index 00000000..d6727a92
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/request/samecity/QueryReq.java
@@ -0,0 +1,20 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.request.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 17:24
+ */
+@Data
+public class QueryReq {
+
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/AutoNumResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/AutoNumResp.java
new file mode 100644
index 00000000..26f7a942
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/AutoNumResp.java
@@ -0,0 +1,27 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 10:04
+ */
+@Data
+public class AutoNumResp {
+ /**
+ * 请忽略
+ */
+ public String lengthPre;
+ /**
+ * 快递公司对应的编码
+ */
+ private String comCode;
+ /**
+ * 请忽略
+ */
+ private String noPre;
+ /**
+ * 请忽略
+ */
+ private String noCount;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryData.java
new file mode 100644
index 00000000..86bf1136
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryData.java
@@ -0,0 +1,27 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:17
+ */
+@Data
+public class BOrderQueryData {
+
+ private String province;
+
+ private String city;
+
+ private String district;
+
+ private String addr;
+
+ private String latitude;
+
+ private String longitude;
+
+ private List mktInfo;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryDataInfo.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryDataInfo.java
new file mode 100644
index 00000000..551babf3
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderQueryDataInfo.java
@@ -0,0 +1,22 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:24
+ */
+@Data
+public class BOrderQueryDataInfo {
+ /**
+ * 业务服务类型
+ */
+ private List serviceType;
+ /**
+ * 支持的快递公司编码
+ */
+ private String kuaidiCom;
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderResp.java
new file mode 100644
index 00000000..3d5dcffb
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BOrderResp.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-09-17 14:31
+ */
+@Data
+public class BOrderResp {
+ /**
+ * 任务ID
+ */
+ private String taskId;
+ /**
+ * 订单ID
+ */
+ private String orderId;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BaseResponse.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BaseResponse.java
new file mode 100644
index 00000000..9f6c15d6
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/BaseResponse.java
@@ -0,0 +1,8 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-11-25 16:11
+ */
+public class BaseResponse {
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintBaseResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintBaseResp.java
new file mode 100644
index 00000000..16c8b6e4
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintBaseResp.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 18:48
+ */
+@Data
+public class PrintBaseResp {
+
+ private String returnCode;
+
+ private boolean result;
+
+ private String message;
+
+ private T data;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintCloudData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintCloudData.java
new file mode 100644
index 00000000..d9c78208
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintCloudData.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 19:49
+ */
+@Data
+public class PrintCloudData {
+
+ private String taskId;
+
+ private String eOrder;
+
+ private String kuaidinum;
+
+ private String kuaidicom;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlData.java
new file mode 100644
index 00000000..00fb15a8
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlData.java
@@ -0,0 +1,33 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 19:31
+ */
+@Data
+public class PrintHtmlData {
+ /**
+ * html代码
+ */
+ private List template;
+ /**
+ * 快递单号
+ */
+ private String kuaidinum;
+ /**
+ * 大头笔
+ */
+ private String bulkpen;
+ /**
+ * 电子面单链接
+ */
+ private List templateurl;
+ /**
+ * 子单号
+ */
+ private String childNum;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlResp.java
new file mode 100644
index 00000000..b9a05bd1
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintHtmlResp.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 19:29
+ */
+@Data
+public class PrintHtmlResp {
+
+ private String taskId;
+
+ private String message;
+
+ private String status;
+
+ private boolean result;
+
+ private List data;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintImgData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintImgData.java
new file mode 100644
index 00000000..4d4c21d2
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/PrintImgData.java
@@ -0,0 +1,21 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-17 18:52
+ */
+@Data
+public class PrintImgData {
+
+ private String taskId;
+
+ private String eOrder;
+
+ private String kuaidinum;
+
+ private String kuaidicom;
+
+ private String imgBase64;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackData.java
new file mode 100644
index 00000000..da0bb8b7
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackData.java
@@ -0,0 +1,35 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:13
+ */
+@Data
+public class QueryTrackData {
+ /**
+ * 时间,原始格式
+ */
+ private String time;
+ /**
+ * 物流轨迹节点内容
+ */
+ private String context;
+ /**
+ * 格式化后时间
+ */
+ private String ftime;
+ /**
+ * 行政区域的编码
+ */
+ private String areaCode;
+ /**
+ * 行政区域的名称
+ */
+ private String areaName;
+ /**
+ * 签收状态 (0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投)
+ */
+ private String status;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackMapResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackMapResp.java
new file mode 100644
index 00000000..828235a2
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackMapResp.java
@@ -0,0 +1,30 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-12-24 17:34
+ */
+@Data
+@ToString(callSuper = true)
+public class QueryTrackMapResp extends QueryTrackResp {
+
+ /**
+ * 轨迹地图链接
+ */
+ private String trailUrl;
+ /**
+ * 预计到达时间
+ */
+ private String arrivalTime;
+ /**
+ * 平均耗时
+ */
+ private String totalTime;
+ /**
+ * 到达还需多少时间
+ */
+ private String remainTime;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackPosition.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackPosition.java
new file mode 100644
index 00000000..6e13266e
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackPosition.java
@@ -0,0 +1,20 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:16
+ */
+@Data
+public class QueryTrackPosition {
+
+ /**
+ * 地址编码
+ */
+ private String number;
+ /**
+ * 地址名称
+ */
+ private String name;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackResp.java
new file mode 100644
index 00000000..8eab1f74
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackResp.java
@@ -0,0 +1,55 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:07
+ */
+@Data
+public class QueryTrackResp {
+ /**
+ * 消息体,请忽略
+ */
+ private String message;
+ /**
+ * 快递单号
+ */
+ private String nu;
+ /**
+ * 是否签收标记
+ */
+ private String ischeck;
+ /**
+ * 快递公司编码,一律用小写字母
+ */
+ private String com;
+ /**
+ * 通讯状态
+ */
+ private String status;
+ /**
+ * 轨迹详情数组
+ */
+ private List data;
+ /**
+ * 快递单当前状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投,10待清关,11清关中,12已清关,13清关异常,14拒签 等13个状态
+ */
+ private String state;
+ /**
+ * 快递单明细状态标记
+ */
+ private String condition;
+
+ private QueryTrackRouteInfo routeInfo;
+ /**
+ * 查不到轨迹或者其他问题返回码
+ */
+ private String returnCode;
+ /**
+ * 查不到轨迹或者其他问题返回结果
+ */
+ private boolean result;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackRouteInfo.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackRouteInfo.java
new file mode 100644
index 00000000..1313e5da
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/QueryTrackRouteInfo.java
@@ -0,0 +1,23 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:14
+ */
+@Data
+public class QueryTrackRouteInfo {
+ /**
+ * 出发位置
+ */
+ private QueryTrackPosition from;
+ /**
+ * 当前位置
+ */
+ private QueryTrackPosition cur;
+ /**
+ * 收货地
+ */
+ private QueryTrackPosition to;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SendSmsResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SendSmsResp.java
new file mode 100644
index 00000000..4807880e
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SendSmsResp.java
@@ -0,0 +1,19 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-21 9:19
+ */
+@Data
+public class SendSmsResp {
+
+ private Integer status;
+
+ private String data;
+
+ private String msg;
+
+ private Integer code;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackData.java
new file mode 100644
index 00000000..2d685594
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackData.java
@@ -0,0 +1,27 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-21 10:05
+ */
+@Data
+public class SmsCallbackData {
+ /**
+ * 传入的外部订单号
+ */
+ private String outorder;
+ /**
+ * 附加信息
+ */
+ private String message;
+ /**
+ * 短信发送状态:发送成功、发送失败、接收成功、接收失败
+ */
+ private String status;
+ /**
+ * 返回校验信息:MD5(id + phone + outorder);校验方式是MD5加密的:模板ID+手机号+外部订单号。用户可根据加密签名判断是否进行处理请求
+ */
+ private String sign;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackResp.java
new file mode 100644
index 00000000..8f94cc67
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SmsCallbackResp.java
@@ -0,0 +1,34 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * 短信回调结果
+ *
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-21 10:02
+ */
+@Data
+public class SmsCallbackResp {
+ /**
+ * 状态值:0-表示失败;1-表示成功
+ */
+ private Integer status;
+ /**
+ * 返回数据信息:短信发送状态
+ */
+ private SmsCallbackData data;
+ /**
+ * 信息内容:返回具体的信息体描述
+ */
+ private String msg;
+ /**
+ * 附加信息
+ */
+ private String extra;
+ /**
+ * 该值表示所数据的总条数
+ */
+ private Integer total;
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushData.java
new file mode 100644
index 00000000..ba6d99a0
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushData.java
@@ -0,0 +1,35 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-08-28 14:24
+ */
+@Data
+public class SubscribePushData {
+ /**
+ * 物流轨迹节点内容
+ */
+ private String context;
+ /**
+ * 时间,原始格式
+ */
+ private String time;
+ /**
+ * 格式化后时间
+ */
+ private String ftime;
+ /**
+ * 本数据元对应的签收状态。只有在开通签收状态服务(见上面"status"后的说明)且在订阅接口中提交resultv2标记后才会出现
+ */
+ private String status;
+ /**
+ * 本数据元对应的行政区域的编码,只有在开通签收状态服务(见上面"status"后的说明)且在订阅接口中提交resultv2标记后才会出现
+ */
+ private String areaCode;
+ /**
+ * 本数据元对应的行政区域的名称,开通签收状态服务(见上面"status"后的说明)且在订阅接口中提交resultv2标记后才会出现
+ */
+ private String areaName;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushParamResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushParamResp.java
new file mode 100644
index 00000000..dd9ea104
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushParamResp.java
@@ -0,0 +1,50 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-08-28 14:23
+ */
+@Data
+public class SubscribePushParamResp {
+ /**
+ * 监控状态:polling:监控中,shutdown:结束,abort:中止,updateall:重新推送。
+ * 其中当快递单为已签收时status=shutdown,当message为“3天查询无记录”或“60天无变化时”status= abort ,对于stuatus=abort的状态,
+ * 需要增加额外的处理逻辑:若贵司校验快递公司编码和单号无误后仍需继续跟踪,则隔半小时再发起该单的订阅即可
+ */
+ private String status;
+ /**
+ * 包括got、sending、check三个状态,由于意义不大,已弃用,请忽略
+ */
+ private String billstatus;
+ /**
+ * 监控状态相关消息,如:3天查询无记录,60天无变化
+ */
+ private String message;
+ /**
+ * 快递公司编码是否出错,0为本推送信息对应的是贵司提交的原始快递公司编码,1为本推送信息对应的是我方纠正后的新的快递公司编码。
+ * 一个单如果我们连续3天都查不到结果,我方会
+ * (1)判断一次贵司提交的快递公司编码是否正确,如果正确,给贵司的回调接口(callbackurl)推送带有如下字段的信息:autoCheck=0、comOld与comNew都为空;
+ * (2)如果贵司提交的快递公司编码出错,我们会帮忙用正确的快递公司编码+原来的运单号重新提交订阅并开启监控(后续如果监控到单号有更新就给贵司的回调接口(callbackurl)
+ * 推送带有如下字段的信息:autoCheck=1、comOld=原来的公司编码、comNew=新的公司编码);
+ * 并且给贵方的回调接口(callbackurl)推送一条含有如下字段的信息:status=abort、autoCheck=0、comOld为空、comNew=纠正后的快递公司编码。
+ */
+ private String autoCheck;
+ /**
+ * 贵司提交的原始的快递公司编码。详细见autoCheck后说明。若开启了国际版(即在订阅请求中增加字段interCom=1),则回调请求中暂无此字段
+ */
+ private String comOld;
+ /**
+ * 我司纠正后的新的快递公司编码。详细见autoCheck后说明。若开启了国际版(即在订阅请求中增加字段interCom=1),则回调请求中暂无此字段
+ */
+ private String comNew;
+ /**
+ * 最新查询结果,若在订阅报文中通过interCom字段开通了国际版,则此lastResult表示出发国的查询结果,全量,倒序(即时间最新的在最前)
+ */
+ private SubscribePushResult lastResult;
+ /**
+ * 表示最新的目的国家的查询结果,只有在订阅报文中通过interCom=1字段开通了国际版才会显示此数据元,全量,倒序(即时间最新的在最前)
+ */
+ private SubscribePushResult destResult;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushResult.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushResult.java
new file mode 100644
index 00000000..f89041df
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribePushResult.java
@@ -0,0 +1,45 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-08-28 14:24
+ */
+@Data
+public class SubscribePushResult {
+ /**
+ * 消息体,请忽略
+ */
+ private String message;
+ /**
+ * 快递单当前状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投 等8个状态
+ */
+ private String state;
+ /**
+ * 通讯状态,请忽略
+ */
+ private String status;
+ /**
+ * 快递单明细状态标记,暂未实现,请忽略
+ */
+ private String condition;
+ /**
+ * 是否签收标记
+ */
+ private String ischeck;
+ /**
+ * 快递公司编码,一律用小写字母,点击查看快递公司编码
+ */
+ private String com;
+ /**
+ * 快递单号
+ */
+ private String nu;
+ /**
+ * 数组,包含多个对象,每个对象字段如展开所示
+ */
+ private List data;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeResp.java
new file mode 100644
index 00000000..bac4839c
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeResp.java
@@ -0,0 +1,17 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-16 19:18
+ */
+@Data
+public class SubscribeResp {
+
+ private boolean result;
+
+ private String returnCode;
+
+ private String message;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushParamResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushParamResp.java
new file mode 100644
index 00000000..f982249f
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushParamResp.java
@@ -0,0 +1,46 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-08-28 14:23
+ */
+@Data
+public class SubscribeWithMapPushParamResp {
+ /**
+ * 监控状态:polling:监控中,shutdown:结束,abort:中止,updateall:重新推送。
+ * 其中当快递单为已签收时status=shutdown,当message为“3天查询无记录”或“60天无变化时”status= abort ,对于stuatus=abort的状态,
+ * 需要增加额外的处理逻辑:若贵司校验快递公司编码和单号无误后仍需继续跟踪,则隔半小时再发起该单的订阅即可
+ */
+ private String status;
+ /**
+ * 包括got、sending、check三个状态,由于意义不大,已弃用,请忽略
+ */
+ private String billstatus;
+ /**
+ * 监控状态相关消息,如:3天查询无记录,60天无变化
+ */
+ private String message;
+ /**
+ * 快递公司编码是否出错,0为本推送信息对应的是贵司提交的原始快递公司编码,1为本推送信息对应的是我方纠正后的新的快递公司编码。
+ * 一个单如果我们连续3天都查不到结果,我方会
+ * (1)判断一次贵司提交的快递公司编码是否正确,如果正确,给贵司的回调接口(callbackurl)推送带有如下字段的信息:autoCheck=0、comOld与comNew都为空;
+ * (2)如果贵司提交的快递公司编码出错,我们会帮忙用正确的快递公司编码+原来的运单号重新提交订阅并开启监控(后续如果监控到单号有更新就给贵司的回调接口(callbackurl)
+ * 推送带有如下字段的信息:autoCheck=1、comOld=原来的公司编码、comNew=新的公司编码);
+ * 并且给贵方的回调接口(callbackurl)推送一条含有如下字段的信息:status=abort、autoCheck=0、comOld为空、comNew=纠正后的快递公司编码。
+ */
+ private String autoCheck;
+ /**
+ * 贵司提交的原始的快递公司编码。详细见autoCheck后说明。若开启了国际版(即在订阅请求中增加字段interCom=1),则回调请求中暂无此字段
+ */
+ private String comOld;
+ /**
+ * 我司纠正后的新的快递公司编码。详细见autoCheck后说明。若开启了国际版(即在订阅请求中增加字段interCom=1),则回调请求中暂无此字段
+ */
+ private String comNew;
+ /**
+ * 最新查询结果,若在订阅报文中通过interCom字段开通了国际版,则此lastResult表示出发国的查询结果,全量,倒序(即时间最新的在最前)
+ */
+ private SubscribeWithMapPushResult lastResult;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushResult.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushResult.java
new file mode 100644
index 00000000..60bef2f1
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/SubscribeWithMapPushResult.java
@@ -0,0 +1,65 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-08-28 14:24
+ */
+@Data
+public class SubscribeWithMapPushResult {
+ /**
+ * 消息体,请忽略
+ */
+ private String message;
+ /**
+ * 快递单当前状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投 等8个状态
+ */
+ private String state;
+ /**
+ * 通讯状态,请忽略
+ */
+ private String status;
+ /**
+ * 快递单明细状态标记,暂未实现,请忽略
+ */
+ private String condition;
+ /**
+ * 是否签收标记
+ */
+ private String ischeck;
+ /**
+ * 快递公司编码,一律用小写字母,点击查看快递公司编码
+ */
+ private String com;
+ /**
+ * 快递单号
+ */
+ private String nu;
+ /**
+ * 数组,包含多个对象,每个对象字段如展开所示
+ */
+ private List data;
+ /**
+ * 轨迹地图链接
+ */
+ private String trailUrl;
+ /**
+ * 预计到达时间
+ */
+ private String arrivalTime;
+ /**
+ * 平均耗时
+ */
+ private String totalTime;
+ /**
+ * 到达还需多少时间
+ */
+ private String remainTime;
+ /**
+ * 路由信息
+ */
+ private QueryTrackRouteInfo routeInfo;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/ThirdAuthResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/ThirdAuthResp.java
new file mode 100644
index 00000000..23c2ec7e
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/ThirdAuthResp.java
@@ -0,0 +1,21 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-01-06 14:24
+ */
+@Getter
+@Setter
+public class ThirdAuthResp {
+ // 授权链接
+ private String url;
+ // 面单需要的partnerKey
+ private String partnerKey;
+ // 面单需要的parterId
+ private String parterId;
+ // 面单需要的net
+ private String net;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/COrderRespData.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/COrderRespData.java
new file mode 100644
index 00000000..8ceb6431
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/COrderRespData.java
@@ -0,0 +1,20 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response.cloud;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-10-27 16:00
+ */
+@Data
+public class COrderRespData {
+ /**
+ * 任务id
+ */
+ private String taskId;
+ /**
+ * 快递100返回给您的平台订单id
+ */
+ private String orderId;
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/CloudBaseResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/CloudBaseResp.java
new file mode 100644
index 00000000..9ba24073
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/cloud/CloudBaseResp.java
@@ -0,0 +1,20 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response.cloud;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-10-27 15:58
+ */
+public class CloudBaseResp {
+ /**
+ * 响应码
+ */
+ private String code;
+ /**
+ * 响应结果描述
+ */
+ private String message;
+ /**
+ * 响应数据
+ */
+ private T data;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/AuthResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/AuthResp.java
new file mode 100644
index 00000000..1a06301a
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/AuthResp.java
@@ -0,0 +1,13 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-22 17:32
+ */
+@Data
+public class AuthResp {
+
+ private String url;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/OrderResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/OrderResp.java
new file mode 100644
index 00000000..0ef9e048
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/OrderResp.java
@@ -0,0 +1,35 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-02-20 9:53
+ */
+@Data
+public class OrderResp {
+ /**
+ * 快递100任务id(归属快递100)
+ */
+ private String taskId;
+ /**
+ * 快递公司
+ */
+ private String com;
+ /**
+ * 快递100订单号(归属快递100)
+ */
+ private String orderId;
+ /**
+ * 费用
+ */
+ private Integer fee;
+ /**
+ * 距离(公里)
+ */
+ private Integer distance;
+ /**
+ * 快递公司单号
+ */
+ private String kuaidiNum;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/QueryResp.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/QueryResp.java
new file mode 100644
index 00000000..2e6df67f
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/response/samecity/QueryResp.java
@@ -0,0 +1,47 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.response.samecity;
+
+import lombok.Data;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2021-03-02 11:04
+ */
+@Data
+public class QueryResp {
+ /**
+ * 骑手姓名(订单处于下单成功、取消状态下为空)
+ */
+ private String courierName;
+ /**
+ * 骑手电话(订单处于下单成功、已签收、取消状态下为空)
+ */
+ private String courierPhone;
+ /**
+ * 预计送达时间(订单处于下单成功、已签收、取消状态下为空)
+ */
+ private String predictDeliveryTime;
+ /**
+ * 地图链接(订单处于下单成功、已签收、取消状态下为空)
+ */
+ private String trailUrl;
+ /**
+ * 当前骑手维度(订单处于下单成功、已签收、取消状态下为空)
+ */
+ private String lat;
+ /**
+ * 当前骑手经度(订单处于下单成功、已签收、取消状态下为空)
+ */
+ private String lng;
+ /**
+ * 订单状态( 0-下单成功 1-已接单 10-已取货 13-已签收 9-用户主动取消 99-订单已取消)
+ */
+ private Integer status;
+ /**
+ * 快递公司
+ */
+ private String com;
+ /**
+ * 快递公司
+ */
+ private String num;
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/HttpUtils.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/HttpUtils.java
new file mode 100644
index 00000000..80606d9b
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/HttpUtils.java
@@ -0,0 +1,125 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.utils;
+
+import co.yixiang.tools.utils.kuaidi100.sdk.pojo.HttpResult;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:59
+ */
+public class HttpUtils {
+
+ private final static String CHARSET_DEFAULT = "UTF-8";
+
+ /**
+ * post请求 编码格式默认UTF-8
+ *
+ * @param url 请求url
+ * @return
+ */
+ public static HttpResult doPost(String url, Object obj, int connectTimeout, int socketTimeout) {
+ CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+ CloseableHttpResponse resp = null;
+
+ HttpResult result = new HttpResult();
+ try {
+ Map params = ObjectToMapUtils.objectToMap(obj);
+ HttpPost httpPost = new HttpPost(url);
+
+ RequestConfig requestConfig = RequestConfig.custom()
+ .setConnectTimeout(connectTimeout)
+ .setSocketTimeout(socketTimeout).build();
+ httpPost.setConfig(requestConfig);
+ if (params != null && params.size() > 0) {
+ List list = new ArrayList();
+ for (Map.Entry entry : params.entrySet()) {
+ list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+ }
+ httpPost.setEntity(new UrlEncodedFormEntity(list, CHARSET_DEFAULT));
+ }
+
+ resp = httpClient.execute(httpPost);
+ String body = EntityUtils.toString(resp.getEntity(), CHARSET_DEFAULT);
+ int statusCode = resp.getStatusLine().getStatusCode();
+ result.setStatus(statusCode);
+ result.setBody(body);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (null != resp) {
+ try {
+ resp.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * post请求 编码格式默认UTF-8
+ *
+ * @param url 请求url
+ * @return
+ */
+ public static HttpResult doPostFile(String url, File file,int connectTimeout,int socketTimeout) {
+ CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+ CloseableHttpResponse resp = null;
+
+ HttpResult result = new HttpResult();
+ try {
+
+ HttpPost httpPost = new HttpPost(url);
+ MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+ RequestConfig requestConfig = RequestConfig.custom()
+ .setConnectTimeout(connectTimeout)
+ .setSocketTimeout(socketTimeout).build();
+ httpPost.setConfig(requestConfig);
+ // 把文件加到HTTP的post请求中
+ builder.addBinaryBody(
+ "file",
+ new FileInputStream(file),
+ ContentType.MULTIPART_FORM_DATA,
+ file.getName()
+ );
+ //HttpEntity
+ HttpEntity entity = builder.build();
+ httpPost.setEntity(entity);
+ resp = httpClient.execute(httpPost);
+ result.setStatus(resp.getStatusLine().getStatusCode());
+ result.setBody(EntityUtils.toString(resp.getEntity(), CHARSET_DEFAULT));
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (null != resp) {
+ try {
+ resp.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/ObjectToMapUtils.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/ObjectToMapUtils.java
new file mode 100644
index 00000000..e47feb9b
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/ObjectToMapUtils.java
@@ -0,0 +1,46 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.utils;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-12-01 9:19
+ */
+public class ObjectToMapUtils {
+ /**
+ * 将Object对象里面的属性和值转化成Map对象
+ *
+ * @param obj
+ * @return
+ * @throws IllegalAccessException
+ */
+ public static Map objectToMap(Object obj) throws IllegalAccessException {
+ if (obj == null) {
+ return null;
+ }
+ Map map = new HashMap();
+ List allField = getAllField(obj);
+ for (Field field : allField) {
+ field.setAccessible(true);
+ String fieldName = field.getName();
+ String fieldValue = "";
+ if (field.getType()== String.class || field.getType() == Integer.class || field.getType() == int.class){
+ fieldValue = field.get(obj)==null?"": field.get(obj).toString();
+ }
+ map.put(fieldName, fieldValue);
+ }
+ return map;
+ }
+
+ private static List getAllField(Object obj){
+ List fieldList = new ArrayList() ;
+ Class> clazz = obj.getClass();
+ while (clazz != null){
+ fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
+ clazz = clazz.getSuperclass();
+ }
+ return fieldList;
+
+ }
+}
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/PropertiesReader.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/PropertiesReader.java
new file mode 100644
index 00000000..d4c6d073
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/PropertiesReader.java
@@ -0,0 +1,73 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.utils;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * 读取配置文件工具类
+ *
+ * @author api.kuaidi100.com
+ * @date 2020年7月21日 15:40:11
+ */
+public class PropertiesReader {
+
+ //创建Properties对象
+ private static Properties property = new Properties();
+ //在静态块中加载资源
+ static {
+ try {
+ InputStream in = PropertiesReader.class.getResourceAsStream("/account.properties");
+ property.load(in);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 获取字符串类型的值
+ * @param key
+ * @return
+ */
+ public static String get(String key) {
+ return property.getProperty(key);
+ }
+
+ /**
+ * 获取Integer类型的值
+ * @param key
+ * @return
+ */
+ public static Integer getInteger(String key) {
+ String value = get(key);
+ return null == value ? null : Integer.valueOf(value);
+ }
+
+ /**
+ * 获取Boolean类型的值
+ * @param key
+ * @return
+ */
+ public static Boolean getBoolean(String key) {
+ String value = get(key);
+ return null == value ? null : Boolean.valueOf(value);
+ }
+
+ /**
+ * 设置一个键值对
+ * @param key
+ * @param value
+ */
+ public static void set(String key,String value){
+ property.setProperty(key,value);
+ }
+
+ /**
+ * 添加一个键值对
+ * @param key
+ * @param value
+ */
+ public static void add(String key,Object value){
+ property.put(key,value);
+ }
+}
+
diff --git a/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/SignUtils.java b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/SignUtils.java
new file mode 100644
index 00000000..8fc5dd59
--- /dev/null
+++ b/zsw-bxg/src/main/java/co/yixiang/tools/utils/kuaidi100/sdk/utils/SignUtils.java
@@ -0,0 +1,69 @@
+package co.yixiang.tools.utils.kuaidi100.sdk.utils;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+/**
+ * @Author: api.kuaidi100.com
+ * @Date: 2020-07-14 16:54
+ */
+public class SignUtils {
+
+ /**
+ * 快递100加密方式统一为MD5后转大写
+ *
+ * @param msg
+ * @return
+ */
+ public static String sign(String msg) {
+ return DigestUtils.md5Hex(msg).toUpperCase();
+ }
+
+ /**
+ * 查询加密
+ * @param param
+ * @param key
+ * @param customer
+ * @return
+ */
+ public static String querySign(String param,String key,String customer){
+ return sign(param+key+customer);
+ }
+
+ /**
+ * 打印/下单 加密
+ * @param param
+ * @param t
+ * @param key
+ * @param secret
+ * @return: java.lang.String
+ * @author: api.kuaidi100.com
+ * @time: 2020/12/3 9:23
+ */
+ public static String printSign(String param,String t,String key,String secret){
+ return sign(param+t+key+secret);
+ }
+
+ /**
+ * 云平台 加密
+ * @param key
+ * @param secret
+ * @return: java.lang.String
+ * @author: api.kuaidi100.com
+ * @time: 2020/12/3 9:23
+ */
+ public static String cloudSign(String key,String secret){
+ return sign(key+secret);
+ }
+
+ /**
+ * 短信加密
+ * @param key
+ * @param userId
+ * @return: java.lang.String
+ * @author: api.kuaidi100.com
+ * @time: 2020/12/3 9:32
+ */
+ public static String smsSign(String key,String userId){
+ return sign(key+userId);
+ }
+}