Roc 5 napja
szülő
commit
5e63a2dd45

+ 4 - 0
models/business_conf.go

@@ -65,6 +65,7 @@ const (
 	BusinessConfEsWechatArticle              = "EsIndexNameWechatArticle"         // ES索引名称-微信文章
 	BusinessConfEsWechatArticleAbstract      = "EsIndexNameWechatArticleAbstract" // ES索引名称-微信文章摘要
 	BusinessConfEsRagQuestion                = "EsIndexNameRagQuestion"           // ES索引名称-知识库问题
+	BusinessConfEsRagEtaReportAbstract       = "EsIndexNameRagEtaReportAbstract"  // ES索引名称-eta报告摘要
 	BusinessConfIsOpenChartExpired           = "IsOpenChartExpired"               // 是否开启图表有效期鉴权/报告禁止复制
 	BusinessConfReportChartExpiredTime       = "ReportChartExpiredTime"           // 图表有效期鉴权时间,单位:分钟
 	BusinessConfOssUrlReplace                = "OssUrlReplace"                    // OSS地址替换-兼容内网客户用
@@ -282,6 +283,9 @@ func InitBusinessConf() {
 	if BusinessConfMap[BusinessConfEsRagQuestion] != "" {
 		utils.EsRagQuestionName = BusinessConfMap[BusinessConfEsRagQuestion]
 	}
+	if BusinessConfMap[BusinessConfEsRagEtaReportAbstract] != "" {
+		utils.EsRagEtaReportAbstractName = BusinessConfMap[BusinessConfEsRagEtaReportAbstract]
+	}
 	confStr := BusinessConfMap[LLMInitConfig]
 	if confStr != "" {
 		var config LLMConfig

+ 6 - 6
models/rag/article_abstract_history.go

@@ -12,7 +12,7 @@ type ArticleAbstractHistory struct {
 	Source                   int8      `gorm:"column:source" description:"来源,0:公众号文章,1:eta报告"`
 	ArticleAbstractID        int       `gorm:"column:article_abstract_id" description:"文章/报告摘要id"`
 	ArticleID                int       `gorm:"column:article_id" description:"文章/报告Id"`
-	QuestionID               int       `gorm:"column:question_id" description:"提示词Id"`
+	QuestionId               int       `gorm:"column:question_id" description:"提示词Id"`
 	Tags                     string    `gorm:"column:tags" description:"标签"`
 	QuestionContent          string    `gorm:"column:question_content" description:"questionContent"`
 	Content                  string    `gorm:"column:content" description:"摘要内容"`
@@ -33,7 +33,7 @@ var ArticleAbstractHistoryColumns = struct {
 	Source                   string
 	ArticleAbstractID        string
 	ArticleID                string
-	QuestionID               string
+	QuestionId               string
 	Tags                     string
 	QuestionContent          string
 	Content                  string
@@ -46,7 +46,7 @@ var ArticleAbstractHistoryColumns = struct {
 	Source:                   "source",
 	ArticleAbstractID:        "article_abstract_id",
 	ArticleID:                "article_id",
-	QuestionID:               "question_id",
+	QuestionId:               "question_id",
 	Tags:                     "tags",
 	QuestionContent:          "question_content",
 	Content:                  "content",
@@ -71,9 +71,9 @@ func AddArticleAbstractHistoryByWechatArticleAbstract(item *RagEtaReportAbstract
 	history := &ArticleAbstractHistory{
 		ArticleAbstractHistoryID: 0,
 		Source:                   0,
-		ArticleAbstractID:        item.RagEtaReportAbstractID,
-		ArticleID:                item.RagEtaReportID,
-		QuestionID:               item.QuestionID,
+		ArticleAbstractID:        item.RagEtaReportAbstractId,
+		ArticleID:                item.RagEtaReportId,
+		QuestionId:               item.QuestionId,
 		Tags:                     item.Tags,
 		QuestionContent:          item.QuestionContent,
 		Content:                  item.Content,

+ 3 - 3
models/rag/question.go

@@ -29,7 +29,7 @@ func (m *Question) TableName() string {
 
 // QuestionColumns get sql column name.获取数据库列名
 var QuestionColumns = struct {
-	QuestionID      string
+	QuestionId      string
 	QuestionTitle   string
 	QuestionContent string
 	Sort            string
@@ -39,7 +39,7 @@ var QuestionColumns = struct {
 	ModifyTime      string
 	CreateTime      string
 }{
-	QuestionID:      "question_id",
+	QuestionId:      "question_id",
 	QuestionTitle:   "question_title",
 	QuestionContent: "question_content",
 	Sort:            "sort",
@@ -116,7 +116,7 @@ func (m *Question) ListToViewList(list []*Question) (wechatArticleViewList []Que
 }
 
 func (m *Question) GetByID(id int) (item *Question, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", QuestionColumns.QuestionID), id).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", QuestionColumns.QuestionId), id).First(&item).Error
 
 	return
 }

+ 4 - 4
models/rag/question_history.go

@@ -9,7 +9,7 @@ import (
 // QuestionHistory 问题历史列表
 type QuestionHistory struct {
 	QuestionHistoryID int       `gorm:"primaryKey;column:question_history_id" description:"-"`
-	QuestionID        int       `gorm:"column:question_id" description:"问题ID"`
+	QuestionId        int       `gorm:"column:question_id" description:"问题ID"`
 	QuestionTitle     string    `gorm:"column:question_title" description:"问题标题"`
 	QuestionContent   string    `gorm:"column:question_content" description:"问题内容"`
 	Sort              int       `gorm:"column:sort" description:"排序"`
@@ -30,7 +30,7 @@ func (m *QuestionHistory) TableName() string {
 // QuestionHistoryColumns get sql column name.获取数据库列名
 var QuestionHistoryColumns = struct {
 	QuestionHistoryID string
-	QuestionID        string
+	QuestionId        string
 	QuestionTitle     string
 	QuestionContent   string
 	Sort              string
@@ -43,7 +43,7 @@ var QuestionHistoryColumns = struct {
 	CreateTime        string
 }{
 	QuestionHistoryID: "question_history_id",
-	QuestionID:        "question_id",
+	QuestionId:        "question_id",
 	QuestionTitle:     "question_title",
 	QuestionContent:   "question_content",
 	Sort:              "sort",
@@ -70,7 +70,7 @@ func (m *QuestionHistory) Create() (err error) {
 func AddQuestionHistoryByQuestion(item *Question) {
 	history := &QuestionHistory{
 		QuestionHistoryID: 0,
-		QuestionID:        item.QuestionId,
+		QuestionId:        item.QuestionId,
 		QuestionTitle:     item.QuestionTitle,
 		QuestionContent:   item.QuestionContent,
 		Sort:              item.Sort,

+ 3 - 3
models/rag/rag_eta_report.go

@@ -31,7 +31,7 @@ func (m *RagEtaReport) TableName() string {
 
 // RagEtaReportColumns get sql column name.获取数据库列名
 var RagEtaReportColumns = struct {
-	RagEtaReportID  string
+	RagEtaReportId  string
 	ReportID        string
 	ReportChapterID string
 	Title           string
@@ -44,7 +44,7 @@ var RagEtaReportColumns = struct {
 	ModifyTime      string
 	CreateTime      string
 }{
-	RagEtaReportID:  "rag_eta_report_id",
+	RagEtaReportId:  "rag_eta_report_id",
 	ReportID:        "report_id",
 	ReportChapterID: "report_chapter_id",
 	Title:           "title",
@@ -121,7 +121,7 @@ func (m *RagEtaReport) Update(updateCols []string) (err error) {
 }
 
 func (m *RagEtaReport) GetById(id int) (item *RagEtaReport, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", RagEtaReportColumns.RagEtaReportID), id).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", RagEtaReportColumns.RagEtaReportId), id).First(&item).Error
 
 	return
 }

+ 43 - 46
models/rag/rag_eta_report_abstract.go

@@ -10,16 +10,16 @@ import (
 
 // EtaReportAbstract 报告摘要
 type RagEtaReportAbstract struct {
-	RagEtaReportAbstractID int       `gorm:"primaryKey;column:rag_eta_report_abstract_id" json:"-"`
-	RagEtaReportID         int       `gorm:"column:rag_eta_report_id" json:"ragEtaReportId"` // ETA报告id
-	Content                string    `gorm:"column:content" json:"content"`                  // 摘要内容
-	QuestionID             int       `gorm:"column:question_id" json:"questionId"`           // 提示词Id
-	QuestionContent        string    `gorm:"column:question_content" json:"questionContent"`
-	Version                int       `gorm:"column:version" json:"version"`      // 版本号
-	Tags                   string    `gorm:"column:tags" json:"tags"`            // 标签
-	VectorKey              string    `gorm:"column:vector_key" json:"vectorKey"` // 向量key标识
-	ModifyTime             time.Time `gorm:"column:modify_time" json:"modifyTime"`
-	CreateTime             time.Time `gorm:"column:create_time" json:"createTime"`
+	RagEtaReportAbstractId int       `gorm:"primaryKey;column:rag_eta_report_abstract_id" description:"-"`
+	RagEtaReportId         int       `gorm:"column:rag_eta_report_id" description:"ETA报告id"`
+	Content                string    `gorm:"column:content" description:"摘要内容"`
+	QuestionId             int       `gorm:"column:question_id" description:"提示词Id"`
+	QuestionContent        string    `gorm:"column:question_content" description:"questionContent"`
+	Version                int       `gorm:"column:version" description:"版本号"`
+	Tags                   string    `gorm:"column:tags" description:"标签"`
+	VectorKey              string    `gorm:"column:vector_key" description:"向量key标识"`
+	ModifyTime             time.Time `gorm:"column:modify_time" description:"modifyTime"`
+	CreateTime             time.Time `gorm:"column:create_time" description:"createTime"`
 }
 
 // TableName get sql table name.获取数据库表名
@@ -29,10 +29,10 @@ func (m *RagEtaReportAbstract) TableName() string {
 
 // EtaReportAbstractColumns get sql column name.获取数据库列名
 var EtaReportAbstractColumns = struct {
-	RagEtaReportAbstractID string
-	RagEtaReportID         string
+	RagEtaReportAbstractId string
+	RagEtaReportId         string
 	Content                string
-	QuestionID             string
+	QuestionId             string
 	QuestionContent        string
 	Version                string
 	Tags                   string
@@ -40,10 +40,10 @@ var EtaReportAbstractColumns = struct {
 	ModifyTime             string
 	CreateTime             string
 }{
-	RagEtaReportAbstractID: "rag_eta_report_abstract_id",
-	RagEtaReportID:         "rag_eta_report_id",
+	RagEtaReportAbstractId: "rag_eta_report_abstract_id",
+	RagEtaReportId:         "rag_eta_report_id",
 	Content:                "content",
-	QuestionID:             "question_id",
+	QuestionId:             "question_id",
 	QuestionContent:        "question_content",
 	Version:                "version",
 	Tags:                   "tags",
@@ -71,13 +71,13 @@ func (m *RagEtaReportAbstract) Del() (err error) {
 }
 
 func (m *RagEtaReportAbstract) GetById(id int) (item *RagEtaReportAbstract, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", EtaReportAbstractColumns.RagEtaReportAbstractID), id).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", EtaReportAbstractColumns.RagEtaReportAbstractId), id).First(&item).Error
 
 	return
 }
 
 func (m *RagEtaReportAbstract) GetByIdList(idList []int) (items []*RagEtaReportAbstract, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s in (?) ", EtaReportAbstractColumns.RagEtaReportAbstractID), idList).Find(&items).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s in (?) ", EtaReportAbstractColumns.RagEtaReportAbstractId), idList).Find(&items).Error
 
 	return
 }
@@ -97,7 +97,7 @@ func (m *RagEtaReportAbstract) DelByIdList(idList []int) (err error) {
 	if len(idList) <= 0 {
 		return
 	}
-	sqlStr := fmt.Sprintf(`delete from %s where %s in (?)`, m.TableName(), EtaReportAbstractColumns.RagEtaReportAbstractID)
+	sqlStr := fmt.Sprintf(`delete from %s where %s in (?)`, m.TableName(), EtaReportAbstractColumns.RagEtaReportAbstractId)
 	err = global.DbMap[utils.DbNameAI].Exec(sqlStr, idList).Error
 
 	return
@@ -112,7 +112,7 @@ func (m *RagEtaReportAbstract) DelByIdList(idList []int) (err error) {
 // @return item *RagEtaReportAbstract
 // @return err error
 func (m *RagEtaReportAbstract) GetByRagEtaReportId(id int) (item *RagEtaReportAbstract, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", EtaReportAbstractColumns.RagEtaReportID), id).Order(fmt.Sprintf(`%s DESC`, EtaReportAbstractColumns.RagEtaReportAbstractID)).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", EtaReportAbstractColumns.RagEtaReportId), id).Order(fmt.Sprintf(`%s DESC`, EtaReportAbstractColumns.RagEtaReportAbstractId)).First(&item).Error
 
 	return
 }
@@ -127,60 +127,57 @@ func (m *RagEtaReportAbstract) GetByRagEtaReportId(id int) (item *RagEtaReportAb
 // @return item *RagEtaReportAbstract
 // @return err error
 func (m *RagEtaReportAbstract) GetByRagEtaReportIdAndQuestionId(articleId, questionId int) (item *RagEtaReportAbstract, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ? AND %s = ? ", EtaReportAbstractColumns.RagEtaReportID, EtaReportAbstractColumns.QuestionID), articleId, questionId).Order(fmt.Sprintf(`%s DESC`, WechatArticleAbstractColumns.WechatArticleAbstractID)).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ? AND %s = ? ", EtaReportAbstractColumns.RagEtaReportId, EtaReportAbstractColumns.QuestionId), articleId, questionId).Order(fmt.Sprintf(`%s DESC`, WechatArticleAbstractColumns.WechatArticleAbstractID)).First(&item).Error
 
 	return
 }
 
-type EtaReportAbstractView struct {
-	RagEtaReportAbstractID int    `gorm:"primaryKey;column:rag_eta_report_abstract_id" json:"-"`
-	RagEtaReportID         int    `gorm:"column:rag_eta_report_id" json:"ragEtaReportId"` // ETA报告id
+type RagEtaReportAbstractView struct {
+	RagEtaReportAbstractId int    `gorm:"primaryKey;column:rag_eta_report_abstract_id" description:"-"`
+	RagEtaReportId         int    `gorm:"column:rag_eta_report_id" description:"ETA报告id"` //
 	Abstract               string `gorm:"column:abstract;type:longtext;comment:摘要内容;" description:"摘要内容"`
-	QuestionID             int    `gorm:"column:question_id" json:"questionId"` // 提示词Id
-	QuestionContent        string `gorm:"column:question_content" json:"questionContent"`
-	Version                int    `gorm:"column:version" json:"version"`      // 版本号
-	Tags                   string `gorm:"column:tags" json:"tags"`            // 标签
-	VectorKey              string `gorm:"column:vector_key" json:"vectorKey"` // 向量key标识
+	QuestionId             int    `gorm:"column:question_id" description:"提示词Id"` //
+	QuestionContent        string `gorm:"column:question_content" description:"questionContent"`
+	Version                int    `gorm:"column:version" description:"版本号"`        //
+	Tags                   string `gorm:"column:tags" description:"标签"`            //
+	VectorKey              string `gorm:"column:vector_key" description:"向量key标识"` //
 	ModifyTime             string `gorm:"column:modify_time;type:datetime;default:NULL;" description:"modify_time"`
 	CreateTime             string `gorm:"column:create_time;type:datetime;default:NULL;" description:"create_time"`
 	Title                  string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
-	Link                   string `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
 }
 
 type RagEtaReportAbstractItem struct {
-	RagEtaReportAbstractID int       `gorm:"primaryKey;column:rag_eta_report_abstract_id" json:"-"`
-	RagEtaReportID         int       `gorm:"column:rag_eta_report_id" json:"ragEtaReportId"` // ETA报告id
+	RagEtaReportAbstractId int       `gorm:"primaryKey;column:rag_eta_report_abstract_id" description:"-"`
+	RagEtaReportId         int       `gorm:"column:rag_eta_report_id" description:"ETA报告id"`
 	Abstract               string    `gorm:"column:abstract;type:longtext;comment:摘要内容;" description:"摘要内容"`
-	QuestionID             int       `gorm:"column:question_id" json:"questionId"` // 提示词Id
-	QuestionContent        string    `gorm:"column:question_content" json:"questionContent"`
-	Version                int       `gorm:"column:version" json:"version"`      // 版本号
-	Tags                   string    `gorm:"column:tags" json:"tags"`            // 标签
-	VectorKey              string    `gorm:"column:vector_key" json:"vectorKey"` // 向量key标识
+	QuestionId             int       `gorm:"column:question_id" description:"提示词Id"`
+	QuestionContent        string    `gorm:"column:question_content" description:"questionContent"`
+	Version                int       `gorm:"column:version" description:"版本号"`
+	Tags                   string    `gorm:"column:tags" description:"标签"`
+	VectorKey              string    `gorm:"column:vector_key" description:"向量key标识"`
 	ModifyTime             time.Time `gorm:"column:modify_time;type:datetime;default:NULL;" description:"modify_time"`
 	CreateTime             time.Time `gorm:"column:create_time;type:datetime;default:NULL;" description:"create_time"`
 	Title                  string    `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
-	Link                   string    `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
 }
 
-func (m *RagEtaReportAbstractItem) ToView() EtaReportAbstractView {
-	return EtaReportAbstractView{
-		RagEtaReportAbstractID: m.RagEtaReportAbstractID,
-		RagEtaReportID:         m.RagEtaReportID,
+func (m *RagEtaReportAbstractItem) ToView() RagEtaReportAbstractView {
+	return RagEtaReportAbstractView{
+		RagEtaReportAbstractId: m.RagEtaReportAbstractId,
+		RagEtaReportId:         m.RagEtaReportId,
 		Abstract:               m.Abstract,
 		Version:                m.Version,
 		VectorKey:              m.VectorKey,
 		ModifyTime:             utils.DateStrToDateTimeStr(m.ModifyTime),
 		CreateTime:             utils.DateStrToDateTimeStr(m.CreateTime),
 		Title:                  m.Title,
-		Link:                   m.Link,
-		QuestionID:             m.QuestionID,
+		QuestionId:             m.QuestionId,
 		Tags:                   m.Tags,
 		QuestionContent:        m.QuestionContent,
 	}
 }
 
-func (m *RagEtaReportAbstract) EtaReportAbstractItem(list []*RagEtaReportAbstractItem) (etaReportAbstractViewList []EtaReportAbstractView) {
-	etaReportAbstractViewList = make([]EtaReportAbstractView, 0)
+func (m *RagEtaReportAbstract) EtaReportAbstractItem(list []*RagEtaReportAbstractItem) (etaReportAbstractViewList []RagEtaReportAbstractView) {
+	etaReportAbstractViewList = make([]RagEtaReportAbstractView, 0)
 
 	for _, v := range list {
 		etaReportAbstractViewList = append(etaReportAbstractViewList, v.ToView())

+ 7 - 7
models/rag/wechat_article_abstract.go

@@ -16,7 +16,7 @@ type WechatArticleAbstract struct {
 	VectorKey               string    `gorm:"column:vector_key;type:varchar(255);comment:向量key标识;" description:"向量key标识"`
 	ModifyTime              time.Time `gorm:"column:modify_time;type:datetime;default:NULL;" description:"modify_time"`
 	CreateTime              time.Time `gorm:"column:create_time;type:datetime;default:NULL;" description:"create_time"`
-	QuestionID              int       `gorm:"column:question_id" description:"提示词Id"`
+	QuestionId              int       `gorm:"column:question_id" description:"提示词Id"`
 	Tags                    string    `gorm:"column:tags" description:"标签"`
 	QuestionContent         string    `gorm:"column:question_content" description:"提示词内容"`
 }
@@ -30,7 +30,7 @@ func (m *WechatArticleAbstract) TableName() string {
 var WechatArticleAbstractColumns = struct {
 	WechatArticleAbstractID string
 	WechatArticleID         string
-	QuestionID              string
+	QuestionId              string
 	Tags                    string
 	QuestionContent         string
 	Content                 string
@@ -40,7 +40,7 @@ var WechatArticleAbstractColumns = struct {
 }{
 	WechatArticleAbstractID: "wechat_article_abstract_id",
 	WechatArticleID:         "wechat_article_id",
-	QuestionID:              "question_id",
+	QuestionId:              "question_id",
 	Tags:                    "tags",
 	QuestionContent:         "question_content",
 	Content:                 "content",
@@ -124,7 +124,7 @@ func (m *WechatArticleAbstract) GetByWechatArticleId(id int) (item *WechatArticl
 // @return item *WechatArticleAbstract
 // @return err error
 func (m *WechatArticleAbstract) GetByWechatArticleIdAndQuestionId(articleId, questionId int) (item *WechatArticleAbstract, err error) {
-	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ? AND %s = ? ", WechatArticleAbstractColumns.WechatArticleID, WechatArticleAbstractColumns.QuestionID), articleId, questionId).Order(fmt.Sprintf(`%s DESC`, WechatArticleAbstractColumns.WechatArticleAbstractID)).First(&item).Error
+	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ? AND %s = ? ", WechatArticleAbstractColumns.WechatArticleID, WechatArticleAbstractColumns.QuestionId), articleId, questionId).Order(fmt.Sprintf(`%s DESC`, WechatArticleAbstractColumns.WechatArticleAbstractID)).First(&item).Error
 
 	return
 }
@@ -141,7 +141,7 @@ type WechatArticleAbstractView struct {
 	Title                   string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
 	Link                    string `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
 	TagId                   int    `gorm:"column:tag_id;type:int(9) UNSIGNED;comment:品种id;default:0;" description:"品种id"`
-	QuestionID              int    `gorm:"column:question_id" description:"提示词Id"`
+	QuestionId              int    `gorm:"column:question_id" description:"提示词Id"`
 	Tags                    string `gorm:"column:tags" description:"标签"`
 	QuestionContent         string `gorm:"column:question_content" description:"提示词内容"`
 }
@@ -157,7 +157,7 @@ type WechatArticleAbstractItem struct {
 	Title                   string    `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
 	Link                    string    `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
 	TagId                   int       `gorm:"column:tag_id;type:int(9) UNSIGNED;comment:品种id;default:0;" description:"品种id"`
-	QuestionID              int       `gorm:"column:question_id" description:"提示词Id"`
+	QuestionId              int       `gorm:"column:question_id" description:"提示词Id"`
 	Tags                    string    `gorm:"column:tags" description:"标签"`
 	QuestionContent         string    `gorm:"column:question_content" description:"提示词内容"`
 }
@@ -174,7 +174,7 @@ func (m *WechatArticleAbstractItem) ToView() WechatArticleAbstractView {
 		Title:                   m.Title,
 		Link:                    m.Link,
 		TagId:                   m.TagId,
-		QuestionID:              m.QuestionID,
+		QuestionId:              m.QuestionId,
 		Tags:                    m.Tags,
 		QuestionContent:         m.QuestionContent,
 	}

+ 317 - 0
services/elastic/rag_eta_report_abstract.go

@@ -0,0 +1,317 @@
+package elastic
+
+import (
+	"context"
+	"encoding/json"
+	"eta/eta_api/models/rag"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	"time"
+)
+
+// 摘要索引
+var EsRagEtaReportAbstractName = utils.EsRagEtaReportAbstractName
+
+type RagEtaReportAbstractItem struct {
+	RagEtaReportAbstractId int       `gorm:"primaryKey;column:rag_eta_report_abstract_id" description:"-"`
+	RagEtaReportId         int       `gorm:"column:rag_eta_report_id" description:"ETA报告id"`
+	Abstract               string    `gorm:"column:abstract;type:longtext;comment:摘要内容;" description:"摘要内容"`
+	QuestionId             int       `gorm:"column:question_id" description:"提示词Id"`
+	Version                int       `gorm:"column:version" description:"版本号"`
+	VectorKey              string    `gorm:"column:vector_key" description:"向量key标识"`
+	ModifyTime             time.Time `gorm:"column:modify_time" description:"modifyTime"`
+	CreateTime             time.Time `gorm:"column:create_time" description:"createTime"`
+	Title                  string    `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
+	TagIdList              []int     `description:"品种id列表"`
+}
+
+func (m *RagEtaReportAbstractItem) ToView() rag.RagEtaReportAbstractView {
+	var modifyTime, createTime string
+
+	if !m.CreateTime.IsZero() {
+		createTime = m.CreateTime.Format(utils.FormatDateTime)
+	}
+	if !m.ModifyTime.IsZero() {
+		modifyTime = m.ModifyTime.Format(utils.FormatDateTime)
+	}
+
+	//tagId := 0
+	//if len(m.TagIdList) > 0 {
+	//	tagId = m.TagIdList[0]
+	//}
+
+	return rag.RagEtaReportAbstractView{
+		RagEtaReportAbstractId: m.RagEtaReportAbstractId,
+		RagEtaReportId:         m.RagEtaReportId,
+		Abstract:               m.Abstract,
+		QuestionId:             m.QuestionId,
+		//QuestionContent:        m.,
+		Version: m.Version,
+		//Tags:                   m.Ta,
+		VectorKey:  m.VectorKey,
+		ModifyTime: modifyTime,
+		CreateTime: createTime,
+		Title:      m.Title,
+	}
+}
+
+func (m *RagEtaReportAbstractItem) ToViewList(list []*RagEtaReportAbstractItem) (wechatArticleViewList []rag.RagEtaReportAbstractView) {
+	wechatArticleViewList = make([]rag.RagEtaReportAbstractView, 0)
+
+	for _, v := range list {
+		wechatArticleViewList = append(wechatArticleViewList, v.ToView())
+	}
+	return
+}
+
+// RagEtaReportEsAddOrEdit
+// @Description: 新增/编辑微信文章
+// @author: Roc
+// @datetime 2025-03-13 10:24:05
+// @param docId string
+// @param item RagEtaReportAndPlatform
+// @return err error
+func RagEtaReportAbstractEsAddOrEdit(docId string, item RagEtaReportAbstractItem) (err error) {
+	if docId == "" {
+		return
+	}
+	if EsRagEtaReportAbstractName == `` {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("RagEtaReportEsAddOrEdit Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+
+	resp, err := client.Index().Index(EsRagEtaReportAbstractName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
+	if err != nil {
+		fmt.Println("新增失败:", err.Error())
+		return err
+	}
+	if resp.Status == 0 {
+		fmt.Println("新增成功", resp.Result)
+		err = nil
+	} else {
+		fmt.Println("RagEtaReportEsAddOrEdit", resp.Status, resp.Result)
+	}
+
+	return
+}
+
+// RagEtaReportEsDel
+// @Description: 删除微信文章
+// @author: Roc
+// @datetime 2025-03-13 10:23:55
+// @param docId string
+// @return err error
+func RagEtaReportAbstractEsDel(docId string) (err error) {
+	if docId == "" {
+		return
+	}
+	if EsRagEtaReportAbstractName == `` {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("EsDeleteEdbInfoData Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+
+	resp, err := client.Delete().Index(EsRagEtaReportAbstractName).Id(docId).Refresh(`true`).Do(context.Background())
+	if err != nil {
+		return
+	}
+	if resp.Status == 0 {
+		fmt.Println("删除成功")
+	} else {
+		fmt.Println("RagEtaReportEsDel", resp.Status, resp.Result)
+	}
+
+	return
+}
+
+// RagEtaReportAbstractEsSearch
+// @Description: 搜索
+// @author: Roc
+// @datetime 2025-03-13 19:54:54
+// @param keywordStr string
+// @param tagIdList []int
+// @param platformIdList []int
+// @param from int
+// @param size int
+// @param sortMap map[string]string
+// @return total int64
+// @return list []*RagEtaReportAbstractItem
+// @return err error
+func RagEtaReportAbstractEsSearch(keywordStr string, tagIdList, platformIdList []int, from, size int, sortMap map[string]string) (total int64, list []*RagEtaReportAbstractItem, err error) {
+	indexName := EsRagEtaReportAbstractName
+	list = make([]*RagEtaReportAbstractItem, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("SearchEdbInfoData Err:", err.Error())
+		}
+	}()
+
+	query := elastic.NewBoolQuery()
+
+	if len(tagIdList) > 0 {
+		termsList := make([]interface{}, 0)
+		for _, v := range tagIdList {
+			termsList = append(termsList, v)
+		}
+		query = query.Must(elastic.NewTermsQuery("TagIdList", termsList...))
+	}
+	if len(platformIdList) <= 0 {
+		return
+	}
+
+	{
+		termsList := make([]interface{}, 0)
+		for _, v := range platformIdList {
+			termsList = append(termsList, v)
+		}
+		query = query.Must(elastic.NewTermsQuery("WechatPlatformId", termsList...))
+	}
+
+	// 名字匹配
+	if keywordStr != `` {
+		query = query.Must(elastic.NewMultiMatchQuery(keywordStr, "Abstract"))
+	}
+
+	// 排序
+	sortList := make([]*elastic.FieldSort, 0)
+	// 如果没有关键字,那么就走指标id倒序
+
+	for orderKey, orderType := range sortMap {
+		switch orderType {
+		case "asc":
+			sortList = append(sortList, elastic.NewFieldSort(orderKey).Asc())
+		case "desc":
+			sortList = append(sortList, elastic.NewFieldSort(orderKey).Desc())
+
+		}
+
+	}
+
+	return searchRagEtaReportAbstract(indexName, query, sortList, from, size)
+}
+
+// searchEdbInfoDataV2 查询es中的数据
+func searchRagEtaReportAbstract(indexName string, query elastic.Query, sortList []*elastic.FieldSort, from, size int) (total int64, list []*RagEtaReportAbstractItem, err error) {
+	total, err = searchRagEtaReportAbstractTotal(indexName, query)
+	if err != nil {
+		return
+	}
+
+	// 获取列表数据
+	list, err = searchRagEtaReportAbstractList(indexName, query, sortList, from, size)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// searchEdbInfoDataTotal
+// @Description: 查询es中的数量
+// @author: Roc
+// @datetime 2024-12-23 11:19:04
+// @param indexName string
+// @param query elastic.Query
+// @return total int64
+// @return err error
+func searchRagEtaReportAbstractTotal(indexName string, query elastic.Query) (total int64, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("searchRagEtaReportAbstractTotal Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).Query(query)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// searchEdbInfoDataList
+// @Description: 查询es中的明细数据
+// @author: Roc
+// @datetime 2024-12-23 11:18:48
+// @param indexName string
+// @param query elastic.Query
+// @param sortList []*elastic.FieldSort
+// @param from int
+// @param size int
+// @return list []*data_manage.EdbInfoList
+// @return err error
+func searchRagEtaReportAbstractList(indexName string, query elastic.Query, sortList []*elastic.FieldSort, from, size int) (list []*RagEtaReportAbstractItem, err error) {
+	list = make([]*RagEtaReportAbstractItem, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("searchRagEtaReportAbstractList Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+	// 高亮
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Content"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	//request := client.Search(indexName).Highlight(highlight).From(from).Size(size) // sets the JSON request
+	request := client.Search(indexName).From(from).Size(size) // sets the JSON request
+
+	// 如果有指定排序,那么就按照排序来
+	if len(sortList) > 0 {
+		for _, v := range sortList {
+			request = request.SortBy(v)
+		}
+	}
+
+	searchMap := make(map[string]string)
+
+	searchResp, err := request.Query(query).Do(context.Background())
+	if err != nil {
+		return
+	}
+	//fmt.Println(searchResp)
+	//fmt.Println(searchResp.Status)
+	if searchResp.Status != 0 {
+		return
+	}
+	//total = searchResp.TotalHits()
+	if searchResp.Hits != nil {
+		for _, v := range searchResp.Hits.Hits {
+			if _, ok := searchMap[v.Id]; !ok {
+				itemJson, tmpErr := v.Source.MarshalJSON()
+				if tmpErr != nil {
+					err = tmpErr
+					fmt.Println("movieJson err:", err)
+					return
+				}
+				item := new(RagEtaReportAbstractItem)
+				tmpErr = json.Unmarshal(itemJson, &item)
+				if tmpErr != nil {
+					fmt.Println("json.Unmarshal movieJson err:", tmpErr)
+					err = tmpErr
+					return
+				}
+				if len(v.Highlight["Content"]) > 0 {
+					item.Abstract = v.Highlight["Content"][0]
+				}
+				list = append(list, item)
+				searchMap[v.Id] = v.Id
+			}
+		}
+	}
+
+	return
+}

+ 263 - 0
services/llm_report.go

@@ -3,11 +3,15 @@ package services
 import (
 	"eta/eta_api/models"
 	"eta/eta_api/models/rag"
+	"eta/eta_api/services/elastic"
+	"eta/eta_api/services/llm"
 	"eta/eta_api/utils"
 	"fmt"
 	"golang.org/x/net/html"
 	"golang.org/x/net/html/atom"
+	"os"
 	"regexp"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -270,3 +274,262 @@ func getArticleContent(content *strings.Builder, htmlContentNode *html.Node) {
 		getArticleContent(content, c)
 	}
 }
+
+// GenerateArticleAbstract
+// @Description: 文章摘要生成(默认提示词批量生成)
+// @author: Roc
+// @datetime 2025-03-10 16:17:53
+// @param item *rag.RagEtaReport
+func GenerateArticleAbstract(item *rag.RagEtaReport, forceGenerate bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Error("文章转临时文件失败,err:%v", err)
+			fmt.Println("文章转临时文件失败,err:", err)
+		}
+	}()
+
+	// 内容为空,那就不需要生成摘要
+	if item.TextContent == `` {
+		return
+	}
+
+	questionObj := rag.Question{}
+	questionList, err := questionObj.GetListByCondition(``, ` AND is_default = 1 `, []interface{}{}, 0, 100)
+	if err != nil {
+		err = fmt.Errorf("获取问题列表失败,Err:" + err.Error())
+		return
+	}
+
+	// 没问题就不生成了
+	if len(questionList) <= 0 {
+		return
+	}
+
+	for _, question := range questionList {
+		GenerateArticleAbstractByQuestion(item, question, forceGenerate)
+	}
+
+	return
+}
+
+// GenerateArticleAbstractByQuestion
+// @Description: 文章摘要生成(根据提示词生成)
+// @author: Roc
+// @datetime 2025-03-10 16:17:53
+// @param item *rag.RagEtaReport
+func GenerateArticleAbstractByQuestion(item *rag.RagEtaReport, question *rag.Question, forceGenerate bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Error("文章转临时文件失败,err:%v", err)
+			fmt.Println("文章转临时文件失败,err:", err)
+		}
+	}()
+
+	// 内容为空,那就不需要生成摘要
+	if item.TextContent == `` {
+		return
+	}
+
+	abstractObj := rag.RagEtaReportAbstract{}
+	abstractItem, err := abstractObj.GetByRagEtaReportIdAndQuestionId(item.RagEtaReportId, question.QuestionId)
+	// 如果找到了,同时不是强制生成,那么就直接处理到知识库中
+	if err == nil && !forceGenerate {
+		// 摘要已经生成,不需要重复生成,只需要重新加入到向量库中
+		ReportAbstractToKnowledge(item, abstractItem, false)
+
+		return
+	}
+	if !utils.IsErrNoRow(err) {
+		return
+	}
+
+	//你现在是一名资深的期货行业分析师,请基于以下的问题进行汇总总结,如果不能正常总结出来,那么就只需要回复我:sorry
+	questionStr := fmt.Sprintf(`%s\n%s`, `你现在是一名资深的期货行业分析师,请基于以下的问题进行汇总总结,如果不能正常总结出来,那么就只需要回复我:sorry。以下是问题:`, question.QuestionContent)
+	//开始对话
+	abstract, _, tmpErr := getAnswerByContent(item.RagEtaReportId, utils.AI_ARTICLE_SOURCE_ETA_REPORT, questionStr)
+	if tmpErr != nil {
+		err = fmt.Errorf("LLM对话失败,Err:" + tmpErr.Error())
+		return
+	}
+
+	// 添加问答记录
+	//if len(addArticleChatRecordList) > 0 {
+	//	recordObj := rag.RagEtaReportChatRecord{}
+	//	err = recordObj.CreateInBatches(addArticleChatRecordList)
+	//	if err != nil {
+	//		return
+	//	}
+	//}
+
+	if abstract == `` {
+		return
+	}
+
+	//if abstract == `sorry` || strings.Index(abstract, `根据已知信息无法回答该问题`) == 0 {
+	//	item.AbstractStatus = 2
+	//	item.ModifyTime = time.Now()
+	//	err = item.Update([]string{"AbstractStatus", "ModifyTime"})
+	//	return
+	//}
+	//item.AbstractStatus = 1
+	//item.ModifyTime = time.Now()
+	//err = item.Update([]string{"AbstractStatus", "ModifyTime"})
+
+	if abstractItem == nil || abstractItem.RagEtaReportAbstractId <= 0 {
+		abstractItem = &rag.RagEtaReportAbstract{
+			RagEtaReportAbstractId: 0,
+			RagEtaReportId:         item.RagEtaReportId,
+			Content:                item.TextContent,
+			QuestionId:             question.QuestionId,
+			QuestionContent:        question.QuestionContent,
+			Version:                1,
+			Tags:                   "",
+			VectorKey:              "",
+			ModifyTime:             time.Now(),
+			CreateTime:             time.Now(),
+		}
+		err = abstractItem.Create()
+	} else {
+		abstractItem.Content = abstract
+		abstractItem.Version++
+		abstractItem.ModifyTime = time.Now()
+		abstractItem.Tags = ""
+		abstractItem.QuestionContent = question.QuestionContent
+		err = abstractItem.Update([]string{"content", "version", "modify_time", "tags", "question_content"})
+	}
+
+	if err != nil {
+		return
+	}
+
+	// 数据入ES库
+	go AddOrEditEsRagEtaReportAbstract(abstractItem.RagEtaReportAbstractId)
+
+	ReportAbstractToKnowledge(item, abstractItem, false)
+}
+
+// AddOrEditEsWechatArticleAbstract
+// @Description: 新增/编辑微信文章摘要入ES
+// @author: Roc
+// @datetime 2025-03-13 14:13:47
+// @param articleAbstractId int
+func AddOrEditEsRagEtaReportAbstract(ragEtaReportAbstractId int) {
+	if utils.EsRagEtaReportAbstractName == `` {
+		return
+	}
+
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Error("添加ETA报告微信信息到ES失败,err:%v", err)
+			fmt.Println("添加ETA报告微信信息到ES失败,err:", err)
+		}
+	}()
+	obj := rag.RagEtaReportAbstract{}
+	abstractInfo, err := obj.GetById(ragEtaReportAbstractId)
+	if err != nil {
+		err = fmt.Errorf("获取ETA报告文章信息失败,Err:" + err.Error())
+		return
+	}
+	ragEtaReportObj := rag.RagEtaReport{}
+	articleInfo, err := ragEtaReportObj.GetById(abstractInfo.RagEtaReportAbstractId)
+	if err != nil {
+		err = fmt.Errorf("获取ETA报告文章信息失败,Err:" + err.Error())
+		return
+	}
+
+	tagIdList := make([]int, 0)
+	if abstractInfo.Tags != `` {
+		tagIdStrList := strings.Split(abstractInfo.Tags, ",")
+		for _, tagIdStr := range tagIdStrList {
+			tagId, tmpErr := strconv.Atoi(tagIdStr)
+			if tmpErr != nil {
+				err = fmt.Errorf("报告标签ID转int失败,Err:" + tmpErr.Error())
+				return
+			}
+			tagIdList = append(tagIdList, tagId)
+		}
+	}
+
+	esItem := elastic.RagEtaReportAbstractItem{
+		RagEtaReportAbstractId: abstractInfo.RagEtaReportAbstractId,
+		RagEtaReportId:         abstractInfo.RagEtaReportId,
+		Abstract:               abstractInfo.Content,
+		QuestionId:             abstractInfo.QuestionId,
+		Version:                abstractInfo.Version,
+		VectorKey:              abstractInfo.VectorKey,
+		ModifyTime:             abstractInfo.ModifyTime,
+		CreateTime:             abstractInfo.CreateTime,
+		Title:                  articleInfo.Title,
+		TagIdList:              tagIdList,
+	}
+
+	err = elastic.RagEtaReportAbstractEsAddOrEdit(strconv.Itoa(abstractInfo.RagEtaReportAbstractId), esItem)
+}
+
+// WechatArticleAbstractToKnowledge
+// @Description: 摘要入向量库
+// @author: Roc
+// @datetime 2025-03-10 16:14:59
+// @param wechatArticleItem *rag.RagEtaReport
+// @param abstractItem *rag.RagEtaReportAbstract
+func ReportAbstractToKnowledge(ragEtaReport *rag.RagEtaReport, abstractItem *rag.RagEtaReportAbstract, isReUpload bool) {
+	if abstractItem.Content == `` {
+		return
+	}
+	// 已经生成了,那就不处理了
+	if abstractItem.VectorKey != `` && !isReUpload {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Error("摘要入向量库失败,err:%v", err)
+			fmt.Println("摘要入向量库失败,err:", err)
+		}
+
+		// 数据入ES库
+		go AddOrEditEsRagEtaReportAbstract(abstractItem.RagEtaReportAbstractId)
+	}()
+
+	// 生成临时文件
+	//dateDir := time.Now().Format("20060102")
+	//uploadDir :=  + "./static/ai/article/" + dateDir
+	uploadDir := "./static/ai/abstract"
+	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
+	if err != nil {
+		err = fmt.Errorf("存储目录创建失败,Err:" + err.Error())
+		return
+	}
+	fileName := utils.MD5(fmt.Sprintf("%d_%d", utils.AI_ARTICLE_SOURCE_ETA_REPORT, ragEtaReport.RagEtaReportId)) + `.md`
+	tmpFilePath := uploadDir + "/" + fileName
+	err = utils.SaveToFile(abstractItem.Content, tmpFilePath)
+	if err != nil {
+		err = fmt.Errorf("生成临时文件失败,Err:" + err.Error())
+		return
+	}
+	defer func() {
+		os.Remove(tmpFilePath)
+	}()
+
+	knowledgeArticleName := models.BusinessConfMap[models.KnowledgeBaseName]
+	// 上传临时文件到LLM
+	uploadFileResp, err := llm.UploadDocsToKnowledge(tmpFilePath, knowledgeArticleName)
+	if err != nil {
+		err = fmt.Errorf("上传文章原文到知识库失败,Err:" + err.Error())
+		return
+	}
+
+	if len(uploadFileResp.FailedFiles) > 0 {
+		for _, v := range uploadFileResp.FailedFiles {
+			err = fmt.Errorf("上传文章原文到知识库失败,Err:" + v)
+		}
+	}
+
+	abstractItem.VectorKey = tmpFilePath
+	abstractItem.ModifyTime = time.Now()
+	err = abstractItem.Update([]string{"vector_key", "modify_time"})
+
+}

+ 37 - 27
services/wechat_platform.go

@@ -265,7 +265,7 @@ func BeachAddWechatArticle(item *rag.WechatPlatform, num int) {
 //	// 如果找到了,同时不是强制生成,那么就直接处理到知识库中
 //	if err == nil && !forceGenerate {
 //		// 摘要已经生成,不需要重复生成,只需要重新加入到向量库中
-//		AbstractToKnowledge(item, tmpAbstractItem, false)
+//		WechatArticleAbstractToKnowledge(item, tmpAbstractItem, false)
 //
 //		return
 //	}
@@ -317,7 +317,7 @@ func BeachAddWechatArticle(item *rag.WechatPlatform, num int) {
 //		// 数据入ES库
 //		go AddOrEditEsWechatArticleAbstract(abstractItem.WechatArticleAbstractId)
 //
-//		AbstractToKnowledge(item, abstractItem, false)
+//		WechatArticleAbstractToKnowledge(item, abstractItem, false)
 //	}
 //}
 
@@ -326,7 +326,7 @@ func BeachAddWechatArticle(item *rag.WechatPlatform, num int) {
 // @author: Roc
 // @datetime 2025-03-10 16:17:53
 // @param item *rag.WechatArticle
-func GenerateArticleAbstract(item *rag.WechatArticle, forceGenerate bool) {
+func GenerateWechatArticleAbstract(item *rag.WechatArticle, forceGenerate bool) {
 	var err error
 	defer func() {
 		if err != nil {
@@ -353,7 +353,7 @@ func GenerateArticleAbstract(item *rag.WechatArticle, forceGenerate bool) {
 	}
 
 	for _, question := range questionList {
-		GenerateArticleAbstractByQuestion(item, question, forceGenerate)
+		GenerateWechatArticleAbstractByQuestion(item, question, forceGenerate)
 	}
 
 	return
@@ -364,7 +364,7 @@ func GenerateArticleAbstract(item *rag.WechatArticle, forceGenerate bool) {
 // @author: Roc
 // @datetime 2025-03-10 16:17:53
 // @param item *rag.WechatArticle
-func GenerateArticleAbstractByQuestion(item *rag.WechatArticle, question *rag.Question, forceGenerate bool) {
+func GenerateWechatArticleAbstractByQuestion(item *rag.WechatArticle, question *rag.Question, forceGenerate bool) {
 	var err error
 	defer func() {
 		if err != nil {
@@ -379,11 +379,11 @@ func GenerateArticleAbstractByQuestion(item *rag.WechatArticle, question *rag.Qu
 	}
 
 	abstractObj := rag.WechatArticleAbstract{}
-	tmpAbstractItem, err := abstractObj.GetByWechatArticleIdAndQuestionId(item.WechatArticleId, question.QuestionId)
+	abstractItem, err := abstractObj.GetByWechatArticleIdAndQuestionId(item.WechatArticleId, question.QuestionId)
 	// 如果找到了,同时不是强制生成,那么就直接处理到知识库中
 	if err == nil && !forceGenerate {
 		// 摘要已经生成,不需要重复生成,只需要重新加入到向量库中
-		AbstractToKnowledge(item, tmpAbstractItem, false)
+		WechatArticleAbstractToKnowledge(item, abstractItem, false)
 
 		return
 	}
@@ -420,19 +420,29 @@ func GenerateArticleAbstractByQuestion(item *rag.WechatArticle, question *rag.Qu
 		item.ModifyTime = time.Now()
 		err = item.Update([]string{"AbstractStatus", "ModifyTime"})
 
-		abstractItem := &rag.WechatArticleAbstract{
-			WechatArticleAbstractId: 0,
-			WechatArticleId:         item.WechatArticleId,
-			Content:                 abstract,
-			Version:                 1,
-			VectorKey:               "",
-			ModifyTime:              time.Now(),
-			CreateTime:              time.Now(),
-			QuestionID:              question.QuestionId,
-			Tags:                    "",
-			QuestionContent:         question.QuestionContent,
+		if abstractItem == nil || abstractItem.WechatArticleAbstractId <= 0 {
+			abstractItem = &rag.WechatArticleAbstract{
+				WechatArticleAbstractId: 0,
+				WechatArticleId:         item.WechatArticleId,
+				Content:                 abstract,
+				Version:                 1,
+				VectorKey:               "",
+				ModifyTime:              time.Now(),
+				CreateTime:              time.Now(),
+				QuestionId:              question.QuestionId,
+				Tags:                    "",
+				QuestionContent:         question.QuestionContent,
+			}
+			err = abstractItem.Create()
+		} else {
+			abstractItem.Content = abstract
+			abstractItem.Version++
+			abstractItem.ModifyTime = time.Now()
+			abstractItem.Tags = ""
+			abstractItem.QuestionContent = question.QuestionContent
+			err = abstractItem.Update([]string{"content", "version", "modify_time", "tags", "question_content"})
 		}
-		err = abstractItem.Create()
+
 		if err != nil {
 			return
 		}
@@ -440,7 +450,7 @@ func GenerateArticleAbstractByQuestion(item *rag.WechatArticle, question *rag.Qu
 		// 数据入ES库
 		go AddOrEditEsWechatArticleAbstract(abstractItem.WechatArticleAbstractId)
 
-		AbstractToKnowledge(item, abstractItem, false)
+		WechatArticleAbstractToKnowledge(item, abstractItem, false)
 	}
 }
 
@@ -517,13 +527,13 @@ func DelLlmDoc(vectorKeyList []string, wechatArticleAbstractIdList []int) (err e
 	return
 }
 
-func getAnswerByContent(wechatArticleId int, source int, questionStr string) (answer string, addArticleChatRecordList []*rag.WechatArticleChatRecord, err error) {
+func getAnswerByContent(articleId int, source int, questionStr string) (answer string, addArticleChatRecordList []*rag.WechatArticleChatRecord, err error) {
 	addArticleChatRecordList = make([]*rag.WechatArticleChatRecord, 0)
 
 	result, err := facade.AIGCBaseOnPromote(facade.AIGC{
 		Promote:   questionStr,
 		Source:    source,
-		ArticleId: wechatArticleId,
+		ArticleId: articleId,
 		LLMModel:  `deepseek-r1:32b`,
 	})
 	if err != nil {
@@ -550,7 +560,7 @@ func getAnswerByContent(wechatArticleId int, source int, questionStr string) (an
 	// 待入库的数据
 	addArticleChatRecordList = append(addArticleChatRecordList, &rag.WechatArticleChatRecord{
 		WechatArticleChatRecordId: 0,
-		WechatArticleId:           wechatArticleId,
+		WechatArticleId:           articleId,
 		ChatUserType:              "user",
 		Content:                   questionStr,
 		SendTime:                  time.Now(),
@@ -558,7 +568,7 @@ func getAnswerByContent(wechatArticleId int, source int, questionStr string) (an
 		UpdateTime:                time.Now(),
 	}, &rag.WechatArticleChatRecord{
 		WechatArticleChatRecordId: 0,
-		WechatArticleId:           wechatArticleId,
+		WechatArticleId:           articleId,
 		ChatUserType:              "assistant",
 		Content:                   originalAnswer,
 		SendTime:                  time.Now(),
@@ -689,13 +699,13 @@ func ArticleToKnowledge(item *rag.WechatArticle) {
 
 }
 
-// AbstractToKnowledge
+// WechatArticleAbstractToKnowledge
 // @Description: 摘要入向量库
 // @author: Roc
 // @datetime 2025-03-10 16:14:59
 // @param wechatArticleItem *rag.WechatArticle
 // @param abstractItem *rag.WechatArticleAbstract
-func AbstractToKnowledge(wechatArticleItem *rag.WechatArticle, abstractItem *rag.WechatArticleAbstract, isReUpload bool) {
+func WechatArticleAbstractToKnowledge(wechatArticleItem *rag.WechatArticle, abstractItem *rag.WechatArticleAbstract, isReUpload bool) {
 	if abstractItem.Content == `` {
 		return
 	}
@@ -723,7 +733,7 @@ func AbstractToKnowledge(wechatArticleItem *rag.WechatArticle, abstractItem *rag
 		err = fmt.Errorf("存储目录创建失败,Err:" + err.Error())
 		return
 	}
-	fileName := utils.RemoveSpecialChars(wechatArticleItem.Title) + `.md`
+	fileName := utils.MD5(fmt.Sprintf("%d_%d", utils.AI_ARTICLE_SOURCE_WECHAT, wechatArticleItem.WechatArticleId)) + `.md`
 	tmpFilePath := uploadDir + "/" + fileName
 	err = utils.SaveToFile(abstractItem.Content, tmpFilePath)
 	if err != nil {

+ 2 - 1
utils/config.go

@@ -149,6 +149,7 @@ var (
 	EsWechatArticleName            string // ES索引名称-微信文章
 	EsWechatArticleAbstractName    string // ES索引名称-微信文章摘要
 	EsRagQuestionName              string // ES索引名称-知识库问题
+	EsRagEtaReportAbstractName     string // ES索引名称-ETA报告摘要
 )
 
 var (
@@ -303,7 +304,7 @@ var (
 )
 
 var (
-	RaiReportLibUrl string // 权益报告库地址
+	RaiReportLibUrl           string // 权益报告库地址
 	RaiReportLibAuthorization string // 权益报告库鉴权
 )
 

+ 1 - 1
utils/constants.go

@@ -604,6 +604,6 @@ const (
 )
 
 const (
-	AI_ARTICLE_SOURCE_WECHAT     = 0 // AI文章来源(微信公众号
+	AI_ARTICLE_SOURCE_WECHAT     = 0 // AI文章来源(微信公众号)
 	AI_ARTICLE_SOURCE_ETA_REPORT = 1 // AI文章来源(ETA报告)
 )