This commit is contained in:
owenchen committed 2026-10-26 11:10:09 +08:00
1 parent d97a8884aa
commit e9af73007e
5 files changed
+38 -68

No files matched your search

@@ -13,6 +13,7 @@ using CloudBuilder.Security.Policy;
using CloudBuilder.Security.Service;
using CloudBuilder.Security.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
@@ -791,50 +792,18 @@ namespace CloudBuilder.Master.Service
throw new ValidatedException("您没有删除权限.");
}
repository.DeleteNow(ent);
// 整谱级联按 TreeId 集合式删除(三条 DELETE ... WHERE tree_id),取代旧「逐人递归删」:
// 大谱(数千族员)下递归对每人各发 SELECT+DELETE,单事务内上万次往返直接超时;
// 且旧逻辑只删了始祖一条 person,旁系 person 全遗留成孤儿。三表都带 tree_id,一把删净。
IRepository<FamilyTreeSpouseMapEntity> repositorySpouse = repository.GetRepository<IRepository<FamilyTreeSpouseMapEntity>>();
IRepository<FamilyTreeChildrenMapEntity> repositoryChild = repository.GetRepository<IRepository<FamilyTreeChildrenMapEntity>>();
IRepository<FamilyPersonEntity> repositoryPerson = repository.GetRepository<IRepository<FamilyPersonEntity>>();
FamilyPersonEntity familyPerson;
familyPerson = repositoryPerson.DetachedEntities.Where(x => x.PersonId == ent.AncestorPersonId).FirstOrDefault()!;
if (familyPerson != null)
{
repositoryPerson.DeleteNow(familyPerson);
}
repositorySpouse.Entities.Where(x => x.TreeId == key).ExecuteDelete();
repositoryChild.Entities.Where(x => x.TreeId == key).ExecuteDelete();
repositoryPerson.Entities.Where(x => x.TreeId == key).ExecuteDelete();
DeleteSpouses(ent.AncestorPersonId);
DeleteChildrens(ent.AncestorPersonId);
}
private void DeleteSpouses(string personId)
{
IRepository<FamilyTreeSpouseMapEntity> repositoryMap = repository.GetRepository<IRepository<FamilyTreeSpouseMapEntity>>();
FamilyTreeSpouseMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray();
if (olds != null && olds.Length > 0)
{
repositoryMap.DeleteNow(olds);
}
}
private void DeleteChildrens(string personId)
{
IRepository<FamilyTreeChildrenMapEntity> repositoryMap = repository.GetRepository<IRepository<FamilyTreeChildrenMapEntity>>();
FamilyTreeChildrenMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray();
if (olds != null && olds.Length > 0)
{
repositoryMap.DeleteNow(olds);
}
foreach (FamilyTreeChildrenMapEntity old in olds)
{
DeleteChildrens(old.ChildrenId);
DeleteSpouses(old.ChildrenId);
}
repository.DeleteNow(ent);
}
[PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Delete)]