From 09f65b264a1ff2bba449e7c8ea2e9288ff5e137d Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Thu, 17 Jul 2025 10:22:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E5=95=86=E5=9F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarket/entity/ShopSkuEntity.java | 5 +++ .../pjcloud/supermarket/vo/ShopSpuPageVo.java | 22 ++++++++++++ .../supermarket/vo/app/ShopSpuListAppVo.java | 11 ++++++ .../controller/AppShopSpuController.java | 34 ++++++++++++++++--- .../controller/ShopSpuController.java | 6 ++++ .../supermarket/service/ShopSpuService.java | 3 +- .../service/impl/ShopSpuServiceImpl.java | 3 +- 7 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopSpuPageVo.java diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java index 11407bd29..580de81c7 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java @@ -2,6 +2,8 @@ package com.bsd.pjcloud.supermarket.entity; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.bsd.pjcloud.common.core.util.MoneyDeserializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import io.swagger.v3.oas.annotations.media.Schema; import com.bsd.pjcloud.common.core.util.TenantTable; import lombok.Data; @@ -87,11 +89,13 @@ public class ShopSkuEntity extends Model { * 进价/单位分 */ @Schema(description="进价/单位分") + @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer purchasePrice; /** * 零售价/单位分 */ @Schema(description="零售价/单位分") + @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer retailPrice; /** * spuID @@ -102,6 +106,7 @@ public class ShopSkuEntity extends Model { * 促销价 */ @Schema(description="促销价") + @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer promotionPrice; /** * 库存 diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopSpuPageVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopSpuPageVo.java new file mode 100644 index 000000000..3500bf2f5 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopSpuPageVo.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.supermarket.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class ShopSpuPageVo { + @Schema(description = "商品ID") + private Long id; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "最低价") + private BigDecimal minPrice; + + @Schema(description = "总销量") + private Integer totalSales; + + // 可扩展其他字段 +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java index fe6e1b535..79b93fcbf 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java @@ -37,4 +37,15 @@ public class ShopSpuListAppVo { @Schema(description="商品分类编号") private Long categoryId; + /** + * 最低价(元) + */ + @Schema(description="最低价(元)") + private java.math.BigDecimal minPrice; + + /** + * 总库存 + */ + @Schema(description="总库存") + private Double totalStock; } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java index 7af325a39..e74bb0655 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java @@ -34,15 +34,41 @@ public class AppShopSpuController { @Operation(summary = "APP商品分页", description = "移动端商品分页") public R> page( @ParameterObject Page page, - @RequestParam(required = false) Integer categoryId, - @RequestParam(required = false) String keyword + @RequestParam(required = false) Long categoryId, + @RequestParam(required = false) String keyword, + @RequestParam(required = false) String merchantId ) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(categoryId != null, ShopSpuEntity::getCategoryId, categoryId); - wrapper.like(StrUtil.isNotBlank(keyword), ShopSpuEntity::getProductName, keyword); + wrapper.like(cn.hutool.core.util.StrUtil.isNotBlank(keyword), ShopSpuEntity::getProductName, keyword); wrapper.eq(ShopSpuEntity::getStatus, 0); // 只查上架 + if (cn.hutool.core.util.StrUtil.isNotBlank(merchantId)) { + wrapper.apply("FIND_IN_SET({0}, merchant_ids)", merchantId.trim()); + } IPage spuPage = shopSpuService.page(page, wrapper); - IPage voPage = spuPage.convert(spu -> BeanUtils.toBean(spu, ShopSpuListAppVo.class)); + List spuIds = spuPage.getRecords().stream().map(ShopSpuEntity::getId).collect(java.util.stream.Collectors.toList()); + List skuList = spuIds.isEmpty() ? List.of() : shopSkuService.list( + Wrappers.lambdaQuery().in(ShopSkuEntity::getSpuId, spuIds) + ); + java.util.Map> skuMap = skuList.stream().collect(java.util.stream.Collectors.groupingBy(ShopSkuEntity::getSpuId)); + IPage voPage = spuPage.convert(spu -> { + ShopSpuListAppVo vo = com.bsd.pjcloud.common.core.util.BeanUtils.toBean(spu, ShopSpuListAppVo.class); + List skus = skuMap.getOrDefault(spu.getId(), List.of()); + vo.setMinPrice(skus.stream() + .map(ShopSkuEntity::getRetailPrice) + .filter(java.util.Objects::nonNull) + .map(price -> new java.math.BigDecimal(price).divide(new java.math.BigDecimal(100))) + .min(java.math.BigDecimal::compareTo) + .orElse(java.math.BigDecimal.ZERO)); + vo.setTotalStock( + skus.stream() + .map(ShopSkuEntity::getStock) + .filter(java.util.Objects::nonNull) + .mapToDouble(Double::doubleValue) + .sum() + ); + return vo; + }); return R.ok(voPage); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java index 21c825b48..d15f97bb1 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java @@ -3,14 +3,17 @@ package com.bsd.pjcloud.supermarket.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import com.bsd.pjcloud.supermarket.vo.ShopSpuPageVo; import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; import com.bsd.pjcloud.supermarket.service.ShopSpuService; +import com.bsd.pjcloud.supermarket.service.ShopSkuService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -23,6 +26,8 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; +import java.math.BigDecimal; /** * 商品spu @@ -38,6 +43,7 @@ import java.util.Objects; public class ShopSpuController { private final ShopSpuService shopSpuService; + private final ShopSkuService shopSkuService; /** * 分页查询 diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java index 328973233..695798d43 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.supermarket.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.extension.mapping.base.MPJDeepService; import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; @@ -21,5 +22,5 @@ public interface ShopSpuService extends MPJDeepService { * @param wrapper * @return */ - Object pageScope(Page page, LambdaQueryWrapper wrapper); + IPage pageScope(Page page, LambdaQueryWrapper wrapper); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java index 89ed382f3..4dd0714ce 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.supermarket.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.common.data.datascope.DataScope; @@ -69,7 +70,7 @@ public class ShopSpuServiceImpl extends ServiceImpl wrapper) { + public IPage pageScope(Page page, LambdaQueryWrapper wrapper) { return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); } } \ No newline at end of file