|
@@ -0,0 +1,234 @@
|
|
|
+package models
|
|
|
+
|
|
|
+import (
|
|
|
+ sql2 "database/sql"
|
|
|
+ "eta/eta_report/global"
|
|
|
+ "eta/eta_report/utils"
|
|
|
+ "gorm.io/gorm"
|
|
|
+ "gorm.io/gorm/clause"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type ReportFreeLayout struct {
|
|
|
+ Id int `gorm:"primaryKey;autoIncrement;column:id"` // 主键
|
|
|
+ ReportId int `gorm:"column:report_id"` // 研报Id
|
|
|
+ ReportChapterId int `gorm:"column:report_chapter_id"` // 章节Id
|
|
|
+ Page int `gorm:"column:page"` // 页码
|
|
|
+ IsChapter int `gorm:"column:is_chapter"` // 是否多章节
|
|
|
+ Content string `gorm:"column:content;size:255"` // 内容
|
|
|
+ ContentStruct string `gorm:"column:content_struct;size:255"` // 内容
|
|
|
+ CreateTime time.Time `gorm:"column:create_time"` // 创建时间
|
|
|
+ ModifyTime time.Time `gorm:"column:modify_time"` // 修改时间
|
|
|
+}
|
|
|
+type PagePositionEnum string
|
|
|
+
|
|
|
+const (
|
|
|
+ Left PagePositionEnum = "left"
|
|
|
+ Right PagePositionEnum = "right"
|
|
|
+ Center PagePositionEnum = "center"
|
|
|
+)
|
|
|
+
|
|
|
+type ContentPage struct {
|
|
|
+ Id int `json:"Id"`
|
|
|
+ Page int `json:"Page"`
|
|
|
+ Content string `json:"Content"`
|
|
|
+ ContentStruct string `json:"ContentStruct"`
|
|
|
+ ReportId int `json:"ChapterId"`
|
|
|
+ ReportChapterId int `json:"ReportChapterId"`
|
|
|
+}
|
|
|
+
|
|
|
+func (cp *ContentPage) ToView(isChapter bool, ReportId int, ReportChapterId int) *ReportFreeLayout {
|
|
|
+ if isChapter {
|
|
|
+ return &ReportFreeLayout{
|
|
|
+ ReportId: ReportId,
|
|
|
+ ReportChapterId: ReportChapterId,
|
|
|
+ Page: cp.Page,
|
|
|
+ IsChapter: 1,
|
|
|
+ Content: cp.Content,
|
|
|
+ ContentStruct: cp.ContentStruct,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return &ReportFreeLayout{
|
|
|
+ ReportId: ReportId,
|
|
|
+ ReportChapterId: ReportChapterId,
|
|
|
+ Page: cp.Page,
|
|
|
+ IsChapter: 0,
|
|
|
+ Content: cp.Content,
|
|
|
+ ContentStruct: cp.ContentStruct,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+func (cp *ReportFreeLayout) ToPageView() *ContentPage {
|
|
|
+ return &ContentPage{
|
|
|
+ Page: cp.Page,
|
|
|
+ Content: cp.Content,
|
|
|
+ ContentStruct: cp.ContentStruct,
|
|
|
+ ReportId: cp.ReportId,
|
|
|
+ ReportChapterId: cp.ReportChapterId,
|
|
|
+ }
|
|
|
+}
|
|
|
+func ToOrmViewList(srcList []ContentPage, isChapter bool, ReportId int, ReportChapterId int) (list []*ReportFreeLayout) {
|
|
|
+ for _, v := range srcList {
|
|
|
+ list = append(list, v.ToView(isChapter, ReportId, ReportChapterId))
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func ToPageViewList(srcList []*ReportFreeLayout) (list []*ContentPage) {
|
|
|
+ for _, v := range srcList {
|
|
|
+ list = append(list, v.ToPageView())
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// TableName 设置表名
|
|
|
+func (*ReportFreeLayout) TableName() string {
|
|
|
+ return "report_free_layout"
|
|
|
+}
|
|
|
+
|
|
|
+func SortPage(reportId int, tx *gorm.DB) (err error) {
|
|
|
+ if tx == nil {
|
|
|
+ tx = global.DbMap[utils.DbNameReport].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ _ = tx.Rollback()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _ = tx.Commit()
|
|
|
+ }()
|
|
|
+ }
|
|
|
+ sql := `select * from report_free_layout where report_id = ? and is_chapter=1 order by page asc`
|
|
|
+ var ormList []*ReportFreeLayout
|
|
|
+ err = tx.Raw(sql, reportId).Find(&ormList).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(ormList) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ chapterPages := make(map[int][]*ReportFreeLayout)
|
|
|
+ for _, v := range ormList {
|
|
|
+ chapterPages[v.ReportChapterId] = append(chapterPages[v.ReportChapterId], v)
|
|
|
+ }
|
|
|
+
|
|
|
+ chapterSql := `select report_chapter_id from report_chapter where report_id =? order by sort asc`
|
|
|
+ var chapterIds []int
|
|
|
+ err = tx.Raw(chapterSql, reportId).Scan(&chapterIds).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ initPage := 1
|
|
|
+ for _, chapter := range chapterIds {
|
|
|
+ chapterList := chapterPages[chapter]
|
|
|
+ for _, v := range chapterList {
|
|
|
+ v.Page = initPage
|
|
|
+ initPage++
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ var updateList []*ReportFreeLayout
|
|
|
+ for _, chapterList := range chapterPages {
|
|
|
+ updateList = append(updateList, chapterList...)
|
|
|
+ }
|
|
|
+ err = tx.Model(&ReportFreeLayout{}).Clauses(clause.OnConflict{
|
|
|
+ Columns: []clause.Column{{Name: "Id"}},
|
|
|
+ DoUpdates: clause.AssignmentColumns([]string{"Page"}),
|
|
|
+ }).CreateInBatches(updateList, len(updateList)).Error
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func DeleteChapters(reportId int, chapterId int) (err error) {
|
|
|
+ tx := global.DbMap[utils.DbNameReport].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ _ = tx.Rollback()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _ = tx.Commit()
|
|
|
+ }()
|
|
|
+ err = tx.Exec("delete from report_free_layout where report_id = ? and report_chapter_id=? and is_chapter=1", reportId, chapterId).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = SortPage(reportId, tx)
|
|
|
+ return
|
|
|
+}
|
|
|
+func BatchInsertOrUpdatePages(tx *gorm.DB, list []*ReportFreeLayout, isChapter bool, reportId, chapterId int) (err error) {
|
|
|
+ if isChapter {
|
|
|
+ err = tx.Exec("delete from report_free_layout where report_id = ? and report_chapter_id=? and is_chapter=1", reportId, chapterId).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = tx.Model(&ReportFreeLayout{}).Clauses(clause.OnConflict{
|
|
|
+ Columns: []clause.Column{{Name: "id"}},
|
|
|
+ DoUpdates: clause.AssignmentColumns([]string{"content", "content_struct", "modify_time"}),
|
|
|
+ }).CreateInBatches(list, len(list)).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = SortPage(reportId, tx)
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ err = tx.Exec("delete from report_free_layout where report_id = ? and is_chapter=0", reportId).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = tx.Model(&ReportFreeLayout{}).Clauses(clause.OnConflict{
|
|
|
+ Columns: []clause.Column{{Name: "id"}},
|
|
|
+ DoUpdates: clause.AssignmentColumns([]string{"content", "content_struct", "page", "modify_time"}),
|
|
|
+ }).CreateInBatches(list, len(list)).Error
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+func GetPrevFreeLayoutChaptersPagesByChapterId(reportId int, chapterId int) (pageNum int, err error) {
|
|
|
+ var pageNumNullable sql2.NullInt64
|
|
|
+ sql := `SELECT count(*)
|
|
|
+FROM report_free_layout rfl
|
|
|
+JOIN report_chapter rc ON rc.report_id = rfl.report_id and rc.report_chapter_id=rfl.report_chapter_id
|
|
|
+WHERE rfl.report_id = ?
|
|
|
+ AND rc.sort < (
|
|
|
+ SELECT sort
|
|
|
+ FROM report_chapter
|
|
|
+ WHERE report_id = ? and report_chapter_id=?
|
|
|
+ )`
|
|
|
+ err = global.DbMap[utils.DbNameReport].Raw(sql, reportId, reportId, chapterId).Scan(&pageNumNullable).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if pageNumNullable.Valid {
|
|
|
+ pageNum = int(pageNumNullable.Int64)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+func GetFreeLayoutChapterPagesByReportId(reportId int) (list []*ContentPage, err error) {
|
|
|
+ var ormList []*ReportFreeLayout
|
|
|
+ sql := `select rfl.*,rc.sort from report_free_layout rfl LEFT JOIN report_chapter rc on rc.report_id=rfl.report_id and rc.report_chapter_id=rfl.report_chapter_id where rfl.report_id =? order by rc.sort,rfl.page asc`
|
|
|
+ err = global.DbMap[utils.DbNameReport].Raw(sql, reportId).Find(&ormList).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ list = ToPageViewList(ormList)
|
|
|
+ return
|
|
|
+}
|
|
|
+func GetSingleFreeLayoutChapterPagesByReportId(reportId, chapterId int) (list []*ContentPage, err error) {
|
|
|
+ var ormList []*ReportFreeLayout
|
|
|
+ sql := `select * from report_free_layout where report_id =? and report_chapter_id=? order by page asc`
|
|
|
+ err = global.DbMap[utils.DbNameReport].Raw(sql, reportId, chapterId).Find(&ormList).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ list = ToPageViewList(ormList)
|
|
|
+ return
|
|
|
+}
|
|
|
+func GetFreeLayoutPagesByReportId(id int) (list []*ContentPage, err error) {
|
|
|
+ var ormList []*ReportFreeLayout
|
|
|
+ sql := `select * from report_free_layout where report_id =? and is_chapter=0 order by page asc`
|
|
|
+ err = global.DbMap[utils.DbNameReport].Raw(sql, id).Find(&ormList).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ list = ToPageViewList(ormList)
|
|
|
+ return
|
|
|
+}
|