Commit 7f131a3853eecfe3ee3cba9d4b61363a57683e97

Authored by YunaiV
1 parent b7d78a24

trade:增加用户 App 的订单分页和详情接口

Showing 16 changed files with 366 additions and 174 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
@@ -26,8 +26,12 @@ tenant-id: {{appTenentId}} @@ -26,8 +26,12 @@ tenant-id: {{appTenentId}}
26 ] 26 ]
27 } 27 }
28 28
29 -### /trade-order/page 获得订单交易分页  
30 -GET {{shop-api-base-url}}/trade-order/page?status=1&pageNo=1&pageSize=10  
31 -Content-Type: application/x-www-form-urlencoded 29 +### 获得订单交易的分页
  30 +GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10
  31 +Authorization: Bearer {{appToken}}
  32 +tenant-id: {{appTenentId}}
32 33
33 -### 34 +### 获得订单交易的详细
  35 +GET {{appApi}}/trade/order/get-detail?id=21
  36 +Authorization: Bearer {{appToken}}
  37 +tenant-id: {{appTenentId}}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
@@ -4,12 +4,13 @@ import cn.hutool.extra.servlet.ServletUtil; @@ -4,12 +4,13 @@ import cn.hutool.extra.servlet.ServletUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; 6 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
7 -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;  
8 import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO; 7 import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
9 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;  
10 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderGetCreateInfoRespVO;  
11 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;  
12 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderRespVO; 8 +import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi;
  9 +import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
  10 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.*;
  11 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  12 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  13 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
13 import cn.iocoder.yudao.module.trade.service.order.TradeOrderService; 14 import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
14 import io.swagger.annotations.Api; 15 import io.swagger.annotations.Api;
15 import io.swagger.annotations.ApiImplicitParam; 16 import io.swagger.annotations.ApiImplicitParam;
@@ -20,8 +21,11 @@ import org.springframework.web.bind.annotation.*; @@ -20,8 +21,11 @@ import org.springframework.web.bind.annotation.*;
20 21
21 import javax.annotation.Resource; 22 import javax.annotation.Resource;
22 import javax.servlet.http.HttpServletRequest; 23 import javax.servlet.http.HttpServletRequest;
  24 +import java.util.List;
23 25
24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  28 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
25 29
26 @Api(tags = "用户 App - 交易订单") 30 @Api(tags = "用户 App - 交易订单")
27 @RestController 31 @RestController
@@ -33,6 +37,9 @@ public class AppTradeOrderController { @@ -33,6 +37,9 @@ public class AppTradeOrderController {
33 @Resource 37 @Resource
34 private TradeOrderService tradeOrderService; 38 private TradeOrderService tradeOrderService;
35 39
  40 + @Resource
  41 + private ProductPropertyValueApi productPropertyValueApi;
  42 +
36 @GetMapping("/get-create-info") 43 @GetMapping("/get-create-info")
37 @ApiOperation("基于商品,确认创建订单") 44 @ApiOperation("基于商品,确认创建订单")
38 @PreAuthenticated 45 @PreAuthenticated
@@ -47,7 +54,7 @@ public class AppTradeOrderController { @@ -47,7 +54,7 @@ public class AppTradeOrderController {
47 public CommonResult<Long> createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO, 54 public CommonResult<Long> createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
48 HttpServletRequest servletRequest) { 55 HttpServletRequest servletRequest) {
49 // 获取登录用户、用户 IP 地址 56 // 获取登录用户、用户 IP 地址
50 - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); 57 + Long loginUserId = getLoginUserId();
51 String clientIp = ServletUtil.getClientIP(servletRequest); 58 String clientIp = ServletUtil.getClientIP(servletRequest);
52 // 创建交易订单,预支付记录 59 // 创建交易订单,预支付记录
53 Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO); 60 Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO);
@@ -62,19 +69,34 @@ public class AppTradeOrderController { @@ -62,19 +69,34 @@ public class AppTradeOrderController {
62 return success(true); 69 return success(true);
63 } 70 }
64 71
65 - @GetMapping("/get") 72 + @GetMapping("/get-detail")
66 @ApiOperation("获得交易订单") 73 @ApiOperation("获得交易订单")
67 - @ApiImplicitParam(name = "tradeOrderId", value = "交易订单编号", required = true, dataTypeClass = Long.class)  
68 - public CommonResult<AppTradeOrderRespVO> getTradeOrder(@RequestParam("tradeOrderId") Integer tradeOrderId) {  
69 -// return success(tradeOrderService.getTradeOrder(tradeOrderId));  
70 - return null; 74 + @ApiImplicitParam(name = "id", value = "交易订单编号", required = true, dataTypeClass = Long.class)
  75 + public CommonResult<AppTradeOrderDetailRespVO> getOrder(@RequestParam("id") Long id) {
  76 + // 查询订单
  77 + TradeOrderDO order = tradeOrderService.getOrder(getLoginUserId(), id);
  78 + // 查询订单项
  79 + List<TradeOrderItemDO> orderItems = tradeOrderService.getOrderItemListByOrderId(order.getId());
  80 + // 查询商品属性
  81 + List<ProductPropertyValueDetailRespDTO> propertyValueDetails = productPropertyValueApi
  82 + .getPropertyValueDetailList(TradeOrderConvert.INSTANCE.convertPropertyValueIds(orderItems));
  83 + // 最终组合
  84 + return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, propertyValueDetails));
71 } 85 }
72 86
73 @GetMapping("/page") 87 @GetMapping("/page")
74 @ApiOperation("获得订单交易分页") 88 @ApiOperation("获得订单交易分页")
75 - public CommonResult<PageResult<AppTradeOrderRespVO>> pageTradeOrder(AppTradeOrderPageReqVO pageVO) {  
76 -// return success(tradeOrderService.pageTradeOrder(UserSecurityContextHolder.getUserId(), pageVO));  
77 - return null; 89 + public CommonResult<PageResult<AppTradeOrderPageItemRespVO>> getOrderPage(AppTradeOrderPageReqVO reqVO) {
  90 + // 查询订单
  91 + PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(getLoginUserId(), reqVO);
  92 + // 查询订单项
  93 + List<TradeOrderItemDO> orderItems = tradeOrderService.getOrderItemListByOrderId(
  94 + convertSet(pageResult.getList(), TradeOrderDO::getId));
  95 + // 查询商品属性
  96 + List<ProductPropertyValueDetailRespDTO> propertyValueDetails = productPropertyValueApi
  97 + .getPropertyValueDetailList(TradeOrderConvert.INSTANCE.convertPropertyValueIds(orderItems));
  98 + // 最终组合
  99 + return success(TradeOrderConvert.INSTANCE.convertPage02(pageResult, orderItems, propertyValueDetails));
78 } 100 }
79 101
80 } 102 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.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.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +import java.util.Date;
  10 +import java.util.List;
  11 +
  12 +@ApiModel("用户 App - 订单交易的明细 Response VO")
  13 +@Data
  14 +public class AppTradeOrderDetailRespVO {
  15 +
  16 + // ========== 订单基本信息 ==========
  17 +
  18 + @ApiModelProperty(value = "订单编号", required = true, example = "1024")
  19 + private Long id;
  20 +
  21 + @ApiModelProperty(value = "订单流水号", required = true, example = "1146347329394184195")
  22 + private String no;
  23 +
  24 + @ApiModelProperty(value = "创建时间", required = true, notes = "下单时间")
  25 + private Date createTime;
  26 +
  27 + @ApiModelProperty(value = "用户备注", required = true, example = "你猜")
  28 + private String userRemark;
  29 +
  30 + @ApiModelProperty(value = "订单状态", required = true, example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
  31 + private Integer status;
  32 +
  33 + @ApiModelProperty(value = "购买的商品数量", required = true, example = "10")
  34 + private Integer productCount;
  35 +
  36 + @ApiModelProperty(value = "订单完成时间")
  37 + private LocalDateTime finishTime;
  38 +
  39 + @ApiModelProperty(value = "订单取消时间")
  40 + private LocalDateTime cancelTime;
  41 +
  42 + // ========== 价格 + 支付基本信息 ==========
  43 +
  44 + @ApiModelProperty(value = "支付订单编号", required = true, example = "1024")
  45 + private Long payOrderId;
  46 +
  47 + @ApiModelProperty(value = "付款时间")
  48 + private LocalDateTime payTime;
  49 +
  50 + @ApiModelProperty(value = "商品原价(总)", required = true, example = "1000", notes = "单位:分")
  51 + private Integer originalPrice;
  52 +
  53 + @ApiModelProperty(value = "订单原价(总)", required = true, example = "1000", notes = "单位:分")
  54 + private Integer orderPrice;
  55 +
  56 + @ApiModelProperty(value = "订单优惠(总)", required = true, example = "100", notes = "单位:分")
  57 + private Integer discountPrice;
  58 +
  59 + @ApiModelProperty(value = "运费金额", required = true, example = "100", notes = "单位:分")
  60 + private Integer deliveryPrice;
  61 +
  62 + @ApiModelProperty(value = "订单调价(总)", required = true, example = "100", notes = "单位:分")
  63 + private Integer adjustPrice;
  64 +
  65 + @ApiModelProperty(value = "应付金额(总)", required = true, example = "1000", notes = "单位:分")
  66 + private Integer payPrice;
  67 +
  68 + // ========== 收件 + 物流基本信息 ==========
  69 +
  70 + @ApiModelProperty(value = "发货物流单号", example = "1024")
  71 + private String logisticsNo;
  72 +
  73 + @ApiModelProperty(value = "发货时间")
  74 + private LocalDateTime deliveryTime;
  75 +
  76 + @ApiModelProperty(value = "收货时间")
  77 + private LocalDateTime receiveTime;
  78 +
  79 + @ApiModelProperty(value = "收件人名称", required = true, example = "张三")
  80 + private String receiverName;
  81 +
  82 + @ApiModelProperty(value = "收件人手机", required = true, example = "13800138000")
  83 + private String receiverMobile;
  84 +
  85 + @ApiModelProperty(value = "收件人地区编号", required = true, example = "110000")
  86 + private Integer receiverAreaId;
  87 +
  88 + @ApiModelProperty(value = "收件人地区名字", required = true, example = "上海 上海市 普陀区")
  89 + private String receiverAreaName;
  90 +
  91 + @ApiModelProperty(value = "收件人邮编", required = true, example = "100000")
  92 + private Integer receiverPostCode;
  93 +
  94 + @ApiModelProperty(value = "收件人详细地址", required = true, example = "中关村大街 1 号")
  95 + private String receiverDetailAddress;
  96 +
  97 + // ========== 售后基本信息 ==========
  98 +
  99 + // ========== 营销基本信息 ==========
  100 +
  101 + @ApiModelProperty(value = "优惠劵编号", example = "1024")
  102 + private Long couponId;
  103 +
  104 + @ApiModelProperty(value = "优惠劵减免金额", required = true, example = "100", notes = "单位:分")
  105 + private Integer couponPrice;
  106 +
  107 + @ApiModelProperty(value = "积分抵扣的金额", required = true, example = "100", notes = "单位:分")
  108 + private Integer pointPrice;
  109 +
  110 + /**
  111 + * 订单项数组
  112 + */
  113 + private List<Item> items;
  114 +
  115 + @ApiModel("用户 App - 交易订单的分页项的订单项目")
  116 + @Data
  117 + public static class Item {
  118 +
  119 + @ApiModelProperty(value = "编号", required = true, example = "1")
  120 + private Long id;
  121 +
  122 + @ApiModelProperty(value = "商品 SPU 编号", required = true, example = "1")
  123 + private Long spuId;
  124 +
  125 + @ApiModelProperty(value = "商品 SPU 名称", required = true, example = "芋道源码")
  126 + private String spuName;
  127 +
  128 + @ApiModelProperty(value = "商品 SKU 编号", required = true, example = "1")
  129 + private Long skuId;
  130 +
  131 + @ApiModelProperty(value = "商品图片", required = true, example = "https://www.iocoder.cn/1.png")
  132 + private String picUrl;
  133 +
  134 + @ApiModelProperty(value = "购买数量", required = true, example = "1")
  135 + private Integer count;
  136 +
  137 + @ApiModelProperty(value = "商品原价(总)", required = true, example = "100", notes = "单位:分")
  138 + private Integer originalPrice;
  139 +
  140 + @ApiModelProperty(value = "商品原价(单)", required = true, example = "100", notes = "单位:分")
  141 + private Integer originalUnitPrice;
  142 +
  143 + /**
  144 + * 属性数组
  145 + */
  146 + private List<AppProductPropertyValueDetailRespVO> properties;
  147 +
  148 + }
  149 +
  150 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderItemRespVO.java deleted
1 -package cn.iocoder.yudao.module.trade.controller.app.order.vo;  
2 -  
3 -import io.swagger.annotations.ApiModel;  
4 -import io.swagger.annotations.ApiModelProperty;  
5 -import lombok.Data;  
6 -  
7 -import java.time.LocalDateTime;  
8 -  
9 -// TODO 芋艿:字段优化  
10 -@ApiModel("交易订单项 Response VO")  
11 -@Data  
12 -public class AppTradeOrderItemRespVO {  
13 -  
14 - @ApiModelProperty(value = "id自增长", required = true)  
15 - private Integer id;  
16 - @ApiModelProperty(value = "订单编号", required = true)  
17 - private Integer orderId;  
18 - @ApiModelProperty(value = "订单项状态", required = true)  
19 - private Integer status;  
20 - @ApiModelProperty(value = "商品 SKU 编号", required = true)  
21 - private Integer skuId;  
22 - @ApiModelProperty(value = "商品 SPU 编号", required = true)  
23 - private Integer spuId;  
24 - @ApiModelProperty(value = "商品名字", required = true)  
25 - private String skuName;  
26 - @ApiModelProperty(value = "图片名字", required = true)  
27 - private String skuImage;  
28 - @ApiModelProperty(value = "商品数量", required = true)  
29 - private Integer quantity;  
30 - @ApiModelProperty(value = "原始单价,单位:分", required = true)  
31 - private Integer originPrice;  
32 - @ApiModelProperty(value = "购买单价,单位:分", required = true)  
33 - private Integer buyPrice;  
34 - @ApiModelProperty(value = "最终价格,单位:分", required = true)  
35 - private Integer presentPrice;  
36 - @ApiModelProperty(value = "购买总金额,单位:分", required = true)  
37 - private Integer buyTotal;  
38 - @ApiModelProperty(value = "优惠总金额,单位:分", required = true)  
39 - private Integer discountTotal;  
40 - @ApiModelProperty(value = "最终总金额,单位:分", required = true)  
41 - private Integer presentTotal;  
42 - @ApiModelProperty(value = "退款总金额,单位:分", required = true)  
43 - private Integer refundTotal;  
44 - @ApiModelProperty(value = "物流id")  
45 - private Integer logisticsId;  
46 - @ApiModelProperty(value = "售后状态", required = true)  
47 - private Integer afterSaleStatus;  
48 - @ApiModelProperty(value = "售后订单编号")  
49 - private Integer afterSaleOrderId;  
50 - @ApiModelProperty(value = "创建时间", required = true)  
51 - private LocalDateTime createTime;  
52 -  
53 -  
54 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.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.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.util.List;
  9 +
  10 +@ApiModel("用户 App - 订单交易的分页项 Response VO")
  11 +@Data
  12 +public class AppTradeOrderPageItemRespVO {
  13 +
  14 + @ApiModelProperty(value = "订单编号", required = true, example = "1024")
  15 + private Long id;
  16 +
  17 + @ApiModelProperty(value = "订单流水号", required = true, example = "1146347329394184195")
  18 + private String no;
  19 +
  20 + @ApiModelProperty(value = "订单状态", required = true, example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
  21 + private Integer status;
  22 +
  23 + @ApiModelProperty(value = "购买的商品数量", required = true, example = "10")
  24 + private Integer productCount;
  25 +
  26 + /**
  27 + * 订单项数组
  28 + */
  29 + private List<Item> items;
  30 +
  31 + @ApiModel("用户 App - 交易订单的明细的订单项目")
  32 + @Data
  33 + public static class Item {
  34 +
  35 + @ApiModelProperty(value = "编号", required = true, example = "1")
  36 + private Long id;
  37 +
  38 + @ApiModelProperty(value = "商品 SPU 编号", required = true, example = "1")
  39 + private Long spuId;
  40 +
  41 + @ApiModelProperty(value = "商品 SPU 名称", required = true, example = "芋道源码")
  42 + private String spuName;
  43 +
  44 + @ApiModelProperty(value = "商品 SKU 编号", required = true, example = "1")
  45 + private Long skuId;
  46 +
  47 + @ApiModelProperty(value = "商品图片", required = true, example = "https://www.iocoder.cn/1.png")
  48 + private String picUrl;
  49 +
  50 + @ApiModelProperty(value = "购买数量", required = true, example = "1")
  51 + private Integer count;
  52 +
  53 + @ApiModelProperty(value = "商品原价(总)", required = true, example = "100", notes = "单位:分")
  54 + private Integer originalPrice;
  55 +
  56 + @ApiModelProperty(value = "商品原价(单)", required = true, example = "100", notes = "单位:分")
  57 + private Integer originalUnitPrice;
  58 +
  59 + /**
  60 + * 属性数组
  61 + */
  62 + private List<AppProductPropertyValueDetailRespVO> properties;
  63 +
  64 + }
  65 +
  66 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.app.order.vo; 1 package cn.iocoder.yudao.module.trade.controller.app.order.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
4 import io.swagger.annotations.ApiModel; 6 import io.swagger.annotations.ApiModel;
5 import io.swagger.annotations.ApiModelProperty; 7 import io.swagger.annotations.ApiModelProperty;
6 import lombok.Data; 8 import lombok.Data;
7 -import lombok.EqualsAndHashCode;  
8 9
9 // TODO 芋艿:字段优化 10 // TODO 芋艿:字段优化
10 @ApiModel("交易订单分页 Request VO") 11 @ApiModel("交易订单分页 Request VO")
11 @Data 12 @Data
12 -@EqualsAndHashCode(callSuper = true)  
13 public class AppTradeOrderPageReqVO extends PageParam { 13 public class AppTradeOrderPageReqVO extends PageParam {
14 14
15 @ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举") 15 @ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
16 - private Integer orderStatus; 16 + @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}")
  17 + private Integer status;
17 18
18 } 19 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderRespVO.java deleted
1 -package cn.iocoder.yudao.module.trade.controller.app.order.vo;  
2 -  
3 -import lombok.*;  
4 -import io.swagger.annotations.*;  
5 -  
6 -import java.time.LocalDateTime;  
7 -import java.util.*;  
8 -  
9 -// TODO 芋艿:字段优化  
10 -@ApiModel("订单交易 Response VO")  
11 -@Data  
12 -public class AppTradeOrderRespVO {  
13 -  
14 - @ApiModelProperty(value = "订单编号", required = true)  
15 - private Integer id;  
16 - @ApiModelProperty(value = "用户编号", required = true)  
17 - private Integer userId;  
18 - @ApiModelProperty(value = "订单单号", required = true)  
19 - private String orderNo;  
20 - @ApiModelProperty(value = "订单状态", required = true)  
21 - private Integer orderStatus;  
22 - @ApiModelProperty(value = "备注")  
23 - private String remark;  
24 - @ApiModelProperty(value = "订单结束时间")  
25 - private LocalDateTime endTime;  
26 - @ApiModelProperty(value = "订单金额(总金额),单位:分", required = true)  
27 - private Integer buyPrice;  
28 - @ApiModelProperty(value = "优惠总金额,单位:分", required = true)  
29 - private Integer discountPrice;  
30 - @ApiModelProperty(value = "物流金额,单位:分", required = true)  
31 - private Integer logisticsPrice;  
32 - @ApiModelProperty(value = "最终金额,单位:分", required = true)  
33 - private Integer presentPrice;  
34 - @ApiModelProperty(value = "支付金额,单位:分", required = true)  
35 - private Integer payPrice;  
36 - @ApiModelProperty(value = "退款金额,单位:分", required = true)  
37 - private Integer refundPrice;  
38 - @ApiModelProperty(value = "付款时间")  
39 - private LocalDateTime payTime;  
40 - @ApiModelProperty(value = "支付订单编号")  
41 - private Integer payTransactionId;  
42 - @ApiModelProperty(value = "支付渠道")  
43 - private Integer payChannel;  
44 - @ApiModelProperty(value = "配送类型", required = true)  
45 - private Integer deliveryType;  
46 - @ApiModelProperty(value = "发货时间")  
47 - private LocalDateTime deliveryTime;  
48 - @ApiModelProperty(value = "收货时间")  
49 - private LocalDateTime receiveTime;  
50 - @ApiModelProperty(value = "收件人名称", required = true)  
51 - private String receiverName;  
52 - @ApiModelProperty(value = "手机号", required = true)  
53 - private String receiverMobile;  
54 - @ApiModelProperty(value = "地区编码", required = true)  
55 - private Integer receiverAreaCode;  
56 - @ApiModelProperty(value = "收件详细地址", required = true)  
57 - private String receiverDetailAddress;  
58 - @ApiModelProperty(value = "售后状态", required = true)  
59 - private Integer afterSaleStatus;  
60 - @ApiModelProperty(value = "优惠劵编号")  
61 - private Integer couponCardId;  
62 - @ApiModelProperty(value = "创建时间", required = true)  
63 - private LocalDateTime createTime;  
64 -  
65 - /**  
66 - * 订单项数组  
67 - *  
68 - * // TODO 芋艿,后续考虑怎么优化下,目前是内嵌了别的 dto  
69 - */  
70 - private List<AppTradeOrderItemRespVO> orderItems;  
71 -  
72 -  
73 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -17,7 +17,10 @@ import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUse @@ -17,7 +17,10 @@ import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUse
17 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 17 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
18 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDetailRespVO; 18 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDetailRespVO;
19 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageItemRespVO; 19 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageItemRespVO;
  20 +import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO;
20 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 21 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
  22 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderDetailRespVO;
  23 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageItemRespVO;
21 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 24 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
22 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 25 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
23 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
@@ -174,4 +177,65 @@ public interface TradeOrderConvert { @@ -174,4 +177,65 @@ public interface TradeOrderConvert {
174 TradeOrderDetailRespVO convert2(TradeOrderDO order, List<TradeOrderItemDO> items); 177 TradeOrderDetailRespVO convert2(TradeOrderDO order, List<TradeOrderItemDO> items);
175 MemberUserRespVO convert(MemberUserRespDTO bean); 178 MemberUserRespVO convert(MemberUserRespDTO bean);
176 179
  180 + default PageResult<AppTradeOrderPageItemRespVO> convertPage02(PageResult<TradeOrderDO> pageResult, List<TradeOrderItemDO> orderItems,
  181 + List<ProductPropertyValueDetailRespDTO> propertyValueDetails) {
  182 + Map<Long, List<TradeOrderItemDO>> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId);
  183 + Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId);
  184 + // 转化 List
  185 + List<AppTradeOrderPageItemRespVO> orderVOs = CollectionUtils.convertList(pageResult.getList(), order -> {
  186 + List<TradeOrderItemDO> xOrderItems = orderItemMap.get(order.getId());
  187 + AppTradeOrderPageItemRespVO orderVO = convert02(order, xOrderItems);
  188 + if (CollUtil.isNotEmpty(xOrderItems)) {
  189 + // 处理商品属性
  190 + for (int i = 0; i < xOrderItems.size(); i++) {
  191 + List<TradeOrderItemDO.Property> properties = xOrderItems.get(i).getProperties();
  192 + if (CollUtil.isEmpty(properties)) {
  193 + continue;
  194 + }
  195 + AppTradeOrderPageItemRespVO.Item item = orderVO.getItems().get(i);
  196 + item.setProperties(new ArrayList<>(properties.size()));
  197 + // 遍历每个 properties,设置到 TradeOrderPageItemRespVO.Item 中
  198 + properties.forEach(property -> {
  199 + ProductPropertyValueDetailRespDTO propertyValueDetail = propertyValueDetailMap.get(property.getValueId());
  200 + if (propertyValueDetail == null) {
  201 + return;
  202 + }
  203 + item.getProperties().add(convert02(propertyValueDetail));
  204 + });
  205 + }
  206 + }
  207 + return orderVO;
  208 + });
  209 + return new PageResult<>(orderVOs, pageResult.getTotal());
  210 + }
  211 + AppTradeOrderPageItemRespVO convert02(TradeOrderDO order, List<TradeOrderItemDO> items);
  212 + AppProductPropertyValueDetailRespVO convert02(ProductPropertyValueDetailRespDTO bean);
  213 +
  214 + default AppTradeOrderDetailRespVO convert02(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
  215 + List<ProductPropertyValueDetailRespDTO> propertyValueDetails) {
  216 + AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems);
  217 + // 处理商品属性
  218 + Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId);
  219 + for (int i = 0; i < orderItems.size(); i++) {
  220 + List<TradeOrderItemDO.Property> properties = orderItems.get(i).getProperties();
  221 + if (CollUtil.isEmpty(properties)) {
  222 + continue;
  223 + }
  224 + AppTradeOrderDetailRespVO.Item item = orderVO.getItems().get(i);
  225 + item.setProperties(new ArrayList<>(properties.size()));
  226 + // 遍历每个 properties,设置到 TradeOrderPageItemRespVO.Item 中
  227 + properties.forEach(property -> {
  228 + ProductPropertyValueDetailRespDTO propertyValueDetail = propertyValueDetailMap.get(property.getValueId());
  229 + if (propertyValueDetail == null) {
  230 + return;
  231 + }
  232 + item.getProperties().add(convert02(propertyValueDetail));
  233 + });
  234 + }
  235 + // 处理收货地址
  236 + orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId()));
  237 + return orderVO;
  238 + }
  239 + AppTradeOrderDetailRespVO convert3(TradeOrderDO order, List<TradeOrderItemDO> items);
  240 +
177 } 241 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
8 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 9 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
9 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
@@ -35,4 +36,11 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; { @@ -35,4 +36,11 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
35 .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())); 36 .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime()));
36 } 37 }
37 38
  39 + default PageResult<TradeOrderDO> selectPage(AppTradeOrderPageReqVO reqVO, Long userId) {
  40 + return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
  41 + .eq(TradeOrderDO::getUserId, userId)
  42 + .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
  43 + .orderByDesc(TradeOrderDO::getId)); // TODO 芋艿:未来不同的 status,不同的排序
  44 + }
  45 +
38 } 46 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; 4 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
5 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 5 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
6 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 6 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 9 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
9 10
@@ -74,13 +75,22 @@ public interface TradeOrderService { @@ -74,13 +75,22 @@ public interface TradeOrderService {
74 TradeOrderDO getOrder(Long userId, Long id); 75 TradeOrderDO getOrder(Long userId, Long id);
75 76
76 /** 77 /**
77 - * 获得交易订单分页 78 + * 【管理员】获得交易订单分页
78 * 79 *
79 * @param reqVO 分页请求 80 * @param reqVO 分页请求
80 * @return 交易订单 81 * @return 交易订单
81 */ 82 */
82 PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO); 83 PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);
83 84
  85 + /**
  86 + * 【会员】获得交易订单分页
  87 + *
  88 + * @param userId 用户编号
  89 + * @param reqVO 分页请求
  90 + * @return 交易订单
  91 + */
  92 + PageResult<TradeOrderDO> getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO);
  93 +
84 // =================== Order Item =================== 94 // =================== Order Item ===================
85 95
86 /** 96 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
@@ -32,6 +32,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliver @@ -32,6 +32,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliver
32 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 32 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
33 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 33 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
34 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO.Item; 34 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO.Item;
  35 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
35 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; 36 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
36 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 37 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
37 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 38 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -450,6 +451,11 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -450,6 +451,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
450 return tradeOrderMapper.selectPage(reqVO, userIds); 451 return tradeOrderMapper.selectPage(reqVO, userIds);
451 } 452 }
452 453
  454 + @Override
  455 + public PageResult<TradeOrderDO> getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO) {
  456 + return tradeOrderMapper.selectPage(reqVO, userId);
  457 + }
  458 +
453 // =================== Order Item =================== 459 // =================== Order Item ===================
454 460
455 @Override 461 @Override
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
@@ -113,7 +113,7 @@ public class SmsSendServiceImpl implements SmsSendService { @@ -113,7 +113,7 @@ public class SmsSendServiceImpl implements SmsSendService {
113 SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); 113 SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
114 // 短信模板不存在 114 // 短信模板不存在
115 if (channelDO == null) { 115 if (channelDO == null) {
116 - throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); 116 + throw exception(SMS_CHANNEL_NOT_EXISTS);
117 } 117 }
118 return channelDO; 118 return channelDO;
119 } 119 }
yudao-ui-admin/src/router/index.js
@@ -198,20 +198,12 @@ export const constantRoutes = [ @@ -198,20 +198,12 @@ export const constantRoutes = [
198 ] 198 ]
199 }, 199 },
200 { 200 {
201 - path: '/order', 201 + path: '/trade/order',
202 component: Layout, 202 component: Layout,
203 - name: '订单管理',  
204 - meta: { title: '订单管理' },  
205 - alwaysShow: true, 203 + hidden: true,
206 children: [ 204 children: [
207 { 205 {
208 - path: '/mall/trade/order',  
209 - name: '商品订单',  
210 - meta: { title: '商品订单' },  
211 - component: (resolve) => require(['@/views/mall/trade/order'], resolve)  
212 - },  
213 - {  
214 - path: '/mall/trade/order/detail', 206 + path: 'detail',
215 name: '订单详情', 207 name: '订单详情',
216 hidden: true, 208 hidden: true,
217 meta: { title: '订单详情' }, 209 meta: { title: '订单详情' },
yudao-ui-admin/src/views/mall/trade/order/index.vue
@@ -229,7 +229,7 @@ export default { @@ -229,7 +229,7 @@ export default {
229 this.getList(); 229 this.getList();
230 }, 230 },
231 goToDetail (row) { 231 goToDetail (row) {
232 - this.$router.push({ path: '/mall/trade/order/detail', query: { id: row.id }}) 232 + this.$router.push({ path: '/trade/order/detail', query: { id: row.id }})
233 } 233 }
234 } 234 }
235 } 235 }
yudao-ui-app/api/order.js
1 const { http } = uni.$u 1 const { http } = uni.$u
2 2
3 -//获得订单交易分页  
4 -export const getOrderPageData = params => http.get('/trade/order/page', { params }) 3 +// 获得订单交易分页
  4 +export const getOrderPage = params => http.get('/trade/order/page', { params })
yudao-ui-app/pages/order/order.vue
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 </template> 14 </template>
15 15
16 <script> 16 <script>
17 -import { getOrderPageData } from '../../api/order' 17 +import { getOrderPage } from '../../api/order'
18 18
19 export default { 19 export default {
20 name: 'order', 20 name: 'order',
@@ -32,23 +32,19 @@ export default { @@ -32,23 +32,19 @@ export default {
32 status: '0' 32 status: '0'
33 }, 33 },
34 { 34 {
35 - name: '已付款',  
36 - status: '10'  
37 - },  
38 - {  
39 name: '待发货', 35 name: '待发货',
40 - status: '20' 36 + status: '10'
41 }, 37 },
42 { 38 {
43 name: '待收货', 39 name: '待收货',
44 - status: '30' 40 + status: '20'
45 }, 41 },
46 { 42 {
47 name: '已完成', 43 name: '已完成',
48 - status: '40' 44 + status: '30'
49 }, 45 },
50 { 46 {
51 - name: '已取消', 47 + name: '已取消', // TODO @辰尘:已取消不展示
52 status: '50' 48 status: '50'
53 } 49 }
54 ], 50 ],
@@ -76,7 +72,7 @@ export default { @@ -76,7 +72,7 @@ export default {
76 if (status >= 0) { 72 if (status >= 0) {
77 params.orderStatus = status 73 params.orderStatus = status
78 } 74 }
79 - getOrderPageData(params) 75 + getOrderPage(params)
80 .then(res => { 76 .then(res => {
81 console.log(res) 77 console.log(res)
82 }) 78 })