在线商城
This commit is contained in:
1 parent
d5630ecfb1
commit
09f65b264a
7 files changed
+78
-6
No files matched your search
+5
@@ -2,6 +2,8 @@ package com.bsd.pjcloud.supermarket.entity;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import com.baomidou.mybatisplus.extension.activerecord.Model;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import com.bsd.pjcloud.common.core.util.TenantTable;
|
import com.bsd.pjcloud.common.core.util.TenantTable;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -87,11 +89,13 @@ public class ShopSkuEntity extends Model<ShopSkuEntity> {
|
|||||||
* 进价/单位分
|
* 进价/单位分
|
||||||
*/
|
*/
|
||||||
@Schema(description="进价/单位分")
|
@Schema(description="进价/单位分")
|
||||||
|
@JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分
|
||||||
private Integer purchasePrice;
|
private Integer purchasePrice;
|
||||||
/**
|
/**
|
||||||
* 零售价/单位分
|
* 零售价/单位分
|
||||||
*/
|
*/
|
||||||
@Schema(description="零售价/单位分")
|
@Schema(description="零售价/单位分")
|
||||||
|
@JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分
|
||||||
private Integer retailPrice;
|
private Integer retailPrice;
|
||||||
/**
|
/**
|
||||||
* spuID
|
* spuID
|
||||||
@@ -102,6 +106,7 @@ public class ShopSkuEntity extends Model<ShopSkuEntity> {
|
|||||||
* 促销价
|
* 促销价
|
||||||
*/
|
*/
|
||||||
@Schema(description="促销价")
|
@Schema(description="促销价")
|
||||||
|
@JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分
|
||||||
private Integer promotionPrice;
|
private Integer promotionPrice;
|
||||||
/**
|
/**
|
||||||
* 库存
|
* 库存
|
||||||
|
|||||||
+22
@@ -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;
|
||||||
|
|
||||||
|
// 可扩展其他字段
|
||||||
|
}
|
||||||
+11
@@ -37,4 +37,15 @@ public class ShopSpuListAppVo {
|
|||||||
@Schema(description="商品分类编号")
|
@Schema(description="商品分类编号")
|
||||||
private Long categoryId;
|
private Long categoryId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最低价(元)
|
||||||
|
*/
|
||||||
|
@Schema(description="最低价(元)")
|
||||||
|
private java.math.BigDecimal minPrice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 总库存
|
||||||
|
*/
|
||||||
|
@Schema(description="总库存")
|
||||||
|
private Double totalStock;
|
||||||
}
|
}
|
||||||
+30
-4
@@ -34,15 +34,41 @@ public class AppShopSpuController {
|
|||||||
@Operation(summary = "APP商品分页", description = "移动端商品分页")
|
@Operation(summary = "APP商品分页", description = "移动端商品分页")
|
||||||
public R<IPage<ShopSpuListAppVo>> page(
|
public R<IPage<ShopSpuListAppVo>> page(
|
||||||
@ParameterObject Page page,
|
@ParameterObject Page page,
|
||||||
@RequestParam(required = false) Integer categoryId,
|
@RequestParam(required = false) Long categoryId,
|
||||||
@RequestParam(required = false) String keyword
|
@RequestParam(required = false) String keyword,
|
||||||
|
@RequestParam(required = false) String merchantId
|
||||||
) {
|
) {
|
||||||
LambdaQueryWrapper<ShopSpuEntity> wrapper = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<ShopSpuEntity> wrapper = Wrappers.lambdaQuery();
|
||||||
wrapper.eq(categoryId != null, ShopSpuEntity::getCategoryId, categoryId);
|
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); // 只查上架
|
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<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);
|
return R.ok(voPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
@@ -3,14 +3,17 @@ package com.bsd.pjcloud.supermarket.controller;
|
|||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.bsd.pjcloud.common.core.util.R;
|
import com.bsd.pjcloud.common.core.util.R;
|
||||||
import com.bsd.pjcloud.common.log.annotation.SysLog;
|
import com.bsd.pjcloud.common.log.annotation.SysLog;
|
||||||
import com.bsd.pjcloud.common.security.util.SecurityUtils;
|
import com.bsd.pjcloud.common.security.util.SecurityUtils;
|
||||||
import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity;
|
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.entity.ShopSkuEntity;
|
||||||
import com.bsd.pjcloud.supermarket.service.ShopSpuService;
|
import com.bsd.pjcloud.supermarket.service.ShopSpuService;
|
||||||
|
import com.bsd.pjcloud.supermarket.service.ShopSkuService;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
|
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
|
||||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
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.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品spu
|
* 商品spu
|
||||||
@@ -38,6 +43,7 @@ import java.util.Objects;
|
|||||||
public class ShopSpuController {
|
public class ShopSpuController {
|
||||||
|
|
||||||
private final ShopSpuService shopSpuService;
|
private final ShopSpuService shopSpuService;
|
||||||
|
private final ShopSkuService shopSkuService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询
|
* 分页查询
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package com.bsd.pjcloud.supermarket.service;
|
package com.bsd.pjcloud.supermarket.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.plugins.pagination.Page;
|
||||||
import com.github.yulichang.extension.mapping.base.MPJDeepService;
|
import com.github.yulichang.extension.mapping.base.MPJDeepService;
|
||||||
import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity;
|
import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity;
|
||||||
@@ -21,5 +22,5 @@ public interface ShopSpuService extends MPJDeepService<ShopSpuEntity> {
|
|||||||
* @param wrapper
|
* @param wrapper
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Object pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper);
|
IPage<ShopSpuEntity> pageScope(Page page, LambdaQueryWrapper<ShopSpuEntity> wrapper);
|
||||||
}
|
}
|
||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package com.bsd.pjcloud.supermarket.service.impl;
|
package com.bsd.pjcloud.supermarket.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.bsd.pjcloud.common.data.datascope.DataScope;
|
import com.bsd.pjcloud.common.data.datascope.DataScope;
|
||||||
@@ -69,7 +70,7 @@ public class ShopSpuServiceImpl extends ServiceImpl<ShopSpuMapper, ShopSpuEntity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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());
|
return baseMapper.selectPageByScope(page, wrapper, DataScope.of());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user