diff --git a/jikimo_work_reporting_api/controllers/main.py b/jikimo_work_reporting_api/controllers/main.py index ddcda00d..aa04acb8 100644 --- a/jikimo_work_reporting_api/controllers/main.py +++ b/jikimo_work_reporting_api/controllers/main.py @@ -2,20 +2,22 @@ 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.decorators.api_log 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): """ 人工线下加工传输编程文件 """ 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/__manifest__.py b/sf_base/__manifest__.py index b10c2630..14c61383 100644 --- a/sf_base/__manifest__.py +++ b/sf_base/__manifest__.py @@ -25,7 +25,7 @@ 'views/menu_fixture_view.xml', 'views/change_base_view.xml', 'views/Printer.xml', - + 'views/api_log_views.xml', ], 'demo': [ ], diff --git a/sf_base/controllers/controllers.py b/sf_base/controllers/controllers.py index 47c67322..c8447d4e 100644 --- a/sf_base/controllers/controllers.py +++ b/sf_base/controllers/controllers.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import logging import json -import base64 +import logging from odoo import http from odoo.http import request +_logger = logging.getLogger(__name__) class Manufacturing_Connect(http.Controller): 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 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('响应方') diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index 8dd4a023..e98faa72 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -254,3 +254,6 @@ access_sf_machining_accuracy_admin,sf_machining_accuracy_admin,model_sf_machinin access_sf_embryo_redundancy,sf_embryo_redundancy,model_sf_embryo_redundancy,base.group_user,1,0,0,0 access_sf_embryo_redundancy_admin,sf_embryo_redundancy_admin,model_sf_embryo_redundancy,base.group_system,1,0,0,0 + +access_api_request_log_user,api.request.log.user,model_api_request_log,base.group_user,1,0,0,0 +access_api_request_log_admin,api.request.log.admin,model_api_request_log,base.group_system,1,1,1,1 \ No newline at end of file diff --git a/sf_base/views/api_log_views.xml b/sf_base/views/api_log_views.xml new file mode 100644 index 00000000..05389fc7 --- /dev/null +++ b/sf_base/views/api_log_views.xml @@ -0,0 +1,62 @@ + + + + api.request.log.tree + api.request.log + + + + + + + + + + + + + + + api.request.log.form + api.request.log + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + API请求日志 + api.request.log + tree,form + + + +
\ No newline at end of file