From 43afa5b4a2ef61e0c29a998e0dcaefe2c077e097 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Thu, 27 Mar 2025 10:30:16 +0800 Subject: [PATCH] =?UTF-8?q?PC=E7=AB=AF/=E6=94=B6=E9=93=B6=E6=9C=BA?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=9F=A5=E8=AF=A2=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ProductController.java | 3 ++ .../controller/user/UProductController.java | 6 ++++ .../czg/product/service/ProductService.java | 10 +++++- .../czg/product/service/UProductService.java | 21 +++++++++++ .../java/com/czg/constant/CacheConstant.java | 8 +++++ .../service/impl/ProdGroupServiceImpl.java | 12 ++++--- .../service/impl/ProductRpcServiceImpl.java | 7 ++-- .../service/impl/ProductServiceImpl.java | 36 ++++++++++++++----- .../service/impl/UProductServiceImpl.java | 31 ++++++++++++++++ 9 files changed, 115 insertions(+), 19 deletions(-) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java index 9faeb6b3d..4937fe2f9 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java @@ -61,7 +61,10 @@ public class ProductController { @OperationLog("商品-列表") //@SaAdminCheckPermission("product:list") public CzgResult> getProductList(ProductDTO param) { + Long shopId = StpKit.USER.getShopId(0L); + param.setShopId(shopId); List data = productService.getProductList(param); + productService.refreshProductStock(param, data); return CzgResult.success(data); } diff --git a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java index c94f3e055..689611903 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; /** @@ -39,6 +40,7 @@ public class UProductController { public CzgResult> queryHotsProductList() { Long shopId = StpKit.USER.getShopId(0L); List list = uProductService.queryHotsProductList(shopId); + uProductService.refreshProductStock(shopId, list); return CzgResult.success(list); } @@ -49,6 +51,10 @@ public class UProductController { public CzgResult> queryGroupProductList() { Long shopId = StpKit.USER.getShopId(0L); List list = uProductService.queryGroupProductList(shopId); + Map productStock = uProductService.findShopProductStock(shopId); + list.forEach(item -> { + uProductService.refreshProductStock(productStock, item.getProductList()); + }); return CzgResult.success(list); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index 325cb1101..f6e0a5cd7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -66,7 +66,7 @@ public interface ProductService extends IService { * 删除商品 * * @param shopId 店铺ID - * @param id 商品ID + * @param id 商品ID */ void deleteProduct(Long shopId, Long id); @@ -114,9 +114,17 @@ public interface ProductService extends IService { /** * 商品出入库流水查询 + * * @param param 查询参数 * @return 分页数据 */ Page findProductStockFlowPage(ProductStockFlowParam param); + /** + * 刷新商品库存 + * + * @param param 查询条件 + * @param records 商品数据集合 + */ + void refreshProductStock(ProductDTO param, List records); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/UProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/UProductService.java index a27c58e3d..7f8b45dc3 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/UProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/UProductService.java @@ -9,6 +9,7 @@ import com.czg.product.vo.ShopProductVo; import com.mybatisflex.core.service.IService; import java.util.List; +import java.util.Map; /** * 用户端商品Service @@ -45,4 +46,24 @@ public interface UProductService extends IService { * @return 商品详情 */ ShopProductSkuInfoVo getProductSkuInfo(ShopProductSkuParam param); + + /** + * 刷新商品库存 + * @param shopId 店铺id + */ + Map findShopProductStock(Long shopId); + + /** + * 刷新商品库存 + * @param shopId 店铺id + * @param productList 商品列表 + */ + void refreshProductStock(Long shopId,List productList); + + /** + * 刷新商品库存 + * @param productStock 商品库存 + * @param productList 商品列表 + */ + void refreshProductStock(Map productStock,List productList); } diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/constant/CacheConstant.java b/cash-common/cash-common-tools/src/main/java/com/czg/constant/CacheConstant.java index 1a762e262..0622fe6c0 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/constant/CacheConstant.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/constant/CacheConstant.java @@ -11,6 +11,10 @@ public interface CacheConstant { * 用户端商品信息 */ String USER_CLIENT_PRODUCT_INFO = "user_client_product_info:"; + /** + * ADMIN端商品信息 + */ + String ADMIN_CLIENT_PRODUCT_INFO = "admin_client_product_info:"; /** * 热销商品 */ @@ -19,4 +23,8 @@ public interface CacheConstant { * 分组商品 */ String USER_CLIENT_GROUPS_PRODUCT = USER_CLIENT_PRODUCT_INFO + "groups"; + /** + * 点餐机PC端商品列表 + */ + String ADMIN_CLIENT_PRODUCT_LIST = ADMIN_CLIENT_PRODUCT_INFO + "list"; } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java index 862e2335f..473e2661c 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java @@ -31,6 +31,8 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import static com.czg.constant.CacheConstant.ADMIN_CLIENT_PRODUCT_LIST; + /** * 商品分组 * @@ -86,7 +88,7 @@ public class ProdGroupServiceImpl extends ServiceImpl> dataList) { List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); if (CollUtil.isEmpty(list)) { @@ -131,7 +129,7 @@ public class ProductRpcServiceImpl implements ProductRpcService { @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#shopId", allEntries = true, beforeInvocation = true) + //@CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#shopId", allEntries = true, beforeInvocation = true) public void orderCancelRecoverStock(Long shopId, Long orderId, List> dataList) { List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); if (CollUtil.isEmpty(list)) { @@ -203,6 +201,7 @@ public class ProductRpcServiceImpl implements ProductRpcService { } @Override + @Transactional(rollbackFor = Exception.class) public void orderRefundReturnStock(Long shopId, Long orderId, List> dataList) { List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); if (CollUtil.isEmpty(list)) { diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 7751d15dc..c51e541ab 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -35,6 +35,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -43,7 +44,9 @@ 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.constant.CacheConstant.ADMIN_CLIENT_PRODUCT_LIST; 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; @@ -155,6 +158,7 @@ public class ProductServiceImpl extends ServiceImpl impl } @Override + @Cacheable(value = ADMIN_CLIENT_PRODUCT_LIST, key = "#param.shopId", unless = "#result.isEmpty()") public List getProductList(ProductDTO param) { QueryWrapper queryWrapper = buildFullQueryWrapper(param); //queryWrapper.eq(Product::getIsSale, YesNoEnum.YES.value()); @@ -203,7 +207,7 @@ public class ProductServiceImpl extends ServiceImpl impl param.setId(id); QueryWrapper queryWrapper = buildFullQueryWrapper(param); ProductDTO dto = super.getOneAs(queryWrapper, ProductDTO.class); - if(dto == null) { + if (dto == null) { return null; } List skuList = prodSkuMapper.selectListByQueryAs(query().eq(ProdSku::getProductId, id).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class); @@ -215,10 +219,10 @@ public class ProductServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#dto.shopId", allEntries = true) + @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#dto.shopId", allEntries = true) public void addProduct(ProductDTO dto) { Long shopId = StpKit.USER.getShopId(0L); - boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId).eq(Product::getIsDel,DeleteEnum.NORMAL.value())); + boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId).eq(Product::getIsDel, DeleteEnum.NORMAL.value())); if (exists) { throw new CzgException("名称已存在"); } @@ -274,11 +278,11 @@ public class ProductServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#dto.shopId", allEntries = true) + @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#dto.shopId", allEntries = true) public void updateProduct(ProductDTO dto) { Long shopId = StpKit.USER.getShopId(0L); dto.setShopId(shopId); - boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId).eq(Product::getIsDel,DeleteEnum.NORMAL.value()).ne(Product::getId, dto.getId())); + boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId).eq(Product::getIsDel, DeleteEnum.NORMAL.value()).ne(Product::getId, dto.getId())); if (exists) { throw new CzgException("名称已存在"); } @@ -412,7 +416,7 @@ public class ProductServiceImpl extends ServiceImpl impl } @Override - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#shopId", allEntries = true) + @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#shopId", allEntries = true) public void deleteProduct(Long shopId, Long id) { UpdateChain.of(Product.class) .set(Product::getIsDel, DeleteEnum.DELETED.value()) @@ -423,7 +427,7 @@ public class ProductServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#param.shopId", allEntries = true, beforeInvocation = true) + @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#param.shopId", allEntries = true, beforeInvocation = true) public void onOffProduct(ProductIsSaleParam param) { Long shopId = StpKit.USER.getShopId(0L); String type = param.getType(); @@ -476,7 +480,7 @@ public class ProductServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT}, key = "#param.shopId", allEntries = true, beforeInvocation = true) + @CacheEvict(value = {CacheConstant.USER_CLIENT_HOTS_PRODUCT, CacheConstant.USER_CLIENT_GROUPS_PRODUCT, ADMIN_CLIENT_PRODUCT_LIST}, key = "#param.shopId", allEntries = true, beforeInvocation = true) public void markProductIsSoldOut(ProductIsSoldOutParam param) { Long shopId = StpKit.USER.getShopId(0L); String type = param.getType(); @@ -618,11 +622,25 @@ public class ProductServiceImpl extends ServiceImpl impl Long shopId = StpKit.USER.getShopId(0L); param.setShopId(shopId); PageHelper.startPage(PageUtil.buildPageHelp()); - if(InOutItemEnum.ORDER_IN.value().equals(param.getInOutItem())){ + if (InOutItemEnum.ORDER_IN.value().equals(param.getInOutItem())) { param.setInOutType(InOutTypeEnum.OUT.value()); param.setInOutItem(InOutItemEnum.ORDER_OUT.value()); param.setIsGreaterZero(YesNoEnum.YES.value()); } return PageUtil.convert(new PageInfo<>(productStockFlowMapper.getProductStockFlowList(param))); } + + @Override + public void refreshProductStock(ProductDTO param, List records) { + QueryWrapper queryWrapper = buildQueryWrapper(param); + queryWrapper.select(PRODUCT.ID, PRODUCT.STOCK_NUMBER); + List list = super.list(queryWrapper); + if (CollUtil.isEmpty(list)) { + return; + } + Map stock = list.stream().collect(Collectors.toMap(Product::getId, Product::getStockNumber)); + records.parallelStream().forEach(record -> { + record.setStockNumber(stock.getOrDefault(record.getId(), 0)); + }); + } } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java index a3a74916d..24347c757 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java @@ -1,6 +1,7 @@ package com.czg.service.product.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; @@ -145,6 +146,36 @@ public class UProductServiceImpl extends ServiceImpl imp return null; } + @Override + public Map findShopProductStock(Long shopId) { + List list = productMapper.selectListByQuery(query().select(Product::getId, Product::getStockNumber).eq(Product::getShopId, shopId)); + if (CollUtil.isNotEmpty(list)) { + return null; + } + return list.stream().collect(Collectors.toMap(Product::getId, Product::getStockNumber)); + } + + @Override + public void refreshProductStock(Long shopId, List productList) { + Map stock = findShopProductStock(shopId); + if (MapUtil.isEmpty(stock)) { + return; + } + productList.parallelStream().forEach(record -> { + record.setStockNumber(stock.getOrDefault(record.getId(), 0)); + }); + } + + @Override + public void refreshProductStock(Map productStock, List productList) { + if (MapUtil.isEmpty(productStock)) { + return; + } + productList.parallelStream().forEach(record -> { + record.setStockNumber(productStock.getOrDefault(record.getId(), 0)); + }); + } + /** * 计算是否在可售时间内 *