TicketController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Jobs\SendEmailJob;
  4. use Illuminate\Http\Request;
  5. use App\Http\Controllers\Controller;
  6. use App\Models\Ticket;
  7. use App\Models\User;
  8. use App\Models\TicketMessage;
  9. use Illuminate\Support\Facades\Cache;
  10. use Illuminate\Support\Facades\DB;
  11. class TicketController extends Controller
  12. {
  13. public function fetch(Request $request)
  14. {
  15. if ($request->input('id')) {
  16. $ticket = Ticket::where('id', $request->input('id'))
  17. ->first();
  18. if (!$ticket) {
  19. abort(500, '工单不存在');
  20. }
  21. $ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get();
  22. for ($i = 0; $i < count($ticket['message']); $i++) {
  23. if ($ticket['message'][$i]['user_id'] !== $ticket->user_id) {
  24. $ticket['message'][$i]['is_me'] = true;
  25. } else {
  26. $ticket['message'][$i]['is_me'] = false;
  27. }
  28. }
  29. return response([
  30. 'data' => $ticket
  31. ]);
  32. }
  33. $current = $request->input('current') ? $request->input('current') : 1;
  34. $pageSize = $request->input('pageSize') >= 10 ? $request->input('pageSize') : 10;
  35. $model = Ticket::orderBy('created_at', 'DESC');
  36. if ($request->input('status') !== NULL) {
  37. $model->where('status', $request->input('status'));
  38. }
  39. $total = $model->count();
  40. $res = $model->forPage($current, $pageSize)
  41. ->get();
  42. for ($i = 0; $i < count($res); $i++) {
  43. if ($res[$i]['last_reply_user_id'] == $request->session()->get('id')) {
  44. $res[$i]['reply_status'] = 0;
  45. } else {
  46. $res[$i]['reply_status'] = 1;
  47. }
  48. }
  49. return response([
  50. 'data' => $res,
  51. 'total' => $total
  52. ]);
  53. }
  54. public function reply(Request $request)
  55. {
  56. if (empty($request->input('id'))) {
  57. abort(500, '参数错误');
  58. }
  59. if (empty($request->input('message'))) {
  60. abort(500, '消息不能为空');
  61. }
  62. $ticket = Ticket::where('id', $request->input('id'))
  63. ->first();
  64. if (!$ticket) {
  65. abort(500, '工单不存在');
  66. }
  67. if ($ticket->status) {
  68. abort(500, '工单已关闭,无法回复');
  69. }
  70. DB::beginTransaction();
  71. $ticketMessage = TicketMessage::create([
  72. 'user_id' => $request->session()->get('id'),
  73. 'ticket_id' => $ticket->id,
  74. 'message' => $request->input('message')
  75. ]);
  76. $ticket->last_reply_user_id = $request->session()->get('id');
  77. if (!$ticketMessage || !$ticket->save()) {
  78. DB::rollback();
  79. abort(500, '工单回复失败');
  80. }
  81. DB::commit();
  82. $this->sendEmailNotify($ticket, $ticketMessage);
  83. return response([
  84. 'data' => true
  85. ]);
  86. }
  87. public function close(Request $request)
  88. {
  89. if (empty($request->input('id'))) {
  90. abort(500, '参数错误');
  91. }
  92. $ticket = Ticket::where('id', $request->input('id'))
  93. ->first();
  94. if (!$ticket) {
  95. abort(500, '工单不存在');
  96. }
  97. $ticket->status = 1;
  98. if (!$ticket->save()) {
  99. abort(500, '关闭失败');
  100. }
  101. return response([
  102. 'data' => true
  103. ]);
  104. }
  105. // 半小时内不再重复通知
  106. private function sendEmailNotify(Ticket $ticket, TicketMessage $ticketMessage)
  107. {
  108. $user = User::find($ticket->user_id);
  109. $cacheKey = 'ticket_sendEmailNotify_' . $ticket->user_id;
  110. if (!Cache::get($cacheKey)) {
  111. Cache::put($cacheKey, 1, 1800);
  112. SendEmailJob::dispatch([
  113. 'email' => $user->email,
  114. 'subject' => '您在' . config('v2board.app_name', 'V2Board') . '的工单得到了回复',
  115. 'template_name' => 'notify',
  116. 'template_value' => [
  117. 'name' => config('v2board.app_name', 'V2Board'),
  118. 'url' => config('v2board.app_url'),
  119. 'content' => "主题:{$ticket->subject}\r\n回复内容:{$ticketMessage->message}"
  120. ]
  121. ]);
  122. }
  123. }
  124. }