feat: 资产标识符标准化、资产历史订单查询及导入虚拟号强制验证
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m21s
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:
@@ -31,6 +31,7 @@ type Service struct {
|
||||
shopSeriesAllocationStore *postgres.ShopSeriesAllocationStore
|
||||
packageSeriesStore *postgres.PackageSeriesStore
|
||||
gatewayClient *gateway.Client
|
||||
assetIdentifierStore *postgres.AssetIdentifierStore
|
||||
}
|
||||
|
||||
func New(
|
||||
@@ -45,6 +46,7 @@ func New(
|
||||
shopSeriesAllocationStore *postgres.ShopSeriesAllocationStore,
|
||||
packageSeriesStore *postgres.PackageSeriesStore,
|
||||
gatewayClient *gateway.Client,
|
||||
assetIdentifierStore *postgres.AssetIdentifierStore,
|
||||
) *Service {
|
||||
return &Service{
|
||||
db: db,
|
||||
@@ -58,6 +60,7 @@ func New(
|
||||
shopSeriesAllocationStore: shopSeriesAllocationStore,
|
||||
packageSeriesStore: packageSeriesStore,
|
||||
gatewayClient: gatewayClient,
|
||||
assetIdentifierStore: assetIdentifierStore,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +225,32 @@ func (s *Service) Delete(ctx context.Context, id uint) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.deviceStore.Delete(ctx, id)
|
||||
if err := s.deviceStore.Delete(ctx, id); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if s.assetIdentifierStore != nil {
|
||||
_ = s.assetIdentifierStore.DeleteByAsset(ctx, model.AssetTypeDevice, id)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetByVirtualNo 通过虚拟号获取设备
|
||||
func (s *Service) GetByVirtualNo(ctx context.Context, virtualNo string) (*model.Device, error) {
|
||||
return s.deviceStore.GetByIdentifier(ctx, virtualNo)
|
||||
}
|
||||
|
||||
// GetCardByICCID 通过 ICCID 获取 IoT 卡
|
||||
func (s *Service) GetCardByICCID(ctx context.Context, iccid string) (*model.IotCard, error) {
|
||||
cards, err := s.iotCardStore.GetByICCIDs(ctx, []string{iccid})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询卡失败")
|
||||
}
|
||||
if len(cards) == 0 {
|
||||
return nil, errors.New(errors.CodeNotFound, "卡不存在")
|
||||
}
|
||||
return cards[0], nil
|
||||
}
|
||||
|
||||
// AllocateDevices 批量分配设备
|
||||
|
||||
Reference in New Issue
Block a user