Commit 7fef594390687955ba85d220d06d108131b06a54

Authored by YunaiV
1 parent c21e8886

订单接口的梳理

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