feat(partner): 全网平级奖支持逐代10%级联递减至0.01元截断机制

这个提交包含在:
chen
2026-09-17 14:04:28 +08:00
父节点 1f67b0a970
当前提交 5f9b407e64
共有 6 个文件被更改,包括 450 次插入 和 78 次删除

查看文件

@@ -3,7 +3,7 @@
namespace addons\shopro\service\partner;
/**
* 创客平级(支持两代级联:第1代10%,第2代上级收益10%)/ 被超越 5%(只一层)
* 创客平级(逐代 10% 递减级联,最低发放 0.01 元后截断)/ 被超越 5%(只一层)
*/
class MakerPeerReward
{
@@ -12,7 +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);
$maxPeerGenerations = (int) PartnerConfig::get('partner_maker_peer_max_generations', 2);
$maxPeerGenerations = (int) PartnerConfig::get('partner_maker_peer_max_generations', 50);
if ($maxPeerGenerations <= 0) {
$maxPeerGenerations = 50;
}
$paid = $diffResult['paid'] ?? [];
$indexByUser = [];
foreach ($chain as $i => $node) {
@@ -40,6 +43,9 @@ class MakerPeerReward
$peer = $chain[$peerIdx];
$amount = round($currentBase * $peerRate, 2);
if ($amount < 0.01) {
break;
}
if (!$active->isActive($peer['agent'] ?? $peer)) {
PartnerRewardService::writeSkip(
@@ -52,31 +58,29 @@ class MakerPeerReward
"平级创客(第{$gen}代) 30 日无自购"
);
} else {
if ($amount > 0) {
PartnerRewardService::account(
$order,
$buyerId,
$peer['user_id'],
'maker_peer',
'maker',
$amount,
$currentBase,
[
'generation' => $gen,
'formula' => "平级(第{$gen}代) {$currentBase} × " . ($peerRate * 100) . "% = {$amount}",
'from_user_id' => $sourceUserId,
'level' => $item['level'],
]
);
}
PartnerRewardService::account(
$order,
$buyerId,
$peer['user_id'],
'maker_peer',
'maker',
$amount,
$currentBase,
[
'generation' => $gen,
'formula' => "平级(第{$gen}代) {$currentBase} × " . ($peerRate * 100) . "% = {$amount}",
'from_user_id' => $sourceUserId,
'level' => $item['level'],
]
);
}
// 下一代平级的寻源起点与计算基数:以当前平级创客为基础,基数变为当前平级奖金(即 6.00)
// 下一代平级的寻源起点与计算基数:以当前平级创客为基础,基数变为当前平级奖金
$currentFrom = $peerIdx;
$currentBase = $amount;
$sourceUserId = $peer['user_id'];
if ($currentBase <= 0) {
if ($currentBase < 0.01) {
break;
}
}
@@ -98,7 +102,7 @@ class MakerPeerReward
PartnerRewardService::writeSkip($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', 'inactive_30d', '被超越创客 30 日无自购');
return;
}
if ($amount <= 0) {
if ($amount < 0.01) {
return;
}
PartnerRewardService::account($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', $amount, $highest['cap'], [

查看文件

@@ -3,7 +3,7 @@
namespace addons\shopro\service\partner;
/**
* 酒道馆 / 区县平级 10%,基数为本单该下级的团队奖
* 酒道馆 / 区县平级 10% 逐代递减级联,最低发放 0.01 元截断
*/
class PeerShareReward
{
@@ -22,29 +22,67 @@ class PeerShareReward
protected function peer($order, $buyerId, $chain, $from, $flag, $type, $role, $rate, ActiveService $active, $label)
{
$start = intval($from['index']) + 1;
$peer = null;
for ($i = $start; $i < count($chain); $i++) {
if (intval($chain[$i][$flag] ?? 0)) {
$peer = $chain[$i];
$maxGenerations = intval(PartnerConfig::get("partner_{$role}_peer_max_generations", 50));
if ($maxGenerations <= 0) {
$maxGenerations = 50;
}
$currentFrom = intval($from['index']);
$currentBase = (float) $from['amount'];
$sourceUserId = $from['user_id'];
for ($gen = 1; $gen <= $maxGenerations; $gen++) {
$peerIdx = -1;
for ($i = $currentFrom + 1; $i < count($chain); $i++) {
if (intval($chain[$i][$flag] ?? 0)) {
$peerIdx = $i;
break;
}
}
if ($peerIdx < 0) {
break;
}
$peer = $chain[$peerIdx];
$amount = round($currentBase * $rate, 2);
if ($amount < 0.01) {
break;
}
if (!$active->isActive($peer['agent'] ?? $peer)) {
PartnerRewardService::writeSkip(
$order,
$buyerId,
$peer['user_id'],
$type,
$role,
'inactive_30d',
"{$label}平级(第{$gen}代) 30 日无自购"
);
} else {
PartnerRewardService::account(
$order,
$buyerId,
$peer['user_id'],
$type,
$role,
$amount,
$currentBase,
[
'generation' => $gen,
'formula' => "{$label}平级(第{$gen}代) {$currentBase} × " . ($rate * 100) . "% = {$amount}",
'from_user_id' => $sourceUserId,
]
);
}
$currentFrom = $peerIdx;
$currentBase = $amount;
$sourceUserId = $peer['user_id'];
if ($currentBase < 0.01) {
break;
}
}
if (!$peer) {
return;
}
$base = (float) $from['amount'];
$amount = round($base * $rate, 2);
if (!$active->isActive($peer['agent'] ?? $peer)) {
PartnerRewardService::writeSkip($order, $buyerId, $peer['user_id'], $type, $role, 'inactive_30d', "{$label}平级 30 日无自购");
return;
}
if ($amount <= 0) {
return;
}
PartnerRewardService::account($order, $buyerId, $peer['user_id'], $type, $role, $amount, $base, [
'formula' => "{$label}平级 {$base} × " . ($rate * 100) . "% = {$amount}",
'from_user_id' => $from['user_id'],
]);
}
}