浏览代码

自由布局章节页脚重新排序

hsun 1 天之前
父节点
当前提交
b2d2d47bda
共有 3 个文件被更改,包括 99 次插入1 次删除
  1. 31 1
      controllers/report_chapter.go
  2. 15 0
      models/report/report_free_layout.go
  3. 53 0
      services/report_chapter.go

+ 31 - 1
controllers/report_chapter.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"fmt"
 	"html"
 	"os"
 	"path"
@@ -974,11 +975,31 @@ func (this *ReportController) ChapterMove() {
 		br.ErrMsg = "参数解析失败,Err:" + e.Error()
 		return
 	}
-
 	if req.ReportChapterId == 0 {
 		br.Msg = "请选择要移动的章节"
 		return
 	}
+	chapter, e := models.GetReportChapterInfoById(req.ReportChapterId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "章节不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取报告章节失败, %v", e)
+		return
+	}
+	reportItem, e := models.GetReportByReportId(chapter.ReportId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "报告不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取报告失败, %v", e)
+		return
+	}
+
 	e, msg := services.MoveReportChapter(&req)
 	if e != nil {
 		br.Msg = msg
@@ -986,6 +1007,15 @@ func (this *ReportController) ChapterMove() {
 		return
 	}
 
+	// 如果报告的布局是自由布局,那么查询下涉及移动的章节是否均已发布,如果均已发布那么需要重新排序页脚(未发布时会重新排不用管)
+	if reportItem.ReportLayout == 3 {
+		if e = services.ResortFreeChapter(reportItem.Id); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("自由布局章节重新排序失败, %v", e)
+			return
+		}
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 15 - 0
models/report/report_free_layout.go

@@ -4,6 +4,7 @@ import (
 	sql2 "database/sql"
 	"eta/eta_api/global"
 	"eta/eta_api/utils"
+	"fmt"
 	"gorm.io/gorm"
 	"gorm.io/gorm/clause"
 	"time"
@@ -264,3 +265,17 @@ func GetAllReportFreeLayoutListByReportId(reportId int) (list []*ReportFreeLayou
 
 	return
 }
+
+// ResetReportFreeLayoutsPage 更新自由布局页脚
+func ResetReportFreeLayoutsPage(items []*ReportFreeLayout) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	sql := `UPDATE report_free_layout SET page = ? WHERE id = ? LIMIT 1`
+	for _, v := range items {
+		if e := global.DbMap[utils.DbNameReport].Exec(sql, v.ReportId, v.Page).Error; e != nil {
+			return fmt.Errorf("ResetReportFreeLayoutsPage, %v", e)
+		}
+	}
+	return
+}

+ 53 - 0
services/report_chapter.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
 	"fmt"
+	"sort"
 	"time"
 )
 
@@ -240,3 +241,55 @@ func CheckChapterAuthByReportChapterInfo(sysUser *system.Admin, createAdminId in
 
 	return
 }
+
+// ResortFreeChapter 自由布局章节重新排序页脚
+func ResortFreeChapter(reportId int) (err error) {
+	// 获取排序后的章节列表
+	chapters, e := models.GetChapterListByReportId(reportId)
+	if e != nil {
+		err = fmt.Errorf("获取报告章节列表失败, %v", e)
+		return
+	}
+	sortChapter := make(map[int]int)
+	for _, v := range chapters {
+		// 如果存在任一章节未发布,那么无需重排
+		if v.PublishState != 2 {
+			return
+		}
+		sortChapter[v.ReportChapterId] = v.Sort
+	}
+
+	// 获取自由章节布局,根据章节顺序重新排序
+	layouts, e := report.GetAllReportFreeLayoutListByReportId(reportId)
+	if e != nil {
+		err = fmt.Errorf("获取章节自由布局失败, %v", e)
+		return
+	}
+	sort.Slice(layouts, func(i, j int) bool {
+		a := layouts[i]
+		b := layouts[j]
+		if a.ReportChapterId == b.ReportChapterId {
+			return a.Page < b.Page
+		}
+		return sortChapter[a.ReportChapterId] < sortChapter[b.ReportChapterId]
+	})
+
+	// 重排序并进行更新
+	updateLayouts := make([]*report.ReportFreeLayout, 0)
+	var resort int
+	for _, layout := range layouts {
+		resort += 1
+		if layout.Page != resort {
+			layout.Page = resort
+			updateLayouts = append(updateLayouts, layout)
+		}
+	}
+	if len(updateLayouts) == 0 {
+		return
+	}
+	if e = report.ResetReportFreeLayoutsPage(updateLayouts); e != nil {
+		err = fmt.Errorf("批量更新自由布局页脚失败, %v", e)
+		return
+	}
+	return
+}