|
@@ -2,8 +2,10 @@ package services
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "golang.org/x/net/html"
|
|
|
"hongze/hongze_cygx/models"
|
|
|
"hongze/hongze_cygx/utils"
|
|
|
"strconv"
|
|
@@ -612,6 +614,295 @@ func HandleIndustryList(list []*models.IndustrialManagement, user *models.WxUser
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// HandleIndustryList预处理产业列表字段
|
|
|
+func HandleIndustryListResource(list []*models.IndustrialManagement, user *models.WxUserItem, resource string) (items []*models.IndustrialManagement, err error) {
|
|
|
+ userId := user.UserId
|
|
|
+ fllowList, err := models.GetUserFllowIndustrialList(userId)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fllowMap := make(map[int]int)
|
|
|
+ if len(fllowList) > 0 {
|
|
|
+ for _, v := range fllowList {
|
|
|
+ fllowMap[v.IndustrialManagementId] = v.IndustrialManagementId
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ hotMap, e := IndustrialManagementHotMapGropuPermission()
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("获取hot标签失败,IndustrialManagementHotMapGropuPermission " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ articleTypeIds, _ := GetYanXuanArticleTypeIds()
|
|
|
+ //给默认值
|
|
|
+ if resource != "Yx" {
|
|
|
+ resource = "Hz"
|
|
|
+ }
|
|
|
+ if articleTypeIds != "" {
|
|
|
+ if resource == "Yx" {
|
|
|
+ condition = ` AND a.publish_status = 1 AND a.article_type_id IN (` + articleTypeIds + `) `
|
|
|
+ } else {
|
|
|
+ condition = ` AND a.article_type_id NOT IN (` + articleTypeIds + `) `
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mapindustrialId, e := GetMicroRoadshowVideoMap()
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //合并产业关联的标的
|
|
|
+ listSubjcet, err := models.GetThemeHeatSubjectList("")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ industrialIdArr := make([]int, 0)
|
|
|
+ for k, v := range list {
|
|
|
+ list[k].Source = 1
|
|
|
+ if fllowMap[v.IndustrialManagementId] > 0 {
|
|
|
+ list[k].IsFollow = 1
|
|
|
+ }
|
|
|
+ v.IsHot = hotMap[v.IndustrialManagementId]
|
|
|
+ industrialIdArr = append(industrialIdArr, v.IndustrialManagementId)
|
|
|
+ if _, ok := mapindustrialId[v.IndustrialManagementId]; !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ videoSimple, au, e := GetindustryVideo(user, v.IndustrialManagementId)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("获取产业关联的视频失败,GetindustryVideo " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if videoSimple != nil && videoSimple.Id > 0 {
|
|
|
+ v.IndustryVideo = videoSimple
|
|
|
+ }
|
|
|
+ v.AuthInfo = au
|
|
|
+ v.PublishDate = v.UpdateTime
|
|
|
+ }
|
|
|
+ if len(industrialIdArr) > 0 {
|
|
|
+ //合并产业关联的标的
|
|
|
+ conditionSubject := condition + ` AND m.industrial_management_id IN (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)`
|
|
|
+ pars = append(pars, industrialIdArr)
|
|
|
+ listSubjcet, err = models.GetIndustrialSubjectAllByIndustrialIdcondition(pars, conditionSubject)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ mapIndustrial := make(map[string]int)
|
|
|
+ for _, v := range listSubjcet {
|
|
|
+ for k2, v2 := range list {
|
|
|
+ if v2.IndustrialManagementId == v.IndustrialManagementId && mapIndustrial[fmt.Sprint(v2.IndustrialManagementId, "Hz", v.SubjectName)] == 0 {
|
|
|
+ list[k2].IndustrialSubjectList = append(list[k2].IndustrialSubjectList, v)
|
|
|
+ mapIndustrial[fmt.Sprint(v2.IndustrialManagementId, "Hz", v.SubjectName)] = v2.IndustrialManagementId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //获取产业关联的的文章用户是否阅读
|
|
|
+ mapIndustrialArticleHistory, err := GetUserArticleHistoryIndustrialNewPublishDate(user, industrialIdArr, articleTypeIds, resource)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("获取产业关联的的文章用户是否阅读失败 " + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ mapUPdateTime := make(map[int]string)
|
|
|
+ articleIdArr := make([]int, 0)
|
|
|
+ //获取这些产业下最新更新的文章
|
|
|
+ var conditionindustrial string
|
|
|
+ var parsindustrial []interface{}
|
|
|
+ var industrialIds string
|
|
|
+ if len(industrialIdArr) > 0 {
|
|
|
+ conditionindustrial = condition + ` AND mg.industrial_management_id IN (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)`
|
|
|
+ parsindustrial = append(parsindustrial, industrialIdArr)
|
|
|
+ listUpdateTime, e := models.GetNewArticleDetailByIndustrialIdscondition(parsindustrial, conditionindustrial)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = errors.New("GetNewArticleDetailByIndustrialIds Err " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range listUpdateTime {
|
|
|
+ mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
|
|
|
+ articleIdArr = append(articleIdArr, v.ArticleId)
|
|
|
+ }
|
|
|
+ //时间线的更新时间
|
|
|
+ // maptimelineUPdateTime := make(map[int]string)
|
|
|
+ listtimelinePublishdate, e := models.GetTimeLineReportIndustrialPublishdateList(industrialIdArr)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range listtimelinePublishdate {
|
|
|
+ if mapUPdateTime[v.IndustrialManagementId] != "" {
|
|
|
+ if utils.StrTimeToTime(v.PublishDate).After(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
|
|
|
+ mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //产品内测的更新时间线
|
|
|
+ listtProductInterior, e := models.GetNewProductInteriorByIndustrialIds(industrialIdArr)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range listtProductInterior {
|
|
|
+ if mapUPdateTime[v.IndustrialManagementId] != "" {
|
|
|
+ if utils.StrTimeToTime(v.PublishDate).After(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
|
|
|
+ mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, id := range industrialIdArr {
|
|
|
+ industrialIds += strconv.Itoa(id) + ","
|
|
|
+ }
|
|
|
+ industrialIds = strings.TrimRight(industrialIds, ",")
|
|
|
+ articleList, e := models.GetReportIndustrialReadNumList(userId, industrialIds, user.CreatedTime)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ mapHistroyindustrialId := make(map[int]int)
|
|
|
+ for _, v := range articleList {
|
|
|
+ mapHistroyindustrialId[v.IndustrialManagementId] = v.Readnum
|
|
|
+ }
|
|
|
+ }
|
|
|
+ nowTime := time.Now().Local()
|
|
|
+ threeMonBefore := nowTime.AddDate(0, -3, 0)
|
|
|
+
|
|
|
+ //查询用户今天是否看过时间线
|
|
|
+ //haveMorningMeeting := false
|
|
|
+ //var morningMeetingTime string
|
|
|
+ recrodList, err := models.GetCygxTimelineLogCount(user.UserId, industrialIdArr)
|
|
|
+ if err != nil && err.Error() != utils.ErrNoRow() {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var industrialManagementIdstr string
|
|
|
+ industrialIdMap := make(map[string]time.Time)
|
|
|
+ for _, v := range recrodList {
|
|
|
+ //fmt.Println(v.Router)
|
|
|
+ //sliceindustrial := strings.Split(v.Router, "=")
|
|
|
+ //industrialManagementIdstr = strings.TrimLeft(v.Router, utils.TIME_LINE_ROUTE)
|
|
|
+ industrialManagementIdstr = strconv.Itoa(v.IndustrialManagementId)
|
|
|
+ industrialIdMap[industrialManagementIdstr] = v.ModifyTime
|
|
|
+ //fmt.Println(industrialManagementIdstr)
|
|
|
+ //if createTime, ok := industrialIdMap[industrialManagementIdstr]; ok {
|
|
|
+ // if createTime.Before(v.CreateTime) {
|
|
|
+ // industrialIdMap[industrialManagementIdstr] = v.CreateTime
|
|
|
+ // }
|
|
|
+ //} else {
|
|
|
+ // industrialIdMap[industrialManagementIdstr] = v.CreateTime
|
|
|
+ //}
|
|
|
+ }
|
|
|
+ morningMeetingTimeMap := make(map[int]time.Time)
|
|
|
+ if industrialIds != "" {
|
|
|
+ mmList, e := models.GetCygxMorningMeetingReviewsListByIndustrialIds(industrialIds)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range mmList {
|
|
|
+ morningMeetingTimeMap[v.IndustryId] = v.CreateTime
|
|
|
+ }
|
|
|
+ }
|
|
|
+ timeLineRedMap := make(map[int]bool, 0)
|
|
|
+ for _, industrialId := range industrialIdArr {
|
|
|
+ //if createTime, ok := industrialIdMap[strconv.Itoa(industrialId)]; ok {
|
|
|
+ // if createTime.Before(morningMeetingTimeMap[industrialId]) {
|
|
|
+ // timeLineRedMap[industrialId] = true
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ if industrialIdMap[strconv.Itoa(industrialId)].Before(morningMeetingTimeMap[industrialId]) {
|
|
|
+ timeLineRedMap[industrialId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //fmt.Println(industrialIdMap["90"])
|
|
|
+ //fmt.Println(timeLineRedMap[90])
|
|
|
+ //fmt.Println(mapIndustrialArticleHistory[90])
|
|
|
+ for k, v := range list {
|
|
|
+ list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
|
|
|
+ if userId > 0 {
|
|
|
+ //如果文章没有阅读,而且,文章的发布时间晚于项目的上线时间,而且文章的发布时间晚于用户的注册时间,就进行标红处理
|
|
|
+ if mapIndustrialArticleHistory[v.IndustrialManagementId] || timeLineRedMap[v.IndustrialManagementId] {
|
|
|
+ //if mapHistroyindustrialId[v.IndustrialManagementId] == 0 || timeLineRedMap[v.IndustrialManagementId] {
|
|
|
+ if user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
|
|
|
+ list[k].IsRed = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
|
|
|
+ list[k].IsRed = true
|
|
|
+ }
|
|
|
+ list[k].IsFollow = 1
|
|
|
+ }
|
|
|
+ list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
|
|
|
+
|
|
|
+ if resource == "Yx" {
|
|
|
+ list[k].IsRed = false
|
|
|
+ }
|
|
|
+ // 关联报告发布时间均在3个月内则标记New
|
|
|
+ if v.MinReportTime != "" {
|
|
|
+ t, e := time.Parse(utils.FormatDateTime, v.MinReportTime)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("报告最早发布时间有误,GetindustryVideo " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if t.After(threeMonBefore) {
|
|
|
+ list[k].IsNew = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
|
|
|
+ v.Source = 2
|
|
|
+ } else {
|
|
|
+ v.Source = 1
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.TimeLineData == "" {
|
|
|
+ v.ListTimeLine = make([]models.TimeLineReportResp, 0)
|
|
|
+ } else {
|
|
|
+ if err = json.Unmarshal([]byte(v.TimeLineData), &v.ListTimeLine); err != nil {
|
|
|
+ e = errors.New("Unmarshal, Err: " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ items = list
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func HandleIndustryListHzAndYx(list []*models.IndustrialManagement, user *models.WxUserItem, resource string) (items []*models.IndustrialManagement, err error) {
|
|
|
+ var listHz []*models.IndustrialManagement
|
|
|
+ var lisYx []*models.IndustrialManagement
|
|
|
+ for _, v := range list {
|
|
|
+ if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
|
|
|
+ lisYx = append(lisYx, v)
|
|
|
+ } else {
|
|
|
+ listHz = append(listHz, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ listHz, err = HandleIndustryListResource(listHz, user, "Hz")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ lisYx, err = HandleIndustryListResource(lisYx, user, "Yx")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ maplistHz := make(map[int]*models.IndustrialManagement)
|
|
|
+ maplistYx := make(map[int]*models.IndustrialManagement)
|
|
|
+ for _, v := range listHz {
|
|
|
+ maplistHz[v.IndustrialManagementId] = v
|
|
|
+ }
|
|
|
+ for _, v := range lisYx {
|
|
|
+ maplistYx[v.IndustrialManagementId] = v
|
|
|
+ }
|
|
|
+ for _, v := range list {
|
|
|
+ if maplistHz[v.IndustrialManagementId] != nil {
|
|
|
+ items = append(items, maplistHz[v.IndustrialManagementId])
|
|
|
+ }
|
|
|
+ if maplistYx[v.IndustrialManagementId] != nil {
|
|
|
+ items = append(items, maplistYx[v.IndustrialManagementId])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// 通过文章ID获取文章所关联的产业
|
|
|
func GetArticleIndustrialByArticleId(articleIds []int) (itemMap map[int][]*models.IndustrialManagementResp, err error) {
|
|
|
lenarticleIds := len(articleIds)
|
|
@@ -852,3 +1143,140 @@ func UpdateIndustrialManagementOneMonthFollowNum(cont context.Context) (err erro
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+//func init_14-2() {
|
|
|
+// //IndustrialManagementTimeLineDateList3(127)
|
|
|
+//
|
|
|
+// list, err := models.IndustrialManagementAll()
|
|
|
+// if err != nil {
|
|
|
+// fmt.Println("Error marshaling to JSON:", err)
|
|
|
+// return
|
|
|
+// }
|
|
|
+// fmt.Println(len(list))
|
|
|
+// for k, v := range list {
|
|
|
+// fmt.Println(k)
|
|
|
+// time.Sleep(200 * time.Millisecond)
|
|
|
+// if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
|
|
|
+// continue
|
|
|
+// }
|
|
|
+// IndustrialManagementTimeLineDateList3(v.IndustrialManagementId)
|
|
|
+// }
|
|
|
+//}
|
|
|
+
|
|
|
+//func init() {
|
|
|
+// init_14_2()
|
|
|
+//}
|
|
|
+
|
|
|
+//初始化文章搜索匹配内容
|
|
|
+//func init_14_2() {
|
|
|
+// //IndustrialManagementTimeLineDateList3(127)
|
|
|
+// var conditionContent string
|
|
|
+// var parsContent []interface{}
|
|
|
+//
|
|
|
+// conditionContent = " AND source = 'article' "
|
|
|
+// list, e := models.GetResourceDataListCondition(conditionContent, parsContent, 0, 99999)
|
|
|
+// if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+// fmt.Println(e)
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// var itemsUpdate []*models.CygxArticle
|
|
|
+// for k, v := range list {
|
|
|
+// fmt.Println(k)
|
|
|
+// item := new(models.CygxArticle)
|
|
|
+// item.ArticleId = v.SourceId
|
|
|
+// item.ArticleSearchContent = v.SearchContent
|
|
|
+// itemsUpdate = append(itemsUpdate, item)
|
|
|
+// }
|
|
|
+// e = models.UpdateCygxCygxArticleBillMulti(itemsUpdate)
|
|
|
+// if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+// fmt.Println(e)
|
|
|
+// return
|
|
|
+// }
|
|
|
+// fmt.Println("end")
|
|
|
+//}
|
|
|
+
|
|
|
+// 时间线关联文章的三条数据
|
|
|
+func IndustrialManagementTimeLineDateList3(industrialManagementId int) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ go utils.SendAlarmMsg("修改时间线关联文章的三条数据信息失败"+err.Error(), 2)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ list, e := models.GetTimeLineReportIndustrialList(0, industrialManagementId, 0, 3)
|
|
|
+ if e != nil {
|
|
|
+ err = errors.New("GetCompanySellerAndShareMobileByRai, Err: " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ type TimeLineReportItem struct {
|
|
|
+ Title string `description:"标题"`
|
|
|
+ PublishDate string `description:"发布时间"`
|
|
|
+ }
|
|
|
+
|
|
|
+ var listData []*TimeLineReportItem
|
|
|
+ for _, v := range list {
|
|
|
+ item := new(TimeLineReportItem)
|
|
|
+ if v.Resource == 3 {
|
|
|
+ item.Title, _ = extractTextBeforePeriodOrNewline(v.Content)
|
|
|
+ fmt.Println("Title", item.Title)
|
|
|
+ } else {
|
|
|
+ item.Title = v.Title
|
|
|
+ }
|
|
|
+ item.PublishDate = utils.TimeRemoveHms2(v.PublishTime)
|
|
|
+ listData = append(listData, item)
|
|
|
+ }
|
|
|
+
|
|
|
+ jsonData, err := json.Marshal(listData)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Error marshaling to JSON:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = models.UpdateIndustrialManagementTimeLineData(industrialManagementId, string(jsonData))
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+func extractTextBeforePeriodOrNewline(htmlContent string) (string, error) {
|
|
|
+ var builder strings.Builder
|
|
|
+ reader := strings.NewReader(htmlContent)
|
|
|
+ z := html.NewTokenizer(reader)
|
|
|
+
|
|
|
+ for {
|
|
|
+ tokenType := z.Next()
|
|
|
+ switch tokenType {
|
|
|
+ case html.ErrorToken:
|
|
|
+ // End of document
|
|
|
+ return builder.String(), nil
|
|
|
+ case html.TextToken:
|
|
|
+ text := string(z.Text())
|
|
|
+ //fmt.Println("text", text)
|
|
|
+ if idx := strings.Index(text, "。"); idx != -1 {
|
|
|
+ builder.WriteString(text[:idx+len("。")])
|
|
|
+ return builder.String(), nil
|
|
|
+ } else {
|
|
|
+ return text, nil
|
|
|
+ }
|
|
|
+ builder.WriteString(text)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 处理产业管理时间线相关内容的数据
|
|
|
+func UpdateIndustrialManagementTimeLineDateList3ByRedis() (err error) {
|
|
|
+ for {
|
|
|
+ utils.Rc.Brpop(utils.CYGX_ARTICLE_TIME_LINE_KEY, func(b []byte) {
|
|
|
+ var log models.IndustrialManagementCount
|
|
|
+ if err := json.Unmarshal(b, &log); err != nil {
|
|
|
+ fmt.Println("json unmarshal wrong!")
|
|
|
+ go utils.SendAlarmMsg("处理产业管理时间线相关内容的数据处理Redis队列消息失败: UpdateIndustrialManagementTimeLineDateList3ByRedis "+err.Error()+string(b), 2)
|
|
|
+ }
|
|
|
+ IndustrialManagementTimeLineDateList3(log.IndustrialManagementId)
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//func init_14_2() {
|
|
|
+//SELECT * FROM cygx_resource_data WHERE source_id IN (SELECT article_id FROM cygx_article WHERE series_name IN ('行业深度','季度策略') ) AND source = 'article'
|
|
|
+//}
|