Show host policies for all trigger modes

This commit is contained in:
zhx 2026-06-05 14:57:11 +08:00
parent c56186ab48
commit 6de77ee02d
5 changed files with 29 additions and 19 deletions

View File

@ -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) {

View File

@ -68,12 +68,11 @@ func (h *Handler) getHostCenterPlatformPolicy(writer http.ResponseWriter, reques
return
}
// H5 不传 region 或 policy idgateway 固定使用当前主播身份里的区域快照读取实际生效政策
// H5 不传 region、policy id 或 triggergateway 用当前主播身份区域读取 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)

View File

@ -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)
}

View File

@ -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 累计。

View File

@ -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 {