# -*- 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 _logger = logging.getLogger(__name__) class Manufacturing_Connect(http.Controller): @http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, cors="*") def get_maintenance_tool_groups_Info(self, **kw): """ 机床刀具组接口 :param kw: :return: """ logging.info('get_maintenance_tool_groups_Info:%s' % kw) try: datas = request.httprequest.data ret = json.loads(datas) # ret = json.loads(ret['result']) logging.info('DeviceId:%s' % ret) tool_groups = request.env['sf.tool.groups'].sudo().search([]) res = {'Succeed': True, 'Datas': []} if tool_groups: for item in tool_groups: device_id = '' for equipment_id in item.equipment_ids: device_id = '%s,%s' % (device_id, equipment_id.name) res['Datas'].append({ 'GroupName': item.name, 'DeviceId': device_id }) except Exception as e: res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('get_maintenance_tool_groups_Info error:%s' % e) return json.JSONEncoder().encode(res) class MultiInheritController(): _sub_classes = [] def __init_subclass__(cls): """ 多继承,解决多个字类时方法调用super的问题 """ super().__init_subclass__() if len(cls._sub_classes) > 0 and cls not in cls._sub_classes: 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