商品模块代码提交
This commit is contained in:
parent
312f280f1f
commit
cc4616df01
|
|
@ -30,7 +30,6 @@ public class UProductController {
|
||||||
@GetMapping("/miniApp/home/queryProduct")
|
@GetMapping("/miniApp/home/queryProduct")
|
||||||
@OperationLog("小程序点餐-首页-商品列表")
|
@OperationLog("小程序点餐-首页-商品列表")
|
||||||
public CzgResult<MiniAppHomeProductVo> queryProductForMiniAppHome(MiniHomeProductParam param) {
|
public CzgResult<MiniAppHomeProductVo> queryProductForMiniAppHome(MiniHomeProductParam param) {
|
||||||
String msg = "{\"温度\":[\"冰\",\"少冰\"],\"甜度\":[\"少糖\",\"正常糖\"],\"尺码\":[]}";
|
|
||||||
MiniAppHomeProductVo data = uProductService.queryProductForMiniAppHome(param);
|
MiniAppHomeProductVo data = uProductService.queryProductForMiniAppHome(param);
|
||||||
return CzgResult.success(data);
|
return CzgResult.success(data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -198,6 +198,9 @@ public class ProductDTO implements Serializable {
|
||||||
*/
|
*/
|
||||||
private List<ProdSkuDTO> skuList;
|
private List<ProdSkuDTO> skuList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 套餐列表
|
||||||
|
*/
|
||||||
private List<ProductGroupVo> proGroupVo;
|
private List<ProductGroupVo> proGroupVo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,13 @@ public class ProdSku implements Serializable {
|
||||||
* 规格详情
|
* 规格详情
|
||||||
*/
|
*/
|
||||||
private String specInfo;
|
private String specInfo;
|
||||||
|
/**
|
||||||
|
* 商品封面图
|
||||||
|
*/
|
||||||
private String coverImg;
|
private String coverImg;
|
||||||
|
/**
|
||||||
|
* 重量
|
||||||
|
*/
|
||||||
private BigDecimal weight;
|
private BigDecimal weight;
|
||||||
/**
|
/**
|
||||||
* 销量
|
* 销量
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import lombok.Data;
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalTime;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -18,23 +17,53 @@ public class ProductGroupVo implements Serializable {
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 套餐内商品总数
|
||||||
|
*/
|
||||||
private Integer count;
|
private Integer count;
|
||||||
//选几个
|
/**
|
||||||
|
* 可选套餐几选几,固定套餐没有值
|
||||||
|
*/
|
||||||
private Integer number;
|
private Integer number;
|
||||||
//类别
|
/**
|
||||||
|
* 可选套餐名称
|
||||||
|
*/
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
//食物
|
/**
|
||||||
|
* 套餐内商品列表
|
||||||
|
*/
|
||||||
private List<Food> goods = new ArrayList<>();
|
private List<Food> goods = new ArrayList<>();
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class Food {
|
public static class Food {
|
||||||
|
/**
|
||||||
|
* 商品ID
|
||||||
|
*/
|
||||||
private Integer proId;
|
private Integer proId;
|
||||||
|
/**
|
||||||
|
* 商品名称
|
||||||
|
*/
|
||||||
private String proName;
|
private String proName;
|
||||||
|
/**
|
||||||
|
* skuId
|
||||||
|
*/
|
||||||
private Integer skuId;
|
private Integer skuId;
|
||||||
|
/**
|
||||||
|
* sku名称
|
||||||
|
*/
|
||||||
private String skuName;
|
private String skuName;
|
||||||
|
/**
|
||||||
|
* 商品单价
|
||||||
|
*/
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
|
/**
|
||||||
|
* 商品数量
|
||||||
|
*/
|
||||||
private String number;
|
private String number;
|
||||||
private LocalTime unitName;
|
/**
|
||||||
|
* 单位名称
|
||||||
|
*/
|
||||||
|
private String unitName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,14 @@ import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.core.update.UpdateChain;
|
import com.mybatisflex.core.update.UpdateChain;
|
||||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static com.czg.product.entity.table.ProductTableDef.PRODUCT;
|
import static com.czg.product.entity.table.ProductTableDef.PRODUCT;
|
||||||
import static com.czg.product.entity.table.ShopProdCategoryTableDef.SHOP_PROD_CATEGORY;
|
import static com.czg.product.entity.table.ShopProdCategoryTableDef.SHOP_PROD_CATEGORY;
|
||||||
|
|
@ -41,6 +43,7 @@ import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT;
|
||||||
* @author Tankaikai tankaikai@aliyun.com
|
* @author Tankaikai tankaikai@aliyun.com
|
||||||
* @since 1.0 2025-02-16
|
* @since 1.0 2025-02-16
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
|
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
|
||||||
|
|
@ -49,6 +52,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
|
|
||||||
private QueryWrapper buildQueryWrapper(ProductDTO param) {
|
private QueryWrapper buildQueryWrapper(ProductDTO param) {
|
||||||
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
|
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
|
||||||
|
if (ObjUtil.isNotNull(param.getId())) {
|
||||||
|
queryWrapper.like(Product::getId, param.getId());
|
||||||
|
}
|
||||||
if (StrUtil.isNotEmpty(param.getName())) {
|
if (StrUtil.isNotEmpty(param.getName())) {
|
||||||
queryWrapper.like(Product::getName, param.getName());
|
queryWrapper.like(Product::getName, param.getName());
|
||||||
}
|
}
|
||||||
|
|
@ -72,8 +78,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
return queryWrapper;
|
return queryWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private QueryWrapper buildFullQueryWrapper(ProductDTO param) {
|
||||||
public Page<ProductDTO> getProductPage(ProductDTO param) {
|
|
||||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||||
queryWrapper.select(PRODUCT.DEFAULT_COLUMNS)
|
queryWrapper.select(PRODUCT.DEFAULT_COLUMNS)
|
||||||
.select(SHOP_PROD_UNIT.NAME.as(ProductDTO::getUnitName))
|
.select(SHOP_PROD_UNIT.NAME.as(ProductDTO::getUnitName))
|
||||||
|
|
@ -83,20 +88,30 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
.leftJoin(SHOP_PROD_UNIT).on(SHOP_PROD_UNIT.ID.eq(PRODUCT.UNIT_ID))
|
.leftJoin(SHOP_PROD_UNIT).on(SHOP_PROD_UNIT.ID.eq(PRODUCT.UNIT_ID))
|
||||||
.leftJoin(SHOP_PROD_CATEGORY).on(SHOP_PROD_CATEGORY.ID.eq(PRODUCT.CATEGORY_ID))
|
.leftJoin(SHOP_PROD_CATEGORY).on(SHOP_PROD_CATEGORY.ID.eq(PRODUCT.CATEGORY_ID))
|
||||||
.leftJoin(SHOP_PROD_SPEC).on(SHOP_PROD_SPEC.ID.eq(PRODUCT.SPEC_ID));
|
.leftJoin(SHOP_PROD_SPEC).on(SHOP_PROD_SPEC.ID.eq(PRODUCT.SPEC_ID));
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<ProductDTO> getProductPage(ProductDTO param) {
|
||||||
|
QueryWrapper queryWrapper = buildFullQueryWrapper(param);
|
||||||
return super.pageAs(PageUtil.buildPage(), queryWrapper, ProductDTO.class);
|
return super.pageAs(PageUtil.buildPage(), queryWrapper, ProductDTO.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ProductDTO> getProductList(ProductDTO param) {
|
public List<ProductDTO> getProductList(ProductDTO param) {
|
||||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
QueryWrapper queryWrapper = buildFullQueryWrapper(param);
|
||||||
//queryWrapper.eq(Product::getStatus, StatusEnum.ENABLED.value());
|
|
||||||
return super.listAs(queryWrapper, ProductDTO.class);
|
return super.listAs(queryWrapper, ProductDTO.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProductDTO getProductById(Long id) {
|
public ProductDTO getProductById(Long id) {
|
||||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
ProductDTO param = new ProductDTO();
|
||||||
return super.getOneAs(query().eq(Product::getId, id).eq(Product::getShopId, shopId), ProductDTO.class);
|
param.setId(id);
|
||||||
|
QueryWrapper queryWrapper = buildFullQueryWrapper(param);
|
||||||
|
ProductDTO dto = super.getOneAs(queryWrapper, ProductDTO.class);
|
||||||
|
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query().eq(ProdSku::getProductId, id).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class);
|
||||||
|
dto.setSkuList(skuList);
|
||||||
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -109,6 +124,8 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
}
|
}
|
||||||
|
|
||||||
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
||||||
|
entity.setImages(JSON.toJSONString(dto.getImages()));
|
||||||
|
entity.setGroupSnap("[]");
|
||||||
//套餐
|
//套餐
|
||||||
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
|
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
|
||||||
//套餐内容
|
//套餐内容
|
||||||
|
|
@ -146,6 +163,8 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
throw new CzgException("商品已存在");
|
throw new CzgException("商品已存在");
|
||||||
}
|
}
|
||||||
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
||||||
|
entity.setImages(JSON.toJSONString(dto.getImages()));
|
||||||
|
entity.setGroupSnap("[]");
|
||||||
//套餐
|
//套餐
|
||||||
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
|
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
|
||||||
//套餐内容
|
//套餐内容
|
||||||
|
|
@ -157,20 +176,34 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
|
||||||
entity.setShopId(shopId);
|
entity.setShopId(shopId);
|
||||||
super.save(entity);
|
super.save(entity);
|
||||||
List<ProdSkuDTO> skuList = dto.getSkuList();
|
List<ProdSkuDTO> skuList = dto.getSkuList();
|
||||||
|
// 商品SKU-ID列表
|
||||||
|
List<Long> skuIdList = prodSkuMapper.selectListByQueryAs(query().select(ProdSku::getId).eq(ProdSku::getProductId, dto.getId()), Long.class);
|
||||||
|
dto.setSkuList(skuList);
|
||||||
if (CollUtil.isNotEmpty(skuList)) {
|
if (CollUtil.isNotEmpty(skuList)) {
|
||||||
List<ProdSku> prodSkuList = new ArrayList<>();
|
|
||||||
for (ProdSkuDTO prodSkuDTO : skuList) {
|
for (ProdSkuDTO prodSkuDTO : skuList) {
|
||||||
ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class);
|
ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class);
|
||||||
prodSku.setShopId(entity.getShopId());
|
if (prodSku.getId() == null) {
|
||||||
prodSku.setProductId(entity.getId());
|
prodSku.setShopId(entity.getShopId());
|
||||||
prodSku.setRealSalesNumber(BigDecimal.ZERO);
|
prodSku.setProductId(entity.getId());
|
||||||
prodSku.setIsPauseSale(YesNoEnum.NO.value());
|
prodSku.setRealSalesNumber(BigDecimal.ZERO);
|
||||||
prodSku.setIsGrounding(YesNoEnum.YES.value());
|
prodSku.setIsPauseSale(YesNoEnum.NO.value());
|
||||||
prodSku.setIsDel(DeleteEnum.NORMAL.value());
|
prodSku.setIsGrounding(YesNoEnum.YES.value());
|
||||||
prodSkuList.add(prodSku);
|
prodSku.setIsDel(DeleteEnum.NORMAL.value());
|
||||||
|
prodSkuMapper.insert(prodSku);
|
||||||
|
} else {
|
||||||
|
prodSkuMapper.update(prodSku);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
prodSkuMapper.insertBatch(prodSkuList);
|
// 实际提交的商品SKU-ID列表
|
||||||
|
List<Long> list = skuList.stream().map(ProdSkuDTO::getId).filter(Objects::nonNull).distinct().toList();
|
||||||
|
skuIdList.removeAll(list);
|
||||||
}
|
}
|
||||||
|
// 逻辑删除无用的SKU数据
|
||||||
|
UpdateChain.of(ProdSku.class)
|
||||||
|
.set(ProdSku::getIsDel, DeleteEnum.DELETED.value())
|
||||||
|
.in(Product::getId, skuIdList)
|
||||||
|
.eq(Product::getShopId, shopId)
|
||||||
|
.update();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
|
||||||
private List<MiniAppHomeProductInfoVo> buildProductList(QueryWrapper queryWrapper) {
|
private List<MiniAppHomeProductInfoVo> buildProductList(QueryWrapper queryWrapper) {
|
||||||
List<ProductDTO> dtoList = productMapper.selectListByQueryAs(queryWrapper, ProductDTO.class);
|
List<ProductDTO> dtoList = productMapper.selectListByQueryAs(queryWrapper, ProductDTO.class);
|
||||||
List<Long> prodIdList = dtoList.stream().map(ProductDTO::getId).distinct().toList();
|
List<Long> prodIdList = dtoList.stream().map(ProductDTO::getId).distinct().toList();
|
||||||
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query().in(ProdSku::getProductId, prodIdList), ProdSkuDTO.class);
|
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query().in(ProdSku::getProductId, prodIdList).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class);
|
||||||
Map<Long, List<ProdSkuDTO>> collect = skuList.stream().collect(Collectors.groupingBy(ProdSkuDTO::getProductId));
|
Map<Long, List<ProdSkuDTO>> collect = skuList.stream().collect(Collectors.groupingBy(ProdSkuDTO::getProductId));
|
||||||
List<MiniAppHomeProductInfoVo> products = new ArrayList<>();
|
List<MiniAppHomeProductInfoVo> products = new ArrayList<>();
|
||||||
for (ProductDTO dto : dtoList) {
|
for (ProductDTO dto : dtoList) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue