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) }