激活时间
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m35s

This commit is contained in:
2026-04-23 17:02:11 +08:00
parent c250a47651
commit 4bde09837a

View File

@@ -179,6 +179,10 @@ func (s *IotCardStore) UpdateFields(ctx context.Context, cardID uint, fields map
if shouldSyncActivationStatus(fields) {
updates["activation_status"] = buildActivationStatusExpr(fields)
// 激活状态从 0→1 时补写激活时间;仅写首次,不覆盖已有值。
if _, hasActivatedAt := fields["activated_at"]; !hasActivatedAt {
updates["activated_at"] = buildActivatedAtExpr(fields, time.Now())
}
}
return s.db.WithContext(ctx).Model(&model.IotCard{}).
@@ -238,6 +242,42 @@ func buildActivationStatusExpr(fields map[string]any) any {
)
}
// buildActivatedAtExpr 构造激活时间表达式(与本次更新同 SQL 执行)
// 仅在激活状态从 0→1 时写入当前时间,且不覆盖已有 activated_at。
func buildActivatedAtExpr(fields map[string]any, now time.Time) any {
var networkStatus any
var cardCategory any
var realNameStatus any
if v, ok := fields["network_status"]; ok {
networkStatus = v
}
if v, ok := fields["card_category"]; ok {
cardCategory = v
}
if v, ok := fields["real_name_status"]; ok {
realNameStatus = v
}
return gorm.Expr(`
CASE
WHEN activation_status = ?
AND COALESCE(?, network_status) = ?
AND (COALESCE(?, card_category) = ? OR COALESCE(?, real_name_status) = ?)
THEN COALESCE(activated_at, ?)
ELSE activated_at
END`,
constants.ActivationStatusInactive,
networkStatus,
constants.NetworkStatusOnline,
cardCategory,
constants.CardCategoryIndustry,
realNameStatus,
constants.RealNameStatusVerified,
now,
)
}
// UpdatePollingStatus 更新卡的轮询启用状态
func (s *IotCardStore) UpdatePollingStatus(ctx context.Context, cardID uint, enablePolling bool) error {
return s.db.WithContext(ctx).Model(&model.IotCard{}).