TicketController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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, __('user.ticket.fetch.ticket_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, __('user.ticket.save.exist_other_open_ticket'));
  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, __('user.ticket.save.ticket_create_failed'));
  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, __('user.ticket.save.ticket_create_failed'));
  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, __('user.ticket.reply.params_wrong'));
  87. }
  88. if (empty($request->input('message'))) {
  89. abort(500, __('user.ticket.reply.message_not_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, __('user.ticket.reply.ticket_not_exist'));
  96. }
  97. if ($ticket->status) {
  98. abort(500, __('user.ticket.reply.ticket_close_not_reply'));
  99. }
  100. if ($request->session()->get('id') == $this->getLastMessage($ticket->id)->user_id) {
  101. abort(500, __('user.ticket.reply.wait_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, __('user.ticket.reply.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, __('user.ticket.close.params_wrong'));
  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, __('user.ticket.close.ticket_not_exist'));
  130. }
  131. $ticket->status = 1;
  132. if (!$ticket->save()) {
  133. abort(500, __('user.ticket.close.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 (!in_array(
  148. $request->input('withdraw_method'),
  149. config(
  150. 'v2board.commission_withdraw_method',
  151. Dict::WITHDRAW_METHOD_WHITELIST_DEFAULT
  152. )
  153. )) {
  154. abort(500, __('user.ticket.withdraw.not_support_withdraw_method'));
  155. }
  156. $user = User::find($request->session()->get('id'));
  157. $limit = config('v2board.commission_withdraw_limit', 100);
  158. if ($limit > ($user->commission_balance / 100)) {
  159. abort(500, __('user.ticket.withdraw.system_require_withdraw_limit', ['limit' => $limit]));
  160. }
  161. DB::beginTransaction();
  162. $subject = __('user.ticket.withdraw.ticket_subject');
  163. $ticket = Ticket::create([
  164. 'subject' => $subject,
  165. 'level' => 2,
  166. 'user_id' => $request->session()->get('id'),
  167. 'last_reply_user_id' => $request->session()->get('id')
  168. ]);
  169. if (!$ticket) {
  170. DB::rollback();
  171. abort(500, __('user.ticket.withdraw.ticket_create_failed'));
  172. }
  173. $message = __('user.ticket.withdraw.ticket_message', [
  174. 'method' => $request->input('withdraw_method'),
  175. 'account' => $request->input('withdraw_account')
  176. ]);
  177. $ticketMessage = TicketMessage::create([
  178. 'user_id' => $request->session()->get('id'),
  179. 'ticket_id' => $ticket->id,
  180. 'message' => $message
  181. ]);
  182. if (!$ticketMessage) {
  183. DB::rollback();
  184. abort(500, __('user.ticket.withdraw.ticket_create_failed'));
  185. }
  186. DB::commit();
  187. $this->sendNotify($ticket, $ticketMessage);
  188. return response([
  189. 'data' => true
  190. ]);
  191. }
  192. private function sendNotify(Ticket $ticket, TicketMessage $ticketMessage)
  193. {
  194. $telegramService = new TelegramService();
  195. $telegramService->sendMessageWithAdmin("📮工单提醒 #{$ticket->id}\n———————————————\n主题:\n`{$ticket->subject}`\n内容:\n`{$ticketMessage->message}`", true);
  196. }
  197. }