fix(partner): 全网平级奖截断阈值修正为不能少于0.10元(1角钱)
这个提交包含在:
@@ -49,11 +49,12 @@ class MakerPeerTest
|
||||
public function run()
|
||||
{
|
||||
echo "========================================================\n";
|
||||
echo " 创客多代平级级联至0.01截断测试 (Maker Peer to 0.01) \n";
|
||||
echo " 创客多代平级级联至少于0.10元截断测试 (Maker Peer) \n";
|
||||
echo "========================================================\n\n";
|
||||
|
||||
$this->testThreePeerCascade();
|
||||
$this->testMultiPeerUntilCentCutoff();
|
||||
$this->testV3CutoffAtTenCent();
|
||||
$this->testV6ThreeGenerationsCascade();
|
||||
$this->testInactiveIntermediaryCascade();
|
||||
$this->testV1PeerCascade();
|
||||
$this->testMultiSegmentPeers();
|
||||
@@ -109,18 +110,8 @@ class MakerPeerTest
|
||||
$reward = new MakerPeerReward();
|
||||
$reward->run($order, $buyerId, $chain, $diffResult, $active);
|
||||
|
||||
$records = Db::name('shopro_partner_reward')
|
||||
->where('order_id', 9901)
|
||||
->where('reward_type', 'maker_peer')
|
||||
->order('id asc')
|
||||
->select();
|
||||
|
||||
$bReward = null;
|
||||
$cReward = null;
|
||||
foreach ($records as $r) {
|
||||
if ($r['user_id'] == 3) $bReward = $r;
|
||||
if ($r['user_id'] == 4) $cReward = $r;
|
||||
}
|
||||
$bReward = Db::name('shopro_partner_reward')->where('order_id', 9901)->where('user_id', 3)->find();
|
||||
$cReward = Db::name('shopro_partner_reward')->where('order_id', 9901)->where('user_id', 4)->find();
|
||||
|
||||
$bAmount = $bReward ? floatval($bReward['amount']) : 0;
|
||||
$cAmount = $cReward ? floatval($cReward['amount']) : 0;
|
||||
@@ -139,19 +130,17 @@ class MakerPeerTest
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 2:多代平级持续向上拿,最少达到 0.01 元后截断
|
||||
* 链条:买家(7) -> A(2) -> B(3) -> C(4) -> D(5) -> E(6) -> F(8) (均为 V3,基数 60)
|
||||
* 计算递推:
|
||||
* 测试 2:V3 创客少于 0.10 元截断(A -> B -> C -> D -> E,均为 V3,基数 60)
|
||||
* 规则验证:
|
||||
* A: 极差 60.00
|
||||
* B(3): 第1代 60 * 10% = 6.00
|
||||
* C(4): 第2代 6 * 10% = 0.60
|
||||
* D(5): 第3代 0.6 * 10% = 0.06
|
||||
* E(6): 第4代 0.06 * 10% = 0.006 -> round 0.01 元(平台最小分币)
|
||||
* F(8): 第5代 0.01 * 10% = 0.001 -> round 0.00 < 0.01,严格截断,不发放
|
||||
* D(5): 第3代 0.6 * 10% = 0.06 < 0.10 -> 截断!D 不发放
|
||||
* E(6): 截断!E 不发放
|
||||
*/
|
||||
public function testMultiPeerUntilCentCutoff()
|
||||
public function testV3CutoffAtTenCent()
|
||||
{
|
||||
$testName = "场景2: V3创客多代平级(6.00 -> 0.60 -> 0.06 -> 0.01) 到0.01后上层截断";
|
||||
$testName = "场景2: V3创客第3代(0.06元 < 0.10元)触发截断,D与E均不发放";
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
@@ -163,7 +152,6 @@ class MakerPeerTest
|
||||
['user_id' => 4, 'level' => 4],
|
||||
['user_id' => 5, 'level' => 4],
|
||||
['user_id' => 6, 'level' => 4],
|
||||
['user_id' => 8, 'level' => 4],
|
||||
];
|
||||
|
||||
$diffResult = [
|
||||
@@ -181,16 +169,13 @@ class MakerPeerTest
|
||||
$c = Db::name('shopro_partner_reward')->where('order_id', 9902)->where('user_id', 4)->find();
|
||||
$d = Db::name('shopro_partner_reward')->where('order_id', 9902)->where('user_id', 5)->find();
|
||||
$e = Db::name('shopro_partner_reward')->where('order_id', 9902)->where('user_id', 6)->find();
|
||||
$f = Db::name('shopro_partner_reward')->where('order_id', 9902)->where('user_id', 8)->find();
|
||||
|
||||
$bAmt = $b ? floatval($b['amount']) : 0;
|
||||
$cAmt = $c ? floatval($c['amount']) : 0;
|
||||
$dAmt = $d ? floatval($d['amount']) : 0;
|
||||
$eAmt = $e ? floatval($e['amount']) : 0;
|
||||
|
||||
$pass = ($bAmt == 6.00) && ($cAmt == 0.60) && ($dAmt == 0.06) && ($eAmt == 0.01) && empty($f);
|
||||
$pass = ($bAmt == 6.00) && ($cAmt == 0.60) && empty($d) && empty($e);
|
||||
|
||||
$this->assert($pass, $testName, "B={$bAmt}(6), C={$cAmt}(0.6), D={$dAmt}(0.06), E={$eAmt}(0.01), F=" . (empty($f) ? '已截断' : '未截断'));
|
||||
$this->assert($pass, $testName, "B={$bAmt}(6), C={$cAmt}(0.6), D=" . (empty($d) ? '已截断' : '未截断') . ", E=" . (empty($e) ? '已截断' : '未截断'));
|
||||
} catch (\Exception $e) {
|
||||
$this->assert(false, $testName, "异常: " . $e->getMessage());
|
||||
} finally {
|
||||
@@ -199,19 +184,65 @@ class MakerPeerTest
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 3:中间创客未自购场景(A -> B(不活跃) -> C(活跃))
|
||||
* 规则验证:
|
||||
* B 产生 skip 记录(status=-1, skip_reason=inactive_30d)
|
||||
* C 仍然作为合格第2代拿到 0.60 元
|
||||
* 测试 3:V6 创客(基数 120 元)3 代级联实发(12.00 -> 1.20 -> 0.12 >= 0.10),第4代截断
|
||||
*/
|
||||
public function testInactiveIntermediaryCascade()
|
||||
public function testV6ThreeGenerationsCascade()
|
||||
{
|
||||
$testName = "场景3: 中间平级B 30日无自购被跳过,上级C仍正常获得第2代平级0.60元";
|
||||
$testName = "场景3: V6创客(基数120)实发3代(12.00->1.20->0.12),第4代(0.01<0.10)截断";
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
$order = ['id' => 9903, 'user_id' => 7];
|
||||
$buyerId = 7;
|
||||
$chain = [
|
||||
['user_id' => 2, 'level' => 7], // Level 7 基数 120 (V6)
|
||||
['user_id' => 3, 'level' => 7],
|
||||
['user_id' => 4, 'level' => 7],
|
||||
['user_id' => 5, 'level' => 7],
|
||||
['user_id' => 6, 'level' => 7],
|
||||
];
|
||||
|
||||
$diffResult = [
|
||||
'seen' => 120.0,
|
||||
'paid' => [
|
||||
['user_id' => 2, 'level' => 7, 'cap' => 120.0, 'amount' => 120.0]
|
||||
]
|
||||
];
|
||||
|
||||
$active = new MockActiveService();
|
||||
$reward = new MakerPeerReward();
|
||||
$reward->run($order, $buyerId, $chain, $diffResult, $active);
|
||||
|
||||
$b = Db::name('shopro_partner_reward')->where('order_id', 9903)->where('user_id', 3)->find();
|
||||
$c = Db::name('shopro_partner_reward')->where('order_id', 9903)->where('user_id', 4)->find();
|
||||
$d = Db::name('shopro_partner_reward')->where('order_id', 9903)->where('user_id', 5)->find();
|
||||
$e = Db::name('shopro_partner_reward')->where('order_id', 9903)->where('user_id', 6)->find();
|
||||
|
||||
$bAmt = $b ? floatval($b['amount']) : 0;
|
||||
$cAmt = $c ? floatval($c['amount']) : 0;
|
||||
$dAmt = $d ? floatval($d['amount']) : 0;
|
||||
|
||||
$pass = ($bAmt == 12.00) && ($cAmt == 1.20) && ($dAmt == 0.12) && empty($e);
|
||||
|
||||
$this->assert($pass, $testName, "B={$bAmt}(12), C={$cAmt}(1.2), D={$dAmt}(0.12), E=" . (empty($e) ? '已截断' : '未截断'));
|
||||
} catch (\Exception $e) {
|
||||
$this->assert(false, $testName, "异常: " . $e->getMessage());
|
||||
} finally {
|
||||
Db::rollback();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 4:中间创客未自购场景(A -> B(不活跃) -> C(活跃))
|
||||
*/
|
||||
public function testInactiveIntermediaryCascade()
|
||||
{
|
||||
$testName = "场景4: 中间平级B 30日无自购被跳过,上级C仍正常获得第2代平级0.60元";
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
$order = ['id' => 9904, 'user_id' => 7];
|
||||
$buyerId = 7;
|
||||
$chain = [
|
||||
['user_id' => 2, 'level' => 4],
|
||||
['user_id' => 3, 'level' => 4],
|
||||
@@ -233,13 +264,13 @@ class MakerPeerTest
|
||||
$reward->run($order, $buyerId, $chain, $diffResult, $active);
|
||||
|
||||
$bSkip = Db::name('shopro_partner_reward')
|
||||
->where('order_id', 9903)
|
||||
->where('order_id', 9904)
|
||||
->where('user_id', 3)
|
||||
->where('status', -1)
|
||||
->find();
|
||||
|
||||
$cReward = Db::name('shopro_partner_reward')
|
||||
->where('order_id', 9903)
|
||||
->where('order_id', 9904)
|
||||
->where('user_id', 4)
|
||||
->where('status', 1)
|
||||
->find();
|
||||
@@ -256,28 +287,21 @@ class MakerPeerTest
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 4:V1 等级(level 2,基数 20 元)多代级联
|
||||
* 规则验证:
|
||||
* A: 极差 20.00
|
||||
* B(3): 第1代 20 * 10% = 2.00
|
||||
* C(4): 第2代 2 * 10% = 0.20
|
||||
* D(5): 第3代 0.2 * 10% = 0.02
|
||||
* E(6): 第4代 0.02 * 10% = 0.002 -> 0.00 < 0.01 截断,不发放
|
||||
* 测试 5:V1 等级(level 2,基数 20 元)级联实发2代(2.00 -> 0.20),第3代(0.02 < 0.10)截断
|
||||
*/
|
||||
public function testV1PeerCascade()
|
||||
{
|
||||
$testName = "场景4: V1等级(基数20元)多代级联 (2.00 -> 0.20 -> 0.02) 到0.01以下截断";
|
||||
$testName = "场景5: V1等级(基数20元)实发2代(2.00->0.20),第3代(0.02<0.10)截断";
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
$order = ['id' => 9904, 'user_id' => 7];
|
||||
$order = ['id' => 9905, 'user_id' => 7];
|
||||
$buyerId = 7;
|
||||
$chain = [
|
||||
['user_id' => 2, 'level' => 2], // Level 2 基数 20 (V1)
|
||||
['user_id' => 3, 'level' => 2],
|
||||
['user_id' => 4, 'level' => 2],
|
||||
['user_id' => 5, 'level' => 2],
|
||||
['user_id' => 6, 'level' => 2],
|
||||
];
|
||||
|
||||
$diffResult = [
|
||||
@@ -291,18 +315,16 @@ class MakerPeerTest
|
||||
$reward = new MakerPeerReward();
|
||||
$reward->run($order, $buyerId, $chain, $diffResult, $active);
|
||||
|
||||
$b = Db::name('shopro_partner_reward')->where('order_id', 9904)->where('user_id', 3)->find();
|
||||
$c = Db::name('shopro_partner_reward')->where('order_id', 9904)->where('user_id', 4)->find();
|
||||
$d = Db::name('shopro_partner_reward')->where('order_id', 9904)->where('user_id', 5)->find();
|
||||
$e = Db::name('shopro_partner_reward')->where('order_id', 9904)->where('user_id', 6)->find();
|
||||
$b = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 3)->find();
|
||||
$c = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 4)->find();
|
||||
$d = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 5)->find();
|
||||
|
||||
$bAmt = $b ? floatval($b['amount']) : 0;
|
||||
$cAmt = $c ? floatval($c['amount']) : 0;
|
||||
$dAmt = $d ? floatval($d['amount']) : 0;
|
||||
|
||||
$pass = ($bAmt == 2.00) && ($cAmt == 0.20) && ($dAmt == 0.02) && empty($e);
|
||||
$pass = ($bAmt == 2.00) && ($cAmt == 0.20) && empty($d);
|
||||
|
||||
$this->assert($pass, $testName, "B={$bAmt}(2), C={$cAmt}(0.2), D={$dAmt}(0.02), E=" . (empty($e) ? '已截断' : '未截断'));
|
||||
$this->assert($pass, $testName, "B={$bAmt}(2), C={$cAmt}(0.2), D=" . (empty($d) ? '已截断' : '未截断'));
|
||||
} catch (\Exception $e) {
|
||||
$this->assert(false, $testName, "异常: " . $e->getMessage());
|
||||
} finally {
|
||||
@@ -311,16 +333,15 @@ class MakerPeerTest
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 5:多段平级并存(V1平级 + V3平级在同一推荐链)
|
||||
* 链条:买家(7) -> A(2, V1) -> B(3, V1) -> C(4, V3) -> D(5, V3) -> E(6, V3)
|
||||
* 测试 6:多段平级并存(V1平级 + V3平级在同一推荐链)
|
||||
*/
|
||||
public function testMultiSegmentPeers()
|
||||
{
|
||||
$testName = "场景5: 混合等级链条多段平级互不干扰独立级联";
|
||||
$testName = "场景6: 混合等级链条多段平级互不干扰独立级联";
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
$order = ['id' => 9905, 'user_id' => 7];
|
||||
$order = ['id' => 9906, 'user_id' => 7];
|
||||
$buyerId = 7;
|
||||
$chain = [
|
||||
['user_id' => 2, 'level' => 2], // V1
|
||||
@@ -342,9 +363,9 @@ class MakerPeerTest
|
||||
$reward = new MakerPeerReward();
|
||||
$reward->run($order, $buyerId, $chain, $diffResult, $active);
|
||||
|
||||
$bReward = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 3)->find();
|
||||
$dReward = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 5)->find();
|
||||
$eReward = Db::name('shopro_partner_reward')->where('order_id', 9905)->where('user_id', 6)->find();
|
||||
$bReward = Db::name('shopro_partner_reward')->where('order_id', 9906)->where('user_id', 3)->find();
|
||||
$dReward = Db::name('shopro_partner_reward')->where('order_id', 9906)->where('user_id', 5)->find();
|
||||
$eReward = Db::name('shopro_partner_reward')->where('order_id', 9906)->where('user_id', 6)->find();
|
||||
|
||||
$bAmount = $bReward ? floatval($bReward['amount']) : 0;
|
||||
$dAmount = $dReward ? floatval($dReward['amount']) : 0;
|
||||
|
||||
在新工单中引用
屏蔽一个用户