refactor(form_service): get_table 富化块裸 ORM 收敛进 SDK Manager
三处富化逻辑改调 SDK 批量方法:UserRoleWorkgroup/UserRoleDepartment 的 UserRole 反查与人名/角色名映射、UserRoleDepartment 的职务多值聚合、UserRole 的部门/职务虚拟列,分别改用 RoleManager.GetUserRolesByUUIDs / GetRoleNameMap / GetUserRoleDepartmentsForUserRoles、AuthManager.GetUserNames、PositionManager.GetUrdPositionRowsForUrds / GetPositionNameMap、DepartmentManager.GetDepartmentNameMap;员工详情页子表 UserUUID 过滤改用 RoleManager.ListUserRoleUUIDs。get_table 内已无裸 ORM(仅保留基础 model.objects.all())。 新增 _StrKeyMap 适配层:SDK 批量映射统一以 UUID 字节为键(避免 UUIDObj 与 bytes 的 hash 不等陷阱),本模块历史代码以字符串为键,此处显式转换。业务语义(标签列名、逗号聚合、覆盖名 RoleNameCover)完全留在 gvsds 侧。 等价性已用改造前快照校验:UserRole / UserRoleDepartment / UserRoleWorkgroup 三表 get_table 记录 sha1 与改造前逐字节一致(abc1f5820bcb5671 / 6344295216b39cfc / ac03fc8eacfe526a),员工详情页子表按 UserUUID 过滤与非法 UUID 空结果行为不变。
This commit is contained in:
1 parent
62e5c3e508
commit
ddfc3fdde1
1 file changed
+36
-59
@@ -23,6 +23,8 @@ from gvsds.apps.gerp.models import (
|
||||
)
|
||||
from gvsds.apps.core.models import User, UserAvatar, User2FA, UserPending2FA
|
||||
from gvsdsdk.form_service import FormServiceBase
|
||||
from gvsdsdk.model_utils import UUIDObj
|
||||
from gvsdsdk.auth.managers import AuthManager, DepartmentManager, PositionManager, RoleManager
|
||||
from gvsdsdk.order.models import Order, OrderItem, OrderLevel, OrderTemplate, OrderTemplateItem
|
||||
from gvsds.apps.gerp.i18n import translate_field, translate_table
|
||||
|
||||
@@ -34,6 +36,22 @@ SYSTEM_COMPANY_UUID = uuid.UUID('00000000-0000-0000-0000-000000000001').bytes
|
||||
_SKIP_FILTER_PARAMS = {'keyword', 'PageIndex', 'PageSize', 'page', 'pageSize', 'format'}
|
||||
|
||||
|
||||
def _StrKeyMap(ByteMap):
|
||||
"""{UUID 16 字节: 值} → {UUID 字符串: 值}
|
||||
|
||||
SDK 的批量映射(GetRoleNameMap/GetUserNames/GetPositionNameMap/…)统一以字节为键,
|
||||
避免 UUIDObj 与 bytes 的 hash 不等导致查不到;本模块历史代码以字符串为键,
|
||||
故在此做一次显式转换。
|
||||
"""
|
||||
result = {}
|
||||
for key, value in (ByteMap or {}).items():
|
||||
try:
|
||||
result[str(UUIDObj(key))] = value
|
||||
except Exception:
|
||||
continue
|
||||
return result
|
||||
|
||||
|
||||
def _to_uuid_bytes(value):
|
||||
"""将 UUIDObj/bytes/str/uuid.UUID 统一转为 BINARY(16) bytes;无法转换返回 None"""
|
||||
if value is None:
|
||||
@@ -1154,10 +1172,10 @@ class FormService(FormServiceBase):
|
||||
# (表本身只存 UserRoleUUID,需经 UserRole 关联表反查该用户的所有用户-角色对)
|
||||
if table_name in ('UserRoleDepartment', 'UserRoleWorkgroup') and params.get('UserUUID'):
|
||||
try:
|
||||
user_bytes = uuid.UUID(str(params['UserUUID'])).bytes
|
||||
except (ValueError, AttributeError):
|
||||
user_bytes = params['UserUUID']
|
||||
ur_uuids = list(UserRole.objects.filter(UserUUID=user_bytes).values_list('UserRoleUUID', flat=True))
|
||||
ur_uuids = RoleManager.ListUserRoleUUIDs(params['UserUUID'])
|
||||
except Exception:
|
||||
# UUID 非法时按「无匹配」处理,与直接按原值过滤的历史行为一致
|
||||
ur_uuids = []
|
||||
if not ur_uuids:
|
||||
return {'records': [], 'total': 0}
|
||||
qs = qs.filter(UserRoleUUID__in=ur_uuids)
|
||||
@@ -1191,29 +1209,15 @@ class FormService(FormServiceBase):
|
||||
if table_name in ('UserRoleWorkgroup', 'UserRoleDepartment'):
|
||||
try:
|
||||
from gvsdsdk.model_utils import UUIDObj as _UO2
|
||||
urw_roles = UserRole.objects.filter(UserRoleUUID__in=[
|
||||
urw_roles = RoleManager.GetUserRolesByUUIDs([
|
||||
r.get('UserRoleUUID') for r in records if r.get('UserRoleUUID')
|
||||
])
|
||||
# UserRoleUUID(str) → {user_uuid, role_name, user_name}
|
||||
urw_info = {}
|
||||
role_uuids = {_ur.RoleUUID for _ur in urw_roles if _ur.RoleUUID}
|
||||
user_uuids = {_ur.UserUUID for _ur in urw_roles if _ur.UserUUID}
|
||||
role_name_map = {}
|
||||
user_name_map = {}
|
||||
if role_uuids:
|
||||
from gvsdsdk.models import Role as _SdkRole
|
||||
for _r in _SdkRole.objects.filter(RoleUUID__in=role_uuids):
|
||||
try:
|
||||
role_name_map[str(_UO2(_r.RoleUUID))] = _r.RoleName
|
||||
except Exception:
|
||||
pass
|
||||
if user_uuids:
|
||||
from gvsds.apps.core.models import User as _CoreUser
|
||||
for _u in _CoreUser.objects.filter(UserUUID__in=user_uuids):
|
||||
try:
|
||||
user_name_map[str(_UO2(_u.UserUUID))] = _u.UserName
|
||||
except Exception:
|
||||
pass
|
||||
role_name_map = _StrKeyMap(RoleManager.GetRoleNameMap(role_uuids))
|
||||
user_name_map = _StrKeyMap(AuthManager.GetUserNames(user_uuids))
|
||||
for _ur in urw_roles:
|
||||
try:
|
||||
_key = _UO2(_ur.UserRoleUUID).str
|
||||
@@ -1250,16 +1254,9 @@ class FormService(FormServiceBase):
|
||||
if table_name == 'UserRoleDepartment':
|
||||
urd_uuids = [r.get('UserRoleDepartmentUUID') for r in records if r.get('UserRoleDepartmentUUID')]
|
||||
if urd_uuids:
|
||||
urdp_qs = UserRoleDepartmentPosition.objects.filter(UserRoleDepartmentUUID__in=urd_uuids)
|
||||
urdp_qs = PositionManager.GetUrdPositionRowsForUrds(urd_uuids)
|
||||
_pos_uuids = {p.PositionUUID for p in urdp_qs if p.PositionUUID}
|
||||
_pos_name_map = {}
|
||||
if _pos_uuids:
|
||||
from gvsdsdk.models import Position as _SdkPos2
|
||||
for _p in _SdkPos2.objects.filter(PositionUUID__in=_pos_uuids):
|
||||
try:
|
||||
_pos_name_map[str(_UO2(_p.PositionUUID))] = _p.PositionName
|
||||
except Exception:
|
||||
pass
|
||||
_pos_name_map = _StrKeyMap(PositionManager.GetPositionNameMap(_pos_uuids))
|
||||
_urdp_map = {}
|
||||
for _p in urdp_qs:
|
||||
try:
|
||||
@@ -1282,7 +1279,7 @@ class FormService(FormServiceBase):
|
||||
if table_name == 'UserRoleWorkgroup':
|
||||
_urw_ur_uuids = [r.get('UserRoleUUID') for r in records if r.get('UserRoleUUID')]
|
||||
if _urw_ur_uuids:
|
||||
_urw_urds = list(UserRoleDepartment.objects.filter(UserRoleUUID__in=_urw_ur_uuids))
|
||||
_urw_urds = RoleManager.GetUserRoleDepartmentsForUserRoles(_urw_ur_uuids)
|
||||
_urw_urd_ur_map = {} # UserRoleDepartmentUUID(str) → UserRoleUUID(str)
|
||||
_urw_urd_by_ur = {} # UserRoleUUID(str) → 主 URD 对象
|
||||
for _u in _urw_urds:
|
||||
@@ -1295,18 +1292,11 @@ class FormService(FormServiceBase):
|
||||
_urw_urd_ur_map[_urd_k] = _ur_k
|
||||
_urw_urd_by_ur.setdefault(_ur_k, _u)
|
||||
if _urw_urd_ur_map:
|
||||
_urw_urdp_qs = UserRoleDepartmentPosition.objects.filter(
|
||||
UserRoleDepartmentUUID__in=list(_urw_urd_ur_map.keys())
|
||||
_urw_urdp_qs = PositionManager.GetUrdPositionRowsForUrds(
|
||||
list(_urw_urd_ur_map.keys())
|
||||
)
|
||||
_urw_pos_uuids = {p.PositionUUID for p in _urw_urdp_qs if p.PositionUUID}
|
||||
_urw_pos_name_map = {}
|
||||
if _urw_pos_uuids:
|
||||
from gvsdsdk.models import Position as _SdkPosW
|
||||
for _p in _SdkPosW.objects.filter(PositionUUID__in=_urw_pos_uuids):
|
||||
try:
|
||||
_urw_pos_name_map[str(_UO2(_p.PositionUUID))] = _p.PositionName
|
||||
except Exception:
|
||||
pass
|
||||
_urw_pos_name_map = _StrKeyMap(PositionManager.GetPositionNameMap(_urw_pos_uuids))
|
||||
_urw_pos_map = {} # UserRoleUUID(str) → [position str]
|
||||
for _p in _urw_urdp_qs:
|
||||
try:
|
||||
@@ -1337,7 +1327,7 @@ class FormService(FormServiceBase):
|
||||
from gvsdsdk.model_utils import UUIDObj as _UO2
|
||||
_ur_uuids = [r.get('UserRoleUUID') for r in records if r.get('UserRoleUUID')]
|
||||
if _ur_uuids:
|
||||
_urd_qs = list(UserRoleDepartment.objects.filter(UserRoleUUID__in=_ur_uuids))
|
||||
_urd_qs = RoleManager.GetUserRoleDepartmentsForUserRoles(_ur_uuids)
|
||||
_urd_by_ur = {}
|
||||
for _u in _urd_qs:
|
||||
try:
|
||||
@@ -1347,27 +1337,14 @@ class FormService(FormServiceBase):
|
||||
_urd_by_ur.setdefault(_k, _u)
|
||||
# 部门名映射
|
||||
_dept_uuids = {_u.DeptUUID for _u in _urd_by_ur.values() if _u.DeptUUID}
|
||||
_dept_name_map = {}
|
||||
if _dept_uuids:
|
||||
for _d in self.TABLE_MAP['Department'].objects.filter(DeptUUID__in=_dept_uuids):
|
||||
try:
|
||||
_dept_name_map[str(_UO2(_d.DeptUUID))] = _d.DeptName
|
||||
except Exception:
|
||||
pass
|
||||
_dept_name_map = _StrKeyMap(DepartmentManager.GetDepartmentNameMap(_dept_uuids))
|
||||
# 职务聚合(主关联 URD 的职务子表)
|
||||
_urd_objs = list(_urd_by_ur.values())
|
||||
_urdp_qs = UserRoleDepartmentPosition.objects.filter(
|
||||
UserRoleDepartmentUUID__in=[_u.UserRoleDepartmentUUID for _u in _urd_objs]
|
||||
_urdp_qs = PositionManager.GetUrdPositionRowsForUrds(
|
||||
[_u.UserRoleDepartmentUUID for _u in _urd_objs]
|
||||
)
|
||||
_pos_uuids = {p.PositionUUID for p in _urdp_qs if p.PositionUUID}
|
||||
_pos_name_map = {}
|
||||
if _pos_uuids:
|
||||
from gvsdsdk.models import Position as _SdkPos3
|
||||
for _p in _SdkPos3.objects.filter(PositionUUID__in=_pos_uuids):
|
||||
try:
|
||||
_pos_name_map[str(_UO2(_p.PositionUUID))] = _p.PositionName
|
||||
except Exception:
|
||||
pass
|
||||
_pos_name_map = _StrKeyMap(PositionManager.GetPositionNameMap(_pos_uuids))
|
||||
_urdp_map = {}
|
||||
for _p in _urdp_qs:
|
||||
try:
|
||||
|
||||
Reference in new issue
Block a user