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>
3.7 KiB
3.7 KiB
1. 前置确认
- 1.1 确认提案一(asset-identifier-standardization)已完成:
tb_order.asset_identifier字段存在,B 端资产路由已统一为:identifier
2. 数据层:ExchangeOrder Store 扩展
- 2.1 在
internal/store/postgres/exchange_order_store.go新增FindByNewAssetID(ctx, assetType, assetID) (*model.ExchangeOrder, error)方法:查询WHERE new_asset_id = ? AND new_asset_type = ?,返回该资产的换货来源记录(找不到则返回 nil,表示无前代)
3. DTO 层:新增响应结构
- 3.1 在
internal/model/dto/asset_dto.go新增以下结构体:AssetOrdersRequest:路径参数identifier,query 参数page、page_size、include_previousAssetOrderItem:单条订单项(order_no、order_type、payment_status、payment_status_text、total_amount、payment_method、paid_at、generation、items、created_at)GenerationOrders:单代订单块(generation、identifier、asset_type、total、page、page_size、items)PreviousGenerationOrders:前代订单块(generation、identifier、asset_type、exchange_no、exchanged_at、total、items)AssetOrdersResponse:完整响应(current_generation、previous_generations、truncated)
4. 服务层:GetOrders 方法
- 4.1 在
internal/service/asset/service.go新增GetOrders(ctx, identifier, page, pageSize, includePrevious bool) (*dto.AssetOrdersResponse, error)方法:- 调用
Resolve()得到 asset_type 和 asset_id - 查询本代订单:
orderStore.ListByAssetIdentifier(ctx, identifier, page, pageSize) - 若
includePrevious=true:循环调用exchangeOrderStore.FindByNewAssetID()追溯换货链(最多 10 代);每代查询前代old_asset_identifier对应的订单(最多 20 条,无分页) - 组装
AssetOrdersResponse返回
- 调用
- 4.2 在
internal/store/postgres/order_store.go新增ListByAssetIdentifier(ctx, identifier, page, pageSize) ([]*model.Order, int64, error)方法:查询WHERE asset_identifier = ?,分页,倒序
5. Handler 层:新增 Orders Handler
- 5.1 在
internal/handler/admin/asset.go新增Orders(c *fiber.Ctx) errorhandler:- 从路径参数读取
identifier;从 query 读取page、page_size、include_previous - 调用
assetService.GetOrders() - 返回
response.Success(c, result) - 注释:
// Orders 查询资产历史订单(支持跨代追溯)+// GET /api/admin/assets/:identifier/orders
- 从路径参数读取
6. 路由层:注册新路由
- 6.1 在
internal/routes/asset.go注册:assets.Get("/:identifier/orders", h.Asset.Orders)(注意路由顺序,避免与/resolve/:identifier冲突)
7. 文档生成器更新
- 7.1 在
cmd/api/docs.go和cmd/gendocs/main.go的handlers结构体中确认AssetHandler已包含新的Orders方法(检查是否需要更新 handler 注册) - 7.2 执行
go run cmd/gendocs/main.go重新生成 OpenAPI 文档,验证新接口体现
8. 验证
- 8.1 构建验证:
go build ./...无编译错误 - 8.2 LSP 诊断:对所有修改文件运行 lsp_diagnostics,无错误/警告
- 8.3 接口验证(使用 PostgreSQL MCP + curl):
- 查询有订单的资产:
GET /api/admin/assets/:identifier/orders返回正确订单列表,含 generation 字段 - 查询无订单资产:返回
items: [], total: 0 - 查询不存在的 identifier:返回 404
- 查询换货资产(带 include_previous=true):
previous_generations包含前代订单,附带 exchange_no 和 exchanged_at - 查询无前代的资产(带 include_previous=true):
previous_generations为空数组 - 代理查询无权限资产:返回 403
- 查询有订单的资产: