Commit 8bd19420830ace896859a08ffc852768d5527d8b
Committed by
Gitee
!676 交易:核销订单
Merge pull request !676 from 疯狂的世界/feature/mall_product
Showing
10 changed files
with
438 additions
and
19 deletions
sql/mysql/mall.sql
0 → 100644
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<TradeOrderDO> { | @@ -42,6 +44,26 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | ||
| 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 |