UrsPartnerDividendCommand.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace App\Module\UrsPromotion\Commands;
  3. use App\Module\UrsPromotion\Services\UrsPartnerDividendService;
  4. use Illuminate\Console\Command;
  5. use Carbon\Carbon;
  6. /**
  7. * URS合伙人分红命令
  8. *
  9. * 用于执行每日合伙人分红任务
  10. */
  11. class UrsPartnerDividendCommand extends Command
  12. {
  13. /**
  14. * 命令签名
  15. */
  16. protected $signature = 'urs-promotion:partner-dividend
  17. {--date= : 指定分红日期,格式:Y-m-d,默认为今天}
  18. {--force : 强制执行,即使已经分红过}';
  19. /**
  20. * 命令描述
  21. */
  22. protected $description = 'URS合伙人分红 - 顶级达人享受手续费分红';
  23. /**
  24. * 执行命令
  25. */
  26. public function handle(): int
  27. {
  28. $this->info('=== URS合伙人分红任务开始 ===');
  29. // 获取分红日期
  30. $date = $this->option('date') ?: Carbon::today()->format('Y-m-d');
  31. $force = $this->option('force');
  32. $this->info("分红日期: {$date}");
  33. // 验证日期格式
  34. if (!$this->validateDate($date)) {
  35. $this->error('日期格式错误,请使用 Y-m-d 格式,例如:2025-06-25');
  36. return self::FAILURE;
  37. }
  38. // 如果不是强制执行,检查是否已经分红
  39. if (!$force) {
  40. if (\App\Module\UrsPromotion\Models\UrsPartnerDividendRecord::isDividendProcessed($date)) {
  41. $this->warn("日期 {$date} 的分红已经处理过了,如需重新执行请使用 --force 参数");
  42. return self::SUCCESS;
  43. }
  44. }
  45. // 显示合伙人信息
  46. $this->showPartnerInfo();
  47. // 执行分红
  48. $this->info('开始执行分红...');
  49. $result = UrsPartnerDividendService::executeDailyDividend($date);
  50. if ($result['success']) {
  51. $this->info('✅ 分红执行成功!');
  52. $this->displayResult($result['data']);
  53. } else {
  54. $this->error('❌ 分红执行失败:' . $result['message']);
  55. return self::FAILURE;
  56. }
  57. $this->info('=== URS合伙人分红任务完成 ===');
  58. return self::SUCCESS;
  59. }
  60. /**
  61. * 验证日期格式
  62. */
  63. private function validateDate(string $date): bool
  64. {
  65. try {
  66. Carbon::createFromFormat('Y-m-d', $date);
  67. return true;
  68. } catch (\Exception $e) {
  69. return false;
  70. }
  71. }
  72. /**
  73. * 显示合伙人信息
  74. */
  75. private function showPartnerInfo(): void
  76. {
  77. $this->info('获取合伙人信息...');
  78. $partnerResult = UrsPartnerDividendService::getPartnerList();
  79. if ($partnerResult['success']) {
  80. $partners = $partnerResult['data'];
  81. $this->info("当前合伙人数量: {$partnerResult['total']}");
  82. if (!empty($partners)) {
  83. $this->table(
  84. ['用户ID', 'URS用户ID', '用户名', '达人等级', '成为合伙人时间'],
  85. array_map(function ($partner) {
  86. return [
  87. $partner['user_id'],
  88. $partner['urs_user_id'],
  89. $partner['username'],
  90. $partner['talent_level_name'],
  91. $partner['created_at']
  92. ];
  93. }, array_slice($partners, 0, 10)) // 只显示前10个
  94. );
  95. if (count($partners) > 10) {
  96. $this->info("... 还有 " . (count($partners) - 10) . " 个合伙人");
  97. }
  98. }
  99. } else {
  100. $this->warn('获取合伙人信息失败: ' . $partnerResult['message']);
  101. }
  102. }
  103. /**
  104. * 显示分红结果
  105. */
  106. private function displayResult(array $data): void
  107. {
  108. $this->info('');
  109. $this->info('📊 分红结果统计:');
  110. $this->info("分红日期: {$data['date']}");
  111. $this->info("当日总手续费: {$data['total_fee_amount']} 钻石");
  112. $this->info("分红总金额: {$data['dividend_amount']} 钻石 (20%)");
  113. $this->info("合伙人数量: {$data['partner_count']} 人");
  114. $this->info("每人分红: {$data['per_partner_amount']} 钻石");
  115. $this->info("成功转账: {$data['success_count']} 人");
  116. if ($data['failed_count'] > 0) {
  117. $this->warn("失败转账: {$data['failed_count']} 人");
  118. }
  119. // 计算成功率
  120. $successRate = $data['partner_count'] > 0 ?
  121. round($data['success_count'] / $data['partner_count'] * 100, 2) : 0;
  122. $this->info("成功率: {$successRate}%");
  123. }
  124. }