fix(partner): 创客协同第1代按下级实得进阶奖计算

同级第1代不再用等级标准基数,改为下级本单实际拿到的创客进阶奖乘比例。

Co-authored-by: Cursor <cursoragent@cursor.com>
这个提交包含在:
chen
2026-10-22 08:58:26 +08:00
父节点 092155c645
当前提交 ecdee1f53a
共有 2 个文件被更改,包括 53 次插入 和 8 次删除

查看文件

@@ -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++) {

查看文件

@@ -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();
}
}
}
// 执行测试