商品模块代码提交
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user