Commit 8bd19420830ace896859a08ffc852768d5527d8b

Authored by 芋道源码
Committed by Gitee
2 parents 453f6993 0c4713b7

!676 交易:核销订单

Merge pull request !676 from 疯狂的世界/feature/mall_product
sql/mysql/mall.sql 0 → 100644
  1 +INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
  2 +VALUES ('核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder');
0 \ No newline at end of file 3 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/MPJLambdaWrapperX.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.mybatis.core.query;
  2 +
  3 +import cn.hutool.core.util.ArrayUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
  6 +import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  7 +import com.github.yulichang.toolkit.MPJWrappers;
  8 +import com.github.yulichang.wrapper.MPJLambdaWrapper;
  9 +import org.springframework.util.StringUtils;
  10 +
  11 +import java.util.Collection;
  12 +import java.util.function.Consumer;
  13 +
  14 +/**
  15 + * 拓展 MyBatis Plus Join QueryWrapper 类,主要增加如下功能:
  16 + * <p>
  17 + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。
  18 + *
  19 + * @param <T> 数据类型
  20 + */
  21 +public class MPJLambdaWrapperX<T> extends MPJLambdaWrapper<T> {
  22 +
  23 + public MPJLambdaWrapperX<T> likeIfPresent(SFunction<T, ?> column, String val) {
  24 + MPJWrappers.lambdaJoin().like(column, val);
  25 + if (StringUtils.hasText(val)) {
  26 + return (MPJLambdaWrapperX<T>) super.like(column, val);
  27 + }
  28 + return this;
  29 + }
  30 +
  31 + public MPJLambdaWrapperX<T> inIfPresent(SFunction<T, ?> column, Collection<?> values) {
  32 + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {
  33 + return (MPJLambdaWrapperX<T>) super.in(column, values);
  34 + }
  35 + return this;
  36 + }
  37 +
  38 + public MPJLambdaWrapperX<T> inIfPresent(SFunction<T, ?> column, Object... values) {
  39 + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {
  40 + return (MPJLambdaWrapperX<T>) super.in(column, values);
  41 + }
  42 + return this;
  43 + }
  44 +
  45 + public MPJLambdaWrapperX<T> eqIfPresent(SFunction<T, ?> column, Object val) {
  46 + if (ObjectUtil.isNotEmpty(val)) {
  47 + return (MPJLambdaWrapperX<T>) super.eq(column, val);
  48 + }
  49 + return this;
  50 + }
  51 +
  52 + public MPJLambdaWrapperX<T> neIfPresent(SFunction<T, ?> column, Object val) {
  53 + if (ObjectUtil.isNotEmpty(val)) {
  54 + return (MPJLambdaWrapperX<T>) super.ne(column, val);
  55 + }
  56 + return this;
  57 + }
  58 +
  59 + public MPJLambdaWrapperX<T> gtIfPresent(SFunction<T, ?> column, Object val) {
  60 + if (val != null) {
  61 + return (MPJLambdaWrapperX<T>) super.gt(column, val);
  62 + }
  63 + return this;
  64 + }
  65 +
  66 + public MPJLambdaWrapperX<T> geIfPresent(SFunction<T, ?> column, Object val) {
  67 + if (val != null) {
  68 + return (MPJLambdaWrapperX<T>) super.ge(column, val);
  69 + }
  70 + return this;
  71 + }
  72 +
  73 + public MPJLambdaWrapperX<T> ltIfPresent(SFunction<T, ?> column, Object val) {
  74 + if (val != null) {
  75 + return (MPJLambdaWrapperX<T>) super.lt(column, val);
  76 + }
  77 + return this;
  78 + }
  79 +
  80 + public MPJLambdaWrapperX<T> leIfPresent(SFunction<T, ?> column, Object val) {
  81 + if (val != null) {
  82 + return (MPJLambdaWrapperX<T>) super.le(column, val);
  83 + }
  84 + return this;
  85 + }
  86 +
  87 + public MPJLambdaWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object val1, Object val2) {
  88 + if (val1 != null && val2 != null) {
  89 + return (MPJLambdaWrapperX<T>) super.between(column, val1, val2);
  90 + }
  91 + if (val1 != null) {
  92 + return (MPJLambdaWrapperX<T>) ge(column, val1);
  93 + }
  94 + if (val2 != null) {
  95 + return (MPJLambdaWrapperX<T>) le(column, val2);
  96 + }
  97 + return this;
  98 + }
  99 +
  100 + public MPJLambdaWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object[] values) {
  101 + Object val1 = ArrayUtils.get(values, 0);
  102 + Object val2 = ArrayUtils.get(values, 1);
  103 + return betweenIfPresent(column, val1, val2);
  104 + }
  105 +
  106 + // ========== 重写父类方法,方便链式调用 ==========
  107 +
  108 + @Override
  109 + public <X> MPJLambdaWrapperX<T> eq(boolean condition, SFunction<X, ?> column, Object val) {
  110 + super.eq(condition, column, val);
  111 + return this;
  112 + }
  113 +
  114 + @Override
  115 + public <X> MPJLambdaWrapperX<T> eq(SFunction<X, ?> column, Object val) {
  116 + super.eq(column, val);
  117 + return this;
  118 + }
  119 +
  120 + @Override
  121 + public <X> MPJLambdaWrapperX<T> orderByDesc(SFunction<X, ?> column) {
  122 + //noinspection unchecked
  123 + super.orderByDesc(true, column);
  124 + return this;
  125 + }
  126 +
  127 + @Override
  128 + public MPJLambdaWrapperX<T> last(String lastSql) {
  129 + super.last(lastSql);
  130 + return this;
  131 + }
  132 +
  133 + @Override
  134 + public <X> MPJLambdaWrapperX<T> in(SFunction<X, ?> column, Collection<?> coll) {
  135 + super.in(column, coll);
  136 + return this;
  137 + }
  138 +
  139 + @Override
  140 + public MPJLambdaWrapperX<T> selectAll(Class<?> clazz) {
  141 + super.selectAll(clazz);
  142 + return this;
  143 + }
  144 +
  145 + @Override
  146 + public MPJLambdaWrapperX<T> selectAll(Class<?> clazz, String prefix) {
  147 + super.selectAll(clazz, prefix);
  148 + return this;
  149 + }
  150 +
  151 + @Override
  152 + public <S> MPJLambdaWrapperX<T> selectAs(SFunction<S, ?> column, String alias) {
  153 + super.selectAs(column, alias);
  154 + return this;
  155 + }
  156 +
  157 + @Override
  158 + public <E> MPJLambdaWrapperX<T> selectAs(String column, SFunction<E, ?> alias) {
  159 + super.selectAs(column, alias);
  160 + return this;
  161 + }
  162 +
  163 + @Override
  164 + public <S, X> MPJLambdaWrapperX<T> selectAs(SFunction<S, ?> column, SFunction<X, ?> alias) {
  165 + super.selectAs(column, alias);
  166 + return this;
  167 + }
  168 +
  169 + @Override
  170 + public <E, X> MPJLambdaWrapperX<T> selectAs(String index, SFunction<E, ?> column, SFunction<X, ?> alias) {
  171 + super.selectAs(index, column, alias);
  172 + return this;
  173 + }
  174 +
  175 + @Override
  176 + public <E> MPJLambdaWrapperX<T> selectAsClass(Class<E> source, Class<?> tag) {
  177 + super.selectAsClass(source, tag);
  178 + return this;
  179 + }
  180 +
  181 + @Override
  182 + public <E, F> MPJLambdaWrapperX<T> selectSub(Class<E> clazz, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {
  183 + super.selectSub(clazz, consumer, alias);
  184 + return this;
  185 + }
  186 +
  187 + @Override
  188 + public <E, F> MPJLambdaWrapperX<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {
  189 + super.selectSub(clazz, st, consumer, alias);
  190 + return this;
  191 + }
  192 +
  193 + @Override
  194 + public <S> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column) {
  195 + super.selectCount(column);
  196 + return this;
  197 + }
  198 +
  199 + @Override
  200 + public MPJLambdaWrapperX<T> selectCount(Object column, String alias) {
  201 + super.selectCount(column, alias);
  202 + return this;
  203 + }
  204 +
  205 + @Override
  206 + public <X> MPJLambdaWrapperX<T> selectCount(Object column, SFunction<X, ?> alias) {
  207 + super.selectCount(column, alias);
  208 + return this;
  209 + }
  210 +
  211 + @Override
  212 + public <S, X> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, String alias) {
  213 + super.selectCount(column, alias);
  214 + return this;
  215 + }
  216 +
  217 + @Override
  218 + public <S, X> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, SFunction<X, ?> alias) {
  219 + super.selectCount(column, alias);
  220 + return this;
  221 + }
  222 +
  223 + @Override
  224 + public <S> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column) {
  225 + super.selectSum(column);
  226 + return this;
  227 + }
  228 +
  229 + @Override
  230 + public <S, X> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, String alias) {
  231 + super.selectSum(column, alias);
  232 + return this;
  233 + }
  234 +
  235 + @Override
  236 + public <S, X> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, SFunction<X, ?> alias) {
  237 + super.selectSum(column, alias);
  238 + return this;
  239 + }
  240 +
  241 + @Override
  242 + public <S> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column) {
  243 + super.selectMax(column);
  244 + return this;
  245 + }
  246 +
  247 + @Override
  248 + public <S, X> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, String alias) {
  249 + super.selectMax(column, alias);
  250 + return this;
  251 + }
  252 +
  253 + @Override
  254 + public <S, X> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, SFunction<X, ?> alias) {
  255 + super.selectMax(column, alias);
  256 + return this;
  257 + }
  258 +
  259 + @Override
  260 + public <S> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column) {
  261 + super.selectMin(column);
  262 + return this;
  263 + }
  264 +
  265 + @Override
  266 + public <S, X> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, String alias) {
  267 + super.selectMin(column, alias);
  268 + return this;
  269 + }
  270 +
  271 + @Override
  272 + public <S, X> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, SFunction<X, ?> alias) {
  273 + super.selectMin(column, alias);
  274 + return this;
  275 + }
  276 +
  277 + @Override
  278 + public <S> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column) {
  279 + super.selectAvg(column);
  280 + return this;
  281 + }
  282 +
  283 + @Override
  284 + public <S, X> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, String alias) {
  285 + super.selectAvg(column, alias);
  286 + return this;
  287 + }
  288 +
  289 + @Override
  290 + public <S, X> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, SFunction<X, ?> alias) {
  291 + super.selectAvg(column, alias);
  292 + return this;
  293 + }
  294 +
  295 + @Override
  296 + public <S> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column) {
  297 + super.selectLen(column);
  298 + return this;
  299 + }
  300 +
  301 + @Override
  302 + public <S, X> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, String alias) {
  303 + super.selectLen(column, alias);
  304 + return this;
  305 + }
  306 +
  307 + @Override
  308 + public <S, X> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, SFunction<X, ?> alias) {
  309 + super.selectLen(column, alias);
  310 + return this;
  311 + }
  312 +
  313 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java
@@ -24,8 +24,11 @@ import org.springframework.web.bind.annotation.*; @@ -24,8 +24,11 @@ import org.springframework.web.bind.annotation.*;
24 import javax.annotation.Resource; 24 import javax.annotation.Resource;
25 import java.util.List; 25 import java.util.List;
26 import java.util.Map; 26 import java.util.Map;
  27 +import java.util.Objects;
  28 +import java.util.Set;
27 29
28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 30 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  31 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
29 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 32 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
30 33
31 @Tag(name = "管理后台 - 交易订单") 34 @Tag(name = "管理后台 - 交易订单")
@@ -56,7 +59,9 @@ public class TradeOrderController { @@ -56,7 +59,9 @@ public class TradeOrderController {
56 } 59 }
57 60
58 // 查询用户信息 61 // 查询用户信息
59 - Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), TradeOrderDO::getUserId)); 62 + Set<Long> userIds = CollUtil.unionDistinct(convertList(pageResult.getList(), TradeOrderDO::getUserId),
  63 + convertList(pageResult.getList(), TradeOrderDO::getBrokerageUserId, Objects::nonNull));
  64 + Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
60 // 查询订单项 65 // 查询订单项
61 List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId( 66 List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(
62 convertSet(pageResult.getList(), TradeOrderDO::getId)); 67 convertSet(pageResult.getList(), TradeOrderDO::getId));
@@ -64,6 +69,13 @@ public class TradeOrderController { @@ -64,6 +69,13 @@ public class TradeOrderController {
64 return success(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap)); 69 return success(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap));
65 } 70 }
66 71
  72 + @GetMapping("/summary")
  73 + @Operation(summary = "获得交易订单统计")
  74 + @PreAuthorize("@ss.hasPermission('trade:order:query')")
  75 + public CommonResult<TradeOrderSummaryRespVO> getOrderSummary(TradeOrderPageReqVO reqVO) {
  76 + return success(tradeOrderQueryService.getOrderSummary(reqVO));
  77 + }
  78 +
67 @GetMapping("/get-detail") 79 @GetMapping("/get-detail")
68 @Operation(summary = "获得交易订单详情") 80 @Operation(summary = "获得交易订单详情")
69 @Parameter(name = "id", description = "订单编号", required = true, example = "1") 81 @Parameter(name = "id", description = "订单编号", required = true, example = "1")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
@@ -145,4 +145,7 @@ public class TradeOrderBaseVO { @@ -145,4 +145,7 @@ public class TradeOrderBaseVO {
145 @Schema(description = "VIP 减免金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") 145 @Schema(description = "VIP 减免金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "888")
146 private Integer vipPrice; 146 private Integer vipPrice;
147 147
  148 + @Schema(description = "推广人编号", example = "1")
  149 + private Long brokerageUserId;
  150 +
148 } 151 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.order.vo; 1 package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
2 2
3 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 3 +import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
4 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 4 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
5 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 6 import lombok.Data;
@@ -14,24 +14,20 @@ public class TradeOrderPageItemRespVO extends TradeOrderBaseVO { @@ -14,24 +14,20 @@ public class TradeOrderPageItemRespVO extends TradeOrderBaseVO {
14 @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区") 14 @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区")
15 private String receiverAreaName; 15 private String receiverAreaName;
16 16
17 - /**  
18 - * 订单项列表  
19 - */ 17 + @Schema(description = "订单项列表", requiredMode = Schema.RequiredMode.REQUIRED)
20 private List<Item> items; 18 private List<Item> items;
21 19
22 - // TODO @xiaobai:使用 MemberUserRespVO 返回哈;DTO 不直接给前端  
23 - /**  
24 - * 用户信息  
25 - */  
26 - private MemberUserRespDTO user; 20 + @Schema(description = "用户信息", requiredMode = Schema.RequiredMode.REQUIRED)
  21 + private MemberUserRespVO user;
  22 +
  23 + @Schema(description = "推广人信息")
  24 + private MemberUserRespVO brokerageUser;
27 25
28 @Schema(description = "管理后台 - 交易订单的分页项的订单项目") 26 @Schema(description = "管理后台 - 交易订单的分页项的订单项目")
29 @Data 27 @Data
30 public static class Item extends TradeOrderItemBaseVO { 28 public static class Item extends TradeOrderItemBaseVO {
31 29
32 - /**  
33 - * 属性数组  
34 - */ 30 + @Schema(description = "属性列表", requiredMode = Schema.RequiredMode.REQUIRED)
35 private List<ProductPropertyValueDetailRespVO> properties; 31 private List<ProductPropertyValueDetailRespVO> properties;
36 32
37 } 33 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSummaryRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - 交易订单统计 Response VO")
  7 +@Data
  8 +public class TradeOrderSummaryRespVO {
  9 +
  10 + @Schema(description = "订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  11 + private Long orderCount;
  12 +
  13 + @Schema(description = "订单金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  14 + private Long orderPayPrice;
  15 +
  16 + @Schema(description = "退款单数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  17 + private Long afterSaleCount;
  18 +
  19 + @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  20 + private Long afterSalePrice;
  21 +
  22 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -124,13 +124,17 @@ public interface TradeOrderConvert { @@ -124,13 +124,17 @@ public interface TradeOrderConvert {
124 TradeOrderPageItemRespVO orderVO = convert(order, xOrderItems); 124 TradeOrderPageItemRespVO orderVO = convert(order, xOrderItems);
125 // 处理收货地址 125 // 处理收货地址
126 orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId())); 126 orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId()));
127 - // 增加用户昵称  
128 - orderVO.setUser(memberUserMap.get(orderVO.getUserId())); 127 + // 增加用户信息
  128 + orderVO.setUser(convertUser(memberUserMap.get(orderVO.getUserId())));
  129 + // 增加推广人信息
  130 + orderVO.setBrokerageUser(convertUser(memberUserMap.get(orderVO.getBrokerageUserId())));
129 return orderVO; 131 return orderVO;
130 }); 132 });
131 return new PageResult<>(orderVOs, pageResult.getTotal()); 133 return new PageResult<>(orderVOs, pageResult.getTotal());
132 } 134 }
133 135
  136 + MemberUserRespVO convertUser(MemberUserRespDTO memberUserRespDTO);
  137 +
134 TradeOrderPageItemRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items); 138 TradeOrderPageItemRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items);
135 139
136 ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean); 140 ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.dal.mysql.order; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.dal.mysql.order;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 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.framework.mybatis.core.query.MPJLambdaWrapperX;
6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 7 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
7 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; 8 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 9 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper; @@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
11 12
12 import java.time.LocalDateTime; 13 import java.time.LocalDateTime;
13 import java.util.List; 14 import java.util.List;
  15 +import java.util.Map;
14 import java.util.Set; 16 import java.util.Set;
15 17
16 @Mapper 18 @Mapper
@@ -42,6 +44,26 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; { @@ -42,6 +44,26 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
42 .orderByDesc(TradeOrderDO::getId)); 44 .orderByDesc(TradeOrderDO::getId));
43 } 45 }
44 46
  47 + default List<Map<String, Object>> selectOrderSummaryGroupByRefundStatus(TradeOrderPageReqVO reqVO, Set<Long> userIds) {
  48 + return selectMaps(new MPJLambdaWrapperX<TradeOrderDO>()
  49 + .selectAs(TradeOrderDO::getRefundStatus, TradeOrderDO::getRefundStatus) // 售后状态
  50 + .selectCount(TradeOrderDO::getId, "count") // 售后状态对应的数量
  51 + .selectSum(TradeOrderDO::getPayPrice, "price") // 售后状态对应的支付金额
  52 + .likeIfPresent(TradeOrderDO::getNo, reqVO.getNo())
  53 + .eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
  54 + .eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
  55 + .inIfPresent(TradeOrderDO::getUserId, userIds)
  56 + .eqIfPresent(TradeOrderDO::getType, reqVO.getType())
  57 + .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
  58 + .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
  59 + .eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
  60 + .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
  61 + .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
  62 + .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
  63 + .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
  64 + .groupBy(TradeOrderDO::getRefundStatus)); // 按售后状态分组
  65 + }
  66 +
45 default PageResult<TradeOrderDO> selectPage(AppTradeOrderPageReqVO reqVO, Long userId) { 67 default PageResult<TradeOrderDO> selectPage(AppTradeOrderPageReqVO reqVO, Long userId) {
46 return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>() 68 return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
47 .eq(TradeOrderDO::getUserId, userId) 69 .eq(TradeOrderDO::getUserId, userId)
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.order; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.order;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 4 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
5 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; 6 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -65,6 +66,14 @@ public interface TradeOrderQueryService { @@ -65,6 +66,14 @@ public interface TradeOrderQueryService {
65 PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO); 66 PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);
66 67
67 /** 68 /**
  69 + * 获得订单统计
  70 + *
  71 + * @param reqVO 请求参数
  72 + * @return 订单统计
  73 + */
  74 + TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO);
  75 +
  76 + /**
68 * 【会员】获得交易订单分页 77 * 【会员】获得交易订单分页
69 * 78 *
70 * @param userId 用户编号 79 * @param userId 用户编号
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
1 package cn.iocoder.yudao.module.trade.service.order; 1 package cn.iocoder.yudao.module.trade.service.order;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.map.MapUtil;
4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
6 import cn.hutool.extra.spring.SpringUtil; 7 import cn.hutool.extra.spring.SpringUtil;
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -8,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 9 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
9 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 10 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
10 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 11 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
  12 +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
11 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; 13 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
12 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; 14 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 15 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -15,6 +17,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -15,6 +17,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
15 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; 17 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
16 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; 18 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
17 import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants; 19 import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
  20 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
18 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 21 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
19 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory; 22 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
20 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; 23 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
@@ -85,24 +88,57 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { @@ -85,24 +88,57 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
85 88
86 @Override 89 @Override
87 public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) { 90 public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
  91 + // 根据用户查询条件构建用户编号列表
  92 + Set<Long> userIds = buildQueryConditionUserIds(reqVO);
  93 + if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
  94 + return PageResult.empty();
  95 + }
  96 + // 分页查询
  97 + return tradeOrderMapper.selectPage(reqVO, userIds);
  98 + }
  99 +
  100 + private Set<Long> buildQueryConditionUserIds(TradeOrderPageReqVO reqVO) {
88 // 获得 userId 相关的查询 101 // 获得 userId 相关的查询
89 Set<Long> userIds = new HashSet<>(); 102 Set<Long> userIds = new HashSet<>();
90 if (StrUtil.isNotEmpty(reqVO.getUserMobile())) { 103 if (StrUtil.isNotEmpty(reqVO.getUserMobile())) {
91 MemberUserRespDTO user = memberUserApi.getUserByMobile(reqVO.getUserMobile()); 104 MemberUserRespDTO user = memberUserApi.getUserByMobile(reqVO.getUserMobile());
92 if (user == null) { // 没查询到用户,说明肯定也没他的订单 105 if (user == null) { // 没查询到用户,说明肯定也没他的订单
93 - return new PageResult<>(); 106 + return null;
94 } 107 }
95 userIds.add(user.getId()); 108 userIds.add(user.getId());
96 } 109 }
97 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { 110 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) {
98 List<MemberUserRespDTO> users = memberUserApi.getUserListByNickname(reqVO.getUserNickname()); 111 List<MemberUserRespDTO> users = memberUserApi.getUserListByNickname(reqVO.getUserNickname());
99 if (CollUtil.isEmpty(users)) { // 没查询到用户,说明肯定也没他的订单 112 if (CollUtil.isEmpty(users)) { // 没查询到用户,说明肯定也没他的订单
100 - return new PageResult<>(); 113 + return null;
101 } 114 }
102 userIds.addAll(convertSet(users, MemberUserRespDTO::getId)); 115 userIds.addAll(convertSet(users, MemberUserRespDTO::getId));
103 } 116 }
104 - // 分页查询  
105 - return tradeOrderMapper.selectPage(reqVO, userIds); 117 + return userIds;
  118 + }
  119 +
  120 + @Override
  121 + public TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO) {
  122 + // 根据用户查询条件构建用户编号列表
  123 + Set<Long> userIds = buildQueryConditionUserIds(reqVO);
  124 + if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
  125 + return new TradeOrderSummaryRespVO();
  126 + }
  127 + // 查询每个售后状态对应的数量、金额
  128 + List<Map<String, Object>> list = tradeOrderMapper.selectOrderSummaryGroupByRefundStatus(reqVO, null);
  129 +
  130 + TradeOrderSummaryRespVO vo = new TradeOrderSummaryRespVO().setAfterSaleCount(0L).setAfterSalePrice(0L);
  131 + for (Map<String, Object> map : list) {
  132 + Long count = MapUtil.getLong(map, "count", 0L);
  133 + Long price = MapUtil.getLong(map, "price", 0L);
  134 + // 未退款的计入订单,部分退款、全部退款计入售后
  135 + if (TradeOrderRefundStatusEnum.NONE.getStatus().equals(MapUtil.getInt(map, "refundStatus"))) {
  136 + vo.setOrderCount(count).setOrderPayPrice(price);
  137 + } else {
  138 + vo.setAfterSaleCount(vo.getAfterSaleCount() + count).setAfterSalePrice(vo.getAfterSalePrice() + price);
  139 + }
  140 + }
  141 + return vo;
106 } 142 }
107 143
108 @Override 144 @Override