""" 机型配置定义 与 daping_rec_online_api 项目保持一致的机型和模板映射规则 """ from typing import Dict, List, Optional from pydantic import BaseModel class ZoneConfig(BaseModel): """区域配置(洗涤筒/干衣筒)""" zone_id: str zone_name: str device_type: str # wash/dry class TemplateMapping(BaseModel): """模板映射配置""" template_type: str # common/time_popular/time_custom 等 redis_key_pattern: str # Redis key 格式 description: str class MachineModel(BaseModel): """机型配置""" model_id: str # 机型标识符,如 x11, hplus model_name: str # 显示名称 type_id: str # Redis 中的 type_id zones: List[ZoneConfig] # 区域配置 template_mappings: List[TemplateMapping] # 模板映射 support_multi_card: bool = False # 是否支持多卡 recommend_types: List[str] = ["1", "2"] # 推荐类型:1=人气, 2=定制 @property def zone_ids(self) -> List[str]: return [z.zone_id for z in self.zones] # 机型配置注册表 MACHINE_MODELS: Dict[str, MachineModel] = { "x11": MachineModel( model_id="x11", model_name="X11", type_id="201c51890c31c308050100218008390000000000000000000000000000000040", zones=[ ZoneConfig(zone_id="2", zone_name="洗衣机", device_type="wash"), ZoneConfig(zone_id="3", zone_name="洗衣机(AI快净)", device_type="wash"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:wash:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom", description="定制模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental", description="环保模板" ), TemplateMapping( template_type="time_weather", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_weather", description="天气模板" ), TemplateMapping( template_type="time_health", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health", description="健康模板" ), ] ), "x11_dry": MachineModel( model_id="x11_dry", model_name="X11 干衣机", type_id="201c51890c31c308310100218003484748000000000000000000000000000040", zones=[ ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:dry:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom", description="定制模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental", description="环保模板" ), ] ), "hplus": MachineModel( model_id="hplus", model_name="Hplus", type_id="201c51890c31c308050400218003484843000001000000000000000000000040", zones=[ ZoneConfig(zone_id="3", zone_name="洗衣机", device_type="wash"), ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:wash:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom", description="定制模板" ), ] ), "ultra": MachineModel( model_id="ultra", model_name="Ultra", type_id="201c51890c31c308050100218008054150000000000000000000000000000040", zones=[ ZoneConfig(zone_id="1", zone_name="洗衣机下", device_type="wash"), ZoneConfig(zone_id="3", zone_name="洗衣机下(双)", device_type="wash"), ZoneConfig(zone_id="41", zone_name="洗衣机左", device_type="wash"), ZoneConfig(zone_id="43", zone_name="洗衣机左(双)", device_type="wash"), ZoneConfig(zone_id="61", zone_name="洗衣机右", device_type="wash"), ZoneConfig(zone_id="63", zone_name="洗衣机右(双)", device_type="wash"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:wash:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom", description="定制模板" ), TemplateMapping( template_type="time_weather", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_weather", description="天气模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental", description="环保模板" ), TemplateMapping( template_type="time_health", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health", description="健康模板" ), TemplateMapping( template_type="time_health_2", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health_2", description="健康2-杀菌模板" ), ] ), "f2_multi": MachineModel( model_id="f2_multi", model_name="F2 Multi", type_id="201c51890c31c30805040021800", zones=[ ZoneConfig(zone_id="1", zone_name="洗衣机", device_type="wash"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:multi_card:wash:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_custom", description="定制模板" ), TemplateMapping( template_type="time_weather", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_weather", description="天气模板" ), TemplateMapping( template_type="time_season_storage", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_season_storage", description="季节收纳模板" ), TemplateMapping( template_type="time_season_in", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_season_in", description="季节上新模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_environmental", description="环保模板" ), TemplateMapping( template_type="time_health", redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_health", description="健康模板" ), ], support_multi_card=True ), "seeker": MachineModel( model_id="seeker", model_name="Seeker", type_id="201c51890c31c308050100218008054251410000000000000000000000000040", zones=[ ZoneConfig(zone_id="2", zone_name="洗衣机(下)", device_type="wash"), ZoneConfig(zone_id="3", zone_name="洗衣机(左)", device_type="wash"), ZoneConfig(zone_id="4", zone_name="洗衣机(右)", device_type="wash"), ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:wash:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom", description="定制模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental", description="环保模板" ), ] ), "seeker_dry": MachineModel( model_id="seeker_dry", model_name="Seeker 干衣机", type_id="201c51890c31c308310100218008054251410003000000000000000000000040", zones=[ ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:dry:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom", description="定制模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental", description="环保模板" ), ] ), "x11_ultra": MachineModel( model_id="x11_ultra", model_name="X11 Ultra", type_id="201c51890c31c308050400218003484446000000000000000000000000000040", zones=[ ZoneConfig(zone_id="24", zone_name="干衣机", device_type="dry"), ZoneConfig(zone_id="7", zone_name="干衣机(双)", device_type="dry"), ZoneConfig(zone_id="1", zone_name="干衣机(单)", device_type="dry"), ], template_mappings=[ TemplateMapping( template_type="common", redis_key_pattern="broadcast-template-jinja:single_card:dry:common", description="通用模板" ), TemplateMapping( template_type="time_popular", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular", description="人气模板" ), TemplateMapping( template_type="time_custom", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom", description="定制模板" ), TemplateMapping( template_type="time_season", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season", description="季节模板" ), TemplateMapping( template_type="time_care", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care", description="关怀模板" ), TemplateMapping( template_type="time_environmental", redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental", description="环保模板" ), ] ), } def get_machine_model(model_id: str) -> Optional[MachineModel]: """获取机型配置""" return MACHINE_MODELS.get(model_id) def list_machine_models() -> List[MachineModel]: """获取所有机型配置""" return list(MACHINE_MODELS.values()) def get_template_types_for_model(model_id: str, device_type: str = None) -> List[str]: """获取机型支持的模板类型""" model = get_machine_model(model_id) if not model: return [] mappings = model.template_mappings if device_type: # 过滤设备类型 mappings = [m for m in mappings if device_type in m.redis_key_pattern] return [m.template_type for m in mappings]