PlayedGameService.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. namespace App\Services;
  3. use App\Services\Sharing\ShareDefaults;
  4. use Carbon\Carbon;
  5. use Illuminate\Support\Facades\DB;
  6. /** Read actual orders so historical and not-yet-settled play does not depend on commission synchronization. */
  7. class PlayedGameService
  8. {
  9. public static function forMembers(array $memberIds, ?string $start = null, ?string $end = null): array
  10. {
  11. if ($memberIds === []) return [];
  12. $played = [];
  13. $third = DB::table('third_game_orders as o')->join('users as u', function ($join) {
  14. $join->on('o.user_id', '=', 'u.id')->orWhere(function ($join) {
  15. $join->whereNull('o.user_id')->on('o.member_id', '=', 'u.member_id');
  16. });
  17. })->whereIn('u.member_id', $memberIds)
  18. ->where(function ($query) {
  19. $query->whereNull('o.member_id')->orWhere('o.member_id', '')->orWhereColumn('o.member_id', 'u.member_id');
  20. })
  21. ->whereIn('o.game_type', range(1, 7))->whereIn('o.status', [0, 1])->where('o.bet_amount', '>', 0);
  22. if ($start && $end) $third->whereBetween('o.bet_time', [$start, $end]);
  23. foreach ($third->distinct()->get(['u.member_id', 'o.game_type']) as $row) {
  24. $played[$row->member_id]['third:' . $row->game_type] = true;
  25. }
  26. // sport_order.user_id stores the member ID, unlike third_game_orders.user_id (users.id).
  27. $sources = [
  28. ['sport_order', 'user_id', 'create_time', 'self:sport', 'status', [1], true],
  29. ['sport_game_order', 'member_id', 'created_at', 'self:sport', 'status', [0, 1, 2], false],
  30. ['lhc_order', 'member_id', 'created_at', 'self:lottery', 'lottery_status', [0, 1, 2], true],
  31. ['bets', 'member_id', 'created_at', 'self:lottery', 'status', [1, 2], false],
  32. ['jisu_game_order', 'member_id', 'created_at', 'self:lottery', 'status', [0, 1, 2], false],
  33. ];
  34. $startTimestamp = $start ? Carbon::parse($start, ShareDefaults::TIMEZONE)->timestamp : null;
  35. $endTimestamp = $end ? Carbon::parse($end, ShareDefaults::TIMEZONE)->timestamp : null;
  36. foreach ($sources as [$table, $memberColumn, $timeColumn, $category, $statusColumn, $statuses, $timestamp]) {
  37. $query = DB::table($table)->whereIn($memberColumn, $memberIds)
  38. ->whereIn($statusColumn, $statuses)->where('amount', '>', 0);
  39. if ($timestamp) $query->where('is_faker', 0);
  40. if ($table === 'sport_order') $query->where('pay_status', 1)->where('return_status', '<>', 2);
  41. if ($start && $end) {
  42. $query->whereBetween($timeColumn, $timestamp
  43. ? [$startTimestamp, $endTimestamp]
  44. : [$start, $end]);
  45. }
  46. foreach ($query->distinct()->pluck($memberColumn) as $memberId) $played[$memberId][$category] = true;
  47. }
  48. $result = [];
  49. foreach ($played as $memberId => $categories) {
  50. // Keep the same names and stable ordering as commission categories.
  51. foreach (ShareDefaults::categories() as $category => $label) {
  52. if (isset($categories[$category])) $result[$memberId][] = ['category' => $category, 'label' => $label];
  53. }
  54. }
  55. return $result;
  56. }
  57. }