| 
					
				 | 
			
			
				@@ -49,8 +49,18 @@ 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.google.gson.Gson; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.gson.JsonObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.api.Subscribe; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.contant.ApiInfoConstant; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.core.IBaseClient; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.pojo.HttpResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.request.SubscribeParam; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.request.SubscribeParameters; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.kuaidi100.sdk.request.SubscribeReq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.jetbrains.annotations.NotNull; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -67,6 +77,7 @@ import static cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils.mi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static cn.newfeifan.mall.framework.web.core.util.WebFrameworkUtils.getTerminal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.NOT_SUFFICIENT_FUNDS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 交易订单【写】Service 实现类 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -107,6 +118,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private TradeOrderProperties tradeOrderProperties; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${feifan.trade.express.kd100.key}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // =================== Order =================== 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -336,6 +350,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 1.1 校验并获得交易订单(可发货) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        order.setLogisticsId(deliveryReqVO.getLogisticsId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        order.setLogisticsNo(deliveryReqVO.getLogisticsNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 1.2 校验 deliveryType 是否为快递,是快递才可以发货 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -352,9 +368,18 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 2.2 无需发货 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             updateOrderObj.setLogisticsId(0L).setLogisticsNo(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //发送订单订阅 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            testSubscribe(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 执行更新 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(order.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (updateCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -369,6 +394,59 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 订阅物流信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param order 交易订单对象,包含物流信息和接收人手机号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @throws Exception 抛出异常,可能由于外部服务调用失败等原因 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void testSubscribe(TradeOrderDO order) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 根据物流ID获取配送信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(order.getLogisticsId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 设置订阅参数,包括回调URL和手机号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SubscribeParameters subscribeParameters = new SubscribeParameters(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParameters.setCallbackurl("https://47.107.28.221:8001/admin-api/trade/order/callBackUrl?orderId=" + order.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParameters.setPhone(order.getReceiverMobile()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //添加盐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParameters.setSalt(order.getLogisticsNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SubscribeParam subscribeParam = new SubscribeParam(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParam.setParameters(subscribeParameters); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParam.setCompany(deliveryExpress.getCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParam.setNumber(order.getLogisticsNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeParam.setKey(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 构建订阅请求对象,设置请求模式和参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SubscribeReq subscribeReq = new SubscribeReq(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subscribeReq.setParam(new Gson().toJson(subscribeParam)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 调用订阅服务,并打印执行结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        IBaseClient subscribe = new Subscribe(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        HttpResult execute = subscribe.execute(subscribeReq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Gson gson = new Gson(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JsonObject jsonObject = gson.fromJson(execute.getBody(), JsonObject.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        boolean result = jsonObject.get("result").getAsBoolean(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String returnCode = jsonObject.get("returnCode").getAsString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (result && returnCode.equals("200")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("订单号:{}:订阅成功", order.getLogisticsNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.SUBSCRIBE.getStatus()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (returnCode.equals("600") || returnCode.equals("601")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw exception(NOT_SUFFICIENT_FUNDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("订单号:{}:订阅失败", order.getLogisticsNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.abnormal.getStatus()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tradeOrderMapper.updateById(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 校验交易订单满足被发货的条件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * <p> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -837,6 +915,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void updateOrderById(TradeOrderDO order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tradeOrderMapper.updateById(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 创建单个订单的评论 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 |