@@ -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 判断类型并补充字段
}
self . create ( vals )