From ed8d853d2a40071262a85503adb0dcf1ffa420e6 Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Mon, 28 Sep 2026 17:35:10 +0300 Subject: [PATCH] Admin group: counter = number of group students who submitted a solution --- .../ru/ysu/lms/progress/SubmissionController.kt | 7 ------- .../ru/ysu/lms/progress/SubmissionService.kt | 4 ---- .../lms/progress/repo/SubmissionRepository.kt | 2 -- .../ysu/lms/web/admin/AdminGroupController.kt | 14 +++++++++++--- .../ru/ysu/lms/web/api/ApiClientProgress.kt | 17 ----------------- 5 files changed, 11 insertions(+), 33 deletions(-) diff --git a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionController.kt b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionController.kt index 9652154..698a278 100644 --- a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionController.kt +++ b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionController.kt @@ -56,13 +56,6 @@ class SubmissionController( @RequestParam labId: UUID, ): List = submissions.latestPerStudent(labId) - /** Общее число решений (всех попыток) по лабораторной. */ - @GetMapping("/submissions/count") - @PreAuthorize("hasAuthority('ROLE_ADMIN')") - fun submissionCount( - @RequestParam labId: UUID, - ): Map = mapOf("count" to submissions.countForLab(labId)) - @GetMapping("/submissions/{id}/download") @PreAuthorize("hasAuthority('ROLE_ADMIN')") fun downloadForAdmin( diff --git a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionService.kt b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionService.kt index 1b0c869..4bff03e 100644 --- a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionService.kt +++ b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/SubmissionService.kt @@ -101,10 +101,6 @@ class SubmissionService( return zip to name } - /** Общее число решений (всех попыток) по лабораторной. */ - @Transactional(readOnly = true) - fun countForLab(labId: UUID): Long = submissions.countByLabId(labId) - @Transactional(readOnly = true) fun latestPerStudent(labId: UUID): List { val perStudent = mutableMapOf() diff --git a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/repo/SubmissionRepository.kt b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/repo/SubmissionRepository.kt index 8fac751..23941fa 100644 --- a/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/repo/SubmissionRepository.kt +++ b/services/progress-service/src/main/kotlin/ru/ysu/lms/progress/repo/SubmissionRepository.kt @@ -14,8 +14,6 @@ interface SubmissionRepository : JpaRepository { fun findByLabIdOrderByCreatedAtDesc(labId: UUID): List - fun countByLabId(labId: UUID): Long - fun findFirstByStudentIdAndLabIdOrderBySeqDesc( studentId: UUID, labId: UUID, diff --git a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt index 1f5f1e0..df95d4d 100644 --- a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt +++ b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt @@ -22,6 +22,7 @@ import ru.ysu.lms.web.api.GradeSetPayload import ru.ysu.lms.web.api.GroupDetailDto import ru.ysu.lms.web.api.LabSummaryDto import ru.ysu.lms.web.api.StudentCandidateDto +import ru.ysu.lms.web.api.SubmissionDto import ru.ysu.lms.web.api.createGroup import ru.ysu.lms.web.api.downloadSubmissionAsAdmin import ru.ysu.lms.web.api.getLabAssignments @@ -37,7 +38,6 @@ import ru.ysu.lms.web.api.listGroups import ru.ysu.lms.web.api.listLabs import ru.ysu.lms.web.api.publishGrades import ru.ysu.lms.web.api.setGrade -import ru.ysu.lms.web.api.submissionCount import ru.ysu.lms.web.api.suggestComments import tools.jackson.databind.ObjectMapper import java.net.URLEncoder @@ -192,7 +192,7 @@ class AdminGroupController( ) } - fillGroupModel(model, groupViewModel(t, id, GroupRenderData(group, labs, rows, publishedLabs))) + fillGroupModel(model, groupViewModel(t, id, GroupRenderData(group, labs, rows, publishedLabs, submissionsBy))) return "admin/group" } @@ -206,6 +206,7 @@ class AdminGroupController( val labs: List, val rows: List, val publishedLabs: Set, + val submissionsBy: Map>, ) private fun groupViewModel( @@ -213,7 +214,14 @@ class AdminGroupController( id: String, data: GroupRenderData, ): GroupViewModel { - val submissionCounts = data.labs.associate { it.id to api.submissionCount(token, it.id) } + val memberIds = + data.group.students + .map { it.id } + .toSet() + val submissionCounts = + data.labs.associate { lab -> + lab.id to (data.submissionsBy[lab]?.keys?.count { it in memberIds } ?: 0) + } val candidates = runCatching { api.groupCandidates(token, id) }.getOrDefault(emptyList()) return GroupViewModel(data.group, data.labs, candidates, data.rows, data.publishedLabs, submissionCounts) } diff --git a/web/src/main/kotlin/ru/ysu/lms/web/api/ApiClientProgress.kt b/web/src/main/kotlin/ru/ysu/lms/web/api/ApiClientProgress.kt index 7af70fc..ec736c4 100644 --- a/web/src/main/kotlin/ru/ysu/lms/web/api/ApiClientProgress.kt +++ b/web/src/main/kotlin/ru/ysu/lms/web/api/ApiClientProgress.kt @@ -6,23 +6,6 @@ import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.util.LinkedMultiValueMap -fun ApiClient.submissionCount( - token: String, - labId: String, -): Int { - val type = object : ParameterizedTypeReference>() {} - val result = - call { - client - .get() - .uri("/api/v1/submissions/count?labId={id}", labId) - .header(HttpHeaders.AUTHORIZATION, bearer(token)) - .retrieve() - .body(type) - } - return (result["count"] ?: 0L).toInt() -} - fun ApiClient.distribute( token: String, payload: DistributeRequestPayload,