Commit 1662d17fc97c824e5373c28809e5f6b075538ec5

Authored by jason
1 parent e69e6d88

快递客户端 review 修改

Showing 26 changed files with 315 additions and 323 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
... ... @@ -51,9 +51,10 @@ public interface ErrorCodeConstants {
51 51 ErrorCode EXPRESS_CODE_DUPLICATE = new ErrorCode(1011003001, "已经存在该编码的快递公司");
52 52 ErrorCode EXPRESS_TEMPLATE_NOT_EXISTS = new ErrorCode(1011003002, "运费模板不存在");
53 53 ErrorCode EXPRESS_TEMPLATE_NAME_DUPLICATE = new ErrorCode(1011003003, "已经存在该运费模板名");
54   - ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1011003006, "快递查询接口异常");
55   - ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003007, "快递查询返回失败, 原因:{}");
56   - ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003008, "自提门店不存在");
  54 + ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1011003004, "快递查询接口异常");
  55 + ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003005, "快递查询返回失败, 原因:{}");
  56 + ErrorCode EXPRESS_CLIENT_NOT_PROVIDE = new ErrorCode(1011003006, "需要接入快递服务商,比如【快递100】");
  57 + ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003007, "自提门店不存在");
57 58  
58 59 // ========== Price 相关 1011004000 ============
59 60 ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1011004000, "支付价格计算异常,原因:价格小于等于 0");
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/ExpressClientConfig.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.config;
  2 +
  3 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.ExpressClientFactoryImpl;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +import org.springframework.web.client.RestTemplate;
  9 +
  10 +/**
  11 + * 快递客户端端配置类, 提供快递客户端工厂,默认的快递客户端实现
  12 + *
  13 + * @author jason
  14 + */
  15 +@Configuration(
  16 + proxyBeanMethods = false
  17 +)
  18 +public class ExpressClientConfig {
  19 +
  20 + @Bean
  21 + public ExpressClientFactory expressClientFactory(TradeExpressProperties tradeExpressProperties,
  22 + RestTemplate restTemplate) {
  23 + return new ExpressClientFactoryImpl(tradeExpressProperties, restTemplate);
  24 + }
  25 +
  26 + @Bean
  27 + public ExpressClient defaultExpressClient(ExpressClientFactory expressClientFactory) {
  28 + return expressClientFactory.getDefaultExpressClient();
  29 + }
  30 +
  31 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressProperties.java
1 1 package cn.iocoder.yudao.module.trade.framework.delivery.config;
2 2  
3   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderEnum;
  3 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientEnum;
4 4 import lombok.Data;
5 5 import org.springframework.boot.context.properties.ConfigurationProperties;
6 6 import org.springframework.stereotype.Component;
... ... @@ -9,27 +9,24 @@ import org.springframework.validation.annotation.Validated;
9 9 import javax.validation.Valid;
10 10 import javax.validation.constraints.NotEmpty;
11 11  
12   -// TODO @jason:TradeExpressProperties;更通用哈
13 12 // TODO @芋艿:未来要不要放数据库中?考虑 saas 多租户时,不同租户使用不同的配置?
14 13 /**
15   - * 交易快递查询的配置项
  14 + * 交易运费快递的配置项
16 15 *
17 16 * @author jason
18 17 */
19 18 @Component
20   -@ConfigurationProperties(prefix = "yudao.trade.express.query")
  19 +@ConfigurationProperties(prefix = "yudao.trade.express")
21 20 @Data
22 21 @Validated
23   -public class TradeExpressQueryProperties {
  22 +public class TradeExpressProperties {
24 23  
25 24 /**
26   - * 快递查询服务商
  25 + * 快递客户端
27 26 *
28   - * 如果未配置,默认使用快递鸟
  27 + * 默认不提供,需要提醒用户配置一个快递服务商。
29 28 */
30   - // TODO @jason:可以把 expressQueryProvider 改成 client 变量,更简洁一点;
31   - private ExpressQueryProviderEnum expressQueryProvider; // TODO @jaosn:默认值可以通过属性直接赋值哈;
32   - // TODO @jason:需要考虑下,用户只配置了其中一个;
  29 + private ExpressClientEnum client = ExpressClientEnum.NOT_PROVIDE;
33 30 /**
34 31 * 快递鸟配置
35 32 */
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryClient.java deleted
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core;
2   -
3   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
5   -
6   -import java.util.List;
7   -
8   -// TODO @jason:可以改成 ExpressClient,未来可能还对接别的接口噢
9   -/**
10   - * 快递查询客户端
11   - *
12   - * @author jason
13   - */
14   -public interface ExpressQueryClient {
15   -
16   - /**
17   - * 快递实时查询
18   - *
19   - * @param reqDTO 查询请求参数
20   - */
21   - // TODO @jason:可以改成 getExpressTrackList。返回字段可以参考 https://doc.youzanyun.com/detail/API/0/5 响应的 data
22   - List<ExpressQueryRespDTO> realTimeQuery(ExpressQueryReqDTO reqDTO);
23   -
24   -}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderFactory.java deleted
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core;
2   -
3   -/**
4   - * 快递服务商工厂,用于创建和缓存快递服务商服务
5   - *
6   - * @author jason
7   - */
8   -public interface ExpressQueryProviderFactory {
9   -
10   - /**
11   - * 通过枚举获取快递查询服务商
12   - *
13   - * 如果不存在,就创建一个对应的快递查询服务商
14   - *
15   - * @param queryProviderEnum 快递服务商枚举
16   - */
17   - ExpressQueryProvider getOrCreateExpressQueryProvider(ExpressQueryProviderEnum queryProviderEnum);
18   -
19   -}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProvider.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClient.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client;
2 2  
3   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
  3 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryRespDTO;
5 5  
6 6 import java.util.List;
7 7  
8 8 /**
9   - * 快递查询服务商
  9 + * 快递客户端接口
10 10 *
11 11 * @author jason
12 12 */
13   -public interface ExpressQueryProvider {
  13 +public interface ExpressClient {
14 14  
15 15 /**
16 16 * 快递实时查询
17 17 *
18 18 * @param reqDTO 查询请求参数
19 19 */
20   - List<ExpressQueryRespDTO> realTimeQueryExpress(ExpressQueryReqDTO reqDTO);
  20 + // TODO @jason:返回字段可以参考 https://doc.youzanyun.com/detail/API/0/5 响应的 data
  21 + List<ExpressQueryRespDTO> getExpressTrackList(ExpressQueryReqDTO reqDTO);
21 22  
22 23 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/ExpressQueryProviderEnum.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClientEnum.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client;
2 2  
3 3 import lombok.Getter;
4 4  
5 5 /**
6   - * 快递查询服务商枚举
  6 + * 快递客户端枚举
7 7 *
8 8 * @author jason
9 9 */
10 10 @Getter
11   -
12   -public enum ExpressQueryProviderEnum {
13   -
  11 +public enum ExpressClientEnum {
  12 + NOT_PROVIDE("not-provide","未提供"),
14 13 KD_NIAO("kd-niao", "快递鸟"),
15 14 KD_100("kd-100", "快递100");
16 15  
... ... @@ -24,10 +23,8 @@ public enum ExpressQueryProviderEnum {
24 23 */
25 24 private final String name;
26 25  
27   - // TODO @jaosn:@AllArgsConstructor 可以替代哈
28   - ExpressQueryProviderEnum(String code, String name) {
  26 + ExpressClientEnum(String code, String name) {
29 27 this.code = code;
30 28 this.name = name;
31 29 }
32   -
33 30 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClientFactory.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client;
  2 +
  3 +/**
  4 + * 快递客户端工厂接口,快递客户端工厂:用于创建和缓存快递客户端
  5 + *
  6 + * @author jason
  7 + */
  8 +public interface ExpressClientFactory {
  9 +
  10 + /**
  11 + * 获取默认的快递客户端
  12 + */
  13 + ExpressClient getDefaultExpressClient();
  14 +
  15 + /**
  16 + * 通过枚举获取快递客户端,如果不存在,就创建一个对应快递客户端
  17 + *
  18 + * @param clientEnum 快递客户端枚举
  19 + */
  20 + ExpressClient getOrCreateExpressClient(ExpressClientEnum clientEnum);
  21 +
  22 +
  23 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.convert;
2   -
3   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
5   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryReqDTO;
6   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryRespDTO;
7   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryReqDTO;
8   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryRespDTO;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.convert;
  2 +
  3 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryRespDTO;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO;
  6 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO;
  7 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryReqDTO;
  8 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryRespDTO;
9 9 import org.mapstruct.Mapper;
10 10 import org.mapstruct.factory.Mappers;
11 11  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressQueryReqDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto;
2 2  
3 3 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
4 4 import lombok.Data;
... ... @@ -16,8 +16,7 @@ public class ExpressQueryReqDTO {
16 16 *
17 17 * 对应 {@link DeliveryExpressDO#getCode()}
18 18 */
19   - // TODO @jaosn:要不改成 expressCode;项目里使用这个哈
20   - private String expressCompanyCode;
  19 + private String expressCode;
21 20  
22 21 /**
23 22 * 发货快递单号
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/ExpressQueryRespDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressQueryRespDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto;
2 2  
3 3 import lombok.Data;
4 4  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonInclude;
4 4 import com.fasterxml.jackson.annotation.JsonProperty;
... ... @@ -13,12 +13,11 @@ import lombok.Data;
13 13 @JsonInclude(JsonInclude.Include.NON_NULL)
14 14 public class Kd100ExpressQueryReqDTO {
15 15  
16   - // TODO @jaosn:要不改成 expressCode;项目里使用这个哈
17 16 /**
18 17 * 快递公司编码
19 18 */
20 19 @JsonProperty("com")
21   - private String expressCompanyCode;
  20 + private String expressCode;
22 21  
23 22 /**
24 23 * 快递单号
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonProperty;
4 4 import lombok.Data;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonInclude;
4 4 import com.fasterxml.jackson.annotation.JsonProperty;
... ... @@ -13,12 +13,11 @@ import lombok.Data;
13 13 @JsonInclude(JsonInclude.Include.NON_NULL)
14 14 public class KdNiaoExpressQueryReqDTO {
15 15  
16   - // TODO @jaosn:要不改成 expressCode;项目里使用这个哈
17 16 /**
18 17 * 快递公司编码
19 18 */
20 19 @JsonProperty("ShipperCode")
21   - private String expressCompanyCode;
  20 + private String expressCode;
22 21 /**
23 22 * 快递单号
24 23 */
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kdniao/KdNiaoExpressQueryRespDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonProperty;
4 4 import lombok.Data;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientEnum;
  6 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  7 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
  8 +import org.springframework.web.client.RestTemplate;
  9 +
  10 +import java.util.Map;
  11 +import java.util.concurrent.ConcurrentHashMap;
  12 +
  13 +/**
  14 + * 快递客户端工厂实现类
  15 + *
  16 + * @author jason
  17 + */
  18 +public class ExpressClientFactoryImpl implements ExpressClientFactory {
  19 +
  20 + private final Map<ExpressClientEnum, ExpressClient> clientMap = new ConcurrentHashMap<>(8);
  21 +
  22 + private final TradeExpressProperties tradeExpressProperties;
  23 + private final RestTemplate restTemplate;
  24 +
  25 + public ExpressClientFactoryImpl(TradeExpressProperties tradeExpressProperties,
  26 + RestTemplate restTemplate) {
  27 + this.tradeExpressProperties = tradeExpressProperties;
  28 + this.restTemplate = restTemplate;
  29 + }
  30 +
  31 + @Override
  32 + public ExpressClient getDefaultExpressClient() {
  33 + ExpressClient defaultClient = getOrCreateExpressClient(tradeExpressProperties.getClient());
  34 + Assert.notNull("默认的快递客户端不能为空");
  35 + return defaultClient;
  36 + }
  37 +
  38 + @Override
  39 + public ExpressClient getOrCreateExpressClient(ExpressClientEnum clientEnum) {
  40 + return clientMap.computeIfAbsent(clientEnum,
  41 + client -> createExpressClient(client, tradeExpressProperties));
  42 + }
  43 +
  44 + private ExpressClient createExpressClient(ExpressClientEnum queryProviderEnum,
  45 + TradeExpressProperties tradeExpressProperties) {
  46 + switch (queryProviderEnum) {
  47 + case NOT_PROVIDE:
  48 + return new NoProvideExpressClient();
  49 + case KD_NIAO:
  50 + return new KdNiaoExpressClient(restTemplate, tradeExpressProperties.getKdNiao());
  51 + case KD_100:
  52 + return new Kd100ExpressClient(restTemplate, tradeExpressProperties.getKd100());
  53 + }
  54 + return null;
  55 + }
  56 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/Kd100ExpressClient.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.HexUtil;
5 5 import cn.hutool.crypto.digest.DigestUtil;
6 6 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
7   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
8   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProvider;
9   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
10   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
11   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryReqDTO;
12   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryRespDTO;
  7 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  8 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  9 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
  10 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryRespDTO;
  11 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO;
  12 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO;
  13 +import lombok.AllArgsConstructor;
13 14 import lombok.extern.slf4j.Slf4j;
14 15 import org.springframework.http.*;
15 16 import org.springframework.util.LinkedMultiValueMap;
... ... @@ -23,48 +24,41 @@ import java.util.Objects;
23 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
24 25 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR;
25 26 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED;
26   -import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.ExpressQueryConvert.INSTANCE;
  27 +import static cn.iocoder.yudao.module.trade.framework.delivery.core.client.convert.ExpressQueryConvert.INSTANCE;
27 28  
28   -// TODO @jason:可以参考 KdNiaoExpressQueryProvider 建议改改哈
29 29 /**
30   - * 快递 100 服务商
  30 + * 快递 100 客户端
31 31 *
32 32 * @author jason
33 33 */
34 34 @Slf4j
35   -public class Kd100ExpressQueryProvider implements ExpressQueryProvider {
  35 +@AllArgsConstructor
  36 +public class Kd100ExpressClient implements ExpressClient {
36 37  
37 38 private static final String REAL_TIME_QUERY_URL = "https://poll.kuaidi100.com/poll/query.do";
38   -
39 39 private final RestTemplate restTemplate;
40   - private final TradeExpressQueryProperties.Kd100Config config;
41   -
42   - public Kd100ExpressQueryProvider(RestTemplate restTemplate, TradeExpressQueryProperties.Kd100Config config) {
43   - this.restTemplate = restTemplate;
44   - this.config = config;
45   - }
  40 + private final TradeExpressProperties.Kd100Config config;
46 41  
47 42 @Override
48   - public List<ExpressQueryRespDTO> realTimeQueryExpress(ExpressQueryReqDTO reqDTO) {
  43 + public List<ExpressQueryRespDTO> getExpressTrackList(ExpressQueryReqDTO reqDTO) {
49 44 // 发起查询
50 45 Kd100ExpressQueryReqDTO kd100ReqParam = INSTANCE.convert2(reqDTO);
51   - kd100ReqParam.setExpressCompanyCode(kd100ReqParam.getExpressCompanyCode().toLowerCase()); // 快递公司编码需要转成小写
52   - Kd100ExpressQueryRespDTO respDTO = sendExpressQueryReq(REAL_TIME_QUERY_URL, kd100ReqParam,
  46 + kd100ReqParam.setExpressCode(kd100ReqParam.getExpressCode().toLowerCase()); // 快递公司编码需要转成小写
  47 + Kd100ExpressQueryRespDTO respDTO = requestExpressQuery(REAL_TIME_QUERY_URL, kd100ReqParam,
53 48 Kd100ExpressQueryRespDTO.class);
54   - log.debug("[realTimeQueryExpress][快递 100 接口 查询接口返回 {}]", respDTO);
  49 + log.debug("[getExpressTrackList][快递 100 接口 查询接口返回 {}]", respDTO);
55 50 // 处理结果
56 51 if (Objects.equals("false", respDTO.getResult())) {
57   - log.error("[realTimeQueryExpress][快递 100 接口 返回失败 {}]", respDTO.getMessage());
  52 + log.error("[getExpressTrackList][快递 100 接口 返回失败 {}]", respDTO.getMessage());
58 53 throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getMessage());
59   - // TODO @json:else 可以不用写哈;
  54 + }
  55 + // TODO @jason:convertList2 如果空,应该返回 list 了; @芋艿 为了避免返回 null
  56 + if (CollUtil.isNotEmpty(respDTO.getTracks())) {
  57 + return INSTANCE.convertList2(respDTO.getTracks());
60 58 } else {
61   - // TODO @jason:convertList2 如果空,应该返回 list 了;
62   - if (CollUtil.isNotEmpty(respDTO.getTracks())) {
63   - return INSTANCE.convertList2(respDTO.getTracks());
64   - } else {
65   - return Collections.emptyList();
66   - }
  59 + return Collections.emptyList();
67 60 }
  61 +
68 62 }
69 63  
70 64 /**
... ... @@ -76,8 +70,7 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider {
76 70 * @param <Req> 每个请求的请求结构 Req DTO
77 71 * @param <Resp> 每个请求的响应结构 Resp DTO
78 72 */
79   - // TODO @jason:可以改成 request,发起请求哈;
80   - private <Req, Resp> Resp sendExpressQueryReq(String url, Req req, Class<Resp> respClass) {
  73 + private <Req, Resp> Resp requestExpressQuery(String url, Req req, Class<Resp> respClass) {
81 74 // 请求头
82 75 HttpHeaders headers = new HttpHeaders();
83 76 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
... ... @@ -92,23 +85,20 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider {
92 85 log.debug("[sendExpressQueryReq][快递 100 接口的请求参数: {}]", requestBody);
93 86 // 发送请求
94 87 HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
95   - // TODO @jason:可以使用 restTemplate 的 post 方法哇?
  88 + // TODO @jason:可以使用 restTemplate 的 post 方法哇 @芋艿 为了获取接口的原始返回。用exchange 便于查问题。
96 89 ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
97 90 log.debug("[sendExpressQueryReq][快递 100 接口响应结果 {}]", responseEntity);
98 91  
99 92 // 处理响应
100   - // TODO @jason:if return 原则;if (!responseEntity.getStatusCode().is2xxSuccessful()) 抛出异常;接着处理成功的
101   - if (responseEntity.getStatusCode().is2xxSuccessful()) {
102   - String response = responseEntity.getBody();
103   - return JsonUtils.parseObject(response, respClass);
104   - } else {
  93 + if (!responseEntity.getStatusCode().is2xxSuccessful()) {
105 94 throw exception(EXPRESS_API_QUERY_ERROR);
106 95 }
  96 + return JsonUtils.parseObject(responseEntity.getBody(), respClass);
107 97 }
108 98  
109 99 private String generateReqSign(String param, String key, String customer) {
110 100 String plainText = String.format("%s%s%s", param, key, customer);
111   - // TODO @jason:DigestUtil.md5Hex(plainText);
  101 + // TODO @芋艿。 这里需要转换成大写, 没有对应方法
112 102 return HexUtil.encodeHexStr(DigestUtil.md5(plainText), false);
113 103 }
114 104  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClient.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
2 2  
3 3 import cn.hutool.core.codec.Base64;
4 4 import cn.hutool.core.collection.CollUtil;
5 5 import cn.hutool.core.net.URLEncodeUtil;
6 6 import cn.hutool.crypto.digest.DigestUtil;
7 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
9   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProvider;
10   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
11   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
12   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryReqDTO;
13   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryRespDTO;
  8 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  9 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  10 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
  11 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryRespDTO;
  12 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryReqDTO;
  13 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryRespDTO;
  14 +import lombok.AllArgsConstructor;
14 15 import lombok.extern.slf4j.Slf4j;
15 16 import org.springframework.http.*;
16 17 import org.springframework.util.LinkedMultiValueMap;
... ... @@ -23,15 +24,16 @@ import java.util.List;
23 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
24 25 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED;
25 26 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR;
26   -import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.ExpressQueryConvert.INSTANCE;
  27 +import static cn.iocoder.yudao.module.trade.framework.delivery.core.client.convert.ExpressQueryConvert.INSTANCE;
27 28  
28 29 /**
29   - * 快递鸟服务商
  30 + * 快递鸟客户端
30 31 *
31 32 * @author jason
32 33 */
33 34 @Slf4j
34   -public class KdNiaoExpressQueryProvider implements ExpressQueryProvider {
  35 +@AllArgsConstructor
  36 +public class KdNiaoExpressClient implements ExpressClient {
35 37  
36 38 private static final String REAL_TIME_QUERY_URL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
37 39  
... ... @@ -39,15 +41,8 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider {
39 41 * 快递鸟即时查询免费版 RequestType
40 42 */
41 43 private static final String REAL_TIME_FREE_REQ_TYPE = "1002";
42   -
43 44 private final RestTemplate restTemplate;
44   - private final TradeExpressQueryProperties.KdNiaoConfig config;
45   -
46   - // TODO @jason:可以改成 lombok 哈
47   - public KdNiaoExpressQueryProvider(RestTemplate restTemplate, TradeExpressQueryProperties.KdNiaoConfig config) {
48   - this.restTemplate = restTemplate;
49   - this.config = config;
50   - }
  45 + private final TradeExpressProperties.KdNiaoConfig config;
51 46  
52 47 /**
53 48 * 快递鸟即时查询免费版本
... ... @@ -56,21 +51,20 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider {
56 51 * @param reqDTO 查询请求参数
57 52 */
58 53 @Override
59   - public List<ExpressQueryRespDTO> realTimeQueryExpress(ExpressQueryReqDTO reqDTO) {
  54 + public List<ExpressQueryRespDTO> getExpressTrackList(ExpressQueryReqDTO reqDTO) {
60 55 KdNiaoExpressQueryReqDTO kdNiaoReqData = INSTANCE.convert(reqDTO);
61 56 // 快递公司编码需要转成大写
62   - kdNiaoReqData.setExpressCompanyCode(reqDTO.getExpressCompanyCode().toUpperCase());
63   - KdNiaoExpressQueryRespDTO respDTO = sendKdNiaoApiRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE,
  57 + kdNiaoReqData.setExpressCode(reqDTO.getExpressCode().toUpperCase());
  58 + KdNiaoExpressQueryRespDTO respDTO = requestKdNiaoApi(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE,
64 59 kdNiaoReqData, KdNiaoExpressQueryRespDTO.class);
65   - log.debug("[realTimeQueryExpress][快递鸟即时查询接口返回 {}]", respDTO);
66   - if(!respDTO.getSuccess()){
67   - throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getReason());
68   - }else{
69   - if (CollUtil.isNotEmpty(respDTO.getTracks())) {
70   - return INSTANCE.convertList(respDTO.getTracks());
71   - }else{
72   - return Collections.emptyList();
73   - }
  60 + log.debug("[getExpressTrackList][快递鸟即时查询接口返回 {}]", respDTO);
  61 + if (respDTO == null || !respDTO.getSuccess()) {
  62 + throw exception(EXPRESS_API_QUERY_FAILED, respDTO == null ? "" : respDTO.getReason());
  63 + }
  64 + if (CollUtil.isNotEmpty(respDTO.getTracks())) {
  65 + return INSTANCE.convertList(respDTO.getTracks());
  66 + } else {
  67 + return Collections.emptyList();
74 68 }
75 69 }
76 70  
... ... @@ -83,8 +77,8 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider {
83 77 * @param <Req> 每个请求的请求结构 Req DTO
84 78 * @param <Resp> 每个请求的响应结构 Resp DTO
85 79 */
86   - private <Req, Resp> Resp sendKdNiaoApiRequest(String url, String requestType, Req req,
87   - Class<Resp> respClass){
  80 + private <Req, Resp> Resp requestKdNiaoApi(String url, String requestType, Req req,
  81 + Class<Resp> respClass){
88 82 // 请求头
89 83 HttpHeaders headers = new HttpHeaders();
90 84 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
... ... @@ -97,19 +91,16 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider {
97 91 requestBody.add("EBusinessID", config.getBusinessId());
98 92 requestBody.add("DataSign", dataSign);
99 93 requestBody.add("RequestType", requestType);
100   - log.debug("[sendKdNiaoApiRequest][快递鸟接口 RequestType : {}, 的请求参数 {}]", requestType, requestBody);
101   -
  94 + log.debug("[requestKdNiaoApi][快递鸟接口 RequestType : {}, 的请求参数 {}]", requestType, requestBody);
102 95 // 发送请求
103 96 HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
104 97 ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
105 98 log.debug("快递鸟接口 RequestType : {}, 的响应结果 {}", requestType, responseEntity);
106 99 // 处理响应
107   - if (responseEntity.getStatusCode().is2xxSuccessful()) {
108   - String response = responseEntity.getBody();
109   - return JsonUtils.parseObject(response, respClass);
110   - } else {
  100 + if (!responseEntity.getStatusCode().is2xxSuccessful()) {
111 101 throw exception(EXPRESS_API_QUERY_ERROR);
112 102 }
  103 + return JsonUtils.parseObject(responseEntity.getBody(), respClass);
113 104 }
114 105  
115 106 /**
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
  2 +
  3 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryRespDTO;
  6 +
  7 +import java.util.List;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  10 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_CLIENT_NOT_PROVIDE;
  11 +
  12 +/**
  13 + * 未实现的快递客户端,用来提醒用户需要接入快递服务商,
  14 + *
  15 + * @author jason
  16 + */
  17 +public class NoProvideExpressClient implements ExpressClient {
  18 + @Override
  19 + public List<ExpressQueryRespDTO> getExpressTrackList(ExpressQueryReqDTO reqDTO) {
  20 + throw exception(EXPRESS_CLIENT_NOT_PROVIDE);
  21 + }
  22 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryClientImpl.java deleted
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
2   -
3   -import cn.hutool.core.lang.Assert;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
5   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryClient;
6   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProvider;
7   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderEnum;
8   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderFactory;
9   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
10   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO;
11   -import lombok.extern.slf4j.Slf4j;
12   -import org.springframework.stereotype.Component;
13   -
14   -import javax.annotation.PostConstruct;
15   -import javax.annotation.Resource;
16   -import java.util.List;
17   -
18   -import static cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderEnum.KD_NIAO;
19   -
20   -// TODO @jason:可以把整体包结构调整下;参考 sms client 的方式;
21   -// + config
22   -// + core
23   -// client
24   -// + dto
25   -// + impl:里面可以放 kdniaoclient、kd100client
26   -// ExpressClient
27   -// ExpressClientFactory: 通过它直接获取默认和创建默认的 Client
28   -// enums
29   -/**
30   - * 快递查询客户端实现
31   - *
32   - * @author jason
33   - */
34   -@Component
35   -@Slf4j
36   -public class ExpressQueryClientImpl implements ExpressQueryClient {
37   -
38   - @Resource
39   - private ExpressQueryProviderFactory expressQueryProviderFactory;
40   - @Resource
41   - private TradeExpressQueryProperties tradeExpressQueryProperties;
42   -
43   - private ExpressQueryProvider expressQueryProvider;
44   -
45   - @PostConstruct
46   - private void init() {
47   - // 如果未设置,默认使用快递鸟
48   - ExpressQueryProviderEnum queryProvider = tradeExpressQueryProperties.getExpressQueryProvider();
49   - if (queryProvider == null) {
50   - queryProvider = KD_NIAO;
51   - }
52   - // 创建客户端
53   - expressQueryProvider = expressQueryProviderFactory.getOrCreateExpressQueryProvider(queryProvider);
54   - if (expressQueryProvider == null) {
55   - log.error("获取创建快递查询服务商{}失败,请检查相关配置", queryProvider);
56   - }
57   - Assert.notNull(expressQueryProvider, "快递查询服务商不能为空");
58   - }
59   -
60   - @Override
61   - public List<ExpressQueryRespDTO> realTimeQuery(ExpressQueryReqDTO reqDTO) {
62   - return expressQueryProvider.realTimeQueryExpress(reqDTO);
63   - }
64   -
65   -}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/ExpressQueryProviderFactoryImpl.java deleted
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
2   -
3   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProvider;
5   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderEnum;
6   -import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProviderFactory;
7   -import org.springframework.stereotype.Component;
8   -import org.springframework.web.client.RestTemplate;
9   -
10   -import javax.annotation.Resource;
11   -import java.util.Map;
12   -import java.util.concurrent.ConcurrentHashMap;
13   -
14   -/**
15   - * // TODO @jason:注释不全
16   - * @author jason
17   - */
18   -@Component
19   -public class ExpressQueryProviderFactoryImpl implements ExpressQueryProviderFactory {
20   -
21   - private final Map<ExpressQueryProviderEnum, ExpressQueryProvider> providerMap = new ConcurrentHashMap<>(8);
22   -
23   - @Resource
24   - private TradeExpressQueryProperties tradeExpressQueryProperties;
25   - @Resource
26   - private RestTemplate restTemplate;
27   -
28   - @Override
29   - public ExpressQueryProvider getOrCreateExpressQueryProvider(ExpressQueryProviderEnum queryProviderEnum) {
30   - return providerMap.computeIfAbsent(queryProviderEnum,
31   - provider -> createExpressQueryProvider(provider, tradeExpressQueryProperties));
32   - }
33   -
34   - private ExpressQueryProvider createExpressQueryProvider(ExpressQueryProviderEnum queryProviderEnum,
35   - TradeExpressQueryProperties tradeExpressQueryProperties) {
36   - // TODO @jason:是不是直接 return 就好啦,更简洁一点
37   - ExpressQueryProvider result = null;
38   - switch (queryProviderEnum) {
39   - case KD_NIAO:
40   - result = new KdNiaoExpressQueryProvider(restTemplate, tradeExpressQueryProperties.getKdNiao());
41   - break;
42   - case KD_100:
43   - result = new Kd100ExpressQueryProvider(restTemplate, tradeExpressQueryProperties.getKd100());
44   - break;
45   - }
46   - return result;
47   - }
48   -}
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProviderTest.java renamed to yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientTest.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
2 2  
3 3 import cn.iocoder.yudao.framework.common.exception.ServiceException;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
5   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
6 6 import org.junit.jupiter.api.BeforeEach;
7 7 import org.junit.jupiter.api.Disabled;
8 8 import org.junit.jupiter.api.Test;
... ... @@ -21,36 +21,36 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
21 21 /**
22 22 * @author jason
23 23 */
24   -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = Kd100ExpressQueryProviderTest.Application.class)
25   -@ActiveProfiles("trade-delivery-query") // 设置使用 trade-delivery-query 配置文件
26   -public class Kd100ExpressQueryProviderTest {
  24 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = Kd100ExpressClientTest.Application.class)
  25 +@ActiveProfiles("unit-test") // 设置使用 trade-delivery-query 配置文件
  26 +public class Kd100ExpressClientTest {
27 27 @Resource
28 28 private RestTemplateBuilder builder;
29 29 @Resource
30   - private TradeExpressQueryProperties expressQueryProperties;
  30 + private TradeExpressProperties expressQueryProperties;
31 31  
32   - private Kd100ExpressQueryProvider kd100ExpressQueryProvider;
  32 + private Kd100ExpressClient kd100ExpressClient;
33 33  
34 34 @BeforeEach
35 35 public void init(){
36   - kd100ExpressQueryProvider = new Kd100ExpressQueryProvider(builder.build(),expressQueryProperties.getKd100());
  36 + kd100ExpressClient = new Kd100ExpressClient(builder.build(),expressQueryProperties.getKd100());
37 37 }
38 38 @Test
39 39 @Disabled("需要 授权 key. 暂时忽略")
40 40 void testRealTimeQueryExpressFailed() {
41 41 ServiceException t = assertThrows(ServiceException.class, () -> {
42 42 ExpressQueryReqDTO reqDTO = new ExpressQueryReqDTO();
43   - reqDTO.setExpressCompanyCode("yto");
  43 + reqDTO.setExpressCode("yto");
44 44 reqDTO.setLogisticsNo("YT9383342193097");
45   - kd100ExpressQueryProvider.realTimeQueryExpress(reqDTO);
  45 + kd100ExpressClient.getExpressTrackList(reqDTO);
46 46 });
47   - assertEquals(1011003007, t.getCode());
  47 + assertEquals(1011003005, t.getCode());
48 48 }
49 49  
50 50 @Import({
51 51 RestTemplateAutoConfiguration.class
52 52 })
53   - @EnableConfigurationProperties(TradeExpressQueryProperties.class)
  53 + @EnableConfigurationProperties(TradeExpressProperties.class)
54 54 public static class Application {
55 55 }
56 56 }
57 57 \ No newline at end of file
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java renamed to yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientTest.java
1   -package cn.iocoder.yudao.module.trade.framework.delivery.core.impl;
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
2 2  
3 3 import cn.iocoder.yudao.framework.common.exception.ServiceException;
4   -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties;
5   -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressQueryReqDTO;
6 6 import org.junit.jupiter.api.BeforeEach;
7 7 import org.junit.jupiter.api.Disabled;
8 8 import org.junit.jupiter.api.Test;
... ... @@ -21,35 +21,35 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
21 21 /**
22 22 * @author jason
23 23 */
24   -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = KdNiaoExpressQueryProviderTest.Application.class)
25   -@ActiveProfiles("trade-delivery-query") // 设置使用 trade-delivery-query 配置文件 TODO @jason:可以直接写到 application-unit-test.yaml 配置文件里
26   -public class KdNiaoExpressQueryProviderTest {
  24 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = KdNiaoExpressClientTest.Application.class)
  25 +@ActiveProfiles("unit-test")
  26 +public class KdNiaoExpressClientTest {
27 27 @Resource
28 28 private RestTemplateBuilder builder;
29 29 @Resource
30   - private TradeExpressQueryProperties expressQueryProperties;
  30 + private TradeExpressProperties expressQueryProperties;
31 31  
32   - private KdNiaoExpressQueryProvider kdNiaoExpressQueryProvider;
  32 + private KdNiaoExpressClient kdNiaoExpressClient;
33 33  
34 34 @BeforeEach
35 35 public void init(){
36   - kdNiaoExpressQueryProvider = new KdNiaoExpressQueryProvider(builder.build(),expressQueryProperties.getKdNiao());
  36 + kdNiaoExpressClient = new KdNiaoExpressClient(builder.build(),expressQueryProperties.getKdNiao());
37 37 }
38 38 @Test
39 39 @Disabled("需要 授权 key. 暂时忽略")
40 40 void testRealTimeQueryExpressFailed() {
41 41 assertThrows(ServiceException.class,() ->{
42 42 ExpressQueryReqDTO reqDTO = new ExpressQueryReqDTO();
43   - reqDTO.setExpressCompanyCode("yy");
  43 + reqDTO.setExpressCode("yy");
44 44 reqDTO.setLogisticsNo("YT9383342193097");
45   - kdNiaoExpressQueryProvider.realTimeQueryExpress(reqDTO);
  45 + kdNiaoExpressClient.getExpressTrackList(reqDTO);
46 46 });
47 47 }
48 48  
49 49 @Import({
50 50 RestTemplateAutoConfiguration.class
51 51 })
52   - @EnableConfigurationProperties(TradeExpressQueryProperties.class)
  52 + @EnableConfigurationProperties(TradeExpressProperties.class)
53 53 public static class Application {
54 54 }
55 55 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/NoProvideExpressClientTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ServiceException;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.ExpressClientConfig;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  6 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClient;
  7 +import org.junit.jupiter.api.Test;
  8 +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
  9 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  10 +import org.springframework.boot.test.context.SpringBootTest;
  11 +import org.springframework.boot.web.client.RestTemplateBuilder;
  12 +import org.springframework.context.annotation.Bean;
  13 +import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.ActiveProfiles;
  15 +import org.springframework.web.client.RestTemplate;
  16 +
  17 +import javax.annotation.Resource;
  18 +
  19 +import static org.junit.jupiter.api.Assertions.assertEquals;
  20 +import static org.junit.jupiter.api.Assertions.assertThrows;
  21 +
  22 +/**
  23 + * @author jason
  24 + */
  25 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = NoProvideExpressClientTest.Application.class)
  26 +@ActiveProfiles("unit-test") // 设置使用 trade-delivery-query 配置文件
  27 +@Import({ExpressClientConfig.class})
  28 +public class NoProvideExpressClientTest {
  29 +
  30 + @Resource
  31 + private ExpressClient expressClient;
  32 +
  33 + @Test
  34 + void getExpressTrackList() {
  35 + ServiceException t = assertThrows(ServiceException.class, () -> {
  36 + expressClient.getExpressTrackList(null);
  37 + });
  38 + assertEquals(1011003006, t.getCode());
  39 + }
  40 +
  41 + @Import({
  42 + RestTemplateAutoConfiguration.class,
  43 + })
  44 + @EnableConfigurationProperties(TradeExpressProperties.class)
  45 + public static class Application {
  46 +
  47 + @Bean
  48 + private RestTemplate restTemplate(RestTemplateBuilder builder) {
  49 + return builder.build();
  50 + }
  51 + }
  52 +}
0 53 \ No newline at end of file
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-trade-delivery-query.yaml deleted
1   -spring:
2   - main:
3   - lazy-initialization: true # 开启懒加载,加快速度
4   - banner-mode: off # 单元测试,禁用 Banner
5   -
6   ---- #################### 交易快递查询相关配置 ####################
7   -
8   -yudao:
9   - trade:
10   - express:
11   - query:
12   - express-query-provider: kd_niao
13   - kd-niao:
14   - api-key: xxx
15   - business-id: xxxxxxxx
16   - kd100:
17   - customer: xxxx
18   - key: xxxxx
yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-unit-test.yaml
... ... @@ -51,3 +51,11 @@ yudao:
51 51 order:
52 52 app-id: 1
53 53 merchant-order-id: 1
  54 + express:
  55 + kd-niao:
  56 + api-key: xxxx
  57 + business-id: xxxxx
  58 + kd100:
  59 + customer: xxxxx
  60 + key: xxxxx
  61 + client: not_provide
54 62 \ No newline at end of file
... ...