1
0
Эх сурвалжийг харах

fixed 小程序订单上传、订单配送信息完善

fushengqian 5 сар өмнө
parent
commit
bd2017e12e

+ 7 - 0
fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingInfo.java

@@ -57,4 +57,11 @@ public class ShippingInfo implements Serializable {
    */
   @SerializedName("upload_time")
   private String uploadTime;
+
+  /**
+   * 必填
+   * 支付者,支付者信息
+   */
+  @SerializedName("payer")
+  private PayerBean payer;
 }

+ 0 - 172
fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShoppingInfo.java

@@ -1,172 +0,0 @@
-package com.fuint.common.bean.shoppingOrders;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 上传发货信息Bean
- *
- * Created by FSQ
- * CopyRight https://www.fuint.cn
- */
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ShoppingInfo implements Serializable {
-
-  private static final long serialVersionUID = 2105037984591600658L;
-
-  /**
-   * 必填
-   * 订单,需要上传物流信息的订单
-   */
-  @SerializedName("order_key")
-  private OrderKeyBean orderKey;
-
-  /**
-   * 购物详情列表
-   */
-  @SerializedName("order_list")
-  private List<OrderListBean> orderList;
-
-  /**
-   * 必填
-   * 支付者,支付者信息
-   */
-  @SerializedName("payer")
-  private PayerBean payer;
-
-  /**
-   * 物流形式,订单商品配送的物流形式,默认为实体物流
-   * 物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
-   */
-  @SerializedName("logistics_type")
-  private int logisticsType;
-
-  /**
-   * 必填
-   * 上传时间,用于标识请求的先后顺序 示例值: `2022-12-15T13:29:35.120+08:00
-   */
-  @SerializedName("upload_time")
-  private String uploadTime;
-
-  @Data
-  @Builder
-  @NoArgsConstructor
-  @AllArgsConstructor
-  public static class OrderListBean implements Serializable {
-    private static final long serialVersionUID = -7690807867756471672L;
-    /**
-     * 必填
-     * 商户交易订单编号,商户侧的交易订单详情页向用户展示的订单编号
-     * 示例值: 232457563423 字符字节限制: [1, 64]
-     */
-    @SerializedName("merchant_order_no")
-    private String merchantOrderNo;
-
-    /**
-     * 必填
-     * 商户交易订单详情页链接,用户查看“商城订单”时,跳转至商户侧查看交易订单详情页的链接。详情页类别可以为H5或小程序
-     */
-    @SerializedName("order_detail_jump_link")
-    private OrderDetailBean orderDetailJumpLink;
-
-    /**
-     * 订单购买的商品列表,用户在订单中购买的全部商品明细的列表,最多可以上传50个商品
-     * 多重性: [1, 50]
-     */
-    @SerializedName("item_list")
-    private List<OrderItemListBean> itemList;
-  }
-
-  @Data
-  @Builder
-  @NoArgsConstructor
-  @AllArgsConstructor
-  public static class OrderDetailBean implements Serializable {
-    private static final long serialVersionUID = -8002249022516272034L;
-    /**
-     * 链接地址(链接类型为H5时必填)
-     * 示例值: https://www.weixin.qq.com/wxpay/pay.php
-     * 字符字节限制: [1, 1024]
-     * 匹配正则表达式: ^https?😕/([^\s/?#[]@]+@)?([^\s/?#@:]+)(?::\d{2,5})?([^[]]*)$
-     */
-    @SerializedName("url")
-    private String url;
-    /**
-     * 小程序appid(链接类型为MINIAPP时必填)
-     * 示例值: wxd678efh567hg6787 字符字节限制: [1, 32]
-     */
-    @SerializedName("appid")
-    private String appId;
-    /**
-     * 小程序path(链接类型为MINIAPP时必填)
-     * 示例值: /path/index/index 字符字节限制: [1, 512]
-     */
-    @SerializedName("path")
-    private String path;
-    /**
-     * 必填
-     * 链接类型枚举值:1、URL;2、MINI_PROGRAM
-     * 示例值: MINI_PROGRAM
-     */
-    @SerializedName("type")
-    private int type;
-  }
-
-  @Data
-  @Builder
-  @NoArgsConstructor
-  @AllArgsConstructor
-  public static class OrderItemListBean implements Serializable {
-    private static final long serialVersionUID = -2989527770771246748L;
-    /**
-     * 商户侧商品ID,商户系统内部商品编码,用于标识不同的商品。请注意,当发货模式选择“分拆发货”时,需要使用商户侧商品ID来标记各物流单中包含的具体商品
-     * 示例值: 1246464644 字符字节限制: [1, 64]
-     */
-    @SerializedName("merchant_item_id")
-    private String merchantItemId;
-    /**
-     * 必填
-     * 商品名称
-     * 示例值: iPhoneX 256G 字符长度限制: [1, 256]
-     */
-    @SerializedName("name")
-    private String name;
-    /**
-     * 商品描述
-     * 示例值: Image形象店-深圳腾大-QQ公仔 字符长度限制: [1, 512]
-     */
-    @SerializedName("description")
-    private String description;
-    /**
-     * 必填
-     * 商品单价(单位:分)
-     */
-    @SerializedName("unit_price")
-    private long unitPrice;
-    /**
-     * 必填
-     * 购买数量
-     * 示例值: 2
-     */
-    @SerializedName("quantity")
-    private long quantity;
-    /**
-     * 商品图片链接
-     * 示例值: https://qpic.cn/xxx
-     * 多重性: [1, 3]
-     * 字符字节限制: [1, 1024]
-     * 匹配正则表达式: ^https?😕/([^\s/?#[]@]+@)?([^\s/?#@:]+)(?::\d{2,5})?([^[]]*)$
-     */
-    @SerializedName("image_url")
-    private List<String> imageUrl;
-  }
-
-}

+ 4 - 1
fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java

@@ -14,9 +14,12 @@ import lombok.Setter;
 @Setter
 public class ExpressDto {
 
-    @ApiModelProperty("物流公司")
+    @ApiModelProperty("物流公司名称")
     private String expressCompany;
 
+    @ApiModelProperty("物流公司编码")
+    private String expressCode;
+
     @ApiModelProperty("物流单号")
     private String expressNo;
 

+ 3 - 0
fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java

@@ -36,4 +36,7 @@ public class OrderUserDto implements Serializable {
     @ApiModelProperty("地址")
     private String address;
 
+    @ApiModelProperty("openId")
+    private String openId;
+
 }

+ 6 - 0
fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java

@@ -27,6 +27,9 @@ public class UserOrderDto implements Serializable {
     @ApiModelProperty("商户ID")
     private Integer merchantId;
 
+    @ApiModelProperty("所属店铺ID")
+    private Integer storeId;
+
     @ApiModelProperty("订单号")
     private String orderSn;
 
@@ -42,6 +45,9 @@ public class UserOrderDto implements Serializable {
     @ApiModelProperty("订单模式")
     private String orderMode;
 
+    @ApiModelProperty("下单平台")
+    private String platform;
+
     @ApiModelProperty("是否核销")
     private Boolean isVerify;
 

+ 46 - 0
fuint-application/src/main/java/com/fuint/common/enums/ExpressCompanyEnum.java

@@ -0,0 +1,46 @@
+package com.fuint.common.enums;
+
+/**
+ * 物流公司枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum ExpressCompanyEnum {
+    YTO("YTO", "圆通速递"),
+    ZTO("ZTO", "中通快递"),
+    BEST("BEST", "百世快递"),
+    YUNDA("YUNDA", "韵达快递"),
+    SF("SF", "顺丰速运"),
+    EMS("EMS", "中国邮政"),
+    DB("DB", "德邦快递"),
+    STO("STO", "申通快递"),
+    JDL("JDL", "京东快递"),
+    HHTT("HHTT", "天天快递"),
+    JTSD("JTSD", "极兔快递");
+
+    private String key;
+
+    private String value;
+
+    ExpressCompanyEnum(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

+ 1 - 1
fuint-application/src/main/java/com/fuint/common/service/WeixinService.java

@@ -185,7 +185,7 @@ public interface WeixinService {
     String createMiniAppLink(Integer merchantId, String path);
 
     /**
-     * 上传发货信息
+     * 上传小程序发货信息
      *
      * @param orderSn 订单号
      * @return

+ 4 - 0
fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java

@@ -1532,6 +1532,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
 
         userOrderDto.setId(orderInfo.getId());
         userOrderDto.setMerchantId(orderInfo.getMerchantId());
+        userOrderDto.setStoreId(orderInfo.getStoreId());
         userOrderDto.setUserId(orderInfo.getUserId());
         userOrderDto.setCouponId(orderInfo.getCouponId());
         userOrderDto.setOrderSn(orderInfo.getOrderSn());
@@ -1546,6 +1547,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         userOrderDto.setStaffId(orderInfo.getStaffId());
         userOrderDto.setVerifyCode("");
         userOrderDto.setDeliveryFee(orderInfo.getDeliveryFee());
+        userOrderDto.setPlatform(orderInfo.getPlatform());
 
         // 核销码为空,说明已经核销
         if (orderInfo.getVerifyCode() == null || StringUtil.isEmpty(orderInfo.getVerifyCode())) {
@@ -1635,6 +1637,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
             userInfo.setMobile(user.getMobile());
             userInfo.setCardNo(user.getIdcard());
             userInfo.setAddress(user.getAddress());
+            userInfo.setOpenId(user.getOpenId());
             userOrderDto.setUserInfo(userInfo);
         }
 
@@ -1741,6 +1744,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
             expressInfo.setExpressNo(express.get("expressNo").toString());
             expressInfo.setExpressCompany(express.get("expressCompany").toString());
             expressInfo.setExpressTime(express.get("expressTime").toString());
+            expressInfo.setExpressCode(express.get("expressCode") == null ? "" : express.get("expressCode").toString());
             userOrderDto.setExpressInfo(expressInfo);
         }
 

+ 30 - 7
fuint-application/src/main/java/com/fuint/common/service/impl/WeixinServiceImpl.java

@@ -8,8 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fuint.common.Constants;
 import com.fuint.common.bean.H5SceneInfo;
 import com.fuint.common.bean.WxPayBean;
-import com.fuint.common.bean.shoppingOrders.OrderKeyBean;
-import com.fuint.common.bean.shoppingOrders.ShippingInfo;
+import com.fuint.common.bean.shoppingOrders.*;
 import com.fuint.common.dto.OrderDto;
 import com.fuint.common.dto.UserOrderDto;
 import com.fuint.common.dto.WxCardDto;
@@ -1002,20 +1001,26 @@ public class WeixinServiceImpl implements WeixinService {
     }
 
     /**
-     * 上传发货信息
+     * 上传小程序发货信息
      *
      * @param orderSn 订单号
      * @return
      */
     @Override
     public void uploadShippingInfo(String orderSn) throws BusinessCheckException {
-        MtOrder order = orderService.getOrderInfoByOrderSn(orderSn);
+        UserOrderDto orderInfo = orderService.getOrderByOrderSn(orderSn);
+        if (orderInfo == null) {
+            return;
+        }
+        if (orderInfo.getExpressInfo() == null || StringUtil.isEmpty(orderInfo.getExpressInfo().getExpressNo())) {
+            throw new BusinessCheckException("上传发货信息失败,物流信息不能为空!");
+        }
         // 是否是微信小程序订单 && 微信支付
-        if (order != null && !order.getPlatform().equals(PlatformTypeEnum.MP_WEIXIN.getCode()) || !order.getPayType().equals(PayTypeEnum.JSAPI.name())) {
-            String url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + getAccessToken(order.getMerchantId(), true, true);
+        if (orderInfo != null && !orderInfo.getPlatform().equals(PlatformTypeEnum.MP_WEIXIN.getCode()) || !orderInfo.getPayType().equals(PayTypeEnum.JSAPI.name())) {
+            String url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + getAccessToken(orderInfo.getMerchantId(), true, true);
 
             // 获取微信支付配置
-            getApiConfig(order.getStoreId(), order.getPlatform());
+            getApiConfig(orderInfo.getStoreId(), orderInfo.getPlatform());
             WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
 
             // 组织上传参数
@@ -1034,6 +1039,24 @@ public class WeixinServiceImpl implements WeixinService {
             // 3、发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY
             shippingInfo.setDeliveryMode(1);
 
+            // 4、物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式
+            List<ShippingListBean> shippingList = new ArrayList<>();
+            ShippingListBean shippingListBean = new ShippingListBean();
+            shippingListBean.setTrackingNo(orderInfo.getExpressInfo().getExpressNo());
+            shippingListBean.setExpressCompany(orderInfo.getExpressInfo().getExpressCode());
+            ContactBean contact = new ContactBean();
+            contact.setConsignorContact(orderInfo.getStoreInfo().getPhone());
+            contact.setReceiverContact(orderInfo.getAddress().getMobile());
+            shippingListBean.setContact(contact);
+
+            shippingList.add(shippingListBean);
+            shippingInfo.setShippingList(shippingList);
+
+            // 5、支付者信息
+            PayerBean payerBean = new PayerBean();
+            payerBean.setOpenid(orderInfo.getUserInfo().getOpenId());
+            shippingInfo.setPayer(payerBean);
+
             String reqJson = JsonUtil.toJSONString(shippingInfo);
             String response = HttpRESTDataClient.requestPostBody(url, reqJson);
             logger.info("微信上传发货信息接口返回:{}", response);

+ 25 - 6
fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendOrderController.java

@@ -161,12 +161,23 @@ public class BackendOrderController extends BaseController {
         // 支付方式列表
         PayTypeEnum[] payTypes = PayTypeEnum.values();
         List<ParamDto> payTypeList = new ArrayList<>();
-        for (PayTypeEnum catchTypeEnum : payTypes) {
-            ParamDto catchType = new ParamDto();
-            catchType.setKey(catchTypeEnum.getKey());
-            catchType.setName(catchTypeEnum.getValue());
-            catchType.setValue(catchTypeEnum.getKey());
-            payTypeList.add(catchType);
+        for (PayTypeEnum typeEnum : payTypes) {
+            ParamDto payType = new ParamDto();
+            payType.setKey(typeEnum.getKey());
+            payType.setName(typeEnum.getValue());
+            payType.setValue(typeEnum.getKey());
+            payTypeList.add(payType);
+        }
+
+        // 物流公司列表
+        ExpressCompanyEnum[] expressCompanyEnums = ExpressCompanyEnum.values();
+        List<ParamDto> expressCompanyList = new ArrayList<>();
+        for (ExpressCompanyEnum companyEnum : expressCompanyEnums) {
+            ParamDto company = new ParamDto();
+            company.setKey(companyEnum.getKey());
+            company.setName(companyEnum.getValue());
+            company.setValue(companyEnum.getValue());
+            expressCompanyList.add(company);
         }
 
         Map<String, Object> result = new HashMap<>();
@@ -176,6 +187,7 @@ public class BackendOrderController extends BaseController {
         result.put("orderModeList", orderModeList);
         result.put("storeList", storeList);
         result.put("payTypeList", payTypeList);
+        result.put("expressCompanyList", expressCompanyList);
         result.put("paginationResponse", response);
 
         return getSuccessResult(result);
@@ -266,6 +278,13 @@ public class BackendOrderController extends BaseController {
             expressInfo.setExpressTime(time);
             expressInfo.setExpressNo(expressNo);
             expressInfo.setExpressCompany(expressCompany);
+            ExpressCompanyEnum[] expressCompanyEnums = ExpressCompanyEnum.values();
+            for (ExpressCompanyEnum expressCompanyEnum : expressCompanyEnums) {
+                 if (expressCompanyEnum.getValue().equals(expressCompany)) {
+                     expressInfo.setExpressCode(expressCompanyEnum.getKey());
+                     break;
+                 }
+            }
             dto.setExpressInfo(expressInfo);
         }