fix: 修复资产套餐列表时间字段返回异常时区偏移问题
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s

待生效套餐的 activated_at/expires_at 在 DB 中存储为零值(0001-01-01),
Go 序列化时因 Asia/Shanghai 历史 LMT(+08:05:36)导致输出异常时区偏移。

- AssetPackageResponse.ActivatedAt/ExpiresAt 改为 *time.Time + omitempty
- 新增 nonZeroTimePtr 辅助函数,零值时间转 nil,避免序列化问题
- 同步修复 GetPackages 和 GetCurrentPackage 两处赋值

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-16 11:42:39 +08:00
parent b1d6355a7d
commit 0ef136f008
2 changed files with 15 additions and 6 deletions

View File

@@ -90,8 +90,8 @@ type AssetPackageResponse struct {
VirtualUsedMB float64 `json:"virtual_used_mb" description:"已用虚流量(MB)按virtual_ratio换算"`
VirtualRemainMB float64 `json:"virtual_remain_mb" description:"剩余虚流量(MB)按virtual_ratio换算"`
VirtualRatio float64 `json:"virtual_ratio" description:"虚流量比例(real/virtual)"`
ActivatedAt time.Time `json:"activated_at" description:"激活时间"`
ExpiresAt time.Time `json:"expires_at" description:"到期时间"`
ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间(待生效套餐为空)"`
ExpiresAt *time.Time `json:"expires_at,omitempty" description:"到期时间(待生效套餐为空)"`
MasterUsageID *uint `json:"master_usage_id,omitempty" description:"主套餐ID加油包时有值"`
Priority int `json:"priority" description:"优先级"`
CreatedAt time.Time `json:"created_at" description:"创建时间"`

View File

@@ -6,6 +6,7 @@ package asset
import (
"context"
"sort"
"time"
"github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
@@ -396,8 +397,8 @@ func (s *Service) GetPackages(ctx context.Context, assetType string, id uint) ([
VirtualUsedMB: float64(u.DataUsageMB) / ratio,
VirtualRemainMB: float64(u.DataLimitMB-u.DataUsageMB) / ratio,
VirtualRatio: ratio,
ActivatedAt: u.ActivatedAt,
ExpiresAt: u.ExpiresAt,
ActivatedAt: nonZeroTimePtr(u.ActivatedAt),
ExpiresAt: nonZeroTimePtr(u.ExpiresAt),
MasterUsageID: u.MasterUsageID,
Priority: u.Priority,
CreatedAt: u.CreatedAt,
@@ -449,8 +450,8 @@ func (s *Service) GetCurrentPackage(ctx context.Context, assetType string, id ui
VirtualUsedMB: float64(usage.DataUsageMB) / ratio,
VirtualRemainMB: float64(usage.DataLimitMB-usage.DataUsageMB) / ratio,
VirtualRatio: ratio,
ActivatedAt: usage.ActivatedAt,
ExpiresAt: usage.ExpiresAt,
ActivatedAt: nonZeroTimePtr(usage.ActivatedAt),
ExpiresAt: nonZeroTimePtr(usage.ExpiresAt),
MasterUsageID: usage.MasterUsageID,
Priority: usage.Priority,
CreatedAt: usage.CreatedAt,
@@ -470,6 +471,14 @@ func (s *Service) getDeviceProtectStatus(ctx context.Context, deviceID uint) str
return "none"
}
// nonZeroTimePtr 将非零时间转为指针,零值返回 nil避免序列化出历史时区偏移 +08:05
func nonZeroTimePtr(t time.Time) *time.Time {
if t.IsZero() {
return nil
}
return &t
}
// safeVirtualRatio 安全获取虚流量比例,避免除零
func safeVirtualRatio(ratio float64) float64 {
if ratio <= 0 {