文件
Henglianshutong/addons/shopro/service/partner/MakerPeerReward.php

83 行
3.1 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace addons\shopro\service\partner;
/**
* 创客平级 10% / 被超越 5%,只一层
*/
class MakerPeerReward
{
public function run($order, $buyerId, $chain, $diffResult, ActiveService $active)
{
$bonus = PartnerConfig::makerBonus();
$peerRate = (float) PartnerConfig::get('partner_maker_peer_rate', 0.10);
$overRate = (float) PartnerConfig::get('partner_maker_overtaken_rate', 0.05);
$paid = $diffResult['paid'] ?? [];
$indexByUser = [];
foreach ($chain as $i => $node) {
$indexByUser[$node['user_id']] = $i;
}
foreach ($paid as $item) {
$from = $indexByUser[$item['user_id']] ?? -1;
if ($from < 0) {
continue;
}
$peer = $this->findUp($chain, $from + 1, function ($node) use ($item) {
return intval($node['level']) === intval($item['level']);
});
if (!$peer) {
continue;
}
$levelBonus = (float) ($bonus[$item['level']] ?? 0);
$amount = round($levelBonus * $peerRate, 2);
if (!$active->isActive($peer['agent'] ?? $peer)) {
PartnerRewardService::writeSkip($order, $buyerId, $peer['user_id'], 'maker_peer', 'maker', 'inactive_30d', '平级创客 30 日无自购');
continue;
}
if ($amount <= 0) {
continue;
}
PartnerRewardService::account($order, $buyerId, $peer['user_id'], 'maker_peer', 'maker', $amount, $levelBonus, [
'formula' => "平级 {$levelBonus} × " . ($peerRate * 100) . "% = {$amount}",
'from_user_id' => $item['user_id'],
'level' => $item['level'],
]);
}
if (empty($paid)) {
return;
}
$highest = $paid[count($paid) - 1];
$from = $indexByUser[$highest['user_id']] ?? -1;
$lower = $this->findUp($chain, $from + 1, function ($node) use ($highest) {
return intval($node['level']) >= 2 && intval($node['level']) < intval($highest['level']);
});
if (!$lower) {
return;
}
$amount = round((float) $highest['cap'] * $overRate, 2);
if (!$active->isActive($lower['agent'] ?? $lower)) {
PartnerRewardService::writeSkip($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', 'inactive_30d', '被超越创客 30 日无自购');
return;
}
if ($amount <= 0) {
return;
}
PartnerRewardService::account($order, $buyerId, $lower['user_id'], 'maker_overtaken', 'maker', $amount, $highest['cap'], [
'formula' => "超越奖 最高水位 {$highest['cap']} × " . ($overRate * 100) . "% = {$amount}",
'from_user_id' => $highest['user_id'],
]);
}
protected function findUp($chain, $start, $matcher)
{
for ($i = $start; $i < count($chain); $i++) {
if ($matcher($chain[$i])) {
return $chain[$i];
}
}
return null;
}
}