From f4829f57a120766787313cbfa22419b442d707c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=B5=93?= <1440513926@qq.com> Date: Thu, 17 Jul 2025 11:08:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/refresh_controller.py | 10 -- sf_mrs_connect/controllers/sync_controller.py | 22 ---- sf_mrs_connect/models/common.py | 14 --- sf_mrs_connect/models/redis_utils.py | 30 ----- sf_mrs_connect/models/sync_common.py | 114 +++++++++++++++--- 5 files changed, 94 insertions(+), 96 deletions(-) delete mode 100644 sf_mrs_connect/controllers/refresh_controller.py delete mode 100644 sf_mrs_connect/controllers/sync_controller.py delete mode 100644 sf_mrs_connect/models/common.py delete mode 100644 sf_mrs_connect/models/redis_utils.py diff --git a/sf_mrs_connect/controllers/refresh_controller.py b/sf_mrs_connect/controllers/refresh_controller.py deleted file mode 100644 index 4a7bce1a..00000000 --- a/sf_mrs_connect/controllers/refresh_controller.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- 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 deleted file mode 100644 index 4a38510c..00000000 --- a/sf_mrs_connect/controllers/sync_controller.py +++ /dev/null @@ -1,22 +0,0 @@ -# study/jikimo_sf/sf_mrs_connect/controllers/sync_controller.py -from odoo import http -from odoo.http import request - -class FixtureSyncController(http.Controller): - - @http.route('/api/fixture_model/sync_from_mrs', type='json', auth='none', csrf=False) - def sync_model(self, **kw): - code = kw.get('code') - if not code: - return {'status':'fail','msg':'code missing'} - request.env['sf.fixture.model'].sudo().sync_from_mrs(code) - return {'status':'success'} - - @http.route('/api/fixture_param/sync_from_mrs', type='json', auth='none', csrf=False) - def sync_param(self, **kw): - code = kw.get('code') - if not code: - return {'status':'fail','msg':'code missing'} - request.env['sf.fixture.materials.basic.parameters']\ - .sudo().sync_from_mrs(code) - return {'status':'success'} \ No newline at end of file diff --git a/sf_mrs_connect/models/common.py b/sf_mrs_connect/models/common.py deleted file mode 100644 index 320f6cac..00000000 --- a/sf_mrs_connect/models/common.py +++ /dev/null @@ -1,14 +0,0 @@ -# study/jikimo_sf/sf_mrs_connect/models/common.py -import time, hashlib - -class Common: - @staticmethod - def get_headers(token, secret_key): - ts = str(int(time.time())) - sign = hashlib.sha256(f"{token}{secret_key}{ts}".encode()).hexdigest() - return { - "token": token, - "sign": sign, - "timestamp": ts, - "Content-Type": "application/json", - } diff --git a/sf_mrs_connect/models/redis_utils.py b/sf_mrs_connect/models/redis_utils.py deleted file mode 100644 index ce57685f..00000000 --- a/sf_mrs_connect/models/redis_utils.py +++ /dev/null @@ -1,30 +0,0 @@ -# study/jikimo_sf/sf_mrs_connect/models/redis_utils.py -import redis, json, logging - -_logger = logging.getLogger(__name__) - -class RedisClient: - def __init__(self, host='localhost', port=6379, db=0): - try: - self.client = redis.Redis(host=host, port=port, db=db, decode_responses=True) - except Exception as e: - _logger.error(f"Redis init error: {e}") - self.client = None - - def get_json(self, key): - if not self.client: - return None - try: - data = self.client.get(key) - return json.loads(data) if data else None - except Exception as e: - _logger.error(f"Redis GET error [{key}]: {e}") - return None - - def set_json(self, key, value, ex=3600): - if not self.client: - return - 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}") \ 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 b956d075..d2b314de 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -8,6 +8,9 @@ import requests from odoo import models from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common +from odoo.addons.sf_mrs_connect.models.common import Common + + _logger = logging.getLogger(__name__) @@ -3242,28 +3245,22 @@ class SyncfixtureMaterialsBasicParameters(models.Model): _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'): @@ -3274,8 +3271,6 @@ class SyncfixtureMaterialsBasicParameters(models.Model): 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'), '气动夹具') @@ -3286,6 +3281,52 @@ class SyncfixtureMaterialsBasicParameters(models.Model): _sync_list(all_list.get('air_tray_all_list'), '气吹托盘') _sync_list(all_list.get('magnet_tray_all_list'), '磁吸托盘') + def sync_from_mrs(self, code): + rc = RedisClient() + key = 'mrs:fixture_param_all_list' + all_list = rc.get_json(key) or {} + if not all_list: + # Redis没数据,刷新一次 + 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)}") + all_list = rc.get_json(key) or {} + if not all_list: + raise ValidationError("刷新后仍无 Redis 数据,无法同步夹具基本参数") + + # 遍历所有分类列表查找code匹配项 + for material_name, param_list in all_list.items(): + for item in param_list or []: + if item.get('code') == code: + vals = self._get_basic_parameters_list(item, material_name) + record = self.search([('code', '=', code)], limit=1) + if record: + record.write(vals) + else: + self.create(vals) + return True + return False + + def _get_basic_parameters_list(self, item, material_name): + # 请根据实际字段完善,这里给个示范 + return { + 'code': item.get('code'), + 'length': item.get('length'), + 'width': item.get('width'), + 'height': item.get('height'), + 'chucking_power_max': item.get('chucking_power_max'), + 'type_of_drive': item.get('type_of_drive'), + 'locking_method': item.get('locking_method'), + 'max_adsorp_force': item.get('max_adsorp_force'), + # 你可以加上 material_name 做记录或其它业务字段 + # 'material_name': material_name, + } + class SyncFixtureModel(models.Model): _inherit = 'sf.fixture.model' @@ -3295,39 +3336,32 @@ class SyncFixtureModel(models.Model): rc = RedisClient() key = 'mrs:fixture_model_all_list' all_list = rc.get_json(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 - record = self.search([('code', '=', item['code'])], limit=1) vals = { 'name': item['name'], 'code': item['code'], 'fixture_material_id': self.env['sf.fixture.material'] - .search([('code', '=', item['fixture_material_code'])], limit=1).id, + .search([('code', '=', item.get('fixture_material_code'))], limit=1).id or False, 'multi_mounting_type_id': self.env['sf.multi_mounting.type'] - .search([('code', '=', item['multi_mounting_type_code'])], limit=1).id, + .search([('code', '=', item.get('multi_mounting_type_code'))], limit=1).id or False, 'brand_id': self.env['sf.machine.brand'] - .search([('code', '=', item['brand_code'])], limit=1).id, + .search([('code', '=', item.get('brand_code'))], limit=1).id or False, 'model_file': base64.b64decode(item['model_file']) if item.get('model_file') else False, 'status': item['status'], 'active': item['active'], @@ -3335,4 +3369,44 @@ class SyncFixtureModel(models.Model): if record: record.write(vals) else: - self.create(vals) \ No newline at end of file + self.create(vals) + + def sync_from_mrs(self, code): + rc = RedisClient() + key = 'mrs:fixture_model_all_list' + all_list = rc.get_json(key) or [] + 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)}") + all_list = rc.get_json(key) or [] + if not all_list: + raise ValidationError("刷新后仍无 Redis 数据,无法同步夹具型号") + + for item in all_list: + if item.get('code') == code: + record = self.search([('code', '=', code)], limit=1) + vals = { + 'name': item['name'], + 'code': item['code'], + 'fixture_material_id': self.env['sf.fixture.material'] + .search([('code', '=', item.get('fixture_material_code'))], limit=1).id or False, + 'multi_mounting_type_id': self.env['sf.multi_mounting.type'] + .search([('code', '=', item.get('multi_mounting_type_code'))], limit=1).id or False, + 'brand_id': self.env['sf.machine.brand'] + .search([('code', '=', item.get('brand_code'))], limit=1).id or False, + 'model_file': base64.b64decode(item['model_file']) if item.get('model_file') else False, + 'status': item['status'], + 'active': item['active'], + } + if record: + record.write(vals) + else: + self.create(vals) + return True + return False