From ecdee1f53ac9e425f292a4c877bc070cdb01899d Mon Sep 17 00:00:00 2001 From: chen Date: Thu, 22 Oct 2026 08:58:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(partner):=20=E5=88=9B=E5=AE=A2=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=E7=AC=AC1=E4=BB=A3=E6=8C=89=E4=B8=8B=E7=BA=A7?= =?UTF-8?q?=E5=AE=9E=E5=BE=97=E8=BF=9B=E9=98=B6=E5=A5=96=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同级第1代不再用等级标准基数,改为下级本单实际拿到的创客进阶奖乘比例。 Co-authored-by: Cursor --- .../service/partner/MakerPeerReward.php | 14 +++--- tests/partner/MakerPeerTest.php | 47 ++++++++++++++++++- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/addons/shopro/service/partner/MakerPeerReward.php b/addons/shopro/service/partner/MakerPeerReward.php index 5cbb26a..d609204 100644 --- a/addons/shopro/service/partner/MakerPeerReward.php +++ b/addons/shopro/service/partner/MakerPeerReward.php @@ -3,15 +3,13 @@ namespace addons\shopro\service\partner; /** - * 创客协同(逐代 10% 递减级联,最低发放不能少于 0.10 元截断)/ 创客卓越 5%(只一层) + * 创客协同:第 1 代按下级本单实得进阶奖 × 比例,之后每代按上一笔协同奖 × 比例,低于 0.10 元截断。 + * 创客卓越 5% 只发一层。 */ class MakerPeerReward { public function run($order, $buyerId, $chain, $diffResult, ActiveService $active, $rules = null) { - $bonus = (!empty($rules['maker_bonus']) && is_array($rules['maker_bonus'])) - ? $rules['maker_bonus'] - : PartnerConfig::makerBonus(); $peerRate = (isset($rules['maker_peer_rate']) && is_numeric($rules['maker_peer_rate'])) ? (float) $rules['maker_peer_rate'] : (float) PartnerConfig::get('partner_maker_peer_rate', 0.10); @@ -38,9 +36,13 @@ class MakerPeerReward continue; } - $levelBonus = (float) ($bonus[$item['level']] ?? 0); + $itemAmount = (float) ($item['amount'] ?? 0); + if ($itemAmount <= 0) { + continue; + } + $currentFrom = $from; - $currentBase = $levelBonus; + $currentBase = $itemAmount; $sourceUserId = $item['user_id']; for ($gen = 1; $gen <= $maxPeerGenerations; $gen++) { diff --git a/tests/partner/MakerPeerTest.php b/tests/partner/MakerPeerTest.php index fcfe9e8..f2f88e8 100644 --- a/tests/partner/MakerPeerTest.php +++ b/tests/partner/MakerPeerTest.php @@ -58,6 +58,7 @@ class MakerPeerTest $this->testInactiveIntermediaryCascade(); $this->testV1PeerCascade(); $this->testMultiSegmentPeers(); + $this->testV6PartialDiffPeerReward(); echo "\n--------------------------------------------------------\n"; echo "测试执行结果: 通过 {$this->passed} 项, 失败 {$this->failed} 项\n"; @@ -372,9 +373,9 @@ class MakerPeerTest $eAmount = $eReward ? floatval($eReward['amount']) : 0; $this->assert( - $bAmount == 2.00 && $dAmount == 6.00 && $eAmount == 0.60, + $bAmount == 2.00 && $dAmount == 4.00 && $eAmount == 0.40, $testName, - "B(V1平级1)={$bAmount}(期2.00), D(V3平级1)={$dAmount}(期6.00), E(V3平级2)={$eAmount}(期0.60)" + "B(V1平级1)={$bAmount}(期2.00), D(V3平级1)={$dAmount}(期4.00), E(V3平级2)={$eAmount}(期0.40)" ); } catch (\Exception $e) { $this->assert(false, $testName, "异常: " . $e->getMessage()); @@ -382,6 +383,48 @@ class MakerPeerTest Db::rollback(); } } + + /** + * 测试 7:HL9777场景——V6创客实际拿60进阶奖(120-60),上位同级V6拿实得收益的10%即6元 + */ + public function testV6PartialDiffPeerReward() + { + $testName = "场景7: V6创客实拿60元进阶奖,上位平级V6按实得10%拿6.00元"; + + Db::startTrans(); + try { + $order = ['id' => 9907, 'user_id' => 66]; + $buyerId = 66; + $chain = [ + ['user_id' => 9, 'level' => 4], // V3 + ['user_id' => 4, 'level' => 7], // V6 (实得120-60=60) + ['user_id' => 2, 'level' => 7], // V6 (同级平级,应得60*10%=6元) + ]; + + $diffResult = [ + 'seen' => 120.0, + 'paid' => [ + ['user_id' => 9, 'level' => 4, 'cap' => 60.0, 'amount' => 60.0], + ['user_id' => 4, 'level' => 7, 'cap' => 120.0, 'amount' => 60.0], + ] + ]; + + $active = new MockActiveService(); + $reward = new MakerPeerReward(); + $reward->run($order, $buyerId, $chain, $diffResult, $active); + + $peerReward = Db::name('shopro_partner_reward')->where('order_id', 9907)->where('user_id', 2)->find(); + $peerAmount = $peerReward ? floatval($peerReward['amount']) : 0; + $peerExt = $peerReward ? json_decode($peerReward['ext'], true) : []; + + $pass = ($peerAmount == 6.00) && (($peerExt['generation'] ?? 0) == 1); + $this->assert($pass, $testName, "上位V6平级金额={$peerAmount}(期6.00)"); + } catch (\Exception $e) { + $this->assert(false, $testName, "异常: " . $e->getMessage()); + } finally { + Db::rollback(); + } + } } // 执行测试