This commit is contained in:
2026-06-30 09:31:33 +07:00
parent c736326162
commit bbf8336664
77 changed files with 12601 additions and 556 deletions

View File

@@ -9,7 +9,9 @@ import (
"time"
"server/internal/models"
internalDb "server/internal/db"
"server/internal/qldt"
"server/internal/util"
"gorm.io/gorm"
"gorm.io/gorm/clause"
@@ -104,6 +106,15 @@ func (j *StudentsSyncJob) run(db *gorm.DB, client *qldt.Client, token string) {
}
}
avatarVal := ""
if s.Avatar != nil {
avatarVal = util.NormalizeAvatarURL(*s.Avatar)
}
var avatar *string
if avatarVal != "" {
avatar = &avatarVal
}
st := models.Student{
RkID: s.ID,
StudentCode: s.StudentCode,
@@ -114,6 +125,7 @@ func (j *StudentsSyncJob) run(db *gorm.DB, client *qldt.Client, token string) {
Gender: s.Gender,
Status: s.Status,
Location: s.Location,
Avatar: avatar,
}
if s.System != nil {
sysID := s.System.ID
@@ -135,6 +147,7 @@ func (j *StudentsSyncJob) run(db *gorm.DB, client *qldt.Client, token string) {
"gender",
"status",
"location",
"avatar",
"system_id",
"system_name",
"updated_at",
@@ -302,29 +315,35 @@ func (j *ClassesSyncJob) run(db *gorm.DB, client *qldt.Client, token string) {
}
}
// Lưu liên kết Course
if err := tx.Where("class_rk_id = ?", cl.ID).Delete(&models.ClassCourseLink{}).Error; err != nil {
tx.Rollback()
j.setError("Failed to clear old class course links: " + err.Error())
return
}
var courseLinks []models.ClassCourseLink
for ord, co := range cl.Courses {
if co.ID == 0 {
continue
// Lưu danh sách môn học của lớp (từ API lớp + portal courses)
courseDTOs := make([]internalDb.ClassCourseDTO, 0, len(cl.Courses))
for _, co := range cl.Courses {
if co.ID > 0 {
courseDTOs = append(courseDTOs, internalDb.ClassCourseDTO{
ID: co.ID,
Name: co.Name,
})
}
courseLinks = append(courseLinks, models.ClassCourseLink{
ClassRkID: cl.ID,
CourseRkID: co.ID,
CourseName: co.Name,
CourseOrder: ord,
})
}
if len(courseLinks) > 0 {
if err := tx.Create(&courseLinks).Error; err != nil {
if portalRes, err := client.GetClassCourses(ctx, token, cl.ID); err == nil && len(portalRes.Data) > 0 {
portalDTOs := make([]internalDb.ClassCourseDTO, 0, len(portalRes.Data))
for _, co := range portalRes.Data {
if co.ID > 0 {
portalDTOs = append(portalDTOs, internalDb.ClassCourseDTO{
ID: co.ID,
Name: co.Name,
CourseCode: co.CourseCode,
})
}
}
courseDTOs = internalDb.MergeClassCourses(courseDTOs, portalDTOs)
}
if len(courseDTOs) > 0 {
if err := internalDb.UpsertClassCourses(tx, cl.ID, courseDTOs); err != nil {
tx.Rollback()
j.setError("Failed to insert class course links: " + err.Error())
j.setError("Failed to save class courses: " + err.Error())
return
}
}
@@ -354,6 +373,7 @@ func (j *ClassesSyncJob) run(db *gorm.DB, client *qldt.Client, token string) {
"gender",
"status",
"location",
"avatar",
"system_id",
"system_name",
"updated_at",
@@ -521,6 +541,11 @@ func extractStudentsFromDashboard(payloadJSON []byte) ([]models.Student, error)
status, _ := studentObj["status"].(string)
location, _ := studentObj["location"].(string)
var avatar *string
if av := util.PickAvatarFromMap(studentObj); av != "" {
avatar = &av
}
student := models.Student{
RkID: rkID,
StudentCode: stCode,
@@ -531,6 +556,7 @@ func extractStudentsFromDashboard(payloadJSON []byte) ([]models.Student, error)
Gender: gender,
Status: &status,
Location: &location,
Avatar: avatar,
}
if sysVal, ok := studentObj["system"].(map[string]interface{}); ok && sysVal != nil {