From 5c476971e501d44e29df63d3bfeb7ea67c8ac4bf Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Tue, 30 Dec 2025 14:45:57 +0800 Subject: [PATCH] fix: package error --- .../common/audit/schemas/logger_decorator.py | 110 ++++++++---------- 1 file changed, 47 insertions(+), 63 deletions(-) diff --git a/backend/common/audit/schemas/logger_decorator.py b/backend/common/audit/schemas/logger_decorator.py index 0bf11d52..a6b18470 100644 --- a/backend/common/audit/schemas/logger_decorator.py +++ b/backend/common/audit/schemas/logger_decorator.py @@ -2,14 +2,14 @@ import time import functools import json import inspect -from typing import Callable, Any, Optional, Dict, Union, List +from typing import Callable, Any, Optional, Dict, Union from fastapi import Request, HTTPException from datetime import datetime from pydantic import BaseModel from sqlmodel import Session, select import traceback from sqlbot_xpack.audit.curd.audit import build_resource_union_query -from common.audit.models.log_model import OperationType, OperationStatus, SystemLog, SystemLogsResource +from common.audit.models.log_model import OperationType, OperationStatus, SystemLog from common.audit.schemas.request_context import RequestContext from apps.system.crud.user import get_user_by_account from apps.system.schemas.system_schema import UserInfoDTO, BaseUserDTO @@ -18,36 +18,42 @@ from sqlalchemy import and_, select from common.core.db import engine -def get_resource_name_by_id_and_module(session, resource_id: Any, module: str) -> List[Dict[str, str]]: + +def get_resource_name_by_id_and_module(session, resource_id: Any, module: str) -> Optional[str]: resource_union_query = build_resource_union_query() resource_alias = resource_union_query.alias("resource") - # 统一处理为列表 - if not isinstance(resource_id, list): - resource_id = [resource_id] + if isinstance(resource_id, list): + # 处理列表情况 + if not resource_id: + return None - if not resource_id: - return [] - - # 构建查询,使用 IN 条件 - query = select( - resource_alias.c.id, - resource_alias.c.name, - resource_alias.c.module - ).where( - and_( - resource_alias.c.id.in_([str(id_) for id_ in resource_id]), - resource_alias.c.module == module + # 构建查询,使用 IN 条件 + query = select( + resource_alias.c.name + ).where( + and_( + resource_alias.c.id.in_([str(id_) for id_ in resource_id]), + resource_alias.c.module == module + ) ) - ) + # 执行查询并获取所有结果 + results = session.execute(query).scalars().all() - results = session.execute(query).fetchall() + # 用逗号连接所有名称 + return ",".join(results) if results else None + else: + # 处理单个字符串情况 + query = select( + resource_alias.c.name + ).where( + and_( + resource_alias.c.id == str(resource_id), + resource_alias.c.module == module + ) + ) + return session.execute(query).scalar() - return [{ - 'resource_id': str(row.id), - 'resource_name': row.name or '', - 'module': row.module or '' - } for row in results] class LogConfig(BaseModel): operation_type: OperationType @@ -384,7 +390,6 @@ class SystemLogger: remark: Optional[str] = None, oid: int = -1, opt_type_ref : OperationType = None, - resource_info_list : Optional[List] = None, ) -> Optional[SystemLog]: """Create log records""" try: @@ -417,6 +422,7 @@ class SystemLogger: error_message=error_message, module=config.module, resource_id=str(resource_id), + resource_name=str(resource_name), request_method=request.method if request else None, request_path=request.url.path if request else None, request_params=request_params, @@ -424,39 +430,13 @@ class SystemLogger: remark=remark ) - with Session(engine) as session: session.add(log) + session.query(SystemLog).filter(SystemLog.resource_id == str(resource_id)).update({ + SystemLog.resource_name: str(resource_name) + }, synchronize_session='fetch') session.commit() session.refresh(log) - # 统一处理不同类型的 resource_id_info - if isinstance(resource_id, list): - resource_ids = [str(rid) for rid in resource_id] - else: - resource_ids = [str(resource_id)] - # 批量添加 SystemLogsResource - resource_entries = [] - for resource_id_details in resource_ids: - resource_entry = SystemLogsResource( - resource_id=resource_id_details, - log_id=log.id, - module=config.module - ) - resource_entries.append(resource_entry) - if resource_entries: - session.bulk_save_objects(resource_entries) - session.commit() - - if config.operation_type == OperationType.DELETE and resource_info_list is not None: - # 批量更新 SystemLogsResource 表的 resource_name - for resource_info in resource_info_list: - session.query(SystemLogsResource).filter( - SystemLogsResource.resource_id == resource_info['resource_id'], - SystemLogsResource.module == resource_info['module'], - ).update({ - SystemLogsResource.resource_name: resource_info['resource_name'] - }, synchronize_session='fetch') - session.commit() return log except Exception as e: @@ -492,7 +472,6 @@ def system_log(config: Union[LogConfig, Dict]): remark = None oid = -1 opt_type_ref = None - resource_info_list = None try: # Get current request @@ -536,7 +515,7 @@ def system_log(config: Union[LogConfig, Dict]): resource_name = input_account if config.operation_type == OperationType.DELETE: with Session(engine) as session: - resource_info_list = get_resource_name_by_id_and_module(session, resource_id, config.module) + resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module) if config.operation_type == OperationType.CREATE_OR_UPDATE: opt_type_ref = OperationType.UPDATE if resource_id is not None else OperationType.CREATE @@ -551,6 +530,10 @@ def system_log(config: Union[LogConfig, Dict]): result, "result" ) + if config.operation_type != OperationType.DELETE: + with Session(engine) as session: + resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module) + return result except Exception as e: status = OperationStatus.FAILED @@ -585,8 +568,7 @@ def system_log(config: Union[LogConfig, Dict]): remark=remark, request=request, oid=oid, - opt_type_ref=opt_type_ref, - resource_info_list=resource_info_list + opt_type_ref=opt_type_ref ) except Exception as log_error: print(f"[SystemLogger] Log creation failed: {log_error}") @@ -599,7 +581,6 @@ def system_log(config: Union[LogConfig, Dict]): request = None resource_id = None resource_name = None - resource_info_list = None result = None try: @@ -621,7 +602,7 @@ def system_log(config: Union[LogConfig, Dict]): # Obtain client information if config.operation_type == OperationType.DELETE: with Session(engine) as session: - resource_info_list = get_resource_name_by_id_and_module(session, resource_id, config.module) + resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module) # Execute the original function result = func(*args, **kwargs) @@ -634,6 +615,10 @@ def system_log(config: Union[LogConfig, Dict]): "result" ) + if config.operation_type != OperationType.DELETE: + with Session(engine) as session: + resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module) + return result except Exception as e: @@ -667,8 +652,7 @@ def system_log(config: Union[LogConfig, Dict]): error_message=error_message, resource_id=resource_id, resource_name=resource_name, - request=request, - resource_info_list=resource_info_list + request=request ) ) else: