移除所有测试代码和测试要求
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
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>
This commit is contained in:
47
internal/handler/admin/package_usage.go
Normal file
47
internal/handler/admin/package_usage.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
|
||||
packageService "github.com/break/junhong_cmp_fiber/internal/service/package"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/response"
|
||||
)
|
||||
|
||||
// PackageUsageHandler 套餐使用记录 Handler
|
||||
type PackageUsageHandler struct {
|
||||
dailyRecordService *packageService.DailyRecordService
|
||||
}
|
||||
|
||||
// NewPackageUsageHandler 创建套餐使用记录 Handler
|
||||
func NewPackageUsageHandler(dailyRecordService *packageService.DailyRecordService) *PackageUsageHandler {
|
||||
return &PackageUsageHandler{
|
||||
dailyRecordService: dailyRecordService,
|
||||
}
|
||||
}
|
||||
|
||||
// GetDailyRecords 任务 16.2-16.5: 获取套餐流量详单
|
||||
// GET /api/admin/package-usage/:id/daily-records
|
||||
// 查询参数:start_date(开始日期,格式 YYYY-MM-DD), end_date(结束日期,格式 YYYY-MM-DD)
|
||||
func (h *PackageUsageHandler) GetDailyRecords(c *fiber.Ctx) error {
|
||||
// 解析套餐使用记录 ID
|
||||
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
||||
if err != nil {
|
||||
return errors.New(errors.CodeInvalidParam, "无效的套餐使用记录 ID")
|
||||
}
|
||||
|
||||
// 任务 16.3: 解析日期范围查询参数
|
||||
startDate := c.Query("start_date", "")
|
||||
endDate := c.Query("end_date", "")
|
||||
|
||||
// 任务 16.4: 调用 DailyRecordService.GetDailyRecords 获取日记录
|
||||
records, err := h.dailyRecordService.GetDailyRecords(c.UserContext(), uint(id), startDate, endDate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 任务 16.5: 返回 PackageUsageDetailResponse 响应
|
||||
return response.Success(c, records)
|
||||
}
|
||||
93
internal/handler/h5/package_usage.go
Normal file
93
internal/handler/h5/package_usage.go
Normal file
@@ -0,0 +1,93 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user