ShareCommissionDiagnostics.php 5.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Services;
  3. use App\Models\BalanceLog;
  4. use App\Models\Config;
  5. use App\Models\ShareCommissionRecord;
  6. use App\Models\User;
  7. use Illuminate\Support\Facades\DB;
  8. /** Read-only counts that locate the missing stage; never calculates or grants unpaid rewards. */
  9. class ShareCommissionDiagnostics
  10. {
  11. public function inspect(?array $range): array
  12. {
  13. $rebates = BalanceLog::where('change_type', '充值返现')->selectRaw('COUNT(*) AS total')
  14. ->selectRaw('COALESCE(SUM(CASE WHEN type = 1 THEN 1 ELSE 0 END), 0) AS type1')
  15. ->selectRaw('COALESCE(SUM(CASE WHEN type = 1 AND amount > 0 THEN 1 ELSE 0 END), 0) AS positive')
  16. ->selectRaw('MIN(CASE WHEN type = 1 AND amount > 0 THEN created_at END) AS first_rebate_at')
  17. ->selectRaw('MAX(CASE WHEN type = 1 AND amount > 0 THEN created_at END) AS last_rebate_at')->first();
  18. $selected = BalanceLog::where('change_type', '充值返现')->where('type', 1)->where('amount', '>', 0);
  19. if ($range !== null) $selected->whereBetween('created_at', $range);
  20. $invited = User::query()->from('users as invitee')
  21. ->whereNotNull('invitee.agent_user_code')->where('invitee.agent_user_code', '<>', '');
  22. $realInvited = (clone $invited)->where('invitee.from', 1);
  23. $linked = (clone $realInvited)->where('invitee.agent_user_code', '<>', '0')->whereExists(function ($q) {
  24. $q->selectRaw('1')->from('users as promoter')
  25. ->whereColumn('promoter.user_code', 'invitee.agent_user_code')
  26. ->whereNotNull('promoter.member_id')->where('promoter.member_id', '<>', '')->where('promoter.member_id', '<>', '0');
  27. });
  28. $deposits = BalanceLog::where('type', 1)->where('amount', '>', 0)
  29. ->whereIn('change_type', ['充值', '三方充值']);
  30. $realDeposits = (clone $deposits)->whereExists(function ($q) {
  31. $q->selectRaw('1')->from('users as invitee')
  32. ->whereColumn('invitee.member_id', 'balance_logs.member_id')->where('invitee.from', 1)
  33. ->whereNotNull('invitee.agent_user_code')->where('invitee.agent_user_code', '<>', '');
  34. });
  35. $linkedDeposits = (clone $realDeposits)->whereExists(function ($q) {
  36. $q->selectRaw('1')->from('users as invitee')
  37. ->join('users as promoter', 'promoter.user_code', '=', 'invitee.agent_user_code')
  38. ->whereColumn('invitee.member_id', 'balance_logs.member_id')
  39. ->where('invitee.from', 1)->whereNotNull('invitee.agent_user_code')->where('invitee.agent_user_code', '<>', '')->where('invitee.agent_user_code', '<>', '0')
  40. ->whereNotNull('promoter.member_id')->where('promoter.member_id', '<>', '')->where('promoter.member_id', '<>', '0');
  41. });
  42. $walletDeposits = (clone $linkedDeposits)->whereExists(function ($q) {
  43. $q->selectRaw('1')->from('users as invitee')
  44. ->join('users as promoter', 'promoter.user_code', '=', 'invitee.agent_user_code')
  45. ->join('wallets as promoter_wallet', 'promoter_wallet.member_id', '=', 'promoter.member_id')
  46. ->whereColumn('invitee.member_id', 'balance_logs.member_id')
  47. ->where('invitee.from', 1)->whereNotNull('invitee.agent_user_code')->where('invitee.agent_user_code', '<>', '')->where('invitee.agent_user_code', '<>', '0')
  48. ->whereNotNull('promoter.member_id')->where('promoter.member_id', '<>', '')->where('promoter.member_id', '<>', '0');
  49. });
  50. $activeRecords = ShareCommissionRecord::where('status', 1);
  51. if ($range !== null) {
  52. $activeRecords->whereBetween('stat_date', [substr($range[0], 0, 10), substr($range[1], 0, 10)]);
  53. }
  54. $rate = Config::where('field', 'recharge_rate')->value('val');
  55. $setting = DB::connection()->getSchemaBuilder()->hasTable('share_settings')
  56. ? DB::table('share_settings')->orderBy('id')->first(['enabled', 'tier_one_rate', 'tier_two_rate']) : null;
  57. return [
  58. 'database' => DB::connection()->getDatabaseName(),
  59. 'table_prefix' => DB::getTablePrefix(),
  60. 'recharge_rate' => $rate,
  61. 'share_enabled' => $setting->enabled ?? null,
  62. 'tier_one_rate' => $setting->tier_one_rate ?? null,
  63. 'tier_two_rate' => $setting->tier_two_rate ?? null,
  64. 'counts' => [
  65. 'rebate_logs_all' => (int)$rebates->total,
  66. 'type1_rebate_logs_all' => (int)$rebates->type1,
  67. 'positive_type1_rebate_logs_all' => (int)$rebates->positive,
  68. 'selected_rebate_logs' => $selected->count(),
  69. 'invited_members_all' => $invited->count(),
  70. 'real_invited_members_all' => $realInvited->count(),
  71. 'linked_real_invited_members_all' => $linked->count(),
  72. 'deposit_logs_all' => $deposits->count(),
  73. 'real_invitee_deposit_logs_all' => $realDeposits->count(),
  74. 'linked_real_invitee_deposit_logs_all' => $linkedDeposits->count(),
  75. 'with_promoter_wallet_deposit_logs_all' => $walletDeposits->count(),
  76. 'commission_records_all' => ShareCommissionRecord::count(),
  77. 'active_commission_records_selected' => $activeRecords->count(),
  78. ],
  79. 'first_rebate_at' => $rebates->getRawOriginal('first_rebate_at'),
  80. 'last_rebate_at' => $rebates->getRawOriginal('last_rebate_at'),
  81. ];
  82. }
  83. }