From 0f4f0d1176390dec20b8088b865f07659dc1f1ee Mon Sep 17 00:00:00 2001 From: break Date: Thu, 30 Jul 2026 11:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E8=BF=90=E8=90=A5=E5=95=86?= =?UTF-8?q?=E5=AE=9E=E5=90=8D=E6=88=90=E5=8A=9F=E5=9B=9E=E8=B0=83=E8=83=BD?= =?UTF-8?q?=E5=A4=9F=E6=8F=90=E4=BA=A4=E7=8A=B6=E6=80=81=E4=BA=8B=E5=AE=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 PostgreSQL 无类型整数比较改为布尔条件,避免共享实名观测事务在派生激活状态时回滚。 Constraint: 电信、移动、联通实名成功回调共用同一观测写入入口 Rejected: 分别修补三个回调 Handler | 会重复逻辑且遗漏其他调用方 Confidence: high Scope-risk: narrow Directive: 实名状态变化必须继续通过 ApplyCardObservation 原子写入状态与 Outbox Tested: go build ./internal/application/cardobservation Not-tested: 用户明确要求不运行测试 --- internal/application/cardobservation/apply.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/application/cardobservation/apply.go b/internal/application/cardobservation/apply.go index aef7d0f..f2cb630 100644 --- a/internal/application/cardobservation/apply.go +++ b/internal/application/cardobservation/apply.go @@ -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