diff --git a/controllers/lesson_plan.go b/controllers/lesson_plan.go index cac4606..c1f3fdc 100644 --- a/controllers/lesson_plan.go +++ b/controllers/lesson_plan.go @@ -34,8 +34,13 @@ type LessonPlanController struct { } type lessonPlanPaginationParams struct { - PageNum int `form:"pageNum,default=1"` - PageSize int `form:"pageSize,default=10"` + PageNum int `form:"pageNum,default=1"` + PageSize int `form:"pageSize,default=10"` + Keyword string `form:"keyword"` // 文件名模糊搜索 + UploaderName string `form:"uploaderName"` // 上传者名模糊搜索 + RegionID uint32 `form:"regionId"` // 按幼儿园(区域)筛选 + SortBy string `form:"sortBy"` // file_size | created_at + SortOrder string `form:"sortOrder"` // asc | desc } type lessonPlanShareCodeResponse struct { @@ -192,20 +197,112 @@ func (lc *LessonPlanController) Page(c *gin.Context) { var total int64 var records []models.AppFile query := lc.DB.Model(&models.AppFile{}).Where("file_type = ?", models.AppFileTypeLessonPlan) + + // 角色权限过滤 if role != models.UserRoleSuperAdmin && role != models.UserRoleRegionAdmin { query = query.Where("uploader_id = ?", userID) } + + // 文件名模糊搜索 + if params.Keyword != "" { + query = query.Where("original_filename LIKE ?", "%"+params.Keyword+"%") + } + + // 上传者名模糊搜索 + if params.UploaderName != "" { + query = query.Where("uploader_name LIKE ?", "%"+params.UploaderName+"%") + } + + // 按区域(幼儿园)筛选:通过 user_region_bindings 查 uploader_id + if params.RegionID > 0 { + query = query.Where("uploader_id IN (SELECT user_id FROM user_region_bindings WHERE region_id = ?)", params.RegionID) + } + + // 排序 + orderClause := "created_at DESC" + if params.SortBy != "" { + switch params.SortBy { + case "file_size": + orderClause = "file_size" + case "created_at": + orderClause = "created_at" + } + if params.SortOrder == "asc" { + orderClause += " ASC" + } else { + orderClause += " DESC" + } + } + if err := query.Count(&total).Error; err != nil { writeError(c, http.StatusInternalServerError, "failed to count lesson plans") return } - if err := query.Order("created_at DESC").Offset(offset).Limit(params.PageSize).Find(&records).Error; err != nil { + if err := query.Order(orderClause).Offset(offset).Limit(params.PageSize).Find(&records).Error; err != nil { writeError(c, http.StatusInternalServerError, "failed to query lesson plans") return } + // 管理员可见所属幼儿园 + isAdmin := role == models.UserRoleSuperAdmin || role == models.UserRoleRegionAdmin + type lessonPlanItem struct { + models.AppFile + KindergartenName string `json:"kindergartenName"` + } + items := make([]lessonPlanItem, len(records)) + for i, r := range records { + items[i] = lessonPlanItem{AppFile: r} + } + if isAdmin && len(records) > 0 { + uploaderIDs := make([]uint, len(records)) + for i, r := range records { + uploaderIDs[i] = r.UploaderID + } + type uploaderRegion struct { + UserID uint + RegionID uint32 + } + var bindings []uploaderRegion + if err := lc.DB.Table("user_region_bindings"). + Select("user_id, region_id"). + Where("user_id IN ?", uploaderIDs). + Scan(&bindings).Error; err != nil { + writeError(c, http.StatusInternalServerError, "failed to query user regions") + return + } + regionIDs := make([]uint32, len(bindings)) + userRegionMap := make(map[uint]uint32, len(bindings)) + for _, b := range bindings { + userRegionMap[b.UserID] = b.RegionID + regionIDs = append(regionIDs, b.RegionID) + } + type regionKindergarten struct { + RegionID uint32 + Name string + } + var kindergartens []regionKindergarten + if err := lc.DB.Table("kindergartens"). + Select("region_id, name"). + Where("region_id IN ?", regionIDs). + Scan(&kindergartens).Error; err != nil { + writeError(c, http.StatusInternalServerError, "failed to query kindergartens") + return + } + regionNameMap := make(map[uint32]string, len(kindergartens)) + for _, k := range kindergartens { + regionNameMap[k.RegionID] = k.Name + } + for i, r := range records { + if rid, ok := userRegionMap[r.UploaderID]; ok { + if name, ok2 := regionNameMap[rid]; ok2 { + items[i].KindergartenName = name + } + } + } + } + writeSuccess(c, http.StatusOK, "query success", gin.H{ - "list": records, + "list": items, "pagination": gin.H{ "currentPage": params.PageNum, "pageSize": params.PageSize,