refactor: lesson plan return value.
This commit is contained in:
+101
-4
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user