diff --git a/jikimo_work_reporting_api/controllers/main.py b/jikimo_work_reporting_api/controllers/main.py index ddcda00d..6f8492db 100644 --- a/jikimo_work_reporting_api/controllers/main.py +++ b/jikimo_work_reporting_api/controllers/main.py @@ -2,10 +2,12 @@ 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 class MainController(http.Controller): @http.route('/api/manual_download_program', type='json', methods=['POST'], auth='public', cors='*') + @api_log('人工线下加工编程文件传输', requester='报工系统') def manual_download_program(self): """ 人工线下加工传输编程文件 diff --git a/sf_base/controllers/controllers.py b/sf_base/controllers/controllers.py index 47c67322..ae38ee80 100644 --- a/sf_base/controllers/controllers.py +++ b/sf_base/controllers/controllers.py @@ -2,9 +2,13 @@ import logging import json import base64 +import functools +import logging +from datetime import datetime from odoo import http from odoo.http import request +_logger = logging.getLogger(__name__) class Manufacturing_Connect(http.Controller): @@ -52,3 +56,56 @@ 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/models/__init__.py b/sf_base/models/__init__.py index 82ed80c1..55d8d029 100644 --- a/sf_base/models/__init__.py +++ b/sf_base/models/__init__.py @@ -6,3 +6,4 @@ from . import functional_fixture from . import tool_other_features from . import basic_parameters_fixture from . import ir_sequence +from . import api_log diff --git a/sf_base/models/api_log.py b/sf_base/models/api_log.py new file mode 100644 index 00000000..4b630b88 --- /dev/null +++ b/sf_base/models/api_log.py @@ -0,0 +1,18 @@ +from odoo import models, fields, api + + +class ApiRequestLog(models.Model): + _name = 'api.request.log' + _description = '接口请求日志' + _order = 'id desc' + + name = fields.Char('接口名称') + path = fields.Char('请求路径') + method = fields.Char('请求方法') + request_data = fields.Text('请求数据') + response_data = fields.Text('响应数据') + remote_addr = fields.Char('客户端IP') + response_time = fields.Float('响应时间(秒)', digits=(16, 6)) + status = fields.Integer('状态码') + requester = fields.Char('请求方') + responser = fields.Char('响应方')