Parcourir la source

Merge branch 'master' into temp_fix

hsun il y a 2 ans
Parent
commit
5a4a0b343a
100 fichiers modifiés avec 3795 ajouts et 264 suppressions
  1. 3 1
      controller/chart/chart_info.go
  2. 154 0
      controller/community/comment.go
  3. 49 5
      controller/community/question.go
  4. 72 0
      controller/community/video.go
  5. 2 2
      controller/like/like.go
  6. 1 1
      controller/pc/pc.go
  7. 61 0
      controller/price_driven/price_driven.go
  8. 21 2
      controller/public.go
  9. 25 0
      controller/report/report.go
  10. 174 0
      controller/sandbox/sandbox.go
  11. 25 0
      controller/user/user.go
  12. 409 0
      controller/voice_broadcast/voice_broadcast.go
  13. 1 1
      go.mod
  14. 9 0
      init_serve/router.go
  15. 44 5
      logic/report/research_report.go
  16. 91 0
      logic/sandbox/sandbox.go
  17. 76 17
      logic/user/user.go
  18. 509 0
      logic/yb_community_question/yb_community_question_comment.go
  19. 141 0
      logic/yb_community_question/yb_community_question_like_tease.go
  20. 27 0
      middleware/common.go
  21. 1 1
      middleware/recover.go
  22. 9 9
      models/request/comment/comment.go
  23. 41 7
      models/request/community.go
  24. 11 0
      models/request/price_driven.go
  25. 5 0
      models/request/public.go
  26. 9 0
      models/request/sandbox/sandbox.go
  27. 1 1
      models/request/user/user.go
  28. 48 0
      models/request/voice_broadcast.go
  29. 14 14
      models/response/comment.go
  30. 84 20
      models/response/community.go
  31. 2 2
      models/response/pc/report.go
  32. 21 18
      models/response/permission.go
  33. 13 0
      models/response/price_driven.go
  34. 17 16
      models/response/report.go
  35. 9 0
      models/response/sandbox.go
  36. 40 0
      models/response/voice_broadcast.go
  37. 12 1
      models/tables/admin/query.go
  38. 1 1
      models/tables/chart_classify/query.go
  39. 1 1
      models/tables/chart_info/query.go
  40. 7 6
      models/tables/chart_permission/chart_permission.go
  41. 1 1
      models/tables/chart_permission_first/chart_permission_first.go
  42. 7 7
      models/tables/chart_permission_search_key_word_mapping/chart_permission_search_key_word_mapping.go
  43. 67 0
      models/tables/company_approval_message/company_approval_message.go
  44. 8 0
      models/tables/company_approval_message/create.go
  45. 1 0
      models/tables/company_approval_message/query.go
  46. 17 0
      models/tables/company_approval_message/update.go
  47. 2 3
      models/tables/customer_comment/customer_comment.go
  48. 22 22
      models/tables/my_chart/query.go
  49. 3 3
      models/tables/rddp/banner/banner.go
  50. 23 24
      models/tables/rddp/report/report.go
  51. 11 11
      models/tables/rddp/report_view_record/report_view_record.go
  52. 11 0
      models/tables/report_send_ths_detail/create.go
  53. 16 0
      models/tables/report_send_ths_detail/query.go
  54. 20 0
      models/tables/report_send_ths_detail/report_send_ths_detail.go
  55. 14 0
      models/tables/report_send_ths_detail/update.go
  56. 24 0
      models/tables/research_variety_tag_relation/entity.go
  57. 9 0
      models/tables/research_variety_tag_relation/model.go
  58. 41 0
      models/tables/sandbox/query.go
  59. 58 0
      models/tables/sandbox/sandbox.go
  60. 17 0
      models/tables/sys_role_admin/query.go
  61. 8 0
      models/tables/sys_role_admin/sys_role_admin.go
  62. 35 0
      models/tables/variety_classify/entity.go
  63. 11 0
      models/tables/variety_classify/model.go
  64. 50 0
      models/tables/variety_tag/entity.go
  65. 11 0
      models/tables/variety_tag/model.go
  66. 15 0
      models/tables/voice_broadcast/create.go
  67. 9 0
      models/tables/voice_broadcast/delete.go
  68. 31 0
      models/tables/voice_broadcast/query.go
  69. 24 0
      models/tables/voice_broadcast/voice_broadcast.go
  70. 9 0
      models/tables/voice_broadcast_statistics/create.go
  71. 28 0
      models/tables/voice_broadcast_statistics/voice_broadcast_statistics.go
  72. 24 0
      models/tables/voice_section/query.go
  73. 16 0
      models/tables/voice_section/voice_section.go
  74. 22 1
      models/tables/wx_user/query.go
  75. 2 1
      models/tables/wx_user/wx_user.go
  76. 18 0
      models/tables/yb_comment_anonymous_user/create.go
  77. 15 0
      models/tables/yb_comment_anonymous_user/query.go
  78. 25 0
      models/tables/yb_comment_anonymous_user/yb_comment_anonymous_user.go
  79. 1 0
      models/tables/yb_community_audio_listen_log/entity.go
  80. 31 31
      models/tables/yb_community_question/entity.go
  81. 14 29
      models/tables/yb_community_question/model.go
  82. 8 0
      models/tables/yb_community_question_comment/create.go
  83. 129 0
      models/tables/yb_community_question_comment/query.go
  84. 40 0
      models/tables/yb_community_question_comment/update.go
  85. 71 0
      models/tables/yb_community_question_comment/yb_community_question_comment.go
  86. 8 0
      models/tables/yb_community_question_like_tease/create.go
  87. 72 0
      models/tables/yb_community_question_like_tease/query.go
  88. 9 0
      models/tables/yb_community_question_like_tease/update.go
  89. 43 0
      models/tables/yb_community_question_like_tease/yb_community_question_like_tease.go
  90. 62 0
      models/tables/yb_community_video/entity.go
  91. 41 0
      models/tables/yb_community_video/model.go
  92. 50 0
      models/tables/yb_community_video_play_log/entity.go
  93. 8 0
      models/tables/yb_community_video_play_log/model.go
  94. 45 0
      models/tables/yb_index_tab/entity.go
  95. 21 0
      models/tables/yb_index_tab/model.go
  96. 9 0
      models/tables/yb_poster_config/query.go
  97. 46 0
      models/tables/yb_poster_config/yb_poster_config.go
  98. 67 0
      models/tables/yb_price_driven/entity.go
  99. 20 0
      models/tables/yb_price_driven/model.go
  100. 35 0
      models/tables/yb_price_driven_tag/entity.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

+ 154 - 0
controller/community/comment.go

@@ -0,0 +1,154 @@
+package community
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/logic/yb_community_question"
+	"hongze/hongze_yb/models/request"
+	responseModel "hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/wx_user"
+	"hongze/hongze_yb/models/tables/yb_community_question_comment"
+	"hongze/hongze_yb/services"
+	userService "hongze/hongze_yb/services/user"
+	"strconv"
+)
+
+// Comment 发布留言
+func Comment(c *gin.Context) {
+	var req request.ReqComment
+	if c.ShouldBind(&req) != nil {
+		response.Fail("入参错误", c)
+		return
+	}
+	userInfo := userService.GetInfoByClaims(c)
+
+	var qaAvatarUrl string
+	if userInfo.QaAvatarUrl == "" {
+		avatar, err := yb_community_question_comment.GetUserAvatarRandom()
+		if err != nil {
+			response.FailMsg("发布失败", err.Error(), c)
+			return
+		}
+		qaAvatarUrl = avatar.AvatarUrl
+		err = wx_user.ModifyQaAvatarUrl(qaAvatarUrl, userInfo.UserID)
+		if err != nil {
+			response.FailMsg("发布失败", err.Error(), c)
+			return
+		}
+	} else {
+		qaAvatarUrl = userInfo.QaAvatarUrl
+	}
+
+	req.IsShowName = 0
+	if userInfo.NickName != `` { //非空串时为实名
+		req.IsShowName = 1
+	}
+	ybCommunityQuestionComment, err, errMsg := yb_community_question.Comment(userInfo, req.CommunityQuestionID, req.Content, req.SourceAgent, req.IsShowName,qaAvatarUrl)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+	response.OkData("留言成功", responseModel.RespCommunityQuestionCommentAdd{
+		CommunityQuestionCommentID: ybCommunityQuestionComment.CommunityQuestionCommentID,
+	}, c)
+	return
+}
+
+// DeleteComment 删除留言
+func DeleteComment(c *gin.Context) {
+	var req *request.ReqDel
+	if c.ShouldBind(&req) != nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	userInfo := userService.GetInfoByClaims(c)
+	err, errMsg := yb_community_question.Delete(userInfo, req.CommunityQuestionCommentID)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+	response.Ok("删除留言成功", c)
+	return
+}
+
+// HotList 获取精选留言
+func HotList(c *gin.Context) {
+	communityQuestionIDStr := c.DefaultQuery("community_question_id", "")
+	communityQuestionID, err := strconv.Atoi(communityQuestionIDStr)
+	if err != nil {
+		response.Fail("问答id异常", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+	page := services.GetCurrPageByClaims(c)
+	pageSize := services.GetPageSizeByClaims(c)
+
+	list, hotTotal, myTotal, err, errMsg := yb_community_question.List(userinfo.UserID, communityQuestionID, true, page, pageSize)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", responseModel.RespCommunityQuestionCommentList{
+		List:     list,
+		Paging:   responseModel.GetPaging(page, pageSize, int(hotTotal)),
+		HotTotal: hotTotal,
+		MyTotal:  myTotal,
+	}, c)
+
+	return
+}
+
+// MyList 获取我的留言
+func MyList(c *gin.Context) {
+	communityQuestionIDStr := c.DefaultQuery("community_question_id", "")
+	communityQuestionID, err := strconv.Atoi(communityQuestionIDStr)
+	if err != nil {
+		response.Fail("问答id异常", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+	page := services.GetCurrPageByClaims(c)
+	pageSize := services.GetPageSizeByClaims(c)
+
+	list, hotTotal, myTotal, err, errMsg := yb_community_question.MyList(userinfo.UserID, communityQuestionID, page, pageSize)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", responseModel.RespCommunityQuestionCommentList{
+		List:     list,
+		Paging:   responseModel.GetPaging(page, pageSize, int(myTotal)),
+		HotTotal: hotTotal,
+		MyTotal:  myTotal,
+	}, c)
+	return
+}
+
+// GetNeedCommentAnonymousUserTips 获取是否 弹出让去设置头像 的提示框
+func GetNeedCommentAnonymousUserTips(c *gin.Context) {
+	userinfo := userService.GetInfoByClaims(c)
+
+	// true 不弹框,false弹框
+	if userinfo.NickName != `` {
+		response.OkData("获取成功", true, c)
+		return
+	}
+	ok, err := yb_community_question.GetNeedCommentAnonymousUserTips(userinfo.UserID)
+	if err != nil {
+		response.FailMsg("获取失败", err.Error(), c)
+		return
+	}
+
+	response.OkData("获取成功", ok, c)
+}
+
+// SetCommentAnonymousUserTips 设置不再提示 弹出让去设置头像 的提示框
+func SetCommentAnonymousUserTips(c *gin.Context) {
+	userinfo := userService.GetInfoByClaims(c)
+	err := yb_community_question.SetYbCommentAnonymousUserTips(userinfo.UserID)
+	if err != nil {
+		response.FailMsg("设置失败", err.Error(), c)
+		return
+	}
+	response.Ok("设置成功", c)
+}

+ 49 - 5
controller/community/question.go

@@ -5,11 +5,15 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/logic/yb_community_question"
 	"hongze/hongze_yb/models/request"
 	"hongze/hongze_yb/models/request"
+
 	respond "hongze/hongze_yb/models/response"
 	respond "hongze/hongze_yb/models/response"
+	responseModel "hongze/hongze_yb/models/response"
 	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/services/community"
 	"hongze/hongze_yb/services/community"
 	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/services/user"
+	userService "hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/services/wx_app"
 	"hongze/hongze_yb/services/wx_app"
 	"hongze/hongze_yb/utils"
 	"hongze/hongze_yb/utils"
 	"io/ioutil"
 	"io/ioutil"
@@ -25,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]
@@ -43,11 +47,26 @@ 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 {
+		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
+		return
+	}
+
+	// 点赞/吐槽数据
+	err = yb_community_question.HandleLikeOrTeaseByCommunityQuestionItemList(userinfo.UserID, list)
 	if err != nil {
 	if err != nil {
 		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
 		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
 		return
 		return
 	}
 	}
+
+	// 评论数据
+	err = yb_community_question.HandleCommentByCommunityQuestionItemList(userinfo.UserID, list)
+	if err != nil {
+		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
+		return
+	}
+
 	response.OkData("获取成功", list, c)
 	response.OkData("获取成功", list, c)
 }
 }
 
 
@@ -285,7 +304,7 @@ func QuestionUnread(c *gin.Context) {
 // @Success 200 {int} int "获取成功"
 // @Success 200 {int} int "获取成功"
 // @failure 400 {string} string "获取失败"
 // @failure 400 {string} string "获取失败"
 // @Router /question/research_group [get]
 // @Router /question/research_group [get]
-func ResearchGroupList(c *gin.Context)  {
+func ResearchGroupList(c *gin.Context) {
 	list, err := community.GetResearchGroupTree()
 	list, err := community.GetResearchGroupTree()
 	if err != nil {
 	if err != nil {
 		fmt.Println(err.Error())
 		fmt.Println(err.Error())
@@ -323,4 +342,29 @@ func AddAudioLog(c *gin.Context) {
 		return
 		return
 	}
 	}
 	response.Ok("操作成功", c)
 	response.Ok("操作成功", c)
-}
+}
+
+// SetLikeOrTease 问答点赞/吐槽设置
+func SetLikeOrTease(c *gin.Context) {
+	var req request.ReqCommunityQuestionLikeTease
+	if c.ShouldBind(&req) != nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	communityQuestionLikeTease, likeNum, teaseNum, err, errMsg := yb_community_question.SetLikeOrTease(userinfo.UserID, req.CommunityQuestionId, req.OpType, req.Enable, req.SourceAgent)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+
+	response.OkData("操作成功", responseModel.RespCommunityQuestionLikeTease{
+		LikeTotal:  likeNum,
+		TeaseTotal: teaseNum,
+		OpType:     communityQuestionLikeTease.OpType,
+		Enabled:    communityQuestionLikeTease.Enabled,
+	}, c)
+
+	return
+}

+ 72 - 0
controller/community/video.go

@@ -0,0 +1,72 @@
+package community
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services/community"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+)
+
+// VideoList 视频列表
+// @Tags 视频社区模块
+// @Description 获取视频社区列表
+// @Param page_index			query int false "页码"
+// @Param page_size				query int false "每页数量"
+// @Param keywords				query string false "只看我的"
+// @Param video_id				query int false "视频ID"
+// @Param variety_tag_id		query int false "标签ID"
+// @Success 200 {object}
+// @failure 400 {string} string "获取失败"
+// @Router /video/list [get]
+func VideoList(c *gin.Context) {
+	var req request.VideoListReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PageIndex == 0 {
+		req.PageIndex = 1
+	}
+	if req.PageSize == 0 {
+		req.PageSize = utils.PageSize20
+	}
+	list, err := community.GetVideoList(req.PageIndex, req.PageSize, req.VideoId, req.VarietyTagId, req.Keywords)
+	if err != nil {
+		response.FailMsg("获取失败", "VideoList ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", list, c)
+}
+
+// VideoPlayLog 记录视频播放日志
+// @Tags 视频社区模块
+// @Description 记录视频播放日志
+// @Param video_id		query  int  true  "音频ID"
+// @Param source_agent	query  int  true  "操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /video/play_log [post]
+func VideoPlayLog(c *gin.Context) {
+	var req request.VideoPlayLogReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.VideoId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.SourceAgent == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	errMsg, err := community.SaveVideoPlayLog(userinfo, req.VideoId, req.SourceAgent)
+	if err != nil {
+		response.FailMsg(errMsg, "VideoPlayLog ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}

+ 2 - 2
controller/like/like.go

@@ -9,7 +9,7 @@ import (
 )
 )
 
 
 // SetLike 点赞设置
 // SetLike 点赞设置
-func SetLike(c *gin.Context)  {
+func SetLike(c *gin.Context) {
 	var req like.ReqLike
 	var req like.ReqLike
 	if c.ShouldBind(&req) != nil {
 	if c.ShouldBind(&req) != nil {
 		response.Fail("参数异常", c)
 		response.Fail("参数异常", c)
@@ -22,6 +22,6 @@ func SetLike(c *gin.Context)  {
 		response.Fail(err.Error(), c)
 		response.Fail(err.Error(), c)
 		return
 		return
 	}
 	}
-	response.OkData("操作成功", data, c )
+	response.OkData("操作成功", data, c)
 	return
 	return
 }
 }

+ 1 - 1
controller/pc/pc.go

@@ -318,7 +318,7 @@ func ClassifyDetailBanner(c *gin.Context) {
 		"王艺滢": utils.ALIYUN_YBIMG_HOST + "wyy.png",
 		"王艺滢": utils.ALIYUN_YBIMG_HOST + "wyy.png",
 		"姚昕泽": utils.ALIYUN_YBIMG_HOST + "yxz.png",
 		"姚昕泽": utils.ALIYUN_YBIMG_HOST + "yxz.png",
 		"章左昊": utils.ALIYUN_YBIMG_HOST + "zzh.png",
 		"章左昊": utils.ALIYUN_YBIMG_HOST + "zzh.png",
-		"李晓": utils.ALIYUN_YBIMG_HOST + "lxt.png",
+		"李晓": utils.ALIYUN_YBIMG_HOST + "lxt.png",
 		"弘则FICC无锡调研团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
 		"弘则FICC无锡调研团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
 		"弘则能化组": utils.ALIYUN_YBIMG_HOST + "qmz.png",
 		"弘则能化组": utils.ALIYUN_YBIMG_HOST + "qmz.png",
 		"弘则有色团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
 		"弘则有色团队": utils.ALIYUN_YBIMG_HOST + "qp.png",

+ 61 - 0
controller/price_driven/price_driven.go

@@ -0,0 +1,61 @@
+package price_driven
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services/price_driven"
+	"hongze/hongze_yb/services/user"
+)
+
+// PriceDrivenDetail 价格驱动详情
+// @Tags 价格驱动模块
+// @Description 获取价格驱动详情
+// @Param variety_tag_id  query  int  true  "标签ID"
+// @Success 200 {object} response.PriceDrivenItem
+// @failure 400 {string} string "获取失败"
+// @Router /price_driven/detail [get]
+func PriceDrivenDetail(c *gin.Context) {
+	var req request.PriceDrivenDetailReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.VarietyTagId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	item, errMsg, err := price_driven.GetPriceDrivenDetail(req.VarietyTagId)
+	if err != nil {
+		response.FailMsg(errMsg, "GetPriceDrivenDetail ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", item, c)
+}
+
+// PriceDrivenVisitLog 价格驱动访问记录
+// @Tags 价格驱动模块
+// @Description 价格驱动访问记录
+// @Param price_driven_id	query  int  true  "价格驱动ID"
+// @Param source_agent  	query  int  true  "来源"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /price_driven/visit_log [post]
+func PriceDrivenVisitLog(c *gin.Context) {
+	var req request.PriceDrivenVisitReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PriceDrivenId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userInfo := user.GetInfoByClaims(c)
+	errMsg, err := price_driven.SavePriceDrivenVisitLog(req.PriceDrivenId, req.SourceAgent, userInfo)
+	if err != nil {
+		response.FailMsg(errMsg, "PriceDrivenVisitLog ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}

+ 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)
+}

+ 25 - 0
controller/report/report.go

@@ -3,6 +3,8 @@ package report
 import (
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/services/report"
 	"hongze/hongze_yb/services/report"
 	userService "hongze/hongze_yb/services/user"
 	userService "hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/utils"
 	"hongze/hongze_yb/utils"
@@ -195,4 +197,27 @@ func TickerData(c *gin.Context)  {
 	}
 	}
 	response.OkData("查询成功", chapterDetail, c )
 	response.OkData("查询成功", chapterDetail, c )
 	return
 	return
+}
+
+// RddpShareImg 日度点评分享图(要得急,先这么写吧=_=!)
+func RddpShareImg(c *gin.Context)  {
+	var req request.RddpReportShareImgReq
+	if c.ShouldBind(&req) != nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	defaultImg := "https://hzstatic.hzinsights.com/static/icon/hzyb/rddp-share-bg.png"
+	if req.Title == "" {
+		response.OkData("获取成功", defaultImg, c)
+		return
+	}
+	imgUrl, err := services.GetRddpShareImg(req.Title)
+	if err != nil {
+		response.FailData("获取分享海报失败", "获取分享海报失败, Err: "+err.Error(), c)
+		return
+	}
+	if imgUrl == "" {
+		imgUrl = defaultImg
+	}
+	response.OkData("获取成功", imgUrl, c)
 }
 }

+ 174 - 0
controller/sandbox/sandbox.go

@@ -0,0 +1,174 @@
+package sandbox
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	sandboxLogic "hongze/hongze_yb/logic/sandbox"
+	sandboxReq "hongze/hongze_yb/models/request/sandbox"
+	responseModel "hongze/hongze_yb/models/response"
+	sandboxModel "hongze/hongze_yb/models/tables/sandbox"
+	"hongze/hongze_yb/services"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/user"
+	"strconv"
+	"strings"
+)
+
+// List 获取沙盘逻辑图列表
+// @Tags 沙盘模块
+// @Summary  获取沙盘逻辑图列表
+// @Description 获取沙盘逻辑图列表
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Accept  json
+// @Product json
+// @Param chart_permission query int false "品种权限id"
+// @Param keyword query string false "关键字"
+// @Param is_high_light query bool false "是否高亮显示"
+// @Param curr_page query int false "当前页码"
+// @Param page_size query int false "每页返回数据"
+// @Success 200 {object} sandbox.SandboxListResp
+// @failure 400 {string} string "获取失败"
+// @Router /sandbox/list [get]
+func List(c *gin.Context) {
+	var req sandboxReq.ListReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	// 品种id
+	chartPermissionId := req.ChartPermissionId
+
+	// 关键字
+	keyword := req.Keyword
+	// 是否高亮
+	isHighLight := req.IsHighLight
+
+	page := services.GetCurrPageByClaims(c)
+	pageSize := services.GetPageSizeByClaims(c)
+
+	userInfo := user.GetInfoByClaims(c)
+
+	//权限验证
+	checkOk, companyPermissionIdList, permissionCheckInfo, tempErr := company.CheckUserSandboxPermission(userInfo.CompanyID, int(userInfo.UserID), chartPermissionId)
+	if tempErr != nil {
+		response.FailMsg("沙盘权限验证失败", "沙盘权限验证失败:"+tempErr.Error(), c)
+		c.Abort()
+		return
+	}
+	if !checkOk {
+		response.AuthError(permissionCheckInfo, "暂无权限", c)
+		c.Abort()
+		return
+	}
+
+	//获取指标信息
+	total, list, err, errMsg := sandboxLogic.GetList(chartPermissionId, companyPermissionIdList, keyword, page, pageSize)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+
+	// 如果要高亮,且有输入关键字搜索,那么就返回高亮显示字符串
+	if isHighLight && keyword != `` {
+		for index, v := range list {
+			tmpKeyword := `<span style="color:#E3B377">` + keyword + `</span>`
+			list[index].Name = strings.Replace(v.Name, keyword, tmpKeyword, -1)
+		}
+	}
+
+	resp := responseModel.SandboxListResp{
+		List:   list,
+		Paging: responseModel.GetPaging(page, pageSize, int(total)),
+	}
+	response.OkData("获取成功", resp, c)
+}
+
+// Detail 获取沙盘逻辑图详情
+// @Tags 沙盘模块
+// @Summary  获取沙盘逻辑图详情
+// @Description 获取沙盘逻辑图详情
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Accept  json
+// @Product json
+// @Param sandbox_id query int false "沙盘逻辑id"
+// @Success 200 {object} sandbox.SandboxItem
+// @failure 400 {string} string "获取失败"
+// @Router /sandbox/detail [get]
+func Detail(c *gin.Context) {
+	// 沙盘id
+	sandboxIdStr := c.DefaultQuery("sandbox_id", "0")
+	sandboxId, _ := strconv.Atoi(sandboxIdStr)
+
+	userInfo := user.GetInfoByClaims(c)
+
+	sandboxInfo, err := sandboxModel.GetBySandboxId(uint32(sandboxId))
+	if err != nil {
+		response.FailMsg("获取沙盘失败", "获取沙盘失败:"+err.Error(), c)
+		c.Abort()
+		return
+	}
+	//权限验证
+	checkOk, _, permissionCheckInfo, tempErr := company.CheckUserSandboxPermission(userInfo.CompanyID, int(userInfo.UserID), int(sandboxInfo.ChartPermissionID))
+	if tempErr != nil {
+		response.FailMsg("沙盘权限验证失败", "沙盘权限验证失败:"+tempErr.Error(), c)
+		c.Abort()
+		return
+	}
+	if !checkOk {
+		response.AuthError(permissionCheckInfo, "暂无权限", c)
+		c.Abort()
+		return
+	}
+
+	response.OkData("获取成功", sandboxLogic.SandboxItem{
+		SandboxID:           sandboxInfo.SandboxID,
+		Name:                sandboxInfo.Name,
+		ChartPermissionID:   sandboxInfo.ChartPermissionID,
+		ChartPermissionName: sandboxInfo.ChartPermissionName,
+		CurrVersion:         sandboxInfo.CurrVersion,
+		Code:                sandboxInfo.Code,
+		PicURL:              sandboxInfo.PicURL,
+		OpUserName:          sandboxInfo.OpUserName,
+		ModifyTime:          sandboxInfo.ModifyTime,
+	}, c)
+}
+
+// PermissionCountList 获取各个品种下的沙盘图数量列表
+// @Tags 沙盘模块
+// @Summary  获取各个品种下的沙盘图数量列表
+// @Description 获取各个品种下的沙盘图数量列表
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Accept  json
+// @Product json
+// @Param sandbox_id query int false "沙盘逻辑id"
+// @Success 200 {object} []sandboxModel.PermissionSandboxCount
+// @failure 400 {string} string "获取失败"
+// @Router /sandbox/permission_count [get]
+func PermissionCountList(c *gin.Context) {
+	userInfo := user.GetInfoByClaims(c)
+
+	//权限验证
+	checkOk, companyPermissionIdList, permissionCheckInfo, tempErr := company.CheckUserSandboxPermission(userInfo.CompanyID, int(userInfo.UserID), 0)
+	if tempErr != nil {
+		response.FailMsg("沙盘权限验证失败", "沙盘权限验证失败:"+tempErr.Error(), c)
+		c.Abort()
+		return
+	}
+	if !checkOk {
+		response.AuthError(permissionCheckInfo, "暂无权限", c)
+		c.Abort()
+		return
+	}
+
+	//获取指标信息
+	list, err, errMsg := sandboxLogic.GetPermissionCountList(companyPermissionIdList)
+	if err != nil {
+		response.FailMsg(errMsg, err.Error(), c)
+		return
+	}
+
+	response.OkData("获取成功", list, c)
+}

+ 25 - 0
controller/user/user.go

@@ -292,4 +292,29 @@ func SetUserInfo(c *gin.Context) {
 		return
 		return
 	}
 	}
 	response.Ok("更新成功", c)
 	response.Ok("更新成功", c)
+}
+
+// GetTopTab 获取首页顶部Tab
+// @Tags 用户模块
+// @Summary  获取首页顶部Tab
+// @Description 获取首页顶部Tab
+// @Security ApiKeyAuth
+// @securityDefinitions.basic BasicAuth
+// @Param Authorization	header string true "微信登录后获取到的token"
+// @Accept  json
+// @Product json
+// @Success 200 {object} []string "获取成功"
+// @failure 400 {string} string "获取失败"
+// @Router /user/get_top_tab [get]
+func GetTopTab(c *gin.Context) {
+	userInfo := userService.GetInfoByClaims(c)
+	version := c.Request.Header.Get("version")
+	tabBarList, err := userLogic.GetTopTab(userInfo, version)
+
+	if err != nil {
+		response.Fail("获取失败", c)
+		return
+	}
+
+	response.OkData("获取成功", tabBarList, c)
 }
 }

+ 409 - 0
controller/voice_broadcast/voice_broadcast.go

@@ -0,0 +1,409 @@
+package voice_broadcast
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/request"
+	voiceResp "hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/voice_broadcast"
+	"hongze/hongze_yb/models/tables/voice_section"
+	"hongze/hongze_yb/services"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"io/ioutil"
+	"os"
+	"path"
+	"strconv"
+	"time"
+)
+
+// BroadcastList
+// @Description 语音播报列表
+// @Param page_index			query int false "页码"
+// @Param page_size				query int false "每页数量"
+// @Param broadcast_id			query int false "语音播报id"
+// @Param section_id			query int false "板块id"
+// @Success 200 {object} []voiceResp.BroadcastListResp
+// @failure 400 {string} string "获取失败"
+// @Router /list [Post]
+func BroadcastList(c *gin.Context) {
+	var req request.BroadcastListReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PageIndex == 0 {
+		req.PageIndex = 1
+	}
+	if req.PageSize == 0 {
+		req.PageSize = utils.PageSize20
+	}
+
+	userinfo := user.GetInfoByClaims(c)
+	ok, checkInfo, _, err := company.CheckBaseFiccPermission(userinfo.CompanyID, int(userinfo.UserID))
+	if err != nil {
+		response.FailMsg("用户权限验证失败", "CheckBaseAuth-用户权限验证失败"+err.Error(), c)
+		c.Abort()
+		return
+	}
+	if !ok {
+		response.AuthError(checkInfo, "暂无权限", c)
+		c.Abort()
+		return
+	}
+	list, err := services.GetVoiceBroadcastList(req.PageIndex, req.PageSize, req.SectionId, req.BroadcastId, userinfo)
+	if err != nil {
+
+		response.FailMsg("获取语音播报列表失败,"+err.Error(), "QuestionList ErrMsg:"+err.Error(), c)
+		return
+	}
+
+	isVoiceAdmin, _, err := services.GetVoiceAdminByUserInfo(userinfo)
+	if err != nil && err != utils.ErrNoRow {
+		response.FailMsg("获取语音管理员信息失败", "QuestionList ErrMsg:"+err.Error(), c)
+		return
+	}
+	var resp voiceResp.BroadcastListResp
+	resp.List = list
+	resp.IsVoiceAdmin = isVoiceAdmin
+	response.OkData("获取成功", resp, c)
+}
+
+// AddBroadcast
+// @Description 新建语音播报
+// @Param file  query  string  true  "音频文件"
+// @Success 200 {string} string "发布成功"
+// @failure 400 {string} string "发布失败"
+// @Router /add [post]
+func AddBroadcast(c *gin.Context) {
+	broadcastName := c.PostForm("broadcast_name")
+	nsectionId := c.PostForm("section_id")
+	sectionId, _ := strconv.Atoi(nsectionId)
+	sectionName := c.PostForm("section_name")
+	nvarietyId := c.PostForm("variety_id")
+	varietyId, _ := strconv.Atoi(nvarietyId)
+	varietyName := c.PostForm("variety_name")
+	nauthorId := c.PostForm("author_id")
+	authorId, _ := strconv.Atoi(nauthorId)
+	author := c.PostForm("author")
+	imgUrl := c.PostForm("img_url")
+	file, err := c.FormFile("file")
+	if err != nil {
+		response.FailMsg("获取资源失败", "获取资源失败, Err:"+err.Error(), c)
+		return
+	}
+	if imgUrl == "" {
+		response.Fail("图片不能为空", c)
+		return
+	}
+	// 生成动态分享图
+	createTimeStr := time.Now().Local().Format(utils.FormatDate)
+	pars := services.VoiceBroadcastShareImgPars{
+		BackgroundImg: imgUrl,
+		Title:         sectionName,
+		CreateTime:    createTimeStr,
+	}
+	parsByte, e := json.Marshal(pars)
+	if e != nil {
+		response.Fail("分享图参数有误", c)
+		return
+	}
+	shareImg, e := services.GetDynamicShareImg(services.VoiceBroadcastShareImgSource, string(parsByte))
+	if e != nil {
+		response.Fail("生成分享图失败", c)
+		return
+	}
+
+	ext := path.Ext(file.Filename)
+	if ext != ".mp3" {
+		response.Fail("暂仅支持mp3格式", c)
+		return
+	}
+	dateDir := time.Now().Format("20060102")
+	localDir := global.CONFIG.Serve.StaticDir + "hongze/" + dateDir
+	if err := os.MkdirAll(localDir, 0766); err != nil {
+		response.FailMsg("存储目录创建失败", "QuestionUploadAudio 存储目录创建失败, Err:"+err.Error(), c)
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	filtName := randStr + ext
+	fpath := localDir + "/" + filtName
+	defer func() {
+		_ = os.Remove(fpath)
+	}()
+	// 生成文件至指定目录
+	if err := c.SaveUploadedFile(file, fpath); err != nil {
+		response.FailMsg("文件生成失败", "QuestionUploadAudio 文件生成失败, Err:"+err.Error(), c)
+		return
+	}
+	// 获取音频文件时长
+	fByte, err := ioutil.ReadFile(fpath)
+	if err != nil {
+		response.FailMsg("读取本地文件失败", "QuestionUploadAudio 读取本地文件失败", c)
+		return
+	}
+	if len(fByte) <= 0 {
+		response.FailMsg("文件大小有误", "QuestionUploadAudio 文件大小有误", c)
+		return
+	}
+	seconds, err := services.GetMP3PlayDuration(fByte)
+	if err != nil {
+		response.FailMsg("读取文件时长失败", "QuestionUploadAudio 读取文件时长失败", c)
+		return
+	}
+	// 音频大小MB
+	fi, err := os.Stat(fpath)
+	if err != nil {
+		response.FailMsg("读取文件大小失败", "QuestionUploadAudio 读取文件大小失败", c)
+		return
+	}
+	mb := utils.Bit2MB(fi.Size(), 2)
+	// 上传文件至阿里云
+	ossDir := "yb_wx/voice_broadcast/"
+	resourceUrl, err := services.UploadAliyunToDir(filtName, fpath, ossDir)
+	if err != nil {
+		response.FailMsg("文件上传失败", "QuestionUploadAudio 文件上传失败, Err:"+err.Error(), c)
+		return
+	}
+
+	voiceBroadcast := voice_broadcast.VoiceBroadcast{
+		BroadcastName:    broadcastName,
+		SectionId:        sectionId,
+		SectionName:      sectionName,
+		VarietyId:        varietyId,
+		VarietyName:      varietyName,
+		AuthorId:         authorId,
+		Author:           author,
+		ImgUrl:           shareImg,
+		VoiceUrl:         resourceUrl,
+		VoicePlaySeconds: fmt.Sprint(seconds),
+		VoiceSize:        fmt.Sprint(mb),
+		CreateTime:       time.Now().Format(utils.FormatDateTime),
+	}
+	err = voiceBroadcast.AddVoiceBroadcast()
+	if err != nil {
+		fmt.Println("AddUserViewHistory err", err.Error())
+	}
+	response.OkData("发布成功", voiceBroadcast.BroadcastId, c)
+}
+
+// SectionList
+// @Description 语音播报板块列表
+// @Success 200 {object} []voiceResp.VarietyList
+// @failure 400 {string} string "获取失败"
+// @Router /section/list [get]
+func SectionList(c *gin.Context) {
+	sList, err := voice_section.GetVoiceSection()
+	if err != nil {
+		response.FailMsg("查询语音播报板块失败", "GetVoiceSection, Err:"+err.Error(), c)
+	}
+	vList, err := voice_section.GetVoiceVariety()
+	if err != nil {
+		response.FailMsg("查询语音播报板块失败", "GetVoiceSection, Err:"+err.Error(), c)
+	}
+	var sectionList []voiceResp.SectionList
+	var varietyList []voiceResp.VarietyList
+	var resp []voiceResp.VarietyList
+	//var resp voiceResp.SectionListResp
+	//for _, s := range sList {
+	//	section := voiceResp.SectionList{
+	//		SectionId:   s.SectionId,
+	//		SectionName: s.SectionName,
+	//		Status:      s.Status,
+	//	}
+	//	sectionList = append(sectionList, section)
+	//}
+	var newsList []*voice_section.VoiceSection
+	//var bannedSectionList []*voice_section.VoiceSection
+
+	//查找被禁用的板块ids
+	var bannedIds []int
+	for _, section := range sList {
+		if section.Status == 0 {
+			//bannedSectionList = append(bannedSectionList, section)
+			bannedIds = append(bannedIds, section.SectionId)
+		} else {
+			newsList = append(newsList, section)
+		}
+	}
+
+	//如果有被禁用的板块,去语音列表查找被禁用板块有没有语音
+	var lists []*voice_broadcast.VoiceBroadcast
+	if len(bannedIds) > 0 {
+		lists, err = voice_section.GetVoiceSectionFromBroadcast(bannedIds)
+		if err != nil {
+			response.FailMsg("查询语音播报禁用板块失败", "GetVoiceSectionFromBroadcast, Err:"+err.Error(), c)
+		}
+	}
+
+	//被禁用板块有语音,依然显示该板块
+	if len(lists) > 0 {
+		//清空切片,用新的
+		newsList = newsList[0:0]
+		bannedMap := make(map[int]int)
+		for _, broadcast := range lists {
+			bannedMap[broadcast.SectionId] = broadcast.SectionId
+		}
+		for _, section := range sList {
+			_, ok := bannedMap[section.SectionId]
+			if section.Status != 0 || ok {
+				newsList = append(newsList, section)
+			}
+		}
+	}
+
+	for _, v := range vList {
+		variety := voiceResp.VarietyList{
+			VarietyId:   v.VarietyId,
+			VarietyName: v.VarietyName,
+		}
+		varietyList = append(varietyList, variety)
+	}
+
+	for _, v := range varietyList {
+		for _, s := range newsList {
+			if v.VarietyId == s.VarietyId {
+				section := voiceResp.SectionList{
+					ImgUrl:      s.ImgUrl,
+					SectionId:   s.SectionId,
+					SectionName: s.SectionName,
+					Status:      s.Status,
+				}
+				sectionList = append(sectionList, section)
+			}
+		}
+		if len(sectionList) == 0 {
+			continue
+		}
+		v.Children = sectionList
+		resp = append(resp, v)
+		sectionList = []voiceResp.SectionList{}
+	}
+	response.OkData("上传成功", resp, c)
+}
+
+// DelBroadcast
+// @Description 删除语音播报
+// @Param broadcast_id			query int false "语音播报id"
+// @Success 200 {string} string "删除成功"
+// @failure 400 {string} string "删除失败"
+// @Router /delete [get]
+func DelBroadcast(c *gin.Context) {
+	sbroadcastId := c.DefaultQuery("broadcast_id", "0")
+	broadcastId, err := strconv.Atoi(sbroadcastId)
+	if err != nil {
+		response.FailMsg("转换id失败,请输入正确的id", "strconv.Atoi, Err:"+err.Error(), c)
+	}
+	if broadcastId <= 0 {
+		response.FailMsg("参数错误", "参数有误", c)
+		return
+	}
+	var item voice_broadcast.VoiceBroadcast
+	item.BroadcastId = broadcastId
+	err = item.DelVoiceBroadcast()
+	if err != nil {
+		response.FailMsg("删除语音播报失败", "DelVoiceBroadcast, Err:"+err.Error(), c)
+	}
+	response.Ok("删除成功", c)
+}
+
+// AddStatistics
+// @Description 新增语音播报记录
+// @Param file  query  string  true  "音频文件"
+// @Success 200 {string} string "新增成功"
+// @failure 400 {string} string "新增失败"
+// @Router /statistics/add [post]
+func AddStatistics(c *gin.Context) {
+	var req request.AddBroadcastStatisticsReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+
+	if req.BroadcastId <= 0 {
+		response.Fail("参数有误", c)
+	}
+	userinfo := user.GetInfoByClaims(c)
+
+	go services.AddBroadcastRecord(userinfo, req.Source, req.BroadcastId)
+
+	response.Ok("新增记录成功", c)
+}
+
+// BroadcastDetail 获取语音播报详情
+// @Tags 语音播报模块
+// @Description 获取语音播报详情
+// @Param variety_tag_id  query  int  true  "标签ID"
+// @Success 200 {object} response.PriceDrivenItem
+// @failure 400 {string} string "获取失败"
+// @Router /detail [get]
+func BroadcastDetail(c *gin.Context) {
+	var req request.BroadcastDetailReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.BroadcastId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userInfo := user.GetInfoByClaims(c)
+	item, e := voice_broadcast.GetBroadcastById(req.BroadcastId)
+	if e != nil {
+		response.FailMsg("获取失败", "BroadcastDetail ErrMsg:"+e.Error(), c)
+		return
+	}
+	resp := &voiceResp.Broadcast{
+		BroadcastId:      item.BroadcastId,
+		BroadcastName:    item.BroadcastName,
+		SectionId:        item.SectionId,
+		SectionName:      item.SectionName,
+		VarietyId:        item.VarietyId,
+		VarietyName:      item.VarietyName,
+		AuthorId:         item.AuthorId,
+		Author:           item.Author,
+		ImgUrl:           item.ImgUrl,
+		VoiceUrl:         item.VoiceUrl,
+		VoicePlaySeconds: item.VoicePlaySeconds,
+		VoiceSize:        item.VoiceSize,
+		CreateTime:       item.CreateTime,
+	}
+	// 是否为作者、是否可以推送消息
+	if int(userInfo.UserID) == item.AuthorId {
+		resp.IsAuthor = true
+		if item.MsgState == 0 {
+			resp.CouldSendMsg = true
+		}
+	}
+	response.OkData("获取成功", resp, c)
+}
+
+// MsgSend 语音播报消息推送
+// @Tags 语音播报模块
+// @Description 语音播报消息推送
+// @Param broadcast_id	query  int  true  "语音播报ID"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /msg_send [post]
+func MsgSend(c *gin.Context) {
+	var req request.BroadcastMsgSendReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.BroadcastId <= 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userInfo := user.GetInfoByClaims(c)
+	errMsg, err := services.SendBroadcastMsg(req.BroadcastId, int(userInfo.UserID))
+	if err != nil {
+		response.FailMsg(errMsg, "MsgSend ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}

+ 1 - 1
go.mod

@@ -26,9 +26,9 @@ require (
 	github.com/swaggo/gin-swagger v1.3.3
 	github.com/swaggo/gin-swagger v1.3.3
 	github.com/swaggo/swag v1.7.4
 	github.com/swaggo/swag v1.7.4
 	github.com/tosone/minimp3 v1.0.1
 	github.com/tosone/minimp3 v1.0.1
+	github.com/wenzhenxi/gorsa v0.0.0-20220418014903-15feec0f05a6
 	golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
 	golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
 	golang.org/x/image v0.0.0-20190802002840-cff245a6509b
 	golang.org/x/image v0.0.0-20190802002840-cff245a6509b
-	golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 // indirect
 	golang.org/x/text v0.3.7 // indirect
 	golang.org/x/text v0.3.7 // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 	gorm.io/driver/mysql v1.1.3
 	gorm.io/driver/mysql v1.1.3

+ 9 - 0
init_serve/router.go

@@ -21,6 +21,9 @@ func InitRouter() (r *gin.Engine) {
 	//r.Use(gin.Recovery())
 	//r.Use(gin.Recovery())
 	r.Use(middleware.Recover())
 	r.Use(middleware.Recover())
 
 
+	// 公共的中间件
+	r.Use(middleware.Common())
+
 	//swagger界面访问地址
 	//swagger界面访问地址
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 
 
@@ -62,5 +65,11 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitMessage(r)
 	routers.InitMessage(r)
 	//pc相关路由
 	//pc相关路由
 	routers.InitPc(r)
 	routers.InitPc(r)
+	// 价格驱动相关路由
+	routers.InitPriceDriven(r)
+	//沙盘逻辑推演路由
+	routers.InitSandbox(r)
+	//语音播报
+	routers.InitVoiceBroadcast(r)
 	return
 	return
 }
 }

+ 44 - 5
logic/report/research_report.go

@@ -19,7 +19,8 @@ import (
 )
 )
 
 
 type ResearchReportInfo struct {
 type ResearchReportInfo struct {
-	ResearchReportInfo            *research_report.ResearchReport                     `json:"research_report_info"`
+	//ResearchReportInfo            *research_report.ResearchReport                     `json:"research_report_info"`
+	ResearchReportInfo            *ResearchReportShow                                 `json:"research_report_info"`
 	ResearchReportTypeList        []*company_report_permission.ResearchReportTypeList `json:"research_report_type_list"`
 	ResearchReportTypeList        []*company_report_permission.ResearchReportTypeList `json:"research_report_type_list"`
 	HasMenu                       int                                                 `json:"has_menu"`
 	HasMenu                       int                                                 `json:"has_menu"`
 	ResearchReportTypeContentList []*research_report.ResearchReportTypeContent        `description:"报告详情"`
 	ResearchReportTypeContentList []*research_report.ResearchReportTypeContent        `description:"报告详情"`
@@ -27,6 +28,25 @@ type ResearchReportInfo struct {
 	LikeEnabled                   int8                                                `description:"是否已点赞: 0-未点赞 1-已点赞" json:"like_enabled"`
 	LikeEnabled                   int8                                                `description:"是否已点赞: 0-未点赞 1-已点赞" json:"like_enabled"`
 }
 }
 
 
+type ResearchReportShow struct {
+	ResearchReportID    uint64 `json:"researchReportId"`    // 研究报告id
+	ResearchReportName  string `json:"researchReportName"`  // 研究报告名称
+	ResearchReportTitle string `json:"researchReportTitle"` // 研究报告标题
+	ResearchReportImg   string `json:"researchReportImg"`   // 报告缩略图URL
+	ResearchReportDate  string `json:"researchReportDate"`  // 报告日期
+	Type                string `json:"type"`                // day 晨报  week 周报 twoweek双周报 month 月报
+	Author              string `json:"author"`              // 报告作者
+	ReportVariety       string `json:"reportVariety"`       // 研究报告的品种,双周报和月报有标识
+	IsHasMenu           int8   `json:"isHasMenu"`           // 报告是否含有目录
+	IsSendedMsg         int8   `json:"isSendedMsg"`         // 是否发送过模板消息
+	Periods             int    `json:"periods"`             // 期数
+	Status              string `json:"status"`              // 状态,draft:草稿,
+	Enabled             int8   `json:"enabled"`             // 报告状态
+	CreatedTime         string `json:"createdTime"`         // 创建时间
+	LastUpdatedTime     string `json:"lastUpdatedTime"`     // 最后更新时间
+	Viewers             int    `json:"viewers"`             // H5观看用户数
+}
+
 // GetResearchReportInfo 获取报告详情
 // GetResearchReportInfo 获取报告详情
 func GetResearchReportInfo(researchReportId, userId uint64) (result ResearchReportInfo, hasPermission bool, err error) {
 func GetResearchReportInfo(researchReportId, userId uint64) (result ResearchReportInfo, hasPermission bool, err error) {
 	//获取报告详情
 	//获取报告详情
@@ -126,10 +146,29 @@ func GetResearchReportInfo(researchReportId, userId uint64) (result ResearchRepo
 	go PushViewRecordNewRedisData(userViewHistory, int(wxUserInfo.CompanyID))
 	go PushViewRecordNewRedisData(userViewHistory, int(wxUserInfo.CompanyID))
 
 
 	//查询点赞数
 	//查询点赞数
-	likeNum,likeEnabled, _ := services.GetReportLikeByReportIdOldReportId(wxUserInfo.UserID, 0, 0, int(researchReportId),0)
+	likeNum, likeEnabled, _ := services.GetReportLikeByReportIdOldReportId(wxUserInfo.UserID, 0, 0, int(researchReportId), 0)
+
+	reportInfoShow := &ResearchReportShow{
+		ResearchReportID:    reportInfo.ResearchReportID,
+		ResearchReportName:  reportInfo.ResearchReportName,
+		ResearchReportTitle: reportInfo.ResearchReportTitle,
+		ResearchReportImg:   reportInfo.ResearchReportImg,
+		ResearchReportDate:  reportInfo.ResearchReportDate.Format(utils.FormatDate),
+		Type:                reportInfo.Type,
+		Author:              reportInfo.Author,
+		ReportVariety:       reportInfo.ReportVariety,
+		IsHasMenu:           reportInfo.IsHasMenu,
+		IsSendedMsg:         reportInfo.IsSendedMsg,
+		Periods:             reportInfo.Periods,
+		Status:              reportInfo.Status,
+		Enabled:             reportInfo.Enabled,
+		CreatedTime:         reportInfo.CreatedTime.Format(utils.FormatDateTime),
+		LastUpdatedTime:     reportInfo.LastUpdatedTime.Format(utils.FormatDateTime),
+		Viewers:             reportInfo.Viewers,
+	}
 
 
 	result = ResearchReportInfo{
 	result = ResearchReportInfo{
-		ResearchReportInfo:     reportInfo,
+		ResearchReportInfo:     reportInfoShow,
 		ResearchReportTypeList: researchReportTypeList,
 		ResearchReportTypeList: researchReportTypeList,
 		HasMenu:                1,
 		HasMenu:                1,
 		LikeNum:                likeNum,
 		LikeNum:                likeNum,
@@ -137,7 +176,7 @@ func GetResearchReportInfo(researchReportId, userId uint64) (result ResearchRepo
 	}
 	}
 
 
 	if len(researchReportTypeList) <= 0 {
 	if len(researchReportTypeList) <= 0 {
-		
+
 	} else if len(researchReportTypeList) == 1 {
 	} else if len(researchReportTypeList) == 1 {
 		//只有一个章节,即没有目录的时候,需要直接返回章节详情
 		//只有一个章节,即没有目录的时候,需要直接返回章节详情
 		result.HasMenu = 0
 		result.HasMenu = 0
@@ -258,7 +297,7 @@ func GetResearchReportTypeContentInfo(researchReportTypeId, userId uint64) (resu
 	go PushViewRecordNewRedisData(userViewHistory, int(wxUserInfo.CompanyID))
 	go PushViewRecordNewRedisData(userViewHistory, int(wxUserInfo.CompanyID))
 
 
 	//查询点赞数
 	//查询点赞数
-	likeNum,likeEnabled, _ := services.GetReportLikeByReportIdOldReportId(wxUserInfo.UserID, 0, 0, int(researchReportTypeInfo.ResearchReportID), int(researchReportTypeInfo.ResearchReportTypeID))
+	likeNum, likeEnabled, _ := services.GetReportLikeByReportIdOldReportId(wxUserInfo.UserID, 0, 0, int(researchReportTypeInfo.ResearchReportID), int(researchReportTypeInfo.ResearchReportTypeID))
 	result = ResearchReportTypeContentInfo{
 	result = ResearchReportTypeContentInfo{
 		ResearchReportTypeContentList: researchReportTypeContentList,
 		ResearchReportTypeContentList: researchReportTypeContentList,
 		ResearchReportTypeInfo:        researchReportTypeInfo,
 		ResearchReportTypeInfo:        researchReportTypeInfo,

+ 91 - 0
logic/sandbox/sandbox.go

@@ -0,0 +1,91 @@
+package sandbox
+
+import (
+	sandboxModel "hongze/hongze_yb/models/tables/sandbox"
+	"time"
+)
+
+// SandboxItem 沙盘图
+type SandboxItem struct {
+	SandboxID           uint32    `gorm:"primaryKey;column:sandbox_id;type:int(9) unsigned;not null" json:"sandbox_id"`                                                   // 沙盘id
+	Name                string    `gorm:"index:idx_name;column:name;type:varchar(64);not null;default:''" json:"name"`                                                    // 沙盘名称
+	ChartPermissionID   uint32    `gorm:"column:chart_permission_id;type:int(9) unsigned;not null;default:0" json:"chart_permission_id"`                                  // 品种id
+	ChartPermissionName string    `gorm:"index:idx_chart_permission_name;column:chart_permission_name;type:varchar(32);not null;default:''" json:"chart_permission_name"` // 品种名称(冗余字段,避免列表页查询时再去关联表查询)
+	CurrVersion         uint32    `gorm:"column:curr_version;type:int(9) unsigned;not null;default:0" json:"curr_version"`                                                // 当前版本
+	Code                string    `gorm:"column:code;type:varchar(255);not null" json:"code"`                                                                             // 沙盘code
+	PicURL              string    `gorm:"column:pic_url;type:varchar(255);not null;default:''" json:"pic_url"`                                                            // 沙盘图片
+	OpUserName          string    `gorm:"index:idx_op_user_name;column:op_user_name;type:varchar(32);not null;default:''" json:"op_user_name"`                            // 最近一次编辑的用户名称(冗余字段,避免查表)
+	ModifyTime          time.Time `gorm:"column:modify_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"modify_time"`                                                 // 最近一次更新时间
+}
+
+// GetList 获取沙盘列表数据
+func GetList(chartPermissionId int, companyPermissionIdList []int, keyword string, page, pageSize int) (total int64, list []SandboxItem, err error, errMsg string) {
+	errMsg = `获取失败`
+	var condition string
+	var pars []interface{}
+
+	condition = ` is_delete = ? `
+	pars = append(pars, 0)
+
+	// 客户拥有的品种权限
+	if len(companyPermissionIdList) > 0 {
+		condition += " AND chart_permission_id in (?) "
+		pars = append(pars, companyPermissionIdList)
+	}
+
+	if chartPermissionId > 0 {
+		condition += " AND chart_permission_id=? "
+		pars = append(pars, chartPermissionId)
+	}
+
+	if keyword != "" {
+		//condition += ` AND  ( name LIKE '%` + keyword + `%'  OR  chart_permission_name LIKE '%` + keyword + `%' )`
+		condition += ` AND  ( name LIKE '%` + keyword + `%' )`
+	}
+
+	//获取指标信息
+	tmpTotal, tmpList, tmpErr := sandboxModel.GetPageListByWhere(condition, pars, (page-1)*pageSize, pageSize)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+
+	total = tmpTotal
+
+	for _, v := range tmpList {
+		tmpSandBox := SandboxItem{
+			SandboxID:           v.SandboxID,
+			Name:                v.Name,
+			ChartPermissionID:   v.ChartPermissionID,
+			ChartPermissionName: v.ChartPermissionName,
+			CurrVersion:         v.CurrVersion,
+			Code:                v.Code,
+			PicURL:              v.PicURL,
+			OpUserName:          v.OpUserName,
+			ModifyTime:          v.ModifyTime,
+			//CreateTime:          time.Time{},
+		}
+		list = append(list, tmpSandBox)
+	}
+	return
+}
+
+// GetPermissionCountList 获取沙盘列表数据
+func GetPermissionCountList(companyPermissionIdList []int) (list []*sandboxModel.PermissionSandboxCount, err error, errMsg string) {
+	errMsg = `获取失败`
+	var condition string
+	var pars []interface{}
+
+	condition = ` is_delete = ? `
+	pars = append(pars, 0)
+
+	// 客户拥有的品种权限
+	if len(companyPermissionIdList) > 0 {
+		condition += " AND chart_permission_id in (?) "
+		pars = append(pars, companyPermissionIdList)
+	}
+
+	//获取指标信息
+	list, err = sandboxModel.GetPermissionCountListByWhere(condition, pars)
+	return
+}

+ 76 - 17
logic/user/user.go

@@ -8,9 +8,10 @@ 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_message"
 	"hongze/hongze_yb/models/tables/yb_message"
 	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/services"
 	companyService "hongze/hongze_yb/services/company"
 	companyService "hongze/hongze_yb/services/company"
@@ -225,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("用户身份信息有误")
@@ -399,24 +400,34 @@ func Apply(userId int, companyId int64, mobile, email string, applyInfo userReq.
 
 
 // GetUserTabBar 获取用户小程序TabBar
 // GetUserTabBar 获取用户小程序TabBar
 func GetUserTabBar(userInfo user.UserInfo, version string) (list []string, err error) {
 func GetUserTabBar(userInfo user.UserInfo, version string) (list []string, err error) {
-	// user-我的; activity-活动; chart-图表; report-研报; buy-已购; question-问答;
-	list = []string{"activity", "user", "chart"}
-	if version == "yb3.0" {
-		list = []string{"activity", "user", "chart", "report"}
+	where := make(map[string]interface{})
+	where["version"] = version
+	where["position"] = 2
+	where["is_show"] = 1
+	tabs, e := yb_index_tab.GetListByCondition(where)
+	if e != nil {
+		err = errors.New("获取TabBar失败, Err: " + e.Error())
+		return
 	}
 	}
-	if version == "yb5.0" {
-		list = []string{"activity", "question", "chart", "report"}
+	if len(tabs) == 0 {
+		return
 	}
 	}
-	companyProduct, tmpErr := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
-	if tmpErr != nil {
-		if tmpErr == utils.ErrNoRow {
-			err = nil
-		}
+	authOk := false
+	companyProduct, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
+	if e != nil && e != utils.ErrNoRow {
+		err = errors.New("获取客户信息失败, Err: " + e.Error())
 		return
 		return
 	}
 	}
-	// 已购仅付费用户可见
-	if strings.Contains("永续,正式", companyProduct.Status) {
-		list = append(list, "buy")
+	if companyProduct != nil && companyProduct.Status != "" {
+		if strings.Contains("永续,正式", companyProduct.Status) {
+			authOk = true
+		}
+	}
+	for _, v := range tabs {
+		if v.AuthCheck == 1 && !authOk {
+			continue
+		}
+		list = append(list, v.Mark)
 	}
 	}
 	return
 	return
 }
 }
@@ -480,8 +491,56 @@ func PcSendEmailCode(email string) (err error, errMsg string) {
 		}
 		}
 		err = item.Create()
 		err = item.Create()
 	} else {
 	} else {
-		err = errors.New("发送失败,Err:" + err.Error())
+		err = errors.New("发送失败")
 	}
 	}
 
 
 	return
 	return
 }
 }
+
+// TopTab
+type TopTab struct {
+	Tab  string `json:"tab" description:"选项卡名称"`
+	Mark string `json:"mark" description:"选项卡标识"`
+	Icon string `json:"icon" description:"icon图标"`
+	Sort int    `json:"sort" description:"排序"`
+}
+
+// GetTopTab 获取小程序首页顶部选项卡
+func GetTopTab(userInfo user.UserInfo, version string) (list []*TopTab, err error) {
+	where := make(map[string]interface{})
+	where["version"] = version
+	where["position"] = 1
+	where["is_show"] = 1
+	tabs, e := yb_index_tab.GetListByCondition(where)
+	if e != nil {
+		err = errors.New("获取TabBar失败, Err: " + e.Error())
+		return
+	}
+	if len(tabs) == 0 {
+		return
+	}
+	authOk := false
+	companyProduct, e := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
+	if e != nil && e != utils.ErrNoRow {
+		err = errors.New("获取客户信息失败, Err: " + e.Error())
+		return
+	}
+	if companyProduct != nil && companyProduct.Status != "" {
+		if strings.Contains("永续,正式", companyProduct.Status) {
+			authOk = true
+		}
+	}
+	list = make([]*TopTab, 0)
+	for _, v := range tabs {
+		if v.AuthCheck == 1 && !authOk {
+			continue
+		}
+		list = append(list, &TopTab{
+			Tab: v.Tab,
+			Mark: v.Mark,
+			Icon: v.DefaultIcon,
+			Sort: v.Sort,
+		})
+	}
+	return
+}

+ 509 - 0
logic/yb_community_question/yb_community_question_comment.go

@@ -0,0 +1,509 @@
+package yb_community_question
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/admin"
+	"hongze/hongze_yb/models/tables/company"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/models/tables/wx_user"
+	"hongze/hongze_yb/models/tables/yb_comment_anonymous_user"
+	"hongze/hongze_yb/models/tables/yb_community_question"
+	"hongze/hongze_yb/models/tables/yb_community_question_comment"
+	"hongze/hongze_yb/services/alarm_msg"
+	"hongze/hongze_yb/services/company_approval_message"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/services/wechat"
+	"hongze/hongze_yb/services/wx_app"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"time"
+)
+
+// Comment 发布留言
+func Comment(user user.UserInfo, communityQuestionID uint32, content string, sourceAgent, isShowName int8, qaAvatarUrl string) (ybCommunityQuestionComment *yb_community_question_comment.YbCommunityQuestionComment, err error, errMsg string) {
+	errMsg = "发布留言失败"
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("yb_community_question Comment: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	//校验请求入参
+	if isShowName != 0 && isShowName != 1 {
+		errMsg = "匿名设置出错"
+		err = errors.New(errMsg)
+		return
+	}
+	if content == "" {
+		errMsg = "请输入留言内容"
+		err = errors.New(errMsg)
+		return
+	}
+	if sourceAgent == 0 {
+		errMsg = "请输入留言来源"
+		err = errors.New(errMsg)
+		return
+	}
+	if communityQuestionID <= 0 {
+		errMsg = "请输入问答ID"
+		err = errors.New(errMsg)
+		return
+	}
+	// 敏感词过滤
+	if user.RecordInfo.OpenID != "" && user.RecordInfo.CreatePlatform == 6 { //只有小程序的用户才能走敏感词过滤接口
+		checkResult, tErr := wx_app.MsgSecCheck(user.RecordInfo.OpenID, content)
+		/*if tErr != nil {
+			errMsg = "敏感词过滤失败" + tErr.Error()
+			err = errors.New("敏感词过滤失败")
+			return
+		}*/
+		if tErr == nil {
+			if checkResult.Result != nil {
+				if checkResult.Result.Suggest != "pass" {
+					errMsg = "含有违禁词,不允许发布:" + checkResult.Result.Suggest + ".命中标签:" + strconv.Itoa(checkResult.Result.Label)
+					err = errors.New("含有违禁词,不允许发布。")
+					return
+				}
+			}
+		}
+	}
+
+	userName := "匿名用户" + strconv.Itoa(int(3333+user.UserID))
+	if user.RealName != `` {
+		userName = user.RealName
+	}
+	//新增留言
+	now := time.Now()
+	ybCommunityQuestionComment = &yb_community_question_comment.YbCommunityQuestionComment{
+		//CommunityQuestionCommentID: 0,
+		CommunityQuestionID: communityQuestionID,
+		UserID:              user.UserID,
+		RealName:            userName,
+		Content:             content,
+		//ReplyCommentID:             0,
+		//IsTop:                      0,
+		//IsHot:                      0,
+		//HotTopTime:                 time.Time{},
+		Type:        1,
+		Enabled:     1,
+		IsShowName:  isShowName,
+		SourceAgent: sourceAgent,
+		//TopTime:                    time.Time{},
+		//HotTime:                    time.Time{},
+		ModifyTime:  now,
+		CreateTime:  now,
+		QaAvatarUrl: qaAvatarUrl,
+	}
+	err = ybCommunityQuestionComment.Create()
+	if err != nil {
+		errMsg = "新增留言失败"
+		return
+	}
+
+	// 用户评论完后发送消息给管理员
+	go messageToAdmin(user, ybCommunityQuestionComment)
+	return
+}
+
+// Delete 删除留言
+func Delete(user user.UserInfo, communityQuestionCommentID uint64) (err error, errMsg string) {
+	errMsg = `删除留言失败`
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("comment Delete: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	if communityQuestionCommentID <= 0 {
+		errMsg = `请输入留言ID`
+		err = errors.New(errMsg)
+		return
+	}
+	//校验请求入参
+	communityQuestionCommentInfo, err := yb_community_question_comment.GetByCommunityQuestionCommentId(communityQuestionCommentID)
+	if err != nil {
+		errMsg = `查询留言出错`
+		return
+	}
+	if communityQuestionCommentInfo.CommunityQuestionCommentID <= 0 {
+		errMsg = `留言不存在`
+		err = errors.New(errMsg)
+		return
+	}
+	if communityQuestionCommentInfo.UserID != user.UserID {
+		errMsg = `不允许删除他人的留言`
+		err = errors.New(errMsg)
+		return
+	}
+	if communityQuestionCommentInfo.Type != 1 {
+		errMsg = `不允许删除回复`
+		err = errors.New(errMsg)
+		return
+	}
+	if communityQuestionCommentInfo.Enabled == 0 {
+		return
+	}
+	err = yb_community_question_comment.Delete(user.UserID, communityQuestionCommentInfo.CommunityQuestionCommentID)
+	if err != nil {
+		errMsg = `删除留言出错`
+		return
+	}
+
+	go afterDelete(communityQuestionCommentInfo)
+	return
+}
+
+// MyList 我的留言列表
+func MyList(userId uint64, communityQuestionID int, page, pageSize int) (list []*response.RespCommunityQuestionCommentItem, hotTotal, myTotal int64, err error, errMsg string) {
+	list, hotTotal, myTotal, err, errMsg = List(userId, communityQuestionID, false, page, pageSize)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// List 查询精选留言列表或我的留言列表
+func List(userId uint64, communityQuestionID int, hotFlag bool, page, pageSize int) (list []*response.RespCommunityQuestionCommentItem, hotTotal, myTotal int64, err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("comment List: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
+		}
+	}()
+	list = make([]*response.RespCommunityQuestionCommentItem, 0)
+
+	if communityQuestionID <= 0 {
+		err = errors.New("请输入问答ID")
+		return
+	}
+
+	//精选留言数
+	hotTotal, err = yb_community_question_comment.GetHotListTotalByCommunityQuestionID(communityQuestionID)
+	if err != nil {
+		errMsg = `查询精选留言总数出错`
+		return
+	}
+
+	// 我的留言数
+	myTotal, err = yb_community_question_comment.GetListTotalByUserIdCommunityQuestionID(userId, communityQuestionID)
+	if err != nil {
+		errMsg = `查询我的留言总数出错`
+		return
+	}
+
+	var commentList []*yb_community_question_comment.YbCommunityQuestionComment
+	//查询精选留言
+	if hotFlag {
+		commentList, err = yb_community_question_comment.GetHotListByCommunityQuestionID(communityQuestionID, (page-1)*pageSize, pageSize)
+		if err != nil {
+			errMsg = `查询精选留言列表出错`
+			return
+		}
+
+	} else {
+		//查询个人留言
+		commentList, err = yb_community_question_comment.GetListByUserIdCommunityQuestionID(userId, communityQuestionID)
+		if err != nil {
+			errMsg = `查询我的留言列表出错`
+			return
+		}
+	}
+
+	var commentIds []uint64
+	var userIds []uint64
+	for _, v := range commentList {
+		commentIds = append(commentIds, v.CommunityQuestionCommentID)
+		userIds = append(userIds, v.UserID)
+	}
+
+	// 查询所有的回复列表
+	//{
+	//	replyListMap := make(map[uint64][]*response.ReplyItem)
+	//	if len(commentIds) > 0 {
+	//		replyList, tErr := yb_community_question_comment.GetReplyListByReplyCommentId(commentIds)
+	//		if tErr != nil {
+	//			errMsg = tErr.Error()
+	//			err = errors.New("查询回复出错")
+	//			return
+	//		}
+	//		for _, v := range replyList {
+	//			t := new(response.ReplyItem)
+	//			t.CommentId = v.CommunityQuestionCommentID
+	//			t.Content = v.Content
+	//			t.AdminId = v.AdminID
+	//			t.CreateTime = v.CreateTime
+	//			t.ReplyCommentId = v.ReplyCommentId
+	//			t.AdminName = "弘则研究"
+	//			t.AdminImgUrl = utils.DEFAULT_HONGZE_SYS_LOGO
+	//			replyListMap[v.ReplyCommentId] = append(replyListMap[v.ReplyCommentId], t)
+	//		}
+	//	}
+	//}
+
+	// 查询精选留言相关的用户
+	var userOthers []*wx_user.WxUser
+	if len(userIds) > 0 {
+		userOthers, err = wx_user.GetByUserIds(userIds)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询精选留言用户出错")
+			return
+		}
+	}
+	usersMap := make(map[uint64]*wx_user.WxUser)
+	for _, v := range userOthers {
+		usersMap[v.UserID] = v
+	}
+	for _, v := range commentList {
+		tmp := &response.RespCommunityQuestionCommentItem{
+			CommunityQuestionCommentID: v.CommunityQuestionCommentID,
+			UserId:                     v.UserID,
+			Content:                    v.Content,
+			IsTop:                      v.IsTop,
+			IsHot:                      v.IsHot,
+			HotTopTime:                 v.HotTopTime,
+			IsShowName:                 v.IsShowName,
+			UserName:                   "匿名用户" + strconv.Itoa(int(3333+v.UserID)),
+			UserImgUrl:                 utils.DEFAULT_HONGZE_USER_LOGO,
+			CreateTime:                 v.CreateTime,
+			ReplyList:                  nil,
+			QaAvatarUrl:                v.QaAvatarUrl,
+		}
+		if info, ok := usersMap[v.UserID]; ok && v.IsShowName == 1 {
+			tmp.UserName = info.NickName
+			tmp.UserImgUrl = info.Headimgurl
+		}
+		//if existList, ok := replyListMap[v.CommentId]; ok {
+		//	tmp.ReplyList = existList
+		//}
+		list = append(list, tmp)
+	}
+	return
+}
+
+// GetNeedCommentAnonymousUserTips 获取是否 弹出让去设置头像 的提示框
+func GetNeedCommentAnonymousUserTips(userId uint64) (ok bool, err error) {
+	ybCommentAnonymousUser, err := yb_comment_anonymous_user.GetByUserId(userId)
+	if err != nil {
+		return
+	}
+	//如果能找到,那么认为是有设置过匿名评论,那么不需要需要弹框提示
+	if ybCommentAnonymousUser.UserID > 0 {
+		ok = true
+	}
+	return
+}
+
+// SetYbCommentAnonymousUserTips 设置不再提示 弹出让去设置头像 的提示框
+func SetYbCommentAnonymousUserTips(userId uint64) (err error) {
+	ybCommentAnonymousUser, err := yb_comment_anonymous_user.GetByUserId(userId)
+	if err != nil {
+		return
+	}
+	//如果找不到,那么认为是第一次评论,那么需要弹框提示
+	if ybCommentAnonymousUser.UserID <= 0 {
+		//ybCommentAnonymousUser = &yb_comment_anonymous_user.YbCommentAnonymousUser{
+		//	UserID:     userId,
+		//	CreateTime: time.Now(),
+		//}
+		//err = ybCommentAnonymousUser.Create()
+		err = yb_comment_anonymous_user.CreateBySql(userId, time.Now())
+	}
+	return
+}
+
+// HandleCommentByCommunityQuestionItemList 问答 评论 数据
+func HandleCommentByCommunityQuestionItemList(userId uint64, questionList []*response.CommunityQuestionItem) (err error) {
+	listLen := len(questionList)
+	if listLen == 0 {
+		return
+	}
+	idArr := make([]uint32, 0)
+	idMap := make(map[uint32]int)
+
+	userIds := []uint64{userId} //所有的评论人
+
+	for i := 0; i < listLen; i++ {
+		idArr = append(idArr, uint32(questionList[i].CommunityQuestionID))
+		idMap[uint32(questionList[i].CommunityQuestionID)] = 1
+	}
+
+	//精选评论数据、我的评论数据
+	ybCommunityQuestionCommentMap := make(map[uint32]*yb_community_question_comment.YbCommunityQuestionComment)
+
+	//获取精选评论数据
+	hotList, err := yb_community_question_comment.GetLastHotListByCommunityQuestionIds(idArr)
+	if err != nil {
+		return
+	}
+	for _, v := range hotList {
+		ybCommunityQuestionCommentMap[v.CommunityQuestionID] = v
+		delete(idMap, v.CommunityQuestionID)
+
+		//评论人id
+		userIds = append(userIds, v.UserID)
+	}
+
+	//需要查询的我的问答的评论
+	myIdArr := make([]uint32, 0)
+	for id := range idMap {
+		myIdArr = append(myIdArr, id)
+	}
+
+	//获取我的评论数据
+	myList, err := yb_community_question_comment.GetLastMyListByCommunityQuestionIds(userId, myIdArr)
+	if err != nil {
+		return
+	}
+	for _, v := range myList {
+		ybCommunityQuestionCommentMap[v.CommunityQuestionID] = v
+	}
+
+	// 获取留言汇总数
+	numCommentMap := make(map[uint32]int)
+	numCommentList, err := yb_community_question_comment.GetNumCommentByCommunityQuestionIds(idArr, userId)
+	if err != nil {
+		return
+	}
+	for _, v := range numCommentList {
+		numCommentMap[v.CommunityQuestionID] = v.Total
+	}
+
+	var userOthers []*wx_user.WxUser
+	if len(userIds) > 0 {
+		userOthers, err = wx_user.GetByUserIds(userIds)
+		if err != nil {
+			err = errors.New("查询精选留言用户出错")
+			return
+		}
+	}
+	usersMap := make(map[uint64]*wx_user.WxUser)
+	for _, v := range userOthers {
+		usersMap[v.UserID] = v
+	}
+
+	for _, v := range questionList {
+		//评论汇总数
+		if tmpTotal, ok := numCommentMap[uint32(v.CommunityQuestionID)]; ok {
+			v.CommentTotal = tmpTotal
+		}
+
+		//最近一条 精选/我的 评论
+		if ybCommunityQuestionCommentInfo, ok := ybCommunityQuestionCommentMap[uint32(v.CommunityQuestionID)]; ok {
+			v.Comment = ybCommunityQuestionCommentInfo.Content
+			v.QaAvatarUrl = ybCommunityQuestionCommentInfo.QaAvatarUrl
+			v.CommentUserName = "匿名用户" + strconv.Itoa(int(3333+ybCommunityQuestionCommentInfo.UserID))
+			if info, ok := usersMap[ybCommunityQuestionCommentInfo.UserID]; ok && ybCommunityQuestionCommentInfo.IsShowName == 1 {
+				v.CommentUserName = info.NickName
+				//v.UserImgUrl = info.Headimgurl
+			}
+		}
+	}
+	return
+}
+
+// messageToAdmin 添加站内消息
+func messageToAdmin(wxUser user.UserInfo, communityQuestionComment *yb_community_question_comment.YbCommunityQuestionComment) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("新增问答评论信息完成后,发送消息给管理员失败"+time.Now().Format("2006-01-02 15:04:05")+";Err:"+err.Error(), 3)
+		}
+	}()
+
+	//因为产品说只要给沛总发送信息,那么没办法咯,只去获取沛总的信息 2022-07-19 11:29:16
+	vWangInfo, err := admin.GetVWangInfo()
+	if err != nil {
+		return
+	}
+	//站内消息
+	go systemMessageToAdmin(*vWangInfo, wxUser, communityQuestionComment)
+	//微信模板消息
+	go wxMessageToAdmin(*vWangInfo, communityQuestionComment)
+
+	return
+}
+
+// systemMessageToAdmin 系统消息消息通知管理员
+func systemMessageToAdmin(adminInfo admin.Admin, wxUser user.UserInfo, communityQuestionComment *yb_community_question_comment.YbCommunityQuestionComment) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("新增问答评论信息完成后,站内评论信息发送给管理员失败"+time.Now().Format("2006-01-02 15:04:05")+";Err:"+err.Error(), 3)
+		}
+	}()
+	// 接收人的admin_id
+	receiveUserId := int(adminInfo.AdminID)
+
+	var msgType, sourceType, approvalStatus int8
+	msgType = company_approval_message.CompanyApprovalMessageMessageTypeByApply
+	sourceType = company_approval_message.CompanyApprovalMessageSourceTypeByQuestionComment
+	approvalStatus = company_approval_message.CompanyApprovalMessageApprovalStatusByPending
+
+	companyInfo, err := company.GetByCompanyId(wxUser.CompanyID)
+	if err != nil {
+		return
+	}
+
+	productId := 1
+	companyProductInfo, err := company_product.GetByCompany2ProductId(wxUser.CompanyID, int64(productId))
+	if err != nil {
+		return
+	}
+
+	companyName := companyInfo.CompanyName
+	remark := `您有新的问答评论待查阅`
+	content := `您有新的问答评论待查阅`
+
+	// 获取评论对应的问答信息
+	communityQuestion, err := yb_community_question.GetItemById(int(communityQuestionComment.CommunityQuestionID))
+	if err != nil {
+		err = errors.New("获取评论对应的问答失败,err:" + err.Error())
+	}
+	messageInfo := company_approval_message.MessageInfo{
+		CompanyName:          companyInfo.CompanyName,
+		ProductId:            productId,
+		CompanyProductStatus: companyProductInfo.Status,
+		Title:                communityQuestionComment.Content,
+		Content:              communityQuestion.QuestionContent,
+		UserId:               wxUser.UserID,
+		UserName:             communityQuestionComment.RealName,
+		CreateTime:           communityQuestionComment.CreateTime,
+	}
+	//客户添加消息
+	err = company_approval_message.AddCompanyApprovalMessage(utils.AdminId, receiveUserId, int(wxUser.CompanyID), int(communityQuestionComment.CommunityQuestionCommentID), msgType, sourceType, approvalStatus, companyName, remark, content, messageInfo)
+	return
+}
+
+// wxMessageToAdmin 微信模板消息通知管理员
+func wxMessageToAdmin(adminInfo admin.Admin, communityQuestionComment *yb_community_question_comment.YbCommunityQuestionComment) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("新增问答评论信息完成后,微信模板消息发送给管理员失败"+time.Now().Format("2006-01-02 15:04:05")+";Err:"+err.Error(), 3)
+		}
+	}()
+
+	if global.CONFIG.Serve.RunMode == "debug" {
+		adminInfo.Mobile = `18221983795`
+	}
+	wxUser, err := wx_user.GetByMobile(adminInfo.Mobile)
+	if err != nil {
+		return
+	}
+
+	err = wechat.SendQuestionCommentToAdmin(int(communityQuestionComment.CommunityQuestionCommentID), int(wxUser.UserID), communityQuestionComment.Content)
+	return
+}
+
+// 删除评论后的逻辑处理
+func afterDelete(communityQuestionComment *yb_community_question_comment.YbCommunityQuestionComment) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("问答评论信息删除后,标记站内消息失败"+time.Now().Format("2006-01-02 15:04:05")+";Err:"+err.Error(), 3)
+		}
+	}()
+	err = company_approval_message.CancelCompanyApprovalMessage(int(communityQuestionComment.CommunityQuestionCommentID), company_approval_message.CompanyApprovalMessageSourceTypeByQuestionComment)
+	return
+}

+ 141 - 0
logic/yb_community_question/yb_community_question_like_tease.go

@@ -0,0 +1,141 @@
+package yb_community_question
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/yb_community_question_like_tease"
+	"time"
+)
+
+// SetLikeOrTease 用户对问答进行(取消)点赞或(取消)吐槽
+func SetLikeOrTease(userId uint64, communityQuestionId uint32, opType, enable, sourceAgent int8) (ybCommunityQuestionLikeTease *yb_community_question_like_tease.YbCommunityQuestionLikeTease, likeNum, teaseNum int64, err error, errMsg string) {
+	//user.UserID
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("SetLike: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
+		}
+	}()
+
+	if sourceAgent == 0 {
+		err = errors.New("请输入来源")
+		return
+	}
+	if communityQuestionId <= 0 {
+		err = errors.New("请输入问答ID")
+		return
+	}
+	// 判断是否有点赞权限(不需要权限校验,先保留,有需要后续再说)
+	//err, errMsg = services.CheckSimpleCompanyProduct(user)
+	//if err != nil {
+	//	return
+	//}
+
+	//查询用户对问答的点赞/吐槽状态
+	ybCommunityQuestionLikeTease, err = yb_community_question_like_tease.GetByUserIdAndCommunityQuestionId(userId, communityQuestionId)
+	if err != nil {
+		errMsg = "查询点赞/吐槽记录出错"
+		return
+	}
+	//如果未点赞则新增点赞记录
+	now := time.Now()
+	if ybCommunityQuestionLikeTease.CommunityQuestionLikeTeaseID <= 0 {
+		ybCommunityQuestionLikeTease = &yb_community_question_like_tease.YbCommunityQuestionLikeTease{
+			//CommunityQuestionLikeTeaseID: 0,
+			UserID:              userId,
+			OpType:              opType,
+			Enabled:             1,
+			CreateTime:          now,
+			ModifyTime:          now,
+			CommunityQuestionID: communityQuestionId,
+			SourceAgent:         sourceAgent,
+		}
+		err = ybCommunityQuestionLikeTease.Create()
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("新增点赞/吐槽记录出错")
+			return
+		}
+	} else {
+		ybCommunityQuestionLikeTease.OpType = opType
+		ybCommunityQuestionLikeTease.Enabled = enable
+		ybCommunityQuestionLikeTease.SourceAgent = sourceAgent
+		ybCommunityQuestionLikeTease.ModifyTime = now
+		updates := []string{"op_type", "enabled", "source_agent", "modify_time"}
+		err = ybCommunityQuestionLikeTease.Update(updates)
+		if err != nil {
+			errMsg = "更新点赞记录出错"
+			return
+		}
+	}
+	//查询总的点赞数
+	likeNum, err = yb_community_question_like_tease.GetLikeNumByCommunityQuestionId(communityQuestionId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询点赞数出错")
+	}
+	teaseNum, err = yb_community_question_like_tease.GetTeaseNumByCommunityQuestionId(communityQuestionId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询吐槽数出错")
+	}
+	return
+}
+
+// HandleLikeOrTeaseByCommunityQuestionItemList 问答 点赞/吐槽 数据
+func HandleLikeOrTeaseByCommunityQuestionItemList(userId uint64, questionList []*response.CommunityQuestionItem) (err error) {
+	listLen := len(questionList)
+	if listLen == 0 {
+		return
+	}
+	idArr := make([]uint32, 0)
+	for i := 0; i < listLen; i++ {
+		idArr = append(idArr, uint32(questionList[i].CommunityQuestionID))
+	}
+
+	// 获取点赞和吐槽数据
+	ybCommunityQuestionLikeTeaseMap := make(map[uint32]*yb_community_question_like_tease.YbCommunityQuestionLikeTease)
+	ybCommunityQuestionLikeTeaseList, err := yb_community_question_like_tease.GetByUserIdAndCommunityQuestionIds(userId, idArr)
+	if err != nil {
+		return
+	}
+	for _, v := range ybCommunityQuestionLikeTeaseList {
+		ybCommunityQuestionLikeTeaseMap[v.CommunityQuestionID] = v
+	}
+
+	// 获取点赞和吐槽汇总数
+	likeMap := make(map[uint32]int)
+	teaseMap := make(map[uint32]int)
+
+	likeList, err := yb_community_question_like_tease.GetLikeNumCommentByCommunityQuestionIds(idArr)
+	if err != nil {
+		return
+	}
+	for _, v := range likeList {
+		likeMap[v.CommunityQuestionID] = v.Total
+	}
+
+	teaseList, err := yb_community_question_like_tease.GetTeaseNumCommentByCommunityQuestionIds(idArr)
+	if err != nil {
+		return
+	}
+	for _, v := range teaseList {
+		teaseMap[v.CommunityQuestionID] = v.Total
+	}
+
+	for _, v := range questionList {
+		if tmpTotal, ok := likeMap[uint32(v.CommunityQuestionID)]; ok {
+			v.LikeTotal = tmpTotal
+		}
+		if tmpTotal, ok := teaseMap[uint32(v.CommunityQuestionID)]; ok {
+			v.TeaseTotal = tmpTotal
+		}
+
+		if ybCommunityQuestionLikeTease, ok := ybCommunityQuestionLikeTeaseMap[uint32(v.CommunityQuestionID)]; ok {
+			//类型. 1-点赞 2-吐槽
+			v.OpType = ybCommunityQuestionLikeTease.OpType
+		}
+	}
+	return
+}

+ 27 - 0
middleware/common.go

@@ -0,0 +1,27 @@
+package middleware
+
+import (
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+// Common 公共中间件
+func Common() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		var currPage, pageSize int
+		reqPage := c.DefaultQuery("curr_page", "0")
+		currPage, _ = strconv.Atoi(reqPage)
+		if currPage <= 0 {
+			currPage = 1
+		}
+
+		reqPageSize := c.DefaultQuery("page_size", "0")
+		pageSize, _ = strconv.Atoi(reqPageSize)
+		if pageSize <= 0 {
+			pageSize = 20
+		}
+		c.Set("curr_page", currPage)
+		c.Set("page_size", pageSize)
+		c.Next()
+	}
+}

+ 1 - 1
middleware/recover.go

@@ -18,7 +18,7 @@ func Recover() gin.HandlerFunc {
 		contentType := c.ContentType()
 		contentType := c.ContentType()
 		// 为 multipart forms 设置较低的内存限制(50M) (默认是 32 MiB)
 		// 为 multipart forms 设置较低的内存限制(50M) (默认是 32 MiB)
 		if contentType == "multipart/form-data" {
 		if contentType == "multipart/form-data" {
-			err := c.Request.ParseMultipartForm(-50 << 20)
+			err := c.Request.ParseMultipartForm(10 << 20)
 			if err != nil {
 			if err != nil {
 				response.Custom(http.StatusRequestEntityTooLarge, "上传文件太大,err:"+err.Error(), c)
 				response.Custom(http.StatusRequestEntityTooLarge, "上传文件太大,err:"+err.Error(), c)
 				c.Abort()
 				c.Abort()

+ 9 - 9
models/request/comment/comment.go

@@ -1,15 +1,15 @@
 package comment
 package comment
 
 
 type ReqComment struct {
 type ReqComment struct {
-	Content                string `description:"留言内容" json:"content"`
-	ReportId               int `description:"报告ID" json:"report_id" `
-	ReportChapterId        int `description:"报告章节ID" json:"report_chapter_id" `
-	IsShowName             int8 `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
-	SourceAgent            int  `description:"留言入口来源,1:小程序,2:pc" json:"source_agent"`
-	OldReportId            int `description:"老后台报告ID (research_report_id)" json:"old_report_id" `
-	OldReportChapterId     int `description:"老后台报告章节ID(research_report_type_id)" json:"old_report_chapter_id" `
+	Content            string `description:"留言内容" json:"content"`
+	ReportId           int    `description:"报告ID" json:"report_id" `
+	ReportChapterId    int    `description:"报告章节ID" json:"report_chapter_id" `
+	IsShowName         int8   `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
+	SourceAgent        int    `description:"留言入口来源,1:小程序,2:pc" json:"source_agent"`
+	OldReportId        int    `description:"老后台报告ID (research_report_id)" json:"old_report_id" `
+	OldReportChapterId int    `description:"老后台报告章节ID(research_report_type_id)" json:"old_report_chapter_id" `
 }
 }
 
 
 type ReqDel struct {
 type ReqDel struct {
-	CommentId        uint64 `description:"留言ID" json:"comment_id"`
-}
+	CommentId uint64 `description:"留言ID" json:"comment_id"`
+}

+ 41 - 7
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 {
@@ -40,4 +40,38 @@ type ReplyListTotalReq struct {
 type CommunityAudioListenLogReq struct {
 type CommunityAudioListenLogReq struct {
 	CommunityQuestionAudioID int `json:"community_question_audio_id"` //音频ID
 	CommunityQuestionAudioID int `json:"community_question_audio_id"` //音频ID
 	SourceAgent              int `json:"source_agent"`                //操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
 	SourceAgent              int `json:"source_agent"`                //操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
-}
+}
+
+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"`
+	VarietyTagId int    `json:"variety_tag_id" form:"variety_tag_id"`
+}
+
+type VideoPlayLogReq struct {
+	VideoId     int `json:"video_id" description:"视频ID"`
+	SourceAgent int `json:"source_agent" description:"来源:1-小程序 2-小程序PC 3-公众号 4-Web官网"`
+}
+
+// ReqCommunityQuestionLikeTease 问答点赞/吐槽请求
+type ReqCommunityQuestionLikeTease struct {
+	CommunityQuestionId uint32 `description:"问答id" json:"community_question_id" `
+	OpType              int8   `description:"类型. 1-点赞 2-吐槽" json:"op_type"`
+	Enable              int8   `description:"状态. 0-无效数据(已取消点赞/吐槽) 1-有效数据(点赞/吐槽)" json:"enable"`
+	SourceAgent         int8   `description:"点赞入口来源,1:小程序,2:小程序pc" json:"source_agent"`
+}
+
+// ReqComment 问答新增评论请求
+type ReqComment struct {
+	CommunityQuestionID uint32 `description:"问答id" json:"community_question_id" `
+	Content             string `description:"留言内容" json:"content"`
+	IsShowName          int8   `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
+	SourceAgent         int8   `description:"留言入口来源,1:小程序,2:pc" json:"source_agent"`
+}
+
+// ReqDel 删除评论
+type ReqDel struct {
+	CommunityQuestionCommentID uint64 `description:"留言ID" json:"community_question_comment_id"`
+}

+ 11 - 0
models/request/price_driven.go

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

+ 5 - 0
models/request/public.go

@@ -0,0 +1,5 @@
+package request
+
+type RddpReportShareImgReq struct {
+	Title string `description:"标题" json:"title"`
+}

+ 9 - 0
models/request/sandbox/sandbox.go

@@ -0,0 +1,9 @@
+package sandbox
+
+type ListReq struct {
+	ChartPermissionId int    `json:"chart_permission_id" form:"chart_permission_id" description:"品种id"`
+	Keyword           string `json:"keyword" form:"keyword" description:"关键字"`
+	IsHighLight       bool   `json:"is_high_light" form:"is_high_light" description:"是否高亮显示"`
+	CurrPage          int    `json:"curr_page" form:"curr_page"`
+	PageSize          int    `json:"page_size" form:"page_size"`
+}

+ 1 - 1
models/request/user/user.go

@@ -13,7 +13,7 @@ type ApplyReq struct {
 	CompanyName     string `description:"公司名称" json:"company_name"`
 	CompanyName     string `description:"公司名称" json:"company_name"`
 	RealName        string `description:"用户真实姓名" json:"real_name"`
 	RealName        string `description:"用户真实姓名" json:"real_name"`
 	Permission      string `description:"用户关注品种,多个品种之间用英文,隔开" json:"permission"`
 	Permission      string `description:"用户关注品种,多个品种之间用英文,隔开" json:"permission"`
-	Source			int	   `description:"申请来源:1-我的 2-活动 3-图库"`
+	Source			int	   `description:"申请来源:1-我的 2-活动 3-图库 4-报告详情 5-问答社区 6-价格驱动 7-沙盘推演 8-语音播报"`
 	SourceAgent     int    `description:"申请入口来源,1:小程序,2:pc" json:"source_agent"`
 	SourceAgent     int    `description:"申请入口来源,1:小程序,2:pc" json:"source_agent"`
 	FromPage        string `description:"申请来源页面" json:"from_page"`
 	FromPage        string `description:"申请来源页面" json:"from_page"`
 }
 }

+ 48 - 0
models/request/voice_broadcast.go

@@ -0,0 +1,48 @@
+package request
+
+import "mime/multipart"
+
+type BroadcastListReq struct {
+	PageIndex   int `json:"page_index" form:"page_index"`
+	PageSize    int `json:"page_size" form:"page_size"`
+	BroadcastId int `json:"broadcast_id" form:"broadcast_id"`
+	SectionId   int `json:"section_id" form:"section_id"`
+}
+
+type AddBroadcastReq struct {
+	BroadcastName string                `json:"broadcast_name" `
+	SectionId     int                   `json:"section_id" `
+	SectionName   string                `json:"section_name"`
+	VarietyId     int                   `json:"variety_id"`
+	VarietyName   string                `json:"variety_name"`
+	AuthorId      int                   `json:"author_id"`
+	Author        string                `json:"author"`
+	File          *multipart.FileHeader `json:"file"`
+}
+
+//type AddBroadcastReq struct {
+//	BroadcastName    string `json:"page_index" `
+//	SectionId        int    `json:"section_id" `
+//	SectionName      string `json:"section_name"`
+//	VarietyId        int    `json:"variety_id"`
+//	VarietyName      string `json:"variety_name"`
+//	AuthorId         int    `json:"author_id"`
+//	Author           string `json:"author"`
+//	VoiceUrl         string `json:"voice_url"`
+//	VoicePlaySeconds string `json:"voice_play_seconds"`
+//	VoiceSize        string `json:"voice_size"`
+//	CreateTime       string `json:"create_time" `
+//}
+
+type AddBroadcastStatisticsReq struct {
+	Source      int `json:"source" description:"点击来源,1手机小程序,2pc小程序,3web端"`
+	BroadcastId int `json:"broadcast_id" `
+}
+
+type BroadcastDetailReq struct {
+	BroadcastId int `json:"broadcast_id" form:"broadcast_id" description:"语音播报ID"`
+}
+
+type BroadcastMsgSendReq struct {
+	BroadcastId int `json:"broadcast_id" description:"语音播报ID"`
+}

+ 14 - 14
models/response/comment.go

@@ -3,19 +3,19 @@ package response
 import "time"
 import "time"
 
 
 type RespCommentList struct {
 type RespCommentList struct {
-	List       []*RespCommentItem   `json:"list"`
-	Paging     *PagingItem  		`json:"paging"`
+	List   []*RespCommentItem `json:"list"`
+	Paging *PagingItem        `json:"paging"`
 }
 }
 type RespMyCommentList struct {
 type RespMyCommentList struct {
-	List       []*RespCommentItem   `json:"list"`
-	IsShowName int8 `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
+	List       []*RespCommentItem `json:"list"`
+	IsShowName int8               `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
 }
 }
 type RespCommentItem struct {
 type RespCommentItem struct {
 	CommentId  uint64    `description:"留言ID" json:"comment_id"`
 	CommentId  uint64    `description:"留言ID" json:"comment_id"`
 	UserId     uint64    `description:"用户id" json:"user_id"`
 	UserId     uint64    `description:"用户id" json:"user_id"`
 	Content    string    `description:"留言内容" json:"content"`
 	Content    string    `description:"留言内容" json:"content"`
-	IsTop      int8      `description:"是否置顶(0-未置顶,1-置顶)json:"is_top""`
-	IsHot      int8      `description:"是否设置精选(0-未设置,1-已设置)json:"is_hot""`
+	IsTop      int8      `description:"是否置顶(0-未置顶,1-置顶)" json:"is_top"`
+	IsHot      int8      `description:"是否设置精选(0-未设置,1-已设置)" json:"is_hot"`
 	HotTopTime time.Time `description:"设置精选或者设置置顶的时间" json:"hot_top_time"`
 	HotTopTime time.Time `description:"设置精选或者设置置顶的时间" json:"hot_top_time"`
 	IsShowName int8      `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
 	IsShowName int8      `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
 	UserName   string    `description:"用户昵称" json:"user_name"`
 	UserName   string    `description:"用户昵称" json:"user_name"`
@@ -25,15 +25,15 @@ type RespCommentItem struct {
 }
 }
 
 
 type ReplyItem struct {
 type ReplyItem struct {
-	CommentId         uint64 `description:"留言ID" json:"comment_id"`
-	AdminId           uint64 `description:"发布留言回复的管理员ID" json:"admin_id"`
-	AdminName         string `description:"系统昵称" json:"admin_name"`
-	AdminImgUrl          string `description:"系统头像" json:"admin_img_url"`
-	Content           string `description:"回复内容" json:"content"`
-	ReplyCommentId    uint64 `description:"回复的留言ID" json:"reply_comment_id"`
-	CreateTime        time.Time `description:"留言创建时间" json:"create_time"`
+	CommentId      uint64    `description:"留言ID" json:"comment_id"`
+	AdminId        uint64    `description:"发布留言回复的管理员ID" json:"admin_id"`
+	AdminName      string    `description:"系统昵称" json:"admin_name"`
+	AdminImgUrl    string    `description:"系统头像" json:"admin_img_url"`
+	Content        string    `description:"回复内容" json:"content"`
+	ReplyCommentId uint64    `description:"回复的留言ID" json:"reply_comment_id"`
+	CreateTime     time.Time `description:"留言创建时间" json:"create_time"`
 }
 }
 
 
 type RespCommentAdd struct {
 type RespCommentAdd struct {
-	CommentId    uint64 `description:"留言ID" json:"comment_id"`
+	CommentId uint64 `description:"留言ID" json:"comment_id"`
 }
 }

+ 84 - 20
models/response/community.go

@@ -1,25 +1,35 @@
 package response
 package response
 
 
+import "time"
+
 type CommunityQuestionItem struct {
 type CommunityQuestionItem struct {
-	CommunityQuestionID     int                           `json:"community_question_id"`
-	UserId                  int                           `json:"user_id"`
-	QuestionContent         string                        `json:"question_content"`
-	ReplierRealName         string                        `json:"replier_real_name"`
-	ReplierRank             string                        `json:"replier_rank"`
-	ReplierAvatar           string                        `json:"replier_avatar"`
-	ChartPermissionID       int                           `json:"chart_permission_id"`
-	ChartPermissionName     string                        `json:"chart_permission_name"`
-	ResearchGroupSecondId   int                           `json:"research_group_second_id"`
-	ResearchGroupSecondName string                        `json:"research_group_second_name"`
-	IsRead                  int                           `json:"is_read"`
-	ReplierIsRead           int                           `json:"replier_is_read"`
-	CreateTime              string                        `json:"create_time"`
-	ReplyTime               string                        `json:"reply_time"`
-	IsTop                   int                           `json:"is_top"`
-	ReplyStatus             int                           `json:"reply_status" description:"回复状态 1-待分配 2-待回答 3-已回答"`
+	CommunityQuestionID     int    `json:"community_question_id"`
+	UserId                  int    `json:"user_id"`
+	QuestionContent         string `json:"question_content"`
+	ReplierRealName         string `json:"replier_real_name"`
+	ReplierRank             string `json:"replier_rank"`
+	ReplierAvatar           string `json:"replier_avatar"`
+	VarietyTagId            int    `json:"variety_tag_id"`
+	VarietyTagName          string `json:"variety_tag_name"`
+	ResearchGroupSecondId   int    `json:"research_group_second_id"`
+	ResearchGroupSecondName string `json:"research_group_second_name"`
+	IsRead                  int    `json:"is_read"`
+	ReplierUserID           int    `json:"replier_user_id"  description:"回复人的user_id"`
+	ReplierIsRead           int    `json:"replier_is_read"`
+	CreateTime              string `json:"create_time"`
+	ReplyTime               string `json:"reply_time"`
+	IsTop                   int    `json:"is_top"`
+	ReplyStatus             int    `json:"reply_status" description:"回复状态 1-待分配 2-待回答 3-已回答"`
 	//AuthOk                  bool                          `json:"auth_ok" description:"是否有权限"`
 	//AuthOk                  bool                          `json:"auth_ok" description:"是否有权限"`
 	//PermissionInfo          PermissionCheckInfo           `json:"permission_info"`
 	//PermissionInfo          PermissionCheckInfo           `json:"permission_info"`
-	AudioList               []*CommunityQuestionAudioItem `json:"audio_list"`
+	AudioList       []*CommunityQuestionAudioItem `json:"audio_list"`
+	OpType          int8                          `description:"类型. 1-点赞 2-吐槽" json:"op_type"`
+	LikeTotal       int                           `json:"like_total" description:"点赞数"`
+	TeaseTotal      int                           `json:"tease_total" description:"吐槽数"`
+	CommentTotal    int                           `json:"comment_total" description:"总共评论数"`
+	Comment         string                        `json:"comment" description:"评论"`
+	CommentUserName string                        `json:"comment_user_name" description:"评论人"`
+	QaAvatarUrl     string                        `description:"用户头像" json:"qa_avatar_url"`
 }
 }
 
 
 type CommunityQuestionAudioItem struct {
 type CommunityQuestionAudioItem struct {
@@ -32,9 +42,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 {
@@ -59,3 +70,56 @@ type ResearchGroupMember struct {
 	AdminId   int    `json:"admin_id"`
 	AdminId   int    `json:"admin_id"`
 	AdminName string `json:"admin_name"`
 	AdminName string `json:"admin_name"`
 }
 }
+
+// CommunityVideoItem 视频社区
+type CommunityVideoItem struct {
+	CommunityVideoID    int    `json:"community_video_id"`
+	Title               string `json:"title"`
+	VarietyTagId        int    `json:"variety_tag_id"`
+	VarietyTagName      string `json:"variety_tag_name"`
+	CoverImgUrl         string `json:"cover_img_url"`
+	VideoUrl            string `json:"video_url"`
+	VideoSeconds        string `json:"video_seconds"`
+	PublishState        int    `json:"publish_state"`
+	PublishTime         string `json:"publish_time"`
+	CreateTime          string `json:"create_time"`
+	ModifyTime          string `json:"modify_time"`
+	ChartPermissionName string `json:"chart_permission_name"`
+}
+
+// RespCommunityQuestionLikeTease
+type RespCommunityQuestionLikeTease struct {
+	LikeTotal  int64 `description:"点赞总数" json:"like_total"`
+	TeaseTotal int64 `description:"吐槽总数" json:"tease_total"`
+	OpType     int8  `description:"类型. 1-点赞 2-吐槽" json:"op_type"`
+	Enabled    int8  `description:"本次点赞/吐槽结果: 0-已取消赞 1-有效赞" json:"enabled"`
+}
+
+// RespCommunityQuestionCommentAdd 新增问答留言返回
+type RespCommunityQuestionCommentAdd struct {
+	CommunityQuestionCommentID uint64 `description:"留言ID" json:"community_question_comment_id"`
+}
+
+// RespCommunityQuestionCommentItem 问答留言列表的数据返回
+type RespCommunityQuestionCommentItem struct {
+	CommunityQuestionCommentID uint64    `description:"留言ID" json:"community_question_comment_id"`
+	UserId                     uint64    `description:"用户id" json:"user_id"`
+	Content                    string    `description:"留言内容" json:"content"`
+	IsTop                      int8      `description:"是否置顶(0-未置顶,1-置顶)" json:"is_top"`
+	IsHot                      int8      `description:"是否设置精选(0-未设置,1-已设置)" json:"is_hot"`
+	HotTopTime                 time.Time `description:"设置精选或者设置置顶的时间" json:"hot_top_time"`
+	IsShowName                 int8      `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
+	UserName                   string    `description:"用户昵称" json:"user_name"`
+	UserImgUrl                 string    `description:"用户头像" json:"user_img_url"`
+	CreateTime                 time.Time `description:"留言创建时间" json:"create_time"`
+	QaAvatarUrl                string    `description:"用户头像" json:"qa_avatar_url"`
+	ReplyList                  []*ReplyItem
+}
+
+// RespCommunityQuestionCommentList 问答留言列表接口返回
+type RespCommunityQuestionCommentList struct {
+	List     []*RespCommunityQuestionCommentItem `json:"list"`
+	Paging   *PagingItem                         `json:"paging"`
+	HotTotal int64                               `json:"hot_total"`
+	MyTotal  int64                               `json:"my_total"`
+}

+ 2 - 2
models/response/pc/report.go

@@ -54,7 +54,7 @@ func GetRecommendList(reportId, reportType, secondId int) (items []*Report, err
 }
 }
 
 
 type LatestReport struct {
 type LatestReport struct {
-	Id                 int       `orm:"column(id)" description:"报告Id" json:"_"`
+	Id                 int       `description:"报告Id" json:"_"`
 	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`
 	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`
 	ClassifyNameSecond string    `description:"二级分类名称" json:"classify_name_second"`
 	ClassifyNameSecond string    `description:"二级分类名称" json:"classify_name_second"`
 	ClassifyIdSecond   int       `description:"二级分类id" json:"classify_id_second"`
 	ClassifyIdSecond   int       `description:"二级分类id" json:"classify_id_second"`
@@ -108,7 +108,7 @@ type DetailBannerResp struct {
 }
 }
 
 
 type LatestReportBanner struct {
 type LatestReportBanner struct {
-	ReportId           int `orm:"column(id)" description:"报告Id" json:"reportId"`
+	ReportId           int `description:"报告Id" json:"reportId"`
 	ClassifyIdFirst    int
 	ClassifyIdFirst    int
 	ClassifyIdSecond   int
 	ClassifyIdSecond   int
 	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`
 	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`

+ 21 - 18
models/response/permission.go

@@ -1,33 +1,36 @@
 package response
 package response
 
 
 type PermissionFirstItem struct {
 type PermissionFirstItem struct {
-	AuthOk     bool
-	Sort       int
-	IsCheck    bool
-	List       PermissionFiccSecondList
+	Id          int `description:"一级品种ID"`
+	AuthOk      bool
+	Sort        int
+	IsCheck     bool
+	List        PermissionFiccSecondList
 	YbIndexName string
 	YbIndexName string
 	YbIndexIcon string
 	YbIndexIcon string
 }
 }
 
 
 type PermissionFiccItem struct {
 type PermissionFiccItem struct {
-	ClassifyName    string   `json:"classify_name"`
-	List            PermissionFiccSecondList   `json:"list"`
-	Sort           int       `json:"sort"`
-	IconUrl       string     `json:"icon_url"`
-	SelectIconUrl     string     `json:"select_icon_url"`
+	Id            int                      `json:"id"`
+	ClassifyName  string                   `json:"classify_name"`
+	List          PermissionFiccSecondList `json:"list"`
+	Sort          int                      `json:"sort"`
+	IconUrl       string                   `json:"icon_url"`
+	SelectIconUrl string                   `json:"select_icon_url"`
 }
 }
 
 
 type PermissionFiccSecondItem struct {
 type PermissionFiccSecondItem struct {
-	ChartPermissionName string    `json:"chart_permission_name"`
+	ChartPermissionName string `json:"chart_permission_name"`
 	ChartPermissionID   int    `json:"chart_permission_id"`
 	ChartPermissionID   int    `json:"chart_permission_id"`
-	Sort           int 	`json:"sort"`
-	AuthOk     bool   `json:"auth_ok"`
+	Sort                int    `json:"sort"`
+	AuthOk              bool   `json:"auth_ok"`
+	PirceDrivenState    int    `json:"pirce_driven_state" description:"价格驱动品种状态:0-关闭 1-开启"`
 }
 }
 
 
 type PermissionFiccResp struct {
 type PermissionFiccResp struct {
-	PermissionList 	PermissionFiccList `json:"permission_list"`
-	ContactInfo     PermissionCheckContactInfo    `json:"contact_info"`
-	CheckFlag    bool        `json:"check_flag"`
+	PermissionList PermissionFiccList         `json:"permission_list"`
+	ContactInfo    PermissionCheckContactInfo `json:"contact_info"`
+	CheckFlag      bool                       `json:"check_flag"`
 }
 }
 type PermissionFiccList []*PermissionFiccItem
 type PermissionFiccList []*PermissionFiccItem
 
 
@@ -68,8 +71,8 @@ type PermissionCheckInfo struct {
 
 
 // PermissionCheckInfoContact 权限校验完成后的结果
 // PermissionCheckInfoContact 权限校验完成后的结果
 type PermissionCheckContactInfo struct {
 type PermissionCheckContactInfo struct {
-	Name         string       `json:"name" description:"销售名称"`
-	Mobile       string       `json:"mobile" description:"手机号"`
+	Name   string `json:"name" description:"销售名称"`
+	Mobile string `json:"mobile" description:"手机号"`
 }
 }
 
 
 // CustomerInfo 客户信息
 // CustomerInfo 客户信息
@@ -80,4 +83,4 @@ type CustomerInfo struct {
 	Status      string `json:"status" description:"状态"`
 	Status      string `json:"status" description:"状态"`
 	IsSuspend   int8   `json:"is_suspend" description:"启用与否字段:1:暂停,0:启用"`
 	IsSuspend   int8   `json:"is_suspend" description:"启用与否字段:1:暂停,0:启用"`
 	HasApply    bool   `json:"has_apply" description:"是否有申请过"`
 	HasApply    bool   `json:"has_apply" description:"是否有申请过"`
-}
+}

+ 13 - 0
models/response/price_driven.go

@@ -0,0 +1,13 @@
+package response
+
+// PriceDrivenItem 价格驱动详情
+type PriceDrivenItem struct {
+	PriceDrivenID     int    `json:"price_driven_id" description:"价格驱动ID"`
+	VarietyTagID      int    `json:"variety_tag_id" description:"标签ID"`
+	MainVariable      string `json:"main_variable" description:"关键变量"`
+	CoreDrivenType    int    `json:"core_driven_type" description:"核心驱动类型 0-多 1-空"`
+	CoreDrivenContent string `json:"core_driven_content" description:"核心驱动内容"`
+	CoreContent       string `json:"core_content" description:"核心内容"`
+	CreateTime        string `json:"create_time" description:"创建时间"`
+	ModifyTime        string `json:"modify_time" description:"更新时间"`
+}

+ 17 - 16
models/response/report.go

@@ -11,6 +11,7 @@ type ReportDetail struct {
 	AuthOk            bool                     `json:"auth_ok"`
 	AuthOk            bool                     `json:"auth_ok"`
 	LikeNum           int64                    `description:"点赞总数" json:"like_num"`
 	LikeNum           int64                    `description:"点赞总数" json:"like_num"`
 	LikeEnabled       int8                     `description:"是否已点赞: 0-未点赞 1-已点赞" json:"like_enabled"`
 	LikeEnabled       int8                     `description:"是否已点赞: 0-未点赞 1-已点赞" json:"like_enabled"`
+	ReportShowType    int                      `descritpion:"展示形式:1-列表 2-专栏" json:"report_show_type"`
 }
 }
 
 
 type ReportChapterListItem struct {
 type ReportChapterListItem struct {
@@ -36,22 +37,22 @@ type ReportItem struct {
 	Author             string    `description:"作者" json:"author"`
 	Author             string    `description:"作者" json:"author"`
 	Frequency          string    `description:"频度" json:"frequency"`
 	Frequency          string    `description:"频度" json:"frequency"`
 	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
 	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
-	Stage              int    `description:"期数" json:"stage"`
-	Content            string `description:"内容" json:"content"`
-	VideoUrl           string `description:"音频文件URL" json:"video_url"`
-	VideoName          string `description:"音频文件名称" json:"video_name"`
-	VideoSize          string `description:"音频文件大小,单位M" json:"video_size"`
-	VideoPlaySeconds   string `description:"音频播放时长" json:"video_play_seconds"`
+	Stage              int       `description:"期数" json:"stage"`
+	Content            string    `description:"内容" json:"content"`
+	VideoUrl           string    `description:"音频文件URL" json:"video_url"`
+	VideoName          string    `description:"音频文件名称" json:"video_name"`
+	VideoSize          string    `description:"音频文件大小,单位M" json:"video_size"`
+	VideoPlaySeconds   string    `description:"音频播放时长" json:"video_play_seconds"`
 	VideoImg           string    `description:"音频播放条的图片" json:"video_img"`
 	VideoImg           string    `description:"音频播放条的图片" json:"video_img"`
-	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
-	BannerUrl          string `description:"详情页banner" json:"banner_url"`
+	ContentSub         string    `description:"内容前两个章节" json:"content_sub"`
+	BannerUrl          string    `description:"详情页banner" json:"banner_url"`
 }
 }
 
 
 type ReportChapterItem struct {
 type ReportChapterItem struct {
 	ReportChapterId       int       `json:"report_chapter_id"`
 	ReportChapterId       int       `json:"report_chapter_id"`
 	ReportId              int       `json:"report_id"`
 	ReportId              int       `json:"report_id"`
 	Title                 string    `json:"title"`
 	Title                 string    `json:"title"`
-	Abstract string `json:"abstract"`
+	Abstract              string    `json:"abstract"`
 	TypeId                int       `json:"type_id"`
 	TypeId                int       `json:"type_id"`
 	TypeName              string    `json:"type_name"`
 	TypeName              string    `json:"type_name"`
 	Trend                 string    `json:"trend"`
 	Trend                 string    `json:"trend"`
@@ -80,13 +81,13 @@ type ReportChapterDetail struct {
 }
 }
 
 
 type ReportChapterMenu struct {
 type ReportChapterMenu struct {
-	ReportChapterId    int    `json:"report_chapter_id"`
-	ReportId        int    `json:"report_id"`
-	ReportChapterTypeName   string       `json:"report_chapter_type_name"`
-	ReportChapterTypeThumb  string	    `json:"report_chapter_type_thumb"`
-	PcSelectedThumb  string	    `json:"pc_selected_thumb"`
-	PcUnselectedThumb  string	    `json:"pc_unselected_thumb"`
-	Sort             int  `json:"sort"`
+	ReportChapterId        int    `json:"report_chapter_id"`
+	ReportId               int    `json:"report_id"`
+	ReportChapterTypeName  string `json:"report_chapter_type_name"`
+	ReportChapterTypeThumb string `json:"report_chapter_type_thumb"`
+	PcSelectedThumb        string `json:"pc_selected_thumb"`
+	PcUnselectedThumb      string `json:"pc_unselected_thumb"`
+	Sort                   int    `json:"sort"`
 }
 }
 
 
 type ReportListItem struct {
 type ReportListItem struct {

+ 9 - 0
models/response/sandbox.go

@@ -0,0 +1,9 @@
+package response
+
+import "hongze/hongze_yb/logic/sandbox"
+
+// SandboxListResp 沙盘逻辑数据反馈
+type SandboxListResp struct {
+	List   []sandbox.SandboxItem `json:"list"`
+	Paging *PagingItem           `json:"paging"`
+}

+ 40 - 0
models/response/voice_broadcast.go

@@ -0,0 +1,40 @@
+package response
+
+// BroadcastListResp 语音播报列表resp
+type BroadcastListResp struct {
+	List         []Broadcast
+	IsVoiceAdmin bool `description:"是否为语音管理员"`
+}
+
+type Broadcast struct {
+	BroadcastId      int    `description:"语音ID"`
+	BroadcastName    string `description:"语音名称"`
+	SectionId        int    `description:"语音分类ID"`
+	SectionName      string `description:"语音分类名称"`
+	VarietyId        int    `description:"品种id"`
+	VarietyName      string `description:"品种名称"`
+	AuthorId         int    `description:"作者id"`
+	Author           string `description:"作者"`
+	ImgUrl           string `description:"背景图url"`
+	VoiceUrl         string `description:"音频url"`
+	VoicePlaySeconds string `description:"音频时长"`
+	VoiceSize        string `description:"音频大小"`
+	CreateTime       string `description:"创建时间"`
+	IsAuthor         bool   `description:"是否为作者"`
+	CouldSendMsg     bool   `description:"是否可推送消息"`
+}
+
+//type SectionListResp struct {
+//	List []VarietyList
+//}
+type VarietyList struct {
+	VarietyId   int
+	VarietyName string
+	Children    []SectionList
+}
+type SectionList struct {
+	ImgUrl      string
+	SectionId   int
+	SectionName string
+	Status      int
+}

+ 12 - 1
models/tables/admin/query.go

@@ -14,4 +14,15 @@ func GetByAdminId(adminId int) (item *Admin, err error) {
 func GetAdminByMobile(mobile string) (item *Admin, err error) {
 func GetAdminByMobile(mobile string) (item *Admin, err error) {
 	err = global.DEFAULT_MYSQL.Model(Admin{}).Where("mobile = ? AND enabled = 1", mobile).First(&item).Error
 	err = global.DEFAULT_MYSQL.Model(Admin{}).Where("mobile = ? AND enabled = 1", mobile).First(&item).Error
 	return
 	return
-}
+}
+
+// GetAdminByEmail 通过邮箱获取系统用户信息
+func GetAdminByEmail(mobile string) (item *Admin, err error) {
+	err = global.DEFAULT_MYSQL.Model(Admin{}).Where("email = ? AND enabled = 1", mobile).First(&item).Error
+	return
+}
+
+// GetVWangInfo 获取沛总的账户信息
+func GetVWangInfo() (item *Admin, err error) {
+	return GetByAdminId(66)
+}

+ 1 - 1
models/tables/chart_classify/query.go

@@ -1,7 +1,7 @@
 package chart_classify
 package chart_classify
 
 
 type ChartClassifyView struct {
 type ChartClassifyView struct {
-	ChartClassifyId   int       `orm:"column(chart_classify_id);pk"`
+	ChartClassifyId   int       `description:"主键"`
 	ChartClassifyName string    `description:"分类名称"`
 	ChartClassifyName string    `description:"分类名称"`
 	ParentId          int       `description:"父级id"`
 	ParentId          int       `description:"父级id"`
 }
 }

+ 1 - 1
models/tables/chart_info/query.go

@@ -6,7 +6,7 @@ import (
 )
 )
 
 
 type ChartInfoView struct {
 type ChartInfoView struct {
-	ChartInfoId       int    `orm:"column(chart_info_id);pk"`
+	ChartInfoId       int    `description:"图表ID"`
 	ChartName         string `description:"来源名称"`
 	ChartName         string `description:"来源名称"`
 	ChartClassifyId   int    `description:"图表分类id"`
 	ChartClassifyId   int    `description:"图表分类id"`
 	ChartClassifyName string `description:"图表名称"`
 	ChartClassifyName string `description:"图表名称"`

+ 7 - 6
models/tables/chart_permission/chart_permission.go

@@ -16,12 +16,13 @@ type ChartPermission struct {
 	ClassifyName        string    `gorm:"column:classify_name;type:varchar(50)" json:"classifyName"`
 	ClassifyName        string    `gorm:"column:classify_name;type:varchar(50)" json:"classifyName"`
 	ProductName         string    `gorm:"column:product_name;type:varchar(50);default:''" json:"productName"`
 	ProductName         string    `gorm:"column:product_name;type:varchar(50);default:''" json:"productName"`
 	ProductID           int       `gorm:"column:product_id;type:int(11);default:0" json:"productId"`
 	ProductID           int       `gorm:"column:product_id;type:int(11);default:0" json:"productId"`
-	ImageURL            string    `gorm:"column:image_url;type:varchar(255)" json:"imageUrl"`                                  // 图片地址
-	ShowType            int8      `gorm:"column:show_type;type:tinyint(4);default:0" json:"showType"`                          // 1:查研观向小程序展示
-	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                   // 是否是其他,用于查研观向小程序后台展示
-	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"` // 是否是报告,用于查研观向小程序前台报告展示
-	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                 // 是否是权限,用于查研观向小程序前台权限校验
-	YbImgUrl            string      `gorm:"column:yb_img_url;type:varchar(255)" json:"yb_img_url"`                            // 研报小程序报告列表icon
+	ImageURL            string    `gorm:"column:image_url;type:varchar(255)" json:"imageUrl"`                                     // 图片地址
+	ShowType            int8      `gorm:"column:show_type;type:tinyint(4);default:0" json:"showType"`                             // 1:查研观向小程序展示
+	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                      // 是否是其他,用于查研观向小程序后台展示
+	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"`    // 是否是报告,用于查研观向小程序前台报告展示
+	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                    // 是否是权限,用于查研观向小程序前台权限校验
+	YbImgUrl            string    `gorm:"column:yb_img_url;type:varchar(255)" json:"yb_img_url"`                                  // 研报小程序报告列表icon
+	PriceDrivenState    int       `gorm:"column:price_driven_state;type:tinyint(4);not null;default:0" json:"price_driven_state"` // 品种价格驱动状态:0-关闭 1-开启
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名

+ 1 - 1
models/tables/chart_permission_first/chart_permission_first.go

@@ -4,7 +4,7 @@ import "time"
 
 
 // ChartPermissionFirst 报告权限一级分类表
 // ChartPermissionFirst 报告权限一级分类表
 type ChartPermissionFirst struct {
 type ChartPermissionFirst struct {
-	Id           uint64    `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	Id           uint64    `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"id"`
 	ClassifyName string    `gorm:"column:classify_name;type:varchar(50)"`                                        // 权限一级分类名称,与chart_permission的classify_name一致
 	ClassifyName string    `gorm:"column:classify_name;type:varchar(50)"`                                        // 权限一级分类名称,与chart_permission的classify_name一致
 	YbIndexName  string    `gorm:"column:yb_index_name;type:varchar(50);default:''" `                            // 研报小程序首页简称
 	YbIndexName  string    `gorm:"column:yb_index_name;type:varchar(50);default:''" `                            // 研报小程序首页简称
 	YbIndexSort  int      `gorm:"column:yb_index_sort;type:tinyint(4);default:0"`                               // 研报小程序首页排序
 	YbIndexSort  int      `gorm:"column:yb_index_sort;type:tinyint(4);default:0"`                               // 研报小程序首页排序

+ 7 - 7
models/tables/chart_permission_search_key_word_mapping/chart_permission_search_key_word_mapping.go

@@ -1,14 +1,14 @@
 package chart_permission_search_key_word_mapping
 package chart_permission_search_key_word_mapping
 
 
 type ChartPermissionSearchKeyWordMapping struct {
 type ChartPermissionSearchKeyWordMapping struct {
-	Id        		  int  `orm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
-	ChartPermissionId int  	`gorm:"column:chart_permission_id;type:int(11)" json:"chart_permission_id"`
-	KeyWord          string  `gorm:"column:key_word;type:varchar(100)" json:"key_word"`
-	From             string   `gorm:"column:from;type:varchar(100)" json:"from"`
-	TacticType       string	 `gorm:"column:tactic_type;type:varchar(100)" json:"tactic_type"`
-	TeleconferenceSort int		`gorm:"column:teleconference_sort;type:int(11)" json:"teleconference_sort"`
+	Id                 int    `gorm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
+	ChartPermissionId  int    `gorm:"column:chart_permission_id;type:int(11)" json:"chart_permission_id"`
+	KeyWord            string `gorm:"column:key_word;type:varchar(100)" json:"key_word"`
+	From               string `gorm:"column:from;type:varchar(100)" json:"from"`
+	TacticType         string `gorm:"column:tactic_type;type:varchar(100)" json:"tactic_type"`
+	TeleconferenceSort int    `gorm:"column:teleconference_sort;type:int(11)" json:"teleconference_sort"`
 }
 }
 
 
 func (c *ChartPermissionSearchKeyWordMapping) TableName() string {
 func (c *ChartPermissionSearchKeyWordMapping) TableName() string {
 	return "chart_permission_search_key_word_mapping"
 	return "chart_permission_search_key_word_mapping"
-}
+}

+ 67 - 0
models/tables/company_approval_message/company_approval_message.go

@@ -0,0 +1,67 @@
+package company_approval_message
+
+import (
+	"time"
+)
+
+// CompanyApprovalMessage [...]
+type CompanyApprovalMessage struct {
+	ID                int       `gorm:"primaryKey;column:id;type:int(11);not null" json:"-"`
+	CreateUserID      int       `gorm:"column:create_user_id;type:int(11);default:0" json:"createUserId"`                             // 消息创建者id
+	ReceiveUserID     int       `gorm:"index:idx_receive_user_id;column:receive_user_id;type:int(11);default:0" json:"receiveUserId"` // 消息接收者id
+	MessageStatus     int       `gorm:"column:message_status;type:int(11);default:0" json:"messageStatus"`                            // 消息状态:0未读,1:已读,2:作废
+	Remark            string    `gorm:"column:remark;type:varchar(500);default:''" json:"remark"`                                     // 备注信息
+	Content           string    `gorm:"column:content;type:varchar(500);default:''" json:"content"`                                   // 消息内容
+	CompanyID         int       `gorm:"column:company_id;type:int(11)" json:"companyId"`                                              // 客户id
+	CompanyName       string    `gorm:"column:company_name;type:varchar(500)" json:"companyName"`                                     // 客户名称
+	CreateTime        time.Time `gorm:"column:create_time;type:datetime" json:"createTime"`                                           // 创建时间
+	ModifyTime        time.Time `gorm:"column:modify_time;type:datetime" json:"modifyTime"`                                           // 修改时间
+	CompanyApprovalID int       `gorm:"column:company_approval_id;type:int(11);default:0" json:"companyApprovalId"`                   // 审批单id
+	ApprovalStatus    int8      `gorm:"column:approval_status;type:tinyint(4);default:0" json:"approvalStatus"`                       // 审批状态:1:待审批,2:已审批,3:已驳回
+	OperationStatus   int8      `gorm:"column:operation_status;type:tinyint(4);default:0" json:"operationStatus"`                     // 1:待审批,2:已审批
+	MessageType       int8      `gorm:"column:message_type;type:tinyint(4);default:0" json:"messageType"`                             // 1:申请消息,2:审批结果,3:文字消息
+	SourceType        int8      `gorm:"index:idx_source_typ;column:source_type;type:tinyint(4);default:1" json:"sourceType"`          // 消息来源类型,1:客户,2:合同,3:用印,4:指标替换,5:问答社区,6:问答评论
+	MessageInfo       string    `gorm:"column:message_info;type:text" json:"messageInfo"`                                             // 消息主要内容,json数据
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *CompanyApprovalMessage) TableName() string {
+	return "company_approval_message"
+}
+
+// CompanyApprovalMessageColumns get sql column name.获取数据库列名
+var CompanyApprovalMessageColumns = struct {
+	ID                string
+	CreateUserID      string
+	ReceiveUserID     string
+	MessageStatus     string
+	Remark            string
+	Content           string
+	CompanyID         string
+	CompanyName       string
+	CreateTime        string
+	ModifyTime        string
+	CompanyApprovalID string
+	ApprovalStatus    string
+	OperationStatus   string
+	MessageType       string
+	SourceType        string
+	MessageInfo       string
+}{
+	ID:                "id",
+	CreateUserID:      "create_user_id",
+	ReceiveUserID:     "receive_user_id",
+	MessageStatus:     "message_status",
+	Remark:            "remark",
+	Content:           "content",
+	CompanyID:         "company_id",
+	CompanyName:       "company_name",
+	CreateTime:        "create_time",
+	ModifyTime:        "modify_time",
+	CompanyApprovalID: "company_approval_id",
+	ApprovalStatus:    "approval_status",
+	OperationStatus:   "operation_status",
+	MessageType:       "message_type",
+	SourceType:        "source_type",
+	MessageInfo:       "message_info",
+}

+ 8 - 0
models/tables/company_approval_message/create.go

@@ -0,0 +1,8 @@
+package company_approval_message
+
+import "hongze/hongze_yb/global"
+
+func (yc *CompanyApprovalMessage) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(yc).Error
+	return
+}

+ 1 - 0
models/tables/company_approval_message/query.go

@@ -0,0 +1 @@
+package company_approval_message

+ 17 - 0
models/tables/company_approval_message/update.go

@@ -0,0 +1,17 @@
+package company_approval_message
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+/*func (yc *YbComment) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(yc).Select(updateCols).Updates(*yc).Error
+	return
+}*/
+
+// Cancel 消息作废
+func Cancel(companyApprovalId int, sourceType int8) (err error) {
+	sql1 := ` UPDATE company_approval_message SET message_status=2,modify_time=NOW() 
+WHERE company_approval_id=? AND source_type=?  AND message_type=1 AND operation_status=1`
+	err = global.DEFAULT_MYSQL.Exec(sql1, companyApprovalId, sourceType).Error
+	return
+}

+ 2 - 3
models/tables/customer_comment/customer_comment.go

@@ -1,14 +1,13 @@
 package customer_comment
 package customer_comment
 
 
 type CustomerComment struct {
 type CustomerComment struct {
-	Id           int `orm:"customer_comment(id)" `
+	Id           int `gorm:"primaryKey;column:id;"`
 	HeadImgUrl   string
 	HeadImgUrl   string
 	CustomerName string
 	CustomerName string
 	CompanyName  string
 	CompanyName  string
 	Comment      string
 	Comment      string
 }
 }
 
 
-func (d *CustomerComment) TableName() string  {
+func (d *CustomerComment) TableName() string {
 	return "customer_comment"
 	return "customer_comment"
 }
 }
-

+ 22 - 22
models/tables/my_chart/query.go

@@ -6,39 +6,39 @@ import (
 )
 )
 
 
 type MyChartList struct {
 type MyChartList struct {
-	MyChartId           int		`description:"我的图表主键"`
+	MyChartId           int `description:"我的图表主键"`
 	ChartInfoId         int
 	ChartInfoId         int
-	ChartName           string	`description:"来源名称"`
-	ChartClassifyId     int		`description:"图表分类id"`
+	ChartName           string `description:"来源名称"`
+	ChartClassifyId     int    `description:"图表分类id"`
 	SysUserId           int
 	SysUserId           int
 	SysUserRealName     string
 	SysUserRealName     string
-	UniqueCode          string	`description:"图表唯一编码"`
+	UniqueCode          string `description:"图表唯一编码"`
 	CreateTime          time.Time
 	CreateTime          time.Time
 	ModifyTime          time.Time
 	ModifyTime          time.Time
-	DateType            int		`description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
-	StartDate           string	`description:"自定义开始日期"`
-	EndDate             string	`description:"自定义结束日期"`
-	IsSetName           int		`description:"设置名称"`
-	EdbInfoIds          string	`description:"指标id"`
-	ChartType           int		`description:"生成样式:1:曲线图,2:季节性图"`
-	Calendar            string	`description:"公历/农历"`
-	SeasonStartDate     string	`description:"季节性图开始日期"`
-	SeasonEndDate       string	`description:"季节性图开始日期"`
-	ChartImage          string	`description:"图表图片"`
-	Sort                float64	`description:"排序字段,数字越小越排前面"`
-	IsAdd               bool	`description:"true:已加入我的图库,false:未加入我的图库"`
-	MyChartClassifyName string	`description:"分类名称,多个用英文逗号分割"`
-	MyChartClassifyId   string	`description:"分类id,多个用英文逗号分割"`
-	EdbEndDate          string	`description:"指标最新更新日期"`
+	DateType            int     `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
+	StartDate           string  `description:"自定义开始日期"`
+	EndDate             string  `description:"自定义结束日期"`
+	IsSetName           int     `description:"设置名称"`
+	EdbInfoIds          string  `description:"指标id"`
+	ChartType           int     `description:"生成样式:1:曲线图,2:季节性图"`
+	Calendar            string  `description:"公历/农历"`
+	SeasonStartDate     string  `description:"季节性图开始日期"`
+	SeasonEndDate       string  `description:"季节性图开始日期"`
+	ChartImage          string  `description:"图表图片"`
+	Sort                float64 `description:"排序字段,数字越小越排前面"`
+	IsAdd               bool    `description:"true:已加入我的图库,false:未加入我的图库"`
+	MyChartClassifyName string  `description:"分类名称,多个用英文逗号分割"`
+	MyChartClassifyId   string  `description:"分类id,多个用英文逗号分割"`
+	EdbEndDate          string  `description:"指标最新更新日期"`
 }
 }
 
 
 type MyChartView struct {
 type MyChartView struct {
-	MyChartId         int       `orm:"column(my_chart_id);pk"`
+	MyChartId         int       `description:"我的图表id"`
 	ChartInfoId       int       `description:"图表id"`
 	ChartInfoId       int       `description:"图表id"`
 	AdminId           int       `description:"用户id"`
 	AdminId           int       `description:"用户id"`
 	CreateTime        time.Time `description:"创建时间"`
 	CreateTime        time.Time `description:"创建时间"`
 	ModifyTime        time.Time `description:"修改时间"`
 	ModifyTime        time.Time `description:"修改时间"`
-	MyChartClassifyId string	`description:"我的图表分类ID"`
+	MyChartClassifyId string    `description:"我的图表分类ID"`
 	//Sort			  int		`description:"我的图表排序"`
 	//Sort			  int		`description:"我的图表排序"`
 }
 }
 
 
@@ -97,4 +97,4 @@ func GetMyChartById(myChartId int, myChartClassifyId string) (item *MyChartView,
 	err = global.MYSQL["data"].Raw(sql, myChartId, myChartClassifyId).First(&item).Error
 	err = global.MYSQL["data"].Raw(sql, myChartId, myChartClassifyId).First(&item).Error
 
 
 	return
 	return
-}
+}

+ 3 - 3
models/tables/rddp/banner/banner.go

@@ -3,7 +3,7 @@ package banner
 import "time"
 import "time"
 
 
 type Banner struct {
 type Banner struct {
-	Id             int       `orm:"column(id);pk"`
+	Id             int       `gorm:"primaryKey;column:id;"`
 	ClassifyId     int       `description:"分类id"`
 	ClassifyId     int       `description:"分类id"`
 	ImageUrl       string    `description:"图片路径"`
 	ImageUrl       string    `description:"图片路径"`
 	BannerType     int       `description:"类型 1:轮播图,2:头部海报"`
 	BannerType     int       `description:"类型 1:轮播图,2:头部海报"`
@@ -21,6 +21,6 @@ type Banner struct {
 	ReportImgUrl   string    `description:"报告配图"`
 	ReportImgUrl   string    `description:"报告配图"`
 }
 }
 
 
-func (c *Banner) TableName() string  {
+func (c *Banner) TableName() string {
 	return "banner"
 	return "banner"
-}
+}

+ 23 - 24
models/tables/rddp/report/report.go

@@ -3,38 +3,37 @@ package report
 import "time"
 import "time"
 
 
 type Report struct {
 type Report struct {
-	Id                 int    `orm:"column(id)" description:"报告Id" json:"_"`
-	AddType            int    `description:"新增方式:1:新增报告,2:继承报告" json:"add_type"`
-	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
-	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
-	ClassifyIdSecond   int    `description:"二级分类id" json:"classify_id_second"`
-	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
-	Title              string `description:"标题" json:"title"`
-	Abstract           string `description:"摘要" json:"abstract"`
-	Author             string `description:"作者" json:"author"`
-	Frequency          string `description:"频度" json:"frequency"`
+	Id                 int       `gorm:"primaryKey;column:id;" description:"报告Id" json:"-"`
+	AddType            int       `description:"新增方式:1:新增报告,2:继承报告" json:"add_type"`
+	ClassifyIdFirst    int       `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int       `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string    `description:"二级分类名称" json:"classify_name_second"`
+	Title              string    `description:"标题" json:"title"`
+	Abstract           string    `description:"摘要" json:"abstract"`
+	Author             string    `description:"作者" json:"author"`
+	Frequency          string    `description:"频度" json:"frequency"`
 	CreateTime         time.Time `description:"创建时间" json:"create_time"`
 	CreateTime         time.Time `description:"创建时间" json:"create_time"`
 	ModifyTime         time.Time `description:"修改时间" json:"modify_time"`
 	ModifyTime         time.Time `description:"修改时间" json:"modify_time"`
-	State              int    `description:"1:未发布,2:已发布" json:"state"`
+	State              int       `description:"1:未发布,2:已发布" json:"state"`
 	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
 	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
-	Stage              int    `description:"期数" json:"stage"`
-	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是" json:"msg_is_send"`
-	Content            string `description:"内容" json:"content"`
-	VideoUrl           string `description:"音频文件URL" json:"video_url"`
-	VideoName          string `description:"音频文件名称" json:"video_name"`
-	VideoSize          string `description:"音频文件大小,单位M" json:"video_size"`
-	VideoPlaySeconds   string `description:"音频播放时长" json:"video_play_seconds"`
-	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
-	ThsMsgIsSend       int    `description:"客户群消息是否已发送,0:否,1:是" json:"ths_msg_is_send"`
-	StageStr           string `description:"期数" json:"stage_str"`
+	Stage              int       `description:"期数" json:"stage"`
+	MsgIsSend          int       `description:"消息是否已发送,0:否,1:是" json:"msg_is_send"`
+	Content            string    `description:"内容" json:"content"`
+	VideoUrl           string    `description:"音频文件URL" json:"video_url"`
+	VideoName          string    `description:"音频文件名称" json:"video_name"`
+	VideoSize          string    `description:"音频文件大小,单位M" json:"video_size"`
+	VideoPlaySeconds   string    `description:"音频播放时长" json:"video_play_seconds"`
+	ContentSub         string    `description:"内容前两个章节" json:"content_sub"`
+	ThsMsgIsSend       int       `description:"客户群消息是否已发送,0:否,1:是" json:"ths_msg_is_send"`
+	StageStr           string    `description:"期数" json:"stage_str"`
 }
 }
 
 
 type UnReadItem struct {
 type UnReadItem struct {
-	ReportID           int
-	ClassifyNameFirst  string
+	ReportID          int
+	ClassifyNameFirst string
 }
 }
 
 
-
 func (r *Report) TableName() string {
 func (r *Report) TableName() string {
 	return "report"
 	return "report"
 }
 }

+ 11 - 11
models/tables/rddp/report_view_record/report_view_record.go

@@ -3,17 +3,17 @@ package report_view_record
 import "time"
 import "time"
 
 
 type ReportViewRecord struct {
 type ReportViewRecord struct {
-	Id          int       `orm:"column(id);pk"`
-	UserId      int       `description:"用户id"`
-	ReportId    int       `description:"报告id"`
-	Mobile      string    `description:"手机号"`
-	Email       string    `description:"邮箱"`
-	RealName    string    `description:"用户实际姓名"`
-	CompanyName string    `description:"公司名称"`
-	CreateTime  time.Time `description:"创建时间"`
-	ReportChapterId     int `description:"报告章节ID,0表示目录页"`
+	Id              int       `gorm:"primaryKey;column:id;"`
+	UserId          int       `description:"用户id"`
+	ReportId        int       `description:"报告id"`
+	Mobile          string    `description:"手机号"`
+	Email           string    `description:"邮箱"`
+	RealName        string    `description:"用户实际姓名"`
+	CompanyName     string    `description:"公司名称"`
+	CreateTime      time.Time `description:"创建时间"`
+	ReportChapterId int       `description:"报告章节ID,0表示目录页"`
 }
 }
 
 
-func (r *ReportViewRecord) TableName() string  {
+func (r *ReportViewRecord) TableName() string {
 	return "report_view_record"
 	return "report_view_record"
-}
+}

+ 11 - 0
models/tables/report_send_ths_detail/create.go

@@ -0,0 +1,11 @@
+package models
+
+import "hongze/hongze_yb/global"
+
+//新增报告发送给同花顺的记录
+func AddReportSendThsDetail(item *ReportSendThsDetail) (lastId int, err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	lastId = item.SendId
+	return
+}
+

+ 16 - 0
models/tables/report_send_ths_detail/query.go

@@ -0,0 +1,16 @@
+package models
+
+import "hongze/hongze_yb/global"
+
+//根据报告id获取发送记录
+func GetVoiceSendThsDetailById(voiceId int, reportType string) (item *ReportSendThsDetail, err error) {
+	err = global.DEFAULT_MYSQL.Model(ReportSendThsDetail{}).Where("report_id = ? AND report_type=?", voiceId,reportType).Order("send_id DESC").Scan(&item).Error
+	return
+}
+
+// GetLatelyReportSendThsDetail 获取发送中/发送成功的 距离现在最近的一条记录
+func GetLatelyReportSendThsDetail() (item *ReportSendThsDetail, err error) {
+	err = global.DEFAULT_MYSQL.Model(ReportSendThsDetail{}).Where(" status >=0").Order("push_time desc,send_id desc").Scan(&item).Error
+	return
+}
+

+ 20 - 0
models/tables/report_send_ths_detail/report_send_ths_detail.go

@@ -0,0 +1,20 @@
+package models
+
+import (
+	"time"
+)
+
+//报告推送给同花顺的表结构体
+type ReportSendThsDetail struct {
+	SendId     int       `gorm:"primaryKey;column:send_id;" description:"发送给同花顺的Id"`
+	ReportId   int       `description:"报告id"`
+	ReportType string    `description:"报告类型"`
+	Status     int8      `description:"发送结果,0:待发送,-1发送失败,1发送成功"`
+	Remark     string    `description:"失败原因"`
+	PushTime   time.Time `description:"实际开始推送时间/预推送时间"`
+	CreateTime time.Time `description:"发送时间"`
+}
+
+func (r *ReportSendThsDetail) TableName() string {
+	return "report_send_ths_detail"
+}

+ 14 - 0
models/tables/report_send_ths_detail/update.go

@@ -0,0 +1,14 @@
+package models
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+//修改报告发送给同花顺的记录状态
+func ModifyReportSendThsDetailStatus(sendId int, status int8, remark string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(ReportSendThsDetail{}).Where("send_id = ? ", sendId).Updates(ReportSendThsDetail{
+		Status:     status,
+		Remark:     remark,
+	}).Error
+	return
+}

+ 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
+}

+ 41 - 0
models/tables/sandbox/query.go

@@ -0,0 +1,41 @@
+package sandbox
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+// GetBySandboxId 根据沙盘ID查询详情
+func GetBySandboxId(id uint32) (item *Sandbox, err error) {
+	err = global.DEFAULT_MYSQL.Where("sandbox_id = ? and is_delete=0 ", id).Order("sandbox_id desc").First(&item).Error
+	return
+}
+
+// GetPageListByWhere 分页获取活动列表
+func GetPageListByWhere(condition string, pars []interface{}, startSize, pageSize int) (total int64, list []*Sandbox, err error) {
+	// 获取查询总数量
+	err = global.DEFAULT_MYSQL.Model(Sandbox{}).Where(condition, pars...).Count(&total).Error
+	if err != nil {
+		return
+	}
+
+	// 获取列表数据
+	err = global.DEFAULT_MYSQL.Model(Sandbox{}).Where(condition, pars...).Order("modify_time desc,sandbox_id desc").Offset(startSize).Limit(pageSize).Find(&list).Error
+	return
+}
+
+// PermissionSandboxCount 品种下沙盘数
+type PermissionSandboxCount struct {
+	ChartPermissionID   uint32 `gorm:"column:chart_permission_id;type:int(9) unsigned;not null;default:0" json:"chart_permission_id"`                                  // 品种id
+	ChartPermissionName string `gorm:"index:idx_chart_permission_name;column:chart_permission_name;type:varchar(32);not null;default:''" json:"chart_permission_name"` // 品种名称(冗余字段,避免列表页查询时再去关联表查询)
+	Total               int64  `json:"total"`                                                                                                                          // 汇总数
+}
+
+// GetPermissionCountListByWhere 获取各品种的沙盘数
+func GetPermissionCountListByWhere(condition string, pars []interface{}) (list []*PermissionSandboxCount, err error) {
+
+	//err = global.DEFAULT_MYSQL.Model(ResearchReport{}).Where("research_report_id IN (?)", ids).Scan(&list).Error
+
+	// 获取列表数据
+	err = global.DEFAULT_MYSQL.Model(Sandbox{}).Select("chart_permission_id,chart_permission_name,count(1) total").Where(condition, pars...).Order("modify_time desc,sandbox_id desc").Group("chart_permission_id").Scan(&list).Error
+	return
+}

+ 58 - 0
models/tables/sandbox/sandbox.go

@@ -0,0 +1,58 @@
+package sandbox
+
+import (
+	"time"
+)
+
+// Sandbox 沙盘推演主表
+type Sandbox struct {
+	SandboxID           uint32    `gorm:"primaryKey;column:sandbox_id;type:int(9) unsigned;not null" json:"-"`                                                          // 沙盘id
+	Name                string    `gorm:"index:idx_name;column:name;type:varchar(64);not null;default:''" json:"name"`                                                  // 沙盘名称
+	ChartPermissionID   uint32    `gorm:"column:chart_permission_id;type:int(9) unsigned;not null;default:0" json:"chartPermissionId"`                                  // 品种id
+	ChartPermissionName string    `gorm:"index:idx_chart_permission_name;column:chart_permission_name;type:varchar(32);not null;default:''" json:"chartPermissionName"` // 品种名称(冗余字段,避免列表页查询时再去关联表查询)
+	CurrVersion         uint32    `gorm:"column:curr_version;type:int(9) unsigned;not null;default:0" json:"currVersion"`                                               // 当前版本
+	Code                string    `gorm:"column:code;type:varchar(255);not null" json:"code"`                                                                           // 沙盘code
+	Content             string    `gorm:"column:content;type:text;not null" json:"content"`                                                                             // 沙盘内容
+	PicURL              string    `gorm:"column:pic_url;type:varchar(255);not null;default:''" json:"picUrl"`                                                           // 沙盘图片
+	OpUserID            uint32    `gorm:"column:op_user_id;type:int(10) unsigned;not null;default:0" json:"opUserId"`                                                   // 最近一次编辑操作的用户id
+	OpUserName          string    `gorm:"index:idx_op_user_name;column:op_user_name;type:varchar(32);not null;default:''" json:"opUserName"`                            // 最近一次编辑的用户名称(冗余字段,避免查表)
+	IsDelete            uint8     `gorm:"column:is_delete;type:tinyint(9) unsigned;not null;default:0" json:"isDelete"`                                                 // 是否删除,0:未删除,1:已删除
+	ModifyTime          time.Time `gorm:"column:modify_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                                // 最近一次更新时间
+	CreateTime          time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"`                                                // 沙盘创建时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *Sandbox) TableName() string {
+	return "sandbox"
+}
+
+// SandboxColumns get sql column name.获取数据库列名
+var SandboxColumns = struct {
+	SandboxID           string
+	Name                string
+	ChartPermissionID   string
+	ChartPermissionName string
+	CurrVersion         string
+	Code                string
+	Content             string
+	PicURL              string
+	OpUserID            string
+	OpUserName          string
+	IsDelete            string
+	ModifyTime          string
+	CreateTime          string
+}{
+	SandboxID:           "sandbox_id",
+	Name:                "name",
+	ChartPermissionID:   "chart_permission_id",
+	ChartPermissionName: "chart_permission_name",
+	CurrVersion:         "curr_version",
+	Code:                "code",
+	Content:             "content",
+	PicURL:              "pic_url",
+	OpUserID:            "op_user_id",
+	OpUserName:          "op_user_name",
+	IsDelete:            "is_delete",
+	ModifyTime:          "modify_time",
+	CreateTime:          "create_time",
+}

+ 17 - 0
models/tables/sys_role_admin/query.go

@@ -0,0 +1,17 @@
+package sys_role_admin
+
+import "hongze/hongze_yb/global"
+
+func GetVoiceAdmin(adminId int) (item *SysRoleAdmin, err error) {
+	if global.CONFIG.Serve.RunMode == "release" {
+		err = global.DEFAULT_MYSQL.Model(SysRoleAdmin{}).Where("role_id=32 AND admin_id=?",adminId).First(&item).Error
+	}else {
+		err = global.DEFAULT_MYSQL.Model(SysRoleAdmin{}).Where("role_id=33 AND admin_id=?",adminId).First(&item).Error
+	}
+	return
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *SysRoleAdmin) TableName() string {
+	return "sys_role_admin"
+}

+ 8 - 0
models/tables/sys_role_admin/sys_role_admin.go

@@ -0,0 +1,8 @@
+package sys_role_admin
+
+type SysRoleAdmin struct {
+	Id         int
+	RoleId     int
+	AdminId    int
+	CreateTime string
+}

+ 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
+}

+ 15 - 0
models/tables/voice_broadcast/create.go

@@ -0,0 +1,15 @@
+package voice_broadcast
+
+import "hongze/hongze_yb/global"
+
+// AddVoiceBroadcast 新增记录
+func (voiceBroadcast *VoiceBroadcast) AddVoiceBroadcast() (err error) {
+	err = global.DEFAULT_MYSQL.Create(voiceBroadcast).Error
+	return
+}
+
+// Update 更新语音播报
+func (voiceBroadcast *VoiceBroadcast) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(voiceBroadcast).Select(updateCols).Updates(*voiceBroadcast).Error
+	return
+}

+ 9 - 0
models/tables/voice_broadcast/delete.go

@@ -0,0 +1,9 @@
+package voice_broadcast
+
+import "hongze/hongze_yb/global"
+
+// DelVoiceBroadcast 删除记录
+func (voiceBroadcast *VoiceBroadcast) DelVoiceBroadcast() (err error) {
+	err = global.DEFAULT_MYSQL.Delete(&voiceBroadcast).Error
+	return
+}

+ 31 - 0
models/tables/voice_broadcast/query.go

@@ -0,0 +1,31 @@
+package voice_broadcast
+
+import "hongze/hongze_yb/global"
+
+func GetBroadcastByCondition(pageIndex, pageSize, sectionId int) (list []*VoiceBroadcast, err error) {
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(VoiceBroadcast{}).Where("section_id=?", sectionId).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
+	return
+}
+
+func GetBroadcastByIdAndPage(pageIndex, pageSize, broadcastId int) (list []*VoiceBroadcast, err error) {
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(VoiceBroadcast{}).Where("broadcast_id=?", broadcastId).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
+	return
+}
+
+func GetBroadcast(pageIndex, pageSize int) (list []*VoiceBroadcast, err error) {
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(VoiceBroadcast{}).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
+	return
+}
+
+func GetBroadcastById(broadcastId int) (list *VoiceBroadcast, err error) {
+	err = global.DEFAULT_MYSQL.Model(VoiceBroadcast{}).Where("broadcast_id=?", broadcastId).First(&list).Error
+	return
+}
+
+func GetBroadcastList() (list []*VoiceBroadcast, err error) {
+	err = global.DEFAULT_MYSQL.Model(VoiceBroadcast{}).Scan(&list).Error
+	return
+}

+ 24 - 0
models/tables/voice_broadcast/voice_broadcast.go

@@ -0,0 +1,24 @@
+package voice_broadcast
+
+type VoiceBroadcast struct {
+	BroadcastId      int    `gorm:"primaryKey;column:broadcast_id;type:int(11)" description:"语音ID"`
+	BroadcastName    string `description:"语音名称"`
+	SectionId        int    `description:"语音分类ID"`
+	SectionName      string `description:"语音分类名称"`
+	VarietyId        int    `description:"品种id"`
+	VarietyName      string `description:"品种名称"`
+	AuthorId         int    `description:"作者id"`
+	Author           string `description:"作者"`
+	ImgUrl           string `description:"背景图url"`
+	VoiceUrl         string `description:"音频url"`
+	VoicePlaySeconds string `description:"音频时长"`
+	VoiceSize        string `description:"音频大小"`
+	CreateTime       string `description:"创建时间"`
+	MsgState         int    `description:"消息推送状态:0-待推送 1-已推送"`
+	MsgTime          string `description:"消息推送时间"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *VoiceBroadcast) TableName() string {
+	return "yb_voice_broadcast"
+}

+ 9 - 0
models/tables/voice_broadcast_statistics/create.go

@@ -0,0 +1,9 @@
+package voice_broadcast_statistics
+
+import "hongze/hongze_yb/global"
+
+// AddBroadcastStatistics 新增记录
+func (voiceBroadcastStatistics *VoiceBroadcastStatistics) AddBroadcastStatistics() (err error) {
+	err = global.DEFAULT_MYSQL.Create(voiceBroadcastStatistics).Error
+	return
+}

+ 28 - 0
models/tables/voice_broadcast_statistics/voice_broadcast_statistics.go

@@ -0,0 +1,28 @@
+package voice_broadcast_statistics
+
+type VoiceBroadcastStatistics struct {
+	Id            int    `gorm:"primaryKey;column:id;"`
+	CompanyId     int    `description:"客户ID"`
+	CompanyName   string `description:"客户名称"`
+	UserId        int    `description:"用户ID"`
+	RealName      string `description:"用户名称"`
+	Mobile        string `description:"用户手机号"`
+	Email         string `description:"电子邮箱"`
+	CompanyStatus string `description:"客户状态"`
+	Source        int    `description:"点击来源,1手机小程序,2pc小程序,3web端"`
+	BroadcastId   int    `description:"语音ID"`
+	BroadcastName string `description:"语音名称"`
+	SectionId     int    `description:"语音分类ID"`
+	SectionName   string `description:"语音分类名称"`
+	VarietyId     int    `description:"品种id"`
+	VarietyName   string `description:"品种名称"`
+	AuthorId      int    `description:"作者id"`
+	Author        string `description:"语音管理员"`
+	PublishTime   string `description:"发布时间"`
+	CreateTime    string `description:"访问时间"`
+}
+
+// TableName 表名变更
+func (voiceBroadcastStatistics *VoiceBroadcastStatistics) TableName() string {
+	return "yb_voice_broadcast_statistics"
+}

+ 24 - 0
models/tables/voice_section/query.go

@@ -0,0 +1,24 @@
+package voice_section
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/voice_broadcast"
+)
+
+// GetVoiceSection 查询所有语音播报章节
+func GetVoiceSection() (list []*VoiceSection, err error) {
+	err = global.DEFAULT_MYSQL.Order("create_time").Find(&list).Error
+	return
+}
+
+// GetVoiceSection 查询所有语音播报章节
+func GetVoiceVariety() (list []*VoiceSection, err error) {
+	err = global.DEFAULT_MYSQL.Group("variety_id").Order("create_time").Find(&list).Error
+	return
+}
+
+// GetVoiceSectionFromBroadcast 查询所有语音播报章节
+func GetVoiceSectionFromBroadcast(bannedIds []int) (list []*voice_broadcast.VoiceBroadcast, err error) {
+	err = global.DEFAULT_MYSQL.Where("section_id IN (?)", bannedIds).Group("section_id").Find(&list).Error
+	return
+}

+ 16 - 0
models/tables/voice_section/voice_section.go

@@ -0,0 +1,16 @@
+package voice_section
+
+type VoiceSection struct {
+	SectionId   int    `gorm:"primaryKey;column:section_id;" description:"板块id"`
+	SectionName string `description:"板块名称"`
+	VarietyId   int    `description:"品种id"`
+	VarietyName string `description:"品种名称"`
+	Status      int    `description:"角色状态"`
+	ImgUrl      string `description:"背景图url"`
+	CreateTime  string `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (voiceSection *VoiceSection) TableName() string {
+	return "yb_voice_section"
+}

+ 22 - 1
models/tables/wx_user/query.go

@@ -39,4 +39,25 @@ func GetByUserId(userId int) (wxUser *WxUser, err error) {
 func GetByUserIds(userIds []uint64) (list []*WxUser, err error) {
 func GetByUserIds(userIds []uint64) (list []*WxUser, err error) {
 	err = global.DEFAULT_MYSQL.Model(WxUser{}).Where("user_id in  ? ", userIds).Scan(&list).Error
 	err = global.DEFAULT_MYSQL.Model(WxUser{}).Where("user_id in  ? ", userIds).Scan(&list).Error
 	return
 	return
-}
+}
+
+type OpenIdList struct {
+	OpenID string
+	UserID int
+}
+
+func GetOpenIdList() (items []*OpenIdList, err error) {
+	sql := `SELECT DISTINCT ur.open_id,wu.user_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          INNER JOIN company_product AS d ON c.company_id=d.company_id
+		INNER join user_record  as ur on wu.user_id=ur.user_id
+          WHERE ur.open_id != "" AND ur.subscribe=1 and ur.create_platform=1 AND  d.status IN('正式','试用','永续') `
+
+	err = global.DEFAULT_MYSQL.Raw(sql).Scan(&items).Error
+	return
+}
+
+func ModifyQaAvatarUrl(qaAvatarUrl string, userId uint64) (err error) {
+	err = global.DEFAULT_MYSQL.Model(WxUser{}).Where("user_id=?", userId).Update("qa_avatar_url", qaAvatarUrl).Error
+	return err
+}

+ 2 - 1
models/tables/wx_user/wx_user.go

@@ -7,7 +7,7 @@ import (
 // WxUser 联系人表
 // WxUser 联系人表
 type WxUser struct {
 type WxUser struct {
 	UserID              uint64    `gorm:"primaryKey;column:user_id;type:bigint(20) unsigned;not null" json:"userId"` // 用户id
 	UserID              uint64    `gorm:"primaryKey;column:user_id;type:bigint(20) unsigned;not null" json:"userId"` // 用户id
-	OpenID              string    `gorm:"index:open_id;column:open_id;type:varchar(32)" json:"openId"`          // open_id
+	OpenID              string    `gorm:"index:open_id;column:open_id;type:varchar(32)" json:"openId"`               // open_id
 	UnionID             string    `gorm:"column:union_id;type:varchar(64)" json:"unionId"`
 	UnionID             string    `gorm:"column:union_id;type:varchar(64)" json:"unionId"`
 	Subscribe           int8      `gorm:"column:subscribe;type:tinyint(1)" json:"subscribe"`                                                 // 是否关注
 	Subscribe           int8      `gorm:"column:subscribe;type:tinyint(1)" json:"subscribe"`                                                 // 是否关注
 	CompanyID           int64     `gorm:"index:inx_company_id;column:company_id;type:bigint(20)" json:"companyId"`                           // 客户id
 	CompanyID           int64     `gorm:"index:inx_company_id;column:company_id;type:bigint(20)" json:"companyId"`                           // 客户id
@@ -56,6 +56,7 @@ type WxUser struct {
 	OutboundMobile      string    `gorm:"index:outbound_mobile;column:outbound_mobile;type:varchar(30);default:''" json:"outboundMobile"` // 外呼手机号
 	OutboundMobile      string    `gorm:"index:outbound_mobile;column:outbound_mobile;type:varchar(30);default:''" json:"outboundMobile"` // 外呼手机号
 	OutboundCountryCode string    `gorm:"column:outbound_country_code;type:varchar(10);default:''" json:"outboundCountryCode"`            // 外呼手机号区号
 	OutboundCountryCode string    `gorm:"column:outbound_country_code;type:varchar(10);default:''" json:"outboundCountryCode"`            // 外呼手机号区号
 	IsMsgOutboundMobile int8      `gorm:"column:is_msg_outbound_mobile;type:tinyint(1);not null;default:0" json:"isMsgOutboundMobile"`    // 是否弹窗过绑定过外呼手机号
 	IsMsgOutboundMobile int8      `gorm:"column:is_msg_outbound_mobile;type:tinyint(1);not null;default:0" json:"isMsgOutboundMobile"`    // 是否弹窗过绑定过外呼手机号
+	QaAvatarUrl         string    `gorm:"column:qa_avatar_url;type:varchar(255);not null;default:''" json:"qaAvatarUrl"`   // 问答社区头像
 }
 }
 
 
 // TableName get sql table name.获取数据库表名
 // TableName get sql table name.获取数据库表名

+ 18 - 0
models/tables/yb_comment_anonymous_user/create.go

@@ -0,0 +1,18 @@
+package yb_comment_anonymous_user
+
+import (
+	"hongze/hongze_yb/global"
+	"time"
+)
+
+func (item *YbCommentAnonymousUser) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommentAnonymousUser{}).Create(item).Error
+	return
+}
+
+// CreateBySql 通过sql创建记录
+func CreateBySql(userId uint64, createTime time.Time) (err error) {
+	sql := "INSERT INTO `yb_comment_anonymous_user` (`user_id`,`create_time`) VALUES (?,?)"
+	err = global.DEFAULT_MYSQL.Exec(sql, userId, createTime).Error
+	return
+}

+ 15 - 0
models/tables/yb_comment_anonymous_user/query.go

@@ -0,0 +1,15 @@
+package yb_comment_anonymous_user
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetByUserId 根据用户ID,查询记录
+func GetByUserId(userId uint64) (item *YbCommentAnonymousUser, err error) {
+	err = global.DEFAULT_MYSQL.Where("user_id =  ? ", userId).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 25 - 0
models/tables/yb_comment_anonymous_user/yb_comment_anonymous_user.go

@@ -0,0 +1,25 @@
+package yb_comment_anonymous_user
+
+import (
+	"time"
+)
+
+// YbCommentAnonymousUser 问答社区评论匿名表
+type YbCommentAnonymousUser struct {
+	UserID     uint64    `gorm:"primaryKey;column:user_id;type:bigint(9) unsigned;not null;default:0" json:"-"` // 用户id
+	CreateTime time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"` // 添加时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommentAnonymousUser) TableName() string {
+	return "yb_comment_anonymous_user"
+}
+
+// YbCommentAnonymousUserColumns get sql column name.获取数据库列名
+var YbCommentAnonymousUserColumns = struct {
+	UserID     string
+	CreateTime string
+}{
+	UserID:     "user_id",
+	CreateTime: "create_time",
+}

+ 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(),

+ 8 - 0
models/tables/yb_community_question_comment/create.go

@@ -0,0 +1,8 @@
+package yb_community_question_comment
+
+import "hongze/hongze_yb/global"
+
+func (item *YbCommunityQuestionComment) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 129 - 0
models/tables/yb_community_question_comment/query.go

@@ -0,0 +1,129 @@
+package yb_community_question_comment
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetByCommunityQuestionCommentId 根据留言ID,查询留言
+func GetByCommunityQuestionCommentId(communityQuestionCommentId uint64) (item *YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Where("community_question_comment_id =  ? ", communityQuestionCommentId).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetListByUserIdCommunityQuestionID 获取用户的留言列表
+func GetListByUserIdCommunityQuestionID(userId uint64, communityQuestionID int) (list []*YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("user_id = ? AND community_question_id = ? AND enabled = 1 ", userId, communityQuestionID).
+		Order("create_time desc, community_question_comment_id desc").
+		Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetListTotalByUserIdCommunityQuestionID 获取用户的留言总条数
+func GetListTotalByUserIdCommunityQuestionID(userId uint64, communityQuestionID int) (total int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("user_id = ? AND community_question_id = ? AND enabled = 1 ", userId, communityQuestionID).
+		Count(&total).Error
+	return
+}
+
+// GetHotListByCommunityQuestionID 获取报告的精选留言列表
+func GetHotListByCommunityQuestionID(communityQuestionID int, offset, limit int) (list []*YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("community_question_id = ? AND enabled = 1 AND is_hot = 1 AND type = 1", communityQuestionID).
+		Order("is_top desc, hot_top_time desc, community_question_comment_id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&list).Error
+	return
+}
+
+// GetHotListTotalByCommunityQuestionID 获取精选留言总条数
+func GetHotListTotalByCommunityQuestionID(communityQuestionID int) (total int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("community_question_id = ? AND enabled = 1 AND is_hot = 1 AND type = 1", communityQuestionID).
+		Count(&total).Error
+	return
+}
+
+// GetReplyListByReplyCommentId 获取报告的精选留言的回复列表
+func GetReplyListByReplyCommentId(replyCommentIds []uint64) (list []*YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("enabled = 1 and type = 2 and reply_comment_id in ?", replyCommentIds).
+		Order("community_question_comment_id asc").
+		Scan(&list).Error
+	return
+}
+
+type SimpleYbCommunityQuestionComment struct {
+	CommunityQuestionCommentID uint64 `gorm:"primaryKey;column:community_question_comment_id;type:bigint(20) unsigned;not null" json:"-"`
+	UserID                     uint64 `gorm:"column:user_id;type:bigint(20) unsigned;not null;default:0" json:"userId"` // 用户id
+	Type                       int8   `gorm:"column:type;type:tinyint(1);not null;default:1" json:"type"`               // 留言类型 1-评论 2-回复
+	Enabled                    int8   `gorm:"column:enabled;type:tinyint(1);not null;default:1" json:"enabled"`         // 是否有效, 0-无效留言 1-有效留言
+}
+
+// GetSimpleByCommentId 根据留言ID,查询留言
+func GetSimpleByCommentId(commentId uint64) (item *SimpleYbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Select("community_question_comment_id, user_id, type, enabled").
+		Where("community_question_comment_id = ?", commentId).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetMyLatestComment 获取用户最新的留言
+func GetMyLatestComment(userId uint64) (item *YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Select("comment_id, user_id, type, enabled, is_show_name").
+		Where("user_id = ? and type=1", userId).Order("community_question_comment_id desc").First(&item).Error
+	return
+}
+
+// NumCommentByCommunityQuestion 评论统计结构体
+type NumCommentByCommunityQuestion struct {
+	CommunityQuestionID uint32 `json:"community_question_id"`
+	Total               int    `json:"total"`
+}
+
+// GetNumCommentByCommunityQuestionIds 获取用户留言的汇总数
+func GetNumCommentByCommunityQuestionIds(communityQuestionIds []uint32, userId uint64) (item []*NumCommentByCommunityQuestion, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Select("community_question_id, count(1) total").
+		Where("community_question_id in (?) and type=1 and enabled = 1 and (is_hot = 1 or user_id=?) ", communityQuestionIds, userId).Group("community_question_id").Scan(&item).Error
+	return
+}
+
+// GetLastHotListByCommunityQuestionIds 根据问答id列表获取最近精选的留言
+func GetLastHotListByCommunityQuestionIds(communityQuestionIds []uint32) (items []*YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("community_question_comment_id in (SELECT MAX(community_question_comment_id) AS community_question_comment_id FROM yb_community_question_comment WHERE community_question_id IN (?) AND enabled = 1 AND is_hot = 1 AND type = 1 GROUP BY community_question_id)", communityQuestionIds).
+		Find(&items).Error
+	return
+}
+
+// GetLastMyListByCommunityQuestionIds 根据问答id列表获取我最近的留言
+func GetLastMyListByCommunityQuestionIds(userId uint64, communityQuestionIds []uint32) (items []*YbCommunityQuestionComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionComment{}).
+		Where("community_question_comment_id in (SELECT MAX(community_question_comment_id) AS community_question_comment_id FROM yb_community_question_comment WHERE user_id=? AND community_question_id IN (?) AND enabled = 1 AND type = 1 GROUP BY community_question_id)", userId, communityQuestionIds).
+		Find(&items).Error
+	return
+}
+
+type UserAvatarRandom struct {
+	AvatarUrl string
+}
+
+func GetUserAvatarRandom() (item *UserAvatarRandom, err error) {
+	sql := ` select * from user_avatar_random order by rand() limit 1 `
+	err = global.DEFAULT_MYSQL.Raw(sql).Scan(&item).Error
+	return
+}

+ 40 - 0
models/tables/yb_community_question_comment/update.go

@@ -0,0 +1,40 @@
+package yb_community_question_comment
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+func (item *YbCommunityQuestionComment) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(item).Select(updateCols).Updates(*item).Error
+	return
+}
+
+// Delete 软删除,隐藏评论
+func Delete(userId uint64, commentId uint64) (err error) {
+	tx := global.DEFAULT_MYSQL.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	sql1 := ` UPDATE yb_community_question_comment
+			SET
+            	enabled = 0,
+				modify_time = NOW(),
+				is_hot = 0,
+				is_top = 0
+			WHERE type = 1 and user_id = ? and community_question_comment_id = ?`
+	err = tx.Exec(sql1, userId, commentId).Error
+	if err != nil {
+		return
+	}
+	// 删除相关联的回复
+	sql2 := ` UPDATE yb_community_question_comment
+			SET
+            	enabled = 0,
+				modify_time = NOW()
+			WHERE reply_comment_id = ? and type = 2`
+	err = tx.Exec(sql2, commentId).Error
+	return
+}

+ 71 - 0
models/tables/yb_community_question_comment/yb_community_question_comment.go

@@ -0,0 +1,71 @@
+package yb_community_question_comment
+
+import (
+	"time"
+)
+
+// YbCommunityQuestionComment 研报问答社区 用户留言表
+type YbCommunityQuestionComment struct {
+	CommunityQuestionCommentID uint64    `gorm:"primaryKey;column:community_question_comment_id;type:bigint(20) unsigned;not null" json:"-"`
+	CommunityQuestionID        uint32    `gorm:"column:community_question_id;type:int(10) unsigned;not null;default:0" json:"communityQuestionId"` // 问答ID
+	UserID                     uint64    `gorm:"column:user_id;type:bigint(20) unsigned;not null;default:0" json:"userId"`                         // 用户id
+	RealName                   string    `gorm:"column:real_name;type:varchar(255);not null;default:''" json:"realName"`                           // 用户当时昵称
+	Content                    string    `gorm:"column:content;type:text" json:"content"`                                                          // 留言内容
+	ReplyCommentID             uint64    `gorm:"column:reply_comment_id;type:bigint(20) unsigned;not null;default:0" json:"replyCommentId"`        // 回复的留言ID
+	IsTop                      int8      `gorm:"column:is_top;type:tinyint(2);not null;default:0" json:"isTop"`                                    // 是否置顶(0-未置顶,1-置顶)
+	IsHot                      int8      `gorm:"column:is_hot;type:tinyint(2);not null;default:0" json:"isHot"`                                    // 是否设置精选(0-未设置,1-已设置)
+	HotTopTime                 time.Time `gorm:"column:hot_top_time;type:datetime" json:"hotTopTime"`                                              // 设置精选或者设置置顶的时间
+	Type                       int8      `gorm:"column:type;type:tinyint(1);not null;default:1" json:"type"`                                       // 留言类型 1-评论 2-回复
+	Enabled                    int8      `gorm:"column:enabled;type:tinyint(1);not null;default:1" json:"enabled"`                                 // 是否有效, 0-无效留言 1-有效留言
+	IsShowName                 int8      `gorm:"column:is_show_name;type:tinyint(1);not null;default:0" json:"isShowName"`                         // 是否匿名 0-匿名,1-不匿名
+	SourceAgent                int8      `gorm:"column:source_agent;type:tinyint(1);not null;default:1" json:"sourceAgent"`                        // 留言入口来源,1:小程序,2:小程序pc, 4:web pc
+	TopTime                    time.Time `gorm:"column:top_time;type:datetime" json:"topTime"`                                                     // 设置置顶的时间
+	HotTime                    time.Time `gorm:"column:hot_time;type:datetime" json:"hotTime"`                                                     // 设置精选的时间
+	ModifyTime                 time.Time `gorm:"column:modify_time;type:datetime;not null;default:CURRENT_TIMESTAMP" json:"modifyTime"`            // 修改时间
+	CreateTime                 time.Time `gorm:"column:create_time;type:datetime;not null;default:CURRENT_TIMESTAMP" json:"createTime"`            // 创建时间
+	QaAvatarUrl                string    `gorm:"column:qa_avatar_url;type:varchar(255)" json:"qaAvatarUrl"`                                        // 头像
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityQuestionComment) TableName() string {
+	return "yb_community_question_comment"
+}
+
+// YbCommunityQuestionCommentColumns get sql column name.获取数据库列名
+var YbCommunityQuestionCommentColumns = struct {
+	CommunityQuestionCommentID string
+	CommunityQuestionID        string
+	UserID                     string
+	RealName                   string
+	Content                    string
+	ReplyCommentID             string
+	IsTop                      string
+	IsHot                      string
+	HotTopTime                 string
+	Type                       string
+	Enabled                    string
+	IsShowName                 string
+	SourceAgent                string
+	TopTime                    string
+	HotTime                    string
+	ModifyTime                 string
+	CreateTime                 string
+}{
+	CommunityQuestionCommentID: "community_question_comment_id",
+	CommunityQuestionID:        "community_question_id",
+	UserID:                     "user_id",
+	RealName:                   "real_name",
+	Content:                    "content",
+	ReplyCommentID:             "reply_comment_id",
+	IsTop:                      "is_top",
+	IsHot:                      "is_hot",
+	HotTopTime:                 "hot_top_time",
+	Type:                       "type",
+	Enabled:                    "enabled",
+	IsShowName:                 "is_show_name",
+	SourceAgent:                "source_agent",
+	TopTime:                    "top_time",
+	HotTime:                    "hot_time",
+	ModifyTime:                 "modify_time",
+	CreateTime:                 "create_time",
+}

+ 8 - 0
models/tables/yb_community_question_like_tease/create.go

@@ -0,0 +1,8 @@
+package yb_community_question_like_tease
+
+import "hongze/hongze_yb/global"
+
+func (item *YbCommunityQuestionLikeTease) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 72 - 0
models/tables/yb_community_question_like_tease/query.go

@@ -0,0 +1,72 @@
+package yb_community_question_like_tease
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetByUserIdAndCommunityQuestionId 根据用户和问答id获取点赞/吐槽记录
+func GetByUserIdAndCommunityQuestionId(userId uint64, communityQuestionId uint32) (item *YbCommunityQuestionLikeTease, err error) {
+	err = global.DEFAULT_MYSQL.
+		Where("user_id = ? AND community_question_id = ?", userId, communityQuestionId).
+		First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetLikeNumByCommunityQuestionId 获取某个问答的点赞数
+func GetLikeNumByCommunityQuestionId(communityQuestionId uint32) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionLikeTease{}).
+		Where(" community_question_id = ? AND enabled=1 AND op_type = 1 ", communityQuestionId).
+		Count(&num).Error
+	return
+}
+
+// GetTeaseNumByCommunityQuestionId 获取某个问答的吐槽数
+func GetTeaseNumByCommunityQuestionId(communityQuestionId uint32) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionLikeTease{}).
+		Where(" community_question_id = ? AND enabled=1 AND op_type = 2 ", communityQuestionId).
+		Count(&num).Error
+	return
+}
+
+// NumCommentByCommunityQuestionIds 评论统计结构体
+type NumCommentByCommunityQuestionIds struct {
+	CommunityQuestionID uint32 `json:"community_question_id"`
+	Total               int    `json:"total"`
+}
+
+// GetLikeNumCommentByCommunityQuestionIds 根据问答id列表获取所有问答的点赞数
+func GetLikeNumCommentByCommunityQuestionIds(communityQuestionIds []uint32) (items []*NumCommentByCommunityQuestionIds, err error) {
+	if len(communityQuestionIds) <= 0 {
+		return
+	}
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionLikeTease{}).
+		Select("community_question_id, count(1) total").
+		Where("community_question_id in (?) AND enabled=1  AND op_type=1", communityQuestionIds).Group("community_question_id").Scan(&items).Error
+	return
+}
+
+// GetTeaseNumCommentByCommunityQuestionIds 根据问答id列表获取所有问答的吐槽数
+func GetTeaseNumCommentByCommunityQuestionIds(communityQuestionIds []uint32) (items []*NumCommentByCommunityQuestionIds, err error) {
+	if len(communityQuestionIds) <= 0 {
+		return
+	}
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestionLikeTease{}).
+		Select("community_question_id, count(1) total").
+		Where("community_question_id in (?) AND enabled=1  AND op_type=2", communityQuestionIds).Group("community_question_id").Scan(&items).Error
+	return
+}
+
+// GetByUserIdAndCommunityQuestionIds 根据用户id和问答id列表获取成功点赞/吐槽记录
+func GetByUserIdAndCommunityQuestionIds(userId uint64, communityQuestionIds []uint32) (items []*YbCommunityQuestionLikeTease, err error) {
+	if len(communityQuestionIds) <= 0 {
+		return
+	}
+	err = global.DEFAULT_MYSQL.
+		Where("user_id = ? AND enabled=1  AND community_question_id in (?)", userId, communityQuestionIds).Group("community_question_id").
+		Find(&items).Error
+	return
+}

+ 9 - 0
models/tables/yb_community_question_like_tease/update.go

@@ -0,0 +1,9 @@
+package yb_community_question_like_tease
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+func (item *YbCommunityQuestionLikeTease) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(item).Select(updateCols).Updates(*item).Error
+	return
+}

+ 43 - 0
models/tables/yb_community_question_like_tease/yb_community_question_like_tease.go

@@ -0,0 +1,43 @@
+package yb_community_question_like_tease
+
+import (
+	"time"
+)
+
+// YbCommunityQuestionLikeTease 问答点赞/吐槽表
+type YbCommunityQuestionLikeTease struct {
+	CommunityQuestionLikeTeaseID uint64    `gorm:"primaryKey;column:community_question_like_tease_id;type:bigint(20) unsigned;not null" json:"-"`    // 点赞/吐槽自增id
+	UserID                       uint64    `gorm:"column:user_id;type:bigint(20) unsigned;not null;default:0" json:"userId"`                         // 用户id
+	OpType                       int8      `gorm:"column:op_type;type:tinyint(1);not null;default:1" json:"opType"`                                  // 类型. 1-点赞 2-吐槽
+	Enabled                      int8      `gorm:"column:enabled;type:tinyint(1);not null;default:1" json:"enabled"`                                 // 状态. 0-无效数据(已取消点赞/吐槽) 1-有效数据(点赞/吐槽)
+	CreateTime                   time.Time `gorm:"column:create_time;type:datetime;not null;default:CURRENT_TIMESTAMP" json:"createTime"`            // 创建时间
+	ModifyTime                   time.Time `gorm:"column:modify_time;type:datetime;not null;default:CURRENT_TIMESTAMP" json:"modifyTime"`            // 修改时间
+	CommunityQuestionID          uint32    `gorm:"column:community_question_id;type:int(10) unsigned;not null;default:0" json:"communityQuestionId"` // 问答ID
+	SourceAgent                  int8      `gorm:"column:source_agent;type:tinyint(1);not null;default:0" json:"sourceAgent"`                        // 点赞/吐槽入口来源,1:小程序,2:小程序pc, 4:web pc
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityQuestionLikeTease) TableName() string {
+	return "yb_community_question_like_tease"
+}
+
+// YbCommunityQuestionLikeTeaseColumns get sql column name.获取数据库列名
+var YbCommunityQuestionLikeTeaseColumns = struct {
+	CommunityQuestionLikeTeaseID string
+	UserID                       string
+	OpType                       string
+	Enabled                      string
+	CreateTime                   string
+	ModifyTime                   string
+	CommunityQuestionID          string
+	SourceAgent                  string
+}{
+	CommunityQuestionLikeTeaseID: "community_question_like_tease_id",
+	UserID:                       "user_id",
+	OpType:                       "op_type",
+	Enabled:                      "enabled",
+	CreateTime:                   "create_time",
+	ModifyTime:                   "modify_time",
+	CommunityQuestionID:          "community_question_id",
+	SourceAgent:                  "source_agent",
+}

+ 62 - 0
models/tables/yb_community_video/entity.go

@@ -0,0 +1,62 @@
+package yb_community_video
+
+import "time"
+
+// YbCommunityVideo 研报-视频社区表
+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"`                                             // 视频标题
+	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.获取数据库表名
+func (m *YbCommunityVideo) TableName() string {
+	return "yb_community_video"
+}
+
+// YbCommunityVideoColumns get sql column name.获取数据库列名
+var YbCommunityVideoColumns = struct {
+	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",
+	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",
+}

+ 41 - 0
models/tables/yb_community_video/model.go

@@ -0,0 +1,41 @@
+package yb_community_video
+
+import (
+	"errors"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+func (item *YbCommunityVideo) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+func (item *YbCommunityVideo) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(item).Select(updateCols).Updates(*item).Error
+	return
+}
+
+// GetPageListByCondition 分页获取视频列表
+func GetPageListByCondition(where map[string]interface{}, pageIndex, pageSize int) (list []*YbCommunityVideo, err error) {
+	cond, vals, e := utils.WhereBuild(where)
+	if e != nil {
+		err = errors.New("系统异常,生成查询语句失败")
+		return
+	}
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(YbCommunityVideo{}).
+		Where(cond, vals...).
+		Where("is_deleted = 0 AND publish_state = 1").
+		Offset(offset).Limit(pageSize).
+		Order("publish_time DESC").Scan(&list).Error
+	return
+}
+
+// GetItemById 主键获取已发布的视频
+func GetItemById(videoId int) (item *YbCommunityVideo, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityVideo{}).
+		Where("community_video_id = ? AND is_deleted = 0 AND publish_state = 1", videoId).
+		First(&item).Error
+	return
+}

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

@@ -0,0 +1,50 @@
+package yb_community_video_play_log
+
+import "time"
+
+// YbCommunityVideoPlayLog 研报视频社区播放记录表
+type YbCommunityVideoPlayLog struct {
+	ID               int       `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	CommunityVideoID int       `gorm:"index:idx_community_video_id;column:community_video_id;type:int(10) unsigned;not null" json:"communityVideoId"` // 回答音频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"`                                  // 创建时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityVideoPlayLog) TableName() string {
+	return "yb_community_video_play_log"
+}
+
+// YbCommunityVideoPlayLogColumns get sql column name.获取数据库列名
+var YbCommunityVideoPlayLogColumns = struct {
+	ID               string
+	CommunityVideoID string
+	UserID           string
+	Mobile           string
+	RealName         string
+	NickName         string
+	CompanyID        string
+	CompanyName      string
+	CompanyStatus    string
+	SourceAgent      string
+	CreateTime       string
+}{
+	ID:               "id",
+	CommunityVideoID: "community_video_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",
+}

+ 8 - 0
models/tables/yb_community_video_play_log/model.go

@@ -0,0 +1,8 @@
+package yb_community_video_play_log
+
+import "hongze/hongze_yb/global"
+
+func (item *YbCommunityVideoPlayLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 45 - 0
models/tables/yb_index_tab/entity.go

@@ -0,0 +1,45 @@
+package yb_index_tab
+
+// YbIndexTab 研报-首页选项卡
+type YbIndexTab struct {
+	ID           int    `gorm:"primaryKey;column:id;type:int(10) unsigned;not null" json:"-"`
+	Tab          string `gorm:"column:tab;type:varchar(30);not null;default:''" json:"tab"`                     // 选项卡名
+	Mark         string `gorm:"column:mark;type:varchar(30);not null;default:''" json:"mark"`                   // 枚举值
+	DefaultIcon  string `gorm:"column:default_icon;type:varchar(255);not null;default:''" json:"defaultIcon"`   // 默认icon
+	SelectedIcon string `gorm:"column:selected_icon;type:varchar(255);not null;default:''" json:"selectedIcon"` // 选中icon
+	Sort         int    `gorm:"column:sort;type:int(10) unsigned;not null;default:0" json:"sort"`               // 排序
+	IsShow       int    `gorm:"column:is_show;type:tinyint(4) unsigned;not null;default:0" json:"isShow"`       // 是否显示:0-隐藏 1-显示
+	AuthCheck    int    `gorm:"column:auth_check;type:tinyint(4) unsigned;not null;default:0" json:"authCheck"` // 是否需要检验权限:0-否 1-是
+	Position     int    `gorm:"column:position;type:tinyint(4) unsigned;not null;default:0" json:"position"`    // 位置:1-顶部 2-底部
+	Version      string `gorm:"column:version;type:varchar(30);not null;default:''" json:"version"`             // 版本号
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbIndexTab) TableName() string {
+	return "yb_index_tab"
+}
+
+// YbIndexTabColumns get sql column name.获取数据库列名
+var YbIndexTabColumns = struct {
+	ID           string
+	Tab          string
+	Mark         string
+	DefaultIcon  string
+	SelectedIcon string
+	Sort         string
+	IsShow       string
+	AuthCheck    string
+	Position     string
+	Version      string
+}{
+	ID:           "id",
+	Tab:          "tab",
+	Mark:         "mark",
+	DefaultIcon:  "default_icon",
+	SelectedIcon: "selected_icon",
+	Sort:         "sort",
+	IsShow:       "is_show",
+	AuthCheck:    "auth_check",
+	Position:     "position",
+	Version:      "version",
+}

+ 21 - 0
models/tables/yb_index_tab/model.go

@@ -0,0 +1,21 @@
+package yb_index_tab
+
+import (
+	"errors"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetListByCondition 条件获取列表
+func GetListByCondition(where map[string]interface{}) (list []*YbIndexTab, err error) {
+	cond, vals, e := utils.WhereBuild(where)
+	if e != nil {
+		err = errors.New("系统异常,生成查询语句失败")
+		return
+	}
+	err = global.DEFAULT_MYSQL.Model(YbIndexTab{}).
+		Where(cond, vals...).
+		Order("sort ASC").
+		Scan(&list).Error
+	return
+}

+ 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",
+}

+ 67 - 0
models/tables/yb_price_driven/entity.go

@@ -0,0 +1,67 @@
+package yb_price_driven
+
+import (
+	"time"
+)
+
+// YbPriceDriven 研报-价格驱动表
+type YbPriceDriven struct {
+	PriceDrivenID       int       `gorm:"primaryKey;column:price_driven_id;type:int(10) unsigned;not null" json:"-"`
+	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.获取数据库表名
+func (m *YbPriceDriven) TableName() string {
+	return "yb_price_driven"
+}
+
+// YbPriceDrivenColumns get sql column name.获取数据库列名
+var YbPriceDrivenColumns = struct {
+	PriceDrivenID       string
+	VarietyTagID        string
+	VarietyTagName      string
+	MainVariable        string
+	CoreDrivenType      string
+	CoreDrivenContent   string
+	CoreContent         string
+	LastUpdateAdminID   string
+	LastUpdateAdminName string
+	SendThsMsgTime      string
+	SendTemplateMsgTime string
+	ThsMsgState         string
+	TemplateMsgState    string
+	PublishState        string
+	CreateTime          string
+	ModifyTime          string
+}{
+	PriceDrivenID:       "price_driven_id",
+	VarietyTagID:        "variety_tag_id",
+	VarietyTagName:      "variety_tag_name",
+	MainVariable:        "main_variable",
+	CoreDrivenType:      "core_driven_type",
+	CoreDrivenContent:   "core_driven_content",
+	CoreContent:         "core_content",
+	LastUpdateAdminID:   "last_update_admin_id",
+	LastUpdateAdminName: "last_update_admin_name",
+	SendThsMsgTime:      "send_ths_msg_time",
+	SendTemplateMsgTime: "send_template_msg_time",
+	ThsMsgState:         "ths_msg_state",
+	TemplateMsgState:    "template_msg_state",
+	PublishState:        "publish_state",
+	CreateTime:          "create_time",
+	ModifyTime:          "modify_time",
+}

+ 20 - 0
models/tables/yb_price_driven/model.go

@@ -0,0 +1,20 @@
+package yb_price_driven
+
+import "hongze/hongze_yb/global"
+
+// GetPriceDrivenByVarietyTagId 通过标签获取价格驱动
+func GetPriceDrivenByVarietyTagId(varietyTagId int) (item *YbPriceDriven, err error) {
+	err = global.DEFAULT_MYSQL.
+		Where("variety_tag_id = ? AND publish_state = 1", varietyTagId).
+		Order("create_time DESC").
+		First(&item).Error
+	return
+}
+
+// GetPriceDrivenById 主键获取价格驱动
+func GetPriceDrivenById(priceDrivenId int) (item *YbPriceDriven, err error) {
+	err = global.DEFAULT_MYSQL.
+		Where("price_driven_id = ? AND publish_state = 1", priceDrivenId).
+		First(&item).Error
+	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",
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff