Files
junhong_cmp_fiber/openspec/changes/archive/2026-04-07-import-mandatory-virtual-no/proposal.md
huang 80c6f6c756
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m21s
feat: 资产标识符标准化、资产历史订单查询及导入虚拟号强制验证
主要变更:
- 新增 AssetIdentifier 模型及 Store,统一管理资产标识符(ICCID/IMEI/SN 等)
- 新增迁移:asset_identifier 表、order 表新增 asset_identifier 字段、iot_card.virtual_no NOT NULL 约束
- 资产 Handler/Service/Route 全面重构,支持标识符路由查询与解析
- 新增资产历史订单查询接口,支持跨设备/卡/钱包维度的订单聚合
- 设备与物联卡导入任务强制校验虚拟号,缺失时直接拒绝
- Excel 工具函数优化,前端导入指引文档同步更新
- 归档三个 OpenSpec 提案:asset-identifier-standardization、asset-historical-orders、import-mandatory-virtual-no
- 更新 OpenAPI 文档及相关 DTO

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-07 17:39:36 +08:00

2.2 KiB
Raw Blame History

Why

虚拟号VirtualNo是系统中资产的核心业务标识符也是提案一确立的接口参数规范的基础。然而当前导入流程将其作为可选字段IoT 卡导入时 VirtualNo 可为空(数据库层 nullable设备导入时 VirtualNo 为空的行会被静默跳过而非报错。这导致可能存在没有虚拟号的资产进入系统,无法通过统一标识符接口操作,与资产标识符规范化目标冲突。

What Changes

  • [BREAKING] IoT 卡导入VirtualNo 改为必填Excel 中 VirtualNo 列为空的行报错拒绝
  • [BREAKING] 设备导入VirtualNo 为空的行从原有的"静默跳过"改为"记录为失败行"并报告原因
  • [NEW] 数据库迁移:tb_iot_card.virtual_no 添加 NOT NULL 约束和去除条件唯一索引改为无条件唯一索引(配合清库执行)
  • 更新 Excel 导入错误提示,明确 VirtualNo 为必填项
  • 更新接口文档,标注 VirtualNo 为必填列

Capabilities

New Capabilities

(无新能力——本提案为约束强化,不新增业务功能)

Modified Capabilities

  • iot-card-import-taskVirtualNo 校验规则从"可选"改为"必填",空值触发失败行记录
  • device-importVirtualNo 校验规则从"跳过空值行"改为"空值行计入失败并报告原因"

Impact

受影响的代码

  • pkg/utils/excel.goparseCardRows() 和设备行解析逻辑,增加 VirtualNo 空值校验
  • internal/task/iot_card_import.go:移除"空 VirtualNo 跳过"逻辑,改为记录失败行
  • internal/task/device_import.go:将"空 VirtualNo 跳过"改为"记录失败行"
  • internal/model/iot_card.goVirtualNo 字段 GORM tag 更新,去掉 nullable更新注释
  • migrations/:新增迁移文件,为 tb_iot_card.virtual_no 加 NOT NULL 约束

前置条件

  • 测试数据库中现有 virtual_no IS NULL 的 IoT 卡记录需先清除(测试阶段直接清库)
  • 设备的 virtual_no 在数据库层已经是 NOT NULL无需迁移仅修改导入行为

破坏性影响

  • 现有 IoT 卡导入 Excel 模板如果没有 VirtualNo 列,导入将全部失败;需通知使用方更新模板