Commit 1662d17fc97c824e5373c28809e5f6b075538ec5
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
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
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
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