TicketController.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 Illuminate\Http\Request;
  10. use App\Models\Ticket;
  11. use App\Models\TicketMessage;
  12. use Illuminate\Support\Facades\DB;
  13. class TicketController extends Controller
  14. {
  15. public function fetch(Request $request)
  16. {
  17. if ($request->input('id')) {
  18. $ticket = Ticket::where('id', $request->input('id'))
  19. ->where('user_id', $request->session()->get('id'))
  20. ->first();
  21. if (!$ticket) {
  22. abort(500, '工单不存在');
  23. }
  24. $ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get();
  25. for ($i = 0; $i < count($ticket['message']); $i++) {
  26. if ($ticket['message'][$i]['user_id'] == $ticket->user_id) {
  27. $ticket['message'][$i]['is_me'] = true;
  28. } else {
  29. $ticket['message'][$i]['is_me'] = false;
  30. }
  31. }
  32. return response([
  33. 'data' => $ticket
  34. ]);
  35. }
  36. $ticket = Ticket::where('user_id', $request->session()->get('id'))
  37. ->orderBy('created_at', 'DESC')
  38. ->get();
  39. for ($i = 0; $i < count($ticket); $i++) {
  40. if ($ticket[$i]['last_reply_user_id'] == $request->session()->get('id')) {
  41. $ticket[$i]['reply_status'] = 0;
  42. } else {
  43. $ticket[$i]['reply_status'] = 1;
  44. }
  45. }
  46. return response([
  47. 'data' => $ticket
  48. ]);
  49. }
  50. public function save(TicketSave $request)
  51. {
  52. DB::beginTransaction();
  53. if ((int)Ticket::where('status', 0)->where('user_id', $request->session()->get('id'))->count()) {
  54. abort(500, '存在其他工单尚未处理');
  55. }
  56. $ticket = Ticket::create(array_merge($request->only([
  57. 'subject',
  58. 'level'
  59. ]), [
  60. 'user_id' => $request->session()->get('id'),
  61. 'last_reply_user_id' => $request->session()->get('id')
  62. ]));
  63. if (!$ticket) {
  64. DB::rollback();
  65. abort(500, '工单创建失败');
  66. }
  67. $ticketMessage = TicketMessage::create([
  68. 'user_id' => $request->session()->get('id'),
  69. 'ticket_id' => $ticket->id,
  70. 'message' => $request->input('message')
  71. ]);
  72. if (!$ticketMessage) {
  73. DB::rollback();
  74. abort(500, '工单创建失败');
  75. }
  76. DB::commit();
  77. $this->sendNotify($ticket, $ticketMessage);
  78. return response([
  79. 'data' => true
  80. ]);
  81. }
  82. public function reply(Request $request)
  83. {
  84. if (empty($request->input('id'))) {
  85. abort(500, '参数错误');
  86. }
  87. if (empty($request->input('message'))) {
  88. abort(500, '消息不能为空');
  89. }
  90. $ticket = Ticket::where('id', $request->input('id'))
  91. ->where('user_id', $request->session()->get('id'))
  92. ->first();
  93. if (!$ticket) {
  94. abort(500, '工单不存在');
  95. }
  96. if ($ticket->status) {
  97. abort(500, '工单已关闭,无法回复');
  98. }
  99. if ($request->session()->get('id') == $this->getLastMessage($ticket->id)->user_id) {
  100. abort(500, '请等待技术支持回复');
  101. }
  102. DB::beginTransaction();
  103. $ticketMessage = TicketMessage::create([
  104. 'user_id' => $request->session()->get('id'),
  105. 'ticket_id' => $ticket->id,
  106. 'message' => $request->input('message')
  107. ]);
  108. $ticket->last_reply_user_id = $request->session()->get('id');
  109. if (!$ticketMessage || !$ticket->save()) {
  110. DB::rollback();
  111. abort(500, '工单回复失败');
  112. }
  113. DB::commit();
  114. $this->sendNotify($ticket, $ticketMessage);
  115. return response([
  116. 'data' => true
  117. ]);
  118. }
  119. public function close(Request $request)
  120. {
  121. if (empty($request->input('id'))) {
  122. abort(500, '参数错误');
  123. }
  124. $ticket = Ticket::where('id', $request->input('id'))
  125. ->where('user_id', $request->session()->get('id'))
  126. ->first();
  127. if (!$ticket) {
  128. abort(500, '工单不存在');
  129. }
  130. $ticket->status = 1;
  131. if (!$ticket->save()) {
  132. abort(500, '关闭失败');
  133. }
  134. return response([
  135. 'data' => true
  136. ]);
  137. }
  138. private function getLastMessage($ticketId)
  139. {
  140. return TicketMessage::where('ticket_id', $ticketId)
  141. ->orderBy('id', 'DESC')
  142. ->first();
  143. }
  144. public function withdraw(TicketWithdraw $request)
  145. {
  146. DB::beginTransaction();
  147. $subject = '[提现申请]本工单由系统发出';
  148. $ticket = Ticket::create([
  149. 'subject' => $subject,
  150. 'level' => 2,
  151. 'user_id' => $request->session()->get('id'),
  152. 'last_reply_user_id' => $request->session()->get('id')
  153. ]);
  154. if (!$ticket) {
  155. DB::rollback();
  156. abort(500, '工单创建失败');
  157. }
  158. $methodText = [
  159. 'alipay' => '支付宝',
  160. 'paypal' => '贝宝(Paypal)',
  161. 'usdt' => 'USDT',
  162. 'btc' => '比特币'
  163. ];
  164. $message = "提现方式:{$methodText[$request->input('withdraw_method')]}\r\n提现账号:{$request->input('withdraw_account')}\r\n";
  165. $ticketMessage = TicketMessage::create([
  166. 'user_id' => $request->session()->get('id'),
  167. 'ticket_id' => $ticket->id,
  168. 'message' => $message
  169. ]);
  170. if (!$ticketMessage) {
  171. DB::rollback();
  172. abort(500, '工单创建失败');
  173. }
  174. DB::commit();
  175. $telegramService = new TelegramService();
  176. $telegramService->sendMessageWithAdmin("📮工单提醒 #{$ticket->id}\n———————————————\n主题:\n`{$ticket->subject}`\n内容:\n`{$ticketMessage->message}`");
  177. return response([
  178. 'data' => true
  179. ]);
  180. }
  181. }