| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <?php
- namespace App\Module\UrsPromotion\Commands;
- use App\Module\UrsPromotion\Services\UrsPartnerDividendService;
- use Illuminate\Console\Command;
- use Carbon\Carbon;
- /**
- * URS合伙人分红命令
- *
- * 用于执行每日合伙人分红任务
- * php artisan urs-promotion:partner-dividend
- */
- class UrsPartnerDividendCommand extends Command
- {
- /**
- * 命令签名
- */
- protected $signature = 'urs-promotion:partner-dividend
- {--date= : 指定分红日期,格式:Y-m-d,默认为昨天}
- {--force : 强制执行,即使已经分红过}
- {--retry : 重试失败的分红}';
- /**
- * 命令描述
- */
- protected $description = 'URS合伙人分红 - 顶级达人享受手续费分红';
- /**
- * 执行命令
- */
- public function handle(): int
- {
- $this->info('=== URS合伙人分红任务开始 ===');
- // 获取分红日期,默认为昨天
- $date = $this->option('date') ?: Carbon::yesterday()->format('Y-m-d');
- $force = $this->option('force');
- $retry = $this->option('retry');
- $this->info("分红日期: {$date}");
- // 验证日期格式
- if (!$this->validateDate($date)) {
- $this->error('日期格式错误,请使用 Y-m-d 格式,例如:2025-06-25');
- return self::FAILURE;
- }
- // 如果是重试模式
- if ($retry) {
- $this->info('重试失败的分红...');
- $result = UrsPartnerDividendService::retryFailedDividend($date);
- if ($result['success']) {
- $this->info('✅ 重试执行成功!');
- $this->displayRetryResult($result['data']);
- } else {
- $this->error('❌ 重试执行失败:' . $result['message']);
- return self::FAILURE;
- }
- return self::SUCCESS;
- }
- // 如果不是强制执行,检查是否已经分红
- 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}%");
- }
- /**
- * 显示重试结果
- */
- private function displayRetryResult(array $data): void
- {
- $this->info('');
- $this->info('🔄 重试结果统计:');
- $this->info("重试数量: {$data['retry_count']} 个");
- $this->info("成功转账: {$data['success_count']} 个");
- if ($data['failed_count'] > 0) {
- $this->warn("仍然失败: {$data['failed_count']} 个");
- }
- // 计算重试成功率
- $retrySuccessRate = $data['retry_count'] > 0 ?
- round($data['success_count'] / $data['retry_count'] * 100, 2) : 0;
- $this->info("重试成功率: {$retrySuccessRate}%");
- }
- }
|