This commit is contained in:
@@ -179,6 +179,10 @@ func (s *IotCardStore) UpdateFields(ctx context.Context, cardID uint, fields map
|
|||||||
|
|
||||||
if shouldSyncActivationStatus(fields) {
|
if shouldSyncActivationStatus(fields) {
|
||||||
updates["activation_status"] = buildActivationStatusExpr(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{}).
|
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 更新卡的轮询启用状态
|
// UpdatePollingStatus 更新卡的轮询启用状态
|
||||||
func (s *IotCardStore) UpdatePollingStatus(ctx context.Context, cardID uint, enablePolling bool) error {
|
func (s *IotCardStore) UpdatePollingStatus(ctx context.Context, cardID uint, enablePolling bool) error {
|
||||||
return s.db.WithContext(ctx).Model(&model.IotCard{}).
|
return s.db.WithContext(ctx).Model(&model.IotCard{}).
|
||||||
|
|||||||
Reference in New Issue
Block a user