# 手闸状态指示器 ## 功能概述 手闸状态指示器是 DeviceArea 组件中的核心功能之一,用于实时显示高压发生器手闸的当前状态,为操作人员提供即时的视觉反馈。 ## 需求说明 ### 功能需求 1. **实时状态显示** - 显示手闸的实时操作状态 - 显示发生器的整体工作状态 - 通过颜色变化提供直观的视觉反馈 2. **状态反馈** - 🟢 绿色:发生器待机,系统准备就绪 - 🟡 黄色:手闸按下(一档或二档),准备曝光 - ⚪ 默认色:其他状态(手闸抬起等) 3. **交互体验** - 鼠标悬停显示详细状态信息 - 通过图标按钮形式呈现 ## 技术实现 ### 组件位置 - **文件**: `src/pages/exam/DeviceArea.tsx` - **状态管理**: `src/states/exam/deviceAreaSlice.ts` ### 状态管理 使用 Redux 管理两个关键状态: #### 1. generatorStatus (手闸同步状态) 类型:`GeneratorStatus` 枚举 关键状态值: - `GENERATOR_RAD_OFF` (0): 手闸抬起 - `GENERATOR_RAD_PREPARE` (1): 手闸一档按下 - `GENERATOR_RAD_READY` (2): 手闸二档按下 - `GENERATOR_RAD_XRAYON` (3): 发生器点片出线 - `GENERATOR_RAD_XRAYOFF` (4): 发生器点片结束出线 #### 2. generatorStatus_2 (发生器整体状态) 类型:`GENERATOR_STATUS` 枚举 关键状态值: - `GENERATOR_STATUS_SHUTDOWN` (0): 关机 - `GENERATOR_STATUS_INIT` (1): 初始化 - `GENERATOR_STATUS_SLEEP` (2): 睡眠 - `GENERATOR_STATUS_CHARGING` (3): 充电 - `GENERATOR_STATUS_STANDBY` (4): 待机 - `GENERATOR_STATUS_EXP` (5): 曝光中 - `GENERATOR_STATUS_ERROR` (6): 错误 - `GENERATOR_STATUS_CALIBRATION` (7): 校准 - `GENERATOR_STATUS_SERVICE` (8): 服务 ### 状态显示逻辑 ```typescript // 颜色显示优先级(从高到低) IF generatorStatus_2 === GENERATOR_STATUS_STANDBY ➜ 显示绿色 (text-green-500) ➜ 含义:发生器处于待机状态,准备就绪 ELSE IF generatorStatus === GeneratorStatus.GENERATOR_RAD_PREPARE ➜ 显示黄色 (text-yellow-500) ➜ 含义:手闸一档按下,准备状态 ELSE IF generatorStatus === GeneratorStatus.GENERATOR_RAD_READY ➜ 显示黄色 (text-yellow-500) ➜ 含义:手闸二档按下,就绪状态 ELSE ➜ 显示默认色(无特殊样式) ➜ 含义:其他状态(如手闸抬起等) ``` ### 状态更新机制 通过 MQTT 事件驱动状态更新: ```typescript // 在 deviceAreaSlice.ts 中注册事件监听器 // 发生器待机状态 emitter.on('GENERATOR_STATUS_STANDBY', () => { store.dispatch(setGeneratorStatus_2(GENERATOR_STATUS.GENERATOR_STATUS_STANDBY)); }); // 手闸抬起 emitter.on('GENERATOR_RAD_OFF', () => { store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_OFF)); }); // 手闸一档按下 emitter.on('GENERATOR_RAD_PREPARE', () => { store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_PREPARE)); }); // 手闸二档按下 emitter.on('GENERATOR_RAD_READY', () => { store.dispatch(setGeneratorStatus(GeneratorStatus.GENERATOR_RAD_READY)); }); ``` ### 代码实现 ```tsx // DeviceArea.tsx 中的手闸状态指示器按钮