瀏覽代碼

Merge remote-tracking branch 'origin/master' into 5.2

# Conflicts:
#	controller/community/question.go
#	models/request/community.go
#	models/response/community.go
Roc 2 年之前
父節點
當前提交
e69b0230b9
共有 36 個文件被更改,包括 959 次插入297 次删除
  1. 3 1
      controller/chart/chart_info.go
  2. 3 3
      controller/community/question.go
  3. 2 2
      controller/community/video.go
  4. 3 3
      controller/price_driven/price_driven.go
  5. 21 2
      controller/public.go
  6. 2 2
      logic/user/user.go
  7. 11 11
      models/request/community.go
  8. 3 2
      models/request/price_driven.go
  9. 10 7
      models/response/community.go
  10. 1 1
      models/response/price_driven.go
  11. 24 0
      models/tables/research_variety_tag_relation/entity.go
  12. 9 0
      models/tables/research_variety_tag_relation/model.go
  13. 35 0
      models/tables/variety_classify/entity.go
  14. 11 0
      models/tables/variety_classify/model.go
  15. 50 0
      models/tables/variety_tag/entity.go
  16. 11 0
      models/tables/variety_tag/model.go
  17. 1 0
      models/tables/yb_community_audio_listen_log/entity.go
  18. 31 31
      models/tables/yb_community_question/entity.go
  19. 14 29
      models/tables/yb_community_question/model.go
  20. 45 45
      models/tables/yb_community_video/entity.go
  21. 9 0
      models/tables/yb_poster_config/query.go
  22. 46 0
      models/tables/yb_poster_config/yb_poster_config.go
  23. 29 17
      models/tables/yb_price_driven/entity.go
  24. 3 3
      models/tables/yb_price_driven/model.go
  25. 35 0
      models/tables/yb_price_driven_tag/entity.go
  26. 9 0
      models/tables/yb_price_driven_tag/model.go
  27. 39 33
      models/tables/yb_price_driven_visit_log/entity.go
  28. 2 2
      routers/price_driven.go
  29. 1 0
      routers/public.go
  30. 87 53
      services/community/question.go
  31. 10 20
      services/community/video.go
  32. 30 27
      services/price_driven/price_driven.go
  33. 16 0
      services/report/report_view_record.go
  34. 252 1
      services/share_poster.go
  35. 2 2
      services/user/user.go
  36. 99 0
      services/variety_tag.go

+ 3 - 1
controller/chart/chart_info.go

@@ -175,7 +175,9 @@ func GetChartInfoDetail(c *gin.Context) {
 		item.EdbCode = v.EdbCode
 		item.EdbCode = v.EdbCode
 		item.EdbName = v.EdbName
 		item.EdbName = v.EdbName
 		item.Frequency = v.Frequency
 		item.Frequency = v.Frequency
-		item.Unit = v.Unit
+		if v.Unit != "无" {
+			item.Unit = v.Unit
+		}
 		item.StartDate = v.StartDate
 		item.StartDate = v.StartDate
 		item.EndDate = v.EndDate
 		item.EndDate = v.EndDate
 		item.ModifyTime = v.ModifyTime
 		item.ModifyTime = v.ModifyTime

+ 3 - 3
controller/community/question.go

@@ -29,8 +29,8 @@ import (
 // @Param page_index			query int false "页码"
 // @Param page_index			query int false "页码"
 // @Param page_size				query int false "每页数量"
 // @Param page_size				query int false "每页数量"
 // @Param only_mine				query int false "只看我的"
 // @Param only_mine				query int false "只看我的"
-// @Param chart_permission_id	query int false "品种权限ID"
-// @Param reply_status			query int false "回复状态 0-全部 2-待回答 3-已回答"
+// @Param variety_tag_id		query int false "标签ID"
+// @Param reply_status			query int false "回复状态 0-全部 2-未回答 3-已回答,4-待回答(研究员)"
 // @Success 200 {object} []respond.CommunityQuestionItem
 // @Success 200 {object} []respond.CommunityQuestionItem
 // @failure 400 {string} string "获取失败"
 // @failure 400 {string} string "获取失败"
 // @Router /question/list [get]
 // @Router /question/list [get]
@@ -47,7 +47,7 @@ func QuestionList(c *gin.Context) {
 		req.PageSize = utils.PageSize20
 		req.PageSize = utils.PageSize20
 	}
 	}
 	userinfo := user.GetInfoByClaims(c)
 	userinfo := user.GetInfoByClaims(c)
-	list, err := community.GetQuestionList(req.PageIndex, req.PageSize, req.OnlyMine, req.ChartPermissionId, req.ReplyStatus, req.GroupId, userinfo)
+	list, err := community.GetQuestionList(req.PageIndex, req.PageSize, req.OnlyMine, req.VarietyTagId, req.ReplyStatus, req.GroupId, userinfo)
 	if err != nil {
 	if err != nil {
 		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
 		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
 		return
 		return

+ 2 - 2
controller/community/video.go

@@ -16,7 +16,7 @@ import (
 // @Param page_size				query int false "每页数量"
 // @Param page_size				query int false "每页数量"
 // @Param keywords				query string false "只看我的"
 // @Param keywords				query string false "只看我的"
 // @Param video_id				query int false "视频ID"
 // @Param video_id				query int false "视频ID"
-// @Param chart_permission_id	query int false "品种权限ID"
+// @Param variety_tag_id		query int false "标签ID"
 // @Success 200 {object}
 // @Success 200 {object}
 // @failure 400 {string} string "获取失败"
 // @failure 400 {string} string "获取失败"
 // @Router /video/list [get]
 // @Router /video/list [get]
@@ -32,7 +32,7 @@ func VideoList(c *gin.Context) {
 	if req.PageSize == 0 {
 	if req.PageSize == 0 {
 		req.PageSize = utils.PageSize20
 		req.PageSize = utils.PageSize20
 	}
 	}
-	list, err := community.GetVideoList(req.PageIndex, req.PageSize, req.VideoId, req.ChartPermissionId, req.Keywords)
+	list, err := community.GetVideoList(req.PageIndex, req.PageSize, req.VideoId, req.VarietyTagId, req.Keywords)
 	if err != nil {
 	if err != nil {
 		response.FailMsg("获取失败", "VideoList ErrMsg:"+err.Error(), c)
 		response.FailMsg("获取失败", "VideoList ErrMsg:"+err.Error(), c)
 		return
 		return

+ 3 - 3
controller/price_driven/price_driven.go

@@ -11,7 +11,7 @@ import (
 // PriceDrivenDetail 价格驱动详情
 // PriceDrivenDetail 价格驱动详情
 // @Tags 价格驱动模块
 // @Tags 价格驱动模块
 // @Description 获取价格驱动详情
 // @Description 获取价格驱动详情
-// @Param chart_permission_id  query  int  true  "品种ID"
+// @Param variety_tag_id  query  int  true  "标签ID"
 // @Success 200 {object} response.PriceDrivenItem
 // @Success 200 {object} response.PriceDrivenItem
 // @failure 400 {string} string "获取失败"
 // @failure 400 {string} string "获取失败"
 // @Router /price_driven/detail [get]
 // @Router /price_driven/detail [get]
@@ -21,11 +21,11 @@ func PriceDrivenDetail(c *gin.Context) {
 		response.Fail("参数有误", c)
 		response.Fail("参数有误", c)
 		return
 		return
 	}
 	}
-	if req.ChartPermissionId <= 0 {
+	if req.VarietyTagId <= 0 {
 		response.Fail("参数有误", c)
 		response.Fail("参数有误", c)
 		return
 		return
 	}
 	}
-	item, errMsg, err := price_driven.GetPriceDrivenDetail(req.ChartPermissionId)
+	item, errMsg, err := price_driven.GetPriceDrivenDetail(req.VarietyTagId)
 	if err != nil {
 	if err != nil {
 		response.FailMsg(errMsg, "GetPriceDrivenDetail ErrMsg:"+err.Error(), c)
 		response.FailMsg(errMsg, "GetPriceDrivenDetail ErrMsg:"+err.Error(), c)
 		return
 		return

+ 21 - 2
controller/public.go

@@ -106,7 +106,7 @@ func GetSharePoster(c *gin.Context) {
 		response.Fail("来源有误", c)
 		response.Fail("来源有误", c)
 		return
 		return
 	}
 	}
-	imgUrl, err := services.CreatePosterFromSource(req.CodePage, req.CodeScene, req.Source, req.Version, req.Pars)
+	imgUrl, err := services.CreatePosterFromSourceV2(req.CodePage, req.CodeScene, req.Source, req.Version, req.Pars)
 	if err != nil {
 	if err != nil {
 		response.FailData("获取分享海报失败", "获取分享海报失败, Err: "+err.Error(), c)
 		response.FailData("获取分享海报失败", "获取分享海报失败, Err: "+err.Error(), c)
 		return
 		return
@@ -131,7 +131,7 @@ func GetSuncodeScene(c *gin.Context) {
 	}
 	}
 	pars, err := yb_suncode_pars.GetSceneByKey(reqKey)
 	pars, err := yb_suncode_pars.GetSceneByKey(reqKey)
 	if err != nil && err != utils.ErrNoRow {
 	if err != nil && err != utils.ErrNoRow {
-		response.FailMsg("获取失败", "GetSuncodeScene获取失败, Err: " + err.Error(), c)
+		response.FailMsg("获取失败", "GetSuncodeScene获取失败, Err: "+err.Error(), c)
 		return
 		return
 	}
 	}
 	scene := ""
 	scene := ""
@@ -140,3 +140,22 @@ func GetSuncodeScene(c *gin.Context) {
 	}
 	}
 	response.OkData("获取成功", scene, c)
 	response.OkData("获取成功", scene, c)
 }
 }
+
+// GetVarietyTagTree 标签树
+// @Tags 公共模块
+// @Summary  标签树
+// @Description 标签树
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Param scene_key query string true "scene_key值"
+// @Success 200 {string} string "获取成功"
+// @failure 400 {string} string "获取失败"
+// @Router /public/get_variety_tag_tree [get]
+func GetVarietyTagTree(c *gin.Context) {
+	list, err := services.GetTagTree()
+	if err != nil {
+		response.FailMsg("获取标签树失败", "获取标签树失败, Err: "+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", list, c)
+}

+ 2 - 2
logic/user/user.go

@@ -8,7 +8,7 @@ import (
 	"hongze/hongze_yb/models/tables/company"
 	"hongze/hongze_yb/models/tables/company"
 	"hongze/hongze_yb/models/tables/company_product"
 	"hongze/hongze_yb/models/tables/company_product"
 	"hongze/hongze_yb/models/tables/rddp/msg_code"
 	"hongze/hongze_yb/models/tables/rddp/msg_code"
-	"hongze/hongze_yb/models/tables/research_group_relation"
+	"hongze/hongze_yb/models/tables/research_variety_tag_relation"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/yb_apply_record"
 	"hongze/hongze_yb/models/tables/yb_apply_record"
 	"hongze/hongze_yb/models/tables/yb_index_tab"
 	"hongze/hongze_yb/models/tables/yb_index_tab"
@@ -226,7 +226,7 @@ func GetUserInfo(userInfo user.UserInfo) (userDetail Detail, err error, errMsg s
 	// 查询是否为研究员
 	// 查询是否为研究员
 	isResearcher := 0
 	isResearcher := 0
 	if isInner == 1 {
 	if isInner == 1 {
-		researchGroupList, e := research_group_relation.GetResearchGroupRelationByAdminId(int(adminInfo.AdminID))
+		researchGroupList, e := research_variety_tag_relation.GetResearchVarietyTagRelationByAdminId(int(adminInfo.AdminID))
 		if e != nil {
 		if e != nil {
 			errMsg = "查询是否为研究员失败"
 			errMsg = "查询是否为研究员失败"
 			err = errors.New("用户身份信息有误")
 			err = errors.New("用户身份信息有误")

+ 11 - 11
models/request/community.go

@@ -1,12 +1,12 @@
 package request
 package request
 
 
 type QuestionListReq struct {
 type QuestionListReq struct {
-	PageIndex         int `json:"page_index" form:"page_index"`
-	PageSize          int `json:"page_size" form:"page_size"`
-	OnlyMine          int `json:"only_mine" form:"only_mine"`
-	ChartPermissionId int `json:"chart_permission_id" form:"chart_permission_id"`
-	ReplyStatus       int `json:"reply_status" form:"reply_status"`
-	GroupId           int `json:"group_id" form:"group_id"`
+	PageIndex    int `json:"page_index" form:"page_index"`
+	PageSize     int `json:"page_size" form:"page_size"`
+	OnlyMine     int `json:"only_mine" form:"only_mine"`
+	VarietyTagId int `json:"variety_tag_id" form:"variety_tag_id"`
+	ReplyStatus  int `json:"reply_status" form:"reply_status"`
+	GroupId      int `json:"group_id" form:"group_id"`
 }
 }
 
 
 type QuestionDetailReq struct {
 type QuestionDetailReq struct {
@@ -43,11 +43,11 @@ type CommunityAudioListenLogReq struct {
 }
 }
 
 
 type VideoListReq struct {
 type VideoListReq struct {
-	PageIndex         int    `json:"page_index" form:"page_index"`
-	PageSize          int    `json:"page_size" form:"page_size"`
-	Keywords          string `json:"keywords" form:"keywords"`
-	VideoId           int    `json:"video_id" form:"video_id"`
-	ChartPermissionId int    `json:"chart_permission_id" form:"chart_permission_id"`
+	PageIndex    int    `json:"page_index" form:"page_index"`
+	PageSize     int    `json:"page_size" form:"page_size"`
+	Keywords     string `json:"keywords" form:"keywords"`
+	VideoId      int    `json:"video_id" form:"video_id"`
+	VarietyTagId int    `json:"variety_tag_id" form:"variety_tag_id"`
 }
 }
 
 
 type VideoPlayLogReq struct {
 type VideoPlayLogReq struct {

+ 3 - 2
models/request/price_driven.go

@@ -1,10 +1,11 @@
 package request
 package request
 
 
 type PriceDrivenDetailReq struct {
 type PriceDrivenDetailReq struct {
-	ChartPermissionId int `json:"chart_permission_id" form:"chart_permission_id"`
+	//ChartPermissionId int `json:"chart_permission_id" form:"chart_permission_id"`
+	VarietyTagId int `json:"variety_tag_id" form:"variety_tag_id"`
 }
 }
 
 
 type PriceDrivenVisitReq struct {
 type PriceDrivenVisitReq struct {
 	PriceDrivenId int `json:"price_driven_id" description:"价格驱动ID"`
 	PriceDrivenId int `json:"price_driven_id" description:"价格驱动ID"`
 	SourceAgent   int `json:"source_agent" description:"来源:1-小程序 2-小程序PC 3-公众号 4-Web官网"`
 	SourceAgent   int `json:"source_agent" description:"来源:1-小程序 2-小程序PC 3-公众号 4-Web官网"`
-}
+}

+ 10 - 7
models/response/community.go

@@ -9,11 +9,12 @@ type CommunityQuestionItem struct {
 	ReplierRealName         string `json:"replier_real_name"`
 	ReplierRealName         string `json:"replier_real_name"`
 	ReplierRank             string `json:"replier_rank"`
 	ReplierRank             string `json:"replier_rank"`
 	ReplierAvatar           string `json:"replier_avatar"`
 	ReplierAvatar           string `json:"replier_avatar"`
-	ChartPermissionID       int    `json:"chart_permission_id"`
-	ChartPermissionName     string `json:"chart_permission_name"`
+	VarietyTagId            int    `json:"variety_tag_id"`
+	VarietyTagName          string `json:"variety_tag_name"`
 	ResearchGroupSecondId   int    `json:"research_group_second_id"`
 	ResearchGroupSecondId   int    `json:"research_group_second_id"`
 	ResearchGroupSecondName string `json:"research_group_second_name"`
 	ResearchGroupSecondName string `json:"research_group_second_name"`
 	IsRead                  int    `json:"is_read"`
 	IsRead                  int    `json:"is_read"`
+	ReplierUserID           int    `json:"replier_user_id"  description:"回复人的user_id"`
 	ReplierIsRead           int    `json:"replier_is_read"`
 	ReplierIsRead           int    `json:"replier_is_read"`
 	CreateTime              string `json:"create_time"`
 	CreateTime              string `json:"create_time"`
 	ReplyTime               string `json:"reply_time"`
 	ReplyTime               string `json:"reply_time"`
@@ -40,9 +41,10 @@ type CommunityQuestionAudioItem struct {
 }
 }
 
 
 type CommunityQuestionListTotal struct {
 type CommunityQuestionListTotal struct {
-	Wait    int `json:"wait"`
-	Replied int `json:"replied"`
-	Total   int `json:"total"`
+	Wait       int `json:"wait"`       //未回答的数量
+	Replied    int `json:"replied"`    //已回答的数量
+	Total      int `json:"total"`      //全部的数量
+	Distribute int `json:"distribute"` //待回答的数量
 }
 }
 
 
 type CommunityQuestionAudioUpload struct {
 type CommunityQuestionAudioUpload struct {
@@ -72,8 +74,8 @@ type ResearchGroupMember struct {
 type CommunityVideoItem struct {
 type CommunityVideoItem struct {
 	CommunityVideoID    int    `json:"community_video_id"`
 	CommunityVideoID    int    `json:"community_video_id"`
 	Title               string `json:"title"`
 	Title               string `json:"title"`
-	ChartPermissionID   int    `json:"chart_permission_id"`
-	ChartPermissionName string `json:"chart_permission_name"`
+	VarietyTagId        int    `json:"variety_tag_id"`
+	VarietyTagName      string `json:"variety_tag_name"`
 	CoverImgUrl         string `json:"cover_img_url"`
 	CoverImgUrl         string `json:"cover_img_url"`
 	VideoUrl            string `json:"video_url"`
 	VideoUrl            string `json:"video_url"`
 	VideoSeconds        string `json:"video_seconds"`
 	VideoSeconds        string `json:"video_seconds"`
@@ -81,6 +83,7 @@ type CommunityVideoItem struct {
 	PublishTime         string `json:"publish_time"`
 	PublishTime         string `json:"publish_time"`
 	CreateTime          string `json:"create_time"`
 	CreateTime          string `json:"create_time"`
 	ModifyTime          string `json:"modify_time"`
 	ModifyTime          string `json:"modify_time"`
+	ChartPermissionName string `json:"chart_permission_name"`
 }
 }
 
 
 // RespCommunityQuestionLikeTease
 // RespCommunityQuestionLikeTease

+ 1 - 1
models/response/price_driven.go

@@ -3,7 +3,7 @@ package response
 // PriceDrivenItem 价格驱动详情
 // PriceDrivenItem 价格驱动详情
 type PriceDrivenItem struct {
 type PriceDrivenItem struct {
 	PriceDrivenID     int    `json:"price_driven_id" description:"价格驱动ID"`
 	PriceDrivenID     int    `json:"price_driven_id" description:"价格驱动ID"`
-	ChartPermissionID int    `json:"chart_permission_id" description:"品种ID"`
+	VarietyTagID      int    `json:"variety_tag_id" description:"标签ID"`
 	MainVariable      string `json:"main_variable" description:"关键变量"`
 	MainVariable      string `json:"main_variable" description:"关键变量"`
 	CoreDrivenType    int    `json:"core_driven_type" description:"核心驱动类型 0-多 1-空"`
 	CoreDrivenType    int    `json:"core_driven_type" description:"核心驱动类型 0-多 1-空"`
 	CoreDrivenContent string `json:"core_driven_content" description:"核心驱动内容"`
 	CoreDrivenContent string `json:"core_driven_content" description:"核心驱动内容"`

+ 24 - 0
models/tables/research_variety_tag_relation/entity.go

@@ -0,0 +1,24 @@
+package research_variety_tag_relation
+
+// ResearchVarietyTagRelation 研究员研究方向分组关系表
+type ResearchVarietyTagRelation struct {
+	Id           int `gorm:"primaryKey;column:id;type:int(10) unsigned;not null" json:"-"`
+	VarietyTagID int `gorm:"column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagID"` //标签库ID
+	AdminID      int `gorm:"column:admin_id;type:int(10) unsigned;not null;default:0" json:"adminId"` // 研究员ID
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *ResearchVarietyTagRelation) TableName() string {
+	return "research_variety_tag_relation"
+}
+
+// ResearchVarietyTagRelationColumns get sql column name.获取数据库列名
+var ResearchVarietyTagRelationColumns = struct {
+	ID           string
+	VarietyTagID string
+	AdminID      string
+}{
+	ID:           "id",
+	VarietyTagID: "variety_tag_id",
+	AdminID:      "admin_id",
+}

+ 9 - 0
models/tables/research_variety_tag_relation/model.go

@@ -0,0 +1,9 @@
+package research_variety_tag_relation
+
+import "hongze/hongze_yb/global"
+
+// GetResearchVarietyTagRelationByAdminId 获取研究员研究方向分组
+func GetResearchVarietyTagRelationByAdminId(adminId int) (items []*ResearchVarietyTagRelation, err error) {
+	err = global.DEFAULT_MYSQL.Model(ResearchVarietyTagRelation{}).Where("admin_id = ?", adminId).Scan(&items).Error
+	return
+}

+ 35 - 0
models/tables/variety_classify/entity.go

@@ -0,0 +1,35 @@
+package variety_classify
+
+import "time"
+
+// VarietyClassify 标签库分类表
+type VarietyClassify struct {
+	VarietyClassifyID int       `gorm:"primaryKey;column:variety_classify_id;type:int(10) unsigned;not null" json:"-"`  // 品种分类ID
+	ClassifyName      string    `gorm:"column:classify_name;type:varchar(100);not null;default:''" json:"classifyName"` // 品种分类名称
+	Sort              int       `gorm:"column:sort;type:int(10) unsigned;not null;default:0" json:"sort"`               // 排序
+	State             int       `gorm:"column:state;type:tinyint(4) unsigned;not null;default:1" json:"state"`          // 状态:0-禁用 1-开启
+	CreateTime        time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`
+	ModifyTime        time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *VarietyClassify) TableName() string {
+	return "variety_classify"
+}
+
+// VarietyClassifyColumns get sql column name.获取数据库列名
+var VarietyClassifyColumns = struct {
+	VarietyClassifyID string
+	ClassifyName      string
+	Sort              string
+	State             string
+	CreateTime        string
+	ModifyTime        string
+}{
+	VarietyClassifyID: "variety_classify_id",
+	ClassifyName:      "classify_name",
+	Sort:              "sort",
+	State:             "state",
+	CreateTime:        "create_time",
+	ModifyTime:        "modify_time",
+}

+ 11 - 0
models/tables/variety_classify/model.go

@@ -0,0 +1,11 @@
+package variety_classify
+
+import "hongze/hongze_yb/global"
+
+func GetVarietyClassifyList() (list []*VarietyClassify, err error) {
+	err = global.DEFAULT_MYSQL.Model(VarietyClassify{}).
+		Where("state = 1").
+		Order("sort ASC").
+		Scan(&list).Error
+	return
+}

+ 50 - 0
models/tables/variety_tag/entity.go

@@ -0,0 +1,50 @@
+package variety_tag
+
+import "time"
+
+// VarietyTag 品种标签库
+type VarietyTag struct {
+	VarietyTagID                int       `gorm:"primaryKey;column:variety_tag_id;type:int(10) unsigned;not null" json:"-"`                                                   // 品种标签ID
+	VarietyClassifyID           int       `gorm:"index:idx_variety_classify_id;column:variety_classify_id;type:int(10) unsigned;not null;default:0" json:"varietyClassifyId"` // 分类ID
+	VarietyClassifyName         string    `gorm:"column:variety_classify_name;type:varchar(100);not null;default:''" json:"varietyClassifyName"`                              // 品种分类名称
+	TagName                     string    `gorm:"column:tag_name;type:varchar(100);not null;default:''" json:"tagName"`                                                       // 标签名
+	ChartPermissionClassifyName string    `gorm:"column:chart_permission_classify_name;type:varchar(100);not null;default:''" json:"chartPermissionClassifyName"`             // 品种权限分类名
+	ChartPermissionID           int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 品种权限ID
+	ChartPermissionName         string    `gorm:"column:chart_permission_name;type:varchar(100);not null;default:''" json:"chartPermissionName"`                              // 品种权限名称
+	Sort                        int       `gorm:"column:sort;type:int(10) unsigned;not null;default:0" json:"sort"`                                                           // 排序
+	State                       int       `gorm:"column:state;type:tinyint(4) unsigned;not null;default:1" json:"state"`                                                      // 状态:0-禁用 1-启用
+	CreateTime                  time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`
+	ModifyTime                  time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *VarietyTag) TableName() string {
+	return "variety_tag"
+}
+
+// VarietyTagColumns get sql column name.获取数据库列名
+var VarietyTagColumns = struct {
+	VarietyTagID                string
+	VarietyClassifyID           string
+	VarietyClassifyName         string
+	TagName                     string
+	ChartPermissionClassifyName string
+	ChartPermissionID           string
+	ChartPermissionName         string
+	Sort                        string
+	State                       string
+	CreateTime                  string
+	ModifyTime                  string
+}{
+	VarietyTagID:                "variety_tag_id",
+	VarietyClassifyID:           "variety_classify_id",
+	VarietyClassifyName:         "variety_classify_name",
+	TagName:                     "tag_name",
+	ChartPermissionClassifyName: "chart_permission_classify_name",
+	ChartPermissionID:           "chart_permission_id",
+	ChartPermissionName:         "chart_permission_name",
+	Sort:                        "sort",
+	State:                       "state",
+	CreateTime:                  "create_time",
+	ModifyTime:                  "modify_time",
+}

+ 11 - 0
models/tables/variety_tag/model.go

@@ -0,0 +1,11 @@
+package variety_tag
+
+import "hongze/hongze_yb/global"
+
+func GetVarietyTagList() (list []*VarietyTag, err error) {
+	err = global.DEFAULT_MYSQL.Model(VarietyTag{}).
+		Where("state = 1").
+		Order("sort ASC").
+		Scan(&list).Error
+	return
+}

+ 1 - 0
models/tables/yb_community_audio_listen_log/entity.go

@@ -17,3 +17,4 @@ func (l *YbCommunityAudioListenLog) TableName() string {
 	return "yb_community_audio_listen_log"
 	return "yb_community_audio_listen_log"
 }
 }
 
 
+

+ 31 - 31
models/tables/yb_community_question/entity.go

@@ -7,33 +7,33 @@ import (
 // YbCommunityQuestion 研报-问答社区表
 // YbCommunityQuestion 研报-问答社区表
 type YbCommunityQuestion struct {
 type YbCommunityQuestion struct {
 	CommunityQuestionID     int       `gorm:"primaryKey;column:community_question_id;type:int(10) unsigned;not null" json:"-"`
 	CommunityQuestionID     int       `gorm:"primaryKey;column:community_question_id;type:int(10) unsigned;not null" json:"-"`
-	UserID                  int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`                                    // 提问用户ID
-	UserOpenid              string    `gorm:"column:user_openid;type:varchar(32);not null;default:''" json:"userOpenid"`                                                  // 提问人openid
-	Mobile                  string    `gorm:"column:mobile;type:varchar(20);not null;default:''" json:"mobile"`                                                           // 用户手机号
-	RealName                string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                                                     // 用户名
-	QuestionContent         string    `gorm:"column:question_content;type:varchar(255);not null;default:''" json:"questionContent"`                                       // 问题描述
-	ReplierUserID           int       `gorm:"index:idx_replier_user_id;column:replier_user_id;type:int(10) unsigned;not null;default:0" json:"replierUserId"`             // 回复人的user_id
-	ReplierOpenid           string    `gorm:"column:replier_openid;type:varchar(32);not null;default:''" json:"replierOpenid"`                                            // 回复人openid
-	ReplierAdminID          int       `gorm:"column:replier_admin_id;type:int(10) unsigned;not null;default:0" json:"replierAdminId"`                                     // 回复人关联的admin_id
-	ReplierRealName         string    `gorm:"column:replier_real_name;type:varchar(30);not null;default:''" json:"replierRealName"`                                       // 回复人姓名
-	ReplierAvatar           string    `gorm:"column:replier_avatar;type:varchar(255);not null;default:''" json:"replierAvatar"`                                           // 回复人头像
-	ResearchGroupFirstID    int       `gorm:"column:research_group_first_id;type:int(10) unsigned;not null;default:0" json:"researchGroupFirstId"`                        // 回复人研究方向一级分组ID
-	ResearchGroupSecondID   int       `gorm:"column:research_group_second_id;type:int(10) unsigned;not null;default:0" json:"researchGroupSecondId"`                      // 回复人研究方向二级分组ID
-	ResearchGroupFirstName  string    `gorm:"column:research_group_first_name;type:varchar(100);not null;default:''" json:"researchGroupFirstName"`                       // 研究方向一级分组名称
-	ResearchGroupSecondName string    `gorm:"column:research_group_second_name;type:varchar(100);not null;default:''" json:"researchGroupSecondName"`                     // 研究方向二级分组名称
-	DistributeAdminID       int       `gorm:"column:distribute_admin_id;type:int(10) unsigned;not null;default:0" json:"distributeAdminId"`                               // 分配人admin_id
-	DistributeTime          time.Time `gorm:"column:distribute_time;type:datetime" json:"distributeTime"`                                                                 // 分配时间
-	ChartPermissionID       int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 关联权限ID
-	ChartPermissionName     string    `gorm:"column:chart_permission_name;type:varchar(100);not null;default:''" json:"chartPermissionName"`                              // 关联权限name
-	IsRead                  int       `gorm:"column:is_read;type:tinyint(4) unsigned;not null;default:0" json:"isRead"`                                                   // 用户是否已读 0-未读 1-已读
-	ReplierIsRead           int       `gorm:"column:replier_is_read;type:tinyint(4) unsigned;not null;default:0" json:"replierIsRead"`                                    // 回复人是否已读 0-未读 1-已读
-	ReplyStatus             int       `gorm:"column:reply_status;type:tinyint(4) unsigned;not null;default:0" json:"replyStatus"`                                         // 回复状态 1-待分配 2-待回答 3-已回答
-	MsgSendStatus           int       `gorm:"column:msg_send_status;type:tinyint(4) unsigned;not null;default:0" json:"msgSendStatus"`                                    // 消息推送进度 0-待推送 1-已推送回答人 2-已推送提问人
-	ReplyTime               time.Time `gorm:"column:reply_time;type:datetime" json:"replyTime"`                                                                           // 回复时间
-	CreateTime              time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 提问时间
-	ModifyTime              time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 修改时间
-	IsDeleted               int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                                             // 是否已删除 0-否 1-是
-	DeleteTime              time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`                                                                         // 删除时间
+	UserID                  int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`                        // 提问用户ID
+	UserOpenid              string    `gorm:"column:user_openid;type:varchar(32);not null;default:''" json:"userOpenid"`                                      // 提问人openid
+	Mobile                  string    `gorm:"column:mobile;type:varchar(20);not null;default:''" json:"mobile"`                                               // 用户手机号
+	RealName                string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                                         // 用户名
+	QuestionContent         string    `gorm:"column:question_content;type:varchar(255);not null;default:''" json:"questionContent"`                           // 问题描述
+	ReplierUserID           int       `gorm:"index:idx_replier_user_id;column:replier_user_id;type:int(10) unsigned;not null;default:0" json:"replierUserId"` // 回复人的user_id
+	ReplierOpenid           string    `gorm:"column:replier_openid;type:varchar(32);not null;default:''" json:"replierOpenid"`                                // 回复人openid
+	ReplierAdminID          int       `gorm:"column:replier_admin_id;type:int(10) unsigned;not null;default:0" json:"replierAdminId"`                         // 回复人关联的admin_id
+	ReplierRealName         string    `gorm:"column:replier_real_name;type:varchar(30);not null;default:''" json:"replierRealName"`                           // 回复人姓名
+	ReplierAvatar           string    `gorm:"column:replier_avatar;type:varchar(255);not null;default:''" json:"replierAvatar"`                               // 回复人头像
+	ResearchGroupFirstID    int       `gorm:"column:research_group_first_id;type:int(10) unsigned;not null;default:0" json:"researchGroupFirstId"`            // 回复人研究方向一级分组ID
+	ResearchGroupSecondID   int       `gorm:"column:research_group_second_id;type:int(10) unsigned;not null;default:0" json:"researchGroupSecondId"`          // 回复人研究方向二级分组ID
+	ResearchGroupFirstName  string    `gorm:"column:research_group_first_name;type:varchar(100);not null;default:''" json:"researchGroupFirstName"`           // 研究方向一级分组名称
+	ResearchGroupSecondName string    `gorm:"column:research_group_second_name;type:varchar(100);not null;default:''" json:"researchGroupSecondName"`         // 研究方向二级分组名称
+	DistributeAdminID       int       `gorm:"column:distribute_admin_id;type:int(10) unsigned;not null;default:0" json:"distributeAdminId"`                   // 分配人admin_id
+	DistributeTime          time.Time `gorm:"column:distribute_time;type:datetime" json:"distributeTime"`                                                     // 分配时间
+	VarietyTagID            int       `gorm:"index:idx_variety_tag_id;column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagId"`    // 标签ID
+	VarietyTagName          string    `gorm:"column:variety_tag_name;type:varchar(100);not null;default:''" json:"varietyTagName"`                            // 标签名称
+	IsRead                  int       `gorm:"column:is_read;type:tinyint(4) unsigned;not null;default:0" json:"isRead"`                                       // 用户是否已读 0-未读 1-已读
+	ReplierIsRead           int       `gorm:"column:replier_is_read;type:tinyint(4) unsigned;not null;default:0" json:"replierIsRead"`                        // 回复者是否已读  0-未读 1-已读
+	ReplyStatus             int       `gorm:"column:reply_status;type:tinyint(4) unsigned;not null;default:0" json:"replyStatus"`                             // 回复状态 1-待分配 2-待回答 3-已回答
+	MsgSendStatus           int       `gorm:"column:msg_send_status;type:tinyint(4) unsigned;not null;default:0" json:"msgSendStatus"`                        // 消息推送进度 0-待推送 1-已推送回答人 2-已推送提问人
+	ReplyTime               time.Time `gorm:"column:reply_time;type:datetime" json:"replyTime"`                                                               // 回复时间
+	CreateTime              time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                   // 提问时间
+	ModifyTime              time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                   // 修改时间
+	IsDeleted               int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                                 // 是否已删除 0-否 1-是
+	DeleteTime              time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`                                                             // 删除时间
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名
@@ -60,8 +60,8 @@ var YbCommunityQuestionColumns = struct {
 	ResearchGroupSecondName string
 	ResearchGroupSecondName string
 	DistributeAdminID       string
 	DistributeAdminID       string
 	DistributeTime          string
 	DistributeTime          string
-	ChartPermissionID       string
-	ChartPermissionName     string
+	VarietyTagID            string
+	VarietyTagName          string
 	IsRead                  string
 	IsRead                  string
 	ReplierIsRead           string
 	ReplierIsRead           string
 	ReplyStatus             string
 	ReplyStatus             string
@@ -89,8 +89,8 @@ var YbCommunityQuestionColumns = struct {
 	ResearchGroupSecondName: "research_group_second_name",
 	ResearchGroupSecondName: "research_group_second_name",
 	DistributeAdminID:       "distribute_admin_id",
 	DistributeAdminID:       "distribute_admin_id",
 	DistributeTime:          "distribute_time",
 	DistributeTime:          "distribute_time",
-	ChartPermissionID:       "chart_permission_id",
-	ChartPermissionName:     "chart_permission_name",
+	VarietyTagID:            "variety_tag_id",
+	VarietyTagName:          "variety_tag_name",
 	IsRead:                  "is_read",
 	IsRead:                  "is_read",
 	ReplierIsRead:           "replier_is_read",
 	ReplierIsRead:           "replier_is_read",
 	ReplyStatus:             "reply_status",
 	ReplyStatus:             "reply_status",

+ 14 - 29
models/tables/yb_community_question/model.go

@@ -1,10 +1,8 @@
 package yb_community_question
 package yb_community_question
 
 
 import (
 import (
-	"errors"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/models/tables/yb_community_question_audio"
 	"hongze/hongze_yb/models/tables/yb_community_question_audio"
-	"hongze/hongze_yb/utils"
 	"time"
 	"time"
 )
 )
 
 
@@ -19,14 +17,9 @@ func (item *YbCommunityQuestion) Update(updateCols []string) (err error) {
 }
 }
 
 
 // GetPageListByCondition 获取问答列表-分页
 // GetPageListByCondition 获取问答列表-分页
-func GetPageListByCondition(where map[string]interface{}, pageIndex, pageSize int) (list []*YbCommunityQuestion, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,生成查询语句失败")
-		return
-	}
+func GetPageListByCondition(condition string, pars []interface{},pageIndex, pageSize int) (list []*YbCommunityQuestion, err error) {
 	offset := (pageIndex - 1) * pageSize
 	offset := (pageIndex - 1) * pageSize
-	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(cond, vals...).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(condition, pars...).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
 	return
 	return
 }
 }
 
 
@@ -62,40 +55,32 @@ func UpdateQuestionAndAudioList(item *YbCommunityQuestion, updateCols []string,
 }
 }
 
 
 type QuestionListCount struct {
 type QuestionListCount struct {
-	ReplyStatus int `json:"reply_status"`
-	Total       int `json:"total"`
+	ReplierUserId uint64 `json:"replier_user_id"`
+	UserId        uint64 `json:"user_id"`
+	ReplyStatus   int `json:"reply_status"`
+	Total         int `json:"total"`
 }
 }
 
 
 // GetQuestionListCount 获取问答数量统计
 // GetQuestionListCount 获取问答数量统计
-func GetQuestionListCount(where map[string]interface{}) (list []*QuestionListCount, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,GetQuestionListCount 生成查询语句失败")
-		return
-	}
+func GetQuestionListCount(condition string, pars []interface{}) (list []*QuestionListCount, err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Select("reply_status, COUNT(1) total").
-		Where(cond, vals...).
-		Group("reply_status").
+		Select("reply_status, replier_user_id, user_id, COUNT(1) total").
+		Where(condition, pars...).
+		Group("reply_status, replier_user_id, user_id").
 		Scan(&list).Error
 		Scan(&list).Error
 	return
 	return
 }
 }
 
 
 // GetUnreadNum 获取未读数
 // GetUnreadNum 获取未读数
-func GetUnreadNum(where map[string]interface{}) (num int64, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,GetUnreadNum 生成查询语句失败")
-		return
-	}
-	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(cond, vals...).Count(&num).Error
+func GetUnreadNum(condition string, pars []interface{}) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(condition, pars...).Count(&num).Error
 	return
 	return
 }
 }
 
 
 // UpdateReplierRead 更新回复人已读
 // UpdateReplierRead 更新回复人已读
 func UpdateReplierRead(replierUserId int, questionIds []int) (err error) {
 func UpdateReplierRead(replierUserId int, questionIds []int) (err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Where("replier_user_id = ? AND community_question_id IN (?)", replierUserId, questionIds).
+		Where("replier_user_id = ? AND community_question_id IN (?) AND replier_is_read=0", replierUserId, questionIds).
 		Updates(YbCommunityQuestion{
 		Updates(YbCommunityQuestion{
 			ReplierIsRead: 1,
 			ReplierIsRead: 1,
 			ModifyTime: time.Now().Local(),
 			ModifyTime: time.Now().Local(),
@@ -106,7 +91,7 @@ func UpdateReplierRead(replierUserId int, questionIds []int) (err error) {
 // UpdateUserRead 更新用户已读
 // UpdateUserRead 更新用户已读
 func UpdateUserRead(userId int, questionIds []int) (err error) {
 func UpdateUserRead(userId int, questionIds []int) (err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Where("user_id = ? AND community_question_id IN (?)", userId, questionIds).
+		Where("user_id = ? AND community_question_id IN (?) AND is_read=0", userId, questionIds).
 		Updates(YbCommunityQuestion{
 		Updates(YbCommunityQuestion{
 			IsRead: 1,
 			IsRead: 1,
 			ModifyTime: time.Now().Local(),
 			ModifyTime: time.Now().Local(),

+ 45 - 45
models/tables/yb_community_video/entity.go

@@ -4,21 +4,21 @@ import "time"
 
 
 // YbCommunityVideo 研报-视频社区表
 // YbCommunityVideo 研报-视频社区表
 type YbCommunityVideo struct {
 type YbCommunityVideo struct {
-	CommunityVideoID    int       `gorm:"primaryKey;column:community_video_id;type:int(10) unsigned;not null" json:"-"`
-	Title               string    `gorm:"column:title;type:varchar(255);not null;default:''" json:"title"`                                                            // 视频标题
-	ChartPermissionID   int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 品种权限ID
-	ChartPermissionName string    `gorm:"column:chart_permission_name;type:varchar(30);not null;default:''" json:"chartPermissionName"`                               // 品种权限名称
-	CoverImgURL         string    `gorm:"column:cover_img_url;type:varchar(255);not null;default:''" json:"coverImgUrl"`                                              // 封面图地址
-	VideoURL            string    `gorm:"column:video_url;type:varchar(255);not null;default:''" json:"videoUrl"`                                                     // 视频地址
-	VideoSeconds        string    `gorm:"column:video_seconds;type:varchar(30);not null;default:''" json:"videoSeconds"`                                              // 视频时长
-	PublishState        int       `gorm:"column:publish_state;type:tinyint(4) unsigned;not null;default:0" json:"publishState"`                                       // 发布状态:0-未发布 1-已发布
-	SendThsState        int       `gorm:"column:send_ths_state;type:tinyint(4) unsigned;not null;default:0" json:"sendThsState"`                                      // 推送客群状态:0-未推送 1-已推送
-	IsDeleted           int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                                             // 是否已删除:0-未删除 1-已删除
-	PublishTime         time.Time `gorm:"column:publish_time;type:datetime" json:"publishTime"`                                                                       // 发布时间
-	SendThsTime         time.Time `gorm:"column:send_ths_time;type:datetime" json:"sendThsTime"`                                                                      // 推送客群时间
-	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 创建时间
-	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 更新时间
-	DeleteTime          time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`
+	CommunityVideoID int       `gorm:"primaryKey;column:community_video_id;type:int(10) unsigned;not null" json:"-"`
+	Title            string    `gorm:"column:title;type:varchar(255);not null;default:''" json:"title"`                                             // 视频标题
+	VarietyTagId     int       `gorm:"index:idx_variety_tag_id;column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagId"` // 品种权限ID
+	VarietyTagName   string    `gorm:"column:variety_tag_name;type:varchar(30);not null;default:''" json:"varietyTagName"`                          // 品种权限名称
+	CoverImgURL      string    `gorm:"column:cover_img_url;type:varchar(255);not null;default:''" json:"coverImgUrl"`                               // 封面图地址
+	VideoURL         string    `gorm:"column:video_url;type:varchar(255);not null;default:''" json:"videoUrl"`                                      // 视频地址
+	VideoSeconds     string    `gorm:"column:video_seconds;type:varchar(30);not null;default:''" json:"videoSeconds"`                               // 视频时长
+	PublishState     int       `gorm:"column:publish_state;type:tinyint(4) unsigned;not null;default:0" json:"publishState"`                        // 发布状态:0-未发布 1-已发布
+	SendThsState     int       `gorm:"column:send_ths_state;type:tinyint(4) unsigned;not null;default:0" json:"sendThsState"`                       // 推送客群状态:0-未推送 1-已推送
+	IsDeleted        int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                              // 是否已删除:0-未删除 1-已删除
+	PublishTime      time.Time `gorm:"column:publish_time;type:datetime" json:"publishTime"`                                                        // 发布时间
+	SendThsTime      time.Time `gorm:"column:send_ths_time;type:datetime" json:"sendThsTime"`                                                       // 推送客群时间
+	CreateTime       time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                // 创建时间
+	ModifyTime       time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                // 更新时间
+	DeleteTime       time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名
@@ -28,35 +28,35 @@ func (m *YbCommunityVideo) TableName() string {
 
 
 // YbCommunityVideoColumns get sql column name.获取数据库列名
 // YbCommunityVideoColumns get sql column name.获取数据库列名
 var YbCommunityVideoColumns = struct {
 var YbCommunityVideoColumns = struct {
-	CommunityVideoID    string
-	Title               string
-	ChartPermissionID   string
-	ChartPermissionName string
-	CoverImgURL         string
-	VideoURL            string
-	VideoSeconds        string
-	PublishState        string
-	SendThsState        string
-	IsDeleted           string
-	PublishTime         string
-	SendThsTime         string
-	CreateTime          string
-	ModifyTime          string
-	DeleteTime          string
+	CommunityVideoID string
+	Title            string
+	varietyTagId     string
+	varietyTagName   string
+	CoverImgURL      string
+	VideoURL         string
+	VideoSeconds     string
+	PublishState     string
+	SendThsState     string
+	IsDeleted        string
+	PublishTime      string
+	SendThsTime      string
+	CreateTime       string
+	ModifyTime       string
+	DeleteTime       string
 }{
 }{
-	CommunityVideoID:    "community_video_id",
-	Title:               "title",
-	ChartPermissionID:   "chart_permission_id",
-	ChartPermissionName: "chart_permission_name",
-	CoverImgURL:         "cover_img_url",
-	VideoURL:            "video_url",
-	VideoSeconds:        "video_seconds",
-	PublishState:        "publish_state",
-	SendThsState:        "send_ths_state",
-	IsDeleted:           "is_deleted",
-	PublishTime:         "publish_time",
-	SendThsTime:         "send_ths_time",
-	CreateTime:          "create_time",
-	ModifyTime:          "modify_time",
-	DeleteTime:          "delete_time",
+	CommunityVideoID: "community_video_id",
+	Title:            "title",
+	varietyTagId:     "variety_tag_id",
+	varietyTagName:   "variety_tag_name",
+	CoverImgURL:      "cover_img_url",
+	VideoURL:         "video_url",
+	VideoSeconds:     "video_seconds",
+	PublishState:     "publish_state",
+	SendThsState:     "send_ths_state",
+	IsDeleted:        "is_deleted",
+	PublishTime:      "publish_time",
+	SendThsTime:      "send_ths_time",
+	CreateTime:       "create_time",
+	ModifyTime:       "modify_time",
+	DeleteTime:       "delete_time",
 }
 }

+ 9 - 0
models/tables/yb_poster_config/query.go

@@ -0,0 +1,9 @@
+package yb_poster_config
+
+import "hongze/hongze_yb/global"
+
+// GetBySource 根据来源查询配置
+func GetBySource(source string) (item *YbPosterConfig, err error) {
+	err = global.DEFAULT_MYSQL.Where("source = ? ", source).Order("id desc").First(&item).Error
+	return
+}

+ 46 - 0
models/tables/yb_poster_config/yb_poster_config.go

@@ -0,0 +1,46 @@
+package yb_poster_config
+
+import (
+	"time"
+)
+
+// YbPosterConfig 研报海报生成配置
+type YbPosterConfig struct {
+	ID                 uint32    `gorm:"primaryKey;column:id;type:int(9) unsigned;not null" json:"-"`
+	Source             string    `gorm:"index:idx_source;column:source;type:varchar(64);default:''" json:"source"` // 来源
+	Hight              float64   `gorm:"column:hight;type:double(9,2) unsigned;default:0.00" json:"hight"`         // 海报高度
+	Width              float64   `gorm:"column:width;type:double(9,2) unsigned;default:0.00" json:"width"`         // 海报宽度
+	HTMLTemplate       string    `gorm:"column:html_template;type:text" json:"htmlTemplate"`                       // html代码模板
+	HTMLReplaceConfig  string    `gorm:"column:html_replace_config;type:text" json:"htmlReplaceConfig"`            // 模板中的变量替换规则
+	DefaultValueConfig string    `gorm:"column:default_value_config;type:text" json:"defaultValueConfig"`          // 默认值的配置
+	Remark             string    `gorm:"column:remark;type:varchar(255);default:''" json:"remark"`                 // 备注
+	CreateTime         time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbPosterConfig) TableName() string {
+	return "yb_poster_config"
+}
+
+// YbPosterConfigColumns get sql column name.获取数据库列名
+var YbPosterConfigColumns = struct {
+	ID                 string
+	Source             string
+	Hight              string
+	Width              string
+	HTMLTemplate       string
+	HTMLReplaceConfig  string
+	DefaultValueConfig string
+	Remark             string
+	CreateTime         string
+}{
+	ID:                 "id",
+	Source:             "source",
+	Hight:              "hight",
+	Width:              "width",
+	HTMLTemplate:       "html_template",
+	HTMLReplaceConfig:  "html_replace_config",
+	DefaultValueConfig: "default_value_config",
+	Remark:             "remark",
+	CreateTime:         "create_time",
+}

+ 29 - 17
models/tables/yb_price_driven/entity.go

@@ -7,17 +7,21 @@ import (
 // YbPriceDriven 研报-价格驱动表
 // YbPriceDriven 研报-价格驱动表
 type YbPriceDriven struct {
 type YbPriceDriven struct {
 	PriceDrivenID       int       `gorm:"primaryKey;column:price_driven_id;type:int(10) unsigned;not null" json:"-"`
 	PriceDrivenID       int       `gorm:"primaryKey;column:price_driven_id;type:int(10) unsigned;not null" json:"-"`
-	ChartPermissionID   int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 品种权限ID
-	MainVariable        string    `gorm:"column:main_variable;type:varchar(255);not null;default:''" json:"mainVariable"`                                             // 关键变量
-	CoreDrivenType      int       `gorm:"column:core_driven_type;type:tinyint(4) unsigned;not null;default:0" json:"coreDrivenType"`                                  // 核心驱动类型 0-多 1-空
-	CoreDrivenContent   string    `gorm:"column:core_driven_content;type:varchar(255);not null;default:''" json:"coreDrivenContent"`                                  // 核心驱动内容
-	CoreContent         string    `gorm:"column:core_content;type:longtext" json:"coreContent"`                                                                       // 核心内容
-	LastUpdateAdminID   int       `gorm:"column:last_update_admin_id;type:int(10) unsigned;not null;default:0" json:"lastUpdateAdminId"`                              // 最后一次更新人ID
-	LastUpdateAdminName string    `gorm:"column:last_update_admin_name;type:varchar(30);not null;default:''" json:"lastUpdateAdminName"`                              // 最后一次更新人姓名
-	LastThsMsgTime      time.Time `gorm:"column:last_ths_msg_time;type:datetime" json:"lastThsMsgTime"`                                                               // 最后一次推送客群消息的时间
-	LastTemplateMsgTime time.Time `gorm:"column:last_template_msg_time;type:datetime" json:"lastTemplateMsgTime"`                                                     // 最后一次推送模板消息的时间
-	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 创建时间
-	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 修改时间
+	VarietyTagID        int       `gorm:"index:idx_variety_tag_id;column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagId"` // 标签ID
+	VarietyTagName      string    `gorm:"column:variety_tag_name;type:varchar(10);not null;default:''" json:"varietyTagName"`                          // 标签名称
+	MainVariable        string    `gorm:"column:main_variable;type:varchar(255);not null;default:''" json:"mainVariable"`                              // 关键变量
+	CoreDrivenType      int       `gorm:"column:core_driven_type;type:tinyint(4) unsigned;not null;default:0" json:"coreDrivenType"`                   // 核心驱动类型 0-多 1-空
+	CoreDrivenContent   string    `gorm:"column:core_driven_content;type:varchar(255);not null;default:''" json:"coreDrivenContent"`                   // 核心驱动内容
+	CoreContent         string    `gorm:"column:core_content;type:longtext" json:"coreContent"`                                                        // 核心内容
+	LastUpdateAdminID   int       `gorm:"column:last_update_admin_id;type:int(10) unsigned;not null;default:0" json:"lastUpdateAdminId"`               // 最后一次更新人ID
+	LastUpdateAdminName string    `gorm:"column:last_update_admin_name;type:varchar(30);not null;default:''" json:"lastUpdateAdminName"`               // 最后一次更新人姓名
+	SendThsMsgTime      time.Time `gorm:"column:send_ths_msg_time;type:datetime" json:"sendThsMsgTime"`                                                // 最后一次推送客群消息的时间
+	SendTemplateMsgTime time.Time `gorm:"column:send_template_msg_time;type:datetime" json:"sendTemplateMsgTime"`                                      // 最后一次推送模板消息的时间
+	ThsMsgState         int       `gorm:"column:ths_msg_state;type:tinyint(4) unsigned;not null;default:0" json:"thsMsgState"`                         // 同花顺推送状态:0-未推送 1-已推送
+	TemplateMsgState    int       `gorm:"column:template_msg_state;type:tinyint(4) unsigned;not null;default:0" json:"templateMsgState"`               // 模板消息推送状态:0-未推送 1-已推送
+	PublishState        int       `gorm:"column:publish_state;type:tinyint(4) unsigned;not null;default:0" json:"publishState"`                        // 发布状态:0-未发布 1-已发布
+	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                // 创建时间
+	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                // 修改时间
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名
@@ -28,28 +32,36 @@ func (m *YbPriceDriven) TableName() string {
 // YbPriceDrivenColumns get sql column name.获取数据库列名
 // YbPriceDrivenColumns get sql column name.获取数据库列名
 var YbPriceDrivenColumns = struct {
 var YbPriceDrivenColumns = struct {
 	PriceDrivenID       string
 	PriceDrivenID       string
-	ChartPermissionID   string
+	VarietyTagID        string
+	VarietyTagName      string
 	MainVariable        string
 	MainVariable        string
 	CoreDrivenType      string
 	CoreDrivenType      string
 	CoreDrivenContent   string
 	CoreDrivenContent   string
 	CoreContent         string
 	CoreContent         string
 	LastUpdateAdminID   string
 	LastUpdateAdminID   string
 	LastUpdateAdminName string
 	LastUpdateAdminName string
-	LastThsMsgTime      string
-	LastTemplateMsgTime string
+	SendThsMsgTime      string
+	SendTemplateMsgTime string
+	ThsMsgState         string
+	TemplateMsgState    string
+	PublishState        string
 	CreateTime          string
 	CreateTime          string
 	ModifyTime          string
 	ModifyTime          string
 }{
 }{
 	PriceDrivenID:       "price_driven_id",
 	PriceDrivenID:       "price_driven_id",
-	ChartPermissionID:   "chart_permission_id",
+	VarietyTagID:        "variety_tag_id",
+	VarietyTagName:      "variety_tag_name",
 	MainVariable:        "main_variable",
 	MainVariable:        "main_variable",
 	CoreDrivenType:      "core_driven_type",
 	CoreDrivenType:      "core_driven_type",
 	CoreDrivenContent:   "core_driven_content",
 	CoreDrivenContent:   "core_driven_content",
 	CoreContent:         "core_content",
 	CoreContent:         "core_content",
 	LastUpdateAdminID:   "last_update_admin_id",
 	LastUpdateAdminID:   "last_update_admin_id",
 	LastUpdateAdminName: "last_update_admin_name",
 	LastUpdateAdminName: "last_update_admin_name",
-	LastThsMsgTime:      "last_ths_msg_time",
-	LastTemplateMsgTime: "last_template_msg_time",
+	SendThsMsgTime:      "send_ths_msg_time",
+	SendTemplateMsgTime: "send_template_msg_time",
+	ThsMsgState:         "ths_msg_state",
+	TemplateMsgState:    "template_msg_state",
+	PublishState:        "publish_state",
 	CreateTime:          "create_time",
 	CreateTime:          "create_time",
 	ModifyTime:          "modify_time",
 	ModifyTime:          "modify_time",
 }
 }

+ 3 - 3
models/tables/yb_price_driven/model.go

@@ -2,10 +2,10 @@ package yb_price_driven
 
 
 import "hongze/hongze_yb/global"
 import "hongze/hongze_yb/global"
 
 
-// GetPriceDrivenByChartPermissionId 通过品种获取价格驱动
-func GetPriceDrivenByChartPermissionId(chartPermissionId int) (item *YbPriceDriven, err error) {
+// GetPriceDrivenByVarietyTagId 通过标签获取价格驱动
+func GetPriceDrivenByVarietyTagId(varietyTagId int) (item *YbPriceDriven, err error) {
 	err = global.DEFAULT_MYSQL.
 	err = global.DEFAULT_MYSQL.
-		Where("chart_permission_id = ? AND publish_state = 1", chartPermissionId).
+		Where("variety_tag_id = ? AND publish_state = 1", varietyTagId).
 		Order("create_time DESC").
 		Order("create_time DESC").
 		First(&item).Error
 		First(&item).Error
 	return
 	return

+ 35 - 0
models/tables/yb_price_driven_tag/entity.go

@@ -0,0 +1,35 @@
+package yb_price_driven_tag
+
+import "time"
+
+// YbPriceDrivenTag 研报价格驱动标签表
+type YbPriceDrivenTag struct {
+	ID             int       `gorm:"primaryKey;column:id;type:int(10) unsigned;not null" json:"-"`
+	VarietyTagID   int       `gorm:"unique;column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagId"` // 标签ID
+	VarietyTagName string    `gorm:"column:variety_tag_name;type:varchar(100);not null;default:''" json:"varietyTagName"`       // 标签名称
+	State          int       `gorm:"column:state;type:tinyint(4) unsigned;not null;default:1" json:"state"`                     // 状态:0-禁用 1-开启
+	CreateTime     time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`
+	ModifyTime     time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbPriceDrivenTag) TableName() string {
+	return "yb_price_driven_tag"
+}
+
+// YbPriceDrivenTagColumns get sql column name.获取数据库列名
+var YbPriceDrivenTagColumns = struct {
+	ID             string
+	VarietyTagID   string
+	VarietyTagName string
+	State          string
+	CreateTime     string
+	ModifyTime     string
+}{
+	ID:             "id",
+	VarietyTagID:   "variety_tag_id",
+	VarietyTagName: "variety_tag_name",
+	State:          "state",
+	CreateTime:     "create_time",
+	ModifyTime:     "modify_time",
+}

+ 9 - 0
models/tables/yb_price_driven_tag/model.go

@@ -0,0 +1,9 @@
+package yb_price_driven_tag
+
+import "hongze/hongze_yb/global"
+
+// GetPriceDrivenTagList 获取价格驱动标签列表
+func GetPriceDrivenTagList() (list []*YbPriceDrivenTag, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbPriceDrivenTag{}).Scan(&list).Error
+	return
+}

+ 39 - 33
models/tables/yb_price_driven_visit_log/entity.go

@@ -4,17 +4,19 @@ import "time"
 
 
 // YbPriceDrivenVisitLog 研报-价格驱动访问记录表
 // YbPriceDrivenVisitLog 研报-价格驱动访问记录表
 type YbPriceDrivenVisitLog struct {
 type YbPriceDrivenVisitLog struct {
-	ID            int       `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
-	PriceDrivenID int       `gorm:"index:idx_price_driven_id;column:price_driven_id;type:int(10) unsigned;not null" json:"priceDrivenId"` // 价格驱动ID
-	UserID        int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`              // 用户ID
-	Mobile        string    `gorm:"column:mobile;type:varchar(30);not null;default:''" json:"mobile"`                                     // 手机号
-	RealName      string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                               // 真实姓名
-	NickName      string    `gorm:"column:nick_name;type:varchar(100);not null;default:''" json:"nickName"`                               // 昵称
-	CompanyID     int       `gorm:"column:company_id;type:int(10) unsigned;not null;default:0" json:"companyId"`                          // 客户ID
-	CompanyName   string    `gorm:"column:company_name;type:varchar(100);not null;default:''" json:"companyName"`                         // 客户名称
-	CompanyStatus string    `gorm:"column:company_status;type:varchar(30);not null;default:''" json:"companyStatus"`                      // 客户状态
-	SourceAgent   int       `gorm:"column:source_agent;type:tinyint(4) unsigned;not null;default:1" json:"sourceAgent"`                   // 操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
-	CreateTime    time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                         // 创建时间
+	ID             int       `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	PriceDrivenID  int       `gorm:"index:idx_price_driven_id;column:price_driven_id;type:int(10) unsigned;not null" json:"priceDrivenId"`        // 价格驱动ID
+	VarietyTagID   int       `gorm:"index:idx_variety_tag_id;column:variety_tag_id;type:int(10) unsigned;not null;default:0" json:"varietyTagId"` // 标签ID
+	VarietyTagName string    `gorm:"column:variety_tag_name;type:varchar(100);not null;default:''" json:"varietyTagName"`                         // 标签名称
+	UserID         int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`                     // 用户ID
+	Mobile         string    `gorm:"column:mobile;type:varchar(30);not null;default:''" json:"mobile"`                                            // 手机号
+	RealName       string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                                      // 真实姓名
+	NickName       string    `gorm:"column:nick_name;type:varchar(100);not null;default:''" json:"nickName"`                                      // 昵称
+	CompanyID      int       `gorm:"column:company_id;type:int(10) unsigned;not null;default:0" json:"companyId"`                                 // 客户ID
+	CompanyName    string    `gorm:"column:company_name;type:varchar(100);not null;default:''" json:"companyName"`                                // 客户名称
+	CompanyStatus  string    `gorm:"column:company_status;type:varchar(30);not null;default:''" json:"companyStatus"`                             // 客户状态
+	SourceAgent    int       `gorm:"column:source_agent;type:tinyint(4) unsigned;not null;default:1" json:"sourceAgent"`                          // 来源:1-小程序 2-小程序 PC 3-弘则研究公众号 4-Web PC
+	CreateTime     time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                // 创建时间
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名
@@ -24,27 +26,31 @@ func (m *YbPriceDrivenVisitLog) TableName() string {
 
 
 // YbPriceDrivenVisitLogColumns get sql column name.获取数据库列名
 // YbPriceDrivenVisitLogColumns get sql column name.获取数据库列名
 var YbPriceDrivenVisitLogColumns = struct {
 var YbPriceDrivenVisitLogColumns = struct {
-	ID            string
-	PriceDrivenID string
-	UserID        string
-	Mobile        string
-	RealName      string
-	NickName      string
-	CompanyID     string
-	CompanyName   string
-	CompanyStatus string
-	SourceAgent   string
-	CreateTime    string
+	ID             string
+	PriceDrivenID  string
+	VarietyTagID   string
+	VarietyTagName string
+	UserID         string
+	Mobile         string
+	RealName       string
+	NickName       string
+	CompanyID      string
+	CompanyName    string
+	CompanyStatus  string
+	SourceAgent    string
+	CreateTime     string
 }{
 }{
-	ID:            "id",
-	PriceDrivenID: "price_driven_id",
-	UserID:        "user_id",
-	Mobile:        "mobile",
-	RealName:      "real_name",
-	NickName:      "nick_name",
-	CompanyID:     "company_id",
-	CompanyName:   "company_name",
-	CompanyStatus: "company_status",
-	SourceAgent:   "source_agent",
-	CreateTime:    "create_time",
+	ID:             "id",
+	PriceDrivenID:  "price_driven_id",
+	VarietyTagID:   "variety_tag_id",
+	VarietyTagName: "variety_tag_name",
+	UserID:         "user_id",
+	Mobile:         "mobile",
+	RealName:       "real_name",
+	NickName:       "nick_name",
+	CompanyID:      "company_id",
+	CompanyName:    "company_name",
+	CompanyStatus:  "company_status",
+	SourceAgent:    "source_agent",
+	CreateTime:     "create_time",
 }
 }

+ 2 - 2
routers/price_driven.go

@@ -2,14 +2,14 @@ package routers
 
 
 import (
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
-	"hongze/hongze_yb/controller/company"
+	"hongze/hongze_yb/controller"
 	"hongze/hongze_yb/controller/price_driven"
 	"hongze/hongze_yb/controller/price_driven"
 	"hongze/hongze_yb/middleware"
 	"hongze/hongze_yb/middleware"
 )
 )
 
 
 func InitPriceDriven(r *gin.Engine) {
 func InitPriceDriven(r *gin.Engine) {
 	rGroup := r.Group("api/price_driven").Use(middleware.Token(), middleware.CheckBaseAuth())
 	rGroup := r.Group("api/price_driven").Use(middleware.Token(), middleware.CheckBaseAuth())
-	rGroup.GET("/tab", company.GetHomeFiccPermissions)
+	rGroup.GET("/tab", controller.GetVarietyTagTree)
 	rGroup.GET("/detail", price_driven.PriceDrivenDetail)
 	rGroup.GET("/detail", price_driven.PriceDrivenDetail)
 	rGroup.POST("/visit_log", price_driven.PriceDrivenVisitLog)
 	rGroup.POST("/visit_log", price_driven.PriceDrivenVisitLog)
 }
 }

+ 1 - 0
routers/public.go

@@ -25,5 +25,6 @@ func initPublic(r *gin.Engine) {
 		rGroup.POST("/upload", controller.Upload)
 		rGroup.POST("/upload", controller.Upload)
 		rGroup.POST("/get_share_poster", controller.GetSharePoster)
 		rGroup.POST("/get_share_poster", controller.GetSharePoster)
 		rGroup.GET("/get_suncode_scene", controller.GetSuncodeScene)
 		rGroup.GET("/get_suncode_scene", controller.GetSuncodeScene)
+		rGroup.GET("/get_variety_tag_tree", controller.GetVarietyTagTree)
 	}
 	}
 }
 }

+ 87 - 53
services/community/question.go

@@ -26,9 +26,9 @@ import (
 )
 )
 
 
 // GetQuestionList 获取问答列表
 // GetQuestionList 获取问答列表
-func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, groupId int, userInfo user.UserInfo) (resp []*response.CommunityQuestionItem, err error) {
-	condition := make(map[string]interface{})
-	condition["is_deleted ="] = 0
+func GetQuestionList(pageIndex, pageSize, onlyMine, varietyTagId, replyStatus, groupId int, userInfo user.UserInfo) (resp []*response.CommunityQuestionItem, err error) {
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	// 用户身份
 	// 用户身份
 	isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
 	isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
 	if e != nil {
 	if e != nil {
@@ -36,34 +36,45 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 		return
 		return
 	}
 	}
 	if onlyMine == 1 {
 	if onlyMine == 1 {
-		if isResearcher {
-			condition["replier_user_id ="] = userInfo.UserID
+		if isResearcher {  //如果是研究员
+			if replyStatus == 4  {  //分配给研究员未回答的问题
+				condition += " and replier_user_id=? and reply_status = 2"
+				pars = append(pars, userInfo.UserID)
+			} else if replyStatus == 2 { //研究员提问的问题未分配或者未回答的问题
+				condition += " and user_id=? and reply_status >0 and reply_status <3"
+				pars = append(pars, userInfo.UserID)
+			} else if replyStatus == 3 { //分配给研究员的已回答和研究员提问的被回答的问题
+				condition += " and (replier_user_id=? or user_id=?) and reply_status =3"
+				pars = append(pars, userInfo.UserID, userInfo.UserID)
+			}else if replyStatus == 0 {  //分配给研究员或者研究员提问的所以问题
+				condition += " and (replier_user_id=? or user_id=?)"
+				pars = append(pars, userInfo.UserID, userInfo.UserID)
+			}
 		} else {
 		} else {
-			condition["user_id ="] = userInfo.UserID
+			condition += " and user_id=?"
+			pars = append(pars, userInfo.UserID)
+			if replyStatus == 2 {  // 普通用户未回答为待分配和未回答
+				condition += " and reply_status >0 and reply_status <3"
+			} else if replyStatus == 3{
+				condition += " and reply_status = 3"
+			}
 		}
 		}
-	}
-	if replyStatus > 0 {
-		if replyStatus == 2 && !isResearcher {
-			// 普通用户待回答为待分配和待回答
-			condition["reply_status >"] = 0
-			condition["reply_status <"] = 3
-		} else {
-			condition["reply_status ="] = replyStatus
-		}
-	} else {
-		if isResearcher {
-			// 不展示未分配的
-			condition["reply_status >"] = 1
+	}else{
+		if replyStatus == 3 {
+			condition += " and reply_status = 3"
 		}
 		}
 	}
 	}
-	if chartPermissionId > 0 {
-		condition["chart_permission_id ="] = chartPermissionId
+
+	if varietyTagId > 0 {
+		condition += " and variety_tag_id =?"
+		pars = append(pars, varietyTagId)
 	}
 	}
 	if groupId > 0 {
 	if groupId > 0 {
-		condition["research_group_second_id ="] = groupId
+		condition += " and research_group_second_id =?"
+		pars = append(pars, groupId)
 	}
 	}
 	// 问题列表
 	// 问题列表
-	questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
+	questionList, e := yb_community_question.GetPageListByCondition(condition, pars, pageIndex, pageSize)
 	if e != nil {
 	if e != nil {
 		err = errors.New("获取问题列表失败 Err:" + e.Error())
 		err = errors.New("获取问题列表失败 Err:" + e.Error())
 		return
 		return
@@ -117,11 +128,12 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 			ReplierRealName:         v.ReplierRealName,
 			ReplierRealName:         v.ReplierRealName,
 			ReplierRank:             replierRank,
 			ReplierRank:             replierRank,
 			ReplierAvatar:           avatar,
 			ReplierAvatar:           avatar,
-			ChartPermissionID:       v.CommunityQuestionID,
-			ChartPermissionName:     v.ChartPermissionName,
+			VarietyTagId:       v.VarietyTagID,
+			VarietyTagName:     v.VarietyTagName,
 			ResearchGroupSecondId:   v.ResearchGroupSecondID,
 			ResearchGroupSecondId:   v.ResearchGroupSecondID,
 			ResearchGroupSecondName: v.ResearchGroupSecondName,
 			ResearchGroupSecondName: v.ResearchGroupSecondName,
 			IsRead:                  v.IsRead,
 			IsRead:                  v.IsRead,
+			ReplierUserID:           v.ReplierUserID,
 			ReplierIsRead:           v.ReplierIsRead,
 			ReplierIsRead:           v.ReplierIsRead,
 			ReplyStatus:             v.ReplyStatus,
 			ReplyStatus:             v.ReplyStatus,
 			CreateTime:              v.CreateTime.Format(utils.FormatDateTime),
 			CreateTime:              v.CreateTime.Format(utils.FormatDateTime),
@@ -130,7 +142,7 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 			//PermissionInfo:          permissionInfo,
 			//PermissionInfo:          permissionInfo,
 			AudioList: audios,
 			AudioList: audios,
 		}
 		}
-		if !isResearcher && item.IsRead == 0 && item.UserId == userId {
+		if item.IsRead == 0 && item.UserId == userId {
 			item.IsTop = 1
 			item.IsTop = 1
 		}
 		}
 		resp = append(resp, item)
 		resp = append(resp, item)
@@ -183,8 +195,8 @@ func GetQuestionDetail(questionId int, userInfo user.UserInfo) (item *response.C
 		ReplierRealName:         detail.ReplierRealName,
 		ReplierRealName:         detail.ReplierRealName,
 		ReplierRank:             replierRank,
 		ReplierRank:             replierRank,
 		ReplierAvatar:           detail.ReplierAvatar,
 		ReplierAvatar:           detail.ReplierAvatar,
-		ChartPermissionID:       detail.ChartPermissionID,
-		ChartPermissionName:     detail.ChartPermissionName,
+		VarietyTagId:       detail.VarietyTagID,
+		VarietyTagName:     detail.VarietyTagName,
 		ResearchGroupSecondId:   detail.ResearchGroupSecondID,
 		ResearchGroupSecondId:   detail.ResearchGroupSecondID,
 		ResearchGroupSecondName: detail.ResearchGroupSecondName,
 		ResearchGroupSecondName: detail.ResearchGroupSecondName,
 		IsRead:                  detail.IsRead,
 		IsRead:                  detail.IsRead,
@@ -304,8 +316,16 @@ func ReadQuestionReply(questionIds string, userInfo user.UserInfo) (err error) {
 		return
 		return
 	}
 	}
 	if isResearcher {
 	if isResearcher {
+		// 设置分配给研究员的问答已读
 		e = yb_community_question.UpdateReplierRead(int(userInfo.UserID), questionIdArr)
 		e = yb_community_question.UpdateReplierRead(int(userInfo.UserID), questionIdArr)
+		if e != nil {
+			err = errors.New("更新问答已读失败 Err:" + e.Error())
+			return
+		}
+		// 设置研究员提问的问答已读
+		e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
 	} else {
 	} else {
+		// 设置普通用户的问答已读
 		e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
 		e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
 	}
 	}
 	if e != nil {
 	if e != nil {
@@ -321,38 +341,52 @@ func GetQuestionListTotal(userInfo user.UserInfo) (resp *response.CommunityQuest
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		return
 		return
 	}
 	}
-	condition := make(map[string]interface{}, 0)
-	condition["is_deleted ="] = 0
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	if isResearcher {
 	if isResearcher {
-		condition["replier_user_id ="] = userInfo.UserID
+		condition += " and (replier_user_id=? or user_id=?)"
+		pars = append(pars, userInfo.UserID, userInfo.UserID)
 	} else {
 	} else {
-		condition["user_id ="] = userInfo.UserID
+		condition += " and user_id=?"
+		pars = append(pars, userInfo.UserID)
 	}
 	}
-	countList, e := yb_community_question.GetQuestionListCount(condition)
+	countList, e := yb_community_question.GetQuestionListCount(condition, pars)
 	if e != nil {
 	if e != nil {
 		err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
 		err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
 		return
 		return
 	}
 	}
 	resp = new(response.CommunityQuestionListTotal)
 	resp = new(response.CommunityQuestionListTotal)
-	var distribute, wait, replied int
+	var distribute, wait, replied, total int
 	for _, v := range countList {
 	for _, v := range countList {
-		if v.ReplyStatus == 1 {
-			distribute = v.Total
-		}
-		if v.ReplyStatus == 2 {
-			wait = v.Total
-		}
-		if v.ReplyStatus == 3 {
-			replied = v.Total
+		total += v.Total
+		if isResearcher {
+			if v.UserId == userInfo.UserID {
+				if v.ReplyStatus == 1 || v.ReplyStatus == 2 {  //研究员提问的待分配的问题
+					wait += v.Total
+				}
+			}
+			if v.ReplierUserId == userInfo.UserID  && v.ReplyStatus == 2{ //分配给研究员的未回答的问题
+				distribute += v.Total
+			}
+			if v.ReplyStatus == 3 {
+				replied += v.Total
+			}
+		}else{
+			if v.ReplyStatus == 1 || v.ReplyStatus == 2 {  //未分配和未回答的数量
+				wait += v.Total
+			}else if v.ReplyStatus == 3 {  //已回答的数量
+				replied += v.Total
+			}
 		}
 		}
+
 	}
 	}
 	if isResearcher {
 	if isResearcher {
-		resp.Wait = wait
-	} else {
-		resp.Wait = distribute + wait
+		resp.Distribute = distribute
 	}
 	}
+	resp.Wait = wait
 	resp.Replied = replied
 	resp.Replied = replied
-	resp.Total = resp.Wait + resp.Replied
+	resp.Total = total
+
 	return
 	return
 }
 }
 
 
@@ -363,16 +397,16 @@ func GetMyQuestionUnread(userInfo user.UserInfo) (total int, err error) {
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		return
 		return
 	}
 	}
-	condition := make(map[string]interface{}, 0)
-	condition["is_deleted ="] = 0
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	if isResearcher {
 	if isResearcher {
-		condition["replier_user_id ="] = userInfo.UserID
-		condition["replier_is_read ="] = 0
+		condition += " and ((replier_user_id=? and replier_is_read=0) or (user_id=? and is_read=0))"
+		pars = append(pars, userInfo.UserID, userInfo.UserID)
 	} else {
 	} else {
-		condition["user_id ="] = userInfo.UserID
-		condition["is_read ="] = 0
+		condition += " and user_id=? and is_read=0"
+		pars = append(pars, userInfo.UserID)
 	}
 	}
-	num, e := yb_community_question.GetUnreadNum(condition)
+	num, e := yb_community_question.GetUnreadNum(condition, pars)
 	if e != nil {
 	if e != nil {
 		err = errors.New("获取我的未读数失败 Err:" + e.Error())
 		err = errors.New("获取我的未读数失败 Err:" + e.Error())
 		return
 		return

+ 10 - 20
services/community/video.go

@@ -12,14 +12,14 @@ import (
 )
 )
 
 
 // GetVideoList 获取视频列表
 // GetVideoList 获取视频列表
-func GetVideoList(pageIndex, pageSize, videoId, chartPermissionId int, keywords string) (resp []*response.CommunityVideoItem, err error) {
+func GetVideoList(pageIndex, pageSize, videoId, varietyTagId int, keywords string) (resp []*response.CommunityVideoItem, err error) {
 	condition := make(map[string]interface{})
 	condition := make(map[string]interface{})
 	// 分享点进来的直接定位到具体视频
 	// 分享点进来的直接定位到具体视频
 	if videoId > 0 {
 	if videoId > 0 {
 		condition["community_video_id ="] = videoId
 		condition["community_video_id ="] = videoId
 	} else {
 	} else {
-		if chartPermissionId > 0 {
-			condition["chart_permission_id ="] = chartPermissionId
+		if varietyTagId > 0 {
+			condition["variety_tag_id ="] = varietyTagId
 		}
 		}
 		if keywords != "" {
 		if keywords != "" {
 			condition["title like"] = "%" + keywords + "%"
 			condition["title like"] = "%" + keywords + "%"
@@ -38,8 +38,8 @@ func GetVideoList(pageIndex, pageSize, videoId, chartPermissionId int, keywords
 		item := &response.CommunityVideoItem{
 		item := &response.CommunityVideoItem{
 			CommunityVideoID:    v.CommunityVideoID,
 			CommunityVideoID:    v.CommunityVideoID,
 			Title:               v.Title,
 			Title:               v.Title,
-			ChartPermissionID:   v.ChartPermissionID,
-			ChartPermissionName: v.ChartPermissionName,
+			VarietyTagId:        v.VarietyTagId,
+			VarietyTagName:      v.VarietyTagName,
 			CoverImgUrl:         v.CoverImgURL,
 			CoverImgUrl:         v.CoverImgURL,
 			VideoUrl:            v.VideoURL,
 			VideoUrl:            v.VideoURL,
 			VideoSeconds:        v.VideoSeconds,
 			VideoSeconds:        v.VideoSeconds,
@@ -47,6 +47,7 @@ func GetVideoList(pageIndex, pageSize, videoId, chartPermissionId int, keywords
 			PublishTime:         v.PublishTime.Format(utils.FormatDateTime),
 			PublishTime:         v.PublishTime.Format(utils.FormatDateTime),
 			CreateTime:          v.CreateTime.Format(utils.FormatDateTime),
 			CreateTime:          v.CreateTime.Format(utils.FormatDateTime),
 			ModifyTime:          v.ModifyTime.Format(utils.FormatDateTime),
 			ModifyTime:          v.ModifyTime.Format(utils.FormatDateTime),
+			ChartPermissionName: v.VarietyTagName,
 		}
 		}
 		resp = append(resp, item)
 		resp = append(resp, item)
 	}
 	}
@@ -67,22 +68,11 @@ func SaveVideoPlayLog(userInfo user.UserInfo, videoId, sourceAgent int) (errMsg
 		err = errors.New("获取客户信息失败, Err: " + e.Error())
 		err = errors.New("获取客户信息失败, Err: " + e.Error())
 		return
 		return
 	}
 	}
-	var companyName, companyStatus string
-	if companyInfo != nil {
+	companyName := "潜在客户"
+	companyStatus := "潜在"
+	if companyInfo != nil && companyInfo.CompanyID > 0 {
 		companyName = companyInfo.CompanyName
 		companyName = companyInfo.CompanyName
 		companyStatus = companyInfo.Status
 		companyStatus = companyInfo.Status
-	} else {
-		// 是否是权益用户-视作潜在用户
-		equityCompany, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 2)
-		if e != nil && e != utils.ErrNoRow {
-			errMsg = "保存失败"
-			err = errors.New("获取客户权益信息失败, Err: " + e.Error())
-			return
-		}
-		if equityCompany != nil {
-			companyName = equityCompany.CompanyName
-			companyStatus = "潜在"
-		}
 	}
 	}
 	item := &yb_community_video_play_log.YbCommunityVideoPlayLog{
 	item := &yb_community_video_play_log.YbCommunityVideoPlayLog{
 		CommunityVideoID: video.CommunityVideoID,
 		CommunityVideoID: video.CommunityVideoID,
@@ -102,4 +92,4 @@ func SaveVideoPlayLog(userInfo user.UserInfo, videoId, sourceAgent int) (errMsg
 		return
 		return
 	}
 	}
 	return
 	return
-}
+}

+ 30 - 27
services/price_driven/price_driven.go

@@ -11,10 +11,10 @@ import (
 )
 )
 
 
 // GetPriceDrivenDetail 获取价格驱动详情
 // GetPriceDrivenDetail 获取价格驱动详情
-func GetPriceDrivenDetail(chartPermissionId int) (resp *response.PriceDrivenItem, errMsg string, err error) {
+func GetPriceDrivenDetail(varietyTagId int) (resp *response.PriceDrivenItem, errMsg string, err error) {
 	resp = new(response.PriceDrivenItem)
 	resp = new(response.PriceDrivenItem)
 	// 获取详情
 	// 获取详情
-	item, e := yb_price_driven.GetPriceDrivenByChartPermissionId(chartPermissionId)
+	item, e := yb_price_driven.GetPriceDrivenByVarietyTagId(varietyTagId)
 	if e != nil && e != utils.ErrNoRow {
 	if e != nil && e != utils.ErrNoRow {
 		errMsg = "获取失败"
 		errMsg = "获取失败"
 		err = errors.New("获取价格驱动信息失败, Err:" + e.Error())
 		err = errors.New("获取价格驱动信息失败, Err:" + e.Error())
@@ -22,7 +22,7 @@ func GetPriceDrivenDetail(chartPermissionId int) (resp *response.PriceDrivenItem
 	}
 	}
 	if item != nil {
 	if item != nil {
 		resp.PriceDrivenID = item.PriceDrivenID
 		resp.PriceDrivenID = item.PriceDrivenID
-		resp.ChartPermissionID = item.ChartPermissionID
+		resp.VarietyTagID = item.VarietyTagID
 		resp.MainVariable = item.MainVariable
 		resp.MainVariable = item.MainVariable
 		resp.CoreDrivenType = item.CoreDrivenType
 		resp.CoreDrivenType = item.CoreDrivenType
 		resp.CoreDrivenContent = item.CoreDrivenContent
 		resp.CoreDrivenContent = item.CoreDrivenContent
@@ -41,33 +41,36 @@ func SavePriceDrivenVisitLog(priceDrivenId, sourceAgent int, userInfo user.UserI
 		err = errors.New("获取客户信息失败, Err: " + e.Error())
 		err = errors.New("获取客户信息失败, Err: " + e.Error())
 		return
 		return
 	}
 	}
-	var companyName, companyStatus string
-	if companyInfo != nil {
+	companyName := "潜在客户"
+	companyStatus := "潜在"
+	if companyInfo != nil && companyInfo.CompanyID > 0 {
 		companyName = companyInfo.CompanyName
 		companyName = companyInfo.CompanyName
 		companyStatus = companyInfo.Status
 		companyStatus = companyInfo.Status
-	} else {
-		// 是否是权益用户-视作潜在用户
-		equityCompany, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 2)
-		if e != nil && e != utils.ErrNoRow {
-			errMsg = "保存失败"
-			err = errors.New("获取客户权益信息失败, Err: " + e.Error())
-			return
-		}
-		if equityCompany != nil {
-			companyName = equityCompany.CompanyName
-			companyStatus = "潜在"
-		}
+	}
+	item, e := yb_price_driven.GetPriceDrivenById(priceDrivenId)
+	if e != nil && e != utils.ErrNoRow {
+		errMsg = "保存失败"
+		err = errors.New("获取价格驱动信息失败, Err:" + e.Error())
+		return
+	}
+	tagId := 0
+	tagName := ""
+	if item != nil && item.PriceDrivenID > 0 {
+		tagId = item.VarietyTagID
+		tagName = item.VarietyTagName
 	}
 	}
 	logItem := &yb_price_driven_visit_log.YbPriceDrivenVisitLog{
 	logItem := &yb_price_driven_visit_log.YbPriceDrivenVisitLog{
-		PriceDrivenID: priceDrivenId,
-		UserID:        int(userInfo.UserID),
-		Mobile:        userInfo.Mobile,
-		RealName:      userInfo.RealName,
-		NickName:      userInfo.NickName,
-		CompanyID:     int(userInfo.CompanyID),
-		CompanyName:   companyName,
-		CompanyStatus: companyStatus,
-		SourceAgent:   sourceAgent,
+		PriceDrivenID:  priceDrivenId,
+		VarietyTagID:   tagId,
+		VarietyTagName: tagName,
+		UserID:         int(userInfo.UserID),
+		Mobile:         userInfo.Mobile,
+		RealName:       userInfo.RealName,
+		NickName:       userInfo.NickName,
+		CompanyID:      int(userInfo.CompanyID),
+		CompanyName:    companyName,
+		CompanyStatus:  companyStatus,
+		SourceAgent:    sourceAgent,
 	}
 	}
 	if e := logItem.Create(); e != nil {
 	if e := logItem.Create(); e != nil {
 		errMsg = "保存失败"
 		errMsg = "保存失败"
@@ -75,4 +78,4 @@ func SavePriceDrivenVisitLog(priceDrivenId, sourceAgent int, userInfo user.UserI
 		return
 		return
 	}
 	}
 	return
 	return
-}
+}

+ 16 - 0
services/report/report_view_record.go

@@ -1,10 +1,13 @@
 package report
 package report
 
 
 import (
 import (
+	"errors"
 	"fmt"
 	"fmt"
 	companyCache "hongze/hongze_yb/cache/company"
 	companyCache "hongze/hongze_yb/cache/company"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/logic/report"
 	"hongze/hongze_yb/models/tables/rddp/report_view_record"
 	"hongze/hongze_yb/models/tables/rddp/report_view_record"
+	"hongze/hongze_yb/models/tables/user_view_history"
 	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/services/user"
 	"time"
 	"time"
 )
 )
@@ -37,5 +40,18 @@ func AddViewRecord(userInfo user.UserInfo, reportId int, classifyName string, re
 	}
 	}
 	//修改联系人最后一次阅读报告时间
 	//修改联系人最后一次阅读报告时间
 	err = userInfo.WxUser.SetWxUserReportLastViewTime()
 	err = userInfo.WxUser.SetWxUserReportLastViewTime()
+
+	//新增redis阅读记录
+	userViewHistory := &user_view_history.UserViewHistory{
+		Mobile:      userInfo.Mobile,
+		Email:       userInfo.Email,
+		RealName:    userInfo.RealName,
+		CompanyName: companyInfo.CompanyName,
+		CreatedTime: time.Now(),
+	}
+	ret := report.PushViewRecordNewRedisData(userViewHistory, int(userInfo.CompanyID))
+	if !ret {
+		err = errors.New("缓存添加阅读记录失败")
+	}
 	return
 	return
 }
 }

+ 252 - 1
services/share_poster.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
 	"github.com/PuerkitoBio/goquery"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/yb_poster_config"
 	"hongze/hongze_yb/models/tables/yb_poster_resource"
 	"hongze/hongze_yb/models/tables/yb_poster_resource"
 	"hongze/hongze_yb/models/tables/yb_suncode_pars"
 	"hongze/hongze_yb/models/tables/yb_suncode_pars"
 	"hongze/hongze_yb/services/alarm_msg"
 	"hongze/hongze_yb/services/alarm_msg"
@@ -505,4 +506,254 @@ func GetRddpShareImg(title string) (imgUrl string, err error) {
 	}
 	}
 	imgUrl = res.Data
 	imgUrl = res.Data
 	return
 	return
-}
+}
+
+// CreatePosterFromSourceV2 生成分享海报(通过配置获取相关信息)
+func CreatePosterFromSourceV2(codePage, codeScene, source, version, pars string) (imgUrl string, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("CreatePosterFromSource: source=%s, pars:%s, errMsg:%s", source, pars, errMsg))
+			reqSlice := make([]string, 0)
+			reqSlice = append(reqSlice, fmt.Sprint("CodePage:", codePage, "\n"))
+			reqSlice = append(reqSlice, fmt.Sprint("CodeScene:", codeScene, "\n"))
+			reqSlice = append(reqSlice, fmt.Sprint("Source:", source, "\n"))
+			reqSlice = append(reqSlice, fmt.Sprint("Version:", version, "\n"))
+			reqSlice = append(reqSlice, fmt.Sprint("Pars:", pars, "\n"))
+			go alarm_msg.SendAlarmMsg("CreatePosterFromSource生成分享海报失败, Msg:"+errMsg+";Err:"+err.Error()+"\n;Req:\n"+strings.Join(reqSlice, ";"), 3)
+		}
+	}()
+	if codePage == "" || source == "" || pars == "" {
+		errMsg = "参数有误"
+		err = errors.New(errMsg)
+		return
+	}
+	path := fmt.Sprint(codePage, "?", codeScene)
+	// 非列表来源获取历史图片,无则生成
+	if !strings.Contains(source, "list") && source != "price_driven" {
+		poster, tmpErr := yb_poster_resource.GetPosterByCondition(path, "poster", version)
+		if tmpErr != nil && tmpErr != utils.ErrNoRow {
+			err = tmpErr
+			return
+		}
+		if poster != nil && poster.ImgURL != "" {
+			imgUrl = poster.ImgURL
+			return
+		}
+	}
+	ybPosterConfig, err := yb_poster_config.GetBySource(source)
+	if err != nil {
+		return
+	}
+	// 图片长宽
+	//heightMap := map[string]int{
+	//	"activity_detail":       1210,
+	//	"activity_list":         1948,
+	//	"special_column_detail": 1480,
+	//	"special_column_list":   1548,
+	//	"chart_detail":          1536,
+	//	"chart_list":            1352,
+	//	"report_detail":         1420,
+	//	"report_list":           1344,
+	//}
+	//widthMap := map[string]int{
+	//	"activity_detail":       1280,
+	//	"activity_list":         1280,
+	//	"special_column_detail": 1176,
+	//	"special_column_list":   1176,
+	//	"chart_detail":          1176,
+	//	"chart_list":            1176,
+	//	"report_detail":         1176,
+	//	"report_list":           1176,
+	//}
+
+	width := ybPosterConfig.Width
+	height := ybPosterConfig.Hight
+	//生成太阳码
+	sunCodeUrl, err := CreateAndUploadSunCode(codePage, codeScene, version)
+	if err != nil {
+		return
+	}
+	//sunCodeUrl := ``
+	// 填充html内容
+	contentStr, newHeight, err := fillContent2HtmlV2(source, pars, sunCodeUrl, height, *ybPosterConfig)
+	if err != nil {
+		errMsg = "html内容有误"
+		return
+	}
+	global.LOG.Critical(contentStr)
+	//return
+	// 请求python服务htm2img
+	htm2ImgReq := make(map[string]interface{})
+	htm2ImgReq["html_content"] = contentStr
+	htm2ImgReq["width"] = width
+	htm2ImgReq["height"] = newHeight
+	res, err := postHtml2Img(htm2ImgReq)
+	if err != nil || res == nil {
+		errMsg = "html转图片请求失败"
+		return
+	}
+	if res.Code != 200 {
+		errMsg = "html转图片请求失败"
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	imgUrl = res.Data
+	// 记录海报信息
+	newPoster := &yb_poster_resource.YbPosterResource{
+		Path:       path,
+		ImgURL:     imgUrl,
+		Type:       "poster",
+		Version:    version,
+		CreateTime: time.Now(),
+	}
+	err = newPoster.Create()
+	return
+}
+
+// HtmlReplaceConfig html替换配置
+type HtmlReplaceConfig struct {
+	TemplateStr string `json:"template_str"`
+	ReplaceStr  string `json:"replace_str"`
+}
+
+// DefaultValueConfig 默认值的配置
+type DefaultValueConfig struct {
+	Key          string `json:"key"`
+	UseOtherKey  string `json:"use_other_key"`
+	Value        string `json:"value"`
+	ConditionKey string `json:"condition_key"`
+}
+
+// fillContent2Html 填充HTML动态内容
+func fillContent2HtmlV2(source, pars, sunCodeUrl string, height float64, ybPosterConfig yb_poster_config.YbPosterConfig) (contentStr string, newHeight float64, err error) {
+	paramsMap := make(map[string]string)
+	if err = json.Unmarshal([]byte(pars), &paramsMap); err != nil {
+		return
+	}
+
+	//fmt.Println(paramsMap)
+
+	//html替换规则
+	htmlReplaceConfigList := make([]HtmlReplaceConfig, 0)
+	if err = json.Unmarshal([]byte(ybPosterConfig.HTMLReplaceConfig), &htmlReplaceConfigList); err != nil {
+		return
+	}
+
+	newHeight = height
+	contentStr = ybPosterConfig.HTMLTemplate
+
+	// 默认数据替换
+	defaultValueConfigMap := make([]DefaultValueConfig, 0)
+	if ybPosterConfig.DefaultValueConfig != `` {
+		if err = json.Unmarshal([]byte(ybPosterConfig.DefaultValueConfig), &defaultValueConfigMap); err != nil {
+			return
+		}
+	}
+	// 列表的动态内容不完整的用默认内容的填充
+	//var emptyTime1, emptyTime2 bool
+	conditionKeyValMap := make(map[string]string)
+	for _, v := range defaultValueConfigMap {
+		if v.ConditionKey == `` {
+			continue
+		}
+		conditionKeyVal, ok := conditionKeyValMap[v.ConditionKey]
+		if !ok {
+			conditionKeyVal = paramsMap[v.ConditionKey]
+			conditionKeyValMap[v.ConditionKey] = conditionKeyVal
+		}
+		if conditionKeyVal == `` {
+			paramsMap[v.Key] = v.Value
+			if v.UseOtherKey != `` {
+				if tmpVal, ok := paramsMap[v.UseOtherKey]; ok {
+					paramsMap[v.Key] = tmpVal
+				}
+			}
+
+		}
+	}
+
+	// 填充指定内容
+	switch source {
+	case "report_detail": //需要将简介处理下
+		reportAbstract := paramsMap["report_abstract"]
+		doc, tmpErr := goquery.NewDocumentFromReader(strings.NewReader(reportAbstract))
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		abstract := ""
+		doc.Find("p").Each(func(i int, s *goquery.Selection) {
+			phtml, tmpErr := s.Html()
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			st := s.Text()
+			if st != "" && st != "<br>" && st != "<br style=\"max-width: 100%;\">" && !strings.Contains(phtml, "iframe") {
+				abstract = abstract + "<p>" + phtml + "</p>"
+			}
+		})
+		paramsMap["report_abstract"] = abstract
+	case "activity_list":
+		bgColorMap := map[string]string{
+			"未开始": "#E3B377",
+			"进行中": "#3385FF",
+			"已结束": "#A2A2A2",
+		}
+		statusItemMap := map[string]string{
+			"未开始": "block",
+			"进行中": "none",
+			"已结束": "none",
+		}
+		offlineMap := map[string]string{
+			"线上会议": "none",
+			"线下沙龙": "block",
+		}
+		onlineMap := map[string]string{
+			"线上会议": "block",
+			"线下沙龙": "none",
+		}
+
+		listTitle := paramsMap["list_title"]
+		status1 := paramsMap["status_1"]
+		if status1 != "未开始" {
+			newHeight = 1715
+		}
+		status2 := paramsMap["status_2"]
+		paramsMap["list_title"] = "弘则FICC周度电话会安排"
+		paramsMap["bg_color_1"] = bgColorMap[status1]
+		paramsMap["show_item_1"] = statusItemMap[status1]
+		paramsMap["show_offline_1"] = offlineMap[listTitle]
+		paramsMap["show_online_1"] = onlineMap[listTitle]
+
+		paramsMap["bg_color_2"] = bgColorMap[status2]
+		paramsMap["show_item_2"] = statusItemMap[status2]
+		paramsMap["show_offline_2"] = offlineMap[listTitle]
+		paramsMap["show_online_2"] = onlineMap[listTitle]
+
+		// 用默认内容填充的活动时间字体颜色调至看不见
+		color1 := "#999"
+		color2 := "#999"
+
+		if paramsMap["empty_time_1"] == "true" {
+			color1 = "#fff"
+		}
+		if paramsMap["empty_time_2"] == "true" {
+			color2 = "#fff"
+		}
+		paramsMap["time_color_1"] = color1
+		paramsMap["time_color_2"] = color2
+	}
+
+	contentStr = strings.Replace(contentStr, "{{SUN_CODE}}", sunCodeUrl, 1)
+
+	for _, v := range htmlReplaceConfigList {
+		tmpVal, ok := paramsMap[v.ReplaceStr]
+		if !ok {
+			tmpVal = ``
+		}
+		contentStr = strings.Replace(contentStr, v.TemplateStr, tmpVal, 1)
+	}
+	return
+}

+ 2 - 2
services/user/user.go

@@ -7,7 +7,7 @@ import (
 	"github.com/silenceper/wechat/v2/miniprogram/auth"
 	"github.com/silenceper/wechat/v2/miniprogram/auth"
 	admin2 "hongze/hongze_yb/models/tables/admin"
 	admin2 "hongze/hongze_yb/models/tables/admin"
 	"hongze/hongze_yb/models/tables/rddp/session"
 	"hongze/hongze_yb/models/tables/rddp/session"
-	"hongze/hongze_yb/models/tables/research_group_relation"
+	"hongze/hongze_yb/models/tables/research_variety_tag_relation"
 	"hongze/hongze_yb/models/tables/user_record"
 	"hongze/hongze_yb/models/tables/user_record"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/wx_user_log"
 	"hongze/hongze_yb/models/tables/wx_user_log"
@@ -467,7 +467,7 @@ func GetResearcherByUserInfo(userInfo UserInfo) (ok bool, adminInfo *admin2.Admi
 	if adminInfo.Enabled != 1 {
 	if adminInfo.Enabled != 1 {
 		return
 		return
 	}
 	}
-	researchGroupList, e := research_group_relation.GetResearchGroupRelationByAdminId(int(adminInfo.AdminID))
+	researchGroupList, e := research_variety_tag_relation.GetResearchVarietyTagRelationByAdminId(int(adminInfo.AdminID))
 	if e != nil {
 	if e != nil {
 		err = e
 		err = e
 		return
 		return

+ 99 - 0
services/variety_tag.go

@@ -0,0 +1,99 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_yb/models/tables/variety_classify"
+	"hongze/hongze_yb/models/tables/variety_tag"
+	"hongze/hongze_yb/models/tables/yb_price_driven_tag"
+)
+
+// TagTreeItem 标签树
+type TagTreeItem struct {
+	ClassifyId   int    `json:"classify_id" description:"分类ID"`
+	ClassifyName string `json:"classify_name" description:"分类名称"`
+	//TagId        int        `json:"tag_id" description:"分类ID(用于前端组件)"`
+	//TagName      string     `json:"tag_name" description:"分类名称(用于前端组件)"`
+	Sort int        `json:"sort" description:"排序"`
+	Tags []*TagItem `json:"tags" description:"标签"`
+}
+
+// TagItem 标签
+type TagItem struct {
+	TagId             int    `json:"tag_id" description:"标签ID"`
+	TagName           string `json:"tag_name" description:"标签名称"`
+	Sort              int    `json:"sort" description:"排序"`
+	ClassifyId        int    `json:"classify_id" description:"分类ID"`
+	ChartPermissionId int    `json:"chart_permission_id" description:"品种权限ID"`
+	PriceDrivenState  int    `json:"price_driven_state" description:"价格驱动状态:0-关闭 1-开启"`
+	//ResearcherList    []*TagResearcher `json:"researcher_list" description:"研究员列表"`
+}
+
+// TagResearcher 研究员信息
+type TagResearcher struct {
+	AdminId   int    `json:"admin_id"`
+	AdminName string `json:"admin_name"`
+}
+
+// 获取标签树
+func GetTagTree() (respList []*TagTreeItem, err error) {
+	respList = make([]*TagTreeItem, 0)
+	// 获取标签分类
+	classifyList, e := variety_classify.GetVarietyClassifyList()
+	if e != nil {
+		err = errors.New("获取标签分类列表失败, Err: " + e.Error())
+		return
+	}
+	classifyLen := len(classifyList)
+	if classifyLen == 0 {
+		return
+	}
+	// 获取标签列表
+	tagList, e := variety_tag.GetVarietyTagList()
+	if e != nil {
+		err = errors.New("获取标签列表失败, Err: " + e.Error())
+		return
+	}
+	// 价格驱动标签
+	priceTagList, e := yb_price_driven_tag.GetPriceDrivenTagList()
+	if e != nil {
+		err = errors.New("获取价格驱动标签列表失败, Err:" + e.Error())
+		return
+	}
+	priceTagLen := len(priceTagList)
+	priceTagMap := make(map[int]int, 0)
+	for i := 0; i < priceTagLen; i++ {
+		priceTagMap[priceTagList[i].VarietyTagID] = priceTagList[i].State
+	}
+	// 价格驱动状态
+	tagsArr := make([]*TagItem, 0)
+	tagLen := len(tagList)
+	for i := 0; i < tagLen; i++ {
+		item := tagList[i]
+		priceState := priceTagMap[item.VarietyTagID]
+		tagsArr = append(tagsArr, &TagItem{
+			TagId:             item.VarietyTagID,
+			TagName:           item.TagName,
+			Sort:              item.Sort,
+			ClassifyId:        item.VarietyClassifyID,
+			ChartPermissionId: item.ChartPermissionID,
+			PriceDrivenState:  priceState,
+		})
+	}
+	// 分类标签
+	for i := 0; i < classifyLen; i++ {
+		classifyItem := new(TagTreeItem)
+		classifyItem.ClassifyId = classifyList[i].VarietyClassifyID
+		classifyItem.ClassifyName = classifyList[i].ClassifyName
+		//classifyItem.TagId = classifyList[i].VarietyClassifyID
+		//classifyItem.TagName = classifyList[i].ClassifyName
+		classifyItem.Sort = classifyList[i].Sort
+		classifyItem.Tags = make([]*TagItem, 0)
+		for _, t := range tagsArr {
+			if classifyItem.ClassifyId == t.ClassifyId {
+				classifyItem.Tags = append(classifyItem.Tags, t)
+			}
+		}
+		respList = append(respList, classifyItem)
+	}
+	return
+}