From 6de77ee02d3cc4ef0869540205d71169f0dfc46c Mon Sep 17 00:00:00 2001 From: zhx Date: Fri, 5 Jun 2026 14:57:11 +0800 Subject: [PATCH] Show host policies for all trigger modes --- .../internal/transport/http/response_test.go | 6 +++--- .../http/userapi/host_center_policy_handler.go | 9 ++++----- .../internal/service/wallet/service.go | 7 ++----- .../internal/service/wallet/service_test.go | 12 ++++++++++-- .../storage/mysql/host_salary_settlement.go | 14 ++++++++++---- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/services/gateway-service/internal/transport/http/response_test.go b/services/gateway-service/internal/transport/http/response_test.go index efe68243..e0cb5a10 100644 --- a/services/gateway-service/internal/transport/http/response_test.go +++ b/services/gateway-service/internal/transport/http/response_test.go @@ -3485,7 +3485,7 @@ func TestHostCenterPlatformPolicyUsesCurrentHostRegion(t *testing.T) { RegionId: 30, Status: "active", SettlementMode: "half_month", - SettlementTriggerMode: "automatic", + SettlementTriggerMode: "manual", GiftCoinToDiamondRatio: "1.0000", ResidualDiamondToUsdRate: "0.0100", EffectiveFromMs: 1700000000000, @@ -3521,7 +3521,7 @@ func TestHostCenterPlatformPolicyUsesCurrentHostRegion(t *testing.T) { if hostClient.lastHost == nil || hostClient.lastHost.GetUserId() != 42 { t.Fatalf("host profile request mismatch: %+v", hostClient.lastHost) } - if walletClient.lastHostSalaryPolicy == nil || walletClient.lastHostSalaryPolicy.GetRegionId() != 30 || walletClient.lastHostSalaryPolicy.GetSettlementTriggerMode() != "automatic" || walletClient.lastHostSalaryPolicy.GetAppCode() == "" || walletClient.lastHostSalaryPolicy.GetRequestId() == "" { + if walletClient.lastHostSalaryPolicy == nil || walletClient.lastHostSalaryPolicy.GetRegionId() != 30 || walletClient.lastHostSalaryPolicy.GetSettlementTriggerMode() != "" || walletClient.lastHostSalaryPolicy.GetAppCode() == "" || walletClient.lastHostSalaryPolicy.GetRequestId() == "" { t.Fatalf("host salary policy request mismatch: %+v", walletClient.lastHostSalaryPolicy) } if walletClient.lastHostSalaryProgress == nil || walletClient.lastHostSalaryProgress.GetHostUserId() != 42 || walletClient.lastHostSalaryProgress.GetAppCode() == "" || walletClient.lastHostSalaryProgress.GetRequestId() == "" { @@ -3537,7 +3537,7 @@ func TestHostCenterPlatformPolicyUsesCurrentHostRegion(t *testing.T) { firstLevel := levels[0].(map[string]any) progress := data["progress"].(map[string]any) levelProgress := data["level_progress"].(map[string]any) - if data["found"] != true || data["host_region_id"] != float64(30) || policy["policy_id"] != "9001" || policy["settlement_mode"] != "half_month" || firstLevel["host_salary_usd"] != 15.0 || firstLevel["agency_salary_usd"] != 3.0 { + if data["found"] != true || data["host_region_id"] != float64(30) || policy["policy_id"] != "9001" || policy["settlement_mode"] != "half_month" || policy["settlement_trigger_mode"] != "manual" || firstLevel["host_salary_usd"] != 15.0 || firstLevel["agency_salary_usd"] != 3.0 { t.Fatalf("host policy response mismatch: %+v", data) } if progress["cycle_key"] != "2026-06" || progress["total_diamonds"] != float64(1200) { diff --git a/services/gateway-service/internal/transport/http/userapi/host_center_policy_handler.go b/services/gateway-service/internal/transport/http/userapi/host_center_policy_handler.go index 3fa70adf..dfc24d78 100644 --- a/services/gateway-service/internal/transport/http/userapi/host_center_policy_handler.go +++ b/services/gateway-service/internal/transport/http/userapi/host_center_policy_handler.go @@ -68,12 +68,11 @@ func (h *Handler) getHostCenterPlatformPolicy(writer http.ResponseWriter, reques return } - // H5 不传 region 或 policy id;gateway 固定使用当前主播身份里的区域快照读取实际生效政策。 + // H5 不传 region、policy id 或 trigger;gateway 用当前主播身份区域读取 active 政策,让 automatic/manual 都能展示。 resp, err := h.walletClient.GetActiveHostSalaryPolicy(request.Context(), &walletv1.GetActiveHostSalaryPolicyRequest{ - RequestId: httpkit.RequestIDFromContext(request.Context()), - AppCode: appcode.FromContext(request.Context()), - RegionId: profile.GetRegionId(), - SettlementTriggerMode: "automatic", + RequestId: httpkit.RequestIDFromContext(request.Context()), + AppCode: appcode.FromContext(request.Context()), + RegionId: profile.GetRegionId(), }) if err != nil { httpkit.WriteRPCError(writer, request, err) diff --git a/services/wallet-service/internal/service/wallet/service.go b/services/wallet-service/internal/service/wallet/service.go index ff1727c1..32d96f64 100644 --- a/services/wallet-service/internal/service/wallet/service.go +++ b/services/wallet-service/internal/service/wallet/service.go @@ -256,10 +256,7 @@ func (s *Service) GetActiveHostSalaryPolicy(ctx context.Context, appCode string, return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.InvalidArgument, "settlement_mode is invalid") } triggerMode = strings.TrimSpace(triggerMode) - if triggerMode == "" { - triggerMode = ledger.HostSalarySettlementTriggerAutomatic - } - if triggerMode != ledger.HostSalarySettlementTriggerAutomatic && triggerMode != ledger.HostSalarySettlementTriggerManual { + if triggerMode != "" && triggerMode != ledger.HostSalarySettlementTriggerAutomatic && triggerMode != ledger.HostSalarySettlementTriggerManual { return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.InvalidArgument, "settlement_trigger_mode is invalid") } if nowMs <= 0 { @@ -267,7 +264,7 @@ func (s *Service) GetActiveHostSalaryPolicy(ctx context.Context, appCode string, } appCode = appcode.Normalize(appCode) ctx = appcode.WithContext(ctx, appCode) - // 不传 settlement_mode 时按同区域最新 active policy 返回,用于 H5 展示平台当前规则。 + // H5 展示可以不传 trigger mode,此时 automatic/manual 政策都可展示;结算任务仍会传具体 trigger 精确匹配。 return s.repository.GetActiveHostSalaryPolicy(ctx, regionID, settlementMode, triggerMode, nowMs) } diff --git a/services/wallet-service/internal/service/wallet/service_test.go b/services/wallet-service/internal/service/wallet/service_test.go index 4bd94a25..a32cc57a 100644 --- a/services/wallet-service/internal/service/wallet/service_test.go +++ b/services/wallet-service/internal/service/wallet/service_test.go @@ -378,7 +378,7 @@ func TestGetActiveHostSalaryPolicyReadsRuntimePolicy(t *testing.T) { RegionID: 8801, Status: "active", SettlementMode: ledger.HostSalarySettlementModeHalfMonth, - SettlementTriggerMode: ledger.HostSalarySettlementTriggerAutomatic, + SettlementTriggerMode: ledger.HostSalarySettlementTriggerManual, GiftCoinToDiamondRatio: "1.0000", ResidualDiamondToUSDRate: "0.0100", EffectiveFromMs: nowMs - 1000, @@ -390,7 +390,7 @@ func TestGetActiveHostSalaryPolicyReadsRuntimePolicy(t *testing.T) { }) svc := walletservice.New(repository) - policy, found, err := svc.GetActiveHostSalaryPolicy(context.Background(), "lalu", 8801, "", ledger.HostSalarySettlementTriggerAutomatic, nowMs) + policy, found, err := svc.GetActiveHostSalaryPolicy(context.Background(), "lalu", 8801, "", "", nowMs) if err != nil { t.Fatalf("GetActiveHostSalaryPolicy failed: %v", err) } @@ -400,9 +400,17 @@ func TestGetActiveHostSalaryPolicyReadsRuntimePolicy(t *testing.T) { if policy.PolicyID != 901 || policy.Name != "current host policy" || policy.SettlementMode != ledger.HostSalarySettlementModeHalfMonth || policy.RegionID != 8801 { t.Fatalf("policy mismatch: %+v", policy) } + if policy.SettlementTriggerMode != ledger.HostSalarySettlementTriggerManual { + t.Fatalf("policy trigger mode mismatch: %+v", policy) + } if len(policy.Levels) != 2 || policy.Levels[1].LevelNo != 2 || policy.Levels[1].HostSalaryUSDMinor != 4500 || policy.Levels[1].AgencySalaryUSDMinor != 900 { t.Fatalf("policy levels mismatch: %+v", policy.Levels) } + if _, found, err := svc.GetActiveHostSalaryPolicy(context.Background(), "lalu", 8801, "", ledger.HostSalarySettlementTriggerAutomatic, nowMs); err != nil { + t.Fatalf("GetActiveHostSalaryPolicy with trigger failed: %v", err) + } else if found { + t.Fatal("automatic trigger query should not match manual policy") + } } // TestGetHostSalaryProgressReadsCurrentCycleDiamonds 验证 H5 等级进度读取工资周期钻石账户,查询不到时保持 0 累计。 diff --git a/services/wallet-service/internal/storage/mysql/host_salary_settlement.go b/services/wallet-service/internal/storage/mysql/host_salary_settlement.go index 626ee295..2aa94320 100644 --- a/services/wallet-service/internal/storage/mysql/host_salary_settlement.go +++ b/services/wallet-service/internal/storage/mysql/host_salary_settlement.go @@ -392,12 +392,18 @@ func (r *Repository) resolveHostSalaryPolicy(ctx context.Context, tx *sql.Tx, re func (r *Repository) queryActiveHostSalaryPolicy(ctx context.Context, q hostSalaryPolicyQuerier, regionID int64, settlementMode string, triggerMode string, nowMs int64) (ledger.HostSalaryPolicy, bool, error) { modeClause := "" - args := []any{appcode.FromContext(ctx), regionID, nowMs, nowMs, triggerMode} + triggerClause := "" + args := []any{appcode.FromContext(ctx), regionID, nowMs, nowMs} if strings.TrimSpace(settlementMode) != "" { - // 结算任务必须精确匹配结算模式;H5 展示不传模式时只按区域和触发模式取最新生效政策。 + // 结算任务必须精确匹配结算模式;H5 展示不传模式时只按区域取最新生效政策。 modeClause = "AND settlement_mode = ?" args = append(args, settlementMode) } + if strings.TrimSpace(triggerMode) != "" { + // H5 展示不传 trigger 时 automatic/manual 都可展示;结算任务传 trigger 时仍精确匹配。 + triggerClause = "AND settlement_trigger_mode = ?" + args = append(args, triggerMode) + } query := fmt.Sprintf(` SELECT policy_id, name, region_id, status, settlement_mode, settlement_trigger_mode, CAST(gift_coin_to_diamond_ratio AS CHAR), @@ -409,10 +415,10 @@ func (r *Repository) queryActiveHostSalaryPolicy(ctx context.Context, q hostSala AND status = 'active' AND effective_from_ms <= ? AND (effective_to_ms = 0 OR effective_to_ms > ?) - AND settlement_trigger_mode = ? + %s %s ORDER BY effective_from_ms DESC, policy_id DESC - LIMIT 1`, modeClause) + LIMIT 1`, triggerClause, modeClause) var policy ledger.HostSalaryPolicy err := q.QueryRowContext(ctx, query, args...).Scan(&policy.PolicyID, &policy.Name, &policy.RegionID, &policy.Status, &policy.SettlementMode, &policy.SettlementTriggerMode, &policy.GiftCoinToDiamondRatio, &policy.ResidualDiamondToUSDRate, &policy.EffectiveFromMs, &policy.EffectiveToMs) if err != nil {