package report import ( sql2 "database/sql" "eta/eta_api/global" "eta/eta_api/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 err = tx.Model(&ReportFreeLayout{}).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{}).CreateInBatches(list, len(list)).Error //.Clauses(clause.OnConflict{ // Columns: []clause.Column{{Name: "id"}}, // DoUpdates: clause.AssignmentColumns([]string{"content", "content_struct", "page", "modify_time"}), //}) } 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 } // GetReportFreeLayoutListByReportId // @Description: 根据报告ID和章节ID获取所有的布局列表 // @author: Roc // @datetime 2025-04-16 13:46:38 // @param reportId int // @param chapterId int // @return list []*ReportFreeLayout // @return err error func GetReportFreeLayoutListByReportId(reportId, chapterId int) (list []*ReportFreeLayout, err error) { 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(&list).Error return } // GetAllReportFreeLayoutListByReportId // @Description: 根据报告id获取所有的报告自由布局列表(含章节的) // @author: Roc // @datetime 2025-04-16 13:46:24 // @param reportId int // @return list []*ReportFreeLayout // @return err error func GetAllReportFreeLayoutListByReportId(reportId int) (list []*ReportFreeLayout, err error) { sql := `select * from report_free_layout where report_id =? order by page asc` err = global.DbMap[utils.DbNameReport].Raw(sql, reportId).Find(&list).Error return }