feat(sdk): 补用户-角色/URD 职务/职务名/部门名的批量查询方法

RoleManager.GetUserRolesByUUIDs:批量取 UserRole 行;PositionManager.GetUrdPositionRowsForUrds:一次取多个 URD 的职务子表行;PositionManager.GetPositionNameMap 与 DepartmentManager.GetDepartmentNameMap:批量 UUID→名称映射(字节键,避免 UUIDObj/bytes hash 不等)。

均为列表页批量富化所需的低层原语,供子项目替代逐个 filter 与手写映射循环。
This commit is contained in:
TermiNexus committed 2026-09-15 13:34:23 +08:00
1 parent 22754ae070
commit 8a12707616
1 file changed
+102
+102
View File
@@ -147,6 +147,28 @@ class RoleManager:
return UserRole.objects.none()
return UserRole.objects.filter(CompanyUUID=comp_bytes)
@staticmethod
def GetUserRolesByUUIDs(UserRoleUUIDs):
"""批量按 UUID 取「用户-角色」关联行(无效项自动跳过)
Args:
UserRoleUUIDs: UserRoleUUID 集合(bytes/str/UUIDObj 均可)
Returns:
list[UserRole]
"""
uuids = []
for u in (UserRoleUUIDs or []):
if not u:
continue
try:
uuids.append(UUIDObj(u).bytes)
except Exception:
continue
if not uuids:
return []
return list(UserRole.objects.filter(UserRoleUUID__in=uuids))
@staticmethod
def AssignPermission(RoleUUID, PermUUID, CompanyUUID):
"""为角色分配权限(指定公司)"""
@@ -1219,6 +1241,58 @@ class PositionManager:
).values_list('PositionUUID', flat=True)
)
@staticmethod
def GetUrdPositionRowsForUrds(URDUUIDs):
"""批量取多个 URD 的职务子表行(无效项自动跳过)
Args:
URDUUIDs: UserRoleDepartmentUUID 集合(bytes/str/UUIDObj 均可)
Returns:
list[UserRoleDepartmentPosition]
"""
urd_uuids = []
for u in (URDUUIDs or []):
if not u:
continue
try:
urd_uuids.append(UUIDObj(u).bytes)
except Exception:
continue
if not urd_uuids:
return []
return list(
UserRoleDepartmentPosition.objects.filter(UserRoleDepartmentUUID__in=urd_uuids)
)
@staticmethod
def GetPositionNameMap(PositionUUIDs):
"""批量获取 PositionUUID(bytes) → PositionName 映射(仅含存在的职务)
Args:
PositionUUIDs: UUID 集合(bytes/str/UUIDObj 混合均可)
Returns:
dict[bytes, str]:键为 UUID 的 16 字节形式,与调用方字节键对齐
"""
uuids = []
for u in (PositionUUIDs or []):
if not u:
continue
try:
uuids.append(UUIDObj(u).bytes)
except Exception:
continue
if not uuids:
return {}
result = {}
for p in Position.objects.filter(PositionUUID__in=uuids):
try:
result[p.PositionUUID.bytes] = p.PositionName
except AttributeError:
result[UUIDObj(p.PositionUUID).bytes] = p.PositionName
return result
@staticmethod
def GetHeldPositionUUIDs():
"""所有员工当前持有的职务 UUID bytes 集合(UserRoleDepartmentPosition 引用)
@@ -2606,6 +2680,34 @@ class DepartmentManager:
return Department.objects.none()
return Department.objects.filter(CompanyUUID=comp_bytes)
@staticmethod
def GetDepartmentNameMap(DeptUUIDs):
"""批量获取 DeptUUID(bytes) → DeptName 映射(仅含存在的部门)
Args:
DeptUUIDs: UUID 集合(bytes/str/UUIDObj 混合均可)
Returns:
dict[bytes, str]:键为 UUID 的 16 字节形式,与调用方字节键对齐
"""
uuids = []
for u in (DeptUUIDs or []):
if not u:
continue
try:
uuids.append(UUIDObj(u).bytes)
except Exception:
continue
if not uuids:
return {}
result = {}
for d in Department.objects.filter(DeptUUID__in=uuids):
try:
result[d.DeptUUID.bytes] = d.DeptName
except AttributeError:
result[UUIDObj(d.DeptUUID).bytes] = d.DeptName
return result
@staticmethod
def GetDepartmentsForUser(UserUUID):
"""获取用户部门列表(UserRole → UserRoleDepartment → Department,去重)"""