fix(partner): 创客协同第1代按下级实得进阶奖计算
同级第1代不再用等级标准基数,改为下级本单实际拿到的创客进阶奖乘比例。 Co-authored-by: Cursor <cursoragent@cursor.com>
这个提交包含在:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 执行测试
|
||||
|
||||
在新工单中引用
屏蔽一个用户