This commit is contained in:
@@ -205,6 +205,92 @@ func DeleteClassScheduleHandler(db *gorm.DB) fiber.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
// GET /api/classes/:rkId/schedule-conflicts - Kiểm tra sinh viên trùng với lớp đang giám sát có lịch học
|
||||
func GetClassScheduleConflictsHandler(db *gorm.DB) fiber.Handler {
|
||||
return func(c *fiber.Ctx) error {
|
||||
rkID, err := strconv.ParseInt(c.Params("rkId"), 10, 64)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid class rkId"})
|
||||
}
|
||||
|
||||
// Lấy danh sách sinh viên của lớp muốn kích hoạt
|
||||
var newClassStudents []int64
|
||||
if err := db.Model(&models.ClassStudent{}).Where("class_rk_id = ?", rkID).Pluck("student_rk_id", &newClassStudents).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
if len(newClassStudents) == 0 {
|
||||
return c.JSON(fiber.Map{"conflicts": []any{}, "ok": true})
|
||||
}
|
||||
|
||||
// Tìm các lớp đang giám sát CÓ lịch học (không bao gồm lớp đang được kiểm tra)
|
||||
var activeClassIDs []int64
|
||||
if err := db.Model(&models.ClassSchedule{}).Distinct("class_rk_id").Pluck("class_rk_id", &activeClassIDs).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
|
||||
// Lọc bỏ chính lớp đang kiểm tra
|
||||
var otherActiveIDs []int64
|
||||
for _, id := range activeClassIDs {
|
||||
if id != rkID {
|
||||
otherActiveIDs = append(otherActiveIDs, id)
|
||||
}
|
||||
}
|
||||
if len(otherActiveIDs) == 0 {
|
||||
return c.JSON(fiber.Map{"conflicts": []any{}, "ok": true})
|
||||
}
|
||||
|
||||
// Tìm sinh viên trùng
|
||||
var overlappingStudentIDs []int64
|
||||
if err := db.Model(&models.ClassStudent{}).
|
||||
Where("class_rk_id IN ? AND student_rk_id IN ?", otherActiveIDs, newClassStudents).
|
||||
Pluck("student_rk_id", &overlappingStudentIDs).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
if len(overlappingStudentIDs) == 0 {
|
||||
return c.JSON(fiber.Map{"conflicts": []any{}, "ok": true})
|
||||
}
|
||||
|
||||
// Lấy thông tin sinh viên và lớp bị trùng
|
||||
type conflictItem struct {
|
||||
StudentRkID int64 `json:"studentRkId"`
|
||||
FullName string `json:"fullName"`
|
||||
StudentCode string `json:"studentCode"`
|
||||
ConflictClassRkID int64 `json:"conflictClassRkId"`
|
||||
ConflictClassName string `json:"conflictClassName"`
|
||||
ConflictClassCode string `json:"conflictClassCode"`
|
||||
}
|
||||
|
||||
var conflicts []conflictItem
|
||||
for _, sid := range overlappingStudentIDs {
|
||||
var st models.Student
|
||||
if err := db.Where("rk_id = ?", sid).First(&st).Error; err != nil {
|
||||
continue
|
||||
}
|
||||
var classIDs []int64
|
||||
_ = db.Model(&models.ClassStudent{}).Where("class_rk_id IN ? AND student_rk_id = ?", otherActiveIDs, sid).Pluck("class_rk_id", &classIDs)
|
||||
for _, cid := range classIDs {
|
||||
var cls models.Class
|
||||
if err := db.Where("rk_id = ?", cid).First(&cls).Error; err != nil {
|
||||
continue
|
||||
}
|
||||
conflicts = append(conflicts, conflictItem{
|
||||
StudentRkID: sid,
|
||||
FullName: st.FullName,
|
||||
StudentCode: st.StudentCode,
|
||||
ConflictClassRkID: cid,
|
||||
ConflictClassName: cls.Name,
|
||||
ConflictClassCode: cls.ClassCode,
|
||||
})
|
||||
}
|
||||
}
|
||||
if conflicts == nil {
|
||||
conflicts = []conflictItem{}
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"conflicts": conflicts, "ok": len(conflicts) == 0})
|
||||
}
|
||||
}
|
||||
|
||||
func parseTimeMinutes(tStr string) int {
|
||||
parts := strings.Split(tStr, ":")
|
||||
if len(parts) != 2 {
|
||||
@@ -231,7 +317,9 @@ func GetAllowedAppsHandler(db *gorm.DB) fiber.Handler {
|
||||
if examInfo := internalDb.FindActiveExamForStudent(db, studentID); examInfo != nil {
|
||||
keywords := strings.TrimSpace(examInfo.Room.AllowedApps)
|
||||
if keywords == "" {
|
||||
keywords = defaultExamAllowedApps
|
||||
keywords = systemAllowedApps
|
||||
} else {
|
||||
keywords = keywords + "," + systemAllowedApps
|
||||
}
|
||||
return c.JSON(fiber.Map{
|
||||
"classRkId": rkID,
|
||||
@@ -307,7 +395,17 @@ func GetAllowedAppsHandler(db *gorm.DB) fiber.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(appConfig)
|
||||
keywords := strings.TrimSpace(appConfig.Keywords)
|
||||
if keywords != "" {
|
||||
keywords = keywords + "," + systemAllowedApps
|
||||
} else {
|
||||
keywords = systemAllowedApps
|
||||
}
|
||||
return c.JSON(fiber.Map{
|
||||
"classRkId": appConfig.ClassRkID,
|
||||
"keywords": keywords,
|
||||
"exit": false,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user