From d8f90bf52e1f9d4bb3ed2a1aa04587c3884544b6 Mon Sep 17 00:00:00 2001 From: wangchaoxu Date: Tue, 12 Sep 2023 02:34:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B1=BB=E7=9B=AE=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ms/api/service/CategoryService.java | 4 +- .../api/service/impl/CategoryServiceImpl.java | 85 +++++++++++++++++-- .../SyncShopCategoryQueueTaskService.java | 16 +--- .../com/ms/dal/mapper/CategoryMapper.java | 2 + .../main/resources/mapper/CategoryMapper.xml | 9 ++ 5 files changed, 95 insertions(+), 21 deletions(-) diff --git a/ms-biz/src/main/java/com/ms/api/service/CategoryService.java b/ms-biz/src/main/java/com/ms/api/service/CategoryService.java index aa1c9d55..3b2cf4da 100644 --- a/ms-biz/src/main/java/com/ms/api/service/CategoryService.java +++ b/ms-biz/src/main/java/com/ms/api/service/CategoryService.java @@ -32,9 +32,9 @@ public interface CategoryService { List recordShopCategorys(Integer shopId, List shopAllCategoryList); - void getAllLeafProductCatListFromTos(Integer shopId, boolean isFlushCache); - boolean buildProductCatePath(List recordCategoryIds); Map getAllCategoryMap(); + + List getAllLeafProductCatListFromTos(Integer shopId, boolean isFlushCache); } diff --git a/ms-biz/src/main/java/com/ms/api/service/impl/CategoryServiceImpl.java b/ms-biz/src/main/java/com/ms/api/service/impl/CategoryServiceImpl.java index a367f9b6..2dc45380 100644 --- a/ms-biz/src/main/java/com/ms/api/service/impl/CategoryServiceImpl.java +++ b/ms-biz/src/main/java/com/ms/api/service/impl/CategoryServiceImpl.java @@ -1,10 +1,14 @@ package com.ms.api.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.doudian.open.api.shop_getShopCategory.data.DataItem; import com.ms.api.bo.CompareAndGetNeedProcessCidsBO; +import com.ms.api.common.Ret; import com.ms.api.consts.RedisKeyConst; +import com.ms.api.paas.StorageService; import com.ms.api.tool.CommonTool; +import com.ms.api.tool.MoveTool; import com.ms.api.util.DdRequestUtil; import com.ms.dal.entity.Category; import com.ms.api.service.CategoryService; @@ -33,6 +37,9 @@ public class CategoryServiceImpl implements CategoryService{ @Autowired private RedisTemplate redisTemplate; + @Autowired + private StorageService storageService; + @Autowired private RsyncCategoryQueueMapper rsyncCategoryQueueMapper; @@ -234,11 +241,13 @@ public class CategoryServiceImpl implements CategoryService{ int successCnt = 0; Map categoryMap = getAllCategoryMap(); - + log.info("start buildProductCatePath"); for (Map.Entry entry : categoryMap.entrySet()) { Long categoryId = entry.getKey(); Category categoryInfo = entry.getValue(); + // todo: 之前有用个本地文件控制同步停止,可有可无先忽略 + if (categoryInfo.getLevel() <= 1) { continue; } @@ -247,16 +256,37 @@ public class CategoryServiceImpl implements CategoryService{ continue; } - // todo: + String realPath = findCategoryRealPath(categoryMap, categoryId, ""); + if (StringUtils.isEmpty(realPath) || realPath.equals(categoryInfo.getPath())) { + continue; + } + Category updateData = new Category(); + updateData.setCategoryId(categoryId); + updateData.setPath(realPath); + updateData.setGmtModified(new Date()); + categoryMapper.updateByPrimaryKeySelective(updateData); + + successCnt++; } + log.info("end buildProductCatePath"); + return successCnt > 0; + } - // todo: + private String findCategoryRealPath(Map categoryMap, Long categoryId, String path) { + if (!categoryMap.containsKey(categoryId)) { + return path; + } + Category categoryInfo = categoryMap.get(categoryId); + path = !StringUtils.isEmpty(path) ? (categoryInfo.getCategoryName() + ">" + path) : categoryInfo.getCategoryName(); + if (!StringUtils.isEmpty(categoryInfo.getParentCategoryId()) && Long.valueOf(categoryInfo.getParentCategoryId()) != 0L) { + path = findCategoryRealPath(categoryMap, Long.valueOf(categoryInfo.getParentCategoryId()), path); + } - return successCnt > 0; + return path; } @Override @@ -281,8 +311,53 @@ public class CategoryServiceImpl implements CategoryService{ } @Override - public void getAllLeafProductCatListFromTos(Integer shopId, boolean isFlushCache) { + public List getAllLeafProductCatListFromTos(Integer shopId, boolean isFlushCache) { + String tosPath = MoveTool.getAllLeafProductCatListOssPath(shopId); + + List cateListAll = null; + + try { + Ret getTosContentRet = storageService.getContent(tosPath); + if (getTosContentRet.getResult().equals("success") && !isFlushCache) { + cateListAll = JSONObject.parseArray(getTosContentRet.getData().get("data").toString(), Category.class); + if (ObjectUtil.isNotEmpty(cateListAll)) { + return cateListAll; + } + } + } catch (Exception e) { + log.error("商品类目TOS读取操作过程异常:", e); + } + + cateListAll = getAllLeafProductCatListFromDb(shopId); + + try { + storageService.uploadContent(tosPath, JSONObject.toJSONString(cateListAll)); + } catch (Exception e) { + log.error("商品类目TOS写入操作过程异常:", e); + } + + // todo: tosPath文件 加入 tos自动清理队列,目前isFlushCache用的都是true,不清理也基本没影响,用到false的时候再说,有效期1天后自动删除, + + return cateListAll; + } + + private List getAllLeafProductCatListFromDb(Integer shopId) { + List cateListAll = new ArrayList<>(); + final int stepLen = 200; + Long maxCid = 0L; + while (true) { + List cateList = categoryMapper.selectLeafByPositionPage(shopId, maxCid, stepLen); + if (cateList.isEmpty()) { + break; + } + cateListAll.addAll(cateList); + if (cateList.size() < stepLen) { + break; + } + maxCid = cateList.get(cateList.size() - 1).getCategoryId(); + } + return cateListAll; } } diff --git a/ms-biz/src/main/java/com/ms/api/task/SyncShopCategoryQueueTaskService.java b/ms-biz/src/main/java/com/ms/api/task/SyncShopCategoryQueueTaskService.java index 0ca97bc8..2a19a771 100644 --- a/ms-biz/src/main/java/com/ms/api/task/SyncShopCategoryQueueTaskService.java +++ b/ms-biz/src/main/java/com/ms/api/task/SyncShopCategoryQueueTaskService.java @@ -96,21 +96,9 @@ public class SyncShopCategoryQueueTaskService extends TaskBaseService { log.info("end buildProductCatePath"); } - - log.info("start flush ShopCategorys oss"); - // oss + log.info("start flush ShopCategorys tos"); categoryService.getAllLeafProductCatListFromTos(shopId, true); - -// String ossPath = String.format("move_product_publish_to_pic_queue/%s/%s.txt", shopId, detailId); -// Ret ret = storageService.uploadContent(ossPath, JSON.toJSONString(data)); -// if (CommonTool.isFailRet(ret)) { -// return ret; -// } -// String ossUrl = storageService.getPubOssUrlByOssPath(ossPath); -// log.info("uploadMoveDataToOss success ossUrl: " + ossUrl); -// return CommonTool.successResult("ossUrl", ossUrl); - - log.info("end flush ShopCategorys oss"); + log.info("end flush ShopCategorys tos"); return queue; } diff --git a/ms-dal/src/main/java/com/ms/dal/mapper/CategoryMapper.java b/ms-dal/src/main/java/com/ms/dal/mapper/CategoryMapper.java index 6256d1e3..7063956e 100644 --- a/ms-dal/src/main/java/com/ms/dal/mapper/CategoryMapper.java +++ b/ms-dal/src/main/java/com/ms/dal/mapper/CategoryMapper.java @@ -26,4 +26,6 @@ public interface CategoryMapper { List selectByCids(List categoryIds); List selectByPositionPage(Long startId, Integer limit); + + List selectLeafByPositionPage(Integer shopId, Long startId, Integer limit); } diff --git a/ms-dal/src/main/resources/mapper/CategoryMapper.xml b/ms-dal/src/main/resources/mapper/CategoryMapper.xml index 20c92daf..d30324e7 100644 --- a/ms-dal/src/main/resources/mapper/CategoryMapper.xml +++ b/ms-dal/src/main/resources/mapper/CategoryMapper.xml @@ -45,6 +45,15 @@ order by category_id asc limit #{limit} + delete from category