Browse Source

no message

xingzai 1 year ago
parent
commit
013e9c56dd

+ 5 - 1
controllers/yanxuan_special.go

@@ -71,7 +71,7 @@ func (this *YanxuanSpecialNoLoginController) List() {
 		if hasImg {
 			v.ContentHasImg = 1
 		}
-		
+
 		v.ImgUrl = strings.TrimRight(v.ImgUrl, ",")
 		//去除图片标签
 		v.Content = utils.ArticleRemoveImgUrl(v.Content)
@@ -392,6 +392,8 @@ func (this *YanxuanSpecialController) Save() {
 
 	if req.DoType == 2 {
 		go services.SendReviewTemplateMsgAdmin(int(newId))
+		go services.UpdateYanxuanSpecialResourceData(int(newId)) //  写入首页最新  cygx_resource_data 表
+		go services.EsAddYanxuanSpecial(int(newId))              //  写入es 综合搜索
 	}
 	go services.SendWxMsgSpecialAuthor(req.Id, item.Status)
 	br.Ret = 200
@@ -481,6 +483,8 @@ func (this *YanxuanSpecialController) Enable() {
 	if req.Status == 1 {
 		go services.SendWxMsgSpecialFollow(req.Id)
 	}
+	go services.UpdateYanxuanSpecialResourceData(req.Id) //  写入首页最新  cygx_resource_data 表
+	go services.EsAddYanxuanSpecial(req.Id)              //  写入es 综合搜索
 	br.Msg = "审批成功"
 	br.Ret = 200
 	br.Success = true

+ 13 - 1
models/cygx_yanxuan_special.go

@@ -55,6 +55,7 @@ type CygxYanxuanSpecialItem struct {
 	CompanyTags     string
 	IndustryTags    string
 	Docs            []Doc
+	Annotation      string `description:"核心观点"`
 }
 
 type CygxYanxuanSpecialResp struct {
@@ -216,4 +217,15 @@ JOIN cygx_yanxuan_special_author AS b ON a.user_id = b.user_id
  WHERE a.id=? `
 	err = o.Raw(sql, specialId).QueryRow(&item)
 	return
-}
+}
+
+// 获取数量
+func GetCygxYanxuanSpecialCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_yanxuan_special WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 1 - 0
models/db.go

@@ -95,6 +95,7 @@ func init() {
 		new(CygxYanxuanSpecial),
 		new(CygxYanxuanSpecialFollow),
 		new(CygxYanxuanSpecialCompany),
+		new(CygxResourceData),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 44 - 0
models/resource_data.go

@@ -15,6 +15,7 @@ type CygxResourceData struct {
 	CreateTime  time.Time `description:"创建时间"`
 	PublishDate string    `description:"发布时间"`
 	Abstract    string    `description:"摘要"`
+	SearchTag   string    `description:"搜索标签"`
 }
 
 type CygxResourceDataResp struct {
@@ -105,6 +106,7 @@ type CygxResourceDataNewResp struct {
 	ProductInterior    *CygxProductInteriorResp                `description:"产品内测"`
 	IndustrialResource *IndustrialManagement                   `description:"产业资源包"`
 	ReportSelection    *CygxReportSelectionRep                 `description:"重点公司(原报告精选)"`
+	YanxuanSpecial     *CygxYanxuanSpecialItem                 `description:"研选专栏"`
 }
 
 // 列表
@@ -126,3 +128,45 @@ func GetResourceDataCount(condition string, pars []interface{}) (count int, err
 	err = o.Raw(sqlCount, pars).QueryRow(&count)
 	return
 }
+
+// 删除数据
+func DeleteResourceData(sourceId int, source string) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_resource_data WHERE source_id = ? AND source =?  `
+	_, err = o.Raw(sql, sourceId, source).Exec()
+	return
+}
+
+// 获取数量
+func GetCygxResourceDataBySourceAndIdCount(sourceId int, source string) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_resource_data  WHERE  source_id = ? AND source =?  `
+	err = o.Raw(sqlCount, sourceId, source).QueryRow(&count)
+	return
+}
+
+// 添加
+func AddCygxResourceData(item *CygxResourceData) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 修改
+func UpdateResourceDataByItem(item *CygxResourceData) (err error) {
+	o := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["PublishDate"] = item.PublishDate
+	updateParams["SearchTag"] = item.SearchTag
+	ptrStructOrTableName := "cygx_resource_data"
+	whereParam := map[string]interface{}{"source_id": item.SourceId, "source": item.Source}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	return
+}

+ 58 - 6
services/cygx_yanxuan_special.go

@@ -58,14 +58,12 @@ func SendWxMsgSpecialFollow(specialId int) (err error) {
 
 	mobile = strings.TrimRight(mobile, ",")
 
-
 	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
 	if e != nil {
 		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
 		return
 	}
 
-
 	//first =
 	keyword1 = "研选专栏:" + specialItem.SpecialName
 	keyword2 = "发布了新内容,点击查看详情"
@@ -134,7 +132,7 @@ func SendReviewTemplateMsgAdmin(specialId int) (err error) {
 	var keyword3 string
 	var keyword4 string
 	var remark string
-	keyword1 = specialItem.RealName + "【" +user.CompanyName+"】"
+	keyword1 = specialItem.RealName + "【" + user.CompanyName + "】"
 	keyword2 = user.Mobile
 	keyword3 = time.Now().Format(utils.FormatDateTime)
 	keyword4 = "研选专栏提交了内容待审核"
@@ -166,7 +164,7 @@ func SendReviewTemplateMsgAdmin(specialId int) (err error) {
 }
 
 // 研选专栏审核完成时,给提交人发送模板消息
-func SendWxMsgSpecialAuthor(specialId,status int) (err error) {
+func SendWxMsgSpecialAuthor(specialId, status int) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
@@ -199,7 +197,6 @@ func SendWxMsgSpecialAuthor(specialId,status int) (err error) {
 		return err
 	}
 
-
 	//first =
 	keyword1 = "研选专栏内容审核"
 	if status == 1 {
@@ -238,4 +235,59 @@ func SendWxMsgSpecialAuthor(specialId,status int) (err error) {
 		return
 	}
 	return
-}
+}
+
+// 更新研选专栏  写入首页最新  cygx_resource_data 表
+func UpdateYanxuanSpecialResourceData(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("更新研选专栏失败ourceId: ", sourceId), 2)
+		}
+	}()
+	var source = utils.CYGX_OBJ_YANXUANSPECIAL
+	var condition string
+	var pars []interface{}
+	condition = ` AND status = 3  AND  id = ?  `
+	pars = append(pars, sourceId)
+	total, e := models.GetCygxYanxuanSpecialCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxYanxuanSpecialCount, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = models.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := models.GetCygxResourceDataBySourceAndIdCount(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(models.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		item.PublishDate = publishDate
+		item.CreateTime = time.Now()
+		if totalData == 0 {
+			_, e := models.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = models.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}

+ 172 - 3
services/es_comprehensive.go

@@ -4,11 +4,14 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/olivere/elastic/v7"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/utils"
 	"strconv"
 	//"strconv"
 	"errors"
+	"html"
 	"strings"
 	"time"
 )
@@ -28,8 +31,8 @@ type SearchComprehensiveItem struct {
 }
 
 type ElasticComprehensiveDetail struct {
-	SourceId int `description:"资源ID"`
-	//IsSummary    int    `description:"是否是纪要"`
+	SourceId     int    `description:"资源ID"`
+	IsSummary    int    `description:"是否是纪要"`
 	Source       string `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial 、 本周研究汇总: researchsummary 、 上周纪要汇总 :minutessummary 、晨会精华 :meetingreviewchapt  、 产品内测:productinterior 、 产业资源包:industrialsource"`
 	Title        string `description:"标题"`
 	BodyText     string `description:"内容"`
@@ -304,6 +307,7 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 	var productinteriorIds []int      //产品内测
 	var industrialResourceIdsHz []int // 弘则产业资源包
 	var industrialResourceIdsYx []int // 研选产业资源包
+	var yanxuanSpecialIds []int       // 研选专栏
 	//Source      string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial 、 本周研究汇总: researchsummary 、 上周纪要汇总 :minutessummary 、晨会精华 :meetingreviewchapt  、 产品内测:productinterior
 	for _, v := range list {
 		if v.Source == "article" {
@@ -332,6 +336,8 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 			industrialResourceIdsHz = append(industrialResourceIdsHz, v.SourceId)
 		} else if v.Source == "industrialsourceYx" {
 			industrialResourceIdsYx = append(industrialResourceIdsYx, v.SourceId)
+		} else if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL {
+			yanxuanSpecialIds = append(yanxuanSpecialIds, v.SourceId)
 		}
 	}
 	detail, e := models.GetConfigByCode("city_img_url")
@@ -771,10 +777,29 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 			}
 		}
 	}
+
+	//处理研选专栏
+	lenyanxuanSpecialIds := len(yanxuanSpecialIds)
+	if lenyanxuanSpecialIds > 0 {
+		pars = make([]interface{}, 0)
+		condition = ` AND a.id IN (` + utils.GetOrmInReplace(lenyanxuanSpecialIds) + `) `
+		pars = append(pars, yanxuanSpecialIds)
+		listyanxuanSpecial, e := models.GetYanxuanSpecialList(user.UserId, condition, pars)
+		if e != nil {
+			err = errors.New("GetYanxuanSpecialList, Err: " + e.Error())
+			return
+		}
+
+		for _, v := range listyanxuanSpecial {
+			v.Annotation, _ = GetReportContentTextSubNew(v.Content)
+			mapItems[fmt.Sprint(utils.CYGX_OBJ_YANXUANSPECIAL, v.Id)].YanxuanSpecial = v
+		}
+	}
+
 	for _, vList := range list {
 		for _, v := range mapItems {
 			//如果这些类型都为空,那么就不合并
-			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil {
+			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil && v.YanxuanSpecial == nil {
 				continue
 			}
 			if v.Article != nil && v.SourceId == vList.SourceId {
@@ -823,3 +848,147 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 	}
 	return
 }
+
+// Es研选专栏
+func EsAddYanxuanSpecial(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go utils.SendAlarmMsg(fmt.Sprint("更新研选专栏失败sourceId: ", sourceId), 2)
+		}
+	}()
+	detail, e := models.GetYanxuanSpecialItemById(sourceId)
+	if e != nil {
+		err = errors.New("GetArticleInfoOtherByArticleId" + e.Error())
+		return
+	}
+	content := html.UnescapeString(detail.Content)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.Id
+	item.Source = utils.CYGX_OBJ_YANXUANSPECIAL
+	item.Title = detail.Title
+	item.PublishDate = detail.PublishTime
+	item.BodyText = bodyText
+	if detail.Status == 3 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}
+
+// 新增和修改数据
+func EsAddOrEditComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
+	indexName := utils.IndexNameComprehensive
+	//return
+	defer func() {
+		if err != nil {
+			fmt.Println(err, item.SourceId)
+			//go utils.SendAlarmMsg("更新综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	client := utils.Client
+	mustMap := make([]interface{}, 0)
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"SourceId": item.SourceId,
+		},
+	})
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"Source": item.Source,
+		},
+	})
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": mustMap,
+			},
+		},
+	}
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, e := requestTotalHits.Do(context.Background())
+	if e != nil {
+		err = errors.New("requestTotalHits.Do(context.Background()), Err: " + e.Error())
+		return
+	}
+	//return
+	//根据来源以及ID ,判断内容是否存在,如果存在就新增,如果不存在就修改
+	if total == 0 {
+		resp, e := client.Index().Index(indexName).BodyJson(item).Do(context.Background())
+		if e != nil {
+			err = errors.New("client.Index().Index(indexName).BodyJson(item).Do(context.Background()), Err: " + e.Error())
+			return
+		}
+		if resp.Status == 0 && resp.Result == "created" {
+			//fmt.Println("新增成功")
+			//err = nil
+			return
+		} else {
+			//err = errors.New(fmt.Sprint(resp))
+			err = errors.New(fmt.Sprint("articleId", item.SourceId))
+			return
+		}
+	} else {
+		//拼接需要改动的前置条件
+		bool_query := elastic.NewBoolQuery()
+		bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
+		bool_query.Must(elastic.NewTermQuery("Source", item.Source))
+		//设置需要改动的内容
+		var script string
+		script += fmt.Sprint("ctx._source['SubjectNames'] = '", item.SubjectNames, "';")
+		script += fmt.Sprint("ctx._source['PublishDate'] = '", item.PublishDate, "';")
+		script += fmt.Sprint("ctx._source['IsSummary'] = ", item.IsSummary, ";")
+		script += fmt.Sprint("ctx._source['Abstract'] = '", item.Abstract, "';")
+		script += fmt.Sprint("ctx._source['Title'] = '", item.Title, "';")
+		script += fmt.Sprint("ctx._source['BodyText'] = '", item.BodyText, "';")
+		script += fmt.Sprint("ctx._source['Annotation'] = '", item.Annotation, "';")
+		script += fmt.Sprint("ctx._source['IndustryName'] = '", item.IndustryName, "'")
+
+		_, e = client.UpdateByQuery(indexName).
+			Query(bool_query).
+			Script(elastic.NewScriptInline(script)).
+			Refresh("true").
+			Do(context.Background())
+
+		if e != nil && e.Error() != "elastic: Error 400 (Bad Request): compile error [type=script_exception]" {
+			//文本内容过长的时候,修改会报 400 的错误,暂时先不处理
+			//fmt.Println("err", e.Error())
+			////err = e
+			//err = errors.New("client.UpdateByQuery(indexName), Err: " + e.Error())
+			return
+		}
+	}
+	return
+}
+
+// 删除数据
+func EsDeleteComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("删除数据综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	indexName := utils.IndexNameComprehensive
+	client := utils.Client
+	//拼接需要删除的前置条件
+	bool_query := elastic.NewBoolQuery()
+	bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
+	bool_query.Must(elastic.NewTermQuery("Source", item.Source))
+	_, e := client.DeleteByQuery(indexName).
+		Query(bool_query).
+		Do(context.Background())
+	if e != nil {
+		err = errors.New(" client.DeleteByQuery(indexName), Err: " + e.Error())
+		return
+	}
+	return
+}

+ 22 - 1
services/resource_data.go

@@ -44,6 +44,7 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 	var meetingreviewchaptIds []int //晨会精华
 	var productinteriorIds []int    //产品内测
 	var reportselectionIds []int    // 报告精选
+	var yanxuanSpecialIds []int     // 研选专栏
 	//Source      string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial 、 本周研究汇总: researchsummary 、 上周纪要汇总 :minutessummary 、晨会精华 :meetingreviewchapt  、 产品内测:productinterior
 	for _, v := range list {
 		if v.Source == "article" {
@@ -70,6 +71,8 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 			productinteriorIds = append(productinteriorIds, v.SourceId)
 		} else if v.Source == "reportselection" {
 			reportselectionIds = append(reportselectionIds, v.SourceId)
+		} else if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL {
+			yanxuanSpecialIds = append(yanxuanSpecialIds, v.SourceId)
 		}
 	}
 	detail, e := models.GetConfigByCode("city_img_url")
@@ -439,10 +442,28 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 		}
 	}
 
+	//处理研选专栏
+	lenyanxuanSpecialIds := len(yanxuanSpecialIds)
+	if lenyanxuanSpecialIds > 0 {
+		pars = make([]interface{}, 0)
+		condition = ` AND a.id IN (` + utils.GetOrmInReplace(lenyanxuanSpecialIds) + `) `
+		pars = append(pars, yanxuanSpecialIds)
+		listyanxuanSpecial, e := models.GetYanxuanSpecialList(user.UserId, condition, pars)
+		if e != nil {
+			err = errors.New("GetYanxuanSpecialList, Err: " + e.Error())
+			return
+		}
+
+		for _, v := range listyanxuanSpecial {
+			v.Annotation, _ = GetReportContentTextSubNew(v.Content)
+			mapItems[fmt.Sprint(utils.CYGX_OBJ_YANXUANSPECIAL, v.Id)].YanxuanSpecial = v
+		}
+	}
+
 	for _, vList := range list {
 		for _, v := range mapItems {
 			//如果这些类型都为空,那么就不合并
-			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil && v.ReportSelection == nil {
+			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil && v.ReportSelection == nil && v.YanxuanSpecial == nil {
 				continue
 			}
 			if v.SourceId == vList.SourceId {

+ 15 - 0
utils/constants.go

@@ -227,6 +227,21 @@ const (
 	COLLECTIONS_INFO_HTTP_URL = "https://vmp.hzinsights.com/v2/collections" // 上海策略平台精选看板路由
 )
 
+const (
+	CYGX_OBJ_ARTICLE            string = "article"            // 对象类型:文章
+	CYGX_OBJ_ACTIVITY           string = "activity"           // 对象类型:活动
+	CYGX_OBJ_ACTIVITYVIDEO      string = "activityvideo"      // 对象类型:活动视频
+	CYGX_OBJ_ACTIVITYVOICE      string = "activityvoice"      // 对象类型:活动音频
+	CYGX_OBJ_ACTIVITYSPECIAL    string = "activityspecial"    // 对象类型:专项调研活动
+	CYGX_OBJ_MEETINGREVIEWCHAPT string = "meetingreviewchapt" // 对象类型:晨会精华
+	CYGX_OBJ_ROADSHOW           string = "roadshow"           // 对象类型:路演
+	CYGX_OBJ_REPORTSELECTION    string = "reportselection"    // 对象类型:报告精选(重点公司)
+	CYGX_OBJ_PRODUCTINTERIOR    string = "productinterior"    // 对象类型:产品内测
+	CYGX_OBJ_RESEARCHSUMMARY    string = "researchsummary"    // 对象类型:本周研究汇总
+	CYGX_OBJ_MINUTESSUMMARY     string = "minutessummary"     // 对象类型:本周研究汇总
+	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
+)
+
 const (
 	CYGX_YANXUAN_SPECIAL               = "研选专栏" //用户阅读数据
 	CYGX_YANXUAN_SPECIAL_IMG_PC string = "https://hzstatic.hzinsights.com/cygx/yanxuan_special/special_img_pc.png"