feat(B11): AI 指令码从产品物模型派生, 消除第三套指令码档案
重构前: ai_device_profile 的指令码全靠品类猜(默认 switch_1/switch_led/control),
与 product_property 物模型、涂鸦 SDK schema 是三套独立来源, 必然漂移 ——
多开关位/带背光设备会拿到错误指令码。
重构后决策优先级:
1. 人工覆盖(source=manual) —— 用户显式指定, 最高优先
2. 产品物模型派生 —— semantic 标注的权威来源(后端 SpecSemanticResolver 落库)
3. 已存在的档案(探测写入/类型默认) —— 兼容历史数据
4. 品类推断兜底 —— 物模型缺失时
新增 ProductSpecMapper(只读投影): 查询产品物模型功能点(code/name/type/semantic/grp/access/dp_id)
fromProductSpec 映射:
- power -> powerCode (多开关位取 is_primary 通道)
- switch -> powerCode 兜底 (物模型未标 power 时取首个可写开关通道)
- brightness -> brightnessCode
- color_temp -> colorTempCode
- mode -> modeCode
- temperature -> temperatureCode
派生结果同时写回 product_id(产品级共享), 不再逐设备重复存储
验证: mvn -pl iot-common,iot-device,iot-rule -am compile BUILD SUCCESS