From 91747f3eea0af308c1d3b96dde0b125fd52cfd2e Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 17 Mar 2025 10:43:35 +0800 Subject: [PATCH] =?UTF-8?q?REQ-3540:=20=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/nanopart/doc/dao/IndexNodeDao.java | 8 ++++---- .../axzo/nanopart/doc/entity/IndexNode.java | 4 ++++ .../nanopart/doc/file/index/IndexManager.java | 16 ++++------------ .../nanopart/doc/file/index/IndexSupport.java | 19 +++++++++++-------- .../nanopart/doc/mapper/IndexNodeMapper.java | 5 +++-- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/dao/IndexNodeDao.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/dao/IndexNodeDao.java index 6a1f693c..99d7b4c5 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/dao/IndexNodeDao.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/dao/IndexNodeDao.java @@ -60,7 +60,7 @@ public class IndexNodeDao extends ServiceImpl { } public IndexNode findValidChildByName(IndexNodeParentScope parentNode, IndexNodeType nodeType, String name) { - return parentOrScopeQuery(parentNode) // + return parentOrScopeRootQuery(parentNode) // .eq(IndexNode::getName, name) // .eq(IndexNode::getNodeType, nodeType) // .eq(IndexNode::getState, IndexNodeState.VALID) // @@ -70,7 +70,7 @@ public class IndexNodeDao extends ServiceImpl { public List findValidChildrenNameRightLike(IndexNodeParentScope parentNode, IndexNodeType nodeType, String name) { - return parentOrScopeQuery(parentNode) // + return parentOrScopeRootQuery(parentNode) // .likeRight(IndexNode::getName, name) // .eq(IndexNode::getNodeType, nodeType) // .eq(IndexNode::getState, IndexNodeState.VALID) // @@ -140,9 +140,9 @@ public class IndexNodeDao extends ServiceImpl { .update(); } - private LambdaQueryChainWrapper parentOrScopeQuery(IndexNodeParentScope parentScope) { + private LambdaQueryChainWrapper parentOrScopeRootQuery(IndexNodeParentScope parentScope) { if (StringUtils.isBlank(parentScope.parentCode())) - return scopeQuery(parentScope.nodeScope()); + return scopeQuery(parentScope.nodeScope()).eq(IndexNode::getParentCode, ""); return lambdaQuery().eq(IndexNode::getParentCode, parentScope.parentCode()); } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/entity/IndexNode.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/entity/IndexNode.java index 004f84da..8495a98e 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/entity/IndexNode.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/entity/IndexNode.java @@ -148,6 +148,10 @@ public class IndexNode extends BaseEntity implements NodeValue, Index return Path.wrap(path); } + public static boolean idEquals(IndexNode n1, IndexNode n2) { + return Objects.equals(n1.getId(), n2.getId()); + } + @JsonIgnore @JSONField(serialize = false, deserialize = false) public boolean isFile() { diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java index 8e256c88..8388985c 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java @@ -172,7 +172,6 @@ public class IndexManager { BizAssertions.assertFalse(srcNode.isDirectory() && destParentNode.isFile(), "不能移动文件夹到文件下"); return async(() -> { RootNode moveRoot = TreeBuilder.build(collectValidSubtreeAsValueRoot(srcNode)); - //noinspection SpringTransactionalMethodCallsInspection return transaction.execute(unused -> connectNodes(moveRoot, destParentNode)); }); } @@ -181,8 +180,7 @@ public class IndexManager { public IndexNode copySubTree(IndexNode src, @Nullable IndexNode destParent, CopyNodeVisitor copyNodeVisitor) { RootNode srcRoot = TreeUtils.transform(collectValidSubtreeAsValueRoot(src), IndexNode.class); srcRoot.walkDown(copyNodeVisitor); - List copiedNodes = TreeUtils.collectValues(srcRoot); - indexNodeDao.saveBatch(copiedNodes); + indexNodeDao.saveBatch(TreeUtils.collectValues(srcRoot)); return connectNodes(srcRoot, destParent); } @@ -197,20 +195,14 @@ public class IndexManager { /** * connect tree nodes and resolve name issue */ - @BizTransactional - public IndexNode connectNodes(RootNode connectRoot, @Nullable IndexNode destParent) { + private IndexNode connectNodes(RootNode connectRoot, @Nullable IndexNode destParent) { // rebuild parent id, parent code and the most important path connectRoot.walkDown(new ConnectNodeVisitor(destParent)); indexNodeDao.connectNodes(TreeUtils.collectValues(connectRoot)); IndexNode copiedRoot = connectRoot.getChildren().get(0). asValueNode().getValue(); // resolve the name issue - if (destParent != null) { - String newName = indexSupport.lockAndMaybeIncrChildName(destParent, copiedRoot.getNodeType(), - copiedRoot.getName()); - // don't update if the name is good - if (!copiedRoot.getName().equals(newName)) - indexNodeDao.rename(copiedRoot.getCode(), newName); - } + if (destParent != null) + indexSupport.incrNameIfDuplicate(destParent, copiedRoot.getNodeType(), copiedRoot); // get the coped root with full props return indexNodeDao.findOrNull(copiedRoot.getCode()); } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java index 0281798e..48d63fe1 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java @@ -14,7 +14,6 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import cn.axzo.nanopart.doc.file.index.copy.SetScopeProcessor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -31,6 +30,7 @@ import cn.axzo.nanopart.doc.dao.DocLockDao; import cn.axzo.nanopart.doc.dao.IndexNodeDao; import cn.axzo.nanopart.doc.entity.IndexNode; import cn.axzo.nanopart.doc.entity.domain.Path; +import cn.axzo.nanopart.doc.file.index.copy.SetScopeProcessor; import cn.axzo.nanopart.doc.file.index.domain.NameUsedException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -97,15 +97,17 @@ class IndexSupport { BizAssertions.assertFalse(parent.isFile(), "不能在文件下建立文件夹"); } - String lockAndMaybeIncrChildName(IndexNode parentNode, IndexNodeType nodeType, String name) { + void incrNameIfDuplicate(IndexNode parentNode, IndexNodeType nodeType, IndexNode rename) { lockParentAndReleaseOnCommit(parentNode); - IndexNode sameName = indexNodeDao.findValidChildByName(parentNode, nodeType, name); - if (sameName == null) - return name; - List nameLikeNodes = indexNodeDao.findValidChildrenNameRightLike(parentNode, nodeType, name); - Pattern pattern = Pattern.compile(Pattern.quote(name) + "\\((\\d+)\\)"); + List nameLikeNodes = indexNodeDao.findValidChildrenNameRightLike(parentNode, nodeType, + rename.getName()); + if (nameLikeNodes.size() == 1 && IndexNode.idEquals(rename, nameLikeNodes.get(0))) + return; + Pattern pattern = Pattern.compile(Pattern.quote(rename.getName()) + "\\((\\d+)\\)"); int maxSeq = 0; for (IndexNode indexNode : nameLikeNodes) { + if (indexNode.getId().equals(rename.getId())) + continue; Matcher matcher = pattern.matcher(indexNode.getName()); if (matcher.matches()) { int seq = Integer.parseInt(matcher.group(1)); @@ -114,7 +116,8 @@ class IndexSupport { } } maxSeq = maxSeq == 0 ? 1 : maxSeq + 1; - return String.format("%s(%d)", name, maxSeq); + String newName = String.format("%s(%d)", rename.getName(), maxSeq); + indexNodeDao.rename(rename.getCode(), newName); } void ensureChildNameNotUsed(NodeCreate create, IndexNodeType nodeType) { diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/mapper/IndexNodeMapper.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/mapper/IndexNodeMapper.java index 2a83d4c1..03cebc11 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/mapper/IndexNodeMapper.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/mapper/IndexNodeMapper.java @@ -17,10 +17,11 @@ import cn.axzo.nanopart.doc.entity.IndexNode; @Mapper public interface IndexNodeMapper extends BaseMapper { - @Insert("") void connectNodes(@Param("nodes") List nodes);