From ef962891dc5a040a6ea2b43e72fd7964d27d7356 Mon Sep 17 00:00:00 2001 From: zhangji <1315410739@qq.com> Date: Fri, 15 Aug 2025 14:41:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=94=80=E9=87=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/product/api/sku/ProductSkuApi.java | 7 +- .../product/enums/ErrorCodeConstants.java | 1 + .../product/api/sku/ProductSkuApiImpl.java | 5 ++ .../app/spu/AppProductSpuController.java | 2 +- .../dal/mysql/sku/ProductSkuMapper.java | 4 ++ .../service/device/DeviceServiceImpl.java | 12 ++-- .../service/sku/ProductSkuService.java | 2 + .../service/sku/ProductSkuServiceImpl.java | 6 ++ .../service/spu/ProductSpuServiceImpl.java | 2 +- .../admin/order/TradeOrderController.http | 5 ++ .../admin/order/TradeOrderController.java | 66 ++++++++++++++++++- .../vo/TradeOrderItemStatisticsRespVO.java | 14 ++++ .../vo/TradeOrderSalesStatisticsReqVO.java | 32 +++++++++ .../vo/TradeOrderSalesStatisticsRespVO.java | 24 +++++++ .../convert/order/TradeOrderConvert.java | 13 ++++ .../order/TradeOrderItemCountDO.java | 16 +++++ .../dal/mysql/order/TradeOrderItemMapper.java | 24 +++++++ .../service/order/TradeOrderQueryService.java | 3 + .../order/TradeOrderQueryServiceImpl.java | 11 ++++ .../service/price/TradePriceServiceImpl.java | 27 +++++++- .../module/system/api/user/AdminUserApi.java | 2 +- .../system/api/user/AdminUserApiImpl.java | 2 +- .../dal/mysql/user/AdminUserMapper.java | 2 +- .../system/service/user/AdminUserService.java | 2 +- .../service/user/AdminUserServiceImpl.java | 2 +- .../src/main/resources/application-prod.yaml | 4 +- 26 files changed, 267 insertions(+), 23 deletions(-) create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemStatisticsRespVO.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsReqVO.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsRespVO.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemCountDO.java diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApi.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApi.java index d96b783..d16bef9 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApi.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApi.java @@ -4,10 +4,7 @@ import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuStockReqDTO; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; /** * 商品 SKU API 接口 @@ -51,4 +48,6 @@ public interface ProductSkuApi { List getSkuStockSum(List barCodes); List getSkuListByBarCode(Collection barCodes); + + List getSkuListByCreator(Long creator); } diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java index 9056456..f07ece6 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java @@ -59,5 +59,6 @@ public interface ErrorCodeConstants { // ========== 商品汇总 1-008-010-000 ========== ErrorCode SUMMARY_NOT_EXISTS = new ErrorCode(1_008_010_000, "商品汇总不存在"); + ErrorCode SUMMARY_NOT_DUPLICATE = new ErrorCode(1_008_010_001, "订单明细中涉及多台贩卖机"); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java index 7f561e2..9fdb750 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java @@ -60,4 +60,9 @@ public class ProductSkuApiImpl implements ProductSkuApi { return productSkuService.getSkuListByBarCode(barCodes); } + @Override + public List getSkuListByCreator(Long creator) { + return productSkuService.getSkuListByCreator(creator); + } + } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java index 2a80982..e5a3af0 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java @@ -62,7 +62,7 @@ public class AppProductSpuController { @PermitAll public String getUrl(String deviceId) { //查询用户表 - AdminUserRespDTO user = adminUserApi.getUserByDeviceid(Long.valueOf(deviceId)); + AdminUserRespDTO user = adminUserApi.getUserByDeviceid(deviceId); return "/app-api/product/spu/list-all?"+user.getId(); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java index 3e64ceb..568ae96 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java @@ -81,4 +81,8 @@ public interface ProductSkuMapper extends BaseMapperX { default List getSkuListByBarCode(Collection barCodes){ return selectList(ProductSkuDO::getBarCode, barCodes); } + + default List getSkuListByCreator(Long creator){ + return selectList(ProductSkuDO::getCreator, creator); + } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/device/DeviceServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/device/DeviceServiceImpl.java index 675c247..fb2a2f5 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/device/DeviceServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/device/DeviceServiceImpl.java @@ -156,11 +156,13 @@ public class DeviceServiceImpl implements DeviceService { @Override public String refreshWechantCode(Long id) { - // 校验存在 - validateDeviceExists(id); + DeviceDO deviceDO = deviceMapper.selectById(id); + if ( deviceDO== null|| deviceDO.getDeviceId()==null) { + throw exception(DEVICE_NOT_EXISTS); + } String wechatPagePath = wechatProductPath; - String wechatPathParams = String.format("deviceId=%s", id); + String wechatPathParams = String.format("deviceId=%s", deviceDO.getDeviceId()); String wechatFullPath = String.format("%s?%s", wechatPagePath, wechatPathParams); SocialWxQrcodeReqDTO codeObj = new SocialWxQrcodeReqDTO(); @@ -174,11 +176,11 @@ public class DeviceServiceImpl implements DeviceService { // 保存二维码 String file = fileApi.createFile(imageByte); if (ObjectUtil.isEmpty(file)) { - log.error("设备--{}:[微信二维码保存失败]", id); + log.error("设备--{}:[微信二维码保存失败]", deviceDO.getDeviceId()); return null; } // 更新一下 - DeviceDO updateObj = DeviceDO.builder().id(id).productUrl(wechatFullPath).fileUrl(file).build(); + DeviceDO updateObj = DeviceDO.builder().id(id).productUrl(file).build(); deviceMapper.updateById(updateObj); // 刷新一下硬件设备 updateDevice(BeanUtil.toBean(deviceMapper.selectById(id), DeviceSaveReqVO.class)); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java index c2733cf..c70bcbe 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java @@ -115,4 +115,6 @@ public interface ProductSkuService { List getSkuStockSum(List barCodes); List getSkuListByBarCode(Collection barCodes); + + List getSkuListByCreator(Long creator); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java index 883437d..1abaea3 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java @@ -222,6 +222,12 @@ public class ProductSkuServiceImpl implements ProductSkuService { return BeanUtils.toBean(productSkuDOS, ProductSkuRespDTO.class); } + @Override + public List getSkuListByCreator(Long creator) { + List productSkus = productSkuMapper.getSkuListByCreator(creator); + return BeanUtils.toBean(productSkus, ProductSkuRespDTO.class); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateSkuList(Long spuId, List skus) { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java index 20e7103..3d1ce2f 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java @@ -243,7 +243,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { } if (null!=pageReqVO.getDeviceId()){ //查询用户 - AdminUserRespDTO user = adminUserApi.getUserByDeviceid(Long.valueOf(pageReqVO.getDeviceId())); + AdminUserRespDTO user = adminUserApi.getUserByDeviceid(pageReqVO.getDeviceId()); pageReqVO.setCreator(user.getId().toString()); } // 分页查询 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http index 5255d1b..ccba2b8 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http @@ -11,4 +11,9 @@ tenant-id: {{adminTenantId}} ### 获得交易订单的物流轨迹 => 成功 GET {{baseUrl}}/trade/order/get-express-track-list?id=21 Authorization: Bearer {{token}} +tenant-id: {{adminTenantId}} + +### 获取订单销售统计数据 => 成功 +GET {{baseUrl}}/trade/order/sales-statistics?pageNo=1&pageSize=100&createTime[0]=2025-01-01 00:00:00&createTime[1]=2025-08-15 23:59:59 +Authorization: Bearer {{token}} tenant-id: {{adminTenantId}} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java index a517ea1..9d5cfb3 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java @@ -5,6 +5,12 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.*; import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; @@ -13,6 +19,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO; import cn.iocoder.yudao.module.trade.service.order.TradeOrderLogService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateSummaryReqBO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,10 +33,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 交易订单") @@ -45,6 +53,12 @@ public class TradeOrderController { private TradeOrderQueryService tradeOrderQueryService; @Resource private TradeOrderLogService tradeOrderLogService; + @Resource + private ProductSkuApi productSkuApi; + @Resource + private ProductSpuApi productSpuApi; + @Resource + private AdminUserApi adminUserApi; @Resource private MemberUserApi memberUserApi; @@ -166,4 +180,52 @@ public class TradeOrderController { return success(TradeOrderConvert.INSTANCE.convert2(tradeOrder, null)); } + @GetMapping("/sales-statistics") + @Operation(summary = "获取订单销售统计数据") + @PreAuthorize("@ss.hasPermission('trade:order:query')") + public CommonResult> getSalesStatistics(TradeOrderSalesStatisticsReqVO salesStatisticsReqVO) { + PageResult orderItemStatisticsRespVOList = tradeOrderQueryService.getSalesStatistics(salesStatisticsReqVO); + //获取机器号 + List spuIds = orderItemStatisticsRespVOList.getList().stream().map(TradeOrderItemStatisticsRespVO::getSpuId).distinct() + .collect(Collectors.toList());//去重Creator + List spuList = productSpuApi.getSpuList(spuIds); + List creators = spuList.stream() + .map(ProductSpuRespDTO::getCreator) + .filter(Objects::nonNull) // 防止空指针 + .map(Long::valueOf) // String 转 Long + .distinct() + .collect(Collectors.toList()); + List userList = adminUserApi.getUserList(creators); + // 构建用户ID到deviceId的映射 + Map userDeviceMap = userList.stream() + .collect(Collectors.toMap( + AdminUserRespDTO::getId, // key: 用户ID + AdminUserRespDTO::getDeviceId // value: deviceId + )); + // 构建spuId到deviceId的映射 + Map spuDeviceMap = spuList.stream() + .filter(spu -> { + try { + return userDeviceMap.containsKey(Long.valueOf(spu.getCreator())); + } catch (NumberFormatException e) { + return false; // 如果转换失败,则过滤掉该元素 + } + }) + .collect(Collectors.toMap( + ProductSpuRespDTO::getId, // key: spuId + spu -> { + Long creatorId = Long.valueOf(spu.getCreator()); + return userDeviceMap.get(creatorId); // value: 对应的deviceId + } + )); + //获取条码 + List skuIds = orderItemStatisticsRespVOList.getList().stream() + .map(TradeOrderItemStatisticsRespVO::getSkuId) //获取每个商品的Creator + .distinct() + .collect(Collectors.toList());//去重Creator + List skuList = productSkuApi.getSkuList(skuIds); + Map skuMap = convertMap(skuList, ProductSkuRespDTO::getId, ProductSkuRespDTO::getBarCode); + + return success(TradeOrderConvert.INSTANCE.convertStatistics(orderItemStatisticsRespVOList, spuDeviceMap,skuMap)); + } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemStatisticsRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemStatisticsRespVO.java new file mode 100644 index 0000000..29139cb --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemStatisticsRespVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.trade.controller.admin.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 交易订单的详情 Response VO") +@Data +public class TradeOrderItemStatisticsRespVO extends TradeOrderItemBaseVO { + + @Schema(description = "销售数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderCount; + + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsReqVO.java new file mode 100644 index 0000000..255eaab --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.trade.controller.admin.order.vo; + +import cn.iocoder.yudao.framework.common.enums.TerminalEnum; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 获取订单销售统计数据 Request VO") +@Data +public class TradeOrderSalesStatisticsReqVO extends PageParam { + +// @Schema(description = "订单类型", example = "1") +// private Integer type; +// +// @Schema(description = "订单状态", example = "1") +// @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}") +// private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsRespVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsRespVO.java new file mode 100644 index 0000000..6290d31 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSalesStatisticsRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.trade.controller.admin.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 交易订单统计 Response VO") +@Data +public class TradeOrderSalesStatisticsRespVO { + + + + @Schema(description = "设备IMEI", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String deviceId; + + @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String barCode; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String spuName; + + @Schema(description = "销售数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderCount; + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java index 9b8400e..c4acbbf 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java @@ -349,4 +349,17 @@ public interface TradeOrderConvert { TradeOrderDO convert(Long userId, GiftVoucherCalculateRespBO calculateRespBO); + default PageResult convertStatistics(PageResult orderItemStatisticsRespVOList, Map spuDeviceMap, Map skuMap){ + // 转化 List + List orderVOs = CollectionUtils.convertList(orderItemStatisticsRespVOList.getList(), order -> { + + TradeOrderSalesStatisticsRespVO orderVO = new TradeOrderSalesStatisticsRespVO(); + orderVO.setDeviceId(spuDeviceMap.get(order.getSpuId())); + orderVO.setBarCode(skuMap.get(order.getSkuId())); + orderVO.setSpuName(order.getSpuName()); + orderVO.setOrderCount(order.getOrderCount()); + return orderVO; + }); + return new PageResult<>(orderVOs, orderItemStatisticsRespVOList.getTotal()); + } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemCountDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemCountDO.java new file mode 100644 index 0000000..98fe92f --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemCountDO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.trade.dal.dataobject.order; + +import lombok.Data; + +/** + * 商品 SPU DO + * + * @author 芋道源码 + */ +@Data +public class TradeOrderItemCountDO extends TradeOrderItemDO { + /** + * 销售数量 + */ + private Integer orderCount; +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java index 5336a26..e673eae 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java @@ -2,11 +2,19 @@ package cn.iocoder.yudao.module.trade.dal.mysql.order; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderItemStatisticsRespVO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSalesStatisticsReqVO; +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemCountDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,4 +57,20 @@ public interface TradeOrderItemMapper extends BaseMapperX { // 获得数量 return CollUtil.getFirst(result) != null ? MapUtil.getInt(result.get(0), "sumCount") : 0; } + + default PageResult selectSalesStatistics(TradeOrderSalesStatisticsReqVO reqVO){ +// return selectList(new MPJLambdaWrapperX() +// .selectSum(TradeOrderItemDO::getCount) // 售后状态对应的数量 +// .eq(TradeOrderItemDO::getAfterSaleStatus, reqVO.getAfterSaleStatus) +// .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime()) +// .groupBy(TradeOrderItemDO::getSpuId));// 按售后状态分组 + MPJLambdaWrapper query = new MPJLambdaWrapperX() + .selectAll(TradeOrderItemDO.class) + .selectSum(TradeOrderItemDO::getCount, TradeOrderItemCountDO::getOrderCount) + .betweenIfPresent(TradeOrderItemDO::getCreateTime, reqVO.getCreateTime()) + .groupBy(TradeOrderItemDO::getSpuId); + query.leftJoin(TradeOrderDO.class,TradeOrderDO::getId, TradeOrderItemDO::getOrderId) + .eq(TradeOrderDO::getStatus, TradeOrderStatusEnum.COMPLETED.getStatus()); + return selectJoinPage(reqVO,TradeOrderItemCountDO.class,query); + } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java index d250964..ab2bc4d 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.trade.service.order; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderItemStatisticsRespVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSalesStatisticsReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; @@ -157,4 +159,5 @@ public interface TradeOrderQueryService { */ List getOrderItemListByOrderId(Collection orderIds); + PageResult getSalesStatistics(TradeOrderSalesStatisticsReqVO salesStatisticsReqVO); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java index c51aee1..71e69ec 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java @@ -6,13 +6,18 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderItemStatisticsRespVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSalesStatisticsReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemCountDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; @@ -248,6 +253,12 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { return tradeOrderItemMapper.selectListByOrderId(orderIds); } + @Override + public PageResult getSalesStatistics(TradeOrderSalesStatisticsReqVO salesStatisticsReqVO) { + PageResult tradeOrderItemDOS = tradeOrderItemMapper.selectSalesStatistics(salesStatisticsReqVO); + return BeanUtils.toBean(tradeOrderItemDOS, TradeOrderItemStatisticsRespVO.class); + } + /** * 获得自身的代理对象,解决 AOP 生效问题 * diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java index f937f88..8b55ddd 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java @@ -14,6 +14,8 @@ import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi; import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeProductSettlementRespVO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; @@ -58,6 +60,9 @@ public class TradePriceServiceImpl implements TradePriceService { @Resource private DeviceApi deviceApi; + @Resource + private AdminUserApi adminUserApi; + @Resource private List priceCalculators; @@ -187,9 +192,25 @@ public class TradePriceServiceImpl implements TradePriceService { } private List checkSummarySkuList(TradePriceCalculateSummaryReqBO calculateReqBO) { - // 获得商品 SKU 数组 - //根据商品码获取sku列表 - List skus = productSkuApi.getSkuListByBarCode(convertSet(calculateReqBO.getItems(), TradePriceCalculateSummaryReqBO.Item::getBarCode)) + + //判断是不是有不同机器的订单(一个创建人是一台机器) + boolean isSingleCreator = calculateReqBO.getItems().stream() + .map(TradePriceCalculateSummaryReqBO.Item::getDeviceId) //获取每个商品的Creator + .distinct() //去重Creator + .count() == 1; // 判断是否只有一个唯一的创建人 + if (!isSingleCreator) { + System.out.println("订单明细中涉及多台贩卖机"); + throw exception(SUMMARY_NOT_DUPLICATE); + } + // 只有一个Creator的逻辑处理 + System.out.println("订单明细中只有一台贩卖机"); + //查询商品创建人的设备IMEI + AdminUserRespDTO user = adminUserApi.getUserByDeviceid(calculateReqBO.getItems().get(0).getDeviceId()); + if (user == null|| user.getDeviceId() == null){ + throw exception(DEVICE_NOT_EXISTS); + } + // 获得商品 SKU 数组 + List skus = productSkuApi.getSkuListByCreator(user.getId()) .stream() .filter(sku -> sku.getStock() > 0) .sorted(Comparator.comparing(sku -> { diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java index 9e330f2..2c3d1d4 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java @@ -86,5 +86,5 @@ public interface AdminUserApi { */ void validateUserList(Collection ids); - AdminUserRespDTO getUserByDeviceid(Long deviceid); + AdminUserRespDTO getUserByDeviceid(String deviceid); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java index e96a992..ec55f80 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java @@ -84,7 +84,7 @@ public class AdminUserApiImpl implements AdminUserApi { } @Override - public AdminUserRespDTO getUserByDeviceid(Long deviceid) { + public AdminUserRespDTO getUserByDeviceid(String deviceid) { AdminUserDO user = userService.getUserByDeviceid(deviceid); return BeanUtils.toBean(user, AdminUserRespDTO.class); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index c29115a..0dfa253 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -48,7 +48,7 @@ public interface AdminUserMapper extends BaseMapperX { return selectList(AdminUserDO::getDeptId, deptIds); } - default AdminUserDO getUserByDeviceid(Long deviceid){ + default AdminUserDO getUserByDeviceid(String deviceid){ return selectOne(AdminUserDO::getDeviceId, deviceid); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index b13a3bf..7d4db25 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -216,5 +216,5 @@ public interface AdminUserService { */ boolean isPasswordMatch(String rawPassword, String encodedPassword); - AdminUserDO getUserByDeviceid(Long deviceid); + AdminUserDO getUserByDeviceid(String deviceid); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 3d92ef7..9811407 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -519,7 +519,7 @@ public class AdminUserServiceImpl implements AdminUserService { } @Override - public AdminUserDO getUserByDeviceid(Long deviceid) { + public AdminUserDO getUserByDeviceid(String deviceid) { return userMapper.getUserByDeviceid(deviceid); } diff --git a/yudao-server/src/main/resources/application-prod.yaml b/yudao-server/src/main/resources/application-prod.yaml index f961325..b0ca3f4 100644 --- a/yudao-server/src/main/resources/application-prod.yaml +++ b/yudao-server/src/main/resources/application-prod.yaml @@ -45,7 +45,7 @@ spring: primary: master datasource: master: - url: jdbc:mysql://127.0.0.1:11294/xr?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://192.168.0.7:37897/xr?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 @@ -63,7 +63,7 @@ spring: # password: Yudao@2024 # OpenGauss 连接的示例 slave: # 模拟从库,可根据自己需要修改 lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://127.0.0.1:11294/xr?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://192.168.0.7:37897/xr?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true username: xr password: zd5ecNxeXHZxkWs8