123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- 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
- 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
- }
- // 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
- }
|