归档一次性佣金配置落库与累计触发修复,同步规范文档到主 specs
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m45s

- 归档 fix-one-time-commission-config-and-accumulation 到 archive/2026-01-29-*
- 同步 delta specs 到主规范(one-time-commission-trigger、commission-calculation)
- 新增累计触发逻辑文档和测试用例
- 修复一次性佣金配置落库和累计充值更新逻辑
This commit is contained in:
2026-01-29 16:00:18 +08:00
parent d977000a66
commit 2b0f79be81
19 changed files with 1654 additions and 136 deletions

View File

@@ -354,6 +354,165 @@ func TestShopSeriesAllocationAPI_UpdateStatus(t *testing.T) {
})
}
// ==================== 一次性佣金配置测试 ====================
func TestShopSeriesAllocationAPI_OneTimeCommission(t *testing.T) {
env := integ.NewIntegrationTestEnv(t)
t.Run("创建分配-固定类型一次性佣金配置落库", func(t *testing.T) {
shop := env.CreateTestShop("一次性佣金测试店铺1", 1, nil)
series := createTestPackageSeries(t, env, "一次性佣金测试系列1")
body := map[string]interface{}{
"shop_id": shop.ID,
"series_id": series.ID,
"base_commission": map[string]interface{}{
"mode": "fixed",
"value": 1000,
},
"enable_one_time_commission": true,
"one_time_commission_config": map[string]interface{}{
"type": "fixed",
"trigger": "accumulated_recharge",
"threshold": 10000,
"mode": "fixed",
"value": 500,
},
}
jsonBody, _ := json.Marshal(body)
resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/shop-series-allocations", jsonBody)
require.NoError(t, err)
defer resp.Body.Close()
var result response.Response
err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 0, result.Code, "应返回成功: %s", result.Message)
dataMap := result.Data.(map[string]interface{})
assert.Equal(t, true, dataMap["enable_one_time_commission"])
if cfg, ok := dataMap["one_time_commission_config"].(map[string]interface{}); ok {
assert.Equal(t, "fixed", cfg["type"])
assert.Equal(t, "accumulated_recharge", cfg["trigger"])
assert.Equal(t, float64(10000), cfg["threshold"])
assert.Equal(t, "fixed", cfg["mode"])
assert.Equal(t, float64(500), cfg["value"])
} else {
t.Error("一次性佣金配置应返回")
}
})
t.Run("创建分配-梯度类型一次性佣金配置落库", func(t *testing.T) {
shop := env.CreateTestShop("一次性佣金测试店铺2", 1, nil)
series := createTestPackageSeries(t, env, "一次性佣金测试系列2")
body := map[string]interface{}{
"shop_id": shop.ID,
"series_id": series.ID,
"base_commission": map[string]interface{}{
"mode": "fixed",
"value": 1000,
},
"enable_one_time_commission": true,
"one_time_commission_config": map[string]interface{}{
"type": "tiered",
"trigger": "single_recharge",
"threshold": 5000,
"tiers": []map[string]interface{}{
{"tier_type": "sales_count", "threshold": 10, "mode": "fixed", "value": 100},
{"tier_type": "sales_count", "threshold": 50, "mode": "fixed", "value": 500},
{"tier_type": "sales_amount", "threshold": 100000, "mode": "percent", "value": 50},
},
},
}
jsonBody, _ := json.Marshal(body)
resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/shop-series-allocations", jsonBody)
require.NoError(t, err)
defer resp.Body.Close()
var result response.Response
err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 0, result.Code, "应返回成功: %s", result.Message)
dataMap := result.Data.(map[string]interface{})
assert.Equal(t, true, dataMap["enable_one_time_commission"])
if cfg, ok := dataMap["one_time_commission_config"].(map[string]interface{}); ok {
assert.Equal(t, "tiered", cfg["type"])
assert.Equal(t, "single_recharge", cfg["trigger"])
if tiers, ok := cfg["tiers"].([]interface{}); ok {
assert.Equal(t, 3, len(tiers), "应有3个梯度档位")
} else {
t.Error("梯度档位应返回")
}
}
})
t.Run("创建分配-启用一次性佣金但未提供配置应失败", func(t *testing.T) {
shop := env.CreateTestShop("一次性佣金测试店铺3", 1, nil)
series := createTestPackageSeries(t, env, "一次性佣金测试系列3")
body := map[string]interface{}{
"shop_id": shop.ID,
"series_id": series.ID,
"base_commission": map[string]interface{}{
"mode": "fixed",
"value": 1000,
},
"enable_one_time_commission": true,
}
jsonBody, _ := json.Marshal(body)
resp, err := env.AsSuperAdmin().Request("POST", "/api/admin/shop-series-allocations", jsonBody)
require.NoError(t, err)
defer resp.Body.Close()
var result response.Response
err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.NotEqual(t, 0, result.Code, "启用一次性佣金但未提供配置应失败")
})
t.Run("更新分配-更新一次性佣金配置", func(t *testing.T) {
shop := env.CreateTestShop("一次性佣金测试店铺4", 1, nil)
series := createTestPackageSeries(t, env, "一次性佣金测试系列4")
allocation := createTestAllocation(t, env, shop.ID, series.ID, 0)
enableOneTime := true
body := map[string]interface{}{
"enable_one_time_commission": &enableOneTime,
"one_time_commission_config": map[string]interface{}{
"type": "fixed",
"trigger": "accumulated_recharge",
"threshold": 20000,
"mode": "percent",
"value": 100,
},
}
jsonBody, _ := json.Marshal(body)
url := fmt.Sprintf("/api/admin/shop-series-allocations/%d", allocation.ID)
resp, err := env.AsSuperAdmin().Request("PUT", url, jsonBody)
require.NoError(t, err)
defer resp.Body.Close()
var result response.Response
err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 0, result.Code, "更新应成功: %s", result.Message)
dataMap := result.Data.(map[string]interface{})
assert.Equal(t, true, dataMap["enable_one_time_commission"])
if cfg, ok := dataMap["one_time_commission_config"].(map[string]interface{}); ok {
assert.Equal(t, float64(20000), cfg["threshold"])
assert.Equal(t, "percent", cfg["mode"])
assert.Equal(t, float64(100), cfg["value"])
}
})
}
// ==================== 梯度佣金 API 测试 ====================
// ==================== 权限测试 ====================