From aecce566ef3fbd040d86940d81b31f604b0fc660 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 29 Jul 2025 15:02:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E6=A0=BC=E5=8C=B9=E9=85=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ShopProductBaseServiceImpl.java | 48 +++++++++++++++---- .../controller/ProductMappingController.java | 6 +-- .../sync/service/ProductMappingService.java | 4 +- .../impl/ProductMappingServiceImpl.java | 45 ++++++++++++----- .../service/impl/SyncBaseThirdSxAbstract.java | 6 +-- 5 files changed, 80 insertions(+), 29 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index a1114485..89886819 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -5500,10 +5500,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl addShopProductItems = new ArrayList<>(); List updateShopProductItems = new ArrayList<>(); - List addShopProductSpecItems = new ArrayList<>(); - List updateShopProductSpecItems = new ArrayList<>(); // int taskCount = 2; // CountDownLatch latch = new CountDownLatch(taskCount); + // 2. 检查并设置已存在商品的ID // 1. 批量新增 if (CollUtil.isNotEmpty(newProducts)) { // 4. 批量生成新商品的ID @@ -5528,7 +5527,6 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl items = newShopProductItemList.get(i); processProductItems(items, productId, addItemSeqs); addShopProductItems.addAll(items); - // 处理图片 if (CollUtil.isNotEmpty(newShopProductImageList)) { processProductImages(newShopProductImageList.get(i), productId, base.getStore_id(), newProducts.get(i).getProduct_number(), newProducts.get(i).getProduct_name());//设置默认属性1 @@ -5562,11 +5560,11 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl existingProducts = checkExistingProductsItem(updateProducts); for (int i = 0; i < updateProducts.size(); i++) { Long productId = updateProducts.get(i).getProduct_id(); ShopProductBase base = updateProducts.get(i); base.setProduct_id(productId); - // 设置关联ID updateProducts.get(i).setProduct_id(productId); updateShopProductIndexList.get(i).setProduct_id(productId); @@ -5574,8 +5572,13 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl items = udpateShopProductItemList.get(i); + processProductItems(items, productId, updateItemSeqs);// updateShopProductItems.addAll(items); @@ -5595,8 +5598,8 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds = processProductItemsId(updateShopProductItems, updateItemSeqs, newShopProductInfoList); - udpateItemIds.addAll(itemIds); + //List itemIds = processProductItemsId(updateShopProductItems, updateItemSeqs, updateShopProductInfoList); + //udpateItemIds.addAll(itemIds); // 2. 批量更新 if (CollUtil.isNotEmpty(updateProducts)) { logger.info("更新任务开始执行"); @@ -5620,11 +5623,11 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl checkExistingProductsItem(List productBases) { + List> storeProductPairs = productBases.stream() + .map(p -> Pair.of(p.getStore_id(), p.getProduct_id())) + .distinct() + .collect(Collectors.toList()); + + // 使用IN查询优化(根据数据库特性可能需要分批) + QueryWrapper query = new QueryWrapper<>(); + query.select("product_id", "min(item_id) as item_id"); + + // 构建OR条件 (store_id=X AND product_number=Y) OR (store_id=A AND product_number=B)... + storeProductPairs.forEach(pair -> { + query.or(q -> q.eq("store_id", pair.getFirst()) + .eq("product_id", pair.getSecond())); + }); + query.groupBy("product_id"); + List existing = shopProductItemService.list(query); + + // 4. 构建存在商品的映射表 + return existing.stream() + .collect(Collectors.toMap( + ShopProductItem::getProduct_id, + ShopProductItem::getItem_id + )); + } + /** * 批量根据店铺和货号查询商品 */ diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java index 22a1590c..9774ee33 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java @@ -188,17 +188,17 @@ public class ProductMappingController extends BaseControllerImpl { */ @ApiOperation(value = "自动计算并上架商品", notes = "自动计算并上架商品") @RequestMapping(value = "/syncProductMaping", method = RequestMethod.PUT) - public CommonResult syncProductMaping(@RequestParam(required = false) Integer storeId) { + public CommonResult syncProductMaping(@RequestParam(required = false) Integer storeId,@RequestParam(defaultValue = "0") String isPublish) { UserDto userDto=ContextUtil.getCurrentUser(); assert userDto != null; if(userDto.isStore()) {//商店自己同步 - return productMappingService.syncAllProductMapping(Integer.valueOf(userDto.getStore_id())); + return productMappingService.syncAllProductMapping(Integer.valueOf(userDto.getStore_id()),isPublish); }else { if(ObjectUtil.isEmpty(storeId)){ return CommonResult.failed("请传入店铺id"); } } - return productMappingService.syncAllProductMapping(storeId); + return productMappingService.syncAllProductMapping(storeId,isPublish); } /** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/ProductMappingService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/ProductMappingService.java index f6f70bde..f98e8657 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/ProductMappingService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/ProductMappingService.java @@ -23,11 +23,11 @@ public interface ProductMappingService extends IBaseService { */ void computeProductMapping(List shopProductBaseList,Integer storeId, Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap, - boolean isUpdate); + boolean isUpdate,String isPubish); Map getProductMapping(Integer storeId); - CommonResult syncAllProductMapping(Integer storeId); + CommonResult syncAllProductMapping(Integer storeId,String isPublish); CommonResult getSyncProductUnchecked(Integer storeId); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java index 0e4c784f..431404e6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java @@ -27,6 +27,8 @@ import com.suisung.mall.common.modules.sync.ProductMapping; import com.suisung.mall.common.modules.sync.StoreDbConfig; import com.suisung.mall.common.utils.ContextUtil; import com.suisung.mall.common.utils.StringUtils; +import com.suisung.mall.core.consts.ConstantRedis; +import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.base.service.ShopBaseProductSpecService; @@ -48,6 +50,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -106,6 +109,9 @@ public class ProductMappingServiceImpl extends BaseServiceImpl shopProductBaseList,Integer storeId,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdate) { + public void computeProductMapping(List shopProductBaseList,Integer storeId,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdate,String isPubish) { shopProductBaseList= shopProductBaseList.stream().filter(base ->StateCode.PRODUCT_STATE_OFF_THE_SHELF_UNCHECK==(base.getProduct_state_id())).collect(Collectors.toList()); if (CollUtil.isEmpty(shopProductBaseList)) { log.info("没有规格数据要处理"); return; } - dealData(shopProductBaseList,shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,isUpdate); + dealData(shopProductBaseList,shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,isUpdate,isPubish); } @Override @@ -152,7 +158,7 @@ public class ProductMappingServiceImpl extends BaseServiceImpl shopProductBaseList,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdate){ + public void dealData(List shopProductBaseList,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdate,String isPublish){ List shopProductItems=findShopProductItemsList(shopProductBaseList); List shopProductInfoList=findShopProductInfoList(shopProductBaseList); List addShopProductSpecItemList=new ArrayList<>(); @@ -162,17 +168,24 @@ public class ProductMappingServiceImpl extends BaseServiceImpl updateShopProductIndexList=new ArrayList<>(); List updateShopProductItemList=new ArrayList<>(); List updateShopProductInfoList=new ArrayList<>(); + //找出需要更新的列表 for (int i = 0; i < shopProductBaseList.size(); i++){ ShopProductSpecItem shopProductSpecItem=processShopProductSpecItem(shopProductBaseList.get(i),shopProductItems.get(i).getCategory_id(),shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,null); if(shopProductSpecItem!=null){ ShopProductIndex shopProductIndex=new ShopProductIndex(); shopProductIndex.setProduct_id(shopProductBaseList.get(i).getProduct_id()); - Integer stateId= shopProductBaseList.get(i).getProduct_state_id(); - if(stateId!=StateCode.PRODUCT_STATE_NORMAL){ - shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); - shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); - shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_OFF_THE_SHELF); + if(ObjectUtil.equals(DicEnum.YESORNO_1.getCode(),isPublish)){ + shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL); + shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL); + shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_NORMAL); + }else { + Integer stateId= shopProductBaseList.get(i).getProduct_state_id(); + if(stateId!=StateCode.PRODUCT_STATE_NORMAL){ + shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); + shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); + shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_OFF_THE_SHELF); + } } shopProductItems.get(i).setItem_is_default(1); if(shopProductSpecItem.isUpdate()){ @@ -374,7 +387,7 @@ public class ProductMappingServiceImpl extends BaseServiceImpl shopProductBaseList=shopProductBaseService.lists(queryWrapper, finalI,SHOPBASEPAGE).getRecords(); futures.add(executor.submit(() -> { - this.computeProductMapping(shopProductBaseList, finalStoreId,shopProductSpecItemMap,ShopBaseProductSpecMap, productMappingMap,isUpDatePrice); + this.computeProductMapping(shopProductBaseList, finalStoreId,shopProductSpecItemMap,ShopBaseProductSpecMap, productMappingMap,isUpDatePrice,isPublish); return "成功" + finalI; })); } @@ -420,9 +433,15 @@ public class ProductMappingServiceImpl extends BaseServiceImpl item_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_item"+ "*"); + redisService.del(item_keys); + Set base_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_base"+ "*"); + redisService.del(base_keys); + Set index_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_index"+ "*"); + redisService.del(index_keys); + Set info_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_info"+ "*"); + redisService.del(info_keys); return CommonResult.success(true); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java index 7460ebff..e9738769 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java @@ -758,13 +758,13 @@ public abstract class SyncBaseThirdSxAbstract{ } } BigDecimal stock= jsonObj.getBigDecimal("stock");//库存 - if(ObjectUtil.equals(isNegativeAllowed,DicEnum.YESORNO_1)&&stock.compareTo(BigDecimal.ZERO)<=0){//允许负库存,每次都加满,就是一直有售卖 + if(ObjectUtil.equals(isNegativeAllowed,DicEnum.YESORNO_1.getCode())&&stock.compareTo(BigDecimal.ZERO)<=0){//允许负库存,每次都加满,就是一直有售卖 stock=new BigDecimal("99"); } //商品总量 if(ObjectUtil.isNotEmpty(jsonObj.getStr("unit"))&&ObjectUtil.isNotEmpty(jsonObj.getStr("stock")) && "KG,kg,公斤".contains(jsonObj.getStr("unit"))&&!(productName.contains("g")||productName.contains("ml")||productName.contains("ML")||productName.contains("kg")|| - productName.contains("KG")||productName.contains("L")||productName.contains("l"))){//这样做主要是有些超时有了kg,又打包成克来卖 + productName.contains("KG")||productName.contains("L")||productName.contains("l")||productName.contains("斤"))){//这样做主要是有些超时有了kg,又打包成克来卖 shopProductBase.setShop_weight(stock); shopProductBase.setUnit_name(jsonObj.getStr("unit")); shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF_UNCHECK); @@ -778,7 +778,7 @@ public abstract class SyncBaseThirdSxAbstract{ shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);//默认是下架 shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price"))); if(!(productName.contains("g")||productName.contains("ml")||productName.contains("ML")||productName.contains("kg")|| - productName.contains("KG")||productName.contains("L")||productName.contains("l"))){ + productName.contains("KG")||productName.contains("L")||productName.contains("l")||productName.contains("斤"))){ String spectItem=StringUtils.isNotEmpty(shopProductBase.getSpecItem())?shopProductBase.getSpecItem():""; String unit=StringUtils.isNotEmpty(shopProductBase.getSpecUnit())?shopProductBase.getSpecUnit():""; if(StringUtils.isNotEmpty(spectItem)||StringUtils.isNotEmpty(unit)){