Просмотр исходного кода

新增deepseek生成文章总结

317699326@qq.com 1 день назад
Родитель
Сommit
60b25e79ba
6 измененных файлов с 511 добавлено и 33 удалено
  1. 7 0
      models/classify.go
  2. 49 0
      models/dk.go
  3. 123 30
      models/report.go
  4. 325 0
      services/dk.go
  5. 2 2
      services/report.go
  6. 5 1
      services/task.go

+ 7 - 0
models/classify.go

@@ -32,3 +32,10 @@ func GetClassifyById(classifyId int) (item *Classify, err error) {
 	err = o.Raw(sql, classifyId).First(&item).Error
 	return
 }
+
+func GetClassifyByName(classifyName string) (item *Classify, err error) {
+	sql := `SELECT * FROM classify WHERE classify_name = ? `
+	o := global.DbMap[utils.DbNameReport]
+	err = o.Raw(sql, classifyName).First(&item).Error
+	return
+}

+ 49 - 0
models/dk.go

@@ -0,0 +1,49 @@
+package models
+
+import (
+	"eta/eta_task/global"
+	"eta/eta_task/utils"
+)
+
+type WechatArticleTag struct {
+	TagName     string
+	ArticleId   string
+	TextContent string
+}
+
+type WechatArticle struct {
+	TextContent string
+}
+
+func GetWechatArticleTags(startTime, endTime string) (list []*WechatArticleTag, err error) {
+	sql := `SELECT a.tag_name,GROUP_CONCAT(a.article_id) AS article_id
+		FROM article_dfa_tag_mapping AS a
+		INNER JOIN wechat_article AS b ON a.article_id=b.wechat_article_id
+		WHERE a.tag_name<>''
+		AND b.article_create_time >= ?
+		AND b.article_create_time <= ?
+		AND b.is_summary=0
+		AND a.source='wechat'
+		GROUP BY a.tag_name `
+
+	err = global.DbMap[utils.DbNameAI].Raw(sql, startTime, endTime).Find(&list).Error
+	return list, err
+}
+
+func GetWechatArticle(articleId, startTime, endTime string) (list []*WechatArticle, err error) {
+	sql := `SELECT a.text_content
+		FROM wechat_article AS a
+		WHERE a.wechat_article_id IN(` + articleId + `) 
+		AND a.article_create_time >= ?
+		AND a.article_create_time <= ?
+        AND a.is_summary=0`
+
+	err = global.DbMap[utils.DbNameAI].Raw(sql, startTime, endTime).Find(&list).Error
+	return list, err
+}
+
+func ModifyWechatArticleSummary(articleId string, isSummary int) (err error) {
+	sql := ` UPDATE wechat_article SET is_summary=? WHERE wechat_article_id IN(` + articleId + `)`
+	err = global.DbMap[utils.DbNameAI].Exec(sql, isSummary).Error
+	return err
+}

+ 123 - 30
models/report.go

@@ -1,6 +1,8 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"errors"
 	"eta/eta_task/global"
 	"eta/eta_task/utils"
 	"gorm.io/gorm"
@@ -8,36 +10,67 @@ import (
 )
 
 type Report struct {
-	Id                 int       `gorm:"column:id;primaryKey;autoIncrement" description:"报告Id"`
-	AddType            int       `description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst    int       `description:"一级分类id"`
-	ClassifyNameFirst  string    `description:"一级分类名称"`
-	ClassifyIdSecond   int       `description:"二级分类id"`
-	ClassifyNameSecond string    `description:"二级分类名称"`
-	Title              string    `description:"标题"`
-	Abstract           string    `description:"摘要"`
-	Author             string    `description:"作者"`
-	Frequency          string    `description:"频度"`
-	CreateTime         string    `description:"创建时间"`
-	ModifyTime         time.Time `description:"修改时间"`
-	State              int       `description:"1:未发布,2:已发布"`
-	PublishTime        time.Time `description:"发布时间"`
-	Stage              int       `description:"期数"`
-	MsgIsSend          int       `description:"消息是否已发送,0:否,1:是"`
-	Content            string    `description:"内容"`
-	VideoUrl           string    `description:"音频文件URL"`
-	VideoName          string    `description:"音频文件名称"`
-	VideoPlaySeconds   string    `description:"音频播放时长"`
-	VideoSize          string    `description:"音频文件大小,单位M"`
-	ContentSub         string    `description:"内容前两个章节"`
-	HasChapter         int       `description:"是否有章节 0-否 1-是"`
-	ChapterType        string    `description:"章节类型 day-晨报 week-周报"`
-	OldReportId        int       `description:"research_report表ID(后续一两个版本过渡需要,之后可移除)"`
-	PreMsgSend         int       `description:"定时发布成功后是否立即推送模版消息:0否,1是"`
-	AdminId            int
-	AdminName          string `description:"系统用户名称"`
-	ClassifyIdThird    int    `description:"三级分类id"`
-	ClassifyNameThird  string `description:"三级分类名称"`
+	Id                  int       `orm:"column(id)" description:"报告Id"`
+	AddType             int       `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst     int       `description:"一级分类id"`
+	ClassifyNameFirst   string    `description:"一级分类名称"`
+	ClassifyIdSecond    int       `description:"二级分类id"`
+	ClassifyNameSecond  string    `description:"二级分类名称"`
+	Title               string    `description:"标题"`
+	Abstract            string    `description:"摘要"`
+	Author              string    `description:"作者"`
+	Frequency           string    `description:"频度"`
+	CreateTime          string    `description:"创建时间"`
+	ModifyTime          string    `description:"修改时间"`
+	State               int       `description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
+	PublishTime         time.Time `description:"发布时间"`
+	Stage               int       `description:"期数"`
+	MsgIsSend           int       `description:"消息是否已发送,0:否,1:是"`
+	ThsMsgIsSend        int       `description:"客户群消息是否已发送,0:否,1:是"`
+	Content             string    `description:"内容"`
+	VideoUrl            string    `description:"音频文件URL"`
+	VideoName           string    `description:"音频文件名称"`
+	VideoPlaySeconds    string    `description:"音频播放时长"`
+	VideoSize           string    `description:"音频文件大小,单位M"`
+	ContentSub          string    `description:"内容前两个章节"`
+	ReportCode          string    `description:"报告唯一编码"`
+	ReportVersion       int       `description:"1:旧版,2:新版"`
+	HasChapter          int       `description:"是否有章节 0-否 1-是"`
+	ChapterType         string    `description:"章节类型 day-晨报 week-周报"`
+	OldReportId         int       `description:"research_report表ID, 大于0则表示该报告为老后台同步过来的"`
+	MsgSendTime         time.Time `description:"模版消息发送时间"`
+	AdminId             int       `description:"创建者账号"`
+	AdminRealName       string    `description:"创建者姓名"`
+	ApproveTime         time.Time `description:"审批时间"`
+	ApproveId           int       `description:"审批ID"`
+	DetailImgUrl        string    `description:"报告详情长图地址"`
+	DetailPdfUrl        string    `description:"报告详情PDF地址"`
+	DetailImgUrlMobile  string    `description:"报告详情长图地址-手机端"`
+	DetailPdfUrlMobile  string    `description:"报告详情PDF地址-手机端"`
+	ContentStruct       string    `description:"内容组件"`
+	LastModifyAdminId   int       `description:"最后更新人ID"`
+	LastModifyAdminName string    `description:"最后更新人姓名"`
+	ContentModifyTime   time.Time `description:"内容更新时间"`
+	Pv                  int       `description:"pv"`
+	Uv                  int       `description:"uv"`
+	HeadImg             string    `description:"报告头图地址"`
+	EndImg              string    `description:"报告尾图地址"`
+	CanvasColor         string    `description:"画布颜色"`
+	NeedSplice          int       `description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
+	HeadResourceId      int       `description:"版头资源ID"`
+	EndResourceId       int       `description:"版尾资源ID"`
+	ClassifyIdThird     int       `description:"三级分类id"`
+	ClassifyNameThird   string    `description:"三级分类名称"`
+	CollaborateType     int8      `description:"协作方式,1:个人,2:多人协作。默认:1"`
+	ReportLayout        int8      `description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	IsPublicPublish     int8      `description:"是否公开发布,1:是,2:否"`
+	ReportCreateTime    time.Time `description:"报告时间创建时间"`
+	InheritReportId     int       `description:"待继承的报告ID"`
+	VoiceGenerateType   int       `description:"音频生成方式,0:系统生成,1:人工上传"`
+	RaiReportId         int       `description:"RAI报告ID"`
+	FreeLayoutConfig    string    `description:"'自由布局配置"`
+	MiniShow            int       `description:"是否在C端展示:0-否;1-是"`
+	PreMsgSend          int       `description:"定时发布成功后是否立即推送模版消息:0否,1是"`
 }
 
 func (m *Report) AfterFind(db *gorm.DB) (err error) {
@@ -194,3 +227,63 @@ func PublishReportAndChapter(reportInfo *Report, isPublishReport bool, cols []st
 
 	return
 }
+
+func GetReport(classifyIdFirst int, startTime, endTime string) (item *Report, err error) {
+	o := global.DbMap[utils.DbNameReport]
+	sql := ` SELECT * FROM report WHERE classify_id_first = ? AND create_time >= ? AND create_time <= ? `
+	err = o.Raw(sql, classifyIdFirst, startTime, endTime).Scan(&item).Error
+	return item, err
+}
+
+// @return count int
+// @return err error
+func GetReportStage(classifyIdFirst, classifyIdSecond, classifyIdThird int) (count int, err error) {
+	o := global.DbMap[utils.DbNameReport]
+	classifyId := classifyIdThird
+	if classifyId <= 0 {
+		classifyId = classifyIdSecond
+	}
+	if classifyId <= 0 {
+		classifyId = classifyIdFirst
+	}
+	if classifyId <= 0 {
+		err = errors.New("错误的分类id")
+		return
+	}
+	yearStart := time.Date(time.Now().Local().Year(), 1, 1, 0, 0, 0, 0, time.Local)
+
+	sql := `SELECT MAX(stage) AS max_stage FROM report WHERE create_time > ? `
+	if classifyIdThird > 0 {
+		sql += " AND classify_id_third = ? "
+	} else if classifyIdSecond > 0 {
+		sql += " AND classify_id_second = ? "
+	} else {
+		sql += " AND classify_id_first = ? "
+	}
+
+	var maxNull sql2.NullInt64
+	err = o.Raw(sql, yearStart, classifyId).Scan(&maxNull).Error
+	if err != nil {
+		return
+	}
+	if maxNull.Valid {
+		count = int(maxNull.Int64)
+	}
+	return
+}
+
+func AddReport(reportInfo *Report) (err error) {
+	o := global.DbMap[utils.DbNameReport]
+	err = o.Create(reportInfo).Error
+	if err != nil {
+		return err
+	}
+	return
+}
+
+func ModifyReportContent(reportId int, content string) (err error) {
+	o := global.DbMap[utils.DbNameReport]
+	sql := `UPDATE report SET content = ?,modify_time = NOW() WHERE id = ?`
+	err = o.Exec(sql, content, reportId).Error
+	return
+}

+ 325 - 0
services/dk.go

@@ -0,0 +1,325 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"eta/eta_task/models"
+	"eta/eta_task/utils"
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"html"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 使用deepseek api 处理报告
+func AutoCreateReportAssess(cont context.Context) (err error) {
+	//获取品种
+	startTime := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate) + " 00:00:00"
+	endTime := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate) + " 23:59:59"
+	createDate := time.Now().AddDate(0, 0, -1).Format("2006.01.02")
+
+	tagList, err := models.GetWechatArticleTags(startTime, endTime)
+	if err != nil {
+		fmt.Println("GetWechatArticleTags Err:" + err.Error())
+		return
+	}
+
+	req := new(DkCompletionsReq)
+	req.Model = "deepseek-chat"
+	req.FrequencyPenalty = 0
+	req.MaxTokens = 8192
+	req.PresencePenalty = 0
+	req.ResponseFormat.Type = "text"
+	req.Stop = nil
+	req.Stream = false
+	req.StreamOptions = nil
+	req.Temperature = 1
+	req.TopP = 1
+	req.Tools = nil
+	req.ToolChoice = "none"
+	req.Logprobs = false
+	req.TopLogprobs = nil
+
+	msgList := make([]*DkCompletionsMessagesReq, 0)
+	msg := new(DkCompletionsMessagesReq)
+	//msg.Content = "请阅读如下文章。首先根据文章内容,对#品种名称 进行打分,打分规则为10分最看多,0分最看空。其次,对#品种名称 提炼主要逻辑和观点,得出总结,品种和品种之间用横线拆分,输出格式限定为:1. 使用语义化的HTML5标签,2. 采用现代响应式设计(无固定宽度),3. 包含丰富的文本格式元素,4. 通过内联样式确保自适应渲染"
+	msg.Content = "请阅读如下文章。首先根据文章内容,对#品种名称 进行打分,打分规则为10分最看多,0分最看空。其次,对#品种名称 提炼主要逻辑和观点,得出总结,品种和品种之间用横线拆分,输出格式限定为:1. 使用语义化的HTML5标签代码段,不包含html,body,head,2. 采用现代响应式设计(无固定宽度),3. 包含丰富的文本格式元素,4. 通过内联样式确保自适应渲染"
+	msg.Role = "system"
+	msgList = append(msgList, msg)
+
+	for k, v := range tagList {
+		msgItem := new(DkCompletionsMessagesReq)
+		msgItem.Role = "user"
+		fmt.Println(k, v.TagName)
+		//根据标签获取文章
+		articleList, err := models.GetWechatArticle(v.ArticleId, startTime, endTime)
+		if err != nil {
+			fmt.Println("GetWechatArticle Err:" + err.Error())
+			return
+		}
+		var context string
+		context += `品种 ` + v.TagName + ":"
+		for _, av := range articleList {
+			context += av.TextContent
+		}
+		utils.FileLog.Info(context)
+
+		context = strings.ReplaceAll(context, "\n", "")
+		context = strings.ReplaceAll(context, `"`, "")
+		context = strings.ReplaceAll(context, `\`, "/")
+		context = strings.ReplaceAll(context, `	`, "")
+		context = strings.ReplaceAll(context, `  `, "")
+		context = strings.ReplaceAll(context, `⭐️`, "")
+
+		context = strings.ReplaceAll(context, `"`, "")
+		msgItem.Content = context
+		msgList = append(msgList, msgItem)
+	}
+
+	if len(msgList) <= 0 {
+		fmt.Println("没有需要生成的文章")
+		return
+	}
+	req.Messages = msgList
+	reqBody, err := json.Marshal(req)
+	if err != nil {
+		fmt.Println("json.Marshal err:" + err.Error())
+		return
+	}
+
+	isSummary := 0
+	isSuccess := dkCompletions(string(reqBody), startTime, endTime, createDate)
+	if isSuccess {
+		isSummary = 1
+		for _, v := range tagList {
+			models.ModifyWechatArticleSummary(v.ArticleId, isSummary)
+		}
+	}
+	return nil
+}
+
+// 使用deepseek api 处理报告
+func AutoCreateReportAssessV1() {
+	//获取品种
+	startTime := `2025-05-12 00:00:00`
+	endTime := `2025-05-18 00:00:00`
+	tagList, err := models.GetWechatArticleTags(startTime, endTime)
+	if err != nil {
+		fmt.Println("GetWechatArticleTags Err:" + err.Error())
+		return
+	}
+	var context string
+
+	for _, v := range tagList {
+		context += `品种 ` + v.TagName
+		textContent := strings.ReplaceAll(v.TextContent, "\n", "")
+		//fmt.Println("textContent:" + textContent)
+		context += textContent
+	}
+
+	contextDoc, err := goquery.NewDocumentFromReader(strings.NewReader(context))
+	context = contextDoc.Text()
+	context = strings.ReplaceAll(context, `"`, "")
+	context = strings.ReplaceAll(context, `\`, "/")
+	context = strings.ReplaceAll(context, `	`, "")
+	context = strings.ReplaceAll(context, `  `, "")
+
+	utils.FileLog.Info(context)
+	fmt.Println(len(context))
+	//dkCompletions(context)
+}
+
+func dkCompletions(payloadBody, startTime, endTime, createDate string) (success bool) {
+
+	utils.FileLog.Info(payloadBody)
+
+	url := "https://api.deepseek.com/chat/completions"
+	method := "POST"
+
+	utils.FileLog.Info("dk payload:" + payloadBody)
+
+	payload := strings.NewReader(payloadBody)
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("Accept", "application/json")
+	req.Header.Add("Authorization", "Bearer sk-e21afcf4380249869d06b92a4379ee23")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	//fmt.Println("chart completions resp body:")
+	//fmt.Println(string(body))
+	utils.FileLog.Info("dk result:" + string(body))
+	fmt.Println(string(body))
+
+	result := new(DkCompletionsResult)
+	err = json.Unmarshal(body, &result)
+	if err != nil {
+		utils.FileLog.Info("DkCompletionsResult json Unmarshal Err:" + err.Error())
+		return
+	}
+
+	if len(result.Choices) > 0 && result.Choices[0].Message.Content != "" {
+		resultContent := result.Choices[0].Message.Content
+		resultContent = strings.ReplaceAll(resultContent, `\n`, "<br/>")
+		resultContent = strings.ReplaceAll(resultContent, "```html", "")
+		resultContent = strings.ReplaceAll(resultContent, "```", "")
+
+		utils.FileLog.Info(resultContent)
+
+		//判断报告是否存在
+		classifyName := "AI研报"
+		reportClassify, err := models.GetClassifyByName(classifyName)
+		if err != nil {
+			fmt.Println("GetClassifyByName Err:" + err.Error())
+			return
+		}
+		if reportClassify == nil {
+			fmt.Println("reportClassify is nil")
+			return
+		}
+		var isAdd bool
+		reportItem, err := models.GetReport(reportClassify.Id, startTime, endTime)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				isAdd = true
+			} else {
+				fmt.Println("GetReport Err:" + err.Error())
+				return
+			}
+		}
+		if reportItem == nil {
+			isAdd = true
+		}
+		if isAdd {
+			//获取最大期数
+			//GetReportStage
+			maxStage, e := models.GetReportStage(reportClassify.Id, 0, 0)
+			if e != nil {
+				fmt.Println("GetReportStage Err:" + err.Error())
+				return
+			}
+
+			fmt.Println(resultContent)
+
+			context := html.EscapeString(resultContent)
+			item := new(models.Report)
+			item.AddType = 1
+			item.ClassifyIdFirst = reportClassify.Id
+			item.ClassifyNameFirst = reportClassify.ClassifyName
+			item.ClassifyIdSecond = 244
+			item.ClassifyNameSecond = "AI智汇日报"
+			item.Title = "大宗商品AI智汇日报" + createDate
+			item.Frequency = "日度"
+			item.State = 2
+			item.Content = context
+			item.Stage = maxStage + 1
+			item.CreateTime = startTime
+			item.ModifyTime = startTime
+			item.CollaborateType = 1
+			item.IsPublicPublish = 1
+			item.ReportLayout = 1
+			err = models.AddReport(item)
+			if err != nil {
+				fmt.Println("AddReport Err:" + err.Error())
+				return
+			}
+
+			reportCode := utils.MD5(strconv.Itoa(item.Id))
+			err = models.ModifyReportCode(item.Id, reportCode)
+			if err != nil {
+				fmt.Println("ModifyReportCode Err:" + err.Error())
+				return
+			}
+		} else {
+			reportContent := html.UnescapeString(reportItem.Content)
+			resultContent = reportContent + resultContent
+			resultContent = html.EscapeString(resultContent)
+			err = models.ModifyReportContent(reportItem.Id, resultContent)
+			if err != nil {
+				fmt.Println("ModifyReportContent Err:" + err.Error())
+				return
+			}
+		}
+		success = true
+	}
+	return success
+}
+
+type DkCompletionsReq struct {
+	Messages         []*DkCompletionsMessagesReq `json:"messages"`
+	Model            string                      `json:"model"`
+	FrequencyPenalty int                         `json:"frequency_penalty"`
+	MaxTokens        int                         `json:"max_tokens"`
+	PresencePenalty  int                         `json:"presence_penalty"`
+	ResponseFormat   struct {
+		Type string `json:"type"`
+	} `json:"response_format"`
+	Stop          interface{} `json:"stop"`
+	Stream        bool        `json:"stream"`
+	StreamOptions interface{} `json:"stream_options"`
+	Temperature   int         `json:"temperature"`
+	TopP          int         `json:"top_p"`
+	Tools         interface{} `json:"tools"`
+	ToolChoice    string      `json:"tool_choice"`
+	Logprobs      bool        `json:"logprobs"`
+	TopLogprobs   interface{} `json:"top_logprobs"`
+}
+
+type DkCompletionsMessagesReq struct {
+	Content string `json:"content"`
+	Role    string `json:"role"`
+}
+
+type DkCompletionsResult struct {
+	Id      string `json:"id"`
+	Object  string `json:"object"`
+	Created int    `json:"created"`
+	Model   string `json:"model"`
+	Choices []struct {
+		Index   int `json:"index"`
+		Message struct {
+			Role    string `json:"role"`
+			Content string `json:"content"`
+		} `json:"message"`
+		Logprobs     interface{} `json:"logprobs"`
+		FinishReason string      `json:"finish_reason"`
+	} `json:"choices"`
+	Usage struct {
+		PromptTokens        int `json:"prompt_tokens"`
+		CompletionTokens    int `json:"completion_tokens"`
+		TotalTokens         int `json:"total_tokens"`
+		PromptTokensDetails struct {
+			CachedTokens int `json:"cached_tokens"`
+		} `json:"prompt_tokens_details"`
+		PromptCacheHitTokens  int `json:"prompt_cache_hit_tokens"`
+		PromptCacheMissTokens int `json:"prompt_cache_miss_tokens"`
+	} `json:"usage"`
+	SystemFingerprint string `json:"system_fingerprint"`
+	Error             struct {
+		Message string      `json:"message"`
+		Type    string      `json:"type"`
+		Param   interface{} `json:"param"`
+		Code    string      `json:"code"`
+	} `json:"error"`
+}

+ 2 - 2
services/report.go

@@ -214,7 +214,7 @@ func PublishReport(cont context.Context) (err error) {
 			// 发布报告和章节
 			item.State = 2
 			item.PublishTime = publishTime
-			item.ModifyTime = time.Now().Local()
+			item.ModifyTime = time.Now().Format(utils.FormatDateTime)
 			updateCols := make([]string, 0)
 			updateCols = append(updateCols, "PublishTime", "State", "ModifyTime")
 			tmpErr = models.PublishReportAndChapter(item, true, updateCols)
@@ -244,7 +244,7 @@ func handleByPublishReport(item *models.Report) {
 		ReportType: 1,
 		State:      2,
 		AdminId:    item.AdminId,
-		AdminName:  item.AdminName,
+		AdminName:  item.AdminRealName,
 		CreateTime: time.Now(),
 	}
 

+ 5 - 1
services/task.go

@@ -31,11 +31,15 @@ func Task() {
 	// 定时汇总数据源终端指标更新情况
 	setEdbSourceStatTask := task.NewTask("setEdbSourceStatTask", "0 20 19,23 * * *", data_stat.SetEdbSourceStatTask)
 	task.AddTask("数据源统计表", setEdbSourceStatTask)
-	
+
 	// 定时监测AI任务调度情况
 	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeDebug {
 		checkAiTask := task.NewTask("checkAiTask", "0 */5 * * * *", CheckAiTask)
 		task.AddTask("定时定时监测AI任务调度情况", checkAiTask)
+
+		//凌晨生产前一天的微信公众号文章总结
+		autoCreateReportAssess := task.NewTask("autoCreateReportAssess", "0 0 3 * * *", AutoCreateReportAssess)
+		task.AddTask("autoCreateReportAssess", autoCreateReportAssess)
 	}
 
 	// 根据配置对指标的刷新做巡检