# 设备优先前缀配置说明 ## 功能概述 设备优先前缀配置允许管理员指定在空闲设备选择时的优先级规则,优先选择特定前缀的设备,实现更灵活的设备分配策略。 ## 配置项 **配置键**: `device.priority_prefixes` **配置类型**: STRING **默认值**: 空字符串(全随机) **格式**: 逗号分隔的前缀列表 ## 使用方法 ### 1. 配置优先前缀 通过系统配置接口设置 `device.priority_prefixes` 的值。 **示例配置值**: ``` xx,yy,zz ``` 这表示: - 第1优先级:`xx` 开头的设备 - 第2优先级:`yy` 开头的设备 - 第3优先级:`zz` 开头的设备 - 最低优先级:其他所有设备 ### 2. 选择逻辑 设备分配时会按照以下逻辑进行: 1. **过滤占用设备**:排除被其他任务占用的设备 2. **按前缀分组**:根据配置的前缀将设备分成不同优先级组 3. **组内随机**:每个优先级组内的设备随机打乱 4. **顺序尝试**:按优先级从高到低依次尝试分配,直到成功 **特点**: - ✅ 优先使用指定前缀的设备 - ✅ 同优先级内随机选择,避免总是选中同一台设备 - ✅ 实现负载均衡和优先级控制的平衡 - ✅ 支持冷却机制和并发安全 ### 3. 示例场景 #### 场景1:无配置(默认行为) ``` device.priority_prefixes = "" ``` **效果**:所有设备完全随机选择,与原有逻辑一致 #### 场景2:优先使用xx设备 ``` device.priority_prefixes = "xx" ``` **假设可用设备**:`xx1, xx2, yy1, yy2, zz1` **选择顺序**: 1. 优先在 `xx1, xx2` 中随机选择 2. 如果 xx 设备都在冷却期或被占用,再从 `yy1, yy2, zz1` 中随机选择 #### 场景3:多级优先级 ``` device.priority_prefixes = "xx,yy" ``` **假设可用设备**:`xx1, xx2, yy1, yy2, zz1, zz2` **选择顺序**: 1. 第1优先级:在 `xx1, xx2` 中随机选择 2. 第2优先级:如果 xx 都不可用,在 `yy1, yy2` 中随机选择 3. 第3优先级:如果 xx、yy 都不可用,在 `zz1, zz2` 中随机选择 ## API使用示例 ### 查询当前配置 ```bash GET /api/admin/config/key/device.priority_prefixes ``` ### 更新配置 ```bash PUT /api/admin/config { "configKey": "device.priority_prefixes", "configValue": "xx,yy,zz", "configType": "STRING", "description": "设备选择优先前缀(逗号分隔)" } ``` ### 批量更新(推荐) ```bash PUT /api/admin/config/batch [ { "configKey": "device.priority_prefixes", "configValue": "xx,yy" } ] ``` ## 日志输出 启用该功能后,日志中会输出相关信息: ``` [INFO] 使用设备优先前缀配置:[xx, yy] [DEBUG] 优先级0(前缀=xx):2 台设备 [DEBUG] 优先级1(前缀=yy):3 台设备 [DEBUG] 无优先级设备:5 台 [INFO] 设备列表已按优先级排序并随机化:[xx2, xx1, yy3, yy1, yy2, zz1, aa1, bb1, cc1, dd1] [INFO] 设备分配成功:设备=xx2, 任务ID=123, 原因=首次选区 ``` ## 注意事项 1. **前缀匹配**:使用 `startsWith()` 进行前缀匹配,例如配置 `xx` 会匹配 `xx1`、`xx2`、`xxabc` 等 2. **大小写敏感**:前缀匹配区分大小写 3. **空格处理**:配置值会自动去除前后空格,`"xx, yy"` 会被处理为 `["xx", "yy"]` 4. **空配置**:如果配置为空或不存在,系统会退化到原有的完全随机选择逻辑 5. **优先级顺序**:前缀在配置字符串中的顺序决定优先级,越靠前优先级越高 6. **实时生效**:配置修改后立即生效,无需重启服务 ## 数据库迁移 执行以下 SQL 脚本添加配置项: ```sql -- 位置: db_migration_device_priority_prefixes.sql INSERT INTO system_config (config_key, config_value, config_type, description, is_system, created_at, updated_at) VALUES ( 'device.priority_prefixes', '', 'STRING', '设备选择优先前缀(逗号分隔),例如:xx,yy,zz。优先选择匹配前缀的设备,同优先级内随机。为空则全随机', 1, NOW(3), NOW(3) ) ON DUPLICATE KEY UPDATE config_type = 'STRING', description = '设备选择优先前缀(逗号分隔),例如:xx,yy,zz。优先选择匹配前缀的设备,同优先级内随机。为空则全随机', updated_at = NOW(3); ``` ## 相关代码 - **配置服务**: `SystemConfigService.getDevicePriorityPrefixes()` - **分配服务**: `DeviceAllocationService.allocateDevice()` - **排序逻辑**: `DeviceAllocationService.sortByPrefixPriority()` ## 测试建议 1. **无配置测试**:不配置前缀,验证随机选择是否正常 2. **单前缀测试**:配置单个前缀,验证是否优先选择该前缀设备 3. **多前缀测试**:配置多个前缀,验证优先级顺序是否正确 4. **负载均衡测试**:多次分配,验证同优先级内是否随机分布 5. **冷却期测试**:验证高优先级设备在冷却期时,能否正确选择低优先级设备