Show host policies for all trigger modes
This commit is contained in:
parent
c56186ab48
commit
6de77ee02d
@ -3485,7 +3485,7 @@ func TestHostCenterPlatformPolicyUsesCurrentHostRegion(t *testing.T) {
|
|||||||
RegionId: 30,
|
RegionId: 30,
|
||||||
Status: "active",
|
Status: "active",
|
||||||
SettlementMode: "half_month",
|
SettlementMode: "half_month",
|
||||||
SettlementTriggerMode: "automatic",
|
SettlementTriggerMode: "manual",
|
||||||
GiftCoinToDiamondRatio: "1.0000",
|
GiftCoinToDiamondRatio: "1.0000",
|
||||||
ResidualDiamondToUsdRate: "0.0100",
|
ResidualDiamondToUsdRate: "0.0100",
|
||||||
EffectiveFromMs: 1700000000000,
|
EffectiveFromMs: 1700000000000,
|
||||||
@ -3521,7 +3521,7 @@ func TestHostCenterPlatformPolicyUsesCurrentHostRegion(t *testing.T) {
|
|||||||
if hostClient.lastHost == nil || hostClient.lastHost.GetUserId() != 42 {
|
if hostClient.lastHost == nil || hostClient.lastHost.GetUserId() != 42 {
|
||||||
t.Fatalf("host profile request mismatch: %+v", hostClient.lastHost)
|
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)
|
t.Fatalf("host salary policy request mismatch: %+v", walletClient.lastHostSalaryPolicy)
|
||||||
}
|
}
|
||||||
if walletClient.lastHostSalaryProgress == nil || walletClient.lastHostSalaryProgress.GetHostUserId() != 42 || walletClient.lastHostSalaryProgress.GetAppCode() == "" || walletClient.lastHostSalaryProgress.GetRequestId() == "" {
|
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)
|
firstLevel := levels[0].(map[string]any)
|
||||||
progress := data["progress"].(map[string]any)
|
progress := data["progress"].(map[string]any)
|
||||||
levelProgress := data["level_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)
|
t.Fatalf("host policy response mismatch: %+v", data)
|
||||||
}
|
}
|
||||||
if progress["cycle_key"] != "2026-06" || progress["total_diamonds"] != float64(1200) {
|
if progress["cycle_key"] != "2026-06" || progress["total_diamonds"] != float64(1200) {
|
||||||
|
|||||||
@ -68,12 +68,11 @@ func (h *Handler) getHostCenterPlatformPolicy(writer http.ResponseWriter, reques
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// H5 不传 region 或 policy id;gateway 固定使用当前主播身份里的区域快照读取实际生效政策。
|
// H5 不传 region、policy id 或 trigger;gateway 用当前主播身份区域读取 active 政策,让 automatic/manual 都能展示。
|
||||||
resp, err := h.walletClient.GetActiveHostSalaryPolicy(request.Context(), &walletv1.GetActiveHostSalaryPolicyRequest{
|
resp, err := h.walletClient.GetActiveHostSalaryPolicy(request.Context(), &walletv1.GetActiveHostSalaryPolicyRequest{
|
||||||
RequestId: httpkit.RequestIDFromContext(request.Context()),
|
RequestId: httpkit.RequestIDFromContext(request.Context()),
|
||||||
AppCode: appcode.FromContext(request.Context()),
|
AppCode: appcode.FromContext(request.Context()),
|
||||||
RegionId: profile.GetRegionId(),
|
RegionId: profile.GetRegionId(),
|
||||||
SettlementTriggerMode: "automatic",
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpkit.WriteRPCError(writer, request, err)
|
httpkit.WriteRPCError(writer, request, err)
|
||||||
|
|||||||
@ -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")
|
return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.InvalidArgument, "settlement_mode is invalid")
|
||||||
}
|
}
|
||||||
triggerMode = strings.TrimSpace(triggerMode)
|
triggerMode = strings.TrimSpace(triggerMode)
|
||||||
if triggerMode == "" {
|
if triggerMode != "" && triggerMode != ledger.HostSalarySettlementTriggerAutomatic && triggerMode != ledger.HostSalarySettlementTriggerManual {
|
||||||
triggerMode = ledger.HostSalarySettlementTriggerAutomatic
|
|
||||||
}
|
|
||||||
if triggerMode != ledger.HostSalarySettlementTriggerAutomatic && triggerMode != ledger.HostSalarySettlementTriggerManual {
|
|
||||||
return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.InvalidArgument, "settlement_trigger_mode is invalid")
|
return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.InvalidArgument, "settlement_trigger_mode is invalid")
|
||||||
}
|
}
|
||||||
if nowMs <= 0 {
|
if nowMs <= 0 {
|
||||||
@ -267,7 +264,7 @@ func (s *Service) GetActiveHostSalaryPolicy(ctx context.Context, appCode string,
|
|||||||
}
|
}
|
||||||
appCode = appcode.Normalize(appCode)
|
appCode = appcode.Normalize(appCode)
|
||||||
ctx = appcode.WithContext(ctx, 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)
|
return s.repository.GetActiveHostSalaryPolicy(ctx, regionID, settlementMode, triggerMode, nowMs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -378,7 +378,7 @@ func TestGetActiveHostSalaryPolicyReadsRuntimePolicy(t *testing.T) {
|
|||||||
RegionID: 8801,
|
RegionID: 8801,
|
||||||
Status: "active",
|
Status: "active",
|
||||||
SettlementMode: ledger.HostSalarySettlementModeHalfMonth,
|
SettlementMode: ledger.HostSalarySettlementModeHalfMonth,
|
||||||
SettlementTriggerMode: ledger.HostSalarySettlementTriggerAutomatic,
|
SettlementTriggerMode: ledger.HostSalarySettlementTriggerManual,
|
||||||
GiftCoinToDiamondRatio: "1.0000",
|
GiftCoinToDiamondRatio: "1.0000",
|
||||||
ResidualDiamondToUSDRate: "0.0100",
|
ResidualDiamondToUSDRate: "0.0100",
|
||||||
EffectiveFromMs: nowMs - 1000,
|
EffectiveFromMs: nowMs - 1000,
|
||||||
@ -390,7 +390,7 @@ func TestGetActiveHostSalaryPolicyReadsRuntimePolicy(t *testing.T) {
|
|||||||
})
|
})
|
||||||
svc := walletservice.New(repository)
|
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 {
|
if err != nil {
|
||||||
t.Fatalf("GetActiveHostSalaryPolicy failed: %v", err)
|
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 {
|
if policy.PolicyID != 901 || policy.Name != "current host policy" || policy.SettlementMode != ledger.HostSalarySettlementModeHalfMonth || policy.RegionID != 8801 {
|
||||||
t.Fatalf("policy mismatch: %+v", policy)
|
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 {
|
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)
|
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 累计。
|
// TestGetHostSalaryProgressReadsCurrentCycleDiamonds 验证 H5 等级进度读取工资周期钻石账户,查询不到时保持 0 累计。
|
||||||
|
|||||||
@ -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) {
|
func (r *Repository) queryActiveHostSalaryPolicy(ctx context.Context, q hostSalaryPolicyQuerier, regionID int64, settlementMode string, triggerMode string, nowMs int64) (ledger.HostSalaryPolicy, bool, error) {
|
||||||
modeClause := ""
|
modeClause := ""
|
||||||
args := []any{appcode.FromContext(ctx), regionID, nowMs, nowMs, triggerMode}
|
triggerClause := ""
|
||||||
|
args := []any{appcode.FromContext(ctx), regionID, nowMs, nowMs}
|
||||||
if strings.TrimSpace(settlementMode) != "" {
|
if strings.TrimSpace(settlementMode) != "" {
|
||||||
// 结算任务必须精确匹配结算模式;H5 展示不传模式时只按区域和触发模式取最新生效政策。
|
// 结算任务必须精确匹配结算模式;H5 展示不传模式时只按区域取最新生效政策。
|
||||||
modeClause = "AND settlement_mode = ?"
|
modeClause = "AND settlement_mode = ?"
|
||||||
args = append(args, settlementMode)
|
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(`
|
query := fmt.Sprintf(`
|
||||||
SELECT policy_id, name, region_id, status, settlement_mode, settlement_trigger_mode,
|
SELECT policy_id, name, region_id, status, settlement_mode, settlement_trigger_mode,
|
||||||
CAST(gift_coin_to_diamond_ratio AS CHAR),
|
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 status = 'active'
|
||||||
AND effective_from_ms <= ?
|
AND effective_from_ms <= ?
|
||||||
AND (effective_to_ms = 0 OR effective_to_ms > ?)
|
AND (effective_to_ms = 0 OR effective_to_ms > ?)
|
||||||
AND settlement_trigger_mode = ?
|
%s
|
||||||
%s
|
%s
|
||||||
ORDER BY effective_from_ms DESC, policy_id DESC
|
ORDER BY effective_from_ms DESC, policy_id DESC
|
||||||
LIMIT 1`, modeClause)
|
LIMIT 1`, triggerClause, modeClause)
|
||||||
var policy ledger.HostSalaryPolicy
|
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)
|
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 {
|
if err != nil {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user