From 8fa9534b4eaf50342b2ca2395b37fd1e51dde450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Wed, 23 Apr 2025 17:39:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=A5=E5=8F=A3=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=97=A5=E5=BF=97=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=8A=A5?= =?UTF-8?q?=E5=B7=A5=E6=8E=A5=E5=8F=A3=E8=8E=B7=E5=8F=96=E6=9C=BA=E5=8F=B0?= =?UTF-8?q?id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_work_reporting_api/controllers/main.py | 8 +-- sf_base/__init__.py | 1 + sf_base/controllers/controllers.py | 56 ------------------ sf_base/decorators/__init__.py | 1 + sf_base/decorators/api_log.py | 59 +++++++++++++++++++ 5 files changed, 65 insertions(+), 60 deletions(-) create mode 100644 sf_base/decorators/__init__.py create mode 100644 sf_base/decorators/api_log.py diff --git a/jikimo_work_reporting_api/controllers/main.py b/jikimo_work_reporting_api/controllers/main.py index 6f8492db..aa04acb8 100644 --- a/jikimo_work_reporting_api/controllers/main.py +++ b/jikimo_work_reporting_api/controllers/main.py @@ -2,7 +2,7 @@ import json from odoo import http from odoo.http import request from odoo.addons.sf_machine_connect.models.ftp_operate import transfer_nc_files -from odoo.addons.sf_base.controllers.controllers import api_log +from odoo.addons.sf_base.decorators.api_log import api_log class MainController(http.Controller): @@ -13,11 +13,11 @@ class MainController(http.Controller): 人工线下加工传输编程文件 """ data = json.loads(request.httprequest.data) - maintenance_equipment_name = data.get('maintenance_equipment_name') + maintenance_equipment_id = data.get('maintenance_equipment_id') model_id = data.get('model_id') - if not maintenance_equipment_name or not model_id: + if not maintenance_equipment_id or not model_id: return {'code': 400, 'message': '参数错误'} - maintenance_equipment = request.env['maintenance.equipment'].sudo().search([('name', '=', maintenance_equipment_name)], limit=1) + maintenance_equipment = request.env['maintenance.equipment'].sudo().browse(int(maintenance_equipment_id)) if not maintenance_equipment: return {'code': 400, 'message': '机台不存在,请扫描正确的机台二维码'} product = request.env['product.template'].sudo().search([('model_id', '=', model_id)], limit=1) diff --git a/sf_base/__init__.py b/sf_base/__init__.py index d76dba0b..ef113516 100644 --- a/sf_base/__init__.py +++ b/sf_base/__init__.py @@ -1,3 +1,4 @@ from . import models from . import commons from . import controllers +from . import decorators diff --git a/sf_base/controllers/controllers.py b/sf_base/controllers/controllers.py index ae38ee80..c8447d4e 100644 --- a/sf_base/controllers/controllers.py +++ b/sf_base/controllers/controllers.py @@ -1,10 +1,7 @@ # -*- coding: utf-8 -*- import logging import json -import base64 -import functools import logging -from datetime import datetime from odoo import http from odoo.http import request @@ -56,56 +53,3 @@ class MultiInheritController(): cls.__bases__ = (cls._sub_classes[-1],) if cls not in cls._sub_classes: cls._sub_classes.append(cls) - - -def api_log(name=None, requester=None): - """记录API请求日志的装饰器""" - def decorator(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - start_time = datetime.now() - - # 获取请求信息 - try: - # 获取请求数据 - request_data = json.loads(request.httprequest.data) if request.httprequest.data else {} - # 获取请求路径 - path = request.httprequest.path - # 获取请求方法 - method = request.httprequest.method - # 获取客户端IP - remote_addr = request.httprequest.remote_addr - - # 执行原始函数 - result = func(*args, **kwargs) - - # 计算响应时间 - end_time = datetime.now() - response_time = (end_time - start_time).total_seconds() - - # 创建日志记录 - log_vals = { - 'name': name or func.__name__, - 'path': path, - 'method': method, - 'request_headers': json.dumps(request.httprequest.headers, ensure_ascii=False), - 'request_data': json.dumps(request_data, ensure_ascii=False), - 'response_data': json.dumps(result, ensure_ascii=False), - 'remote_addr': remote_addr, - 'response_time': response_time, - 'status': result.get('code', 500), - 'requester': requester, - 'responser': '智能工厂' - } - - # 异步创建日志记录 - request.env['api.request.log'].sudo().with_context(tracking_disable=True).create(log_vals) - - return result - - except Exception as e: - _logger.error(f"API日志记录失败: {str(e)}") - # 即使日志记录失败,也要返回原始结果 - return func(*args, **kwargs) - return wrapper - return decorator \ No newline at end of file diff --git a/sf_base/decorators/__init__.py b/sf_base/decorators/__init__.py new file mode 100644 index 00000000..0f340289 --- /dev/null +++ b/sf_base/decorators/__init__.py @@ -0,0 +1 @@ +from . import api_log diff --git a/sf_base/decorators/api_log.py b/sf_base/decorators/api_log.py new file mode 100644 index 00000000..2838ec55 --- /dev/null +++ b/sf_base/decorators/api_log.py @@ -0,0 +1,59 @@ + +import functools +import json +import logging +from datetime import datetime +from odoo.http import request + +_logger = logging.getLogger(__name__) + +def api_log(name=None, requester=None): + """记录API请求日志的装饰器""" + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + start_time = datetime.now() + + # 获取请求信息 + try: + # 获取请求数据 + request_data = json.loads(request.httprequest.data) if request.httprequest.data else {} + # 获取请求路径 + path = request.httprequest.path + # 获取请求方法 + method = request.httprequest.method + # 获取客户端IP + remote_addr = request.httprequest.remote_addr + + # 执行原始函数 + result = func(*args, **kwargs) + + # 计算响应时间 + end_time = datetime.now() + response_time = (end_time - start_time).total_seconds() + + # 创建日志记录 + log_vals = { + 'name': name or func.__name__, + 'path': path, + 'method': method, + 'request_data': json.dumps(request_data, ensure_ascii=False), + 'response_data': json.dumps(result, ensure_ascii=False), + 'remote_addr': remote_addr, + 'response_time': response_time, + 'status': result.get('code', 500), + 'requester': requester, + 'responser': '智能工厂' + } + + # 异步创建日志记录 + request.env['api.request.log'].sudo().with_context(tracking_disable=True).create(log_vals) + + return result + + except Exception as e: + _logger.error(f"API日志记录失败: {str(e)}") + # 即使日志记录失败,也要返回原始结果 + return func(*args, **kwargs) + return wrapper + return decorator \ No newline at end of file