RewardCodeController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\RewardCode;
  5. use App\Services\RewardCodeService;
  6. use Carbon\Carbon;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\DB;
  9. class RewardCodeController extends Controller
  10. {
  11. /**
  12. * Reward code list.
  13. */
  14. public function index(Request $request)
  15. {
  16. $query = RewardCode::query();
  17. if ($code = $request->get('code')) {
  18. $query->where('code', $code);
  19. }
  20. if ($status = $request->get('status', null)) {
  21. $query->where('status', $status);
  22. }
  23. if ($expired = $request->get('expired', null)) {
  24. if ($expired == 1) {
  25. $query->whereNotNull('expire_at')->where('expire_at', '<', Carbon::now());
  26. } elseif ($expired == 0) {
  27. $query->where(function ($q) {
  28. $q->whereNull('expire_at')->orWhere('expire_at', '>=', Carbon::now());
  29. });
  30. }
  31. }
  32. $list = $query->orderByDesc('id')->paginate(20);
  33. return view('admin.reward_code.index', [
  34. 'list' => $list,
  35. 'code' => $code ?? '',
  36. 'status' => $request->get('status', ''),
  37. 'expired' => $request->get('expired', ''),
  38. ]);
  39. }
  40. /**
  41. * Create single reward code.
  42. */
  43. public function store(Request $request)
  44. {
  45. $request->validate([
  46. 'total_amount' => 'required|numeric|min:0.0001',
  47. 'min_amount' => 'required|numeric|min:0.0001',
  48. 'max_amount' => 'required|numeric|min:0.0001',
  49. 'total_count' => 'required|integer|min:1',
  50. 'expire_at' => 'nullable|date',
  51. 'remark' => 'nullable|string|max:255',
  52. ]);
  53. $totalAmount = (float)$request->input('total_amount');
  54. $minAmount = (float)$request->input('min_amount');
  55. $maxAmount = (float)$request->input('max_amount');
  56. $totalCount = (int)$request->input('total_count');
  57. $expireAt = $request->input('expire_at') ? Carbon::parse($request->input('expire_at')) : null;
  58. $remark = $request->input('remark', '');
  59. if ($minAmount > $maxAmount) {
  60. return apiReturnFail('min_amount_gt_max_amount');
  61. }
  62. if ($totalAmount < $minAmount * $totalCount) {
  63. return apiReturnFail('total_amount_too_small_for_min');
  64. }
  65. $created = null;
  66. DB::connection('write')->transaction(function () use ($totalAmount, $minAmount, $maxAmount, $totalCount, $expireAt, $remark, &$created) {
  67. $code = RewardCodeService::generateUniqueCode();
  68. $created = RewardCode::create([
  69. 'code' => $code,
  70. 'expire_at' => $expireAt,
  71. 'total_amount' => $totalAmount,
  72. 'min_amount' => $minAmount,
  73. 'max_amount' => $maxAmount,
  74. 'total_count' => $totalCount,
  75. 'claimed_count' => 0,
  76. 'claimed_amount' => 0,
  77. 'status' => RewardCodeService::STATUS_ACTIVE,
  78. 'remark' => $remark,
  79. ]);
  80. });
  81. return redirect()->back()->with('success', 'Created, code: ' . $created->code);
  82. }
  83. /**
  84. * Update status (enable/disable).
  85. */
  86. public function updateStatus(Request $request, $id)
  87. {
  88. $status = (int)$request->input('status', RewardCodeService::STATUS_ACTIVE);
  89. if (!in_array($status, [RewardCodeService::STATUS_ACTIVE, RewardCodeService::STATUS_INACTIVE])) {
  90. return apiReturnFail('invalid_status');
  91. }
  92. $code = RewardCode::find($id);
  93. if (!$code) {
  94. return apiReturnFail('code_not_found');
  95. }
  96. $code->status = $status;
  97. $code->save();
  98. return apiReturnSuc($code->toArray(), '', '¸üгɹ¦');
  99. }
  100. /**
  101. * Claim records list.
  102. */
  103. public function records(Request $request)
  104. {
  105. $code = $request->get('code');
  106. $userId = (int)$request->input('user_id', 0);
  107. $gameId = (int)$request->input('game_id', 0);
  108. $startDate = $request->input('start_date', '');
  109. $endDate = $request->input('end_date', '');
  110. $query = DB::connection('write')
  111. ->table('agent.dbo.reward_code_claims as rcc')
  112. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as ai', 'rcc.UserID', '=', 'ai.UserID')
  113. ->select(
  114. 'rcc.id',
  115. 'rcc.code',
  116. 'rcc.UserID',
  117. 'ai.GameID',
  118. 'ai.NickName',
  119. 'rcc.amount',
  120. 'rcc.client_ip',
  121. 'rcc.created_at'
  122. )
  123. ->orderBy('rcc.id', 'desc');
  124. if ($code) {
  125. $query->where('rcc.code', $code);
  126. }
  127. if ($userId > 0) {
  128. $query->where('rcc.UserID', $userId);
  129. }
  130. if ($gameId > 0) {
  131. $query->where('ai.GameID', $gameId);
  132. }
  133. if ($startDate) {
  134. $query->where('rcc.created_at', '>=', $startDate . ' 00:00:00');
  135. }
  136. if ($endDate) {
  137. $query->where('rcc.created_at', '<=', $endDate . ' 23:59:59');
  138. }
  139. $list = $query->paginate(20);
  140. return view('admin.reward_code.history', [
  141. 'list' => $list,
  142. 'code' => $code ?? '',
  143. 'user_id' => $userId,
  144. 'game_id' => $gameId,
  145. 'start_date' => $startDate,
  146. 'end_date' => $endDate,
  147. ]);
  148. }
  149. }