peer($order, $buyerId, $chain, $teamResult['venue'], 'is_venue', 'venue_peer', 'venue', $venueRate, $active, '酒道馆'); } if (!empty($teamResult['county'])) { $this->peer($order, $buyerId, $chain, $teamResult['county'], 'is_county', 'county_peer', 'county', $countyRate, $active, '区县'); } } protected function peer($order, $buyerId, $chain, $from, $flag, $type, $role, $rate, ActiveService $active, $label) { $minAmount = (float) PartnerConfig::get('partner_peer_min_amount', 0.10); if ($minAmount <= 0) { $minAmount = 0.10; } $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 < $minAmount) { break; // 收益少于 0.10 元,上级平级不再拿,严格截断 } 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 < $minAmount) { break; } } } }