TicketController.php 6.5 KB

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