diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java index e2ba2d1f..c5f7c8b1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java @@ -290,7 +290,8 @@ public interface ShopProductBaseService extends IBaseService { List shopProductInfoList, List> shopProductItemList, List shopProductImageList, List shopProductValidPeriodList, - List shopProductAssistIndexList,String priorityMode); + List shopProductAssistIndexList,String priorityMode, + Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdatePrice); /** * 加载商品 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 72c3b99e..4c05cad5 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 @@ -207,11 +207,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl shopProductDataList, List shopProductDetailList, List shopProductInfoList, List> shopProductItemList, List shopProductImageList, List shopProductValidPeriodList, - List shopProductAssistIndexList, String priorityMode) { + List shopProductAssistIndexList, String priorityMode,Map shopProductSpecItemMap, + Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdatePrice) { // 1. 参数校验 if (shopProductBaseList == null || shopProductBaseList.isEmpty()) { @@ -5312,7 +5309,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl existingProducts = checkExistingProducts(shopProductBaseList); + Map existingProducts = checkExistingProducts(shopProductBaseList); // 3. 分离新增和更新的商品 List newProducts = new ArrayList<>(); @@ -5348,9 +5345,13 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl newShopProductImageList, List udpteShopProductImageList, List newShopProductValidPeriodList, List updateShopProductValidPeriodList, List newShopProductAssistIndexList, List udpateShopProductAssistIndexList, - String priorityMode + String priorityMode,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdatePrice ) { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); @@ -5606,11 +5607,11 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl checkExistingProducts(List productBases) { + private Map checkExistingProducts(List productBases) { // 1. 按店铺和货号分组 Map> storeProductMap = productBases.stream() .collect(Collectors.groupingBy( @@ -6052,7 +6053,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl p.getStore_id() + "_" + p.getProduct_number(), - ShopProductBase::getProduct_id + p -> p.getProduct_id()+"_"+ p.getProduct_state_id() )); } @@ -6066,7 +6067,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl query = new QueryWrapper<>(); - query.select("product_id", "store_id", "product_number"); + query.select("product_id", "store_id", "product_number","product_state_id"); // 构建OR条件 (store_id=X AND product_number=Y) OR (store_id=A AND product_number=B)... storeProductPairs.forEach(pair -> { 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 480aeb00..22a1590c 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 @@ -15,6 +15,7 @@ import com.suisung.mall.common.modules.sync.ProductMapping; import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.utils.ContextUtil; +import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import com.suisung.mall.shop.sync.exelModel.ImportResult; import com.suisung.mall.shop.sync.service.ProductMappingService; @@ -187,8 +188,17 @@ public class ProductMappingController extends BaseControllerImpl { */ @ApiOperation(value = "自动计算并上架商品", notes = "自动计算并上架商品") @RequestMapping(value = "/syncProductMaping", method = RequestMethod.PUT) - public CommonResult syncProductMaping(Integer storeId) { - return productMappingService.syncAllProductMapping(storeId); + public CommonResult syncProductMaping(@RequestParam(required = false) Integer storeId) { + UserDto userDto=ContextUtil.getCurrentUser(); + assert userDto != null; + if(userDto.isStore()) {//商店自己同步 + return productMappingService.syncAllProductMapping(Integer.valueOf(userDto.getStore_id())); + }else { + if(ObjectUtil.isEmpty(storeId)){ + return CommonResult.failed("请传入店铺id"); + } + } + return productMappingService.syncAllProductMapping(storeId); } /** @@ -270,6 +280,9 @@ public class ProductMappingController extends BaseControllerImpl { String shopStoreId=userDto.getStore_id(); syncThirdDataService.syncShopImages(Integer.valueOf(shopStoreId)); }else {//平台同步 + if(StringUtils.isEmpty(storeId)){ + return new ThirdApiRes().fail(250,"请传入店铺id"); + } syncThirdDataService.syncShopImages(Integer.valueOf(storeId)); } return new ThirdApiRes().success("服务器已执行商品图库匹配数据操作"); 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 4ee0845b..f6f70bde 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 @@ -21,7 +21,9 @@ public interface ProductMappingService extends IBaseService { * @param storeId * @param isUpdate */ - void computeProductMapping(List shopProductBaseList,Integer storeId, boolean isUpdate); + void computeProductMapping(List shopProductBaseList,Integer storeId, + Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap, + boolean isUpdate); Map getProductMapping(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 b79554b6..0e4c784f 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 @@ -123,16 +123,12 @@ public class ProductMappingServiceImpl extends BaseServiceImpl shopProductBaseList,Integer storeId,boolean isUpdate) { + public void computeProductMapping(List shopProductBaseList,Integer storeId,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdate) { 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; } - Map shopProductSpecItemMap = shopProductSpecItemService.getExistItem(storeId); - Map productMappingMap = this.getProductMapping(storeId); - - Map ShopBaseProductSpecMap = baseProductSpecService.getShopBaseProductSpecMap(storeId); dealData(shopProductBaseList,shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,isUpdate); } @@ -163,17 +159,21 @@ public class ProductMappingServiceImpl extends BaseServiceImpl updateShopProductSpecItemList=new ArrayList<>(); List updateShopProductBaseList=new ArrayList<>(); + List 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){ - shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); ShopProductIndex shopProductIndex=new ShopProductIndex(); shopProductIndex.setProduct_id(shopProductBaseList.get(i).getProduct_id()); - shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); - shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_OFF_THE_SHELF); + 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()){ shopProductBaseList.get(i).setProduct_unit_price(shopProductSpecItem.getItemPrice()); @@ -183,10 +183,13 @@ public class ProductMappingServiceImpl extends BaseServiceImpl shopProductBaseList){ - if (CollUtil.isEmpty(shopProductBaseList)) { - return ; - } - // 使用IN查询优化(根据数据库特性可能需要分批) - QueryWrapper query = new QueryWrapper<>(); - query.select("product_id", "product_name", "store_id","product_state_id"); - - // 构建OR条件 (store_id=X AND product_number=Y) OR (store_id=A AND product_number=B)... - shopProductBaseList.forEach(base -> { - query.or(q -> q.eq("store_id", base.getStore_id()) - .eq("product_id", base.getProduct_id())); - }); - List updateShopProductIndexList= shopProductIndexService.list(query); - updateShopProductIndexList.forEach(shopProductIndex -> { - shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF); - }); - shopProductIndexService.updateBatchById(updateShopProductIndexList,updateShopProductIndexList.size()); - } /** * @@ -413,11 +398,16 @@ public class ProductMappingServiceImpl extends BaseServiceImpl> futures = new ArrayList<>(); + Map shopProductSpecItemMap = shopProductSpecItemService.getExistItem(storeId); + Map productMappingMap = this.getProductMapping(storeId); + Map ShopBaseProductSpecMap = baseProductSpecService.getShopBaseProductSpecMap(storeId); + boolean isUpDatePrice=ObjectUtil.isNotEmpty(storeDbConfig.getRefreshTime()); for (int i=1;i<=pages;i++){ int finalI = i; Integer finalStoreId = storeId; + List shopProductBaseList=shopProductBaseService.lists(queryWrapper, finalI,SHOPBASEPAGE).getRecords(); futures.add(executor.submit(() -> { - this.computeProductMapping(shopProductBaseService.lists(queryWrapper, finalI,SHOPBASEPAGE).getRecords(), finalStoreId,false); + this.computeProductMapping(shopProductBaseList, finalStoreId,shopProductSpecItemMap,ShopBaseProductSpecMap, productMappingMap,isUpDatePrice); return "成功" + finalI; })); } 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 2f449453..fb7e51e3 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 @@ -701,7 +701,8 @@ public abstract class SyncBaseThirdSxAbstract{ * @param storeId * @return */ - public int baseSaveOrUpdateGoodsBatch(JSONArray goodsListJSON,String storeId,String isNegativeAllowed,String priorityMode,Map brandMaps){ + public int baseSaveOrUpdateGoodsBatch(JSONArray goodsListJSON,String storeId,String isNegativeAllowed,String priorityMode, + Map brandMaps,Map shopProductSpecItemMap,Map ShopBaseProductSpecMap, Map productMappingMap,boolean isUpdatePrice){ AtomicInteger resultCount = new AtomicInteger(); Map categoryMap= productCategoryService.getCategoryListByStoreId(storeId);//热数据加载 List shopProductBaseList=new ArrayList<>(); @@ -762,7 +763,8 @@ public abstract class SyncBaseThirdSxAbstract{ } //商品总量 if(ObjectUtil.isNotEmpty(jsonObj.getStr("unit"))&&ObjectUtil.isNotEmpty(jsonObj.getStr("stock")) - && "KG,kg,公斤".contains(jsonObj.getStr("unit"))){ + && "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,又打包成克来卖 shopProductBase.setShop_weight(stock); shopProductBase.setUnit_name(jsonObj.getStr("unit")); shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF_UNCHECK); @@ -775,17 +777,20 @@ 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")){ - - }else { String spectItem=StringUtils.isNotEmpty(shopProductBase.getSpecItem())?shopProductBase.getSpecItem():""; String unit=StringUtils.isNotEmpty(shopProductBase.getSpecUnit())?shopProductBase.getSpecUnit():""; if(StringUtils.isNotEmpty(spectItem)||StringUtils.isNotEmpty(unit)){ productName=productName+spectItem+"/"+unit; } } +// if(!(productName.contains("g")||productName.contains("ml")||productName.contains("ML")||productName.contains("kg")|| +// productName.contains("KG")||productName.contains("L")||productName.contains("l"))){ +// String spectItem=StringUtils.isNotEmpty(shopProductBase.getSpecItem())?shopProductBase.getSpecItem():""; +// String unit=StringUtils.isNotEmpty(shopProductBase.getSpecUnit())?shopProductBase.getSpecUnit():""; +// if(StringUtils.isNotEmpty(spectItem)||StringUtils.isNotEmpty(unit)){ +// productName=productName+spectItem+"/"+unit; +// } +// } shopProductBase.setProduct_name(productName); // ShopProductIndex ShopProductIndex shopProductIndex = new ShopProductIndex(); @@ -813,6 +818,8 @@ public abstract class SyncBaseThirdSxAbstract{ shopProductIndex.setProduct_transport_id(String.valueOf(StateCode.DELIVERY_TYPE_SAME_CITY)); shopProductIndex.setIs_special(shopProductBase.getIs_special()); shopProductIndex.setBrand_id(brandMaps.get(jsonObj.getStr("brand_name"))); + shopProductIndex.setProduct_unit_price(shopProductBase.getProduct_unit_price()); + if(categoryId!=0){ Integer typeId = (Integer) categoryMap.get(categoryId.toString()); if (ObjectUtil.isNotEmpty(typeId)) { @@ -893,7 +900,7 @@ public abstract class SyncBaseThirdSxAbstract{ shopProductBaseService.saveProductBatch(shopProductBaseList,shopProductIndexList,shopProductDataList,shopProductDetailList,shopProductInfoList,shopProductItemLists, shopProductImageList, new ArrayList(), - new ArrayList(),priorityMode); + new ArrayList(),priorityMode,shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,isUpdatePrice); return resultCount.get(); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncShopImageServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncShopImageServiceImpl.java index d34f8f7a..0c361283 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncShopImageServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncShopImageServiceImpl.java @@ -135,16 +135,26 @@ public class SyncShopImageServiceImpl implements SyncShopImageService { List list=pageList.getRecords(); final int finalI = i; futures.add(executor.submit(() -> { - try { - List imageMappingDtos=CovertToShopProductImage(list); - syncBatchShopImage(imageMappingDtos); - success.getAndIncrement(); - return "成功" + finalI; - } catch (Exception e) { - fails.getAndIncrement(); - log.info("图库匹配失败:"+e.getMessage()); - return "失败"+finalI+":"+e.getMessage(); + int index=0; + String message=""; + while (index<3){ + try { + List imageMappingDtos=CovertToShopProductImage(list);//调用es排除异常重新连接 + syncBatchShopImage(imageMappingDtos); + success.getAndIncrement(); + message= "成功" + finalI; + break; + } catch (Exception e) { + log.info("图库匹配失败:"+e.getMessage()); + index++; + if(index==3){ + message= "失败"+finalI+":"+e.getMessage(); + fails.getAndIncrement(); + break; + } + } } + return message; })); } }else { @@ -224,8 +234,10 @@ public class SyncShopImageServiceImpl implements SyncShopImageService { shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL); shopProductIndexList.add(shopProductIndex); } - if(CollectionUtil.isNotEmpty(shopProductImageList)){ - shopProductImageService.updateBatchById(shopProductImageList); + synchronized (this){ + if(CollectionUtil.isNotEmpty(shopProductImageList)){ + shopProductImageService.updateBatchById(shopProductImageList); + } } if(CollectionUtil.isNotEmpty(shopProductBaseList)){ @@ -279,7 +291,8 @@ public class SyncShopImageServiceImpl implements SyncShopImageService { productImageSearchDTOS.add(productImageSearchDTO); } } - Map> productImageList= searchService.searchProductImageList(productImageSearchDTOS, DicEnum.ES_SEARCH_TYPE_2.getCode()); + Map> productImageList=new HashMap<>(); + productImageList= searchService.searchProductImageList(productImageSearchDTOS, DicEnum.ES_SEARCH_TYPE_2.getCode()); productImageList.forEach((k,v)->{ if(!v.isEmpty()){ ImageMappingDto imageMappingDto=new ImageMappingDto(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 72e2f248..07fe36c4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -180,6 +180,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Autowired private SearchService searchService; + @Autowired + private ProductMappingService productMappingService; + /** * 批量保存商品的分类 * @@ -571,6 +574,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements syncPrimaryKey(); shopNumberSeqService.clearKey(); shopBaseProductCategoryService.clearCategoryCache(storeId); + baseProductSpecService.clearShopBaseProductSpecMap(Integer.valueOf(storeId)); + shopProductSpecItemService.clearExistItem(Integer.valueOf(storeId)); shopNumberSeqService.clearKeyStoreItemSepcId(); ExecutorService executor = Executors.newFixedThreadPool(6); List> futures = new ArrayList<>(); @@ -585,10 +590,14 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements QueryWrapper storeDbConfigQueryWrapper = new QueryWrapper<>(); storeDbConfigQueryWrapper.eq("store_id", storeId); StoreDbConfig storeDbConfig = storeDbConfigService.getOne(storeDbConfigQueryWrapper); + Map shopProductSpecItemMap = shopProductSpecItemService.getExistItem(Integer.valueOf(storeId));//切割缓存 + Map productMappingMap = productMappingService.getProductMapping(Integer.valueOf(storeId));//切割缓存 + Map ShopBaseProductSpecMap = baseProductSpecService.getShopBaseProductSpecMap(Integer.valueOf(storeId));//切割商品缓存 for (int i = 0; i < newFolders.size(); i++) { final int taskId = i; final String isNegativeAllowed = storeDbConfig.getIsNegativeAllowed(); String priorityMode = storeDbConfig.getPriorityMode(); + boolean isUpdatePrice= ObjectUtil.isNotEmpty(storeDbConfig.getRefreshTime());//是否更新所有切割价格 threadNum.incrementAndGet(); futures.add(executor.submit(() -> { int count = 0;//失败重试机制,当失败重试一次,再次失败则记录到数据库中 @@ -598,7 +607,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String fileName = "good_" + (taskId + 1) + ".txt"; JSONArray jsonArray = new ThreadFileUtils().processFolder(taskName, newFolders.get(taskId)); try { - baseSaveOrUpdateGoodsBatch(jsonArray, storeId, isNegativeAllowed, priorityMode, brandMaps); + baseSaveOrUpdateGoodsBatch(jsonArray, storeId, isNegativeAllowed, priorityMode, brandMaps,shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,isUpdatePrice); success.getAndIncrement(); threadNum.decrementAndGet(); return "成功" + taskId; @@ -669,6 +678,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements } @Override + @Async public void syncShopImages(Integer storeId) { syncShopImageService.syncMapingShopImages(storeId); }