Browse Source

Merge branch 'dev/2024/0506/update-admin-Y' of feifan/mall-backend-admin into master

添加订单的订阅和推送
Yangzw 10 months ago
parent
commit
c03e7a402b
12 changed files with 131 additions and 67 deletions
  1. 30 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderStateEnum.java
  2. 4 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderSubscribeStatusEnum.java
  3. 28 4
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  4. 10 32
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  5. 6 28
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java
  6. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressService.java
  7. 5 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressServiceImpl.java
  8. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  9. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  10. 9 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  11. 28 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  12. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml

+ 30 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderStateEnum.java

@@ -0,0 +1,30 @@
+package cn.newfeifan.mall.module.trade.enums.order;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 交易订单状态枚举
+ */
+@RequiredArgsConstructor
+@Getter
+public enum TradeOrderStateEnum {
+    ON_THE_WAY("0","在途"),
+    COLLECT("1","揽收"),
+    ABNORMAL("2","疑难"),
+    RECEIVED("3","已签收"),
+    CANCEL_A_VISA("4","退签"),
+    DELIVERY("5","派件"),
+    SEND_BACK("6","退回"),
+    TRANSFER_TO("7","转投"),
+    REFUSE_TO_SIGN("14","拒签");
+
+    /**
+     * 状态值
+     */
+    private final String state;
+    /**
+     * 状态名
+     */
+    private final String name;
+}

+ 4 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderSubscribeStatusEnum.java

@@ -3,6 +3,10 @@ package cn.newfeifan.mall.module.trade.enums.order;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
+/**
+ * 订单订阅状态
+ *
+ */
 @RequiredArgsConstructor
 @Getter
 public enum TradeOrderSubscribeStatusEnum {

+ 28 - 4
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -22,6 +22,7 @@ import cn.newfeifan.mall.module.trade.convert.order.TradeOrderConvert;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderItemDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderLogDO;
+import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStateEnum;
 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum;
 import cn.newfeifan.mall.module.trade.mq.producer.order.DistriOrderProducer;
 import cn.newfeifan.mall.module.trade.service.aftersale.AfterSaleService;
@@ -29,6 +30,7 @@ import cn.newfeifan.mall.module.trade.service.order.TradeOrderLogService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
 import com.google.common.collect.Maps;
+import com.google.gson.Gson;
 import com.kuaidi100.sdk.response.SubscribeResp;
 import com.kuaidi100.sdk.utils.SignUtils;
 import io.swagger.v3.oas.annotations.Operation;
@@ -42,12 +44,15 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 @Tag(name = "管理后台 - 交易订单")
 @RestController
@@ -148,25 +153,44 @@ public class TradeOrderController {
         tradeOrderUpdateService.deliveryOrder(deliveryReqVO);
         return success(true);
     }
+
     @PostMapping("/callBackUrl")
     @Operation(summary = "订单订阅回调")
-    public SubscribeResp callBackUrl(HttpServletRequest request){
+    public SubscribeResp callBackUrl(HttpServletRequest request) {
         String param = request.getParameter("param");
         String sign = request.getParameter("sign");
         String orderId = request.getParameter("orderId");
 
+        Gson gson = new Gson();
+        Map<String, Object> map = gson.fromJson(param, Map.class);
+        Map<String, Object> lastResult = (Map<String, Object>) map.get("lastResult");
+        String state = (String) lastResult.get("state");
+
+        //判断订单状态是否是已签收
+        if (state.equals(TradeOrderStateEnum.RECEIVED.getState())) {
+            TradeOrderDO order = tradeOrderQueryService.getOrderById(Long.valueOf(orderId));
+            if (order != null) {
+                List<Map<String, Object>> dataList = (List<Map<String, Object>>) lastResult.get("data");
+                Map<String, Object> firstData = dataList.get(0);
+                //保存签收时间
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
+                order.setReceivingTime(LocalDateTime.parse(firstData.get("time").toString(), formatter));
+                tradeOrderUpdateService.updateOrderById(order);
+            }
+        }
+
         //建议记录一下这个回调的内容,方便出问题后双方排查问题
-        log.debug("快递100订阅推送回调结果|{}|{}",param,sign);
+        log.debug("快递100订阅推送回调结果|{}|{}", param, sign);
         //订阅时传的salt,没有可以忽略
         String salt = "";
         String ourSign = SignUtils.sign(param + salt);
-        log.info("订单:{},回调param:{}",orderId,param);
+        log.info("订单:{},回调param:{}", orderId, param);
         SubscribeResp subscribeResp = new SubscribeResp();
         subscribeResp.setResult(Boolean.TRUE);
         subscribeResp.setReturnCode("200");
         subscribeResp.setMessage("成功");
         //加密如果相等,属于快递100推送;否则可以忽略掉当前请求
-        if (ourSign.equals(sign)){
+        if (ourSign.equals(sign)) {
             //TODO 业务处理
             return subscribeResp;
         }

+ 10 - 32
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java

@@ -33,19 +33,16 @@ public class TradeOrderItemDO extends BaseDO {
     private Long id;
     /**
      * 用户编号
-     *
      * 关联 MemberUserDO 的 id 编号
      */
     private Long userId;
     /**
      * 订单编号
-     *
      * 关联 {@link TradeOrderDO#getId()}
      */
     private Long orderId;
     /**
      * 购物车项编号
-     *
      * 关联 {@link CartDO#getId()}
      */
     private Long cartId;
@@ -53,25 +50,21 @@ public class TradeOrderItemDO extends BaseDO {
     // ========== 商品基本信息; 冗余较多字段,减少关联查询 ==========
     /**
      * 商品 SPU 编号
-     *
      * 关联 ProductSkuDO 的 spuId 编号
      */
     private Long spuId;
     /**
      * 商品 SPU 名称
-     *
      * 冗余 ProductSkuDO 的 spuName 编号
      */
     private String spuName;
     /**
      * 商品 SKU 编号
-     *
      * 关联 ProductSkuDO 的 id 编号
      */
     private Long skuId;
     /**
      * 属性数组,JSON 格式
-     *
      * 冗余 ProductSkuDO 的 properties 字段
      */
     @TableField(typeHandler = PropertyTypeHandler.class)
@@ -86,7 +79,6 @@ public class TradeOrderItemDO extends BaseDO {
     private Integer count;
     /**
      * 是否评价
-     *
      * true - 已评价
      * false - 未评价
      */
@@ -96,14 +88,12 @@ public class TradeOrderItemDO extends BaseDO {
 
     /**
      * 商品原价(单),单位:分
-     *
      * 对应 ProductSkuDO 的 price 字段
      * 对应 taobao 的 order.price 字段
      */
     private Integer price;
     /**
      * 优惠金额(总),单位:分
-     *
      * 对应 taobao 的 order.discount_fee 字段
      */
     private Integer discountPrice;
@@ -113,13 +103,11 @@ public class TradeOrderItemDO extends BaseDO {
     private Integer deliveryPrice;
     /**
      * 订单调价(总),单位:分
-     *
      * 正数,加价;负数,减价
      */
     private Integer adjustPrice;
     /**
      * 应付金额(总),单位:分
-     *
      * = {@link #price} * {@link #count}
      * - {@link #couponPrice}
      * - {@link #pointPrice}
@@ -134,25 +122,18 @@ public class TradeOrderItemDO extends BaseDO {
 
     /**
      * 优惠劵减免金额,单位:分
-     *
      * 对应 taobao 的 trade.coupon_fee 字段
      */
     private Integer couponPrice;
-    /**
-     * 积分抵扣的金额,单位:分
-     *
+    /*** 积分抵扣的金额,单位:分
      * 对应 taobao 的 trade.point_fee 字段
      */
     private Integer pointPrice;
-    /**
-     * 使用的积分
-     *
+    /*** 使用的积分
      * 目的:用于后续取消或者售后订单时,需要归还赠送
      */
     private Integer usePoint;
-    /**
-     * 赠送的积分
-     *
+    /*** 赠送的积分
      * 目的:用于后续取消或者售后订单时,需要扣减赠送
      */
     private Integer givePoint;
@@ -163,19 +144,20 @@ public class TradeOrderItemDO extends BaseDO {
 
     // ========== 售后基本信息 ==========
 
-    /**
-     * 售后单编号
-     *
+    /*** 售后单编号
      * 关联 {@link AfterSaleDO#getId()} 字段
      */
     private Long afterSaleId;
-    /**
-     * 售后状态
-     *
+    /*** 售后状态
      * 枚举 {@link TradeOrderItemAfterSaleStatusEnum}
      */
     private Integer afterSaleStatus;
 
+    /**
+     * 是否分配积分、身价权益,已分配是1,未分配为0
+     */
+    private Boolean distributeBenefit;
+
     /**
      * 商品属性
      */
@@ -184,26 +166,22 @@ public class TradeOrderItemDO extends BaseDO {
 
         /**
          * 属性编号
-         *
          * 关联 ProductPropertyDO 的 id 编号
          */
         private Long propertyId;
         /**
          * 属性名字
-         *
          * 关联 ProductPropertyDO 的 name 字段
          */
         private String propertyName;
 
         /**
          * 属性值编号
-         *
          * 关联 ProductPropertyValueDO 的 id 编号
          */
         private Long valueId;
         /**
          * 属性值名字
-         *
          * 关联 ProductPropertyValueDO 的 name 字段
          */
         private String valueName;

+ 6 - 28
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java

@@ -4,17 +4,14 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.HexUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
-import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
-import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
-import cn.newfeifan.mall.module.trade.dal.mysql.delivery.DeliveryExpressMapper;
-import cn.newfeifan.mall.module.trade.dal.mysql.order.TradeOrderMapper;
+import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStateEnum;
 import cn.newfeifan.mall.module.trade.framework.delivery.config.TradeExpressProperties;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.ExpressClient;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.*;
@@ -23,7 +20,6 @@ import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
-import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -53,10 +49,7 @@ public class Kd100ExpressClient implements ExpressClient {
     }
 
     @Resource
-    private TradeOrderMapper tradeOrderMapper;
-
-    @Resource
-    private DeliveryExpressMapper deliveryExpressMapper;
+    private TradeOrderUpdateService tradeOrderUpdateService;
 
     /**
      * 查询快递轨迹
@@ -83,28 +76,13 @@ public class Kd100ExpressClient implements ExpressClient {
         }
         List<ExpressTrackRespDTO> expressTrackRespDTOS = INSTANCE.convertList2(respDTO.getTracks());
 
-        if(respDTO.getState().equals("3")){
-            updateOrder(respDTO.getExpressCompanyCode(),respDTO.getLogisticsNo(),expressTrackRespDTOS.get(0).getTime());
+        //如果状态为已签收("3"),则保存到订单信息中
+        if(respDTO.getState().equals(TradeOrderStateEnum.RECEIVED.getState())){
+            tradeOrderUpdateService.updateOrder(respDTO.getExpressCompanyCode(),respDTO.getLogisticsNo(),expressTrackRespDTOS.get(0).getTime());
         }
         return expressTrackRespDTOS;
     }
 
-    /**
-     * 保存订单的签收时间
-     * @param com 快递公司编码
-     * @param nu 单号
-     */
-    private void updateOrder(String com, String nu, LocalDateTime time){
-        DeliveryExpressDO deliveryExpressDO = deliveryExpressMapper.selectByCode(com);
-        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
-                .eq(TradeOrderDO::getLogisticsNo, nu)
-                .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
-        );
-        tradeOrderDO.setReceivingTime(time);
-
-        tradeOrderMapper.updateById(tradeOrderDO);
-    }
-
     /**
      * 快递 100 API 请求
      *

+ 1 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressService.java

@@ -79,4 +79,5 @@ public interface DeliveryExpressService {
      */
     List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status);
 
+    DeliveryExpressDO selectByCode(String code);
 }

+ 5 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressServiceImpl.java

@@ -111,4 +111,9 @@ public class DeliveryExpressServiceImpl implements DeliveryExpressService {
         return deliveryExpressMapper.selectListByStatus(status);
     }
 
+    @Override
+    public DeliveryExpressDO selectByCode(String code) {
+        return deliveryExpressMapper.selectByCode(code);
+    }
+
 }

+ 1 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java

@@ -221,5 +221,6 @@ public interface TradeOrderQueryService {
      */
     ShopBO getShop();
 
+    TradeOrderDO getOrderById(Long orderId);
 
 }

+ 8 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java

@@ -281,6 +281,14 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         return getShopBO(stringRedisTemplate, userMapper, log);
     }
 
+    @Override
+    public TradeOrderDO getOrderById(Long orderId) {
+        return tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getId,orderId)
+                .isNull(TradeOrderDO::getReceivingTime)
+        );
+    }
+
     public static ShopBO getShopBO(StringRedisTemplate stringRedisTemplate, AdminUserMapper userMapper, Logger log) {
         Long loginUserId = getLoginUserId();
         String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);

+ 9 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java

@@ -1,6 +1,5 @@
 package cn.newfeifan.mall.module.trade.service.order;
 
-import cn.newfeifan.mall.framework.common.enums.TerminalEnum;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO;
@@ -12,6 +11,7 @@ import cn.newfeifan.mall.module.trade.controller.app.order.vo.item.AppTradeOrder
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 
 /**
  * 交易订单【写】Service 接口
@@ -196,4 +196,12 @@ public interface TradeOrderUpdateService {
      */
     void cancelPaidOrder(Long userId, Long orderId);
 
+    /**
+     * 保存订单的签收时间
+     * @param com 快递公司编码
+     * @param nu 单号
+     */
+    void updateOrder(String com, String nu, LocalDateTime time);
+
+    void updateOrderById(TradeOrderDO order);
 }

+ 28 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -49,6 +49,7 @@ import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import com.kuaidi100.sdk.api.Subscribe;
@@ -82,7 +83,7 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
  * 交易订单【写】Service 实现类
  *
  * @author LeeYan9
- * @since 2022-08-26
+ * @since 2022-01-26
  */
 @Service
 @Slf4j
@@ -401,7 +402,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
         // 设置订阅参数,包括回调URL和手机号
         SubscribeParameters subscribeParameters = new SubscribeParameters();
-        subscribeParameters.setCallbackurl("https://letcgopt.newfeifan.cn/admin-api/trade/order/callBackUrl?orderId="+order.getId());
+        subscribeParameters.setCallbackurl("https://47.107.28.221:8002/admin-api/trade/order/callBackUrl?orderId="+order.getId());
         subscribeParameters.setPhone(order.getReceiverMobile());
 
         // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥
@@ -906,6 +907,31 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
     }
 
+    /**
+     * 保存订单的签收时间
+     * @param com 快递公司编码
+     * @param nu 单号
+     */
+    public void updateOrder(String com, String nu, LocalDateTime time){
+        DeliveryExpressDO deliveryExpressDO = deliveryExpressService.selectByCode(com);
+        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getLogisticsNo, nu)
+                .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
+                .isNull(TradeOrderDO::getReceivingTime)
+        );
+        if(tradeOrderDO == null){
+            return;
+        }
+        tradeOrderDO.setReceivingTime(time);
+
+        tradeOrderMapper.updateById(tradeOrderDO);
+    }
+
+    @Override
+    public void updateOrderById(TradeOrderDO order) {
+        tradeOrderMapper.updateById(order);
+    }
+
     /**
      * 创建单个订单的评论
      *

+ 1 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml

@@ -73,6 +73,7 @@
             tor.pay_status = 1
             and toi.distribute_benefit = 0
             and (toi.after_sale_status = 0 or toi.after_sale_status = 61)
+            and tor.receiving_time &lt; DATE_SUB(NOW(), INTERVAL 7 DAY)
             <if test="orderIds!=null">
                 and tor.id in (
                 <foreach collection="orderIds" item="orderId" separator=",">