重构: 将卡/设备的套餐系列绑定从分配ID改为系列ID

- 数据库: 重命名 series_allocation_id → series_id
- Model: IotCard 和 Device 字段重命名
- DTO: 所有请求/响应字段统一为 series_id
- Store: 方法重命名,新增 GetByShopAndSeries 查询
- Service: 业务逻辑优化,系列验证和权限验证分离
- 测试: 更新所有测试用例,新增 shop_series_allocation_store_test.go
- 文档: 更新 API 文档说明参数变更

BREAKING CHANGE: API 参数从 series_allocation_id 改为 series_id
This commit is contained in:
2026-02-02 12:09:53 +08:00
parent a30b3036bb
commit 37f43d2e2d
27 changed files with 673 additions and 301 deletions

View File

@@ -51,23 +51,11 @@ func (s *Service) ValidateCardPurchase(ctx context.Context, cardID uint, package
return nil, err
}
if card.SeriesAllocationID == nil || *card.SeriesAllocationID == 0 {
if card.SeriesID == nil || *card.SeriesID == 0 {
return nil, errors.New(errors.CodeInvalidParam, "该卡未关联套餐系列,无法购买套餐")
}
allocation, err := s.seriesAllocationStore.GetByID(ctx, *card.SeriesAllocationID)
if err != nil {
if err == gorm.ErrRecordNotFound {
return nil, errors.New(errors.CodeInvalidParam, "套餐系列分配不存在")
}
return nil, err
}
if allocation.Status != constants.StatusEnabled {
return nil, errors.New(errors.CodeInvalidParam, "套餐系列分配已禁用")
}
packages, totalPrice, err := s.validatePackages(ctx, packageIDs, allocation.SeriesID)
packages, totalPrice, err := s.validatePackages(ctx, packageIDs, *card.SeriesID)
if err != nil {
return nil, err
}
@@ -76,7 +64,6 @@ func (s *Service) ValidateCardPurchase(ctx context.Context, cardID uint, package
Card: card,
Packages: packages,
TotalPrice: totalPrice,
Allocation: allocation,
}, nil
}
@@ -89,23 +76,11 @@ func (s *Service) ValidateDevicePurchase(ctx context.Context, deviceID uint, pac
return nil, err
}
if device.SeriesAllocationID == nil || *device.SeriesAllocationID == 0 {
if device.SeriesID == nil || *device.SeriesID == 0 {
return nil, errors.New(errors.CodeInvalidParam, "该设备未关联套餐系列,无法购买套餐")
}
allocation, err := s.seriesAllocationStore.GetByID(ctx, *device.SeriesAllocationID)
if err != nil {
if err == gorm.ErrRecordNotFound {
return nil, errors.New(errors.CodeInvalidParam, "套餐系列分配不存在")
}
return nil, err
}
if allocation.Status != constants.StatusEnabled {
return nil, errors.New(errors.CodeInvalidParam, "套餐系列分配已禁用")
}
packages, totalPrice, err := s.validatePackages(ctx, packageIDs, allocation.SeriesID)
packages, totalPrice, err := s.validatePackages(ctx, packageIDs, *device.SeriesID)
if err != nil {
return nil, err
}
@@ -114,7 +89,6 @@ func (s *Service) ValidateDevicePurchase(ctx context.Context, deviceID uint, pac
Device: device,
Packages: packages,
TotalPrice: totalPrice,
Allocation: allocation,
}, nil
}