All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
**变更说明**: - 删除所有 *_test.go 文件(单元测试、集成测试、验收测试、流程测试) - 删除整个 tests/ 目录 - 更新 CLAUDE.md:用"测试禁令"章节替换所有测试要求 - 删除测试生成 Skill (openspec-generate-acceptance-tests) - 删除测试生成命令 (opsx:gen-tests) - 更新 tasks.md:删除所有测试相关任务 **新规范**: - ❌ 禁止编写任何形式的自动化测试 - ❌ 禁止创建 *_test.go 文件 - ❌ 禁止在任务中包含测试相关工作 - ✅ 仅当用户明确要求时才编写测试 **原因**: 业务系统的正确性通过人工验证和生产环境监控保证,测试代码维护成本高于价值。 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
94 lines
3.2 KiB
Go
94 lines
3.2 KiB
Go
package h5
|
|
|
|
import (
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/break/junhong_cmp_fiber/internal/model"
|
|
packageService "github.com/break/junhong_cmp_fiber/internal/service/package"
|
|
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
"github.com/break/junhong_cmp_fiber/pkg/middleware"
|
|
"github.com/break/junhong_cmp_fiber/pkg/response"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// PackageUsageHandler H5 端套餐使用情况 Handler
|
|
type PackageUsageHandler struct {
|
|
db *gorm.DB
|
|
customerViewService *packageService.CustomerViewService
|
|
}
|
|
|
|
// NewPackageUsageHandler 创建 H5 端套餐使用情况 Handler
|
|
func NewPackageUsageHandler(db *gorm.DB, customerViewService *packageService.CustomerViewService) *PackageUsageHandler {
|
|
return &PackageUsageHandler{
|
|
db: db,
|
|
customerViewService: customerViewService,
|
|
}
|
|
}
|
|
|
|
// GetMyUsage 任务 15.2-15.5: 获取我的套餐使用情况
|
|
// GET /api/h5/packages/my-usage
|
|
func (h *PackageUsageHandler) GetMyUsage(c *fiber.Ctx) error {
|
|
ctx := c.UserContext()
|
|
|
|
// 任务 15.3: 从 JWT 上下文中提取用户信息
|
|
userType := middleware.GetUserTypeFromContext(ctx)
|
|
|
|
var carrierType string
|
|
var carrierID uint
|
|
|
|
// 根据用户类型获取载体信息
|
|
switch userType {
|
|
case constants.UserTypePersonalCustomer:
|
|
// 个人客户:查询其订单关联的 IoT 卡或设备
|
|
customerID := middleware.GetCustomerIDFromContext(ctx)
|
|
if customerID == 0 {
|
|
return errors.New(errors.CodeInvalidParam, "未找到客户信息")
|
|
}
|
|
|
|
// 查询该客户的套餐使用记录,获取载体信息
|
|
var usage model.PackageUsage
|
|
err := h.db.WithContext(ctx).
|
|
Joins("JOIN tb_order ON tb_order.id = tb_package_usage.order_id").
|
|
Where("tb_order.buyer_type = ? AND tb_order.buyer_id = ?", model.BuyerTypePersonal, customerID).
|
|
Where("tb_package_usage.status IN ?", []int{constants.PackageUsageStatusActive, constants.PackageUsageStatusDepleted}).
|
|
Order("tb_package_usage.activated_at DESC").
|
|
First(&usage).Error
|
|
|
|
if err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
return errors.New(errors.CodeNotFound, "未找到套餐使用记录")
|
|
}
|
|
return errors.Wrap(errors.CodeDatabaseError, err, "查询套餐使用记录失败")
|
|
}
|
|
|
|
// 确定载体类型和 ID
|
|
if usage.IotCardID > 0 {
|
|
carrierType = "iot_card"
|
|
carrierID = usage.IotCardID
|
|
} else if usage.DeviceID > 0 {
|
|
carrierType = "device"
|
|
carrierID = usage.DeviceID
|
|
} else {
|
|
return errors.New(errors.CodeInvalidParam, "套餐使用记录未关联卡或设备")
|
|
}
|
|
|
|
case constants.UserTypeAgent, constants.UserTypeEnterprise:
|
|
// 代理和企业用户暂不支持通过此接口查询
|
|
// 他们应该使用后台管理接口查询指定卡/设备的套餐情况
|
|
return errors.New(errors.CodeForbidden, "此接口仅供个人客户使用")
|
|
|
|
default:
|
|
return errors.New(errors.CodeForbidden, "不支持的用户类型")
|
|
}
|
|
|
|
// 任务 15.4: 调用 CustomerViewService.GetMyUsage 获取流量数据
|
|
usageData, err := h.customerViewService.GetMyUsage(ctx, carrierType, carrierID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 任务 15.5: 返回 PackageUsageCustomerViewResponse 响应
|
|
return response.Success(c, usageData)
|
|
}
|