This commit is contained in:
owenchen committed 2026-10-19 13:36:58 +08:00
1 parent 479762b57e
commit 27284040cc
30 files changed
+3042 -428

No files matched your search

@@ -29,6 +29,49 @@ namespace CloudBuilder.Master.Service.FamilyTreeUtility
return GetPersonId(permissions, treeId).Where(x => x == personId).Any();
}
/// <summary>
/// 管理员口径:该谱系下此用户存在 ManagerIndc=Y 且已生效的权限行(谱级操作专属)。
/// 注意与 HasPermission 区分:成员若绑始祖或始祖在其上溯两代内,HasPermission(始祖) 也会为真,
/// 不能拿它当谱级闸,否则这些成员能改谱/删谱
/// </summary>
public bool IsManager(string treeId)
{
IRepository<FamilyTreePermissionEntity> repositoryPermission = service.GetRepository<IRepository<FamilyTreePermissionEntity>>();
return repositoryPermission.DetachedEntities
.Where(x => x.UserName == service.UserId
&& x.TreeId == treeId
&& x.ManagerIndc == YesNoPolicy.YES
&& x.ValidIndc == YesNoPolicy.YES)
.Any();
}
/// <summary>
/// 成员口径:该谱系下此用户存在已生效权限行(不分管理员/成员档),
/// 供「往谱里新增人」这类无既有 PersonId 可校验的操作做最小闸门
/// </summary>
public bool IsMember(string treeId)
{
IRepository<FamilyTreePermissionEntity> repositoryPermission = service.GetRepository<IRepository<FamilyTreePermissionEntity>>();
return repositoryPermission.DetachedEntities
.Where(x => x.UserName == service.UserId
&& x.TreeId == treeId
&& x.ValidIndc == YesNoPolicy.YES)
.Any();
}
/// <summary>
/// 当前用户在本谱可编的族员集合(家支主线,口径与 HasPermission 完全同源);
/// 供详情接口下发给前端做「逐个目标人」的编辑/删除钮判定(锚点级 IsCanAmend 盖不住关系行里的旁支)
/// </summary>
public List<string> GetAmendablePersonIds(string treeId)
{
IRepository<FamilyTreePermissionEntity> repositoryPermission = service.GetRepository<IRepository<FamilyTreePermissionEntity>>();
FamilyTreePermissionEntity[] permissions = repositoryPermission.DetachedEntities.Where(x => x.TreeId == treeId && x.UserName == service.UserId && x.ValidIndc == YesNoPolicy.YES).ToArray();
return GetPersonId(permissions, treeId);
}
public List<string> GetPersonId(FamilyTreePermissionEntity[] permissions, string treeId)
{
List<string> ps = new List<string>();
@@ -41,7 +84,7 @@ namespace CloudBuilder.Master.Service.FamilyTreeUtility
IRepository<FamilyTreeSpouseMapEntity> repositorySpouseMap = service.GetRepository<IRepository<FamilyTreeSpouseMapEntity>>();
if (childrens == null || childrens.Length == 0)
if (spouses == null || spouses.Length == 0)
spouses = repositorySpouseMap.DetachedEntities.Where(x => x.TreeId == treeId).ToArray();
foreach (var permission in permissions)
@@ -63,12 +106,16 @@ namespace CloudBuilder.Master.Service.FamilyTreeUtility
foreach (FamilyTreeChildrenMapEntity child in childrens.Where(x => x.PersonId == personId))
PackPersonIdByChildrenMaps(childrens, spouses, child.ChildrenId, ps);
}
//父亲ID也有权限
if (childrens != null && childrens.Where(x => x.ChildrenId == personId).Any())
//向上延伸:最多两代(父、祖),含每一代配偶(家支口径;不含兄弟姐妹等旁支)
string cursor = personId;
for (int up = 0; up < 2 && childrens != null; up++)
{
var p = childrens.Where(x => x.ChildrenId == personId).Select(x => x.PersonId).FirstOrDefault();
if (!ps.Contains(p))
ps.Add(p);
string father = childrens.Where(x => x.ChildrenId == cursor).Select(x => x.PersonId).FirstOrDefault();
// ps 去重兼做环保护:父链成环或已收过即停
if (string.IsNullOrEmpty(father) || ps.Contains(father)) break;
ps.Add(father);
PackPersonIdBySpouseMaps(spouses, father, ps);
cursor = father;
}
//配偶都有权限
PackPersonIdBySpouseMaps(spouses, personId, ps);