[ 'op' => '操作', 'id' => '工单ID', 'title' => '主题', 'status' => '工单状态', 'type' => '工单类型', 'userid' => '提交用户', 'datetime' => '创建时间', ], ]; private static string $err_msg = '请求失败'; /** * 后台工单页面 * * @throws Exception */ public function index(ServerRequest $request, Response $response, array $args): ResponseInterface { return $response->write( $this->view() ->assign('details', self::$details) ->fetch('admin/ticket/index.tpl') ); } /** * @throws TelegramSDKException * @throws GuzzleException * @throws ClientExceptionInterface */ public function update(ServerRequest $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $comment = $request->getParam('comment') ?? ''; $admin_name = $request->getParam('admin_name') ?? 'fuuu'; if ($comment === '') { return $response->withJson([ 'ret' => 0, 'msg' => self::$err_msg, ]); } $ticket = (new Ticket())->where('id', $id)->first(); if ($ticket === null) { return $response->withJson([ 'ret' => 0, 'msg' => self::$err_msg, ]); } $content_old = json_decode($ticket->content, true); $content_new = [ [ 'comment_id' => $content_old[count($content_old) - 1]['comment_id'] + 1, 'commenter_name' => $admin_name, 'commenter_isAdmin' => 1, 'comment' => $comment, 'datetime' => time(), ], ]; $user = (new User())->find($ticket->userid); // MailHub::start() // ->setScene("tk_ry") // ->setTitle($_ENV['appName'] . ' - 工单被回复') // ->setView("one", $a) // ->setTo($email) // ->send(); Notification::notifyUser( $user, $_ENV['appName'] . ' - 工单被回复', '你好,有人回复了工单

回复内容:'.$comment, 'one', 'tk_ry' ); $ticket->content = json_encode(array_merge($content_old, $content_new)); $ticket->status = 'open_wait_user'; $ticket->save(); return $response->withJson([ 'ret' => 1, 'msg' => '提交成功', ]); } /** * @throws GuzzleException * @throws TelegramSDKException * @throws ClientExceptionInterface */ public function updateAI(ServerRequest $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $ticket = (new Ticket())->where('id', $id)->first(); if ($ticket === null) { return $response->withJson([ 'ret' => 0, 'msg' => self::$err_msg, ]); } $content_old = json_decode($ticket->content, true); // 获取用户的第一个问题,作为 LLM 的输入 $ai_reply = LLM::genTextResponse($content_old[0]['comment']); $content_new = [ [ 'comment_id' => $content_old[count($content_old) - 1]['comment_id'] + 1, 'commenter_name' => 'AI Admin', 'comment' => $ai_reply, 'datetime' => time(), ], ]; $user = (new User())->find($ticket->userid); Notification::notifyUser( $user, $_ENV['appName'] . ' - 工单被回复', '你好,有人回复了工单

回复内容:'.$comment, 'one', 'tk_ry' ); $ticket->content = json_encode(array_merge($content_old, $content_new)); $ticket->status = 'open_wait_user'; $ticket->save(); return $response->withJson([ 'ret' => 1, 'msg' => '提交成功', ]); } /** * 后台查看指定工单 * * @throws Exception */ public function detail(ServerRequest $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $ticket = (new Ticket())->where('id', '=', $id)->first(); if ($ticket === null) { return $response->withRedirect('/admin/ticket'); } $comments = json_decode($ticket->content); foreach ($comments as $comment) { $comment->datetime = Tools::toDateTime((int) $comment->datetime); } return $response->write( $this->view() ->assign('ticket', $ticket) ->assign('comments', $comments) ->fetch('admin/ticket/view.tpl') ); } /** * 后台关闭工单 */ public function close(ServerRequest $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $ticket = (new Ticket())->where('id', '=', $id)->first(); if ($ticket === null) { return $response->withJson([ 'ret' => 0, 'msg' => self::$err_msg, ]); } if ($ticket->status === 'closed') { return $response->withJson([ 'ret' => 0, 'msg' => self::$err_msg, ]); } $ticket->status = 'closed'; $ticket->save(); return $response->withJson([ 'ret' => 1, 'msg' => '关闭成功', ]); } /** * 后台删除工单 */ public function delete(ServerRequest $request, Response $response, array $args): ResponseInterface { $id = $args['id']; (new Ticket())->where('id', '=', $id)->delete(); return $response->withJson([ 'ret' => 1, 'msg' => '删除成功', ]); } /** * 后台工单页面 Ajax */ public function ajax(ServerRequest $request, Response $response, array $args): ResponseInterface { $tickets = (new Ticket())->orderBy('id', 'desc')->get(); foreach ($tickets as $ticket) { $ticket->op = ''; if ($ticket->status !== 'closed') { $ticket->op .= ' '; } $ticket->op .= ' 查看'; $ticket->status = $ticket->status(); $ticket->type = $ticket->type(); $ticket->datetime = Tools::toDateTime((int) $ticket->datetime); } return $response->withJson([ 'tickets' => $tickets, ]); } }