123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 |
- package services
- import (
- "errors"
- "fmt"
- "hongze/hz_eta_api/models"
- "hongze/hz_eta_api/services/alarm_msg"
- "hongze/hz_eta_api/utils"
- "html"
- "regexp"
- "strconv"
- "strings"
- "time"
- )
- func AutoSyncOldReport() {
- defer func() {
- if err := recover(); err != nil {
- fmt.Println("[AutoSyncOldReport]", err)
- }
- }()
- for {
- utils.Rc.Brpop(utils.CACHE_KEY_OLD_REPORT_PUBLISH, func(b []byte) {
- reportId, _ := strconv.Atoi(string(b))
- if reportId > 0 {
- if err := SyncOldReport(reportId); err != nil {
- fmt.Println("AutoSyncOldReport: ", err.Error(), "reportId: ", reportId)
- }
- }
- })
- }
- }
- // SyncOldReport 同步老后台报告
- func SyncOldReport(reportId int) (err error) {
- defer func() {
- if err != nil {
- utils.FileLog.Error("SyncOldReport, reportId:%s, Err:%s", strconv.Itoa(reportId), err.Error())
- go alarm_msg.SendAlarmMsg("同步老后台报告失败, 报告ID: "+strconv.Itoa(reportId)+", Err: "+err.Error(), 3)
- }
- }()
- // 查询报告信息
- if reportId <= 0 {
- return
- }
- reportInfo, e := models.GetResearchReportById(reportId)
- if e != nil {
- err = errors.New("报告信息有误" + e.Error())
- return
- }
- if reportInfo.Status != "report" {
- return
- }
- // 20220615-周报不做同步了
- if reportInfo.Type == utils.REPORT_TYPE_WEEK {
- return
- }
- // 若已存在报告,则后续更新报告信息
- existReport, e := models.GetNewReportExist(reportId)
- if e != nil && e.Error() != utils.ErrNoRow() {
- err = errors.New("获取报告是否已同步失败" + e.Error())
- return
- }
- // 报告分类
- classifyList, e := models.GetAllClassify()
- if e != nil {
- err = errors.New("获取报告分类失败" + e.Error())
- return
- }
- classifyIdName := make(map[int]string, 0)
- classifyNameId := make(map[string]int, 0)
- classifyIdParentId := make(map[int]int, 0)
- classifyLen := len(classifyList)
- for i := 0; i < classifyLen; i++ {
- classifyIdName[classifyList[i].Id] = classifyList[i].ClassifyName
- classifyNameId[classifyList[i].ClassifyName] = classifyList[i].Id
- classifyIdParentId[classifyList[i].Id] = classifyList[i].ParentId
- }
- // 获取报告章节
- reportTypeList, e := models.GetResearchReportTypeListByReportId(reportId)
- if e != nil {
- err = errors.New("获取报告章节失败" + e.Error())
- return
- }
- reportTypeListLen := len(reportTypeList)
- if reportTypeListLen == 0 {
- return
- }
- // 获取章节内容
- typeIdArr := make([]string, 0)
- for i := 0; i < reportTypeListLen; i++ {
- typeIdArr = append(typeIdArr, strconv.Itoa(reportTypeList[i].ResearchReportTypeId))
- }
- typeIdStr := strings.Join(typeIdArr, ",")
- reportContentList, e := models.GetResearchReportTypeContentListByReportTypeIds(typeIdStr)
- if e != nil {
- err = errors.New("获取章节内容失败" + e.Error())
- return
- }
- reportContentListLen := len(reportContentList)
- if reportContentListLen == 0 {
- return
- }
- // 报告章节内容map
- reportContentListMap := make(map[int][]*models.ResearchReportTypeContent, 0)
- for i := 0; i < reportTypeListLen; i++ {
- rtid := reportTypeList[i].ResearchReportTypeId
- reportContentMap := make([]*models.ResearchReportTypeContent, 0)
- for ii := 0; ii < reportContentListLen; ii++ {
- if rtid == reportContentList[ii].ResearchReportTypeId {
- reportContentMap = append(reportContentMap, reportContentList[ii])
- }
- }
- reportContentListMap[rtid] = reportContentMap
- }
- frequencyMap := map[string]string{
- "day": "日度",
- "week": "周度",
- "two_week": "双周度",
- "month": "月度",
- "other": "不定时",
- }
- newReport := new(models.Report)
- newReport.AddType = 1
- // 标题去掉【】
- re, _ := regexp.Compile("^【[^】]*】")
- newTitle := re.ReplaceAllString(reportInfo.ResearchReportName, "")
- newReport.Title = newTitle
- newReport.Author = reportInfo.Author
- newReport.Frequency = frequencyMap[reportInfo.Type]
- newReport.CreateTime = reportInfo.CreatedTime
- modifyTime, _ := time.ParseInLocation(utils.FormatDateTime, reportInfo.CreatedTime, time.Local)
- newReport.ModifyTime = modifyTime
- newReport.State = 2
- newReport.PublishTime = reportInfo.ResearchReportDate
- newReport.Stage = reportInfo.Periods
- //newReport.MsgIsSend = 1
- //newReport.ThsMsgIsSend = 1
- newReport.ReportVersion = 1
- newReport.OldReportId = reportInfo.ResearchReportId
- // 判断报告类型
- newReportId := 0
- if reportInfo.Type == utils.REPORT_TYPE_DAY || reportInfo.Type == utils.REPORT_TYPE_WEEK {
- // 晨周报
- newReport.HasChapter = 1
- newReport.ChapterType = reportInfo.Type
- // 章节类型
- typeList, tmpErr := models.GetReportChapterTypeList()
- if tmpErr != nil {
- err = errors.New("获取晨周报章节类型失败" + tmpErr.Error())
- return
- }
- typeIdName := make(map[int]string, 0)
- typeIdSort := make(map[int]int, 0)
- for i := 0; i < len(typeList); i++ {
- typeIdName[typeList[i].ReportChapterTypeId] = typeList[i].ReportChapterTypeName
- typeIdSort[typeList[i].ReportChapterTypeId] = typeList[i].Sort
- }
- // 分类
- classifyIdFirst := 0
- classifyNameFirst := ""
- if reportInfo.Type == utils.REPORT_TYPE_DAY {
- newReport.ClassifyIdFirst = classifyNameId["晨报"]
- newReport.ClassifyNameFirst = "晨报"
- classifyIdFirst = classifyNameId["晨报"]
- classifyNameFirst = "晨报"
- } else {
- newReport.ClassifyIdFirst = classifyNameId["周报"]
- newReport.ClassifyNameFirst = "周报"
- classifyIdFirst = classifyNameId["周报"]
- classifyNameFirst = "周报"
- }
- // 报告已存在时的更新报告及章节,否则新增
- if existReport != nil {
- // 更新报告
- existReport.Title = newTitle
- existReport.Author = reportInfo.Author
- existReport.PublishTime = reportInfo.ResearchReportDate
- existReport.ModifyTime = time.Now()
- var updateReportCol, updateChapterCol []string
- updateReportCol = append(updateReportCol, "Title", "Author", "PublishTime", "ModifyTime")
- if tmpErr = existReport.UpdateReport(updateReportCol); tmpErr != nil {
- err = errors.New("更新已存在的报告失败" + tmpErr.Error())
- return
- }
- // 章节
- existChapterList, tmpErr := models.GetChapterListByReportId(existReport.Id)
- if tmpErr != nil {
- err = errors.New("获取已存在的报告章节失败" + tmpErr.Error())
- return
- }
- typeChapterMap := make(map[int]*models.ResearchReportType, 0)
- for i := 0; i < reportTypeListLen; i++ {
- typeChapterMap[reportTypeList[i].TypeId] = reportTypeList[i]
- }
- for _, exChapter := range existChapterList {
- chapter := typeChapterMap[exChapter.TypeId]
- if chapter == nil {
- continue
- }
- // 章节内容
- chapterContents := ""
- contentList := reportContentListMap[chapter.ResearchReportTypeId]
- for _, contents := range contentList {
- // 2022-08-09加上段落标题
- if contents.ContentType != "" {
- chapterContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
- chapterContents += contents.ContentType
- chapterContents += `</strong></p><p><br></p>`
- }
- chapterContents += contents.Content
- }
- chapterContents, tmpErr := replaceReportBase64ToImg(chapterContents)
- if tmpErr != nil {
- err = errors.New("章节存在base64图片转换失败" + tmpErr.Error())
- return
- }
- contentClean, e := FilterReportContentBr(chapterContents)
- if e != nil {
- err = errors.New("内容去除前后空格失败, Err: " + e.Error())
- return
- }
- chapterContents = contentClean
- contentSub, tmpErr := GetReportContentSub(chapterContents)
- if tmpErr != nil {
- err = errors.New("解析章节ContentSub失败" + tmpErr.Error())
- return
- }
- exChapter.Title = chapter.ResearchReportTypeTitle
- exChapter.Content = html.EscapeString(chapterContents)
- exChapter.ContentSub = html.EscapeString(contentSub)
- exChapter.ModifyTime = time.Now()
- updateChapterCol = append(updateChapterCol, "Title", "Content", "ContentSub", "ModifyTime")
- updateTickerList := make([]*models.ReportChapterTicker, 0)
- // 晨报数据指标
- if reportInfo.Type == utils.REPORT_TYPE_DAY {
- // 获取章节ticker
- reportTickerList, tmpErr := models.GetResearchReportTypeTickerListByReportTypeIds(typeIdStr)
- if tmpErr != nil {
- err = errors.New("获取报告Ticker失败" + tmpErr.Error())
- return
- }
- reportTickerListMap := make(map[int][]*models.ResearchReportTypeTicker, 0)
- for i := 0; i < len(reportTypeList); i++ {
- // 报告Ticker
- tid := reportTypeList[i].ResearchReportTypeId
- reportTickerMap := make([]*models.ResearchReportTypeTicker, 0)
- for iii := 0; iii < len(reportTickerList); iii++ {
- if tid == reportTickerList[iii].ResearchReportTypeId {
- reportTickerMap = append(reportTickerMap, reportTickerList[iii])
- }
- }
- reportTickerListMap[tid] = reportTickerMap
- }
- tickerList := reportTickerListMap[chapter.ResearchReportTypeId]
- for _, ticker := range tickerList {
- updateTickerList = append(updateTickerList, &models.ReportChapterTicker{
- Sort: ticker.Sort,
- Ticker: ticker.Ticker,
- CreateTime: ticker.CreatedTime,
- UpdateTime: ticker.LastUpdatedTime,
- })
- }
- }
- // 更新章节
- if tmpErr = models.UpdateChapterAndTicker(exChapter, updateChapterCol, updateTickerList); tmpErr != nil {
- err = errors.New("UpdateChapterAndTicker更新已存在的章节失败" + tmpErr.Error())
- return
- }
- }
- } else {
- newDayWeekReport := new(models.CreateDayWeekReport)
- newChapterList := make([]*models.CreateDayWeekReportChapter, 0)
- for _, chapter := range reportTypeList {
- chapterAndTicker := new(models.CreateDayWeekReportChapter)
- tmpTickerList := make([]*models.ReportChapterTicker, 0)
- chapterContents := ""
- // 章节内容列表
- contentList := reportContentListMap[chapter.ResearchReportTypeId]
- for _, contents := range contentList {
- // 2022-08-09加上段落标题
- if contents.ContentType != "" {
- chapterContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
- chapterContents += contents.ContentType
- chapterContents += `</strong></p><p><br></p>`
- }
- chapterContents += contents.Content
- }
- chapterContents, tmpErr := replaceReportBase64ToImg(chapterContents)
- if tmpErr != nil {
- err = errors.New("章节存在base64图片转换失败" + tmpErr.Error())
- return
- }
- state := 2
- if chapterContents == "" {
- state = 1
- }
- contentClean, e := FilterReportContentBr(chapterContents)
- if e != nil {
- err = errors.New("内容去除前后空格失败, Err: " + e.Error())
- return
- }
- chapterContents = contentClean
- contentSub, tmpErr := GetReportContentSub(chapterContents)
- if tmpErr != nil {
- err = errors.New("解析章节ContentSub失败" + tmpErr.Error())
- return
- }
- chapterContents = html.EscapeString(chapterContents)
- contentSub = html.EscapeString(contentSub)
- chapterAndTicker.Chapter = &models.ReportChapter{
- ReportType: reportInfo.Type,
- ClassifyIdFirst: classifyIdFirst,
- ClassifyNameFirst: classifyNameFirst,
- TypeId: chapter.TypeId,
- TypeName: typeIdName[chapter.TypeId],
- Sort: typeIdSort[chapter.TypeId],
- Title: chapter.ResearchReportTypeTitle,
- AddType: 1,
- Author: reportInfo.Author,
- Content: chapterContents,
- ContentSub: contentSub,
- Stage: reportInfo.Periods,
- Trend: chapter.Trend,
- IsEdit: 1,
- PublishState: state,
- PublishTime: chapter.LastUpdatedTime,
- CreateTime: chapter.CreatedTime,
- ModifyTime: chapter.LastUpdatedTime,
- }
- // 晨报数据指标
- if reportInfo.Type == utils.REPORT_TYPE_DAY {
- // 获取章节ticker
- reportTickerList, tmpErr := models.GetResearchReportTypeTickerListByReportTypeIds(typeIdStr)
- if tmpErr != nil {
- err = errors.New("获取报告Ticker失败" + tmpErr.Error())
- return
- }
- reportTickerListMap := make(map[int][]*models.ResearchReportTypeTicker, 0)
- for i := 0; i < len(reportTypeList); i++ {
- // 报告Ticker
- tid := reportTypeList[i].ResearchReportTypeId
- reportTickerMap := make([]*models.ResearchReportTypeTicker, 0)
- for iii := 0; iii < len(reportTickerList); iii++ {
- if tid == reportTickerList[iii].ResearchReportTypeId {
- reportTickerMap = append(reportTickerMap, reportTickerList[iii])
- }
- }
- reportTickerListMap[tid] = reportTickerMap
- }
- tickerList := reportTickerListMap[chapter.ResearchReportTypeId]
- for _, ticker := range tickerList {
- tmpTickerList = append(tmpTickerList, &models.ReportChapterTicker{
- Sort: ticker.Sort,
- Ticker: ticker.Ticker,
- CreateTime: ticker.CreatedTime,
- UpdateTime: ticker.LastUpdatedTime,
- })
- }
- }
- chapterAndTicker.TickerList = tmpTickerList
- newChapterList = append(newChapterList, chapterAndTicker)
- }
- newDayWeekReport.Report = newReport
- newDayWeekReport.ChapterList = newChapterList
- // 新增晨周报
- newReportId, tmpErr = models.CreateMigrateNewDayWeekReport(newDayWeekReport)
- if tmpErr != nil {
- err = errors.New("新增晨周报失败" + tmpErr.Error())
- return
- }
- }
- } else {
- // 非晨周报
- if reportInfo.ReportVariety == "铁矿库存点评" {
- reportInfo.ReportVariety = "铁矿库存数据点评"
- }
- //newReport.Abstract = newTitle
- newReport.ClassifyIdSecond = classifyNameId[reportInfo.ReportVariety]
- newReport.ClassifyNameSecond = reportInfo.ReportVariety
- newReport.ClassifyIdFirst = classifyIdParentId[newReport.ClassifyIdSecond]
- newReport.ClassifyNameFirst = classifyIdName[newReport.ClassifyIdFirst]
- // 忽略分类匹配不上的
- if newReport.ClassifyIdFirst == 0 || newReport.ClassifyIdSecond == 0 || newReport.ClassifyNameFirst == "" || newReport.ClassifyNameSecond == "" {
- fmt.Printf("分类匹配不上,忽略报告, FirstClassify:%s, SecondClassify:%s", newReport.ClassifyNameFirst, newReport.ClassifyNameSecond)
- return
- }
- reportContents := ""
- for _, chapter := range reportTypeList {
- // 章节内容列表
- contentList := reportContentListMap[chapter.ResearchReportTypeId]
- for _, contents := range contentList {
- // 2022-08-09加上段落标题
- if contents.ContentType != "" {
- reportContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
- reportContents += contents.ContentType
- reportContents += `</strong></p><p><br></p>`
- }
- reportContents += contents.Content
- }
- }
- reportContents, tmpErr := replaceReportBase64ToImg(reportContents)
- if tmpErr != nil {
- err = errors.New("报告存在base64图片转换失败" + tmpErr.Error())
- return
- }
- newReport.State = 2
- if reportContents == "" {
- newReport.State = 1
- }
- contentClean, e := FilterReportContentBr(reportContents)
- if e != nil {
- err = errors.New("内容去除前后空格失败, Err: " + e.Error())
- return
- }
- reportContents = contentClean
- reportContentSub, tmpErr := GetReportContentSub(reportContents)
- if tmpErr != nil {
- err = errors.New("解析ContentSub失败" + tmpErr.Error())
- return
- }
- newReport.Content = html.EscapeString(reportContents)
- newReport.ContentSub = html.EscapeString(reportContentSub)
- // 报告已存在则更新部分字段
- if existReport != nil {
- existReport.Title = newTitle
- existReport.Abstract = newReport.Abstract
- existReport.Author = newReport.Author
- existReport.Content = newReport.Content
- existReport.ContentSub = newReport.ContentSub
- existReport.PublishTime = reportInfo.ResearchReportDate
- existReport.ModifyTime = time.Now()
- existReport.ClassifyIdFirst = newReport.ClassifyIdFirst
- existReport.ClassifyNameFirst = newReport.ClassifyNameFirst
- existReport.ClassifyIdSecond = newReport.ClassifyIdSecond
- existReport.ClassifyNameSecond = newReport.ClassifyNameSecond
- updateCol := make([]string, 0)
- updateCol = append(updateCol, "Title", "Abstract", "Author", "Content", "ContentSub", "PublishTime", "ModifyTime", "ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond")
- tmpErr = existReport.UpdateReport(updateCol)
- if tmpErr != nil {
- err = errors.New("更新报告失败" + tmpErr.Error())
- return
- }
- } else {
- // 获取非晨周报权限mapping
- reportPermissionList, tmpErr := models.GetChapterPermissionMappingByResearchReportIds(strconv.Itoa(reportId))
- if tmpErr != nil {
- err = errors.New("获取报告权限mapping失败" + tmpErr.Error())
- return
- }
- // 新增非晨周报
- newReportId, tmpErr = models.CreateMigrateNewOtherReport(newReport, reportPermissionList)
- if tmpErr != nil {
- err = errors.New("新增非晨周报失败" + tmpErr.Error())
- return
- }
- }
- }
- if existReport != nil {
- newReportId = existReport.Id
- }
- if newReportId == 0 {
- err = errors.New("同步报告失败")
- return
- }
- if existReport == nil {
- // 更新音频
- if e = UpdateReportVideo(newReportId); e != nil {
- err = errors.New("更新音频失败" + e.Error())
- return
- }
- }
- // 更新ES
- if e = UpdateReportEs(newReportId, 2); e != nil {
- err = errors.New("更新报告ES失败" + e.Error())
- return
- }
- return
- }
- // UpdateSyncReport (一次性)更新已同步的报告
- func UpdateSyncReport() (err error) {
- defer func() {
- if err != nil {
- fmt.Println(err.Error())
- }
- }()
- reportList, e := models.GetMigrateReportList()
- if e != nil {
- err = errors.New("获取今年报告失败, Err: " + e.Error())
- return
- }
- lenReport := len(reportList)
- for i := 0; i < lenReport; i++ {
- if e = SyncOldReport(reportList[i].ResearchReportId); e != nil {
- err = errors.New("同步报告失败, ResearchReportId: " + strconv.Itoa(reportList[i].ResearchReportId) + ", Err: " + e.Error())
- return
- }
- }
- return
- }
|