TicketController.php 6.6 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 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. $user = User::find($request->session()->get('id'));
  147. $limit = config('v2board.commission_withdraw_limit', 100);
  148. if ($limit > ($user->commission_balance / 100)) {
  149. abort(500, "当前系统要求的提现门槛佣金需为{$limit}CNY");
  150. }
  151. DB::beginTransaction();
  152. $subject = '[提现申请]本工单由系统发出';
  153. $ticket = Ticket::create([
  154. 'subject' => $subject,
  155. 'level' => 2,
  156. 'user_id' => $request->session()->get('id'),
  157. 'last_reply_user_id' => $request->session()->get('id')
  158. ]);
  159. if (!$ticket) {
  160. DB::rollback();
  161. abort(500, '工单创建失败');
  162. }
  163. $methodText = [
  164. 'alipay' => '支付宝',
  165. 'paypal' => '贝宝(Paypal)',
  166. 'usdt' => 'USDT',
  167. 'btc' => '比特币'
  168. ];
  169. $message = "提现方式:{$methodText[$request->input('withdraw_method')]}\r\n提现账号:{$request->input('withdraw_account')}\r\n";
  170. $ticketMessage = TicketMessage::create([
  171. 'user_id' => $request->session()->get('id'),
  172. 'ticket_id' => $ticket->id,
  173. 'message' => $message
  174. ]);
  175. if (!$ticketMessage) {
  176. DB::rollback();
  177. abort(500, '工单创建失败');
  178. }
  179. DB::commit();
  180. $this->sendNotify($ticket, $ticketMessage);
  181. return response([
  182. 'data' => true
  183. ]);
  184. }
  185. private function sendNotify(Ticket $ticket, TicketMessage $ticketMessage)
  186. {
  187. $telegramService = new TelegramService();
  188. $telegramService->sendMessageWithAdmin("📮工单提醒 #{$ticket->id}\n———————————————\n主题:\n`{$ticket->subject}`\n内容:\n`{$ticketMessage->message}`", true);
  189. }
  190. }