商品模块代码提交

This commit is contained in:
Tankaikai
2025-02-18 10:57:58 +08:00
parent 50f19eafbf
commit 81b326853c
9 changed files with 374 additions and 7 deletions

View File

@@ -0,0 +1,166 @@
package com.czg.service.product.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.czg.enums.DeleteEnum;
import com.czg.enums.StatusEnum;
import com.czg.enums.YesNoEnum;
import com.czg.product.dto.ProdSkuDTO;
import com.czg.product.dto.ProductDTO;
import com.czg.product.entity.ProdGroup;
import com.czg.product.entity.ProdGroupRelation;
import com.czg.product.entity.ProdSku;
import com.czg.product.entity.Product;
import com.czg.product.param.MiniHomeProductParam;
import com.czg.product.service.UProductService;
import com.czg.product.vo.MiniAppHomeProdGroupVo;
import com.czg.product.vo.MiniAppHomeProductInfoVo;
import com.czg.product.vo.MiniAppHomeProductVo;
import com.czg.sa.StpKit;
import com.czg.service.product.mapper.ProdGroupMapper;
import com.czg.service.product.mapper.ProdGroupRelationMapper;
import com.czg.service.product.mapper.ProdSkuMapper;
import com.czg.service.product.mapper.ProductMapper;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.TextStyle;
import java.util.*;
import java.util.stream.Collectors;
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.ShopProdSpecTableDef.SHOP_PROD_SPEC;
import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT;
/**
* 商品
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-16
*/
@Slf4j
@AllArgsConstructor
@Service
public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements UProductService {
private final ProductMapper productMapper;
private final ProdSkuMapper prodSkuMapper;
private final ProdGroupMapper prodGroupMapper;
private final ProdGroupRelationMapper prodGroupRelationMapper;
private QueryWrapper buildQueryWrapper(MiniHomeProductParam param) {
Long shopId = StpKit.USER.getShopId(0L);
String weekDayEnName = getWeekDayEnName();
LocalTime now = LocalTime.now().withNano(0);
QueryWrapper queryWrapper = query();
queryWrapper.select(PRODUCT.ALL_COLUMNS)
.select(SHOP_PROD_UNIT.NAME.as(ProductDTO::getUnitName))
.select(SHOP_PROD_CATEGORY.NAME.as(ProductDTO::getCategoryName))
.select(SHOP_PROD_SPEC.NAME.as(ProductDTO::getSpecName), SHOP_PROD_SPEC.FULL_NAME.as(ProductDTO::getSpecFullName))
.from(PRODUCT)
.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_SPEC).on(SHOP_PROD_SPEC.ID.eq(PRODUCT.SPEC_ID))
.where(PRODUCT.SHOP_ID.eq(shopId))
.and(PRODUCT.DAYS.like(weekDayEnName))
.and(PRODUCT.START_TIME.le(now))
.and(PRODUCT.END_TIME.ge(now))
.and(PRODUCT.IS_DEL.eq(DeleteEnum.NORMAL.value()))
.and(PRODUCT.IS_SALE.eq(YesNoEnum.YES.value()))
.orderBy(PRODUCT.SORT, false)
.orderBy(PRODUCT.ID, false);
if (CollUtil.isNotEmpty(param.getProductIdList())) {
queryWrapper.and(PRODUCT.ID.in(param.getProductIdList()));
}
return queryWrapper;
}
private QueryWrapper buildHotsQueryWrapper(MiniHomeProductParam param) {
// 查询在可售时间内的热门商品
QueryWrapper queryWrapper = buildQueryWrapper(param);
queryWrapper.and(PRODUCT.IS_HOT.eq(YesNoEnum.YES.value()));
return queryWrapper;
}
private List<MiniAppHomeProductInfoVo> buildProductList(QueryWrapper queryWrapper) {
List<ProductDTO> dtoList = productMapper.selectListByQueryAs(queryWrapper, ProductDTO.class);
List<Long> prodIdList = dtoList.stream().map(ProductDTO::getId).distinct().toList();
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query().in(ProdSku::getProductId, prodIdList), ProdSkuDTO.class);
Map<Long, List<ProdSkuDTO>> collect = skuList.stream().collect(Collectors.groupingBy(ProdSkuDTO::getProductId));
List<MiniAppHomeProductInfoVo> products = new ArrayList<>();
for (ProductDTO dto : dtoList) {
MiniAppHomeProductInfoVo prod = new MiniAppHomeProductInfoVo();
prod.setId(dto.getId());
prod.setName(dto.getName());
prod.setCoverImg(dto.getCoverImg());
prod.setImages(dto.getImages());
prod.setUnitName(dto.getUnitName());
prod.setCategoryName(dto.getCategoryName());
prod.setType(dto.getType());
prod.setGroupType(dto.getGroupType());
prod.setSelectSpecInfo(dto.getSelectSpecInfo());
List<ProdSkuDTO> list = collect.getOrDefault(dto.getId(), Collections.emptyList());
Optional<BigDecimal> lowPriceIsPresent = list.stream().map(ProdSkuDTO::getSalePrice).min(BigDecimal::compareTo);
lowPriceIsPresent.ifPresent(prod::setLowPrice);
Optional<BigDecimal> lowMemberPriceIsPresent = list.stream().map(ProdSkuDTO::getMemberPrice).min(BigDecimal::compareTo);
lowMemberPriceIsPresent.ifPresent(prod::setLowMemberPrice);
prod.setSkuList(list);
products.add(prod);
}
return products;
}
@Override
public MiniAppHomeProductVo queryProductForMiniAppHome(MiniHomeProductParam param) {
Long shopId = StpKit.USER.getShopId(0L);
MiniAppHomeProductVo vo = new MiniAppHomeProductVo();
List<MiniAppHomeProductInfoVo> hots = buildProductList(buildHotsQueryWrapper(param));
vo.setHots(hots);
// 查询可用商品分组,构建分组商品数据
QueryWrapper queryWrapper = query()
.eq(ProdGroup::getShopId, shopId)
.eq(ProdGroup::getStatus, StatusEnum.ENABLED.value())
.orderBy(ProdGroup::getSort, true);
if (param.getProdGroupId() != null) {
queryWrapper.eq(ProdGroup::getId, param.getProdGroupId());
}
List<MiniAppHomeProdGroupVo> groupList = prodGroupMapper.selectListByQueryAs(queryWrapper, MiniAppHomeProdGroupVo.class);
for (MiniAppHomeProdGroupVo dto : groupList) {
List<Long> productIdList = prodGroupRelationMapper.selectObjectListByQueryAs(query().select(ProdGroupRelation::getProductId).eq(ProdGroupRelation::getProdGroupId, dto.getId()).orderBy(ProdGroupRelation::getSort, true), Long.class);
if (CollUtil.isNotEmpty(productIdList)) {
param.setProductIdList(productIdList);
List<MiniAppHomeProductInfoVo> products = buildProductList(buildQueryWrapper(param));
dto.setProducts(products);
} else {
dto.setProducts(new ArrayList<>());
}
}
vo.setProductInfo(groupList);
return vo;
}
/**
* 获取当前日期是星期几的英文名称
*
* @return 星期几的英文名称,例如 "Monday" 或 "Friday"
*/
private String getWeekDayEnName() {
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取当前日期是星期几,返回一个 DayOfWeek 枚举类型的实例
DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
return dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH);
}
}