diff --git a/addons/shopro/service/partner/MakerPeerReward.php b/addons/shopro/service/partner/MakerPeerReward.php index 43bdf8d..414a4dc 100644 --- a/addons/shopro/service/partner/MakerPeerReward.php +++ b/addons/shopro/service/partner/MakerPeerReward.php @@ -3,7 +3,7 @@ namespace addons\shopro\service\partner; /** - * 创客平级 10% / 被超越 5%,只一层 + * 创客平级(支持两代级联:第1代10%,第2代上级收益10%)/ 被超越 5%(只一层) */ class MakerPeerReward { @@ -12,6 +12,7 @@ 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); $paid = $diffResult['paid'] ?? []; $indexByUser = []; foreach ($chain as $i => $node) { @@ -23,26 +24,62 @@ class MakerPeerReward 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; + $currentFrom = $from; + $currentBase = $levelBonus; + $sourceUserId = $item['user_id']; + + for ($gen = 1; $gen <= $maxPeerGenerations; $gen++) { + $peerIdx = $this->findUpIndex($chain, $currentFrom + 1, function ($node) use ($item) { + return intval($node['level']) === intval($item['level']); + }); + if ($peerIdx < 0) { + break; + } + + $peer = $chain[$peerIdx]; + $amount = round($currentBase * $peerRate, 2); + + if (!$active->isActive($peer['agent'] ?? $peer)) { + PartnerRewardService::writeSkip( + $order, + $buyerId, + $peer['user_id'], + 'maker_peer', + 'maker', + 'inactive_30d', + "平级创客(第{$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'], + ] + ); + } + } + + // 下一代平级的寻源起点与计算基数:以当前平级创客为基础,基数变为当前平级奖金(即 6.00) + $currentFrom = $peerIdx; + $currentBase = $amount; + $sourceUserId = $peer['user_id']; + + if ($currentBase <= 0) { + break; + } } - 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)) { @@ -70,13 +107,19 @@ class MakerPeerReward ]); } - protected function findUp($chain, $start, $matcher) + protected function findUpIndex($chain, $start, $matcher) { for ($i = $start; $i < count($chain); $i++) { if ($matcher($chain[$i])) { - return $chain[$i]; + return $i; } } - return null; + return -1; + } + + protected function findUp($chain, $start, $matcher) + { + $idx = $this->findUpIndex($chain, $start, $matcher); + return $idx >= 0 ? $chain[$idx] : null; } } diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php index 8c55447..74c4d23 100755 --- a/application/admin/controller/Index.php +++ b/application/admin/controller/Index.php @@ -117,7 +117,8 @@ class Index extends Backend $background = $background ? (stripos($background, 'http') === 0 ? $background : config('site.cdnurl') . $background) : ''; $this->view->assign('keeyloginhours', $keeyloginhours); $this->view->assign('background', $background); - $this->view->assign('title', __('Login')); + $siteName = Config::get('site.name'); + $this->view->assign('title', ($siteName ? $siteName . ' · ' : '') . __('Login')); Hook::listen("admin_login_init", $this->request); return $this->view->fetch(); } diff --git a/application/admin/lang/zh-cn.php b/application/admin/lang/zh-cn.php index f0e1bc4..3933994 100755 --- a/application/admin/lang/zh-cn.php +++ b/application/admin/lang/zh-cn.php @@ -14,6 +14,14 @@ return [ 'Keep login' => '保持会话', 'Guest' => '游客', 'Welcome' => '%s,你好!', + 'Welcome back' => '欢迎回来', + 'Admin console' => '运营控制台', + 'Sign in to continue' => '使用管理员账号继续', + 'Show password' => '显示密码', + 'Hide password' => '隐藏密码', + 'Secure session' => '安全会话', + 'Audited actions' => '操作留痕', + 'Role based access' => '权限可控', 'View' => '查看', 'Add' => '添加', 'Edit' => '编辑', diff --git a/application/admin/view/index/login.html b/application/admin/view/index/login.html index a21d420..bf7f9b2 100755 --- a/application/admin/view/index/login.html +++ b/application/admin/view/index/login.html @@ -1,145 +1,617 @@ - + {include file="common/meta" /} - + + + - - {if $background} - + to { + opacity: 1; + transform: translateY(0); + } + } + + @media (max-width: 900px) { + .login-shell { + grid-template-columns: 1fr; + } + + .login-brand { + min-height: 240px; + padding: 28px 24px 24px; + } + + .brand-copy { + padding: 20px 0 8px; + } + + .brand-copy h1 { + font-size: 32px; + } + + .brand-copy p, + .brand-points { + display: none; + } + + .login-panel { + align-items: flex-start; + padding: 28px 20px 40px; + } + } + + @media (prefers-reduced-motion: reduce) { + .login-rise, + body.login-body .login-submit.btn { + animation: none; + transition: none; + } + } + + {if $background} + {/if} - - -
-
-