luofl
2025-03-17 e23242d09e31e1c78f7ecdbc2859c9f99a3c4171
迭代版本:2.28
12个文件已修改
8个文件已添加
510 ■■■■ 已修改文件
a.json 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/CommissionController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/JsapiServiceExample.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ShoppingCartController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEvent.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEventListener.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/PaymentUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderExport.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Contact.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Order.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/OrderKey.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Payer.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Shipping.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
a.json
@@ -1,17 +1,11 @@
{
  "access_token": "90_4PJ8b5aLJa2M7aCtoskALEzfoap1me291Jc3ogi18NGH0Ts-Tol7K3COLLvkQ1JLcouvew11ORqcHf6mH5LA2KSC08NxiDhsjRPKuRh14mpvQRHmeFvwr-wKWjkANLdACAUHF",
  "order_key": {
    "order_number_type": 1
    "order_number_type": 2,
    "transaction_id": "4200002671202503143982490042"
  },
  "logistics_type": 1,
  "delivery_mode": 1,
  "shipping_list": [
    {
      "item_desc": "这是一个测试"
    }
  ],
  "upload_time": "2022-12-15T13:29:35.120+08:00",
  "payer": {
    "openid": "ooOrs63KYDHcyhnUmTFpprHc6sb4"
  }
  "logistics_type": 1,
  "shipping_list": "[]",
  "upload_time": "2025-03-14T22:34:59.709+08:00",
  "payer": "{\"openid\":\"ooOrs62ua63vzhaAeDZDwtH96o34\"}"
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
@@ -10,6 +10,10 @@
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
 * 通用http发送方法
@@ -233,6 +237,21 @@
        return result.toString();
    }
    public static void main(String[] args) {
        // 获取当前时间,并指定时区偏移为 +08:00
        OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+08:00"));
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
        // 将时间格式化为字符串
        String formattedDateTime = now.format(formatter);
        // 输出结果
        System.out.println(formattedDateTime);
    }
    public static String post(String strURL, String params) {
        String result = "";
        BufferedReader reader = null;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/CommissionController.java
@@ -2,6 +2,10 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.service.CommissionService;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiService;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.QueryOrderByIdRequest;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -12,6 +16,5 @@
public class CommissionController {
    @Resource
    private CommissionService commissionService;
    public static JsapiService service;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/JsapiServiceExample.java
New file
@@ -0,0 +1,93 @@
package com.ruoyi.order.controller;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.exception.HttpException;
import com.wechat.pay.java.core.exception.MalformedMessageException;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiService;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.CloseOrderRequest;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayResponse;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.QueryOrderByIdRequest;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.QueryOrderByOutTradeNoRequest;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
/** JsapiService使用示例 */
public class JsapiServiceExample {
    /** 商户号 */
    public static String merchantId = "190000****";
    /** 商户API私钥路径 */
    public static String privateKeyPath = "/Users/yourname/your/path/apiclient_key.pem";
    /** 商户证书序列号 */
    public static String merchantSerialNumber = "5157F09EFDC096DE15EBE81A47057A72********";
    /** 商户APIV3密钥 */
    public static String apiV3Key = "...";
    public static JsapiService service;
    public static void main(String[] args) {
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        service = new JsapiService.Builder().config(config).build();
        // ... 调用接口
        try {
            closeOrder();
        } catch (HttpException e) { // 发送HTTP请求失败
            // 调用e.getHttpRequest()获取请求打印日志或上报监控,更多方法见HttpException定义
        } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
            // 调用e.getResponseBody()获取返回体打印日志或上报监控,更多方法见ServiceException定义
        } catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败
            // 调用e.getMessage()获取信息打印日志或上报监控,更多方法见MalformedMessageException定义
        }
    }
    /** 关闭订单 */
    public static void closeOrder() {
        CloseOrderRequest request = new CloseOrderRequest();
        // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
        // 调用接口
        service.closeOrder(request);
    }
    /** JSAPI支付下单 */
    public static PrepayResponse prepay() {
        PrepayRequest request = new PrepayRequest();
        // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
        // 调用接口
        return service.prepay(request);
    }
    /** 微信支付订单号查询订单 */
    public static Transaction queryOrderById() {
        QueryOrderByIdRequest request = new QueryOrderByIdRequest();
        request.setTransactionId("4208450740201411110007820472");
        // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
        // 调用接口
        return service.queryOrderById(request);
    }
    /** 商户订单号查询订单 */
    public static Transaction queryOrderByOutTradeNo() {
        QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
        // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
        // 调用接口
        return service.queryOrderByOutTradeNo(request);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -634,6 +634,7 @@
            }
        });
        ExcelUtil<OrderExport> util = new ExcelUtil<OrderExport>(OrderExport.class);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ShoppingCartController.java
@@ -1,6 +1,7 @@
package com.ruoyi.order.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUser;
@@ -118,6 +119,9 @@
    @ResponseBody
    @GetMapping("/shoppingCartPaymentCallback")
    public void shoppingCartPaymentCallback(UniPayCallbackResult uniPayCallbackResult, HttpServletResponse response){
        String jsonString = JSONObject.toJSONString(uniPayCallbackResult);
        System.out.println("1111111111111111111111");
        System.out.println(jsonString);
        R callback = shoppingCartService.shoppingCartPaymentCallback(uniPayCallbackResult);
        if(callback.getCode() == 200){
            response.setStatus(200);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEvent.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.event;
import org.springframework.context.ApplicationEvent;
public class ConfirmDeliveryEvent extends ApplicationEvent {
    public ConfirmDeliveryEvent(Object source) {
        super(source);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java
New file
@@ -0,0 +1,160 @@
package com.ruoyi.order.event;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.order.model.OrderGood;
import com.ruoyi.order.service.OrderGoodService;
import com.ruoyi.order.service.OrderService;
import com.ruoyi.order.vo.delivery.*;
import com.ruoyi.other.api.domain.Goods;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.feignClient.ShopClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@Component
@Slf4j
public class ConfirmDeliveryEventListener {
    private final OrderService orderService;
    private final OrderGoodService orderGoodService;
    @Resource
    private ShopClient shopClient;
    @Resource
    private AppUserClient appUserClient;
    /**
     * 发货信息同步至微信
     */
    @Async
    @EventListener(ConfirmDeliveryEvent.class)
    public synchronized void confirmDelivery(ConfirmDeliveryEvent event) {
        Long orderId = (Long) event.getSource();
        Order order = buildOrder(orderId);
        log.info("发货信息同步至微信");
        // 1. 获取access_token(GET请求)
        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
                + "&appid=wxdeed472c98e42a54"
                + "&secret=c89c697c981452480e0781fb82d4284c";
        // 发送GET请求[1](@ref)
        String tokenResponse = HttpUtil.get(tokenUrl);
        cn.hutool.json.JSONObject tokenJson = JSONUtil.parseObj(tokenResponse);
        String accessToken = tokenJson.getStr("access_token");
        // 构建请求体(使用Hutool的JSONObject)
        JSONObject requestBody = new JSONObject();
        requestBody.put("order_key", order.getOrder_key());
        requestBody.put("delivery_mode", order.getDelivery_mode());
        requestBody.put("logistics_type", order.getLogistics_type());
        requestBody.put("shipping_list", JSON.parseArray(JSONObject.toJSONString(order.getShipping_list())));
        requestBody.put("upload_time", order.getUpload_time());
        requestBody.put("payer", JSONObject.parseObject(JSONObject.toJSONString(order.getPayer())));
        log.info("请求体:" + requestBody);
        // 2. 上传物流信息(POST请求)
        String logisticsUrl = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + accessToken;
        // 发送POST请求[3](@ref)
        String result = HttpRequest.post(logisticsUrl)
                .header("Content-Type", "application/json;charset=UTF-8") // 设置请求头[1](@ref)
                .body(requestBody.toString()) // 设置JSON请求体[3](@ref)
                .timeout(5000) // 设置超时时间
                .execute()
                .body();
        System.out.println("接口返回结果:" + result);
    }
    public Order buildOrder(Long orderId) {
        com.ruoyi.order.model.Order tOrder = orderService.getById(orderId);
        Shop shop = shopClient.getShopById(tOrder.getShopId()).getData();
        List<OrderGood> orderGoods = orderGoodService.list(new LambdaQueryWrapper<OrderGood>()
                .eq(OrderGood::getOrderId, orderId));
        String expressJson = tOrder.getExpressJson();
        JSONObject jsonObject = JSONObject.parseObject(expressJson);
        String com = jsonObject.getString("com");
        String num = jsonObject.getString("num");
        Order order = new Order();
        order.setDelivery_mode(1);
        order.setLogistics_type(1);
        order.setUpload_time(dateToString(OffsetDateTime.now(ZoneOffset.of("+08:00"))));
        OrderKey orderKey = new OrderKey();
        orderKey.setOrder_number_type(2);
        orderKey.setTransaction_id(tOrder.getSerialNumber());
        order.setOrder_key(orderKey);
        List<Shipping> shippingList = new ArrayList<>();
        for (OrderGood orderGood : orderGoods) {
            Integer orderGoodNum = orderGood.getNum();
            String goodJson = orderGood.getGoodJson();
            Goods goods = JSONObject.parseObject(goodJson, Goods.class);
            String name = goods.getName();
            Shipping shipping = new Shipping();
            shipping.setTracking_no(num);
            shipping.setExpress_company(com);
            shipping.setItem_desc(name + "*" + orderGoodNum);
            String phone = maskPhoneNumber(shop.getPhone());
            Contact contact = new Contact();
            contact.setConsignor_contact(phone);
            shipping.setContact(contact);
            shippingList.add(shipping);
        }
        order.setShipping_list(shippingList);
        AppUser appUser = appUserClient.getAppUserById(tOrder.getAppUserId());
        Payer payer = new Payer();
        payer.setOpenid(appUser.getWxOpenid());
        order.setPayer(payer);
        return order;
    }
    /**
     * 将手机号码中间四位替换为掩码
     * @param phoneNumber 原始手机号码
     * @return 掩码后的手机号码
     */
    public static String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.length() != 11) {
            throw new IllegalArgumentException("手机号码必须为11位数字");
        }
        // 使用正则表达式替换中间四位为****
        return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }
    /**
     * 将时间类型转换成字符串
     */
    public static String dateToString(OffsetDateTime now) {
        // 获取当前时间,并指定时区偏移为 +08:00
//        OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+08:00"));
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
        // 将时间格式化为字符串
        return now.format(formatter);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEventListener.java
@@ -1,6 +1,5 @@
package com.ruoyi.order.event;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUser;
@@ -25,7 +24,6 @@
    @EventListener(PayEvent.class)
    public void checkVipChange(PayEvent event) {
        String source = (String) event.getSource();
        System.out.println("11221212" + source);
        AppUser appUsers = JSONObject.parseObject(source, AppUser.class);
        appUserClient.vipConsumption(appUsers.getId());
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -1,5 +1,8 @@
package com.ruoyi.order.service.impl;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -15,6 +18,7 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.enums.OrderStatus;
import com.ruoyi.order.event.ConfirmDeliveryEvent;
import com.ruoyi.order.mapper.OrderGoodMapper;
import com.ruoyi.order.mapper.OrderMapper;
import com.ruoyi.order.model.Order;
@@ -45,6 +49,7 @@
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jetbrains.annotations.Nullable;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -59,6 +64,7 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -138,6 +144,8 @@
    private AppUserGiveawayTemporaryClient appUserGiveawayTemporaryClient;
    @Resource
    private ShopGiveawayTemporaryClient shopGiveawayTemporaryClient;
    @Resource
    private ApplicationEventPublisher applicationEventPublisher;
    @Override
@@ -1116,36 +1124,11 @@
        order.setExpressResult(JSON.toJSONString(mapTrackKD100Vo));
        this.updateById(order);
        String s = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxdeed472c98e42a54&secret=c89c697c981452480e0781fb82d4284c");
        JSONObject jsonObject2 = JSONObject.parseObject(s);
        System.out.println(jsonObject.getString("access_token"));
        // 发布事件
        applicationEventPublisher.publishEvent(new ConfirmDeliveryEvent(order.getId()));
        return R.ok();
    }
    public static void main(String[] args) {
        String a = "{\n" +
                "  \"access_token\": \"90_4PJ8b5aLJa2M7aCtoskALEzfoap1me291Jc3ogi18NGH0Ts-Tol7K3COLLvkQ1JLcouvew11ORqcHf6mH5LA2KSC08NxiDhsjRPKuRh14mpvQRHmeFvwr-wKWjkANLdACAUHF\",\n" +
                "  \"order_key\": {\n" +
                "    \"order_number_type\": 1\n" +
                "  },\n" +
                "  \"logistics_type\": 1,\n" +
                "  \"delivery_mode\": 1,\n" +
                "  \"shipping_list\": [\n" +
                "    {\n" +
                "      \"item_desc\": \"这是一个测试\"\n" +
                "    }\n" +
                "  ],\n" +
                "  \"upload_time\": \"2022-12-15T13:29:35.120+08:00\",\n" +
                "  \"payer\": {\n" +
                "    \"openid\": \"ooOrs63KYDHcyhnUmTFpprHc6sb4\"\n" +
                "  }\n" +
                "}";
        JSONObject jsonObject = JSONObject.parseObject(a);
        System.out.println(jsonObject);
    }
    public static void importExpress2(String filePath) throws MalformedURLException {
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java
@@ -1520,7 +1520,7 @@
            order.setOrderStatus(2);
        }
        String r7TrxNo = uniPayCallbackResult.getR7_TrxNo();
        String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo();
        order.setSerialNumber(r7TrxNo);
        orderService.updateById(order);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/PaymentUtil.java
@@ -34,7 +34,7 @@
    /**
     * 支付回调地址
     */
    private static final String callbackUrl = "http://luodaxia.free.idcfengye.com";
    private static final String callbackUrl = "https://www.qijisheng.top";
    
    
    /**
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderExport.java
@@ -14,11 +14,50 @@
    @Excel(name = "订单状态" , readConverterExp = "1=待发货,2=待收货,3=待使用,4=已完成,5=已取消,6=已退款,7=售后中,8=已评价")
    private String orderStatus;
    /**
     * 订单编号
     * 交易单号
     */
    @Excel(name = "订单编号")
    @Excel(name = "交易单号")
    private String serialNumber;
    /**
     * 商户单号
     */
    @Excel(name = "商户单号")
    private String orderNumber;
    /**
     * 商户号
     */
    @Excel(name = "商户号")
    private String tradeMerchantNo = "729677708";
    /**
     * 发货方式
     */
    @Excel(name = "发货方式", readConverterExp = "1=快递,2=自提")
    private String distributionMode;
    /**
     * 发货模式
     */
    @Excel(name = "发货模式")
    private String deliveryMode = "统一发货";
    /**
     * 是否完成发货
     */
    @Excel(name = "是否完成发货")
    private String isDelivery;
    /**
     * 是否重新发货
     */
    @Excel(name = "是否重新发货")
    private String isReDelivery;
    /**
     * 订单类型
@@ -26,11 +65,7 @@
    @Excel(name = "订单类型", readConverterExp = "1=服务,2=单品")
    private String orderType;
    /**
     * 配送方式
     */
    @Excel(name = "配送方式", readConverterExp = "1=快递,2=自提")
    private String distributionMode;
    /**
     * 收货地址
@@ -129,4 +164,8 @@
    private String cityCode;
    private String addressJson;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Contact.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.order.vo.delivery;
import lombok.Data;
@Data
public class Contact {
    /**
     * 寄件人联系方式,寄件人联系方式,采用掩码传输,最后4位数字不能打掩码
     * 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024
     */
    private String consignor_contact;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Order.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.order.vo.delivery;
import lombok.Data;
import java.util.List;
@Data
public class Order {
    //订单,需要上传物流信息的订单
    private OrderKey order_key;
    //发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY
    private int delivery_mode;
    // 物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
    private int logistics_type;
    /**
     * 物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式,多重性: [1, 10]
     * 属性    类型    必填    说明
     * tracking_no    string    否    物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128]
     * express_company    string    否    物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128]
     * item_desc    string    是    商品信息,例如:微信红包抱枕*1个,限120个字以内
     * contact    object    否    联系方式,当发货的物流公司为顺丰时,联系方式为必填,收件人或寄件人联系方式二选一
     * 属性    类型    必填    说明
     * consignor_contact    string    否    寄件人联系方式,寄件人联系方式,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024
     * receiver_contact    string    否    收件人联系方式,收件人联系方式为,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024
     * upload_time    string    是    上传时间,用于标识请求的先后顺序 示例值: `2022-12-15T13:29:35.120+08:00`
     * payer    object    是    支付者,支付者信息
     * 属性    类型    必填    说明
     * openid    string    是    用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128]
     */
    private List<Shipping> shipping_list;
    // 上传时间,用于标识请求的先后顺序 示例值: `2022-12-15T13:29:35.120+08:00`
    private String upload_time;
    // 支付者,支付者信息
    private Payer payer;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/OrderKey.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.vo.delivery;
import lombok.Data;
@Data
public class OrderKey {
    /**
     * 订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。
     */
    private int order_number_type;
    /**
     * 原支付交易对应的微信订单号
     */
    private String transaction_id;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Payer.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.vo.delivery;
import lombok.Data;
@Data
public class Payer {
    /**
     * 用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128]
     */
    private String openid;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Shipping.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.order.vo.delivery;
import lombok.Data;
@Data
public class Shipping {
    /**
     * 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128]
     */
    private String tracking_no;
    /**
     * 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128]
     */
    private String express_company;
    /**
     * 商品信息,例如:微信红包抱枕*1个,限120个字以内
     */
    private String item_desc;
    /**
     * 联系方式,当发货的物流公司为顺丰时,联系方式为必填,收件人或寄件人联系方式二选一
     */
    private Contact contact;
}
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
@@ -54,7 +54,7 @@
        server-addr: 127.0.0.1:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: cdf47c5f-2bf9-4dec-a616-a8dc653aceb9
        namespace: 20c168da-8cf1-4fff-bc38-bc62df656b6a
        username: nacos
        password: nacos
      config:
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -162,7 +162,7 @@
            o.order_status,
            o.order_number,
            o.order_type,
            o.distribution_mode,
            case when o.order_type = 1 then 1 else o.distribution_mode end as distributionMode,
            o.address_Json,
            o.create_time,
            o.app_user_id,
@@ -171,6 +171,7 @@
            og.good_json,
            og.selling_price orderMoney,
            o.express_json,
            o.serial_number,
            o.deliver_province province,
            o.deliver_province_code provinceCode,
            o.deliver_city city,