From cdf6a36c30fb7dcc12765c45d72a5f3040792418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=B5=93?= <1440513926@qq.com> Date: Wed, 16 Jul 2025 11:49:41 +0800 Subject: [PATCH] =?UTF-8?q?Redis=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_mrs_connect/controllers/__init__.py | 3 +- .../controllers/refresh_controller.py | 10 ++ sf_mrs_connect/controllers/sync_controller.py | 2 +- sf_mrs_connect/models/__init__.py | 2 + sf_mrs_connect/models/redis_utils.py | 2 +- sf_mrs_connect/models/sync_common.py | 141 +++++++++--------- 6 files changed, 89 insertions(+), 71 deletions(-) create mode 100644 sf_mrs_connect/controllers/refresh_controller.py diff --git a/sf_mrs_connect/controllers/__init__.py b/sf_mrs_connect/controllers/__init__.py index df498650..c57cd7f7 100644 --- a/sf_mrs_connect/controllers/__init__.py +++ b/sf_mrs_connect/controllers/__init__.py @@ -1,2 +1,3 @@ from . import controllers -from . import sync_controller \ No newline at end of file +from . import sync_controller +from . import refresh_controller \ No newline at end of file diff --git a/sf_mrs_connect/controllers/refresh_controller.py b/sf_mrs_connect/controllers/refresh_controller.py new file mode 100644 index 00000000..4a7bce1a --- /dev/null +++ b/sf_mrs_connect/controllers/refresh_controller.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.http import request + +class FixtureRedisRefreshController(http.Controller): + + @http.route('/api/refresh_redis/fixture_param', type='json', auth='none', csrf=False, methods=['POST']) + def refresh_fixture_param_redis(self, **kw): + request.env['mrs.basic_parameters.mixin'].sudo().refresh_all_param_redis() + return {'status': 'success', 'msg': 'Redis 缓存已刷新'} diff --git a/sf_mrs_connect/controllers/sync_controller.py b/sf_mrs_connect/controllers/sync_controller.py index a70ae60c..4a38510c 100644 --- a/sf_mrs_connect/controllers/sync_controller.py +++ b/sf_mrs_connect/controllers/sync_controller.py @@ -19,4 +19,4 @@ class FixtureSyncController(http.Controller): return {'status':'fail','msg':'code missing'} request.env['sf.fixture.materials.basic.parameters']\ .sudo().sync_from_mrs(code) - return {'status':'success'} + return {'status':'success'} \ No newline at end of file diff --git a/sf_mrs_connect/models/__init__.py b/sf_mrs_connect/models/__init__.py index 01498b21..7038b520 100644 --- a/sf_mrs_connect/models/__init__.py +++ b/sf_mrs_connect/models/__init__.py @@ -2,3 +2,5 @@ from . import ftp_operate from . import res_config_setting from . import sync_common from . import order_price +from . import redis_utils +from . import common \ No newline at end of file diff --git a/sf_mrs_connect/models/redis_utils.py b/sf_mrs_connect/models/redis_utils.py index 24b679c2..ce57685f 100644 --- a/sf_mrs_connect/models/redis_utils.py +++ b/sf_mrs_connect/models/redis_utils.py @@ -27,4 +27,4 @@ class RedisClient: try: self.client.set(key, json.dumps(value, ensure_ascii=False), ex=ex) except Exception as e: - _logger.error(f"Redis SET error [{key}]: {e}") + _logger.error(f"Redis SET error [{key}]: {e}") \ No newline at end of file diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index 8bc52d5b..b956d075 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -5,11 +5,9 @@ import base64 import traceback import requests -from odoo import models,api,fields +from odoo import models from odoo.exceptions import ValidationError -from .redis_utils import RedisClient -from .common import Common -from odoo.addons.jikimo_sf.sf_base.commons.common import Common +from odoo.addons.sf_base.commons.common import Common _logger = logging.getLogger(__name__) @@ -1548,7 +1546,7 @@ class SyncMulti_Mounting_Type(models.Model): # raise ValidationError("夹具型号认证未通过") # # 定时同步所有夹具型号列表 -# def sync_all_fixture_model(self): +# def sync_all_fixture_model(self): # config = self.env['res.config.settings'].get_values() # headers = Common.get_headers(self, config['token'], config['sf_secret_key']) # strUrl = config['sf_url'] + self.url @@ -1612,10 +1610,6 @@ class SyncMulti_Mounting_Type(models.Model): # self._write_or_create(all_list.get('adapter_board_yesterday_list'), '转接板(锁板)夹具') # if all_list.get('scroll_chuck_all_list'): # self._write_or_create(all_list.get('scroll_chuck_yesterday_list'), '三爪卡盘') -# if all_list.get('air_tray_all_list'): -# self._write_or_create(all_list.get('air_tray_all_list'),'气吹托盘') -# if all_list.get('magnet_tray_all_list'): -# self._write_or_create(all_list.get('magnet_tray_all_list'),'磁吸托盘') # else: # raise ValidationError("夹具型号基本参数认证未通过") @@ -1640,14 +1634,10 @@ class SyncMulti_Mounting_Type(models.Model): # self._write_or_create(all_list.get('jaw_vice_all_list'), '虎钳夹具') # if all_list.get('magnet_fixture_all_list'): # self._write_or_create(all_list.get('magnet_fixture_all_list'), '磁吸夹具') -# if all_list.get('adapter_board_all_list'): +# if all_list.get('adapter_board_all_list'): # self._write_or_create(all_list.get('adapter_board_all_list'), '转接板(锁板)夹具') # if all_list.get('scroll_chuck_all_list'): # self._write_or_create(all_list.get('scroll_chuck_all_list'), '三爪卡盘') -# if all_list.get('air_tray_all_list'): -# self._write_or_create(all_list.get('air_tray_all_list'),'气吹托盘') -# if all_list.get('magnet_tray_all_list'): -# self._write_or_create(all_list.get('magnet_tray_all_list'),'磁吸托盘') # else: # raise ValidationError("夹具型号基本参数认证未通过") @@ -3247,6 +3237,56 @@ class EmbryoRedundancySync(models.Model): +class SyncfixtureMaterialsBasicParameters(models.Model): + _inherit = 'sf.fixture.materials.basic.parameters' + _description = 'Redis 优先同步夹具基本参数' + + def sync_all_fixture_materials_basic_parameters(self): + rc = RedisClient() + key = 'mrs:fixture_param_all_list' + all_list = rc.get_json(key) + + # ✅ Redis 无数据时,请求 MRS 端刷新 Redis 缓存 + if not all_list: + config = self.env['res.config.settings'].get_values() + headers = Common.get_headers(config['token'], config['sf_secret_key']) + refresh_url = config['mrs_url'] + '/api/refresh_redis/fixture_param' + + try: + res = requests.post(refresh_url, headers=headers, json={}, timeout=10) + res.raise_for_status() + except Exception as e: + raise ValidationError(f"Redis 无数据,MRS 缓存刷新失败: {str(e)}") + + # 再次尝试从 Redis 获取 + all_list = rc.get_json(key) + if not all_list: + raise ValidationError("Redis 刷新后仍无数据,无法同步夹具基本参数") + + # ✅ 同步函数作为局部函数定义在方法体内部 + def _sync_list(param_list, material_name): + for item in param_list or []: + if not item or not item.get('code'): + continue + record = self.search([('code', '=', item['code'])], limit=1) + vals = self._get_basic_parameters_list(item, material_name) + if record: + record.write(vals) + else: + self.create(vals) + + # ✅ 各类夹具参数同步调用 + _sync_list(all_list.get('zero_chuck_all_list'), '零点卡盘') + _sync_list(all_list.get('zero_tray_all_list'), '零点托盘') + _sync_list(all_list.get('pneumatic_fixture_all_list'), '气动夹具') + _sync_list(all_list.get('jaw_vice_all_list'), '虎钳夹具') + _sync_list(all_list.get('magnet_fixture_all_list'), '磁吸夹具') + _sync_list(all_list.get('adapter_board_all_list'), '转接板(锁板)夹具') + _sync_list(all_list.get('scroll_chuck_all_list'), '三爪卡盘') + _sync_list(all_list.get('air_tray_all_list'), '气吹托盘') + _sync_list(all_list.get('magnet_tray_all_list'), '磁吸托盘') + + class SyncFixtureModel(models.Model): _inherit = 'sf.fixture.model' _description = 'Redis 优先同步夹具型号' @@ -3255,9 +3295,25 @@ class SyncFixtureModel(models.Model): rc = RedisClient() key = 'mrs:fixture_model_all_list' all_list = rc.get_json(key) - if not all_list: - raise ValidationError(f"Redis 中未找到 key={key}") + # ✅ Redis 没数据时,请求 MRS 接口刷新 + if not all_list: + config = self.env['res.config.settings'].get_values() + headers = Common.get_headers(config['token'], config['sf_secret_key']) + refresh_url = config['mrs_url'] + '/api/refresh_redis/fixture_model' + + try: + res = requests.post(refresh_url, headers=headers, json={}, timeout=10) + res.raise_for_status() + except Exception as e: + raise ValidationError(f"Redis 无数据,MRS 刷新失败: {str(e)}") + + # 再次尝试获取 Redis + all_list = rc.get_json(key) + if not all_list: + raise ValidationError("刷新后仍无 Redis 数据,无法同步夹具型号") + + # ✅ 开始同步夹具型号 for item in all_list: if not item or not item.get('code'): continue @@ -3279,55 +3335,4 @@ class SyncFixtureModel(models.Model): if record: record.write(vals) else: - self.create(vals) - - -class SyncfixtureMaterialsBasicParameters(models.Model): - _inherit = 'sf.fixture.materials.basic.parameters' - _description = 'Redis 优先同步夹具基本参数' - - def sync_all_fixture_materials_basic_parameters(self): - rc = RedisClient() - key = 'mrs:fixture_param_all_list' - all_list = rc.get_json(key) - if not all_list: - raise ValidationError(f"Redis 中未找到 key={key}") - - def _sync_list(param_list, material_name): - for item in param_list or []: - if not item or not item.get('code'): - continue - record = self.search([('code', '=', item['code'])], limit=1) - vals = self._get_basic_parameters_list(item, material_name) - if record: - record.write(vals) - else: - self.create(vals) - - _sync_list(all_list.get('zero_chuck_all_list'), '零点卡盘') - _sync_list(all_list.get('zero_tray_all_list'), '零点托盘') - _sync_list(all_list.get('pneumatic_fixture_all_list'), '气动夹具') - _sync_list(all_list.get('jaw_vice_all_list'), '虎钳夹具') - _sync_list(all_list.get('magnet_fixture_all_list'), '磁吸夹具') - _sync_list(all_list.get('adapter_board_all_list'), '转接板(锁板)夹具') - _sync_list(all_list.get('scroll_chuck_all_list'), '三爪卡盘') - _sync_list(all_list.get('air_tray_all_list'), '气吹托盘') - _sync_list(all_list.get('magnet_tray_all_list'), '磁吸托盘') - - def _get_basic_parameters_list(self, item, material_name): - """ - 统一结构化 item 数据,供写入模型字段使用(你应当根据 material_name 自定义字段映射) - """ - return { - 'name': item.get('name'), - 'code': item.get('code'), - 'length': item.get('length'), - 'width': item.get('width'), - 'height': item.get('height'), - 'diameter': item.get('diameter'), - 'weight': item.get('weight'), - 'fixture_model_id': self.env['sf.fixture.model'].search([('code', '=', item.get('fixture_model_code'))], limit=1).id, - 'materials_model_id': self.env['sf.materials.model'].search([('code', '=', item.get('material_code'))], limit=1).id, - 'active': item.get('active', True), - # 你可以根据 material_name 判断类型并补充字段 - } \ No newline at end of file + self.create(vals) \ No newline at end of file