Quellcode durchsuchen

test: 智力共享相关接口

hsun vor 5 Monaten
Ursprung
Commit
fa0860d5f4
9 geänderte Dateien mit 503 neuen und 79 gelöschten Zeilen
  1. 3 3
      controllers/smart_report.go
  2. 2 2
      models/base.go
  3. 265 47
      models/report.go
  4. 76 27
      models/report_chapter.go
  5. 45 0
      routers/commentsRouter.go
  6. 5 0
      routers/router.go
  7. 85 0
      utils/common.go
  8. 8 0
      utils/config.go
  9. 14 0
      utils/constants.go

+ 3 - 3
controllers/smart_report.go

@@ -5,7 +5,6 @@ import (
 	"eta_gn/eta_report/utils"
 	"fmt"
 	"strconv"
-	"strings"
 )
 
 // SmartReportController 智能研报
@@ -144,8 +143,9 @@ func (this *SmartReportController) WechatShareDetail() {
 		return
 	}
 
-	date := strings.Replace(item.CreateTime, "-", "", -1)
-	dateStr := date[4:9]
+	//date := strings.Replace(item.CreateTime, "-", "", -1)
+	//dateStr := date[4:9]
+	dateStr := item.CreateTime.Format("01-02")
 	var shareTitle string
 	// 研报分享抬头
 	if utils.BusinessCode == "E2023080700" || utils.BusinessCode == "E2023080900" || utils.BusinessCode == "E2023080901" {

+ 2 - 2
models/base.go

@@ -5,8 +5,8 @@ const BaseRespIgnoreTipsRet = 4003 // 忽略提示的状态码
 type BaseResponse struct {
 	Ret         int
 	Msg         string
-	ErrMsg      string
-	ErrCode     string
+	ErrMsg      string `json:"-"`
+	ErrCode     string `json:"-"`
 	Data        interface{}
 	Success     bool `description:"true 执行成功,false 执行失败"`
 	IsSendEmail bool `json:"-"`

+ 265 - 47
models/report.go

@@ -2,56 +2,133 @@ package models
 
 import (
 	"eta_gn/eta_report/global"
+	"eta_gn/eta_report/utils"
+	"fmt"
+	"strings"
+	"time"
 )
 
+// 报告状态
+const (
+	ReportStateUnpublished = 1 // 未发布
+	ReportStatePublished   = 2 // 已发布
+	ReportStateWaitSubmit  = 3 // 待提交
+	ReportStateWaitApprove = 4 // 审批中
+	ReportStateRefused     = 5 // 已驳回
+	ReportStatePass        = 6 // 已通过
+)
+
+//type Report struct {
+//	Id                  int    `gorm:"primaryKey;autoIncrement;column:id"`
+//	AddType             int    `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
+//	ClassifyIdFirst     int    `gorm:"column:classify_id_first" description:"一级分类id"`
+//	ClassifyNameFirst   string `gorm:"column:classify_name_first" description:"一级分类名称"`
+//	ClassifyIdSecond    int    `gorm:"column:classify_id_second" description:"二级分类id"`
+//	ClassifyNameSecond  string `gorm:"column:classify_name_second" description:"二级分类名称"`
+//	Title               string `gorm:"column:title" description:"标题"`
+//	Abstract            string `gorm:"column:abstract" description:"摘要"`
+//	Author              string `gorm:"column:author" description:"作者"`
+//	Frequency           string `gorm:"column:frequency" description:"频度"`
+//	CreateTime          string `gorm:"column:create_time" description:"创建时间"`
+//	ModifyTime          string `gorm:"column:modify_time" description:"修改时间"`
+//	State               int    `gorm:"column:state" description:"1:未发布,2:已发布"`
+//	PublishTime         string `gorm:"column:publish_time" description:"发布时间"`
+//	PrePublishTime      string `gorm:"column:pre_publish_time" description:"预发布时间"`
+//	Stage               int    `gorm:"column:stage" description:"期数"`
+//	MsgIsSend           int    `gorm:"column:msg_is_send" description:"消息是否已发送,0:否,1:是"`
+//	Content             string `gorm:"column:content" description:"内容"`
+//	VideoUrl            string `gorm:"column:video_url" description:"音频文件URL"`
+//	VideoName           string `gorm:"column:video_name" description:"音频文件名称"`
+//	VideoPlaySeconds    string `gorm:"column:video_play_seconds" description:"音频播放时长"`
+//	VideoSize           string `gorm:"column:video_size" description:"音频文件大小,单位M"`
+//	ContentSub          string `gorm:"column:content_sub" description:"内容前两个章节"`
+//	IsShowNewLabel      int    `gorm:"column:is_show_new_label" description:"是否显示新标签"`
+//	IsCurrentDate       int    `gorm:"column:is_current_date" description:"是否当前日期"`
+//	ClassifyName        string `gorm:"column:classify_name" description:"分类名称"`
+//	HasChapter          int    `gorm:"column:has_chapter" description:"是否有章节"`
+//	ContentStruct       string `gorm:"column:content_struct" description:"内容组件"`
+//	LastModifyAdminId   int    `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
+//	LastModifyAdminName string `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
+//	ContentModifyTime   string `gorm:"column:content_modify_time" description:"内容更新时间"`
+//	Pv                  int    `gorm:"column:pv" description:"pv"`
+//	Uv                  int    `gorm:"column:uv" description:"uv"`
+//	HeadImg             string `gorm:"column:head_img" description:"报告头图地址"`
+//	EndImg              string `gorm:"column:end_img" description:"报告尾图地址"`
+//	HeadStyle           string `gorm:"column:head_style" description:"版头样式"`
+//	EndStyle            string `gorm:"column:end_style" description:"版尾样式"`
+//	CanvasColor         string `gorm:"column:canvas_color" description:"画布颜色"`
+//	NeedSplice          int    `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
+//	HeadResourceId      int    `gorm:"column:head_resource_id" description:"版头资源ID"`
+//	EndResourceId       int    `gorm:"column:end_resource_id" description:"版尾资源ID"`
+//	ClassifyIdThird     int    `gorm:"column:classify_id_third" description:"三级分类id"`
+//	ClassifyNameThird   string `gorm:"column:classify_name_third" description:"三级分类名称"`
+//	CollaborateType     int8   `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
+//	ReportLayout        int8   `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+//	IsPublicPublish     int8   `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
+//	ReportCreateTime    string `gorm:"column:report_create_time" description:"报告时间创建时间"`
+//}
+
 type Report struct {
-	Id                  int    `gorm:"primaryKey;autoIncrement;column:id"`
-	AddType             int    `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst     int    `gorm:"column:classify_id_first" description:"一级分类id"`
-	ClassifyNameFirst   string `gorm:"column:classify_name_first" description:"一级分类名称"`
-	ClassifyIdSecond    int    `gorm:"column:classify_id_second" description:"二级分类id"`
-	ClassifyNameSecond  string `gorm:"column:classify_name_second" description:"二级分类名称"`
-	Title               string `gorm:"column:title" description:"标题"`
-	Abstract            string `gorm:"column:abstract" description:"摘要"`
-	Author              string `gorm:"column:author" description:"作者"`
-	Frequency           string `gorm:"column:frequency" description:"频度"`
-	CreateTime          string `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime          string `gorm:"column:modify_time" description:"修改时间"`
-	State               int    `gorm:"column:state" description:"1:未发布,2:已发布"`
-	PublishTime         string `gorm:"column:publish_time" description:"发布时间"`
-	PrePublishTime      string `gorm:"column:pre_publish_time" description:"预发布时间"`
-	Stage               int    `gorm:"column:stage" description:"期数"`
-	MsgIsSend           int    `gorm:"column:msg_is_send" description:"消息是否已发送,0:否,1:是"`
-	Content             string `gorm:"column:content" description:"内容"`
-	VideoUrl            string `gorm:"column:video_url" description:"音频文件URL"`
-	VideoName           string `gorm:"column:video_name" description:"音频文件名称"`
-	VideoPlaySeconds    string `gorm:"column:video_play_seconds" description:"音频播放时长"`
-	VideoSize           string `gorm:"column:video_size" description:"音频文件大小,单位M"`
-	ContentSub          string `gorm:"column:content_sub" description:"内容前两个章节"`
-	IsShowNewLabel      int    `gorm:"column:is_show_new_label" description:"是否显示新标签"`
-	IsCurrentDate       int    `gorm:"column:is_current_date" description:"是否当前日期"`
-	ClassifyName        string `gorm:"column:classify_name" description:"分类名称"`
-	HasChapter          int    `gorm:"column:has_chapter" description:"是否有章节"`
-	ContentStruct       string `gorm:"column:content_struct" description:"内容组件"`
-	LastModifyAdminId   int    `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
-	LastModifyAdminName string `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
-	ContentModifyTime   string `gorm:"column:content_modify_time" description:"内容更新时间"`
-	Pv                  int    `gorm:"column:pv" description:"pv"`
-	Uv                  int    `gorm:"column:uv" description:"uv"`
-	HeadImg             string `gorm:"column:head_img" description:"报告头图地址"`
-	EndImg              string `gorm:"column:end_img" description:"报告尾图地址"`
-	HeadStyle           string `gorm:"column:head_style" description:"版头样式"`
-	EndStyle            string `gorm:"column:end_style" description:"版尾样式"`
-	CanvasColor         string `gorm:"column:canvas_color" description:"画布颜色"`
-	NeedSplice          int    `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
-	HeadResourceId      int    `gorm:"column:head_resource_id" description:"版头资源ID"`
-	EndResourceId       int    `gorm:"column:end_resource_id" description:"版尾资源ID"`
-	ClassifyIdThird     int    `gorm:"column:classify_id_third" description:"三级分类id"`
-	ClassifyNameThird   string `gorm:"column:classify_name_third" description:"三级分类名称"`
-	CollaborateType     int8   `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
-	ReportLayout        int8   `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
-	IsPublicPublish     int8   `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
-	ReportCreateTime    string `gorm:"column:report_create_time" description:"报告时间创建时间"`
+	Id                  int       `gorm:"column:id;primaryKey;autoIncrement" description:"报告Id"`
+	AddType             int       `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst     int       `gorm:"column:classify_id_first" description:"一级分类id"`
+	ClassifyNameFirst   string    `gorm:"column:classify_name_first" description:"一级分类名称"`
+	ClassifyIdSecond    int       `gorm:"column:classify_id_second" description:"二级分类id"`
+	ClassifyNameSecond  string    `gorm:"column:classify_name_second" description:"二级分类名称"`
+	Title               string    `gorm:"column:title" description:"标题"`
+	Abstract            string    `gorm:"column:abstract" description:"摘要"`
+	Author              string    `gorm:"column:author" description:"作者"`
+	Frequency           string    `gorm:"column:frequency" description:"频度"`
+	CreateTime          time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime          time.Time `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
+	State               int       `gorm:"column:state" description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
+	PublishTime         time.Time `gorm:"column:publish_time" description:"发布时间"`
+	Stage               int       `gorm:"column:stage" description:"期数"`
+	MsgIsSend           int       `gorm:"column:msg_is_send" description:"消息是否已发送,0:否,1:是"`
+	ThsMsgIsSend        int       `gorm:"column:ths_msg_is_send" description:"客户群消息是否已发送,0:否,1:是"`
+	Content             string    `gorm:"column:content" description:"内容"`
+	VideoUrl            string    `gorm:"column:video_url" description:"音频文件URL"`
+	VideoName           string    `gorm:"column:video_name" description:"音频文件名称"`
+	VideoPlaySeconds    string    `gorm:"column:video_play_seconds" description:"音频播放时长"`
+	VideoSize           string    `gorm:"column:video_size" description:"音频文件大小,单位M"`
+	ContentSub          string    `gorm:"column:content_sub" description:"内容前两个章节"`
+	ReportCode          string    `gorm:"column:report_code" description:"报告唯一编码"`
+	ReportVersion       int       `gorm:"column:report_version" description:"1:旧版,2:新版"`
+	HasChapter          int       `gorm:"column:has_chapter" description:"是否有章节 0-否 1-是"`
+	ChapterType         string    `gorm:"column:chapter_type" description:"章节类型 day-晨报 week-周报"`
+	OldReportId         int       `gorm:"column:old_report_id" description:"research_report表ID, 大于0则表示该报告为老后台同步过来的"`
+	MsgSendTime         time.Time `gorm:"column:msg_send_time" description:"模版消息发送时间"`
+	AdminId             int       `gorm:"column:admin_id" description:"创建者账号"`
+	AdminRealName       string    `gorm:"column:admin_real_name" description:"创建者姓名"`
+	ApproveTime         time.Time `gorm:"column:approve_time" description:"审批时间"`
+	ApproveId           int       `gorm:"column:approve_id" description:"审批ID"`
+	DetailImgUrl        string    `gorm:"column:detail_img_url" description:"报告详情长图地址"`
+	DetailPdfUrl        string    `gorm:"column:detail_pdf_url" description:"报告详情PDF地址"`
+	ContentStruct       string    `gorm:"column:content_struct" description:"内容组件"`
+	LastModifyAdminId   int       `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
+	LastModifyAdminName string    `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
+	ContentModifyTime   time.Time `gorm:"column:content_modify_time" description:"内容更新时间"`
+	Pv                  int       `gorm:"column:pv" description:"pv"`
+	Uv                  int       `gorm:"column:uv" description:"uv"`
+	HeadImg             string    `gorm:"column:head_img" description:"报告头图地址"`
+	EndImg              string    `gorm:"column:end_img" description:"报告尾图地址"`
+	CanvasColor         string    `gorm:"column:canvas_color" description:"画布颜色"`
+	NeedSplice          int       `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
+	HeadResourceId      int       `gorm:"column:head_resource_id" description:"版头资源ID"`
+	EndResourceId       int       `gorm:"column:end_resource_id" description:"版尾资源ID"`
+	ClassifyIdThird     int       `gorm:"column:classify_id_third" description:"三级分类id"`
+	ClassifyNameThird   string    `gorm:"column:classify_name_third" description:"三级分类名称"`
+	CollaborateType     int8      `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
+	ReportLayout        int8      `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	IsPublicPublish     int8      `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
+	ReportCreateTime    time.Time `gorm:"column:report_create_time" description:"报告时间创建时间"`
+	InheritReportId     int       `gorm:"column:inherit_report_id" description:"待继承的报告ID"`
+	VoiceGenerateType   int       `gorm:"column:voice_generate_type" description:"音频生成方式,0:系统生成,1:人工上传"`
+	ReportSource        int       `gorm:"column:report_source" description:"报告来源:1-系统内;2-智力共享"`
+	OutReportId         string    `gorm:"column:out_report_id" description:"外部报告ID(或编码)"`
+	TopicEndTime        time.Time `gorm:"column:topic_end_time" description:"课题结束时间"`
+	HeadStyle           string    `gorm:"-"`
+	EndStyle            string    `gorm:"-"`
 }
 
 func GetReportByCode(reportCode string) (item *Report, err error) {
@@ -91,3 +168,144 @@ func UpdateReportPv(reportId int) (err error) {
 
 	return
 }
+
+func (m *Report) TableName() string {
+	return "report"
+}
+
+func (m *Report) Update(cols []string) (err error) {
+	err = global.DEFAULT_DmSQL.Select(cols).Updates(m).Error
+	return
+}
+
+func (m *Report) Remove() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), "id")
+	err = global.DEFAULT_DmSQL.Exec(sql, m.Id).Error
+	return
+}
+
+func (m *Report) GetItemById(id int) (item *Report, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), "id")
+	err = global.DEFAULT_DmSQL.Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *Report) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *Report, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *Report) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM report WHERE 1=1 %s`, condition)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *Report) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*Report, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// CreateReportAndChapters 新增报告和章节
+func (m *Report) CreateReportAndChapters(newReport *Report, newChapters []*ReportChapter, newGrants []*ReportGrant) (reportId int, err error) {
+	if newReport == nil {
+		err = fmt.Errorf("report is nil")
+		return
+	}
+	tx := global.DEFAULT_DmSQL.Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 新增报告
+	if e := tx.Create(newReport).Error; e != nil {
+		err = fmt.Errorf("insert report err: %v", e)
+		return
+	}
+	reportId = newReport.Id
+
+	// 新增报告授权
+	if len(newGrants) > 0 {
+		for _, v := range newGrants {
+			v.ReportId = reportId
+		}
+		if e := tx.CreateInBatches(newGrants, utils.MultiAddNum).Error; e != nil {
+			err = fmt.Errorf("insert report grants err: %v", e)
+			return
+		}
+	}
+
+	// 新增报告章节
+	if len(newChapters) > 0 {
+		for _, v := range newChapters {
+			v.ReportId = reportId
+		}
+		if e := tx.CreateInBatches(newChapters, utils.MultiAddNum).Error; e != nil {
+			err = fmt.Errorf("insert report chapters err: %v", e)
+			return
+		}
+	}
+	return
+}
+
+// EditReportAndClearGrant 编辑报告和移除授权
+func (m *Report) EditReportAndClearGrant(reportItem *Report, updateCols []string, chapterIds, removeGrants []int) (err error) {
+	if reportItem == nil {
+		err = fmt.Errorf("report is nil")
+		return
+	}
+	tx := global.DEFAULT_DmSQL.Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 更新报告
+	if e := tx.Select(updateCols).Updates(reportItem).Error; e != nil {
+		err = fmt.Errorf("update report err: %v", e)
+		return
+	}
+
+	// 移除授权
+	removeLen := len(removeGrants)
+	if removeLen == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM report_grant WHERE report_id = ? AND admin_id IN (%s)`, utils.GetOrmInReplace(removeLen))
+	if e := tx.Exec(sql, reportItem.Id, removeGrants).Error; e != nil {
+		err = fmt.Errorf("remove report grants err: %v", e)
+		return
+	}
+
+	// 移除章节授权
+	if len(chapterIds) == 0 {
+		return
+	}
+	sql = fmt.Sprintf(`DELETE FROM report_chapter_grant WHERE report_chapter_id IN (%s) AND admin_id IN (%s)`, utils.GetOrmInReplace(len(chapterIds)), utils.GetOrmInReplace(removeLen))
+	if e := tx.Exec(sql, chapterIds, removeGrants).Error; e != nil {
+		err = fmt.Errorf("remove chapter grants err: %v", e)
+		return
+	}
+	return
+}

+ 76 - 27
models/report_chapter.go

@@ -2,38 +2,47 @@ package models
 
 import (
 	"eta_gn/eta_report/global"
+	"fmt"
+	"strings"
 	"time"
 )
 
 // ReportChapter 报告章节
 type ReportChapter struct {
-	ReportChapterId   int       `gorm:"primaryKey;autoIncrement;column:reportChapterId"`
-	ReportId          int       `gorm:"column:report_id" description:"报告ID"`
-	ReportType        string    `gorm:"column:report_type" description:"报告类型 day-晨报 week-周报"`
-	ClassifyIdFirst   int       `gorm:"column:classify_id_first" description:"一级分类id"`
-	ClassifyNameFirst string    `gorm:"column:classify_name_first" description:"一级分类名称"`
-	TypeId            int       `gorm:"column:type_id" description:"品种ID"`
-	TypeName          string    `gorm:"column:type_name" description:"品种名称"`
-	Title             string    `gorm:"column:title" description:"标题"`
-	Abstract          string    `gorm:"column:abstract" description:"摘要"`
-	AddType           int       `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
-	Author            string    `gorm:"column:author" description:"作者"`
-	Content           string    `gorm:"column:content" description:"内容"`
-	ContentSub        string    `gorm:"column:content_sub" description:"内容前两个章节"`
-	Stage             int       `gorm:"column:stage" description:"期数"`
-	Trend             string    `gorm:"column:trend" description:"趋势观点"`
-	Sort              int       `gorm:"column:sort" description:"排序: 数值越小越靠前"`
-	IsEdit            int       `gorm:"column:is_edit" description:"是否已编辑 0-待编辑 1-已编辑"`
-	PublishState      int       `gorm:"column:publish_state" description:"发布状态 1-待发布,2-已发布"`
-	PublishTime       time.Time `gorm:"column:publish_time" description:"发布时间"`
-	VideoUrl          string    `gorm:"column:video_url" description:"音频文件URL"`
-	VideoName         string    `gorm:"column:video_name" description:"音频文件名称"`
-	VideoPlaySeconds  string    `gorm:"column:video_play_seconds" description:"音频播放时长"`
-	VideoSize         string    `gorm:"column:video_size" description:"音频文件大小,单位M"`
-	VideoKind         int       `gorm:"column:video_kind" description:"音频生成方式:1,手动上传,2:自动生成"`
-	CreateTime        string    `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime        time.Time `gorm:"column:modify_time" description:"修改时间"`
-	OriginalVideoUrl  string    `gorm:"column:original_video_url" description:"原始音频文件URL"`
+	ReportChapterId     int       `gorm:"primaryKey;autoIncrement;column:report_chapter_id"`
+	ReportId            int       `gorm:"column:report_id" description:"报告ID"`
+	ReportType          string    `gorm:"column:report_type" description:"报告类型 day-晨报 week-周报"`
+	ClassifyIdFirst     int       `gorm:"column:classify_id_first" description:"一级分类id"`
+	ClassifyNameFirst   string    `gorm:"column:classify_name_first" description:"一级分类名称"`
+	TypeId              int       `gorm:"column:type_id" description:"品种ID"`
+	TypeName            string    `gorm:"column:type_name" description:"品种名称"`
+	Title               string    `gorm:"column:title" description:"标题"`
+	Abstract            string    `gorm:"column:abstract" description:"摘要"`
+	AddType             int       `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
+	Author              string    `gorm:"column:author" description:"作者"`
+	Content             string    `gorm:"column:content" description:"内容"`
+	ContentSub          string    `gorm:"column:content_sub" description:"内容前两个章节"`
+	Stage               int       `gorm:"column:stage" description:"期数"`
+	Trend               string    `gorm:"column:trend" description:"趋势观点"`
+	Sort                int       `gorm:"column:sort" description:"排序: 数值越小越靠前"`
+	IsEdit              int       `gorm:"column:is_edit" description:"是否已编辑 0-待编辑 1-已编辑"`
+	PublishState        int       `gorm:"column:publish_state" description:"发布状态 1-待发布,2-已发布"`
+	PublishTime         time.Time `gorm:"column:publish_time" description:"发布时间"`
+	VideoUrl            string    `gorm:"column:video_url" description:"音频文件URL"`
+	VideoName           string    `gorm:"column:video_name" description:"音频文件名称"`
+	VideoPlaySeconds    string    `gorm:"column:video_play_seconds" description:"音频播放时长"`
+	VideoSize           string    `gorm:"column:video_size" description:"音频文件大小,单位M"`
+	VideoKind           int       `gorm:"column:video_kind" description:"音频生成方式:1,手动上传,2:自动生成"`
+	CreateTime          time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime          time.Time `gorm:"column:modify_time" description:"修改时间"`
+	OriginalVideoUrl    string    `gorm:"column:original_video_url" description:"原始音频文件URL"`
+	ContentStruct       string    `gorm:"column:content_struct" description:"内容组件"`
+	LastModifyAdminId   int       `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
+	LastModifyAdminName string    `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
+	ContentModifyTime   time.Time `gorm:"column:content_modify_time" description:"内容更新时间"`
+	ReportLayout        int       `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	ReportCreateTime    time.Time `gorm:"column:report_create_time" description:"报告时间创建时间"`
+	VoiceGenerateType   int       `gorm:"column:voice_generate_type" description:"音频生成方式,0:系统生成,1:人工上传"`
 }
 
 // GetPublishedChapterListByReportId 根据ReportId获取已发布章节列表
@@ -43,3 +52,43 @@ func GetPublishedChapterListByReportId(reportId int) (list []*ReportChapter, err
 	err = global.DEFAULT_DmSQL.Raw(sql, reportId).Find(&list).Error
 	return
 }
+
+func (m *ReportChapter) TableName() string {
+	return "report_chapter"
+}
+
+func (m *ReportChapter) GetItemById(id int) (item *ReportChapter, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), "id")
+	err = global.DEFAULT_DmSQL.Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *ReportChapter) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ReportChapter, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *ReportChapter) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM report WHERE 1=1 %s`, condition)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *ReportChapter) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ReportChapter, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
+	return
+}

+ 45 - 0
routers/commentsRouter.go

@@ -43,6 +43,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"],
+        beego.ControllerComments{
+            Method: "ReportApprove",
+            Router: `/report/approve`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"],
+        beego.ControllerComments{
+            Method: "ClassifyTree",
+            Router: `/report/classify`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"],
+        beego.ControllerComments{
+            Method: "ReportCreate",
+            Router: `/report/create`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"],
+        beego.ControllerComments{
+            Method: "ReportModify",
+            Router: `/report/modify`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportOpenController"],
+        beego.ControllerComments{
+            Method: "ReportRemove",
+            Router: `/report/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_report/controllers:ReportShareController"],
         beego.ControllerComments{
             Method: "Detail",

+ 5 - 0
routers/router.go

@@ -44,6 +44,11 @@ func init() {
 				&controllers.ChartController{},
 			),
 		),
+		web.NSNamespace("/v1",
+			web.NSInclude(
+				&controllers.ReportOpenController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 85 - 0
utils/common.go

@@ -1,12 +1,16 @@
 package utils
 
 import (
+	"crypto/hmac"
 	"crypto/md5"
 	"crypto/sha1"
+	"crypto/sha256"
 	"encoding/base64"
 	"encoding/hex"
 	"encoding/json"
+	"errors"
 	"fmt"
+	"gorm.io/gorm"
 	"image"
 	"image/png"
 	"math"
@@ -15,6 +19,7 @@ import (
 	"os"
 	"os/exec"
 	"regexp"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -204,6 +209,17 @@ func ErrNoRow() string {
 	return "<QuerySeter> no row found"
 }
 
+// IsErrNoRow
+// @Description: 判断是否是gorm的查询不到数据的报错
+// @param err
+// @return bool
+func IsErrNoRow(err error) bool {
+	if err == nil {
+		return false
+	}
+	return errors.Is(err, gorm.ErrRecordNotFound)
+}
+
 // 校验邮箱格式
 func ValidateEmailFormatat(email string) bool {
 	reg := regexp.MustCompile(RegularEmail)
@@ -580,3 +596,72 @@ func TimeTransferString(format string, t time.Time) string {
 	}
 	return str
 }
+
+// HmacSha256 计算HmacSha256
+// key 是加密所使用的key
+// data 是加密的内容
+func HmacSha256(key string, data string) []byte {
+	mac := hmac.New(sha256.New, []byte(key))
+	_, _ = mac.Write([]byte(data))
+
+	return mac.Sum(nil)
+}
+
+// HmacSha256ToBase64 将加密后的二进制转Base64字符串
+func HmacSha256ToBase64(key string, data string) string {
+	return base64.URLEncoding.EncodeToString(HmacSha256(key, data))
+}
+
+func GetSign(nonce, timestamp string) (sign string) {
+	signStrMap := map[string]string{
+		"nonce":     nonce,
+		"timestamp": timestamp,
+		"appid":     AppId,
+	}
+	keys := make([]string, 0, len(signStrMap))
+	for k := range signStrMap {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	var signStr string
+	for _, k := range keys {
+		signStr += k + "=" + signStrMap[k] + "&"
+	}
+	signStr = strings.Trim(signStr, "&")
+	fmt.Println("signStr:" + signStr)
+	sign = HmacSha256ToBase64(Secret, signStr)
+	fmt.Println("sign:" + sign)
+	return
+}
+
+// GetOrmInReplace 获取orm的in查询替换?的方法
+func GetOrmInReplace(num int) string {
+	//template := make([]string, num)
+	//for i := 0; i < num; i++ {
+	//	template[i] = "?"
+	//}
+	//return strings.Join(template, ",")
+	return "?"
+}
+
+// InArrayByInt php中的in_array(判断Int类型的切片中是否存在该int值)
+func InArrayByInt(idIntList []int, searchId int) (has bool) {
+	for _, id := range idIntList {
+		if id == searchId {
+			has = true
+			return
+		}
+	}
+	return
+}
+
+// InArrayByStr php中的in_array(判断String类型的切片中是否存在该string值)
+func InArrayByStr(idStrList []string, searchId string) (has bool) {
+	for _, id := range idStrList {
+		if id == searchId {
+			has = true
+			return
+		}
+	}
+	return
+}

+ 8 - 0
utils/config.go

@@ -100,6 +100,11 @@ var (
 	S3OpenAcl         string
 )
 
+var (
+	AppId  string
+	Secret string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -236,4 +241,7 @@ func init() {
 		S3DisableSSL = config["s3_disable_ssl"]
 		S3OpenAcl = config["s3_open_acl"]
 	}
+
+	AppId = config["appid"]
+	Secret = config["secret"]
 }

+ 14 - 0
utils/constants.go

@@ -105,3 +105,17 @@ const (
 	STORAGESOURCE_MINIO_NAME = "minio"
 	STORAGESOURCE_S3_NAME    = "s3"
 )
+
+const (
+	ReportTypeDefault     = 1 // 报告类型-默认研报
+	ReportTypePPT         = 2 // 报告类型-PPT
+	ReportSourceLocal     = 1 // 报告来源-本地
+	ReportSourceOuter     = 2 // 报告来源-外部
+	ReportAddTypeNew      = 1 // 报告新增方式-新增
+	ReportAddTypeInherit  = 2 // 报告新增方式-继承
+	ReportWriteTypeSingle = 1 // 报告协作方式-个人
+	ReportWriteTypeGroup  = 2 // 报告协作方式-多人
+)
+
+// MultiAddNum 批量插入的数据量
+const MultiAddNum = 500