Merge remote-tracking branch 'origin/prod'

This commit is contained in:
Tankaikai 2025-04-07 16:19:14 +08:00
commit cfc5655e69
7 changed files with 112 additions and 10 deletions

View File

@ -1,5 +1,7 @@
package com.czg.controller.user; package com.czg.controller.user;
import com.czg.product.dto.GroupIsSaleTimeDTO;
import com.czg.product.dto.ProdIsSaleTimeDTO;
import com.czg.product.param.ShopProductSkuParam; import com.czg.product.param.ShopProductSkuParam;
import com.czg.product.service.UProductService; import com.czg.product.service.UProductService;
import com.czg.product.vo.ShopGroupProductVo; import com.czg.product.vo.ShopGroupProductVo;
@ -40,6 +42,10 @@ public class UProductController {
public CzgResult<List<ShopProductVo>> queryHotsProductList() { public CzgResult<List<ShopProductVo>> queryHotsProductList() {
Long shopId = StpKit.USER.getShopId(0L); Long shopId = StpKit.USER.getShopId(0L);
List<ShopProductVo> list = uProductService.queryHotsProductList(shopId); List<ShopProductVo> list = uProductService.queryHotsProductList(shopId);
list.forEach(prod -> {
ProdIsSaleTimeDTO prodSaleTime = prod.getProdIsSaleTimeDTO();
prod.setIsSaleTime(uProductService.calcIsSaleTime(prodSaleTime.getDays(), prodSaleTime.getStartTime(), prodSaleTime.getEndTime()));
});
uProductService.refreshProductStock(shopId, list); uProductService.refreshProductStock(shopId, list);
return CzgResult.success(list); return CzgResult.success(list);
} }
@ -54,6 +60,12 @@ public class UProductController {
Map<Long, Integer> productStock = uProductService.findShopProductStock(shopId); Map<Long, Integer> productStock = uProductService.findShopProductStock(shopId);
list.forEach(item -> { list.forEach(item -> {
uProductService.refreshProductStock(productStock, item.getProductList()); uProductService.refreshProductStock(productStock, item.getProductList());
item.getProductList().forEach(prod -> {
ProdIsSaleTimeDTO prodSaleTime = prod.getProdIsSaleTimeDTO();
prod.setIsSaleTime(uProductService.calcIsSaleTime(prodSaleTime.getDays(), prodSaleTime.getStartTime(), prodSaleTime.getEndTime()));
GroupIsSaleTimeDTO groupSaleTime = prod.getGroupIsSaleTimeDTO();
prod.setIsSaleTime(uProductService.calcIsSaleTime(groupSaleTime.getUseTime(), groupSaleTime.getStartTime(), groupSaleTime.getEndTime()));
});
}); });
return CzgResult.success(list); return CzgResult.success(list);
} }

View File

@ -0,0 +1,25 @@
package com.czg.product.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalTime;
/**
* 分组可售时间管控
* @author tankaikai
* @since 2025-04-07 16:04
*/
@Data
@AllArgsConstructor
public class GroupIsSaleTimeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer useTime;
private LocalTime startTime;
private LocalTime endTime;
}

View File

@ -0,0 +1,24 @@
package com.czg.product.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalTime;
/**
* 商品可售时间管控
* @author tankaikai
* @since 2025-04-07 16:03
*/
@Data
@AllArgsConstructor
public class ProdIsSaleTimeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String days;
private LocalTime startTime;
private LocalTime endTime;
}

View File

@ -8,11 +8,13 @@ import com.czg.product.vo.ShopProductSkuInfoVo;
import com.czg.product.vo.ShopProductVo; import com.czg.product.vo.ShopProductVo;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
import java.time.LocalTime;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* 用户端商品Service * 用户端商品Service
*
* @author tankaikai * @author tankaikai
* @since 2025-02-17 14:57 * @since 2025-02-17 14:57
*/ */
@ -28,6 +30,7 @@ public interface UProductService extends IService<Product> {
/** /**
* 用户端获取分组商品 * 用户端获取分组商品
*
* @param shopId 店铺ID * @param shopId 店铺ID
* @return 分组商品 * @return 分组商品
*/ */
@ -35,6 +38,7 @@ public interface UProductService extends IService<Product> {
/** /**
* 用户端获取商品详情 * 用户端获取商品详情
*
* @param id 商品ID * @param id 商品ID
* @return 商品详情 * @return 商品详情
*/ */
@ -42,6 +46,7 @@ public interface UProductService extends IService<Product> {
/** /**
* 用户端获取商品SKU详情 * 用户端获取商品SKU详情
*
* @param param 商品SKU查询参数 * @param param 商品SKU查询参数
* @return 商品详情 * @return 商品详情
*/ */
@ -49,21 +54,44 @@ public interface UProductService extends IService<Product> {
/** /**
* 刷新商品库存 * 刷新商品库存
*
* @param shopId 店铺id * @param shopId 店铺id
*/ */
Map<Long, Integer> findShopProductStock(Long shopId); Map<Long, Integer> findShopProductStock(Long shopId);
/** /**
* 刷新商品库存 * 刷新商品库存
* @param shopId 店铺id *
* @param shopId 店铺id
* @param productList 商品列表 * @param productList 商品列表
*/ */
void refreshProductStock(Long shopId,List<ShopProductVo> productList); void refreshProductStock(Long shopId, List<ShopProductVo> productList);
/** /**
* 刷新商品库存 * 刷新商品库存
*
* @param productStock 商品库存 * @param productStock 商品库存
* @param productList 商品列表 * @param productList 商品列表
*/ */
void refreshProductStock(Map<Long, Integer> productStock,List<ShopProductVo> productList); void refreshProductStock(Map<Long, Integer> productStock, List<ShopProductVo> productList);
/**
* 分组计算是否在可售时间内
*
* @param useTime 开启时间管控 0:1:
* @param startTime 起售时间
* @param endTime 停售时间
* @return 是否可售时间 1-0-
*/
Integer calcIsSaleTime(Integer useTime, LocalTime startTime, LocalTime endTime);
/**
* 商品计算是否在可售时间内
*
* @param days 星期几例如 "Monday,Tuesday"
* @param startTime 起售时间
* @param endTime 停售时间
* @return 是否可售时间 1-0-
*/
Integer calcIsSaleTime(String days, LocalTime startTime, LocalTime endTime);
} }

View File

@ -1,6 +1,8 @@
package com.czg.product.vo; package com.czg.product.vo;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.product.dto.GroupIsSaleTimeDTO;
import com.czg.product.dto.ProdIsSaleTimeDTO;
import com.czg.product.dto.ProdSkuDTO; import com.czg.product.dto.ProdSkuDTO;
import lombok.Data; import lombok.Data;
@ -113,4 +115,10 @@ public class ShopProductVo implements Serializable {
* 销量 * 销量
*/ */
private BigDecimal salesVolume; private BigDecimal salesVolume;
@JSONField(serialize = false)
private ProdIsSaleTimeDTO prodIsSaleTimeDTO;
@JSONField(serialize = false)
private GroupIsSaleTimeDTO groupIsSaleTimeDTO;
} }

View File

@ -72,6 +72,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
private final ProductStockFlowService productStockFlowService; private final ProductStockFlowService productStockFlowService;
private final ConsStockFlowService consStockFlowService; private final ConsStockFlowService consStockFlowService;
private final SensitiveOperationService sensitiveOperationService; private final SensitiveOperationService sensitiveOperationService;
private final ProdGroupRelationMapper prodGroupRelationMapper;
private QueryWrapper buildQueryWrapper(ProductDTO param) { private QueryWrapper buildQueryWrapper(ProductDTO param) {
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
@ -426,6 +427,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
.eq(Product::getId, id) .eq(Product::getId, id)
.eq(Product::getShopId, shopId) .eq(Product::getShopId, shopId)
.update(); .update();
prodGroupRelationMapper.deleteByQuery(query().eq(ProdGroupRelation::getProductId, id).eq(ProdGroup::getShopId, shopId));
} }
@Override @Override

View File

@ -10,7 +10,9 @@ import com.czg.enums.DeleteEnum;
import com.czg.enums.StatusEnum; import com.czg.enums.StatusEnum;
import com.czg.enums.YesNoEnum; import com.czg.enums.YesNoEnum;
import com.czg.exception.CzgException; import com.czg.exception.CzgException;
import com.czg.product.dto.GroupIsSaleTimeDTO;
import com.czg.product.dto.ProdGroupRelationDTO; import com.czg.product.dto.ProdGroupRelationDTO;
import com.czg.product.dto.ProdIsSaleTimeDTO;
import com.czg.product.dto.ProdSkuDTO; import com.czg.product.dto.ProdSkuDTO;
import com.czg.product.entity.ProdGroup; import com.czg.product.entity.ProdGroup;
import com.czg.product.entity.ProdGroupRelation; import com.czg.product.entity.ProdGroupRelation;
@ -61,7 +63,7 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
public List<ShopProductVo> queryHotsProductList(Long shopId) { public List<ShopProductVo> queryHotsProductList(Long shopId) {
List<ShopProductVo> list = productMapper.selectHotsProductList(shopId); List<ShopProductVo> list = productMapper.selectHotsProductList(shopId);
list.forEach(item -> { list.forEach(item -> {
item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime())); item.setProdIsSaleTimeDTO(new ProdIsSaleTimeDTO(item.getDays(), item.getStartTime(), item.getEndTime()));
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query() List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query()
.eq(ProdSku::getProductId, item.getId()) .eq(ProdSku::getProductId, item.getId())
.eq(ProdSku::getIsGrounding, YesNoEnum.YES.value()) .eq(ProdSku::getIsGrounding, YesNoEnum.YES.value())
@ -80,7 +82,7 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
.orderBy(ProdGroup::getSort, true), ShopGroupProductVo.class); .orderBy(ProdGroup::getSort, true), ShopGroupProductVo.class);
List<ShopProductVo> productAllList = productMapper.selectGroupProductList(shopId); List<ShopProductVo> productAllList = productMapper.selectGroupProductList(shopId);
productAllList.forEach(item -> { productAllList.forEach(item -> {
item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime())); item.setProdIsSaleTimeDTO(new ProdIsSaleTimeDTO(item.getDays(), item.getStartTime(), item.getEndTime()));
List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query() List<ProdSkuDTO> skuList = prodSkuMapper.selectListByQueryAs(query()
.eq(ProdSku::getProductId, item.getId()) .eq(ProdSku::getProductId, item.getId())
.eq(ProdSku::getIsGrounding, YesNoEnum.YES.value()) .eq(ProdSku::getIsGrounding, YesNoEnum.YES.value())
@ -107,9 +109,8 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
productList.add(product); productList.add(product);
} }
} }
Integer isSaleTime = calcIsSaleTime(group.getUseTime(), group.getSaleStartTime(), group.getSaleEndTime());
productList.parallelStream().forEach(product -> { productList.parallelStream().forEach(product -> {
product.setIsSaleTime(isSaleTime); product.setGroupIsSaleTimeDTO(new GroupIsSaleTimeDTO(group.getUseTime(), group.getSaleStartTime(), group.getSaleEndTime()));
}); });
// 1-价格从高到低; 2-价格从低到高; 3-销量由高到低4-销量由低到高 // 1-价格从高到低; 2-价格从低到高; 3-销量由高到低4-销量由低到高
@ -198,7 +199,8 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
* @param endTime 停售时间 * @param endTime 停售时间
* @return 是否可售时间 1-0- * @return 是否可售时间 1-0-
*/ */
private Integer calcIsSaleTime(String days, LocalTime startTime, LocalTime endTime) { @Override
public Integer calcIsSaleTime(String days, LocalTime startTime, LocalTime endTime) {
if (StrUtil.isBlank(days) || ObjUtil.isNull(startTime) || ObjUtil.isNull(endTime)) { if (StrUtil.isBlank(days) || ObjUtil.isNull(startTime) || ObjUtil.isNull(endTime)) {
return YesNoEnum.NO.value(); return YesNoEnum.NO.value();
} }
@ -219,7 +221,8 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
* @param endTime 停售时间 * @param endTime 停售时间
* @return 是否可售时间 1-0- * @return 是否可售时间 1-0-
*/ */
private Integer calcIsSaleTime(Integer useTime, LocalTime startTime, LocalTime endTime) { @Override
public Integer calcIsSaleTime(Integer useTime, LocalTime startTime, LocalTime endTime) {
if (NumberUtil.nullToZero(useTime) == 0) { if (NumberUtil.nullToZero(useTime) == 0) {
return YesNoEnum.YES.value(); return YesNoEnum.YES.value();
} }