在线商城

This commit is contained in:
zjf committed 2025-07-17 10:22:25 +08:00
1 parent d5630ecfb1
commit 09f65b264a
7 files changed
+78 -6

No files matched your search

@@ -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<ShopSkuEntity> {
* 进价/单位分
*/
@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<ShopSkuEntity> {
* 促销价
*/
@Schema(description="促销价")
@JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分
private Integer promotionPrice;
/**
* 库存
@@ -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;
// 可扩展其他字段
}
@@ -37,4 +37,15 @@ public class ShopSpuListAppVo {
@Schema(description="商品分类编号")
private Long categoryId;
/**
* 最低价(元)
*/
@Schema(description="最低价(元)")
private java.math.BigDecimal minPrice;
/**
* 总库存
*/
@Schema(description="总库存")
private Double totalStock;
}
@@ -34,15 +34,41 @@ public class AppShopSpuController {
@Operation(summary = "APP商品分页", description = "移动端商品分页")
public R<IPage<ShopSpuListAppVo>> 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<ShopSpuEntity> 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<ShopSpuEntity> spuPage = shopSpuService.page(page, wrapper);
IPage<ShopSpuListAppVo> voPage = spuPage.convert(spu -> BeanUtils.toBean(spu, ShopSpuListAppVo.class));
List<Long> spuIds = spuPage.getRecords().stream().map(ShopSpuEntity::getId).collect(java.util.stream.Collectors.toList());
List<ShopSkuEntity> skuList = spuIds.isEmpty() ? List.of() : shopSkuService.list(
Wrappers.<ShopSkuEntity>lambdaQuery().in(ShopSkuEntity::getSpuId, spuIds)
);
java.util.Map<Long, List<ShopSkuEntity>> skuMap = skuList.stream().collect(java.util.stream.Collectors.groupingBy(ShopSkuEntity::getSpuId));
IPage<ShopSpuListAppVo> voPage = spuPage.convert(spu -> {
ShopSpuListAppVo vo = com.bsd.pjcloud.common.core.util.BeanUtils.toBean(spu, ShopSpuListAppVo.class);
List<ShopSkuEntity> 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);
}
@@ -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;
/**
* 分页查询
@@ -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<ShopSpuEntity> {
* @param wrapper
* @return
*/
Object pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper);
IPage<ShopSpuEntity> pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper);
}
@@ -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<ShopSpuMapper, ShopSpuEntity
}
@Override
public Object pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper) {
public IPage<ShopSpuEntity> pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper) {
return baseMapper.selectPageByScope(page, wrapper, DataScope.of());
}
}