Browse Source

物流信息问题处理

yfh 1 week ago
parent
commit
b29465bb5f

+ 47 - 53
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -92,6 +92,8 @@ import com.fs.wx.dto.*;
 import com.fs.wx.mapper.FsWxExpressTaskMapper;
 import com.fs.wx.miniapp.config.WxMaConfiguration;
 import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.service.ExpressToWxHolder;
+import com.fs.wx.service.ExpressToWxService;
 import com.fs.wx.service.OrderQueryService;
 import com.fs.wx.service.ShippingService;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
@@ -305,74 +307,66 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
         for (FsWxExpressTask fsWxExpressTask : fsWxExpressTasks) {
 
-          try{
-              UploadShippingInfoRequest request = new UploadShippingInfoRequest();
+            try{
+                UploadShippingInfoRequest request = new UploadShippingInfoRequest();
 
-              OrderKey orderKey = new OrderKey();
-              orderKey.setOrderNumberType(2);
+                OrderKey orderKey = new OrderKey();
+                orderKey.setOrderNumberType(2);
 
 
-              FsUser fsUser = fsUserMapper.selectFsUserById(fsWxExpressTask.getUserId());
-              FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(fsWxExpressTask.getOrderCode());
+                FsUser fsUser = fsUserMapper.selectFsUserByUserId(fsWxExpressTask.getUserId());
 
+                ExpressToWxService service = ExpressToWxHolder.findBest(fsWxExpressTask.getType(),fsWxExpressTask.getOrderCode());
+                Asserts.notNull(service,"订单类型不被支持!");
 
-              if(ObjectUtil.isNotNull(fsStoreOrder)){
-                  List<FsStorePayment> fsStorePayments = paymentService.selectFsStorePaymentByOrder(fsStoreOrder.getId());
 
+                orderKey.setTransactionId(service.getTransactionId());
 
-                  if(CollectionUtils.isNotEmpty(fsStorePayments)){
-                      FsStorePayment fsStorePayment = fsStorePayments.get(0);
-                      orderKey.setTransactionId(fsStorePayment.getBankTransactionId());
-                  }
-              }
 
-              String userPhone = "";
-              String orderGoodsInfo = "商品";
-              if(fsStoreOrder != null){
-                  userPhone = fsStoreOrder.getUserPhone();
-                  orderGoodsInfo = getOrderGoodsInfo(fsStoreOrder);
-              }
+                String userPhone = service.getUserPhone();
+                String orderGoodsInfo = service.getOrderGoodsInfo();
 
-              Payer payer = new Payer();
-              if(StringUtils.isNotBlank(fsUser.getMaOpenId())){
-                  payer.setOpenid(fsUser.getMaOpenId());
-              }
-              request.setPayer(payer);
-              request.setOrderKey(orderKey);
 
-              request.setLogisticsType(1);
-              request.setDeliveryMode(1);
-
-              request.setShippingList(Collections.singletonList(ShippingItem.builder()
-                      .itemDesc(orderGoodsInfo)
-                      .expressCompany(fsWxExpressTask.getExpressCompany())
-                      .trackingNo(fsWxExpressTask.getExpressNo())
-                      .contact(Contact.builder().consignorContact(userPhone).build())
-                      .build()));
+                Payer payer = new Payer();
+                if(StringUtils.isNotBlank(fsUser.getMaOpenId())){
+                    payer.setOpenid(fsUser.getMaOpenId());
+                }
+                request.setPayer(payer);
+                request.setOrderKey(orderKey);
 
-              OffsetDateTime now = OffsetDateTime.now();
-              DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
-              String formattedTimestamp = now.format(formatter);
-              request.setUploadTime(formattedTimestamp);
+                request.setLogisticsType(1);
+                request.setDeliveryMode(1);
 
+                request.setShippingList(Collections.singletonList(ShippingItem.builder()
+                        .itemDesc(orderGoodsInfo)
+                        .expressCompany(service.getExpressCompany())
+                        .trackingNo(service.getExpressNo())
+                        .contact(Contact.builder().consignorContact(userPhone).build())
+                        .build()));
 
-              WeChatApiResponse response = shippingService.uploadShippingInfo(request);
-              if(ObjectUtil.equal(response.getErrcode(),0)){
-                  fsWxExpressTask.setStatus(2);
-              } else {
-                  fsWxExpressTask.setRetryCount(fsWxExpressTask.getRetryCount() +1);
-                  fsWxExpressTask.setStatus(3);
-                  fsWxExpressTask.setData(JSON.toJSONString(request));
-                  fsWxExpressTask.setRequestBody(JSON.toJSONString(request));
-                  fsWxExpressTask.setResponseBody(JSON.toJSONString(response));
-              }
-          }catch (Exception e){
-              logger.info("该单 {} 推送到物流失败!",fsWxExpressTask);
-              fsWxExpressTask.setRetryCount(fsWxExpressTask.getRetryCount() +1);
-              fsWxExpressTask.setStatus(3);
+                OffsetDateTime now = OffsetDateTime.now();
+                DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+                String formattedTimestamp = now.format(formatter);
+                request.setUploadTime(formattedTimestamp);
 
 
-          }
+                request.setAppid(fsWxExpressTask.getAppid());
+                WeChatApiResponse response = shippingService.uploadShippingInfo(request);
+                if(ObjectUtil.equal(response.getErrcode(),0)){
+                    fsWxExpressTask.setStatus(2);
+                } else {
+                    fsWxExpressTask.setRetryCount(fsWxExpressTask.getRetryCount() +1);
+                    fsWxExpressTask.setStatus(3);
+                    fsWxExpressTask.setData(JSON.toJSONString(request));
+                    fsWxExpressTask.setRequestBody(JSON.toJSONString(request));
+                    fsWxExpressTask.setResponseBody(JSON.toJSONString(response));
+                }
+            }catch (Exception e){
+                logger.error("该单 {} 推送到物流失败!",fsWxExpressTask,e);
+                fsWxExpressTask.setRetryCount(fsWxExpressTask.getRetryCount() +1);
+                fsWxExpressTask.setStatus(3);
+                fsWxExpressTask.setErrorMessage(JSON.toJSONString(e));
+            }
         }
         fsWxExpressTaskMapper.batchUpdate(fsWxExpressTasks);
 

+ 2 - 0
fs-service-system/src/main/java/com/fs/wx/domain/FsWxExpressTask.java

@@ -94,6 +94,8 @@ public class FsWxExpressTask {
      */
     private String expressNo;
 
+    private Integer type;
+
     /**
      * 小程序ID
      */

+ 5 - 0
fs-service-system/src/main/java/com/fs/wx/dto/UploadShippingInfoRequest.java

@@ -1,5 +1,6 @@
 package com.fs.wx.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -35,4 +36,8 @@ public class UploadShippingInfoRequest {
     @JsonProperty("payer")
     private Payer payer;
 
+
+    @JsonIgnore
+    private String appid;
+
 }

+ 30 - 0
fs-service-system/src/main/java/com/fs/wx/service/ExpressToWxHolder.java

@@ -0,0 +1,30 @@
+package com.fs.wx.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class ExpressToWxHolder {
+    private static ApplicationContext applicationContext;
+
+    @Autowired
+    public void setApplicationContext(ApplicationContext applicationContext) {
+        ExpressToWxHolder.applicationContext = applicationContext;
+    }
+
+    public static ExpressToWxService findBest(Integer type,String orderCode) {
+        String[] beanNames = applicationContext.getBeanNamesForType(ExpressToWxService.class);
+
+        for (String beanName : beanNames) {
+            ExpressToWxService handler = (ExpressToWxService) applicationContext.getBean(beanName);
+            if (handler.support(type)) {
+                handler.setOrderCode(orderCode);
+                return handler;
+            }
+        }
+        throw new IllegalArgumentException(String.format(String.format("对应类型 %d 没有被找到!",type)));
+    }
+}

+ 27 - 0
fs-service-system/src/main/java/com/fs/wx/service/ExpressToWxService.java

@@ -0,0 +1,27 @@
+package com.fs.wx.service;
+
+import lombok.Getter;
+
+@Getter
+public abstract class ExpressToWxService {
+
+    private String orderCode;
+
+
+    public void setOrderCode(String orderCode) {
+        this.orderCode = orderCode;
+    }
+
+    public abstract String getTransactionId();
+
+
+    public abstract String getUserPhone();
+
+
+    public abstract String getOrderGoodsInfo();
+
+    public abstract String getExpressCompany();
+    public abstract String getExpressNo();
+
+    public abstract boolean support(Integer type);
+}

+ 97 - 0
fs-service-system/src/main/java/com/fs/wx/service/impl/ShopExpressToWxService.java

@@ -0,0 +1,97 @@
+package com.fs.wx.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.mapper.FsStoreOrderMapper;
+import com.fs.store.mapper.FsStorePaymentMapper;
+import com.fs.wx.service.ExpressToWxService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
+@Service
+@Scope(value = SCOPE_PROTOTYPE)
+public class ShopExpressToWxService extends ExpressToWxService {
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+    @Autowired
+    private FsStorePaymentMapper fsStorePaymentMapper;
+
+    private FsStoreOrder fsStoreOrder;
+    private FsStorePayment fsStorePayment;
+
+    @Override
+    public void setOrderCode(String orderCode) {
+        super.setOrderCode(orderCode);
+        this.fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(getOrderCode());
+        if(ObjectUtil.isNull(fsStoreOrder)) {
+            throw new IllegalArgumentException(String.format("该订单 %s 未找到!",getOrderCode()));
+        }
+        List<FsStorePayment> fsStorePayments = fsStorePaymentMapper.selectFsStorePaymentByOrderId(fsStoreOrder.getId());
+        if(CollectionUtils.isEmpty(fsStorePayments)){
+            throw new IllegalArgumentException(String.format("该订单 %s 未找到对应支付记录!", getOrderCode()));
+        }
+        fsStorePayment = fsStorePayments.get(0);
+    }
+
+
+    @Override
+    public String getTransactionId() {
+        return fsStorePayment.getBankTransactionId();
+    }
+
+    @Override
+    public String getUserPhone() {
+        return fsStoreOrder.getUserPhone();
+    }
+
+    @Override
+    public String getOrderGoodsInfo() {
+        return getOrderGoodsInfo(fsStoreOrder);
+    }
+
+    @Override
+    public String getExpressCompany() {
+
+        return fsStoreOrder.getDeliverySn();
+    }
+
+    @Override
+    public String getExpressNo() {
+
+        return fsStoreOrder.getDeliverySn();
+    }
+
+    @Override
+    public boolean support(Integer type) {
+        return 0 == type;
+    }
+
+
+    /**
+     * 获取订单商品信息
+     * @return
+     */
+    private String getOrderGoodsInfo(FsStoreOrder order){
+        StringBuilder title = new StringBuilder();
+        // 如果是套餐
+        String itemJson = order.getItemJson();
+        com.alibaba.fastjson.JSONArray arrays = JSON.parseArray(itemJson);
+        for(int i=0;i<arrays.size();i++){
+            JSONObject jsonObject = arrays.getJSONObject(i);
+            String jsonInfo = jsonObject.getString("jsonInfo");
+            JSONObject jsonObject1 = JSON.parseObject(jsonInfo);
+            String productName = jsonObject1.getString("productName");
+            title.append(productName).append("\n");
+        }
+        return title.toString();
+    }
+}