| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- <?php
- namespace App\Module\UrsPromotion\Commands;
- use App\Module\UrsPromotion\Services\UrsPartnerDividendService;
- use Illuminate\Console\Command;
- use Carbon\Carbon;
- /**
- * URS合伙人分红命令
- *
- * 用于执行每日合伙人分红任务
- */
- class UrsPartnerDividendCommand extends Command
- {
- /**
- * 命令签名
- */
- protected $signature = 'urs-promotion:partner-dividend
- {--date= : 指定分红日期,格式:Y-m-d,默认为今天}
- {--force : 强制执行,即使已经分红过}';
- /**
- * 命令描述
- */
- protected $description = 'URS合伙人分红 - 顶级达人享受手续费分红';
- /**
- * 执行命令
- */
- public function handle(): int
- {
- $this->info('=== URS合伙人分红任务开始 ===');
- // 获取分红日期
- $date = $this->option('date') ?: Carbon::today()->format('Y-m-d');
- $force = $this->option('force');
- $this->info("分红日期: {$date}");
- // 验证日期格式
- if (!$this->validateDate($date)) {
- $this->error('日期格式错误,请使用 Y-m-d 格式,例如:2025-06-25');
- return self::FAILURE;
- }
- // 如果不是强制执行,检查是否已经分红
- if (!$force) {
- if (\App\Module\UrsPromotion\Models\UrsPartnerDividendRecord::isDividendProcessed($date)) {
- $this->warn("日期 {$date} 的分红已经处理过了,如需重新执行请使用 --force 参数");
- return self::SUCCESS;
- }
- }
- // 显示合伙人信息
- $this->showPartnerInfo();
- // 执行分红
- $this->info('开始执行分红...');
- $result = UrsPartnerDividendService::executeDailyDividend($date);
- if ($result['success']) {
- $this->info('✅ 分红执行成功!');
- $this->displayResult($result['data']);
- } else {
- $this->error('❌ 分红执行失败:' . $result['message']);
- return self::FAILURE;
- }
- $this->info('=== URS合伙人分红任务完成 ===');
- return self::SUCCESS;
- }
- /**
- * 验证日期格式
- */
- private function validateDate(string $date): bool
- {
- try {
- Carbon::createFromFormat('Y-m-d', $date);
- return true;
- } catch (\Exception $e) {
- return false;
- }
- }
- /**
- * 显示合伙人信息
- */
- private function showPartnerInfo(): void
- {
- $this->info('获取合伙人信息...');
-
- $partnerResult = UrsPartnerDividendService::getPartnerList();
- if ($partnerResult['success']) {
- $partners = $partnerResult['data'];
- $this->info("当前合伙人数量: {$partnerResult['total']}");
-
- if (!empty($partners)) {
- $this->table(
- ['用户ID', 'URS用户ID', '用户名', '达人等级', '成为合伙人时间'],
- array_map(function ($partner) {
- return [
- $partner['user_id'],
- $partner['urs_user_id'],
- $partner['username'],
- $partner['talent_level_name'],
- $partner['created_at']
- ];
- }, array_slice($partners, 0, 10)) // 只显示前10个
- );
-
- if (count($partners) > 10) {
- $this->info("... 还有 " . (count($partners) - 10) . " 个合伙人");
- }
- }
- } else {
- $this->warn('获取合伙人信息失败: ' . $partnerResult['message']);
- }
- }
- /**
- * 显示分红结果
- */
- private function displayResult(array $data): void
- {
- $this->info('');
- $this->info('📊 分红结果统计:');
- $this->info("分红日期: {$data['date']}");
- $this->info("当日总手续费: {$data['total_fee_amount']} 钻石");
- $this->info("分红总金额: {$data['dividend_amount']} 钻石 (20%)");
- $this->info("合伙人数量: {$data['partner_count']} 人");
- $this->info("每人分红: {$data['per_partner_amount']} 钻石");
- $this->info("成功转账: {$data['success_count']} 人");
-
- if ($data['failed_count'] > 0) {
- $this->warn("失败转账: {$data['failed_count']} 人");
- }
- // 计算成功率
- $successRate = $data['partner_count'] > 0 ?
- round($data['success_count'] / $data['partner_count'] * 100, 2) : 0;
- $this->info("成功率: {$successRate}%");
- }
- }
|