From 7fef594390687955ba85d220d06d108131b06a54 Mon Sep 17 00:00:00 2001
From: YunaiV <zhijiantianya@gmail.com>
Date: Sun, 14 May 2023 17:35:34 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=8E=A5=E5=8F=A3=E7=9A=84?=
 =?UTF-8?q?=E6=A2=B3=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../product/enums/ErrorCodeConstants.java     |   4 +-
 .../dataobject/delivery/PickUpStoreDO.java    |  20 +--
 .../service/spu/ProductSpuServiceImpl.java    |  16 +-
 .../seckilltime/SeckillTimeMapper.java        |   5 -
 .../enums/order/TradeOrderStatusEnum.java     |   2 -
 .../admin/order/vo/TradeOrderBaseVO.java      |   4 -
 .../app/order/AppTradeOrderController.http    |   6 +-
 .../app/order/AppTradeOrderController.java    | 109 ++++++++++--
 .../order/vo/AppTradeOrderCreateReqVO.java    |  34 +---
 .../order/vo/AppTradeOrderDetailRespVO.java   |   9 +-
 .../vo/AppTradeOrderGetCreateInfoRespVO.java  | 168 ------------------
 .../order/vo/AppTradeOrderPageItemRespVO.java |   5 +
 .../vo/AppTradeOrderSettlementReqVO.java      |  23 +++
 .../vo/AppTradeOrderSettlementRespVO.java     | 116 ++++++++++++
 .../convert/order/TradeOrderConvert.java      |   1 -
 .../dal/dataobject/order/TradeOrderDO.java    |   4 -
 .../dataobject/order/TradeOrderItemDO.java    |   7 +
 .../service/order/TradeOrderServiceImpl.java  |  54 +++---
 .../service/order/TradeOrderServiceTest.java  |  12 +-
 .../app/address/vo/AppAddressBaseVO.java      |   7 +-
 .../dal/dataobject/address/AddressDO.java     |   4 -
 .../admin/order/vo/PayOrderBaseVO.java        |   4 +
 .../app/order/AppPayOrderController.java      |  19 +-
 .../pay/convert/order/PayOrderConvert.java    |   2 +-
 24 files changed, 344 insertions(+), 291 deletions(-)
 delete mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderGetCreateInfoRespVO.java
 create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java
 create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java

diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
index 0ae400999..ed0a95445 100644
--- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
+++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
@@ -49,7 +49,7 @@ public interface ErrorCodeConstants {
     ErrorCode COMMENT_ADDITIONAL_EXISTS  = new ErrorCode(1008007003, "商品追加评价已存在");
 
     // ========== 商品 收藏 1008008000 ==========
-    ErrorCode PRODUCT_FAVORITE_EXISTS = new ErrorCode(1008008000, "该商品已经被收藏");
-    ErrorCode PRODUCT_FAVORITE_NOT_EXISTS = new ErrorCode(1008008001, "商品收藏不存在");
+    ErrorCode FAVORITE_EXISTS = new ErrorCode(1008008000, "该商品已经被收藏");
+    ErrorCode FAVORITE_NOT_EXISTS = new ErrorCode(1008008001, "商品收藏不存在");
 
 }
diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/delivery/PickUpStoreDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/delivery/PickUpStoreDO.java
index b773aefd4..ce381123d 100644
--- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/delivery/PickUpStoreDO.java
+++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/delivery/PickUpStoreDO.java
@@ -1,14 +1,15 @@
 package cn.iocoder.yudao.module.product.dal.dataobject.delivery;
 
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.time.LocalTime;
 
+// TODO @Jason:DeliveryPickUpStoreDO
 /**
  * 自提门店 DO
  *
@@ -18,6 +19,7 @@ import java.time.LocalTime;
 @KeySequence("pick_up_store_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
 public class PickUpStoreDO extends BaseDO {
+
     /**
      * 编号,自增
      */
@@ -40,17 +42,18 @@ public class PickUpStoreDO extends BaseDO {
     private String phone;
 
     /**
-     * 区域id
+     * 区域 id
      */
     private Integer areaId;
 
+    // TODO Jason:改成 detailAddress,主要和 AddressDO 保持一致哈
     /**
      * 门店详细地址
      */
     private String address;
 
     /**
-     * 门店logo
+     * 门店 logo
      */
     private String logo;
 
@@ -58,7 +61,6 @@ public class PickUpStoreDO extends BaseDO {
      * 营业开始时间
      */
     private LocalTime openingTime;
-
     /**
      * 营业结束时间
      */
@@ -68,18 +70,16 @@ public class PickUpStoreDO extends BaseDO {
      * 纬度
      */
     private String latitude;
-
     /**
      * 经度
      */
     private String longitude;
 
     /**
-     * 门店状态(0正常 1停用)
+     * 门店状态
+     *
+     * 枚举 {@link CommonStatusEnum}
      */
     private Integer status;
 
-
-    @TableField(exist = false)
-    private static final long serialVersionUID = 1L;
-}
\ No newline at end of file
+}
diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
index fd1cac880..b047dec4e 100755
--- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
+++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
@@ -2,14 +2,18 @@ package cn.iocoder.yudao.module.product.service.spu;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO;
 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
+import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
@@ -180,8 +184,16 @@ public class ProductSpuServiceImpl implements ProductSpuService {
 
     @Override
     public PageResult<ProductSpuDO> getSpuPage(AppProductSpuPageReqVO pageReqVO) {
-        //return productSpuMapper.selectPage(pageReqVO); TODO 有差异接口接受参数类型不对
-        return null;
+        // 查找时,如果查找某个分类编号,则包含它的子分类。因为顶级分类不包含商品
+        Set<Long> categoryIds = new HashSet<>();
+        if (pageReqVO.getCategoryId() != null && pageReqVO.getCategoryId() > 0) {
+            categoryIds.add(pageReqVO.getCategoryId());
+            List<ProductCategoryDO> categoryChildren = categoryService.getEnableCategoryList(new ProductCategoryListReqVO()
+                    .setParentId(pageReqVO.getCategoryId()).setStatus(CommonStatusEnum.ENABLE.getStatus()));
+            categoryIds.addAll(CollectionUtils.convertList(categoryChildren, ProductCategoryDO::getId));
+        }
+        // 分页查询
+        return productSpuMapper.selectPage(pageReqVO, categoryIds);
     }
 
     @Override
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java
index c34484e8c..46cfe5d3a 100644
--- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java
@@ -10,11 +10,6 @@ import java.time.LocalTime;
 import java.util.Collection;
 import java.util.List;
 
-/**
- * 秒杀时段 Mapper
- *
- * @author halfninety
- */
 @Mapper
 public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> {
 
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
index 06fc3821e..86d3d996f 100644
--- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
@@ -23,8 +23,6 @@ public enum TradeOrderStatusEnum implements IntArrayValuable {
     COMPLETED(30, "已完成"),
     CANCELED(40, "已取消");
 
-    // TODO 芋艿: TAKE("待核验"):虚拟订单需要核验商品
-
     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderStatusEnum::getStatus).toArray();
 
     /**
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
index b7e034bbb..a1428c436 100755
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
@@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
-import java.util.Date;
 
 /**
 * 交易订单 Base VO,提供给添加、修改、详细的子 VO 使用
@@ -118,9 +117,6 @@ public class TradeOrderBaseVO {
     @Schema(description = "收件人地区编号", required = true, example = "110000")
     private Integer receiverAreaId;
 
-    @Schema(description = "收件人邮编", required = true, example = "100000")
-    private Integer receiverPostCode;
-
     @Schema(description = "收件人详细地址", required = true, example = "中关村大街 1 号")
     private String receiverDetailAddress;
 
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
index 8e7746359..8a3ed4867 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
@@ -1,6 +1,6 @@
-### /trade-order/confirm-create-order-info 基于商品,确认创建订单
-GET {{appApi}}/trade/order/get-create-info?items[0].skuId=1&items[0].count=1
-Authorization: Bearer {{user-access-token}}
+### /trade-order/settlement 获得订单结算信息
+GET {{appApi}}/trade/order/settlement?cartIds=1
+Authorization: Bearer {{appToken}}
 tenant-id: {{appTenentId}}
 
 ### /trade-order/confirm-create-order-info-from-cart 基于购物车,确认创建订单
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
index 4a36d4acc..945964b16 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
@@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.trade.controller.app.order;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
 import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
 import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi;
 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
+import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.*;
 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -21,7 +21,11 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -40,12 +44,78 @@ public class AppTradeOrderController {
     @Resource
     private ProductPropertyValueApi productPropertyValueApi;
 
-    @GetMapping("/get-create-info")
-    @Operation(summary = "基于商品,确认创建订单")
+    @GetMapping("/settlement")
+    @Operation(summary = "获得订单结算信息")
     @PreAuthenticated
-    public CommonResult<AppTradeOrderGetCreateInfoRespVO> getOrderCreateInfo(AppTradeOrderCreateReqVO createReqVO) {
+    public CommonResult<AppTradeOrderSettlementRespVO> settlementOrder(
+            @Valid AppTradeOrderSettlementReqVO settlementReqVO) {
 //        return success(tradeOrderService.getOrderConfirmCreateInfo(UserSecurityContextHolder.getUserId(), skuId, quantity, couponCardId));
-        return null;
+        AppTradeOrderSettlementRespVO settlement = new AppTradeOrderSettlementRespVO();
+
+        AppTradeOrderSettlementRespVO.Price price = new AppTradeOrderSettlementRespVO.Price();
+        price.setOriginalPrice(1000);
+        price.setDeliveryPrice(200);
+        price.setCouponPrice(100);
+        price.setPointPrice(50);
+        price.setPayPrice(950);
+
+        List<AppTradeOrderSettlementRespVO.Item> skus = new ArrayList<>();
+
+        AppTradeOrderSettlementRespVO.Item item1 = new AppTradeOrderSettlementRespVO.Item();
+        item1.setCartId(1L);
+        item1.setSpuId(2048L);
+        item1.setSpuName("Apple iPhone 12");
+        item1.setSkuId(1024);
+        item1.setPrice(500);
+        item1.setPicUrl("https://pro.crmeb.net/uploads/attach/2022/10/12/0c56f9abb80d2775fc1e80dbe4f8826a.jpg");
+        item1.setCount(2);
+        List<AppProductPropertyValueDetailRespVO> properties1 = new ArrayList<>();
+        AppProductPropertyValueDetailRespVO property1 = new AppProductPropertyValueDetailRespVO();
+        property1.setPropertyId(1L);
+        property1.setPropertyName("尺寸");
+        property1.setValueId(2L);
+        property1.setValueName("大");
+        properties1.add(property1);
+        item1.setProperties(properties1);
+
+        AppTradeOrderSettlementRespVO.Item item2 = new AppTradeOrderSettlementRespVO.Item();
+        item2.setCartId(2L);
+        item2.setSpuId(3072L);
+        item2.setSpuName("Samsung Galaxy S21");
+        item2.setSkuId(2048);
+        item2.setPrice(800);
+        item2.setPicUrl("https://pro.crmeb.net/uploads/attach/2022/10/12/0c56f9abb80d2775fc1e80dbe4f8826a.jpg");
+        item2.setCount(1);
+        List<AppProductPropertyValueDetailRespVO> properties2 = new ArrayList<>();
+        AppProductPropertyValueDetailRespVO property2 = new AppProductPropertyValueDetailRespVO();
+        property2.setPropertyId(10L);
+        property2.setPropertyName("颜色");
+        property2.setValueId(20L);
+        property2.setValueName("白色");
+        properties2.add(property2);
+        item2.setProperties(properties2);
+
+        skus.add(item1);
+        skus.add(item2);
+
+        settlement.setItems(skus);
+        settlement.setPrice(price);
+
+        AppTradeOrderSettlementRespVO.Address address = new AppTradeOrderSettlementRespVO.Address();
+        address.setId(1L);
+        address.setName("John");
+        address.setMobile("18888888888");
+        address.setProvinceId(1L);
+        address.setProvinceName("Beijing");
+        address.setCityId(1L);
+        address.setCityName("Beijing");
+        address.setDistrictId(1L);
+        address.setDistrictName("Chaoyang Distripct");
+        address.setDetailAddress("No. 10, Xinzhong Street, Chaoyang District");
+        address.setDefaulted(true);
+        settlement.setAddress(address);
+
+        return success(settlement);
     }
 
     @PostMapping("/create")
@@ -53,12 +123,13 @@ public class AppTradeOrderController {
     @PreAuthenticated
     public CommonResult<Long> createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
                                           HttpServletRequest servletRequest) {
-        // 获取登录用户、用户 IP 地址
-        Long loginUserId = getLoginUserId();
-        String clientIp = ServletUtils.getClientIP(servletRequest);
-        // 创建交易订单,预支付记录
-        Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO);
-        return success(orderId);
+        return success(1L);
+//        // 获取登录用户、用户 IP 地址
+//        Long loginUserId = getLoginUserId();
+//        String clientIp = ServletUtils.getClientIP(servletRequest);
+//        // 创建交易订单,预支付记录
+//        Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO);
+//        return success(orderId);
     }
 
     @PostMapping("/update-paid")
@@ -85,7 +156,7 @@ public class AppTradeOrderController {
     }
 
     @GetMapping("/page")
-    @Operation(summary = "获得订单交易分页")
+    @Operation(summary = "获得交易订单分页")
     public CommonResult<PageResult<AppTradeOrderPageItemRespVO>> getOrderPage(AppTradeOrderPageReqVO reqVO) {
         // 查询订单
         PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(getLoginUserId(), reqVO);
@@ -99,4 +170,18 @@ public class AppTradeOrderController {
         return success(TradeOrderConvert.INSTANCE.convertPage02(pageResult, orderItems, propertyValueDetails));
     }
 
+    // TODO 芋艿:后续实现
+    @GetMapping("/get-count")
+    @Operation(summary = "获得交易订单数量")
+    public CommonResult<Map<String, Integer>> getOrderCount() {
+        Map<String, Integer> orderCount = new HashMap<>();
+        orderCount.put("allCount", 10);
+        orderCount.put("unpaidCount", 5);
+        orderCount.put("undeliveredCount", 2);
+        orderCount.put("deliveredCount", 1);
+        orderCount.put("uncommentedCount", 3);
+        orderCount.put("allPrice", 300);
+        return success(orderCount);
+    }
+
 }
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
index 6c881defe..26c48954c 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
@@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.trade.controller.app.order.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
@@ -20,33 +18,13 @@ public class AppTradeOrderCreateReqVO {
     @Schema(description = "优惠劵编号", example = "1024")
     private Long couponId;
 
+    @Schema(description = "购物车项的编号数组", required = true, example = "true")
+    @NotEmpty(message = "购物车项不能为空")
+    private List<Long> cartIds;
+
+    // ========== 非 AppTradeOrderSettlementReqVO 字段 ==========
+
     @Schema(description = "备注", example = "这个是我的订单哟")
     private String remark;
 
-    @Schema(description = "是否来自购物车", required = true, example = "true") // true - 来自购物车;false - 立即购买
-    @NotNull(message = "是否来自购物车不能为空")
-    private Boolean fromCart;
-
-    /**
-     * 订单商品项列表
-     */
-    @NotEmpty(message = "必须选择购买的商品")
-    @Valid
-    private List<Item> items;
-
-    @Schema(description = "订单商品项")
-    @Data
-    public static class Item {
-
-        @Schema(description = "商品 SKU 编号", required = true, example = "111")
-        @NotNull(message = "商品 SKU 编号不能为空")
-        private Long skuId;
-
-        @Schema(description = "商品 SKU 购买数量", required = true, example = "1024")
-        @NotNull(message = "商品 SKU 购买数量不能为空")
-        @Min(value = 1, message = "商品 SKU 购买数量必须大于 0")
-        private Integer count;
-
-    }
-
 }
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
index c8a57bacb..54d012fdd 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
@@ -40,12 +40,18 @@ public class AppTradeOrderDetailRespVO {
 
     // ========== 价格 + 支付基本信息 ==========
 
+    @Schema(description = "是否已支付", required = true, example = "true")
+    private Boolean payed;
+
     @Schema(description = "支付订单编号", required = true, example = "1024")
     private Long payOrderId;
 
     @Schema(description = "付款时间")
     private LocalDateTime payTime;
 
+    @Schema(description = "支付渠道", required = true, example = "wx_lite_pay")
+    private String payChannelCode;
+
     @Schema(description = "商品原价(总)", required = true, example = "1000")
     private Integer originalPrice;
 
@@ -87,9 +93,6 @@ public class AppTradeOrderDetailRespVO {
     @Schema(description = "收件人地区名字", required = true, example = "上海 上海市 普陀区")
     private String receiverAreaName;
 
-    @Schema(description = "收件人邮编", required = true, example = "100000")
-    private Integer receiverPostCode;
-
     @Schema(description = "收件人详细地址", required = true, example = "中关村大街 1 号")
     private String receiverDetailAddress;
 
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderGetCreateInfoRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderGetCreateInfoRespVO.java
deleted file mode 100644
index 86a1b61b7..000000000
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderGetCreateInfoRespVO.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package cn.iocoder.yudao.module.trade.controller.app.order.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.util.List;
-
-@Schema(description = "用户 App - 订单获得创建信息 Response VO")
-@Data
-public class AppTradeOrderGetCreateInfoRespVO {
-
-    /**
-     * 商品分组数组
-     */
-    private List<ItemGroup> itemGroups;
-    /**
-     * 费用
-     */
-    private Fee fee;
-
-//    /**
-//     * 优惠劵列表 TODO 芋艿,后续改改
-//     */
-//    private List<CouponCardAvailableRespDTO> coupons;
-
-    @Schema(description = "商品分组") // 多个商品,参加同一个活动,从而形成分组
-    @Data
-    public static class ItemGroup {
-
-//        /**
-//         * 优惠活动
-//         */
-//        private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
-        /**
-         * 商品 SKU 数组
-         */
-        private List<Sku> items;
-
-    }
-
-    @Schema(description = "商品 SKU")
-    @Data
-    public static class Sku {
-
-        // SKU 自带信息
-        @Schema(description = "SKU 编号", required = true, example = "1024")
-        private Integer id;
-        /**
-         * SPU 信息
-         */
-        private Spu spu;
-        /**
-         * 图片地址
-         */
-        private String picURL;
-//        /**
-//         * 属性数组
-//         */
-//        private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
-        /**
-         * 价格,单位:分
-         */
-        private Integer price;
-        /**
-         * 库存数量
-         */
-        private Integer stock;
-
-        // 非 SKU 自带信息
-
-        /**
-         * 购买数量
-         */
-        private Integer buyQuantity;
-//        /**
-//         * 优惠活动
-//         */
-//        private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
-        /**
-         * 原始单价,单位:分。
-         */
-        private Integer originPrice;
-        /**
-         * 购买单价,单位:分
-         */
-        private Integer buyPrice;
-        /**
-         * 最终价格,单位:分。
-         */
-        private Integer presentPrice;
-        /**
-         * 购买总金额,单位:分
-         *
-         * 用途类似 {@link #presentTotal}
-         */
-        private Integer buyTotal;
-        /**
-         * 优惠总金额,单位:分。
-         */
-        private Integer discountTotal;
-        /**
-         * 最终总金额,单位:分。
-         *
-         * 注意,presentPrice * quantity 不一定等于 presentTotal 。
-         * 因为,存在无法整除的情况。
-         * 举个例子,presentPrice = 8.33 ,quantity = 3 的情况,presentTotal 有可能是 24.99 ,也可能是 25 。
-         * 所以,需要存储一个该字段。
-         */
-        private Integer presentTotal;
-
-    }
-
-    @Data
-    public static class Spu {
-
-        /**
-         * SPU 编号
-         */
-        private Integer id;
-
-        // ========== 基本信息 =========
-        /**
-         * SPU 名字
-         */
-        private String name;
-        /**
-         * 分类编号
-         */
-        private Integer cid;
-        /**
-         * 商品主图地址
-         *
-         * 数组,以逗号分隔
-         *
-         * 建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张
-         */
-        private List<String> picUrls;
-
-    }
-
-    @Schema(description = "费用(合计)")
-    @Data
-    @AllArgsConstructor
-    public static class Fee {
-
-        @Schema(description = "购买总价", required = true, example = "1024")
-        private Integer buyPrice;
-        /**
-         * 优惠总价
-         *
-         * 注意,满多少元包邮,不算在优惠中。
-         */
-        private Integer discountTotal;
-        /**
-         * 邮费
-         */
-        private Integer postageTotal;
-        /**
-         * 最终价格
-         *
-         * 计算公式 = 总价 - 优惠总价 + 邮费
-         */
-        private Integer presentTotal;
-
-    }
-
-}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
index d601553e6..75928c946 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
@@ -22,6 +22,11 @@ public class AppTradeOrderPageItemRespVO {
     @Schema(description = "购买的商品数量", required = true, example = "10")
     private Integer productCount;
 
+    // ========== 价格 + 支付基本信息 ==========
+
+    @Schema(description = "应付金额,单位:分", required = true, example = "1000")
+    private Integer payPrice;
+
     /**
      * 订单项数组
      */
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java
new file mode 100644
index 000000000..973db183e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java
@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.trade.controller.app.order.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Schema(description = "用户 App - 交易订单结算 Request VO")
+@Data
+public class AppTradeOrderSettlementReqVO {
+
+    @Schema(description = "收件地址编号", example = "1")
+    private Long addressId;
+
+    @Schema(description = "优惠劵编号", example = "1024")
+    private Long couponId;
+
+    @Schema(description = "购物车项的编号数组", required = true, example = "true")
+    @NotEmpty(message = "购物车项不能为空")
+    private List<Long> cartIds;
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
new file mode 100644
index 000000000..3e3dc9d08
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
@@ -0,0 +1,116 @@
+package cn.iocoder.yudao.module.trade.controller.app.order.vo;
+
+import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Schema(description = "用户 App - 交易订单结算信息 Response VO")
+@Data
+public class AppTradeOrderSettlementRespVO {
+
+    @Schema(description = "购物项数组", required = true)
+    private List<Item> items;
+
+    @Schema(description = "费用", required = true)
+    private Price price;
+
+    @Schema(description = "收件地址", required = true)
+    private Address address;
+
+    @Schema(description = "购物项")
+    @Data
+    public static class Item {
+
+        // ========== SPU 信息 ==========
+
+        @Schema(description = "SPU 编号", required = true, example = "2048")
+        private Long spuId;
+        @Schema(description = "SPU 名字", required = true, example = "Apple iPhone 12")
+        private String spuName;
+
+        // ========== SKU 信息 ==========
+
+        @Schema(description = "SKU 编号", required = true, example = "1024")
+        private Integer skuId;
+        @Schema(description = "价格,单位:分", required = true, example = "100")
+        private Integer price;
+        @Schema(description = "图片地址", required = true, example = "https://www.iocoder.cn/1.png")
+        private String picUrl;
+
+        @Schema(description = "属性数组", required = true, example = "100")
+        private List<AppProductPropertyValueDetailRespVO> properties;
+
+        // ========== 购物车信息 ==========
+
+        @Schema(description = "购物车编号", required = true, example = "100")
+        private Long cartId;
+
+        @Schema(description = "购买数量", required = true, example = "1")
+        private Integer count;
+
+    }
+
+    @Schema(description = "费用(合计)")
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class Price {
+
+        @Schema(description = "商品原价(总),单位:分", required = true, example = "500")
+        private Integer originalPrice;
+
+        @Schema(description = "运费金额,单位:分", required = true, example = "50")
+        private Integer deliveryPrice;
+
+        @Schema(description = "优惠劵减免金额,单位:分", required = true, example = "100")
+        private Integer couponPrice;
+
+        @Schema(description = "积分抵扣的金额,单位:分", required = true, example = "50")
+        private Integer pointPrice;
+
+        @Schema(description = "实际支付金额(总),单位:分", required = true, example = "450")
+        private Integer payPrice;
+
+    }
+
+    @Schema(description = "费用(合计)")
+    @Data
+    public static class Address {
+
+        @Schema(description = "编号", required = true, example = "1")
+        private Long id;
+
+        @Schema(description = "收件人名称", required = true, example = "小王")
+        private String name;
+
+        @Schema(description = "手机号", required = true, example = "15601691300")
+        private String mobile;
+
+        @Schema(description = "省份编号", required = true, example = "1")
+        private Long provinceId;
+        @Schema(description = "省份名字", required = true, example = "北京")
+        private String provinceName;
+
+        @Schema(description = "城市编号", required = true, example = "1")
+        private Long cityId;
+        @Schema(description = "城市名字", required = true, example = "北京")
+        private String cityName;
+
+        @Schema(description = "地区编号", required = true, example = "1")
+        private Long districtId;
+        @Schema(description = "地区名字", required = true, example = "朝阳区")
+        private String districtName;
+
+        @Schema(description = "详细地址", required = true, example = "望京悠乐汇 A 座")
+        private String detailAddress;
+
+        @Schema(description = "是否默认收件地址", required = true, example = "true")
+        private Boolean defaulted;
+
+    }
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
index b1f0b4b2a..db8ea6879 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -50,7 +50,6 @@ public interface TradeOrderConvert {
             @Mapping(source = "address.name", target = "receiverName"),
             @Mapping(source = "address.mobile", target = "receiverMobile"),
             @Mapping(source = "address.areaId", target = "receiverAreaId"),
-            @Mapping(source = "address.postCode", target = "receiverPostCode"),
             @Mapping(source = "address.detailAddress", target = "receiverDetailAddress"),
     })
     TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO,
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
index 49d60ee37..9d031a905 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
@@ -212,10 +212,6 @@ public class TradeOrderDO extends BaseDO {
      * 收件人地区编号
      */
     private Integer receiverAreaId;
-    /**
-     * 收件人邮编
-     */
-    private Integer receiverPostCode;
     /**
      * 收件人详细地址
      */
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
index f8438030b..0bc403f0e 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
+import cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartDO;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -42,6 +43,12 @@ public class TradeOrderItemDO extends BaseDO {
      * 关联 {@link TradeOrderDO#getId()}
      */
     private Long orderId;
+    /**
+     * 购物车项编号
+     *
+     * 关联 {@link TradeCartDO#getId()}
+     */
+    private Long cartId;
 
     // ========== 商品基本信息; 冗余较多字段,减少关联查询 ==========
     /**
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
index 464cb86a7..9ae7def15 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
@@ -30,7 +30,6 @@ import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
-import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO.Item;
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -49,7 +48,8 @@ import java.time.LocalDateTime;
 import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_ORDER_NOT_FOUND;
 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
 
@@ -92,7 +92,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     @Transactional(rollbackFor = Exception.class)
     public Long createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) {
         // 商品 SKU 检查:可售状态、库存
-        List<ProductSkuRespDTO> skus = validateSkuSaleable(createReqVO.getItems());
+//        List<ProductSkuRespDTO> skus = validateSkuSaleable(createReqVO.getItems()); // TODO 芋艿,临时关闭。
+        List<ProductSkuRespDTO> skus = null;
         // 商品 SPU 检查:可售状态
         List<ProductSpuRespDTO> spus = validateSpuSaleable(convertSet(skus, ProductSkuRespDTO::getSpuId));
         // 用户收件地址的校验
@@ -112,28 +113,28 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         return tradeOrderDO.getId();
     }
 
-    /**
-     * 校验商品 SKU 是否可出售
-     *
-     * @param items 商品 SKU
-     * @return 商品 SKU 数组
-     */
-    private List<ProductSkuRespDTO> validateSkuSaleable(List<Item> items) {
-        List<ProductSkuRespDTO> skus = productSkuApi.getSkuList(convertSet(items, Item::getSkuId));
-        // SKU 不存在
-        if (items.size() != skus.size()) {
-            throw exception(ORDER_CREATE_SKU_NOT_FOUND);
-        }
-        // 校验库存不足
-        Map<Long, ProductSkuRespDTO> skuMap = convertMap(skus, ProductSkuRespDTO::getId);
-        items.forEach(item -> {
-            ProductSkuRespDTO sku = skuMap.get(item.getSkuId());
-            if (item.getCount() > sku.getStock()) {
-                throw exception(ErrorCodeConstants.ORDER_CREATE_SKU_STOCK_NOT_ENOUGH);
-            }
-        });
-        return skus;
-    }
+//    /**
+//     * 校验商品 SKU 是否可出售
+//     *
+//     * @param items 商品 SKU
+//     * @return 商品 SKU 数组
+//     */
+//    private List<ProductSkuRespDTO> validateSkuSaleable(List<Item> items) {
+//        List<ProductSkuRespDTO> skus = productSkuApi.getSkuList(convertSet(items, Item::getSkuId));
+//        // SKU 不存在
+//        if (items.size() != skus.size()) {
+//            throw exception(ORDER_CREATE_SKU_NOT_FOUND);
+//        }
+//        // 校验库存不足
+//        Map<Long, ProductSkuRespDTO> skuMap = convertMap(skus, ProductSkuRespDTO::getId);
+//        items.forEach(item -> {
+//            ProductSkuRespDTO sku = skuMap.get(item.getSkuId());
+//            if (item.getCount() > sku.getStock()) {
+//                throw exception(ErrorCodeConstants.ORDER_CREATE_SKU_STOCK_NOT_ENOUGH);
+//            }
+//        });
+//        return skus;
+//    }
 
     /**
      * 校验商品 SPU 是否可出售
@@ -506,6 +507,9 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
     @Override
     public List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds) {
+        if (CollUtil.isEmpty(orderIds)) {
+            return Collections.emptyList();
+        }
         return tradeOrderItemMapper.selectListByOrderId(orderIds);
     }
 
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
index 3c1a44057..55418d52b 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
@@ -1,6 +1,5 @@
 package cn.iocoder.yudao.module.trade.service.order;
 
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.module.member.api.address.AddressApi;
@@ -93,10 +92,12 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
         // 准备参数
         Long userId = 100L;
         String userIp = "127.0.0.1";
-        AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO()
-                .setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true)
-                .setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3),
-                        new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4)));
+//        AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO()
+//                .setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true)
+//                .setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3),
+//                        new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4)));
+        AppTradeOrderCreateReqVO reqVO = null;
+        // TODO 芋艿:重新高下
         // mock 方法(商品 SKU 检查)
         ProductSkuRespDTO sku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(1L).setSpuId(11L)
                 .setPrice(50).setStock(100)
@@ -183,7 +184,6 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
         assertEquals(tradeOrderDO.getReceiverName(), "芋艿");
         assertEquals(tradeOrderDO.getReceiverMobile(), "15601691300");
         assertEquals(tradeOrderDO.getReceiverAreaId(), 3306);
-        assertEquals(tradeOrderDO.getReceiverPostCode(), 85757);
         assertEquals(tradeOrderDO.getReceiverDetailAddress(), "土豆村");
         assertEquals(tradeOrderDO.getAfterSaleStatus(), TradeOrderAfterSaleStatusEnum.NONE.getStatus());
         assertEquals(tradeOrderDO.getRefundPrice(), 0);
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/vo/AppAddressBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/vo/AppAddressBaseVO.java
index f207ad8be..480403271 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/vo/AppAddressBaseVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/vo/AppAddressBaseVO.java
@@ -1,10 +1,11 @@
 package cn.iocoder.yudao.module.member.controller.app.address.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
+// TODO 芋艿:example 缺失
 /**
 * 用户收件地址 Base VO,提供给添加、修改、详细的子 VO 使用
 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
@@ -24,10 +25,6 @@ public class AppAddressBaseVO {
     @NotNull(message = "地区编号不能为空")
     private Long areaId;
 
-    @Schema(description = "邮编", required = true)
-    @NotEmpty(message = "邮编不能为空")
-    private String postCode;
-
     @Schema(description = "收件详细地址", required = true)
     @NotNull(message = "收件详细地址不能为空")
     private String detailAddress;
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/AddressDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/AddressDO.java
index 467432460..7d8a96250 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/AddressDO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/address/AddressDO.java
@@ -40,10 +40,6 @@ public class AddressDO extends BaseDO {
      * 地区编号
      */
     private Long areaId;
-    /**
-     * 邮编
-     */
-    private String postCode;
     /**
      * 收件详细地址
      */
diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java
index 7991c7c7e..123a119f8 100755
--- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java
+++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java
@@ -55,6 +55,10 @@ public class PayOrderBaseVO {
     @NotNull(message = "支付金额,单位:分不能为空")
     private Long amount;
 
+    @Schema(description = "支付金额,单位:分", required = true)
+    @NotNull(message = "支付金额,单位:分不能为空")
+    private Long price;
+
     @Schema(description = "渠道手续费,单位:百分比")
     private Double channelFeeRate;
 
diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java
index 24a208662..b634909df 100644
--- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java
+++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java
@@ -1,19 +1,18 @@
 package cn.iocoder.yudao.module.pay.controller.app.order;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderRespVO;
 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
 import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
 import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
 import cn.iocoder.yudao.module.pay.convert.order.PayOrderConvert;
 import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
@@ -28,12 +27,20 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getCli
 public class AppPayOrderController {
 
     @Resource
-    private PayOrderService orderService;
+    private PayOrderService payOrderService;
+
+    // TODO 芋艿:临时 demo,技术打样。
+    @GetMapping("/get")
+    @Operation(summary = "获得支付订单")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<PayOrderRespVO> getOrder(@RequestParam("id") Long id) {
+        return success(PayOrderConvert.INSTANCE.convert(payOrderService.getOrder(id)));
+    }
 
     @PostMapping("/submit")
     @Operation(summary = "提交支付订单")
     public CommonResult<AppPayOrderSubmitRespVO> submitPayOrder(@RequestBody AppPayOrderSubmitReqVO reqVO) {
-        PayOrderSubmitRespVO respVO = orderService.submitPayOrder(reqVO, getClientIP());
+        PayOrderSubmitRespVO respVO = payOrderService.submitPayOrder(reqVO, getClientIP());
         return success(PayOrderConvert.INSTANCE.convert3(respVO));
     }
 
diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java
index 825b8e740..a73d528ba 100755
--- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java
+++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java
@@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespD
 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.*;
-import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
 import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO;
@@ -28,6 +27,7 @@ public interface PayOrderConvert {
 
     PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class);
 
+    @Mapping(source = "amount", target = "price")
     PayOrderRespVO convert(PayOrderDO bean);
 
     PayOrderRespDTO convert2(PayOrderDO order);