diff --git a/admin/src/utils/api.js b/admin/src/utils/api.js index 2e4a63a6..d38417a5 100644 --- a/admin/src/utils/api.js +++ b/admin/src/utils/api.js @@ -81,6 +81,9 @@ const api = { deleteExamUser: (id) => { return axios.delete('exam-users/' + id); }, + avoidExamUser: (id) => { + return axios.put('exam-users-avoid', {id}); + }, storeExamUser: (params) => { return axios.post('exam-users', params); }, diff --git a/admin/src/views/user/detail.vue b/admin/src/views/user/detail.vue index 78b38424..fb53be77 100644 --- a/admin/src/views/user/detail.vue +++ b/admin/src/views/user/detail.vue @@ -116,6 +116,15 @@ Remove + + + @@ -190,6 +199,12 @@ export default { await fetchPageData() } + const handleAvoidExam = async (id) => { + let res = await api.avoidExamUser(id) + ElMessage.success(res.msg) + await fetchPageData() + } + const handleAssignExam = async () => { assignExam.value.open(id) } @@ -213,6 +228,7 @@ export default { return { ...toRefs(state), handleRemoveExam, + handleAvoidExam, handleAssignExam, handleEnableUser, handleViewInviteInfo, diff --git a/app/Http/Controllers/ExamUserController.php b/app/Http/Controllers/ExamUserController.php index 843bd697..6b7db3ae 100644 --- a/app/Http/Controllers/ExamUserController.php +++ b/app/Http/Controllers/ExamUserController.php @@ -92,4 +92,11 @@ class ExamUserController extends Controller return $this->success($result, 'Remove user exam success!'); } + public function avoid(Request $request) + { + $request->validate(['id' => 'required']); + $result = $this->repository->avoidExamUser($request->id); + return $this->success($result, 'Avoid user exam success!'); + } + } diff --git a/app/Models/ExamUser.php b/app/Models/ExamUser.php index c820681d..eae62b69 100644 --- a/app/Models/ExamUser.php +++ b/app/Models/ExamUser.php @@ -10,10 +10,12 @@ class ExamUser extends NexusModel const STATUS_NORMAL = 0; const STATUS_FINISHED = 1; + const STATUS_AVOIDED = -1; public static $status = [ self::STATUS_NORMAL => ['text' => 'Normal'], self::STATUS_FINISHED => ['text' => 'Finished'], + self::STATUS_AVOIDED => ['text' => 'Avoided'], ]; const IS_DONE_YES = 1; diff --git a/app/Repositories/ExamRepository.php b/app/Repositories/ExamRepository.php index 5b66163a..21184f75 100644 --- a/app/Repositories/ExamRepository.php +++ b/app/Repositories/ExamRepository.php @@ -355,6 +355,7 @@ class ExamRepository extends BaseRepository } $examUsers = $query->get(); if ($examUsers->isEmpty()) { + do_log("$logPrefix, no examUser, query: " . last_query()); return null; } if ($examUsers->count() > 1) { @@ -454,6 +455,13 @@ class ExamRepository extends BaseRepository return $result; } + public function avoidExamUser(int $examUserId) + { + $examUser = ExamUser::query()->findOrFail($examUserId); + $result = $examUser->update(['status' => ExamUser::STATUS_AVOIDED]); + return $result; + } + public function cronjonAssign() { $exams = $this->listValid(null, Exam::DISCOVERED_YES); diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 5b34bcff..86aaadc1 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -37,7 +37,7 @@ class UserRepository extends BaseRepository $baseInfo = $userResource->response()->getData(true)['data']; $examRep = new ExamRepository(); - $examProgress = $examRep->getUserExamProgress($id, ExamUser::STATUS_NORMAL, ['exam']); + $examProgress = $examRep->getUserExamProgress($id, null, ['exam']); if ($examProgress) { $examResource = new ExamUserResource($examProgress); $examInfo = $examResource->response()->getData(true)['data']; diff --git a/routes/api.php b/routes/api.php index 379905f0..bec01c9d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -49,6 +49,7 @@ Route::group(['middleware' => ['auth:sanctum', 'permission', 'locale']], functio Route::get('exam-indexes', [\App\Http\Controllers\ExamController::class, 'indexes']); Route::resource('exam-users', \App\Http\Controllers\ExamUserController::class); + Route::put('exam-users-avoid', [\App\Http\Controllers\ExamUserController::class, 'avoid']); Route::get('dashboard/system-info', [\App\Http\Controllers\DashboardController::class, 'systemInfo']); Route::get('dashboard/stat-data', [\App\Http\Controllers\DashboardController::class, 'statData']);