## MODIFIED Requirements

### Requirement: 设备批量导入

系统 SHALL 支持通过 Excel 文件批量导入设备。**[BREAKING]** `virtual_no` 为空的行行为变更：原行为为"静默跳过（skip）"，改为"记录为失败行（fail）并报告原因"。

**失败原因文本（新增）**：
- VirtualNo 为空：`"设备虚拟号(virtual_no)不能为空"`

#### Scenario: 正常导入（VirtualNo 有值）
- **WHEN** Excel 中某行 virtual_no="DEV-001"，其他字段合法
- **THEN** 导入成功，设备记录写入数据库

#### Scenario: VirtualNo 为空的行记录为失败（原为跳过）
- **WHEN** Excel 中某行 virtual_no 列为空或未填写
- **THEN** 该行计入失败（`fail_count++`），失败原因为"设备虚拟号(virtual_no)不能为空"
- **THEN** 该行不再计入 `skip_count`
- **THEN** 其他合法行继续导入，不因此行中断

#### Scenario: 导入任务结果报告包含 VirtualNo 失败原因
- **WHEN** 导入任务处理完毕，含有 VirtualNo 为空的行
- **THEN** 失败明细列表中，该行的 `reason` 字段为"设备虚拟号(virtual_no)不能为空"，`line` 字段为对应行号
