From 0ef136f008aca728702ab58c870ba2d7a10ce4be Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 16 Mar 2026 11:42:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E5=A5=97=E9=A4=90=E5=88=97=E8=A1=A8=E6=97=B6=E9=97=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BF=94=E5=9B=9E=E5=BC=82=E5=B8=B8=E6=97=B6=E5=8C=BA?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 待生效套餐的 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 --- internal/model/dto/asset_dto.go | 4 ++-- internal/service/asset/service.go | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/internal/model/dto/asset_dto.go b/internal/model/dto/asset_dto.go index 30d3aad..8a207d2 100644 --- a/internal/model/dto/asset_dto.go +++ b/internal/model/dto/asset_dto.go @@ -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:"创建时间"` diff --git a/internal/service/asset/service.go b/internal/service/asset/service.go index 0f3d680..773e3c0 100644 --- a/internal/service/asset/service.go +++ b/internal/service/asset/service.go @@ -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 {