TicketController.php 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Http\Controllers\User;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Ticket;
  5. use App\Models\User;
  6. use App\Notifications\TicketCreated;
  7. use App\Notifications\TicketReplied;
  8. use Illuminate\Contracts\View\View;
  9. use Illuminate\Http\JsonResponse;
  10. use Illuminate\Http\Request;
  11. use Notification;
  12. class TicketController extends Controller
  13. {
  14. public function index(Request $request): View
  15. { // 工单
  16. return view('user.tickets', [
  17. 'tickets' => auth()->user()->tickets()->latest()->paginate(10)->appends($request->except('page')),
  18. ]);
  19. }
  20. public function store(Request $request): JsonResponse
  21. { // 添加工单
  22. $title = $request->input('title');
  23. $content = substr(str_replace(['atob', 'eval'], '', clean($request->input('content'))), 0, 300);
  24. if (empty($title) || empty($content)) {
  25. return response()->json([
  26. 'status' => 'fail', 'message' => trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.title')).'&'.ucfirst(trans('validation.attributes.content'))]),
  27. ]);
  28. }
  29. if ($ticket = auth()->user()->tickets()->create(compact('title', 'content'))) {
  30. // 通知相关管理员
  31. Notification::send(User::find(1), new TicketCreated($ticket, route('admin.ticket.edit', $ticket)));
  32. }
  33. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.submit')])]);
  34. }
  35. public function edit(Ticket $ticket): View
  36. { // 回复工单
  37. return view('user.replyTicket', [
  38. 'ticket' => $ticket,
  39. 'replyList' => $ticket->reply()->with('ticket:id,status', 'admin:id,username,qq', 'user:id,username,qq')->oldest()->get(),
  40. ]);
  41. }
  42. public function reply(Request $request, Ticket $ticket): JsonResponse
  43. {
  44. $content = substr(str_replace(['atob', 'eval'], '', clean($request->input('content'))), 0, 300);
  45. if (empty($content)) {
  46. return response()->json([
  47. 'status' => 'fail', 'message' => trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.title')).'&'.ucfirst(trans('validation.attributes.content'))]),
  48. ]);
  49. }
  50. $reply = $ticket->reply()->create(['user_id' => auth()->id(), 'content' => $content]);
  51. if ($reply) {
  52. // 重新打开工单
  53. if (in_array($ticket->status, [1, 2], true)) {
  54. $ticket->update(['status' => 0]);
  55. }
  56. // 通知相关管理员
  57. Notification::send(User::find(1), new TicketReplied($reply, route('admin.ticket.edit', $ticket)));
  58. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.ticket.reply')])]);
  59. }
  60. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.ticket.reply')])]);
  61. }
  62. public function close(Ticket $ticket): JsonResponse
  63. { // 关闭工单
  64. if ($ticket->close()) {
  65. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.close')])]);
  66. }
  67. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.close')])]);
  68. }
  69. }