TicketController.php 4.3 KB

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