确保运营商实名成功回调能够提交状态事实
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m12s

将 PostgreSQL 无类型整数比较改为布尔条件,避免共享实名观测事务在派生激活状态时回滚。

Constraint: 电信、移动、联通实名成功回调共用同一观测写入入口

Rejected: 分别修补三个回调 Handler | 会重复逻辑且遗漏其他调用方

Confidence: high

Scope-risk: narrow

Directive: 实名状态变化必须继续通过 ApplyCardObservation 原子写入状态与 Outbox

Tested: go build ./internal/application/cardobservation

Not-tested: 用户明确要求不运行测试
This commit is contained in:
2026-07-30 11:01:41 +08:00
parent 1141167598
commit 0f4f0d1176

View File

@@ -85,9 +85,10 @@ func (s *Service) ApplyCardObservation(ctx context.Context, observation domain.R
updates["last_sync_time"] = observation.Metadata.ObservedAt
}
if decision.StatusChanged {
verified := decision.AfterStatus == constants.RealNameStatusVerified
updates["real_name_status"] = decision.AfterStatus
updates["activation_status"] = gorm.Expr(`CASE WHEN network_status = ? AND (card_category = ? OR ? = ?) THEN 1 ELSE 0 END`, constants.NetworkStatusOnline, constants.CardCategoryIndustry, decision.AfterStatus, constants.RealNameStatusVerified)
updates["activated_at"] = gorm.Expr(`CASE WHEN activated_at IS NULL AND (network_status = ? AND (card_category = ? OR ? = ?)) THEN ? ELSE activated_at END`, constants.NetworkStatusOnline, constants.CardCategoryIndustry, decision.AfterStatus, constants.RealNameStatusVerified, observation.Metadata.ObservedAt)
updates["activation_status"] = gorm.Expr(`CASE WHEN network_status = ? AND (card_category = ? OR ?) THEN 1 ELSE 0 END`, constants.NetworkStatusOnline, constants.CardCategoryIndustry, verified)
updates["activated_at"] = gorm.Expr(`CASE WHEN activated_at IS NULL AND (network_status = ? AND (card_category = ? OR ?)) THEN ? ELSE activated_at END`, constants.NetworkStatusOnline, constants.CardCategoryIndustry, verified, observation.Metadata.ObservedAt)
}
if decision.FirstVerified {
updates["first_realname_at"] = observation.Metadata.ObservedAt