From 2ccd69b9e7adf6ddc1f787e5eda875804176ddfb Mon Sep 17 00:00:00 2001 From: chen Date: Thu, 17 Sep 2026 14:08:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(partner):=20=E5=85=A8=E7=BD=91=E5=B9=B3?= =?UTF-8?q?=E7=BA=A7=E5=A5=96=E6=88=AA=E6=96=AD=E9=98=88=E5=80=BC=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E4=B8=BA=E4=B8=8D=E8=83=BD=E5=B0=91=E4=BA=8E0.10?= =?UTF-8?q?=E5=85=83=EF=BC=881=E8=A7=92=E9=92=B1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/partner/MakerPeerReward.php | 14 +- .../service/partner/PeerShareReward.php | 13 +- tests/partner/MakerPeerTest.php | 141 ++++++++++-------- tests/partner/PeerShareTest.php | 64 +++----- 4 files changed, 122 insertions(+), 110 deletions(-) diff --git a/addons/shopro/service/partner/MakerPeerReward.php b/addons/shopro/service/partner/MakerPeerReward.php index 1c79d02..4e0d587 100644 --- a/addons/shopro/service/partner/MakerPeerReward.php +++ b/addons/shopro/service/partner/MakerPeerReward.php @@ -3,7 +3,7 @@ namespace addons\shopro\service\partner; /** - * 创客平级(逐代 10% 递减级联,最低发放 0.01 元后截断)/ 被超越 5%(只一层) + * 创客平级(逐代 10% 递减级联,最低发放不能少于 0.10 元截断)/ 被超越 5%(只一层) */ class MakerPeerReward { @@ -12,6 +12,10 @@ class MakerPeerReward $bonus = PartnerConfig::makerBonus(); $peerRate = (float) PartnerConfig::get('partner_maker_peer_rate', 0.10); $overRate = (float) PartnerConfig::get('partner_maker_overtaken_rate', 0.05); + $minAmount = (float) PartnerConfig::get('partner_peer_min_amount', 0.10); + if ($minAmount <= 0) { + $minAmount = 0.10; + } $maxPeerGenerations = (int) PartnerConfig::get('partner_maker_peer_max_generations', 50); if ($maxPeerGenerations <= 0) { $maxPeerGenerations = 50; @@ -43,8 +47,8 @@ class MakerPeerReward $peer = $chain[$peerIdx]; $amount = round($currentBase * $peerRate, 2); - if ($amount < 0.01) { - break; + if ($amount < $minAmount) { + break; // 收益少于 0.10 元,上级平级不再拿,严格截断 } if (!$active->isActive($peer['agent'] ?? $peer)) { @@ -80,7 +84,7 @@ class MakerPeerReward $currentBase = $amount; $sourceUserId = $peer['user_id']; - if ($currentBase < 0.01) { + if ($currentBase < $minAmount) { break; } } @@ -102,7 +106,7 @@ class MakerPeerReward PartnerRewardService::writeSkip($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', 'inactive_30d', '被超越创客 30 日无自购'); return; } - if ($amount < 0.01) { + if ($amount < $minAmount) { return; } PartnerRewardService::account($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', $amount, $highest['cap'], [ diff --git a/addons/shopro/service/partner/PeerShareReward.php b/addons/shopro/service/partner/PeerShareReward.php index 8ddbf5c..778a727 100644 --- a/addons/shopro/service/partner/PeerShareReward.php +++ b/addons/shopro/service/partner/PeerShareReward.php @@ -3,7 +3,7 @@ namespace addons\shopro\service\partner; /** - * 酒道馆 / 区县平级 10% 逐代递减级联,最低发放 0.01 元截断 + * 酒道馆 / 区县平级 10% 逐代递减级联,最低发放不能少于 0.10 元截断 */ class PeerShareReward { @@ -22,6 +22,11 @@ class PeerShareReward protected function peer($order, $buyerId, $chain, $from, $flag, $type, $role, $rate, ActiveService $active, $label) { + $minAmount = (float) PartnerConfig::get('partner_peer_min_amount', 0.10); + if ($minAmount <= 0) { + $minAmount = 0.10; + } + $maxGenerations = intval(PartnerConfig::get("partner_{$role}_peer_max_generations", 50)); if ($maxGenerations <= 0) { $maxGenerations = 50; @@ -45,8 +50,8 @@ class PeerShareReward $peer = $chain[$peerIdx]; $amount = round($currentBase * $rate, 2); - if ($amount < 0.01) { - break; + if ($amount < $minAmount) { + break; // 收益少于 0.10 元,上级平级不再拿,严格截断 } if (!$active->isActive($peer['agent'] ?? $peer)) { @@ -80,7 +85,7 @@ class PeerShareReward $currentBase = $amount; $sourceUserId = $peer['user_id']; - if ($currentBase < 0.01) { + if ($currentBase < $minAmount) { break; } } diff --git a/tests/partner/MakerPeerTest.php b/tests/partner/MakerPeerTest.php index c971986..fcfe9e8 100644 --- a/tests/partner/MakerPeerTest.php +++ b/tests/partner/MakerPeerTest.php @@ -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; diff --git a/tests/partner/PeerShareTest.php b/tests/partner/PeerShareTest.php index 0511670..72071af 100644 --- a/tests/partner/PeerShareTest.php +++ b/tests/partner/PeerShareTest.php @@ -46,12 +46,12 @@ class PeerShareTest public function run() { echo "========================================================\n"; - echo " 酒道馆/区县平级逐代递减级联至0.01截断测试 (Peer Share) \n"; + echo " 酒道馆/区县平级逐代递减级联至0.10截断测试 (Peer Share) \n"; echo "========================================================\n\n"; - $this->testVenuePeerCascadeToCent(); - $this->testCountyPeerWithVenueCascadeToCent(); - $this->testCountyPeerNoVenueCascadeToCent(); + $this->testVenuePeerCascadeToTenCent(); + $this->testCountyPeerWithVenueCascadeToTenCent(); + $this->testCountyPeerNoVenueCascadeToTenCent(); $this->testVenuePeerInactiveIntermediary(); echo "\n--------------------------------------------------------\n"; @@ -73,17 +73,15 @@ class PeerShareTest /** * 测试 1:酒道馆平级逐代递减级联(基数 50 元) - * 链条:买家(7) -> 馆A(2) -> 馆B(3) -> 馆C(4) -> 馆D(5) -> 馆E(6) -> 馆F(8) * 预期: * 馆B(3): 第1代 50 * 10% = 5.00 * 馆C(4): 第2代 5 * 10% = 0.50 - * 馆D(5): 第3代 0.5 * 10% = 0.05 - * 馆E(6): 第4代 0.05 * 10% = 0.005 -> round 0.01 - * 馆F(8): 第5代 0.01 * 10% = 0.001 -> round 0.00 < 0.01,截断不发放 + * 馆D(5): 第3代 0.5 * 10% = 0.05 < 0.10,截断不发放 + * 馆E(6): 截断不发放 */ - public function testVenuePeerCascadeToCent() + public function testVenuePeerCascadeToTenCent() { - $testName = "酒道馆: 平级逐代递减(5.00 -> 0.50 -> 0.05 -> 0.01) 到0.01截断"; + $testName = "酒道馆: 实发2代(5.00 -> 0.50),第3代(0.05<0.10)截断不发"; Db::startTrans(); try { @@ -95,7 +93,6 @@ class PeerShareTest ['user_id' => 4, 'is_venue' => 1], // 馆C ['user_id' => 5, 'is_venue' => 1], // 馆D ['user_id' => 6, 'is_venue' => 1], // 馆E - ['user_id' => 8, 'is_venue' => 1], // 馆F ]; $teamResult = [ @@ -111,16 +108,13 @@ class PeerShareTest $c = Db::name('shopro_partner_reward')->where('order_id', 9911)->where('user_id', 4)->where('reward_type', 'venue_peer')->find(); $d = Db::name('shopro_partner_reward')->where('order_id', 9911)->where('user_id', 5)->where('reward_type', 'venue_peer')->find(); $e = Db::name('shopro_partner_reward')->where('order_id', 9911)->where('user_id', 6)->where('reward_type', 'venue_peer')->find(); - $f = Db::name('shopro_partner_reward')->where('order_id', 9911)->where('user_id', 8)->where('reward_type', 'venue_peer')->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 == 5.00) && ($cAmt == 0.50) && ($dAmt == 0.05) && ($eAmt == 0.01) && empty($f); + $pass = ($bAmt == 5.00) && ($cAmt == 0.50) && empty($d) && empty($e); - $this->assert($pass, $testName, "B={$bAmt}(5), C={$cAmt}(0.5), D={$dAmt}(0.05), E={$eAmt}(0.01), F=" . (empty($f) ? '已截断' : '未截断')); + $this->assert($pass, $testName, "B={$bAmt}(5), C={$cAmt}(0.5), D=" . (empty($d) ? '已截断' : '未截断') . ", E=" . (empty($e) ? '已截断' : '未截断')); } catch (\Exception $e) { $this->assert(false, $testName, "异常: " . $e->getMessage()); } finally { @@ -129,17 +123,15 @@ class PeerShareTest } /** - * 测试 2:区县代理(有馆拆分场景,基数 50 元)逐代递减级联至 0.01 截断 + * 测试 2:区县代理(有馆拆分场景,基数 50 元)逐代递减级联至 0.10 截断 * 预期: * 县B(3): 第1代 50 * 10% = 5.00 * 县C(4): 第2代 0.50 - * 县D(5): 第3代 0.05 - * 县E(6): 第4代 0.01 - * 县F(8): 截断 + * 县D(5): 第3代 0.05 < 0.10,截断 */ - public function testCountyPeerWithVenueCascadeToCent() + public function testCountyPeerWithVenueCascadeToTenCent() { - $testName = "区县代理(有馆): 平级逐代递减(5.00 -> 0.50 -> 0.05 -> 0.01) 到0.01截断"; + $testName = "区县代理(有馆): 实发2代(5.00 -> 0.50),第3代(0.05<0.10)截断"; Db::startTrans(); try { @@ -150,8 +142,6 @@ class PeerShareTest ['user_id' => 3, 'is_county' => 1], ['user_id' => 4, 'is_county' => 1], ['user_id' => 5, 'is_county' => 1], - ['user_id' => 6, 'is_county' => 1], - ['user_id' => 8, 'is_county' => 1], ]; $teamResult = [ @@ -166,17 +156,13 @@ class PeerShareTest $b = Db::name('shopro_partner_reward')->where('order_id', 9912)->where('user_id', 3)->where('reward_type', 'county_peer')->find(); $c = Db::name('shopro_partner_reward')->where('order_id', 9912)->where('user_id', 4)->where('reward_type', 'county_peer')->find(); $d = Db::name('shopro_partner_reward')->where('order_id', 9912)->where('user_id', 5)->where('reward_type', 'county_peer')->find(); - $e = Db::name('shopro_partner_reward')->where('order_id', 9912)->where('user_id', 6)->where('reward_type', 'county_peer')->find(); - $f = Db::name('shopro_partner_reward')->where('order_id', 9912)->where('user_id', 8)->where('reward_type', 'county_peer')->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 == 5.00) && ($cAmt == 0.50) && ($dAmt == 0.05) && ($eAmt == 0.01) && empty($f); + $pass = ($bAmt == 5.00) && ($cAmt == 0.50) && empty($d); - $this->assert($pass, $testName, "B={$bAmt}(5), C={$cAmt}(0.5), D={$dAmt}(0.05), E={$eAmt}(0.01), F=" . (empty($f) ? '已截断' : '未截断')); + $this->assert($pass, $testName, "B={$bAmt}(5), C={$cAmt}(0.5), D=" . (empty($d) ? '已截断' : '未截断')); } catch (\Exception $e) { $this->assert(false, $testName, "异常: " . $e->getMessage()); } finally { @@ -185,17 +171,16 @@ class PeerShareTest } /** - * 测试 3:区县代理(无馆独享全额 100 元)逐代递减级联至 0.01 截断 + * 测试 3:区县代理(无馆独享全额 100 元)逐代递减级联实发3代(10.00 -> 1.00 -> 0.10),第4代截断 * 预期: * 县B(3): 第1代 100 * 10% = 10.00 * 县C(4): 第2代 10 * 10% = 1.00 - * 县D(5): 第3代 1 * 10% = 0.10 - * 县E(6): 第4代 0.10 * 10% = 0.01 - * 县F(8): 第5代 0.01 * 10% = 0.001 -> 0.00 截断 + * 县D(5): 第3代 1 * 10% = 0.10 (>= 0.10) + * 县E(6): 第4代 0.10 * 10% = 0.01 < 0.10,截断 */ - public function testCountyPeerNoVenueCascadeToCent() + public function testCountyPeerNoVenueCascadeToTenCent() { - $testName = "区县代理(无馆): 平级逐代递减(10.00 -> 1.00 -> 0.10 -> 0.01) 到0.01截断"; + $testName = "区县代理(无馆): 实发3代(10.00 -> 1.00 -> 0.10),第4代(0.01<0.10)截断"; Db::startTrans(); try { @@ -207,7 +192,6 @@ class PeerShareTest ['user_id' => 4, 'is_county' => 1], ['user_id' => 5, 'is_county' => 1], ['user_id' => 6, 'is_county' => 1], - ['user_id' => 8, 'is_county' => 1], ]; $teamResult = [ @@ -223,16 +207,14 @@ class PeerShareTest $c = Db::name('shopro_partner_reward')->where('order_id', 9913)->where('user_id', 4)->where('reward_type', 'county_peer')->find(); $d = Db::name('shopro_partner_reward')->where('order_id', 9913)->where('user_id', 5)->where('reward_type', 'county_peer')->find(); $e = Db::name('shopro_partner_reward')->where('order_id', 9913)->where('user_id', 6)->where('reward_type', 'county_peer')->find(); - $f = Db::name('shopro_partner_reward')->where('order_id', 9913)->where('user_id', 8)->where('reward_type', 'county_peer')->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 == 10.00) && ($cAmt == 1.00) && ($dAmt == 0.10) && ($eAmt == 0.01) && empty($f); + $pass = ($bAmt == 10.00) && ($cAmt == 1.00) && ($dAmt == 0.10) && empty($e); - $this->assert($pass, $testName, "B={$bAmt}(10), C={$cAmt}(1), D={$dAmt}(0.1), E={$eAmt}(0.01), F=" . (empty($f) ? '已截断' : '未截断')); + $this->assert($pass, $testName, "B={$bAmt}(10), C={$cAmt}(1), D={$dAmt}(0.10), E=" . (empty($e) ? '已截断' : '未截断')); } catch (\Exception $e) { $this->assert(false, $testName, "异常: " . $e->getMessage()); } finally {