支持工单功能(10/10)

实现管理员侧工单支持功能
*后端实现
*清理无效的feedbackMG action
This commit is contained in:
Chenx221 2024-04-18 17:18:18 +08:00
parent a25f0ef32d
commit 66f4127f5c
Signed by: chenx221
GPG Key ID: D7A9EC07024C3021

View File

@ -10,6 +10,9 @@ use app\models\LoginLogs;
use app\models\Share; use app\models\Share;
use app\models\ShareSearch; use app\models\ShareSearch;
use app\models\SiteConfig; use app\models\SiteConfig;
use app\models\TicketReplies;
use app\models\Tickets;
use app\models\TicketsSearch;
use app\models\User; use app\models\User;
use app\models\UserSearch; use app\models\UserSearch;
use app\utils\AdminSword; use app\utils\AdminSword;
@ -46,7 +49,7 @@ class AdminController extends Controller
'actions' => ['index', 'system', 'user', 'info', 'user-view', 'user-create', 'user-update', 'actions' => ['index', 'system', 'user', 'info', 'user-view', 'user-create', 'user-update',
'user-delete', 'user-totpoff', 'user-pwdreset', 'login-log', 'access-log', 'collection-up-log', 'user-delete', 'user-totpoff', 'user-pwdreset', 'login-log', 'access-log', 'collection-up-log',
'share-manage', 'share-manage-view', 'share-manage-delete', 'collection-manage', 'collection-manage-view', 'share-manage', 'share-manage-view', 'share-manage-delete', 'collection-manage', 'collection-manage-view',
'collection-manage-delete', 'notice-manage', 'feedback-manage', 'sysinfo','get-sysinfo'], 'collection-manage-delete', 'notice-manage', 'sysinfo', 'get-sysinfo', 'ticket-manage', 'ticket-view', 'ticket-delete', 'ticket-reply'],
'roles' => ['admin'], // only admin can do these 'roles' => ['admin'], // only admin can do these
] ]
], ],
@ -74,9 +77,12 @@ class AdminController extends Controller
'collection-manage-view' => ['GET'], 'collection-manage-view' => ['GET'],
'collection-manage-delete' => ['POST'], 'collection-manage-delete' => ['POST'],
'notice-manage' => ['GET'], 'notice-manage' => ['GET'],
'feedback-manage' => ['GET'],
'sysinfo' => ['GET'], 'sysinfo' => ['GET'],
'get-sysinfo' => ['GET'], 'get-sysinfo' => ['GET'],
'ticket-manage' => ['GET'],
'ticket-view' => ['GET'],
'ticket-delete' => ['POST'],
'ticket-reply' => ['POST'],
], ],
], ],
] ]
@ -574,14 +580,6 @@ class AdminController extends Controller
return $this->render('notice_manage'); return $this->render('notice_manage');
} }
/**
* @return string
*/
public function actionFeedbackManage(): string
{
return $this->render('feedback_manage');
}
/** /**
* @return string * @return string
*/ */
@ -609,4 +607,129 @@ class AdminController extends Controller
} }
return Yii::$app->response; return Yii::$app->response;
} }
/**
* @return string
*/
public function actionTicketManage(): string
{
$searchModel = new TicketsSearch();
$dataProvider = $searchModel->search($this->request->queryParams);
return $this->render('ticket_index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'pendingTickets' => TicketsSearch::getPendingTicketsCount()
]);
}
/**
* @param int $id
* @return string
* @throws NotFoundHttpException
*/
public function actionTicketView(int $id): string
{
//fetch all replies for this ticket
$ticketReplies = $this->findTicketReplies($id);
//json
$json = json_encode($ticketReplies);
return $this->render('ticket_view', [
'model' => $this->findTicketModel($id),
'ticketReplies' => $json,
]);
}
/**
* @param int $id
* @return Tickets
* @throws NotFoundHttpException
*/
protected function findTicketModel(int $id): Tickets
{
if (($model = Tickets::findOne(['id' => $id])) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
/**
* @param int $ticketId
* @return array
*/
protected function findTicketReplies(int $ticketId): array
{
$ticketReplies = TicketReplies::find()
->where(['ticket_id' => $ticketId])
->orderBy(['created_at' => SORT_ASC])
->all();
$result = [];
foreach ($ticketReplies as $reply) {
$result[] = $reply->toArray();
}
return $result;
}
/**
* NoNoNo, you can't delete a ticket. Just close it.
* @param int $id 工单id
* @param string $from
* @return Response
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionTicketDelete(int $id, string $from = 'unset'): Response
{
$this->findTicketModel($id)->updateAttributes(['status' => Tickets::STATUS_CLOSED]);
Yii::$app->session->setFlash('info', '工单已关闭');
if ($from !== 'unset') {
return $this->redirect(['ticket-manage']);
}
return $this->redirect(['ticket-view', 'id' => $id]);
}
/**
* Ticket reply action
* For user
* @return Response
* @throws NotFoundHttpException
*/
public function actionTicketReply(): Response
{
$request = Yii::$app->request;
if ($request->isPost) {
Yii::$app->response->format = Response::FORMAT_JSON;
$ticketId = $request->post('ticketId');
// check this ticket exists
$ticket = Tickets::findOne(['id' => $ticketId]);
if ($ticket === null) {
return $this->asJson(['status' => 'error', 'message' => 'Invalid ticket']);
}
// 创建一个新的TicketReplies对象
$reply = new TicketReplies();
$reply->ticket_id = $ticketId;
$reply->user_id = Yii::$app->user->id; // 设置为当前用户的ID
$reply->message = $request->post('content');
$reply->ip = $request->userIP;
$reply->is_admin = 1; // 设置为用户回复
$reply->created_at = date('Y-m-d H:i:s');
if ($reply->save()) {
// 如果保存成功,返回一个成功的响应
$this->findTicketModel($ticketId)->updateAttributes(['status' => Tickets::STATUS_ADMIN_REPLY]);
return $this->asJson(['status' => 'success']);
} else {
// 如果保存失败,返回一个包含错误信息的响应
return $this->asJson(['status' => 'error', 'errors' => $reply->errors]);
}
}
// 如果不是POST请求返回一个错误响应
return $this->asJson(['status' => 'error', 'message' => 'Invalid request']);
}
} }