public async Task MoveAsync() { //Act var beijing = await CreateRegion("beijing"); await CreateRegion("dongcheng", beijing.Id); await CreateRegion("xicheng", beijing.Id); var hebei = await CreateRegion("hebei"); await CreateRegion("shijiazhuang", hebei.Id); var chengde = await CreateRegion("chengde", hebei.Id); await CreateRegion("shaungqiao", chengde.Id); await CreateRegion("shaungluan", chengde.Id); await _generalTreeManager.MoveToAsync(chengde.Id, beijing.Id); //Assert var beijingLastChild = await GetRegion("xicheng"); beijingLastChild.ShouldNotBeNull(); var cd = await GetRegion(chengde.Name); cd.ShouldNotBeNull(); cd.FullName.ShouldBe(beijing.FullName + "-" + chengde.Name); cd.ParentId.ShouldBe(beijing.Id); cd.Level.ShouldBe(beijing.Level + 1); cd.Code.ShouldBe(_generalTreeCodeGenerator.GetNextCode(beijingLastChild.Code)); }
public virtual async Task MoveAfterAsync(TPrimaryKey id, TPrimaryKey afterId, Action <TTree> childrenAction = null, CancellationToken cancellationToken = default) { var sourceTree = await _generalTreeRepository.GetAsync(id, cancellationToken : cancellationToken); var destTree = await _generalTreeRepository.GetAsync(afterId, cancellationToken : cancellationToken); var parent = destTree.ParentId.HasValue ? await _generalTreeRepository.GetAsync(destTree.ParentId.Value, cancellationToken : cancellationToken) : null; var oldChildren = await _generalTreeRepository.GetAllChildrenAsync(id, cancellationToken); var oldCode = sourceTree.Code; var oldFullName = sourceTree.FullName; sourceTree.Code = destTree.Code; sourceTree.Level = sourceTree.Code.Split('.').Length; sourceTree.ParentId = destTree.ParentId; sourceTree.FullName = parent != null ? parent.Name + _generalTreeOptions.Hyphen + sourceTree.Name : sourceTree.Name; await CheckSameName(sourceTree); var children = await _generalTreeRepository.GetChildrenAsync(parent?.Id, cancellationToken); var allNext = children.SkipWhile(x => x.Code != destTree.Code); await _generalTreeRepository.UpdateAsync(sourceTree, cancellationToken : cancellationToken); foreach (var child in oldChildren) { child.Code = _generalTreeCodeGenerator.MergeCode(sourceTree.Code, _generalTreeCodeGenerator.RemoveParentCode(child.Code, oldCode)); child.FullName = _generalTreeCodeGenerator.MergeFullName( sourceTree.FullName, _generalTreeCodeGenerator.RemoveParentCode(child.FullName, oldFullName), _generalTreeOptions.Hyphen); child.Level = child.Code.Split('.').Length; childrenAction?.Invoke(child); await _generalTreeRepository.UpdateAsync(child, cancellationToken : cancellationToken); } foreach (var child in allNext) { child.Code = _generalTreeCodeGenerator.GetNextCode(child.Code); childrenAction?.Invoke(child); await _generalTreeRepository.UpdateAsync(child, cancellationToken : cancellationToken); } }