|
@@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
|
|
+import org.dromara.common.core.utils.ObjectUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
@@ -19,15 +20,19 @@ import org.dromara.mall.domain.DkhCategoryMain;
|
|
|
import org.dromara.mall.domain.DkhCategorySub;
|
|
import org.dromara.mall.domain.DkhCategorySub;
|
|
|
import org.dromara.mall.domain.bo.DkhCategoryMainBo;
|
|
import org.dromara.mall.domain.bo.DkhCategoryMainBo;
|
|
|
import org.dromara.mall.domain.vo.DkhCategoryMainVo;
|
|
import org.dromara.mall.domain.vo.DkhCategoryMainVo;
|
|
|
|
|
+import org.dromara.mall.domain.vo.DkhMallConfigVo;
|
|
|
|
|
+import org.dromara.mall.domain.vo.EpSearchConfigVo;
|
|
|
import org.dromara.mall.mapper.DkhCategoryMainMapper;
|
|
import org.dromara.mall.mapper.DkhCategoryMainMapper;
|
|
|
import org.dromara.mall.mapper.DkhCategorySubMapper;
|
|
import org.dromara.mall.mapper.DkhCategorySubMapper;
|
|
|
import org.dromara.mall.service.IDkhCategoryMainService;
|
|
import org.dromara.mall.service.IDkhCategoryMainService;
|
|
|
|
|
+import org.dromara.mall.service.IDkhMallConfigService;
|
|
|
import org.dromara.product.api.RemoteCategoryService;
|
|
import org.dromara.product.api.RemoteCategoryService;
|
|
|
import org.dromara.product.api.domain.CategoryDto;
|
|
import org.dromara.product.api.domain.CategoryDto;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
|
@@ -46,6 +51,8 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
|
|
|
|
|
private final DkhCategorySubMapper categorySubMapper;
|
|
private final DkhCategorySubMapper categorySubMapper;
|
|
|
|
|
|
|
|
|
|
+ private final IDkhMallConfigService dkhMallConfigService;
|
|
|
|
|
+
|
|
|
@DubboReference
|
|
@DubboReference
|
|
|
private RemoteCategoryService remoteCategoryService;
|
|
private RemoteCategoryService remoteCategoryService;
|
|
|
|
|
|
|
@@ -77,8 +84,16 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
public TableDataInfo<DkhCategoryMainVo> queryPageList(DkhCategoryMainBo bo, PageQuery pageQuery) {
|
|
public TableDataInfo<DkhCategoryMainVo> queryPageList(DkhCategoryMainBo bo, PageQuery pageQuery) {
|
|
|
LambdaQueryWrapper<DkhCategoryMain> lqw = buildQueryWrapper(bo);
|
|
LambdaQueryWrapper<DkhCategoryMain> lqw = buildQueryWrapper(bo);
|
|
|
Page<DkhCategoryMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
Page<DkhCategoryMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
|
+ DkhMallConfigVo currentMallConfig =null;
|
|
|
|
|
+ if (ObjectUtils.isNotEmpty(bo.getCustomerId())){
|
|
|
|
|
+ currentMallConfig= dkhMallConfigService.getCurrentMallConfig(bo.getCustomerId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
for (DkhCategoryMainVo vo : result.getRecords()) {
|
|
for (DkhCategoryMainVo vo : result.getRecords()) {
|
|
|
fillParsedFields(vo);
|
|
fillParsedFields(vo);
|
|
|
|
|
+ if (ObjectUtils.isNotEmpty(currentMallConfig)){
|
|
|
|
|
+ vo.setCategoryThemeColor(currentMallConfig.getCategoryThemeColor());
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return TableDataInfo.build(result);
|
|
return TableDataInfo.build(result);
|
|
|
}
|
|
}
|
|
@@ -184,6 +199,7 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
level2Sub.setLevel(2L);
|
|
level2Sub.setLevel(2L);
|
|
|
level2Sub.setSortOrder(level2Node.has("sortOrder") ? level2Node.get("sortOrder").asLong() : 0L);
|
|
level2Sub.setSortOrder(level2Node.has("sortOrder") ? level2Node.get("sortOrder").asLong() : 0L);
|
|
|
level2Sub.setStatus(level2Node.has("status") ? level2Node.get("status").asLong() : 1L);
|
|
level2Sub.setStatus(level2Node.has("status") ? level2Node.get("status").asLong() : 1L);
|
|
|
|
|
+ level2Sub.setSyncCategoryId(level2Id);
|
|
|
categorySubMapper.insert(level2Sub);
|
|
categorySubMapper.insert(level2Sub);
|
|
|
|
|
|
|
|
// 处理三级分类
|
|
// 处理三级分类
|
|
@@ -205,7 +221,7 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
|
|
|
|
|
List<CategoryDto> level3List = new ArrayList<>();
|
|
List<CategoryDto> level3List = new ArrayList<>();
|
|
|
level3List.add(level3Dto);
|
|
level3List.add(level3Dto);
|
|
|
- remoteCategoryService.insertCategory(level3List);
|
|
|
|
|
|
|
+ Long level3Id = remoteCategoryService.insertCategory(level3List);
|
|
|
|
|
|
|
|
// 本地:三级分类 → DkhCategorySub
|
|
// 本地:三级分类 → DkhCategorySub
|
|
|
DkhCategorySub level3Sub = new DkhCategorySub();
|
|
DkhCategorySub level3Sub = new DkhCategorySub();
|
|
@@ -216,6 +232,7 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
level3Sub.setLevel(3L);
|
|
level3Sub.setLevel(3L);
|
|
|
level3Sub.setSortOrder(level3Node.has("sortOrder") ? level3Node.get("sortOrder").asLong() : 0L);
|
|
level3Sub.setSortOrder(level3Node.has("sortOrder") ? level3Node.get("sortOrder").asLong() : 0L);
|
|
|
level3Sub.setStatus(level3Node.has("status") ? level3Node.get("status").asLong() : 1L);
|
|
level3Sub.setStatus(level3Node.has("status") ? level3Node.get("status").asLong() : 1L);
|
|
|
|
|
+ level3Sub.setSyncCategoryId(level3Id);
|
|
|
categorySubMapper.insert(level3Sub);
|
|
categorySubMapper.insert(level3Sub);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -247,30 +264,58 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
// 先更新主表数据
|
|
// 先更新主表数据
|
|
|
boolean flag = baseMapper.updateById(update) > 0;
|
|
boolean flag = baseMapper.updateById(update) > 0;
|
|
|
if (flag) {
|
|
if (flag) {
|
|
|
- // 处理分类树的增量更新(远程商品分类表)
|
|
|
|
|
- if (bo.getSyncCategoryId() != null && StringUtils.isNotBlank(bo.getPanelConfigJson())) {
|
|
|
|
|
|
|
+ // 从数据库获取 syncCategoryId,避免前端不传导致条件不满足
|
|
|
|
|
+ DkhCategoryMain dbRecord = baseMapper.selectById(update.getId());
|
|
|
|
|
+ Long syncCategoryId = dbRecord != null ? dbRecord.getSyncCategoryId() : bo.getSyncCategoryId();
|
|
|
|
|
+
|
|
|
|
|
+ // 查询旧子菜单,构建 name→syncCategoryId 映射,用于远程增量更新时匹配已有分类
|
|
|
|
|
+ List<DkhCategorySub> oldSubs = categorySubMapper.selectList(
|
|
|
|
|
+ Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
+ .eq(DkhCategorySub::getMainCategoryId, update.getId()));
|
|
|
|
|
+ Map<String, Long> oldNameToSyncId = new HashMap<>();
|
|
|
|
|
+ for (DkhCategorySub sub : oldSubs) {
|
|
|
|
|
+ if (sub.getSyncCategoryId() != null && StringUtils.isNotBlank(sub.getName())) {
|
|
|
|
|
+ oldNameToSyncId.put(sub.getLevel() + ":" + sub.getName(), sub.getSyncCategoryId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (syncCategoryId != null && StringUtils.isNotBlank(bo.getPanelConfigJson())) {
|
|
|
try {
|
|
try {
|
|
|
JsonNode rootNode = objectMapper.readTree(bo.getPanelConfigJson());
|
|
JsonNode rootNode = objectMapper.readTree(bo.getPanelConfigJson());
|
|
|
JsonNode subMenus = rootNode.get("subMenus");
|
|
JsonNode subMenus = rootNode.get("subMenus");
|
|
|
|
|
|
|
|
if (subMenus != null && subMenus.isArray()) {
|
|
if (subMenus != null && subMenus.isArray()) {
|
|
|
|
|
+ // 用旧记录的 syncCategoryId 填充 CategoryDto 的 ID,实现远程增量更新
|
|
|
List<CategoryDto> newCategoryTree = buildCategoryTreeFromSubMenus(
|
|
List<CategoryDto> newCategoryTree = buildCategoryTreeFromSubMenus(
|
|
|
bo.getName(),
|
|
bo.getName(),
|
|
|
subMenus,
|
|
subMenus,
|
|
|
- bo.getSyncCategoryId()
|
|
|
|
|
|
|
+ syncCategoryId,
|
|
|
|
|
+ oldNameToSyncId
|
|
|
);
|
|
);
|
|
|
- remoteCategoryService.updateCategoryTree(bo.getSyncCategoryId(), newCategoryTree);
|
|
|
|
|
|
|
+ remoteCategoryService.updateCategoryTree(syncCategoryId, newCategoryTree);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 从远程重新获取完整分类树,获取所有分类的最新ID(含新增分类)
|
|
|
|
|
+ List<CategoryDto> remoteTree = remoteCategoryService.getCategoryTreeById(syncCategoryId);
|
|
|
|
|
+ Map<String, Long> remoteNameToId = buildRemoteNameToIdMap(remoteTree);
|
|
|
|
|
+
|
|
|
|
|
+ // 删除旧子菜单,重新保存(带远程 syncCategoryId)
|
|
|
|
|
+ categorySubMapper.delete(Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
+ .eq(DkhCategorySub::getMainCategoryId, update.getId()));
|
|
|
|
|
+ saveCategorySubs(update.getId(), bo, remoteNameToId);
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("更新分类树失败", e);
|
|
log.error("更新分类树失败", e);
|
|
|
- // 分类树更新失败不影响主表更新,只记录日志
|
|
|
|
|
|
|
+ // 分类树更新失败时,仍然更新本地 sub 表(不带远程ID)
|
|
|
|
|
+ categorySubMapper.delete(Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
+ .eq(DkhCategorySub::getMainCategoryId, update.getId()));
|
|
|
|
|
+ saveCategorySubs(update.getId(), bo, null);
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 无远程同步时,只更新本地 sub 表
|
|
|
|
|
+ categorySubMapper.delete(Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
+ .eq(DkhCategorySub::getMainCategoryId, update.getId()));
|
|
|
|
|
+ saveCategorySubs(update.getId(), bo, null);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 本地 sub 表:删除旧的子菜单,重新保存
|
|
|
|
|
- categorySubMapper.delete(Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
- .eq(DkhCategorySub::getMainCategoryId, update.getId()));
|
|
|
|
|
- saveCategorySubs(update.getId(), bo);
|
|
|
|
|
}
|
|
}
|
|
|
return flag;
|
|
return flag;
|
|
|
}
|
|
}
|
|
@@ -278,7 +323,7 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
/**
|
|
/**
|
|
|
* 从 subMenus 构建分类树 DTO 列表(树形结构)
|
|
* 从 subMenus 构建分类树 DTO 列表(树形结构)
|
|
|
*/
|
|
*/
|
|
|
- private List<CategoryDto> buildCategoryTreeFromSubMenus(String categoryName, JsonNode subMenus, Long rootCategoryId) {
|
|
|
|
|
|
|
+ private List<CategoryDto> buildCategoryTreeFromSubMenus(String categoryName, JsonNode subMenus, Long rootCategoryId, Map<String, Long> nameToSyncId) {
|
|
|
List<CategoryDto> result = new ArrayList<>();
|
|
List<CategoryDto> result = new ArrayList<>();
|
|
|
|
|
|
|
|
CategoryDto rootDto = new CategoryDto();
|
|
CategoryDto rootDto = new CategoryDto();
|
|
@@ -296,12 +341,12 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
JsonNode nestedChildren = level2Node.get("children");
|
|
JsonNode nestedChildren = level2Node.get("children");
|
|
|
if (nestedChildren != null && nestedChildren.isArray()) {
|
|
if (nestedChildren != null && nestedChildren.isArray()) {
|
|
|
for (JsonNode nestedChild : nestedChildren) {
|
|
for (JsonNode nestedChild : nestedChildren) {
|
|
|
- level2Children.add(buildCategoryDtoFromNode(nestedChild, rootCategoryId, 2L));
|
|
|
|
|
|
|
+ level2Children.add(buildCategoryDtoFromNode(nestedChild, rootCategoryId, 2L, nameToSyncId));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
- level2Children.add(buildCategoryDtoFromNode(level2Node, rootCategoryId, 2L));
|
|
|
|
|
|
|
+ level2Children.add(buildCategoryDtoFromNode(level2Node, rootCategoryId, 2L, nameToSyncId));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -311,13 +356,22 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 从 JSON 节点构建 CategoryDto(递归)
|
|
|
|
|
|
|
+ * 从 JSON 节点构建 CategoryDto(递归),优先从 nameToSyncId 映射获取 ID
|
|
|
*/
|
|
*/
|
|
|
- private CategoryDto buildCategoryDtoFromNode(JsonNode node, Long parentId, Long classLevel) {
|
|
|
|
|
|
|
+ private CategoryDto buildCategoryDtoFromNode(JsonNode node, Long parentId, Long classLevel, Map<String, Long> nameToSyncId) {
|
|
|
CategoryDto dto = new CategoryDto();
|
|
CategoryDto dto = new CategoryDto();
|
|
|
|
|
|
|
|
|
|
+ // 优先使用 JSON 中的 id,其次从旧记录的 syncCategoryId 映射中查找
|
|
|
if (node.has("id") && node.get("id").asLong() > 0) {
|
|
if (node.has("id") && node.get("id").asLong() > 0) {
|
|
|
dto.setId(node.get("id").asLong());
|
|
dto.setId(node.get("id").asLong());
|
|
|
|
|
+ } else if (nameToSyncId != null) {
|
|
|
|
|
+ String name = node.has("name") ? node.get("name").asText() : null;
|
|
|
|
|
+ if (StringUtils.isNotBlank(name)) {
|
|
|
|
|
+ Long syncId = nameToSyncId.get(classLevel + ":" + name);
|
|
|
|
|
+ if (syncId != null) {
|
|
|
|
|
+ dto.setId(syncId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
dto.setCategoryName(node.has("name") ? node.get("name").asText() : null);
|
|
dto.setCategoryName(node.has("name") ? node.get("name").asText() : null);
|
|
@@ -333,7 +387,7 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
List<CategoryDto> children = new ArrayList<>();
|
|
List<CategoryDto> children = new ArrayList<>();
|
|
|
for (JsonNode childNode : childrenNode) {
|
|
for (JsonNode childNode : childrenNode) {
|
|
|
children.add(buildCategoryDtoFromNode(childNode,
|
|
children.add(buildCategoryDtoFromNode(childNode,
|
|
|
- dto.getId() != null ? dto.getId() : parentId, classLevel + 1));
|
|
|
|
|
|
|
+ dto.getId() != null ? dto.getId() : parentId, classLevel + 1, nameToSyncId));
|
|
|
}
|
|
}
|
|
|
dto.setChildren(children);
|
|
dto.setChildren(children);
|
|
|
}
|
|
}
|
|
@@ -343,8 +397,12 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 保存子菜单数据到本地 dkh_category_sub 表
|
|
* 保存子菜单数据到本地 dkh_category_sub 表
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param mainCategoryId 主分类ID
|
|
|
|
|
+ * @param bo 分类设置主
|
|
|
|
|
+ * @param nameToSyncId 远程分类名称→ID映射(用于回填 syncCategoryId),可为null
|
|
|
*/
|
|
*/
|
|
|
- private void saveCategorySubs(Long mainCategoryId, DkhCategoryMainBo bo) {
|
|
|
|
|
|
|
+ private void saveCategorySubs(Long mainCategoryId, DkhCategoryMainBo bo, Map<String, Long> nameToSyncId) {
|
|
|
try {
|
|
try {
|
|
|
if (StringUtils.isNotBlank(bo.getPanelConfigJson())) {
|
|
if (StringUtils.isNotBlank(bo.getPanelConfigJson())) {
|
|
|
JsonNode rootNode = objectMapper.readTree(bo.getPanelConfigJson());
|
|
JsonNode rootNode = objectMapper.readTree(bo.getPanelConfigJson());
|
|
@@ -352,27 +410,37 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
|
|
|
|
|
if (subMenus != null && subMenus.isArray()) {
|
|
if (subMenus != null && subMenus.isArray()) {
|
|
|
for (JsonNode level2Node : subMenus) {
|
|
for (JsonNode level2Node : subMenus) {
|
|
|
|
|
+ String level2Name = level2Node.has("name") ? level2Node.get("name").asText() : null;
|
|
|
DkhCategorySub level2Sub = new DkhCategorySub();
|
|
DkhCategorySub level2Sub = new DkhCategorySub();
|
|
|
level2Sub.setCustomerId(bo.getCustomerId());
|
|
level2Sub.setCustomerId(bo.getCustomerId());
|
|
|
level2Sub.setMainCategoryId(mainCategoryId);
|
|
level2Sub.setMainCategoryId(mainCategoryId);
|
|
|
level2Sub.setParentId(0L);
|
|
level2Sub.setParentId(0L);
|
|
|
- level2Sub.setName(level2Node.has("name") ? level2Node.get("name").asText() : null);
|
|
|
|
|
|
|
+ level2Sub.setName(level2Name);
|
|
|
level2Sub.setLevel(2L);
|
|
level2Sub.setLevel(2L);
|
|
|
level2Sub.setSortOrder(level2Node.has("sortOrder") ? level2Node.get("sortOrder").asLong() : 0L);
|
|
level2Sub.setSortOrder(level2Node.has("sortOrder") ? level2Node.get("sortOrder").asLong() : 0L);
|
|
|
level2Sub.setStatus(level2Node.has("status") ? level2Node.get("status").asLong() : 1L);
|
|
level2Sub.setStatus(level2Node.has("status") ? level2Node.get("status").asLong() : 1L);
|
|
|
|
|
+ // 回填远程同步ID
|
|
|
|
|
+ if (nameToSyncId != null && StringUtils.isNotBlank(level2Name)) {
|
|
|
|
|
+ level2Sub.setSyncCategoryId(nameToSyncId.get("2:" + level2Name));
|
|
|
|
|
+ }
|
|
|
categorySubMapper.insert(level2Sub);
|
|
categorySubMapper.insert(level2Sub);
|
|
|
|
|
|
|
|
JsonNode level3Nodes = level2Node.get("children");
|
|
JsonNode level3Nodes = level2Node.get("children");
|
|
|
if (level3Nodes != null && level3Nodes.isArray() && !level3Nodes.isEmpty()) {
|
|
if (level3Nodes != null && level3Nodes.isArray() && !level3Nodes.isEmpty()) {
|
|
|
for (JsonNode level3Node : level3Nodes) {
|
|
for (JsonNode level3Node : level3Nodes) {
|
|
|
|
|
+ String level3Name = level3Node.has("name") ? level3Node.get("name").asText() : null;
|
|
|
DkhCategorySub level3Sub = new DkhCategorySub();
|
|
DkhCategorySub level3Sub = new DkhCategorySub();
|
|
|
level3Sub.setCustomerId(bo.getCustomerId());
|
|
level3Sub.setCustomerId(bo.getCustomerId());
|
|
|
level3Sub.setMainCategoryId(mainCategoryId);
|
|
level3Sub.setMainCategoryId(mainCategoryId);
|
|
|
level3Sub.setParentId(level2Sub.getId());
|
|
level3Sub.setParentId(level2Sub.getId());
|
|
|
- level3Sub.setName(level3Node.has("name") ? level3Node.get("name").asText() : null);
|
|
|
|
|
|
|
+ level3Sub.setName(level3Name);
|
|
|
level3Sub.setLevel(3L);
|
|
level3Sub.setLevel(3L);
|
|
|
level3Sub.setSortOrder(level3Node.has("sortOrder") ? level3Node.get("sortOrder").asLong() : 0L);
|
|
level3Sub.setSortOrder(level3Node.has("sortOrder") ? level3Node.get("sortOrder").asLong() : 0L);
|
|
|
level3Sub.setStatus(level3Node.has("status") ? level3Node.get("status").asLong() : 1L);
|
|
level3Sub.setStatus(level3Node.has("status") ? level3Node.get("status").asLong() : 1L);
|
|
|
|
|
+ // 回填远程同步ID
|
|
|
|
|
+ if (nameToSyncId != null && StringUtils.isNotBlank(level3Name)) {
|
|
|
|
|
+ level3Sub.setSyncCategoryId(nameToSyncId.get("3:" + level3Name));
|
|
|
|
|
+ }
|
|
|
categorySubMapper.insert(level3Sub);
|
|
categorySubMapper.insert(level3Sub);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -384,6 +452,23 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 从远程分类树构建名称→ID映射
|
|
|
|
|
+ * key: "classLevel:categoryName" → value: remoteId
|
|
|
|
|
+ */
|
|
|
|
|
+ private Map<String, Long> buildRemoteNameToIdMap(List<CategoryDto> remoteTree) {
|
|
|
|
|
+ Map<String, Long> map = new HashMap<>();
|
|
|
|
|
+ if (remoteTree == null) {
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (CategoryDto dto : remoteTree) {
|
|
|
|
|
+ if (dto.getId() != null && StringUtils.isNotBlank(dto.getCategoryName())) {
|
|
|
|
|
+ map.put(dto.getClassLevel() + ":" + dto.getCategoryName(), dto.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 保存前的数据校验
|
|
* 保存前的数据校验
|
|
|
*/
|
|
*/
|
|
@@ -415,7 +500,10 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
|
|
|
|
|
// 提取 subMenus
|
|
// 提取 subMenus
|
|
|
if (config.containsKey("subMenus")) {
|
|
if (config.containsKey("subMenus")) {
|
|
|
- vo.setSubMenus((List<Map<String, Object>>) config.get("subMenus"));
|
|
|
|
|
|
|
+ List<Map<String, Object>> subMenus = (List<Map<String, Object>>) config.get("subMenus");
|
|
|
|
|
+ // 注入 syncCategoryId
|
|
|
|
|
+ injectSyncCategoryId(vo.getId(), subMenus);
|
|
|
|
|
+ vo.setSubMenus(subMenus);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 构建 panelData(排除 subMenus,保留 mainTitle/subTitle/notes/groups)
|
|
// 构建 panelData(排除 subMenus,保留 mainTitle/subTitle/notes/groups)
|
|
@@ -439,6 +527,60 @@ public class DkhCategoryMainServiceImpl extends ServiceImpl<DkhCategoryMainMappe
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 从 dkh_category_sub 表查询 syncCategoryId,注入到 subMenus 树中各节点
|
|
|
|
|
+ */
|
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
|
|
+ private void injectSyncCategoryId(Long mainCategoryId, List<Map<String, Object>> subMenus) {
|
|
|
|
|
+ if (mainCategoryId == null || subMenus == null || subMenus.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查询本地子分类记录
|
|
|
|
|
+ List<DkhCategorySub> subs = categorySubMapper.selectList(
|
|
|
|
|
+ Wrappers.<DkhCategorySub>lambdaQuery()
|
|
|
|
|
+ .eq(DkhCategorySub::getMainCategoryId, mainCategoryId));
|
|
|
|
|
+ if (subs.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 构建 level:name → syncCategoryId 映射
|
|
|
|
|
+ Map<String, Long> nameToSyncId = new HashMap<>();
|
|
|
|
|
+ for (DkhCategorySub sub : subs) {
|
|
|
|
|
+ if (sub.getSyncCategoryId() != null && StringUtils.isNotBlank(sub.getName())) {
|
|
|
|
|
+ nameToSyncId.put(sub.getLevel() + ":" + sub.getName(), sub.getSyncCategoryId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 递归注入到 subMenus 树
|
|
|
|
|
+ injectSyncCategoryIdRecursive(subMenus, nameToSyncId, 2L);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 递归遍历 subMenus 树,注入 syncCategoryId
|
|
|
|
|
+ */
|
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
|
|
+ private void injectSyncCategoryIdRecursive(List<Map<String, Object>> nodes, Map<String, Long> nameToSyncId, Long currentLevel) {
|
|
|
|
|
+ if (nodes == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (Map<String, Object> node : nodes) {
|
|
|
|
|
+ // 从 nameToSyncId 映射中查找并注入 syncCategoryId
|
|
|
|
|
+ String name = (String) node.get("name");
|
|
|
|
|
+ if (StringUtils.isNotBlank(name)) {
|
|
|
|
|
+ Long syncId = nameToSyncId.get(currentLevel + ":" + name);
|
|
|
|
|
+ if (syncId != null) {
|
|
|
|
|
+ node.put("syncCategoryId", syncId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 递归处理子节点
|
|
|
|
|
+ Object children = node.get("children");
|
|
|
|
|
+ if (children instanceof List) {
|
|
|
|
|
+ List<Map<String, Object>> childNodes = (List<Map<String, Object>>) children;
|
|
|
|
|
+ if (!childNodes.isEmpty()) {
|
|
|
|
|
+ injectSyncCategoryIdRecursive(childNodes, nameToSyncId, currentLevel + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 校验并批量删除分类设置主信息
|
|
* 校验并批量删除分类设置主信息
|
|
|
*
|
|
*
|