diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java index 110eb80bb3..e47619df3f 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java @@ -110,19 +110,19 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); } - /** - * 创建 RestTemplate 实例 - * @param restTemplateBuilder {@link RestTemplateAutoConfiguration#restTemplateBuilder} - */ - @Bean - public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){ - return restTemplateBuilder.build(); - } - public static FilterRegistrationBean createFilterBean(T filter, Integer order) { FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); bean.setOrder(order); return bean; } + /** + * 创建 RestTemplate 实例 + * + * @param restTemplateBuilder {@link RestTemplateAutoConfiguration#restTemplateBuilder} + */ + @Bean + public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { + return restTemplateBuilder.build(); + } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java index 567e34085e..be0f934147 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java @@ -9,6 +9,8 @@ import org.springframework.validation.annotation.Validated; import javax.validation.Valid; import javax.validation.constraints.NotEmpty; +// TODO @jason:TradeExpressProperties;更通用哈 +// TODO @芋艿:未来要不要放数据库中?考虑 saas 多租户时,不同租户使用不同的配置? /** * 交易快递查询的配置项 * @@ -21,9 +23,13 @@ import javax.validation.constraints.NotEmpty; public class TradeExpressQueryProperties { /** - * 快递查询服务商, 如果未配置,默认使用快递鸟 + * 快递查询服务商 + * + * 如果未配置,默认使用快递鸟 */ - private ExpressQueryProviderEnum expressQueryProvider; + // TODO @jason:可以把 expressQueryProvider 改成 client 变量,更简洁一点; + private ExpressQueryProviderEnum expressQueryProvider; // TODO @jaosn:默认值可以通过属性直接赋值哈; + // TODO @jason:需要考虑下,用户只配置了其中一个; /** * 快递鸟配置 */ @@ -46,12 +52,12 @@ public class TradeExpressQueryProperties { */ @NotEmpty(message = "快递鸟用户 ID 配置项不能为空") private String businessId; - /** * 快递鸟 API Key */ @NotEmpty(message = "快递鸟 Api Key 配置项不能为空") private String apiKey; + } /** @@ -59,6 +65,7 @@ public class TradeExpressQueryProperties { */ @Data public static class Kd100Config { + /** * 快递 100 授权码 */ @@ -69,7 +76,7 @@ public class TradeExpressQueryProperties { */ @NotEmpty(message = "快递 100 授权 Key 配置项不能为空") private String key; + } - } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryClient.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryClient.java index d43429d726..1494bb2e52 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryClient.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryClient.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRes import java.util.List; +// TODO @jason:可以改成 ExpressClient,未来可能还对接别的接口噢 /** * 快递查询客户端 * @@ -17,5 +18,7 @@ public interface ExpressQueryClient { * * @param reqDTO 查询请求参数 */ + // TODO @jason:可以改成 getExpressTrackList。返回字段可以参考 https://doc.youzanyun.com/detail/API/0/5 响应的 data List realTimeQuery(ExpressQueryReqDTO reqDTO); + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProvider.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProvider.java index 6fb0a4179a..e741e14265 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProvider.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProvider.java @@ -11,10 +11,12 @@ import java.util.List; * @author jason */ public interface ExpressQueryProvider { + /** * 快递实时查询 * * @param reqDTO 查询请求参数 */ List realTimeQueryExpress(ExpressQueryReqDTO reqDTO); + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderEnum.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderEnum.java index 094848ba63..48dab7eec1 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderEnum.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderEnum.java @@ -8,9 +8,12 @@ import lombok.Getter; * @author jason */ @Getter + public enum ExpressQueryProviderEnum { + KD_NIAO("kd-niao", "快递鸟"), KD_100("kd-100", "快递100"); + /** * 快递服务商唯一编码 */ @@ -21,8 +24,10 @@ public enum ExpressQueryProviderEnum { */ private final String name; + // TODO @jaosn:@AllArgsConstructor 可以替代哈 ExpressQueryProviderEnum(String code, String name) { this.code = code; this.name = name; } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderFactory.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderFactory.java index 87504faa31..bad2c6a5de 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderFactory.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderFactory.java @@ -1,14 +1,19 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core; /** - * 快递服务商工厂, 用于创建和缓存快递服务商服务 + * 快递服务商工厂,用于创建和缓存快递服务商服务 + * * @author jason */ public interface ExpressQueryProviderFactory { /** - * 通过枚举获取快递查询服务商, 如果不存在。就创建一个对应的快递查询服务商 + * 通过枚举获取快递查询服务商 + * + * 如果不存在,就创建一个对应的快递查询服务商 + * * @param queryProviderEnum 快递服务商枚举 */ ExpressQueryProvider getOrCreateExpressQueryProvider(ExpressQueryProviderEnum queryProviderEnum); + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java index d22f61ae56..615f84b4ef 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java @@ -23,4 +23,5 @@ public interface ExpressQueryConvert { KdNiaoExpressQueryReqDTO convert(ExpressQueryReqDTO dto); Kd100ExpressQueryReqDTO convert2(ExpressQueryReqDTO dto); + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryReqDTO.java index 7315aea07b..ffa72c532b 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryReqDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryReqDTO.java @@ -14,8 +14,9 @@ public class ExpressQueryReqDTO { /** * 快递公司编码 * - * 对应 {@link DeliveryExpressDO#getCode()} } + * 对应 {@link DeliveryExpressDO#getCode()} */ + // TODO @jaosn:要不改成 expressCode;项目里使用这个哈 private String expressCompanyCode; /** @@ -27,4 +28,5 @@ public class ExpressQueryReqDTO { * 收、寄件人的电话号码 */ private String phone; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryRespDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryRespDTO.java index feb06ea969..0bdb386c42 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryRespDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryRespDTO.java @@ -10,13 +10,15 @@ import lombok.Data; @Data public class ExpressQueryRespDTO { + // TODO @jason:LocalDateTime /** * 发生时间 */ private String time; - + // TODO @jason:其它字段可能要补充下 /** * 快递状态 */ private String state; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java index e2d55db34c..d1b72426f3 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java @@ -13,6 +13,7 @@ import lombok.Data; @JsonInclude(JsonInclude.Include.NON_NULL) public class Kd100ExpressQueryReqDTO { + // TODO @jaosn:要不改成 expressCode;项目里使用这个哈 /** * 快递公司编码 */ @@ -29,19 +30,20 @@ public class Kd100ExpressQueryReqDTO { * 收、寄件人的电话号码 */ private String phone; - /** * 出发地城市 */ private String from; - /** * 目的地城市,到达目的地后会加大监控频率 */ private String to; /** - * 返回结果排序:desc降序(默认),asc 升序 + * 返回结果排序 + * + * desc 降序(默认), asc 升序 */ private String order; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java index 49be062345..f7e5bdf048 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java @@ -18,23 +18,22 @@ public class Kd100ExpressQueryRespDTO { */ @JsonProperty("com") private String expressCompanyCode; - /** * 快递单号 */ @JsonProperty("nu") private String logisticsNo; - /** * 快递单当前状态 */ private String state; /** - * 查询结果, 失败返回 "false" + * 查询结果 + * + * 失败返回 "false" */ private String result; - /** * 查询结果失败时的错误信息 */ @@ -56,4 +55,5 @@ public class Kd100ExpressQueryRespDTO { @JsonProperty("context") private String state; } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryReqDTO.java index 3f0faae490..21b1abc581 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryReqDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryReqDTO.java @@ -12,21 +12,22 @@ import lombok.Data; @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class KdNiaoExpressQueryReqDTO { + + // TODO @jaosn:要不改成 expressCode;项目里使用这个哈 /** * 快递公司编码 */ @JsonProperty("ShipperCode") private String expressCompanyCode; - /** * 快递单号 */ @JsonProperty("LogisticCode") private String logisticsNo; - /** * 订单编号 */ @JsonProperty("OrderCode") private String orderNo; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryClientImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryClientImpl.java index cbf29cd4e6..59dfc77c10 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryClientImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryClientImpl.java @@ -17,6 +17,15 @@ import java.util.List; import static cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderEnum.KD_NIAO; +// TODO @jason:可以把整体包结构调整下;参考 sms client 的方式; +// + config +// + core +// client +// + dto +// + impl:里面可以放 kdniaoclient、kd100client +// ExpressClient +// ExpressClientFactory: 通过它直接获取默认和创建默认的 Client +// enums /** * 快递查询客户端实现 * @@ -24,30 +33,33 @@ import static cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQuery */ @Component @Slf4j -public class ExpressQueryClientImpl implements ExpressQueryClient { +public class ExpressQueryClientImpl implements ExpressQueryClient { + @Resource private ExpressQueryProviderFactory expressQueryProviderFactory; @Resource private TradeExpressQueryProperties tradeExpressQueryProperties; private ExpressQueryProvider expressQueryProvider; + @PostConstruct - private void init(){ + private void init() { + // 如果未设置,默认使用快递鸟 ExpressQueryProviderEnum queryProvider = tradeExpressQueryProperties.getExpressQueryProvider(); if (queryProvider == null) { - // 如果未设置,默认使用快递鸟 queryProvider = KD_NIAO; } + // 创建客户端 expressQueryProvider = expressQueryProviderFactory.getOrCreateExpressQueryProvider(queryProvider); if (expressQueryProvider == null) { - // 记录错误日志 log.error("获取创建快递查询服务商{}失败,请检查相关配置", queryProvider); } Assert.notNull(expressQueryProvider, "快递查询服务商不能为空"); - } + @Override public List realTimeQuery(ExpressQueryReqDTO reqDTO) { return expressQueryProvider.realTimeQueryExpress(reqDTO); } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryProviderFactoryImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryProviderFactoryImpl.java index 3060cb21c1..b6ce8d68af 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryProviderFactoryImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryProviderFactoryImpl.java @@ -12,12 +12,14 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** + * // TODO @jason:注释不全 * @author jason */ @Component public class ExpressQueryProviderFactoryImpl implements ExpressQueryProviderFactory { private final Map providerMap = new ConcurrentHashMap<>(8); + @Resource private TradeExpressQueryProperties tradeExpressQueryProperties; @Resource @@ -31,6 +33,7 @@ public class ExpressQueryProviderFactoryImpl implements ExpressQueryProviderFact private ExpressQueryProvider createExpressQueryProvider(ExpressQueryProviderEnum queryProviderEnum, TradeExpressQueryProperties tradeExpressQueryProperties) { + // TODO @jason:是不是直接 return 就好啦,更简洁一点 ExpressQueryProvider result = null; switch (queryProviderEnum) { case KD_NIAO: diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java index 07a51d0c93..4227cebc8c 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java @@ -21,10 +21,11 @@ import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR; +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.ExpressQueryConvert.INSTANCE; +// TODO @jason:可以参考 KdNiaoExpressQueryProvider 建议改改哈 /** * 快递 100 服务商 * @@ -34,8 +35,8 @@ import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.Expr public class Kd100ExpressQueryProvider implements ExpressQueryProvider { private static final String REAL_TIME_QUERY_URL = "https://poll.kuaidi100.com/poll/query.do"; - private final RestTemplate restTemplate; + private final RestTemplate restTemplate; private final TradeExpressQueryProperties.Kd100Config config; public Kd100ExpressQueryProvider(RestTemplate restTemplate, TradeExpressQueryProperties.Kd100Config config) { @@ -45,16 +46,19 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider { @Override public List realTimeQueryExpress(ExpressQueryReqDTO reqDTO) { + // 发起查询 Kd100ExpressQueryReqDTO kd100ReqParam = INSTANCE.convert2(reqDTO); - // 快递公司编码需要转成小写 - kd100ReqParam.setExpressCompanyCode(kd100ReqParam.getExpressCompanyCode().toLowerCase()); + kd100ReqParam.setExpressCompanyCode(kd100ReqParam.getExpressCompanyCode().toLowerCase()); // 快递公司编码需要转成小写 Kd100ExpressQueryRespDTO respDTO = sendExpressQueryReq(REAL_TIME_QUERY_URL, kd100ReqParam, Kd100ExpressQueryRespDTO.class); - log.debug("快递 100 接口 查询接口返回 {}", respDTO); + log.debug("[realTimeQueryExpress][快递 100 接口 查询接口返回 {}]", respDTO); + // 处理结果 if (Objects.equals("false", respDTO.getResult())) { - log.error("快递 100 接口 返回失败 {} ", respDTO.getMessage()); + log.error("[realTimeQueryExpress][快递 100 接口 返回失败 {}]", respDTO.getMessage()); throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getMessage()); + // TODO @json:else 可以不用写哈; } else { + // TODO @jason:convertList2 如果空,应该返回 list 了; if (CollUtil.isNotEmpty(respDTO.getTracks())) { return INSTANCE.convertList2(respDTO.getTracks()); } else { @@ -65,12 +69,14 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider { /** * 发送快递 100 实时快递查询请求,可以作为通用快递 100 通用请求接口。 目前没有其它场景需要使用。暂时放这里 + * * @param url 请求 url * @param req 对应请求的请求参数 * @param respClass 对应请求的响应 class * @param 每个请求的请求结构 Req DTO * @param 每个请求的响应结构 Resp DTO */ + // TODO @jason:可以改成 request,发起请求哈; private Resp sendExpressQueryReq(String url, Req req, Class respClass) { // 请求头 HttpHeaders headers = new HttpHeaders(); @@ -78,19 +84,20 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider { // 生成签名 String param = JsonUtils.toJsonString(req); String sign = generateReqSign(param, config.getKey(), config.getCustomer()); - log.debug("快递 100 快递 接口生成签名的: {}", sign); // 请求体 MultiValueMap requestBody = new LinkedMultiValueMap<>(); requestBody.add("customer", config.getCustomer()); requestBody.add("sign", sign); requestBody.add("param", param); - log.debug("快递 100 接口的请求参数: {}", requestBody); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + log.debug("[sendExpressQueryReq][快递 100 接口的请求参数: {}]", requestBody); // 发送请求 + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + // TODO @jason:可以使用 restTemplate 的 post 方法哇? ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - log.debug("快递 100 接口响应结果 {}", responseEntity); + log.debug("[sendExpressQueryReq][快递 100 接口响应结果 {}]", responseEntity); + // 处理响应 + // TODO @jason:if return 原则;if (!responseEntity.getStatusCode().is2xxSuccessful()) 抛出异常;接着处理成功的 if (responseEntity.getStatusCode().is2xxSuccessful()) { String response = responseEntity.getBody(); return JsonUtils.parseObject(response, respClass); @@ -101,7 +108,8 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider { private String generateReqSign(String param, String key, String customer) { String plainText = String.format("%s%s%s", param, key, customer); - log.debug("快递 100 接口待签名的数据 {}", plainText); + // TODO @jason:DigestUtil.md5Hex(plainText); return HexUtil.encodeHexStr(DigestUtil.md5(plainText), false); } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java index b911892cde..4ca5f61425 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java @@ -32,21 +32,27 @@ import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.Expr */ @Slf4j public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { + private static final String REAL_TIME_QUERY_URL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; + /** * 快递鸟即时查询免费版 RequestType */ private static final String REAL_TIME_FREE_REQ_TYPE = "1002"; + private final RestTemplate restTemplate; private final TradeExpressQueryProperties.KdNiaoConfig config; + // TODO @jason:可以改成 lombok 哈 public KdNiaoExpressQueryProvider(RestTemplate restTemplate, TradeExpressQueryProperties.KdNiaoConfig config) { this.restTemplate = restTemplate; this.config = config; } /** - * 快递鸟即时查询免费版本 参见 快递鸟接口文档 + * 快递鸟即时查询免费版本 + * + * @see 快递鸟接口文档 * @param reqDTO 查询请求参数 */ @Override @@ -56,7 +62,7 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { kdNiaoReqData.setExpressCompanyCode(reqDTO.getExpressCompanyCode().toUpperCase()); KdNiaoExpressQueryRespDTO respDTO = sendKdNiaoApiRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE, kdNiaoReqData, KdNiaoExpressQueryRespDTO.class); - log.debug("快递鸟即时查询接口返回 {}", respDTO); + log.debug("[realTimeQueryExpress][快递鸟即时查询接口返回 {}]", respDTO); if(!respDTO.getSuccess()){ throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getReason()); }else{ @@ -85,16 +91,16 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { // 请求体 String reqData = JsonUtils.toJsonString(req); String dataSign = generateDataSign(reqData, config.getApiKey()); - log.trace("得到快递鸟接口 RequestType : {} 的 签名: {}", requestType, dataSign); MultiValueMap requestBody = new LinkedMultiValueMap<>(); requestBody.add("RequestData", reqData); requestBody.add("DataType", "2"); requestBody.add("EBusinessID", config.getBusinessId()); requestBody.add("DataSign", dataSign); requestBody.add("RequestType", requestType); - log.debug("快递鸟接口 RequestType : {}, 的请求参数 {}", requestType, requestBody); - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + log.debug("[sendKdNiaoApiRequest][快递鸟接口 RequestType : {}, 的请求参数 {}]", requestType, requestBody); + // 发送请求 + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); log.debug("快递鸟接口 RequestType : {}, 的响应结果 {}", requestType, responseEntity); // 处理响应 @@ -113,7 +119,7 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { */ private String generateDataSign(String reqData, String apiKey) { String plainText = String.format("%s%s", reqData, apiKey); - log.trace("签名前的数据 {}", plainText); return URLEncodeUtil.encode(Base64.encode(DigestUtil.md5Hex(plainText))); } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java index cdde6c683d..8f6615678b 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java @@ -17,11 +17,12 @@ import javax.annotation.Resource; import static org.junit.jupiter.api.Assertions.assertThrows; +// TODO @芋艿:单测最后 review /** * @author jason */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = KdNiaoExpressQueryProviderTest.Application.class) -@ActiveProfiles("trade-delivery-query") // 设置使用 trade-delivery-query 配置文件 +@ActiveProfiles("trade-delivery-query") // 设置使用 trade-delivery-query 配置文件 TODO @jason:可以直接写到 application-unit-test.yaml 配置文件里 public class KdNiaoExpressQueryProviderTest { @Resource private RestTemplateBuilder builder; @@ -51,4 +52,4 @@ public class KdNiaoExpressQueryProviderTest { @EnableConfigurationProperties(TradeExpressQueryProperties.class) public static class Application { } -} \ No newline at end of file +}