# 模拟状态的呈现效果 ## 1. 需求描述 ### 1.1 业务场景 系统支持模拟器和真实设备两种工作模式。当系统运行在模拟器模式下时,某些硬件操作(如曝光操作)无法真实执行,需要在UI上明确标识这种状态。 ### 1.2 具体需求 从 API `dr/api/v1/pub/software_info` 可以获取设备类型信息: - `FPD: "Simulator"` - 表示平板探测器为模拟设备 - `FPD: "Physics"` - 表示平板探测器为真实物理设备 **需求**: - 当 `FPD === "Simulator"` 时(模拟环境),`DeviceArea.tsx` 中的"曝光指示器"按钮应: 1. **可以点击**(用于模拟测试) 2. **显示"模拟"标识**(使用橙色 Badge 角标) 3. **保持状态颜色显示**(如绿色表示就绪) - 当 `FPD === "Physics"` 时(真实环境),"曝光指示器"按钮应: 1. **不可点击**(真实曝光需通过硬件触发,防止误操作) 2. **不显示"模拟"角标** 3. **保持状态颜色显示**(如绿色表示就绪) ### 1.3 用户体验目标 - 用户能够清晰识别当前是否在模拟环境下工作 - 模拟环境:允许点击按钮进行模拟测试,显示橙色"模拟"角标 - 真实环境:禁止点击按钮(硬件触发),无角标显示 - 两种环境下都保持设备状态颜色指示(绿色/黄色/红色等) --- ## 2. 技术方案对比 ### 方案 1:扩展现有的 productSlice(推荐)✅ #### 优点 - ✅ 改动最小,softwareInfo 已经在 productSlice 中获取 - ✅ 逻辑集中,所有软件配置信息在一个地方管理 - ✅ 无需新建文件和额外的初始化逻辑 #### 缺点 - ⚠️ productSlice 会包含设备相关信息,职责略微混合 #### 实现步骤 1. 修改 `src/states/productSlice.ts` - 在 ProductState 接口中添加 `fpd` 和 `gen` 字段 - 更新 `initializeProductState` thunk,将 FPD 和 GEN 信息存入 Redux 2. 修改 `src/pages/exam/DeviceArea.tsx` - 从 Redux 读取 FPD 状态 - 在 onClick 中判断环境类型:真实环境阻止执行,模拟环境允许执行 - 使用 Ant Design Badge 组件在模拟环境下显示"模拟"标识 - 不使用 disabled 属性,保持状态颜色显示 --- ### 方案 2:创建独立的 deviceInfoSlice #### 优点 - ✅ 职责分离更清晰,设备信息独立管理 - ✅ 便于未来扩展更多设备相关状态 #### 缺点 - ❌ 需要新建文件 `src/states/device/deviceInfoSlice.ts` - ❌ 需要在 store 中注册新的 reducer - ❌ 需要额外的初始化逻辑,可能重复调用 API --- ### 方案 3:在 DeviceArea 组件内部管理状态 #### 优点 - ✅ 组件自包含,不依赖全局状态 #### 缺点 - ❌ 如果其他组件也需要 FPD 状态,会导致重复请求 - ❌ 组件职责过重 - ❌ 难以测试和维护 --- ## 3. UI 展示方案对比 ### 方案 A:onClick 判断 + Badge 角标(最终采用)✅ ```tsx import { Badge } from 'antd';