TicketController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. namespace App\Http\Controllers\User;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\User\TicketSave;
  5. use App\Http\Requests\User\TicketWithdraw;
  6. use App\Jobs\SendTelegramJob;
  7. use App\Models\User;
  8. use App\Services\TelegramService;
  9. use App\Utils\Dict;
  10. use Illuminate\Http\Request;
  11. use App\Models\Ticket;
  12. use App\Models\TicketMessage;
  13. use Illuminate\Support\Facades\DB;
  14. class TicketController extends Controller
  15. {
  16. public function fetch(Request $request)
  17. {
  18. if ($request->input('id')) {
  19. $ticket = Ticket::where('id', $request->input('id'))
  20. ->where('user_id', $request->session()->get('id'))
  21. ->first();
  22. if (!$ticket) {
  23. abort(500, __('Ticket does not exist'));
  24. }
  25. $ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get();
  26. for ($i = 0; $i < count($ticket['message']); $i++) {
  27. if ($ticket['message'][$i]['user_id'] == $ticket->user_id) {
  28. $ticket['message'][$i]['is_me'] = true;
  29. } else {
  30. $ticket['message'][$i]['is_me'] = false;
  31. }
  32. }
  33. return response([
  34. 'data' => $ticket
  35. ]);
  36. }
  37. $ticket = Ticket::where('user_id', $request->session()->get('id'))
  38. ->orderBy('created_at', 'DESC')
  39. ->get();
  40. for ($i = 0; $i < count($ticket); $i++) {
  41. if ($ticket[$i]['last_reply_user_id'] == $request->session()->get('id')) {
  42. $ticket[$i]['reply_status'] = 0;
  43. } else {
  44. $ticket[$i]['reply_status'] = 1;
  45. }
  46. }
  47. return response([
  48. 'data' => $ticket
  49. ]);
  50. }
  51. public function save(TicketSave $request)
  52. {
  53. DB::beginTransaction();
  54. if ((int)Ticket::where('status', 0)->where('user_id', $request->session()->get('id'))->count()) {
  55. abort(500, __('There are other unresolved tickets'));
  56. }
  57. $ticket = Ticket::create(array_merge($request->only([
  58. 'subject',
  59. 'level'
  60. ]), [
  61. 'user_id' => $request->session()->get('id'),
  62. 'last_reply_user_id' => $request->session()->get('id')
  63. ]));
  64. if (!$ticket) {
  65. DB::rollback();
  66. abort(500, __('Failed to open ticket'));
  67. }
  68. $ticketMessage = TicketMessage::create([
  69. 'user_id' => $request->session()->get('id'),
  70. 'ticket_id' => $ticket->id,
  71. 'message' => $request->input('message')
  72. ]);
  73. if (!$ticketMessage) {
  74. DB::rollback();
  75. abort(500, __('Failed to open ticket'));
  76. }
  77. DB::commit();
  78. $this->sendNotify($ticket, $ticketMessage);
  79. return response([
  80. 'data' => true
  81. ]);
  82. }
  83. public function reply(Request $request)
  84. {
  85. if (empty($request->input('id'))) {
  86. abort(500, __('Invalid parameter'));
  87. }
  88. if (empty($request->input('message'))) {
  89. abort(500, __('Message cannot be empty'));
  90. }
  91. $ticket = Ticket::where('id', $request->input('id'))
  92. ->where('user_id', $request->session()->get('id'))
  93. ->first();
  94. if (!$ticket) {
  95. abort(500, __('Ticket does not exist'));
  96. }
  97. if ($ticket->status) {
  98. abort(500, __('The ticket is closed and cannot be replied'));
  99. }
  100. if ($request->session()->get('id') == $this->getLastMessage($ticket->id)->user_id) {
  101. abort(500, __('Please wait for the technical enginneer to reply'));
  102. }
  103. DB::beginTransaction();
  104. $ticketMessage = TicketMessage::create([
  105. 'user_id' => $request->session()->get('id'),
  106. 'ticket_id' => $ticket->id,
  107. 'message' => $request->input('message')
  108. ]);
  109. $ticket->last_reply_user_id = $request->session()->get('id');
  110. if (!$ticketMessage || !$ticket->save()) {
  111. DB::rollback();
  112. abort(500, __('Ticket reply failed'));
  113. }
  114. DB::commit();
  115. $this->sendNotify($ticket, $ticketMessage);
  116. return response([
  117. 'data' => true
  118. ]);
  119. }
  120. public function close(Request $request)
  121. {
  122. if (empty($request->input('id'))) {
  123. abort(500, __('Invalid parameter'));
  124. }
  125. $ticket = Ticket::where('id', $request->input('id'))
  126. ->where('user_id', $request->session()->get('id'))
  127. ->first();
  128. if (!$ticket) {
  129. abort(500, __('Ticket does not exist'));
  130. }
  131. $ticket->status = 1;
  132. if (!$ticket->save()) {
  133. abort(500, __('Close failed'));
  134. }
  135. return response([
  136. 'data' => true
  137. ]);
  138. }
  139. private function getLastMessage($ticketId)
  140. {
  141. return TicketMessage::where('ticket_id', $ticketId)
  142. ->orderBy('id', 'DESC')
  143. ->first();
  144. }
  145. public function withdraw(TicketWithdraw $request)
  146. {
  147. if ((int)config('v2board.withdraw_close_enable', 0)) {
  148. abort(500, 'user.ticket.withdraw.not_support_withdraw');
  149. }
  150. if (!in_array(
  151. $request->input('withdraw_method'),
  152. config(
  153. 'v2board.commission_withdraw_method',
  154. Dict::WITHDRAW_METHOD_WHITELIST_DEFAULT
  155. )
  156. )) {
  157. abort(500, __('Unsupported withdrawal method'));
  158. }
  159. $user = User::find($request->session()->get('id'));
  160. $limit = config('v2board.commission_withdraw_limit', 100);
  161. if ($limit > ($user->commission_balance / 100)) {
  162. abort(500, __('The current required minimum withdrawal commission is :limit', ['limit' => $limit]));
  163. }
  164. DB::beginTransaction();
  165. $subject = __('[Commission Withdrawal Request] This ticket is opened by the system');
  166. $ticket = Ticket::create([
  167. 'subject' => $subject,
  168. 'level' => 2,
  169. 'user_id' => $request->session()->get('id'),
  170. 'last_reply_user_id' => $request->session()->get('id')
  171. ]);
  172. if (!$ticket) {
  173. DB::rollback();
  174. abort(500, __('Failed to open ticket'));
  175. }
  176. $message = sprintf("%s\r\n%s",
  177. __('Withdrawal method') . ":" . $request->input('withdraw_method'),
  178. __('Withdrawal account') . ":" . $request->input('withdraw_account')
  179. );
  180. $ticketMessage = TicketMessage::create([
  181. 'user_id' => $request->session()->get('id'),
  182. 'ticket_id' => $ticket->id,
  183. 'message' => $message
  184. ]);
  185. if (!$ticketMessage) {
  186. DB::rollback();
  187. abort(500, __('Failed to open ticket'));
  188. }
  189. DB::commit();
  190. $this->sendNotify($ticket, $ticketMessage);
  191. return response([
  192. 'data' => true
  193. ]);
  194. }
  195. private function sendNotify(Ticket $ticket, TicketMessage $ticketMessage)
  196. {
  197. $telegramService = new TelegramService();
  198. $telegramService->sendMessageWithAdmin("📮工单提醒 #{$ticket->id}\n———————————————\n主题:\n`{$ticket->subject}`\n内容:\n`{$ticketMessage->message}`", true);
  199. }
  200. }