feat: 资产标识符标准化、资产历史订单查询及导入虚拟号强制验证
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m21s

主要变更:
- 新增 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>
This commit is contained in:
2026-04-07 17:39:36 +08:00
parent 7e489a19fb
commit 80c6f6c756
69 changed files with 3039 additions and 851 deletions

View File

@@ -49,16 +49,18 @@ func registerIotCardRoutes(router fiber.Router, handler *admin.IotCardHandler, i
### Excel 文件格式
- 文件格式:仅支持 .xlsx (Excel 2007+)
- 必填列` + "`ICCID`" + `, ` + "`MSISDN`" + `
- 可选列:` + "`virtual_no`" + `虚拟号表头关键字virtual_no / VirtualNo / 虚拟号 / 设备号)
- 必填列(表头关键字):
- ` + "`ICCID`" + `或:卡号 / 号
- ` + "`MSISDN`" + `(或:接入号 / 手机号 / 电话)
- ` + "`virtual_no`" + `VirtualNo / 虚拟号 / 设备号)—— **必填,缺少此列将导致整批导入失败**
- 首行为表头(可选,但建议包含)
- 列格式:设置为文本格式(避免长数字被转为科学记数法)
#### virtual_no 导入规则(只补空白)
#### virtual_no 导入规则
- 该行 virtual_no 非空 + 数据库当前值为 NULL填入新值
- 该行 virtual_no 非空 + 数据库已有值:跳过(不覆盖
- 批次内有任意 virtual_no 与数据库现存值重复:**整批拒绝**`,
- ` + "`virtual_no`" + ` 为必填字段,**不可为空**;为空的行记为失败并报告原因
- Excel 缺少 ` + "`virtual_no`" + ` 列时,整批导入直接失败(返回"Excel 文件缺少 virtual_no 列,请使用最新模板"
- ` + "`virtual_no`" + ` 与系统已有值重复时,该行记为失败`,
Tags: []string{"IoT卡管理"},
Input: new(dto.ImportIotCardRequest),
Output: new(dto.ImportIotCardResponse),