diff --git a/gvsds/apps/gerp/form_service.py b/gvsds/apps/gerp/form_service.py index 9ad3e90f..7d332f41 100644 --- a/gvsds/apps/gerp/form_service.py +++ b/gvsds/apps/gerp/form_service.py @@ -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: