Răsfoiți Sursa

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into chart_update

xingzai 2 ani în urmă
părinte
comite
4e23e0b02e
52 a modificat fișierele cu 2401 adăugiri și 1239 ștergeri
  1. 155 861
      controllers/activity.go
  2. 41 2
      controllers/activity_special.go
  3. 29 25
      controllers/article.go
  4. 12 2
      controllers/chart_permission.go
  5. 54 8
      controllers/industry.go
  6. 33 16
      controllers/report.go
  7. 232 0
      controllers/report_selection.go
  8. 21 2
      controllers/search.go
  9. 9 10
      controllers/user.go
  10. 16 4
      models/activity.go
  11. 5 5
      models/activity_special.go
  12. 78 9
      models/activity_special_trip.go
  13. 44 0
      models/activity_special_trip_bill.go
  14. 45 0
      models/admin.go
  15. 17 3
      models/article.go
  16. 12 4
      models/article_collect.go
  17. 4 2
      models/article_comment.go
  18. 23 9
      models/company.go
  19. 5 6
      models/company_activity_trip.go
  20. 22 0
      models/company_user_type.go
  21. 3 0
      models/db.go
  22. 9 6
      models/minutesSummary.go
  23. 9 2
      models/report.go
  24. 29 4
      models/report_mapping.go
  25. 2 0
      models/report_selection.go
  26. 31 0
      models/report_selection_subject_history.go
  27. 5 5
      models/researchSummary.go
  28. 12 12
      models/user.go
  29. 14 9
      models/wx_template_msg.go
  30. 42 0
      models/xzs_choose_category.go
  31. 26 17
      routers/commentsRouter.go
  32. 5 0
      routers/router.go
  33. 237 51
      services/activity.go
  34. 11 4
      services/activity_button.go
  35. 293 57
      services/activity_special.go
  36. 27 18
      services/activity_special_trip.go
  37. 85 0
      services/activity_wx_template_msg.go
  38. 15 0
      services/admin.go
  39. 53 12
      services/article.go
  40. 33 0
      services/articlt_collect.go
  41. 83 4
      services/company_permission.go
  42. 32 0
      services/config.go
  43. 300 1
      services/elastic.go
  44. 62 0
      services/industrial_management.go
  45. 26 0
      services/report_mapping.go
  46. 3 0
      services/resource_data.go
  47. 1 1
      services/user_permission.go
  48. 12 25
      services/wechat_send_msg.go
  49. 37 30
      services/wx_template_msg.go
  50. 29 0
      services/xzs_choose_category.go
  51. 15 13
      services/yidong.go
  52. 3 0
      utils/constants.go

Fișier diff suprimat deoarece este prea mare
+ 155 - 861
controllers/activity.go


+ 41 - 2
controllers/activity_special.go

@@ -10,7 +10,7 @@ import (
 	"time"
 )
 
-//专项调研活动
+// 专项调研活动
 type ActivitySpecialCoAntroller struct {
 	BaseAuthController
 }
@@ -230,6 +230,22 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 				br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
 				return
 			}
+			//流水记录表
+			itemBill := new(models.CygxActivitySpecialTripBill)
+			itemBill.UserId = user.UserId
+			itemBill.ActivityId = activityInfo.ActivityId
+			itemBill.CreateTime = time.Now()
+			itemBill.Mobile = user.Mobile
+			itemBill.Email = user.Email
+			itemBill.CompanyId = user.CompanyId
+			itemBill.CompanyName = user.CompanyName
+			itemBill.RealName = user.RealName
+			itemBill.Source = 1
+			itemBill.DoType = 1
+			itemBill.BillDetailed = -1 // 流水减一
+			itemBill.RegisterPlatform = 1
+			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
+
 			go services.ActivitySpecialUserRmind(user, activityId, 2)
 			//判断是删除还是添加
 			if total == 0 {
@@ -259,7 +275,6 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 					br.ErrMsg = "操作失败,Err:" + err.Error()
 					return
 				}
-
 				//SignupStatus  int    `description:"返回状态:1:成功 、2 :人数已满 、3:调研次数已用完、 4:超时"`
 			} else {
 				updateParams := make(map[string]interface{})
@@ -273,7 +288,13 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 					br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
 					return
 				}
+				resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
+				//48小时之内的取消也扣除一次参会记录
+				if time.Now().Add(+time.Hour * 48).After(resultTime) {
+					itemBill.BillDetailed = 0 //48小时之内,取消报名之后二次报名,不扣除流水记录
+				}
 			}
+			go models.AddCygxActivitySpecialTripBill(itemBill)
 		}
 	} else {
 		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
@@ -332,11 +353,27 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
 		return
 	}
+	//流水记录表
+	itemBill := new(models.CygxActivitySpecialTripBill)
+	itemBill.UserId = user.UserId
+	itemBill.ActivityId = activityInfo.ActivityId
+	itemBill.CreateTime = time.Now()
+	itemBill.Mobile = user.Mobile
+	itemBill.Email = user.Email
+	itemBill.CompanyId = user.CompanyId
+	itemBill.CompanyName = user.CompanyName
+	itemBill.RealName = user.RealName
+	itemBill.Source = 1
+	itemBill.DoType = 2
+	itemBill.BillDetailed = 1 // 流水加一
+	itemBill.RegisterPlatform = 1
+	itemBill.ChartPermissionId = activityInfo.ChartPermissionId
 	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
 	//48小时之内的取消也扣除一次参会记录
 	var isValid int
 	if time.Now().Add(+time.Hour * 48).After(resultTime) {
 		isValid = 1
+		itemBill.BillDetailed = 0 //48小时之内取消的活动扣点不返回
 	}
 	err = models.CancelActivitySpecialTripIsValid(isValid, activityInfo.ActivityId, uid)
 	if err != nil {
@@ -344,6 +381,8 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 		br.ErrMsg = "CancelActivitySpecialTrip,Err:" + err.Error()
 		return
 	}
+	go models.AddCygxActivitySpecialTripBill(itemBill)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "已取消"

+ 29 - 25
controllers/article.go

@@ -82,32 +82,45 @@ func (this *ArticleController) Detail() {
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		return
 	}
+	lyjhTypeMap, _ := services.GetLyjhTypeMap()
+	if _, ok := lyjhTypeMap[detail.CategoryId]; ok {
+		detail.IsRoadShow = true
+	}
+	articleCollectMap, _ := services.GetCygxArticleCollectMap(user.UserId)
+	detail.IsCollect = articleCollectMap[detail.ArticleId]
 	if isSendWx == 1 {
 		var condition string
 		var pars []interface{}
 		pars = make([]interface{}, 0)
 		condition = ` AND article_id  = ? `
-		pars = append(pars, articleId)
-		industrialList, err := models.GetIndustrialArticleGroupManagementList(condition, pars)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
-			return
-		}
-		if len(industrialList) > 0 {
-			industryUserFollowMap, err := services.GetIndustryUserFollowMap(user)
-			if err != nil {
+		reportMappingMap, _ := services.GetReportMappingMap()
+
+		if reportMappingMap[detail.CategoryId] {
+			chooseCategoryMap, _ := services.GetChooseCategoryMap(user)
+			detail.IsShowFollowButton = true
+			detail.IsFollowButton = chooseCategoryMap[detail.CategoryId]
+		} else {
+			pars = append(pars, articleId)
+			industrialList, err := models.GetIndustrialArticleGroupManagementList(condition, pars)
+			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取信息失败"
-				br.ErrMsg = "GetActivitySignupResp,Err:" + err.Error()
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
 				return
 			}
-			for _, v := range industrialList {
-				fmt.Println(v.IndustrialManagementId)
-				if industryUserFollowMap[v.IndustrialManagementId] {
-					detail.IsFollowButton = true
+			if len(industrialList) > 0 {
+				industryUserFollowMap, err := services.GetIndustryUserFollowMap(user)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "GetActivitySignupResp,Err:" + err.Error()
+					return
+				}
+				for _, v := range industrialList {
+					if industryUserFollowMap[v.IndustrialManagementId] {
+						detail.IsFollowButton = true
+					}
 				}
+				detail.IsShowFollowButton = true
 			}
-			detail.IsShowFollowButton = true
 		}
 	}
 	//是否属于专项调研报告
@@ -286,15 +299,6 @@ func (this *ArticleController) Detail() {
 			}
 		}
 
-		collectCount, err := models.GetArticleCollectCount(uid, articleId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已收藏失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-			return
-		}
-		if collectCount > 0 {
-			detail.IsCollect = true
-		}
 		interviewApplyItem, err := models.GetArticleInterviewApply(uid, articleId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取信息失败"

+ 12 - 2
controllers/chart_permission.go

@@ -6,7 +6,7 @@ import (
 	"hongze/hongze_cygx/utils"
 )
 
-//品种
+// 品种
 type ChartPermissionController struct {
 	BaseCommonController
 }
@@ -152,6 +152,7 @@ func (this *ChartPermissionAuthController) ReportDetail() {
 
 // @Title 获取策略下的所有分类
 // @Description 获取策略下的所有分类接口
+// @Param   ChartPermissionId   query   int  false     "行业id"
 // @Success 200 {object} models.ReportMappingResp
 // @router /strategyAll [get]
 func (this *ChartPermissionAuthController) StrategyDetail() {
@@ -166,8 +167,13 @@ func (this *ChartPermissionAuthController) StrategyDetail() {
 		br.Ret = 408
 		return
 	}
+	//默认给策略的ID
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if chartPermissionId == 0 {
+		chartPermissionId = utils.CE_LUE_ID
+	}
 	uid := user.UserId
-	list, err := models.GetReportMappingStrategyHomeAll()
+	list, err := models.GetReportMappingStrategyHomeAll(chartPermissionId)
 
 	if err != nil {
 		br.Msg = "获取信息失败"
@@ -289,6 +295,10 @@ func (this *ChartPermissionAuthController) ReportDetailV7() {
 			resp.List[k].IsShowSustainable = true
 		}
 	}
+	item := new(models.ChartPermission)
+	item.PermissionName = utils.GU_SHOU_NAME
+	item.ChartPermissionId = utils.GU_SHOU_ID
+	resp.List = append(resp.List, item)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 54 - 8
controllers/industry.go

@@ -3,6 +3,7 @@ package controllers
 import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
 	"hongze/hongze_cygx/utils"
 	"strconv"
 	"time"
@@ -47,18 +48,63 @@ func (this *IndustryController) Fllow() {
 	var pars []interface{}
 	var industrialIds []int
 	if source == "article" {
-		pars = make([]interface{}, 0)
-		condition = ` AND article_id  = ? `
-		pars = append(pars, sourceId)
-		industrialList, err := models.GetIndustrialArticleGroupManagementList(condition, pars)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		articleDetail, err := models.GetArticleDetailById(sourceId)
+		if err != nil {
 			br.Msg = "获取信息失败"
 			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			return
 		}
-		if len(industrialList) > 0 {
-			for _, v := range industrialList {
-				industrialIds = append(industrialIds, v.IndustrialManagementId)
+		//判读是否属于策略的文章类型
+		reportMappingMap, _ := services.GetReportMappingMap()
+		if reportMappingMap[articleDetail.CategoryId] {
+			chooseCategoryMap, _ := services.GetChooseCategoryMap(user)
+			//判断用户是否关注策略对应分类
+			if !chooseCategoryMap[articleDetail.CategoryId] {
+				item := new(models.CygxXzsChooseCategory)
+				item.CategoryId = articleDetail.CategoryId
+				item.UserId = uid
+				item.Email = user.Email
+				item.Mobile = user.Mobile
+				item.RealName = user.RealName
+				item.CompanyId = user.CompanyId
+				item.CompanyName = user.CompanyName
+				item.CreateTime = time.Now()
+				item.ModifyTime = time.Now()
+				_, err = models.AddCygxCategoryFllow(item)
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "操作失败,Err:" + err.Error()
+					return
+				}
+				resp.Status = 1
+			} else {
+				err = models.RemoveCygxCategoryFllow(user.Mobile, articleDetail.CategoryId)
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "取消关注失败,Err:" + err.Error()
+					return
+				}
+				resp.Status = 2
+			}
+			br.Msg = "操作成功"
+			br.Ret = 200
+			br.Success = true
+			br.Data = resp
+			return
+		} else {
+			pars = make([]interface{}, 0)
+			condition = ` AND article_id  = ? `
+			pars = append(pars, sourceId)
+			industrialList, err := models.GetIndustrialArticleGroupManagementList(condition, pars)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
+				return
+			}
+			if len(industrialList) > 0 {
+				for _, v := range industrialList {
+					industrialIds = append(industrialIds, v.IndustrialManagementId)
+				}
 			}
 		}
 	} else if source == "activity" {

+ 33 - 16
controllers/report.go

@@ -1495,9 +1495,10 @@ func (this *ReportController) ReportListByType() {
 		br.Msg = "请选择报告类型"
 		return
 	}
-	fmt.Println(tbdb)
 	condition = ` AND publish_status = 1  `
-
+	if user.CompanyId != utils.HZ_COMPANY_ID {
+		condition += ` AND visible_range = 1  `
+	}
 	total, err := models.GetCygxReportSelectionPublic(condition, tbdb, pars)
 	if err != nil {
 		br.Msg = "获取信息失败"
@@ -1555,11 +1556,11 @@ func (this *ReportController) Detail() {
 		br.Ret = 408
 		return
 	}
-	if user.CompanyId != utils.HZ_COMPANY_ID {
-		br.Msg = "报告编辑中,请稍后"
-		br.IsSendEmail = false
-		return
-	}
+	//if user.CompanyId != utils.HZ_COMPANY_ID {
+	//	br.Msg = "报告编辑中,请稍后"
+	//	br.IsSendEmail = false
+	//	return
+	//}
 	uid := user.UserId
 	articleId, _ := this.GetInt("ArticleId")
 	isBestNew, _ := this.GetBool("IsBestNew")
@@ -1743,7 +1744,7 @@ func (this *ReportController) Detail() {
 // @Description 获取本周研究汇总详情接口
 // @Param   ArticleId   query   int  true       "报告ID"
 // @Success 200 {object} models.ResearchSummaryLetailResp
-// @router /researchSummary/detail [get]
+// @router /researchSummary/detail_test_del [get]
 func (this *ReportController) ResearchDetail() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -1854,7 +1855,7 @@ func (this *ReportController) ResearchDetail() {
 			listFirst[k].ListName = "上市公司调研纪要篇"
 			listFirst[k].IcoLink = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202111/20211101/ujHXB48I8ay9T0XoPRI7lorz7OkL.png"
 		} else if v.Type == "SJDP" {
-			listFirst[k].ListName = "事件点评"
+			listFirst[k].ListName = "市场QA汇总"
 			listFirst[k].IcoLink = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202110/20211020/2a5cXafO3Iws4QcFp1bd5WPdYikV.png"
 		} else if v.Type == "YANX" {
 			listFirst[k].ListName = "买方研选"
@@ -1920,20 +1921,32 @@ func (this *ReportController) MinutesDetailV4() {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取用户权限信息失败,Err:" + err.Error()
 	}
+	//resp.HasPermission = hasPermission
+	//if hasPermission != 1 {
+	//	br.Ret = 200
+	//	br.Success = true
+	//	br.Msg = "获取成功"
+	//	br.Data = resp
+	//	return
+	//}
+	detail, err := models.GetCygxMinutesSummaryInfoById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "报告不存在,Err:" + err.Error() + "articleId:" + strconv.Itoa(articleId)
+		return
+	}
+	//未设置全部可见的只能给弘则内部查看
+	if detail.VisibleRange == 1 || user.CompanyId == utils.HZ_COMPANY_ID {
+		resp.IsShow = true
+	}
 	resp.HasPermission = hasPermission
-	if hasPermission != 1 {
+	if hasPermission != 1 || !resp.IsShow {
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
 		br.Data = resp
 		return
 	}
-	detail, err := models.GetCygxMinutesSummaryInfoById(articleId)
-	if err != nil {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "报告不存在,Err:" + err.Error() + "articleId:" + strconv.Itoa(articleId)
-		return
-	}
 	detail.PublishDate = utils.StrTimeToTime(detail.PublishDate).Format(utils.FormatDate)
 	detail.VideoPlaySeconds = utils.Mp3Time(detail.VideoPlaySeconds)
 	listFirst, err := models.GetMinutesSummarylogListAllV4(articleId)
@@ -2143,6 +2156,8 @@ func (this *ReportController) RoadshowDetail() {
 		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
 		return
 	}
+	articleLyjhMap, _ := services.GetLyjhArticleMap()
+	articleCollectMap, _ := services.GetCygxArticleCollectMap(user.UserId)
 	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
 	if user.CompanyId > 1 {
 		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
@@ -2157,6 +2172,8 @@ func (this *ReportController) RoadshowDetail() {
 			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			return
 		}
+		detail.IsCollect = articleCollectMap[detail.ArticleId]
+		detail.IsRoadShow = articleLyjhMap[detail.ArticleId]
 		detail.Body = html.UnescapeString(detail.Body)
 		detail.Abstract, _ = services.GetReportContentTextSubNew(detail.Abstract)
 		detail.PublishDate = utils.StrTimeToTime(detail.PublishDate).Format("2006-01-02")

+ 232 - 0
controllers/report_selection.go

@@ -0,0 +1,232 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 报告
+type ReportSelectionController struct {
+	BaseAuthController
+}
+
+// @Title 获取报告精选详情
+// @Description 获取报告精选详情接口
+// @Param   ArticleId   query   int  true       "报告ID"
+// @Param   IsBestNew   query   bool  false       "是否获取最新的一篇报告"
+// @Success 200 {object} models.ReportSelectionLetailResp
+// @router /detail [get]
+func (this *ReportSelectionController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	articleId, _ := this.GetInt("ArticleId")
+	isBestNew, _ := this.GetBool("IsBestNew")
+	if isBestNew {
+		tbdb := "cygx_report_selection"
+		condition := ` AND publish_status = 1  `
+		var pars []interface{}
+		list, err := models.GetReportSelectionListPublic(condition, "1", tbdb, pars, 0, 1)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			articleId = v.ArticleId
+		}
+	}
+	if articleId < 1 {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "报告ID错误" + strconv.Itoa(articleId)
+		return
+	}
+	resp := new(models.ReportSelectionLetailResp)
+	//判断用户权限
+	hasPermission, err := services.GetUserhasPermission(user)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取用户权限信息失败,Err:" + err.Error()
+	}
+	detail, err := models.GetCygxReportSelectionInfoById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "报告不存在,Err:" + err.Error() + "articleId:" + strconv.Itoa(articleId)
+		return
+	}
+	//未设置全部可见的只能给弘则内部查看
+	if detail.VisibleRange == 1 || user.CompanyId == utils.HZ_COMPANY_ID {
+		resp.IsShow = true
+	}
+	resp.HasPermission = hasPermission
+	if hasPermission != 1 || !resp.IsShow {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	if detail.ReportLink != "" {
+		articleIdLink, _ := services.GetReportLinkToArticleid(detail.ReportLink)
+		detail.CeLueArticleId = articleIdLink
+	}
+	articleStockMap, _ := services.GetArticleStockMap()
+	detail.PublishDate = utils.StrTimeToTime(detail.PublishDate).Format("2006-01-02")
+	existMap := make(map[int]int)
+	var items []*models.ReportSelectionChartPermission
+	var itemsSubject []*models.ReportSelectionChartLogPermission
+	listLog, err := models.GetReportSelectionlogListAll(articleId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取子类信息失败,Err:" + err.Error()
+		return
+	}
+	detail.VideoPlaySeconds = utils.Mp3Time(detail.VideoPlaySeconds)
+	//获取行业核心逻辑汇总
+	listChartLog, err := models.GetCygxReportSelectionChartLogRepList(articleId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	mapChartLog := make(map[string]string)
+	for _, v := range listChartLog {
+		mapChartLog[v.ChartPermissionName] = v.BodyChartSummary
+	}
+	for _, v := range listLog {
+		item := new(models.ReportSelectionChartPermission)
+		itemSubject := new(models.ReportSelectionChartLogPermission)
+		itemSubject.PermissionName = v.PermissionName
+		if existMap[v.ChartPermissionId] == 0 {
+			//item.PermissionName = v.PermissionName + "领域深度报告和调研"
+			item.PermissionName = v.PermissionName
+			item.IcoLink = v.IcoLink
+			listSonLog, err := models.GetReportSelectionlogSonListAll(articleId, v.ChartPermissionId)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
+				return
+			}
+			for k2, v2 := range listSonLog {
+				if v2.IndustrialManagementId != "" {
+					listIndustrial, err := models.GetIndustrialByIds(v2.IndustrialManagementId)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取信息失败"
+						br.ErrMsg = "获取信息失败,Err:" + err.Error()
+						return
+					}
+					listSonLog[k2].OverviewArticleId = articleStockMap[v2.SubjectName]
+					listSonLog[k2].List = listIndustrial
+					if v2.Label != "" {
+						v2.CompanyLabel = strings.Split(v2.Label, "{|}")
+					}
+				}
+				itemSubject.ListSubject = append(itemSubject.ListSubject, &models.ReportSelectionChartLogSubjectName{SubjectName: v2.SubjectName, IsNew: v2.IsNew, IndustrialSubjectId: v2.IndustrialSubjectId})
+			}
+			item.BodyChartSummary = mapChartLog[v.PermissionName]
+			item.List = listSonLog
+			items = append(items, item)
+			itemsSubject = append(itemsSubject, itemSubject)
+			//itemLogs = make([]*models.CygxReportSelectionLogDetail, 0)
+		}
+		existMap[v.ChartPermissionId] = v.ChartPermissionId
+	}
+
+	historyRecord := new(models.CygxReportHistoryRecord)
+	historyRecord.UserId = uid
+	historyRecord.ArticleId = articleId
+	historyRecord.CreateTime = time.Now()
+	historyRecord.Mobile = user.Mobile
+	historyRecord.Email = user.Email
+	historyRecord.CompanyId = user.CompanyId
+	historyRecord.CompanyName = user.CompanyName
+	historyRecord.ReportType = "bgjx"
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
+		return
+	}
+	historyRecord.RealName = user.RealName
+	if sellerItem != nil {
+		historyRecord.SellerName = sellerItem.RealName
+	}
+
+	go models.AddCygxReportHistoryRecord(historyRecord)
+	resp.List = items
+	resp.ListPermissionSubject = itemsSubject
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 标的点击记录
+// @Description 标的点击记录接口
+// @Param	request	body models.AddCygxReportSelectionSubjectHistoryReq true "type json string"
+// @router /click/history [post]
+func (this *ReportSelectionController) ClickHistory() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	var req models.AddCygxReportSelectionSubjectHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ArticleId <= 0 {
+		br.Msg = "文章不存在"
+		br.ErrMsg = "文章不存在,文章ID错误"
+		return
+	}
+	if req.IndustrialSubjectId <= 0 {
+		br.Msg = "标的ID不存在"
+		br.ErrMsg = "标的ID不存在,标的ID错误"
+		return
+	}
+	item := models.CygxReportSelectionSubjectHistory{
+		UserId:              user.UserId,
+		ArticleId:           req.ArticleId,
+		CreateTime:          time.Now(),
+		ModifyTime:          time.Now(),
+		Mobile:              user.Mobile,
+		Email:               user.Email,
+		CompanyId:           user.CompanyId,
+		CompanyName:         user.CompanyName,
+		IndustrialSubjectId: req.IndustrialSubjectId,
+	}
+	err = models.AddCygxReportSelectionSubjectHistory(&item)
+	if err != nil {
+		br.Msg = "记录失败"
+		br.ErrMsg = "记录失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}

+ 21 - 2
controllers/search.go

@@ -604,20 +604,39 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 			br.ErrMsg = "检索失败,Err:" + err.Error()
 			return
 		}
-		tmpResult, tmpTotalResult, err := services.EsArticleSearch(keyWord, startSize, pageSize, orderColumn, 1)
+		tmpResult, tmpTotalResult, err := services.EsArticleSearchBody(keyWord, startSize, pageSize, orderColumn, 1)
 		if err != nil {
 			br.Msg = "检索失败"
 			br.ErrMsg = "检索失败,Err:" + err.Error()
 			return
 		}
 		result = tmpResult
+		if int(tmpTotalResult) < currentIndex*pageSize {
+			startSizeBody := startSize - int(tmpTotalResult)
+			if startSizeBody < 0 {
+				startSizeBody = 0
+			}
+			var pageSizeBody int
+			pageSizeBody = pageSize - len(tmpResult)
+			tmpResultBody, tmpTotalBody, err := services.EsArticleSearchBody(keyWord, startSizeBody, pageSizeBody, orderColumn, 2)
+			if err != nil {
+				br.Msg = "检索失败"
+				br.ErrMsg = "检索失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpResultBody {
+				result = append(result, v)
+			}
+			tmpTotalResult += tmpTotalBody
+		}
+
 		if int(tmpTotalResult) < currentIndex*pageSize {
 			startSizeIk := startSize - int(tmpTotalResult)
 			if startSizeIk < 0 {
 				startSizeIk = 0
 			}
 			var pageSizeIk int
-			pageSizeIk = pageSize - len(tmpResult)
+			pageSizeIk = pageSize - len(result)
 			tmpResultIk, _, err := services.EsArticleSearch(keyWord, startSizeIk, pageSizeIk, orderColumn, 2)
 			if err != nil {
 				br.Msg = "检索失败"

+ 9 - 10
controllers/user.go

@@ -547,6 +547,8 @@ func (this *UserController) CollectList() {
 		}
 	}
 
+	lyjhTypeMap, _ := services.GetLyjhTypeMap()
+
 	lenList := len(list)
 	for i := 0; i < lenList; i++ {
 		item := list[i]
@@ -565,13 +567,9 @@ func (this *UserController) CollectList() {
 			list[i].Pv = mapArticleCollectNum[article.ArticleId].Pv
 			list[i].IsCollect = mapArticleCollectNum[article.ArticleId].IsCollect
 		}
-		//list[i].TitleEn = article.TitleEn
-		//list[i].UpdateFrequency = article.UpdateFrequency
-		//list[i].CreateDate = article.CreateDate
-		//list[i].Body, _ = services.GetReportContentTextSub(article.Body)
-		//list[i].Abstract = article.Abstract
-		//list[i].CategoryName = article.CategoryName
-		//list[i].SubCategoryName = article.SubCategoryName
+		if _, ok := lyjhTypeMap[item.CategoryId]; ok && list[i].ArticleId >= utils.SummaryArticleId {
+			list[i].IsRoadShow = true
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp.List = list
@@ -1611,9 +1609,9 @@ func (this *UserController) CommnetList() {
 		br.ErrMsg = "获取我的留言列表失败,Err:" + err.Error()
 		return
 	}
-
+	articleLyjhMap, _ := services.GetLyjhArticleMap()
+	articleCollectMap, _ := services.GetCygxArticleCollectMap(user.UserId)
 	resp := new(models.CygxCommentListResp)
-
 	for _, comment := range commentlist {
 		item := models.CygxArticleCommentResp{
 			Id:          comment.Id,
@@ -1636,9 +1634,10 @@ func (this *UserController) CommnetList() {
 		} else if comment.ActivityId > 0 {
 			item.RedirectType = 2
 		}
+		item.IsCollect = articleCollectMap[comment.ArticleId]
+		item.IsRoadShow = articleLyjhMap[comment.ArticleId]
 		resp.List = append(resp.List, &item)
 	}
-
 	br.Msg = "获取成功!"
 	br.Ret = 200
 	br.Success = true

+ 16 - 4
models/activity.go

@@ -64,6 +64,7 @@ type CygxActivity struct {
 	ActivityJoinType        string    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
 	YidongSignUpEnd         string    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
 	YidongSignUpStart       string    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
+	IsExternalLabel         int       `description:"是否为外部资源 1是,0否"`
 }
 
 type Activity struct {
@@ -84,8 +85,9 @@ type ActivitySingnupRep struct {
 }
 
 type ActivityCcustomerType struct {
-	CustomerTypeId int    `description:"活动类型id"`
-	CustomerName   string `description:"活动名称"`
+	CustomerTypeId  int    `description:"活动类型id"`
+	CustomerName    string `description:"活动名称"`
+	PermissionValue string `description:"用户权限对应的值"`
 }
 
 type ActivityCcustomerTypeList struct {
@@ -198,6 +200,9 @@ type ActivityDetail struct {
 	ActivityTimeEnd         string                     `description:"专项产业调研活动预期结束时间"`
 	IsShowFollowButton      bool                       `description:"是否展示关注取关按钮"`
 	IsFollowButton          bool                       `description:"是否关注"`
+	IsYidongConduct         bool                       `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall       int                        `description:"是否提供外呼 1:是 、0:否"`
+	TencentConferenceNumber string                     `description:"腾讯会议号"`
 }
 type ListArticleActivity struct {
 	Title   string `description:"文章标题"`
@@ -724,17 +729,18 @@ type CygxActivityLabelList struct {
 	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	City              string `description:"城市"`
 	Days              int    `description:"天数"`
+	ActivityTypeId    int    `description:"活动类型id"`
 }
 
 // 主题列表
 func GetActivityLabelListAll(condition, sortTime string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityLabelList, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	activity_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city
+	sql := `SELECT	activity_id,activity_type_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city,is_external_label
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` GROUP BY art.label ORDER BY ` + sortTime + ` ,art.activity_id DESC  LIMIT ?,? `
+	sql += ` GROUP BY art.activity_id ORDER BY ` + sortTime + ` ,art.activity_id DESC  LIMIT ?,? `
 
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
@@ -1014,6 +1020,7 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			art.chart_permission_id,
 			art.active_state,
 			t.activity_type,
+			t.img_url_text,
 			art.chart_permission_name,
 			art.distinguished_guest,
 			art.expert,
@@ -1025,7 +1032,9 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			art.activity_type_id,
 			art.limit_people_num,
 			art.is_limit_people,
+			art.city,
 			1 AS source_type,
+			art.is_yidong_conduct,
 			art.activity_time 
 		FROM
 			cygx_activity AS art
@@ -1043,6 +1052,7 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			art.chart_permission_id,
 			"",
 			art.special_type AS activity_type,
+			"",
 			art.chart_permission_name,
 			"",
 			"",
@@ -1054,7 +1064,9 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			"",
 			"",
 			"",
+			"",
 			2 AS source_type,
+			"",
 			art.activity_time 
 		FROM
 			cygx_activity_special AS art

+ 5 - 5
models/activity_special.go

@@ -5,14 +5,14 @@ import (
 	"github.com/beego/beego/v2/client/orm"
 )
 
-//专项调研活动列表
+// 专项调研活动列表
 type CygxActivitySpecialDetail struct {
 	ActivityId            int    `description:"活动ID "`
 	ActivityTypeName      string `description:"活动名称"`
 	SpecialType           int    `description:"调研形式、 1 线上 , 2 线下"`
 	City                  string `description:"调研城市"`
 	ChartPermissionName   string `description:"行业名称"`
-	ChartPermissionId     string `description:"行业Id"`
+	ChartPermissionId     int    `description:"行业Id"`
 	ResearchTheme         string `description:"调研主题"`
 	ActivityTimeText      string `description:"活动预期时间带文字"`
 	TripImgLink           string `description:"行程图片链接"`
@@ -40,7 +40,7 @@ type CygxActivitySpecialDetail struct {
 	AdminId               int    `description:"管理员ID"`
 }
 
-//获取数量
+// 获取数量
 func GetActivitySpecialCount(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
 	if condition != "" {
@@ -51,7 +51,7 @@ func GetActivitySpecialCount(condition string, pars []interface{}) (count int, e
 	return
 }
 
-//主题列表
+// 主题列表
 func GetActivitySpecialListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivitySpecialDetail, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT	*
@@ -64,7 +64,7 @@ func GetActivitySpecialListAll(condition string, pars []interface{}, startSize,
 	return
 }
 
-//修改发布状态
+// 修改发布状态
 func UpdateActivitySpecialPublishStatus(publishStatus, activityId int) (err error) {
 	sql := ` UPDATE cygx_activity_special SET  publish_status= ?  WHERE activity_id = ?`
 	o := orm.NewOrm()

+ 78 - 9
models/activity_special_trip.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"fmt"
 	//"hongze/hongze_admin/models"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
@@ -50,7 +51,7 @@ func GetCygxActivitySpecialTripList(condition string, pars []interface{}) (item
 	return
 }
 
-//获取某一用户的报名的数量
+// 获取某一用户的报名的数量
 func GetUserActivitySpecialTripCount(uid, activityId int) (count int, err error) {
 	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_special_trip  WHERE  user_id=?  AND   activity_id =? `
 	o := orm.NewOrm()
@@ -58,7 +59,7 @@ func GetUserActivitySpecialTripCount(uid, activityId int) (count int, err error)
 	return
 }
 
-//获取某一活动的报名的数量
+// 获取某一活动的报名的数量
 func GetActivitySpecialTripCountByActivityId(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_special_trip as t   INNER JOIN wx_user as  u on u.user_id = t.user_id WHERE    1 = 1 ` + condition
 	o := orm.NewOrm()
@@ -66,7 +67,7 @@ func GetActivitySpecialTripCountByActivityId(condition string, pars []interface{
 	return
 }
 
-//获取某一活动的报名的数量 (同时关联活动类型进行获取)
+// 获取某一活动的报名的数量 (同时关联活动类型进行获取)
 func GetActivitySpecialTripCountByActivitySpecial(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := ` SELECT COUNT(1) AS count
 		FROM
@@ -79,27 +80,60 @@ func GetActivitySpecialTripCountByActivitySpecial(condition string, pars []inter
 	return
 }
 
-//获取空降的公司报名的记录
+// 获取空降的公司报名的记录
 func GetActivitySpecialTripAirborneCountByActivitySpecial(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := ` SELECT COUNT(1) AS count
 		FROM
 			cygx_activity_special_meeting_detail AS t
 			INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
 		WHERE
-			 1= 1 ` + condition
+			 1= 1  	AND YEAR ( t.create_time )= YEAR (NOW()) ` + condition
 	o := orm.NewOrm()
 	err = o.Raw(sqlCount, pars).QueryRow(&count)
 	return
 }
 
-//添加
+// 添加
 func AddCygxActivitySpecialTrip(item *CygxActivitySpecialTrip) (err error) {
-	o := orm.NewOrm()
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
 	_, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	//itemBill := new(CygxActivitySpecialTripBill)
+	//itemBill.UserId = item.UserId
+	//itemBill.ActivityId = item.ActivityId
+	//itemBill.CreateTime = time.Now()
+	//itemBill.Mobile = item.Mobile
+	//itemBill.Email = item.Email
+	//itemBill.CompanyId = item.CompanyId
+	//itemBill.CompanyName = item.CompanyName
+	//itemBill.RealName = item.RealName
+	//itemBill.Source = 1
+	//itemBill.BillDetailed = -1 // 流水减一
+	//itemBill.DoType = 1
+	//itemBill.RegisterPlatform = 1
+	//itemBill.ChartPermissionId = itemActivity.ChartPermissionId
+	//
+	//_, err = o.Insert(itemBill)
+	//if err != nil {
+	//	return
+	//}
 	return
 }
 
-//取消
+// 取消
 func CancelActivitySpecialTrip(uid int, item *CygxActivitySpecialDetail) (err error) {
 	o := orm.NewOrm()
 	sql := `DELETE  FROM cygx_activity_special_trip   WHERE user_id=?  AND activity_id=? `
@@ -107,10 +141,45 @@ func CancelActivitySpecialTrip(uid int, item *CygxActivitySpecialDetail) (err er
 	return
 }
 
-//CancelActivitySpecialTripIsValid  处理活动报名是否有效
+// CancelActivitySpecialTripIsValid  处理活动报名是否有效
 func CancelActivitySpecialTripIsValid(isValid, activityId, userId int) (err error) {
 	sql := ` UPDATE cygx_activity_special_trip SET  is_valid= ?,is_cancel = 1  WHERE activity_id = ? AND  user_id = ? `
 	o := orm.NewOrm()
 	_, err = o.Raw(sql, isValid, activityId, userId).Exec()
 	return
 }
+
+type CygxActivitySpecialTripInit struct {
+	Id                int       `orm:"column(id);pk"`
+	UserId            int       `description:"用户id,多个用,隔开"`
+	ActivityId        int       `description:"活动ID"`
+	CreateTime        time.Time `description:"创建时间"`
+	Mobile            string    `description:"手机号"`
+	Email             string    `description:"邮箱号"`
+	CompanyId         int       `description:"公司ID"`
+	CompanyName       string    `description:"公司名称"`
+	RealName          string    `description:"用户实际名称"`
+	SellerName        string    `description:"所属销售"`
+	AdminId           int       `description:"销售/管理员ID"`
+	Source            int       `description:"来源,1小程序,2后台添加"`
+	OutboundMobile    string    `description:"外呼手机号"`
+	CountryCode       string    `description:"手机国家区号"`
+	IsCancel          string    `description:"是否取消,1是,0否"`
+	IsValid           int       `description:"参会报名是否有效 1:是,0"`
+	ChartPermissionId int       `description:"行业Id"`
+}
+
+func GetCygxActivitySpecialTripListinit(condition string, pars []interface{}) (item []*CygxActivitySpecialTripInit, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	t.*,
+	a.chart_permission_id 
+FROM
+	cygx_activity_special_trip AS t
+	INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
+WHERE
+	1 = 1 
+	AND is_valid = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 44 - 0
models/activity_special_trip_bill.go

@@ -0,0 +1,44 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivitySpecialTripBill struct {
+	Id                int       `orm:"column(id);pk"`
+	UserId            int       `description:"用户id,多个用,隔开"`
+	ActivityId        int       `description:"活动ID"`
+	CreateTime        time.Time `description:"创建时间"`
+	Mobile            string    `description:"手机号"`
+	Email             string    `description:"邮箱号"`
+	CompanyId         int       `description:"公司ID"`
+	CompanyName       string    `description:"公司名称"`
+	RealName          string    `description:"用户实际名称"`
+	AdminId           int       `description:"销售/管理员ID"`
+	Source            int       `description:"来源,1小程序,2后台添加, 3开发人员手动添加"`
+	BillDetailed      int       `description:"流水明细,判断是进账还是出账"`
+	DoType            int       `description:"操作方式,1报名,2取消报名"`
+	RegisterPlatform  int       `description:"来源 1小程序,2:网页"`
+	ChartPermissionId int       `description:"行业id"`
+}
+
+// 添加
+func AddCygxActivitySpecialTripBill(item *CygxActivitySpecialTripBill) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func GetCygxActivitySpecialTripBill(condition string, pars []interface{}) (item []*CygxActivitySpecialTripBill, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_special_trip_bill  
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 45 - 0
models/admin.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"time"
 )
 
 type AdminMobileResp struct {
@@ -15,3 +16,47 @@ func GetAdminByRole() (items []*AdminMobileResp, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+type Admin struct {
+	AdminId                   int    `orm:"column(admin_id);pk" description:"系统用户id"`
+	AdminName                 string `description:"系统用户名称"`
+	AdminAvatar               string `description:"用户头像"`
+	RealName                  string `description:"系统用户姓名"`
+	Password                  string `json:"-"`
+	LastUpdatedPasswordTime   string `json:"-"`
+	Enabled                   int
+	Email                     string `description:"系统用户邮箱"`
+	LastLoginTime             string
+	CreatedTime               time.Time
+	LastUpdatedTime           string
+	Role                      string    `description:"系统用户角色"`
+	Mobile                    string    `description:"手机号"`
+	RoleType                  int       `description:"角色类型:1需要录入指标,0:不需要"`
+	RoleId                    int       `description:"角色ID"`
+	RoleName                  string    `description:"角色名称"`
+	RoleTypeCode              string    `description:"角色类型编码"`
+	DepartmentId              int       `description:"部门id"`
+	DepartmentName            string    `description:"部门名称"`
+	GroupId                   int       `description:"分组id"`
+	GroupName                 string    `description:"分组名称"`
+	Authority                 int       `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	Position                  string    `description:"职位"`
+	DisableTime               time.Time `description:"禁用时间"`
+	ChartPermission           int8      `description:"图表权限id"`
+	OpenId                    string    `description:"弘则部门公众号的openid"`
+	UnionId                   string    `description:"微信公众平台唯一标识"`
+	EdbPermission             int8      `description:"指标库操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	MysteelChemicalPermission int8      `description:"钢联化工指标操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	PredictEdbPermission      int8      `description:"预测指标库操作权限,0:只能操作 自己的,1:所有预测指标可操作"`
+	Province                  string    `description:"省"`
+	ProvinceCode              string    `description:"省编码"`
+	City                      string    `description:"市"`
+	CityCode                  string    `description:"市编码"`
+}
+
+func GetSysAdminById(adminId int) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE admin_id=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, adminId).QueryRow(&item)
+	return
+}

+ 17 - 3
models/article.go

@@ -165,6 +165,7 @@ type ArticleDetail struct {
 	Annotation              string `description:"核心观点"`
 	IsShowFollowButton      bool   `description:"是否展示关注取关按钮"`
 	IsFollowButton          bool   `description:"是否关注"`
+	IsRoadShow              bool   `description:"是否是路演精华"`
 }
 
 type ArticleDetailFileLink struct {
@@ -214,12 +215,11 @@ func GetArticleDetailByIdStr(articleIdStr string) (items []*ArticleDetail, err e
 func GetArticlePermission(companyId int) (item *ChartPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
-			b.* 
+			a.chart_permission_name as  permission_name
 			FROM
 			cygx_report_mapping AS a
-			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id 
 			WHERE
-			a.category_id = ?`
+			a.category_id = ? LIMIT  1 `
 	err = o.Raw(sql, companyId).QueryRow(&item)
 	//_, err = o.Raw(sql, companyId).QueryRows(&item)
 	return
@@ -709,3 +709,17 @@ WHERE
 type SummaryArticleStockResp struct {
 	List []*SummaryArticleStock
 }
+
+// 综述报告
+func GetArticleStock() (items []*SummaryArticleStock, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			stock,article_id
+		FROM
+			cygx_article AS art 
+		WHERE
+			1 = 1 
+			AND type_name = '综述报告' `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 12 - 4
models/article_collect.go

@@ -21,7 +21,7 @@ type CygxArticleCollect struct {
 	RealName        string `description:"用户实际名称"`
 }
 
-//添加收藏信息
+// 添加收藏信息
 func AddCygxArticleCollect(item *CygxArticleCollect) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -79,7 +79,15 @@ func GetCygxArticleCollectList(condition string) (items []*CygxArticleCollect, e
 	return
 }
 
-//修改用户收藏文章的相关信息
+// GetCygxArticleCollectByUser 根据用户ID获取所有文章收藏
+func GetCygxArticleCollectByUser(userId int) (items []*CygxArticleCollect, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_article_collect  WHERE 1 =1  AND article_id > 0 AND  user_id =?  `
+	_, err = o.Raw(sql, userId).QueryRows(&items)
+	return
+}
+
+// 修改用户收藏文章的相关信息
 func UpdateCygxArticleCollect(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
 	var sql string
@@ -98,7 +106,7 @@ type CygxArticleCollectCountRep struct {
 	Num       int `description:"数量"`
 }
 
-//获取文章被收藏的数量
+// 获取文章被收藏的数量
 func GetUserArticleCollectList() (items []*CygxArticleCollectCountRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -119,7 +127,7 @@ func GetUserArticleCollectList() (items []*CygxArticleCollectCountRep, err error
 	return
 }
 
-//修改文章收藏的数量
+// 修改文章收藏的数量
 func UpdateArticleCollectCountNum(num, articleId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE cygx_article SET user_collection_num = ? WHERE article_id = ?`

+ 4 - 2
models/article_comment.go

@@ -23,7 +23,7 @@ type CygxArticleComment struct {
 	Title           string    `description:"标题"`
 }
 
-//添加留言
+// 添加留言
 func AddArticleComment(item *CygxArticleComment) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -35,7 +35,7 @@ type AddCygxArticleCommentReq struct {
 	Content   string `description:"内容"`
 }
 
-//我的留言列表
+// 我的留言列表
 func GetCommentList(userId int) (items []*CygxArticleComment, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -63,6 +63,8 @@ type CygxArticleCommentResp struct {
 	Content      string    `description:"内容"`
 	Title        string    `description:"标题"`
 	RedirectType int       `description:"跳转类型 1文章 2活动 3产业资源包"`
+	IsCollect    bool      `description:"是否收藏:true,已收藏,false:未收藏"`
+	IsRoadShow   bool      `description:"是否是路演精华"`
 }
 
 type CygxCommentListResp struct {

+ 23 - 9
models/company.go

@@ -77,6 +77,21 @@ func GetCountCompanyDetailByIdGroup(companyId int) (count int, err error) {
 //}
 
 func GetCompanyPermission(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1
+			AND c.status IN('正式','试用','永续')
+			AND a.status IN('正式','试用','永续') `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
+func GetCompanyPermissionName(companyId int) (permission string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT b.chart_permission_name  ORDER BY b.sort ASC SEPARATOR ',') AS permission
 			FROM company_report_permission AS a
 			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
@@ -128,7 +143,7 @@ func GetCompanyPermissionList(companyId int) (items []*PermissionItem, err error
 	return
 }
 
-//获取用户权限不限制状态
+// 获取用户权限不限制状态
 func GetCompanyPermissionByUserNoStatus(companyId int) (permission string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
 			FROM company_report_permission AS a
@@ -142,7 +157,7 @@ func GetCompanyPermissionByUserNoStatus(companyId int) (permission string, err e
 	return
 }
 
-//获取正式权限
+// 获取正式权限
 func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
 			FROM company_report_permission AS a
@@ -151,8 +166,7 @@ func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err e
 			WHERE  a.company_id=?
 			AND c.is_suspend=0
             AND b.cygx_auth=1
-			AND c.status IN('正式')
-			AND a.status IN('正式') `
+			AND c.status IN('正式') `
 	o := orm.NewOrm()
 	err = o.Raw(sql, companyId).QueryRow(&permission)
 	return
@@ -186,7 +200,7 @@ func GetCompanyDetailAllById(companyId int) (item *CompanyDetail, err error) {
 	return
 }
 
-//获取对应销售以及销售的手机号
+// 获取对应销售以及销售的手机号
 func GetSellerDetailAllByCompanyId(companyId int) (item *CompanyDetail, err error) {
 	sql := ` SELECT c.mobile ,c.real_name as seller_name
 			FROM
@@ -222,7 +236,7 @@ type CompanyProductDetial struct {
 	Scale     string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
 }
 
-//获取对应销售以及销售的手机号
+// 获取对应销售以及销售的手机号
 func GetCompanyProductDetail(companyId, productId int) (item *CompanyProductDetial, err error) {
 	sql := ` SELECT * FROM company_product WHERE company_id = ? AND product_id = ?; `
 	o := orm.NewOrm()
@@ -230,7 +244,7 @@ func GetCompanyProductDetail(companyId, productId int) (item *CompanyProductDeti
 	return
 }
 
-//获取公司详情详情
+// 获取公司详情详情
 func GetCompanyByName(companyName string) (item *Company, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *  FROM company WHERE company_name = ? LIMIT 1`
@@ -238,7 +252,7 @@ func GetCompanyByName(companyName string) (item *Company, err error) {
 	return
 }
 
-//获取公司详情详情
+// 获取公司详情详情
 func GetCompanyByThirdName(tripartiteCompanyCode string) (item *Company, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *  FROM company WHERE tripartite_company_code = ? LIMIT 1`
@@ -246,7 +260,7 @@ func GetCompanyByThirdName(tripartiteCompanyCode string) (item *Company, err err
 	return
 }
 
-//更新机构互动量
+// 更新机构互动量
 func UpdateComapanyInteractionNum(interactionNum, companyId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE company SET interaction_num = ? WHERE company_id=? `

+ 5 - 6
models/company_activity_trip.go

@@ -60,23 +60,22 @@ func GetCompanyPermissionByUserTrip(companyId int) (permission string, err error
 	return
 }
 
-//获取正式权限
+// 获取可查看升级权限的正式权限
 func GetCompanyPermissionByUserZhengShiTrip(companyId int) (permission string, err error) {
-	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.chart_permission_name  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
 			FROM company_report_permission AS a
 			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
 			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
 			WHERE  a.company_id=?
 			AND c.is_suspend=0
             AND b.cygx_auth=1
-			AND a.is_upgrade = 1 
-			AND c.status IN('正式')  `
+			AND ( a.is_upgrade = 1 AND c.STATUS = '正式' OR c.STATUS = '永续' ) `
 	o := orm.NewOrm()
 	err = o.Raw(sql, companyId).QueryRow(&permission)
 	return
 }
 
-//GetCompanyReportPermissionUpgrade 获取升级的权限类型
+// GetCompanyReportPermissionUpgrade 获取升级的权限类型
 func GetCompanyReportPermissionUpgrade(companyId, productId int) (items []*CompanyReportPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -109,7 +108,7 @@ func GetChartPermissionByIds(permissionIds []string) (list []*ChartPermission, e
 	return
 }
 
-//GetCompanyPermissionNameCheck 通过名称判断客户是否开了某一类型的权限
+// GetCompanyPermissionNameCheck 通过名称判断客户是否开了某一类型的权限
 func GetCompanyPermissionNameCheck(companyId, productId int, permissionName string) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT

+ 22 - 0
models/company_user_type.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxCompanyUserType struct {
+	Id             int `orm:"column(id);pk" description:"分析师id"`
+	CompanyId      int
+	CustomerTypeId int       `description:"用户身份ID"`
+	CreateTime     time.Time `description:"创建时间"`
+	ModifyTime     time.Time `description:"创建时间"`
+}
+
+// 通过活动ID获取详情
+func GetCygxCompanyUserType(companyId int) (item *CygxCompanyUserType, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM cygx_company_user_type AS a WHERE a.company_id=?  `
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}

+ 3 - 0
models/db.go

@@ -131,6 +131,9 @@ func init() {
 		new(CygxResearchSummaryVoiceHistory),
 		new(CygxMinutesSummaryVoiceHistory),
 		new(CygxReportSelectionVoiceHistory),
+		new(CygxActivitySpecialTripBill),
+		new(CygxXzsChooseCategory),
+		new(CygxReportSelectionSubjectHistory),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 9 - 6
models/minutesSummary.go

@@ -13,18 +13,21 @@ type DetailCygxMinutesSummaryRep struct {
 	VideoPlaySeconds string `description:"时长"`
 	VideoName        string `description:"音频名称"`
 	Abstract         string `description:"摘要"`
+	VisibleRange     int    `description:"设置可见范围1全部,0内部"`
 }
 
 type MinutesSummaryLetailRespV4 struct {
 	Detail        *DetailCygxMinutesSummaryRep
 	HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
 	List          []*ResearchSummaryChartPermission
+	IsShow        bool `description:"是否展示"`
 }
 
 type MinutesSummaryLetailResp struct {
 	Detail        *DetailCygxMinutesSummaryRep
 	HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
 	List          []*MinutesSummaryChartPermission
+	IsShow        bool `description:"是否展示"`
 }
 
 type MinutesSummaryChartPermission struct {
@@ -49,7 +52,7 @@ type MinutesSummaryId struct {
 	ArticleId int `description:"报告I"`
 }
 
-//通过纪要ID获取详情
+// 通过纪要ID获取详情
 func GetCygxMinutesSummaryInfoById(articleId int) (item *DetailCygxMinutesSummaryRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_minutes_summary  WHERE article_id=? AND publish_status = 1 `
@@ -57,7 +60,7 @@ func GetCygxMinutesSummaryInfoById(articleId int) (item *DetailCygxMinutesSummar
 	return
 }
 
-//列表
+// 列表
 func GetMinutesSummarylogListAllV4(articleId int) (items []*ResearchSummaryChartPermission, err error) {
 	o := orm.NewOrm()
 	//sql := `SELECT c.permission_name ,c.image_url,l.*
@@ -76,7 +79,7 @@ func GetMinutesSummarylogListAllV4(articleId int) (items []*ResearchSummaryChart
 	return
 }
 
-//列表
+// 列表
 func GetMinutesSummarylogListAll(articleId int) (items []*MinutesSummaryChartPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT c.permission_name ,c.image_url,l.*
@@ -90,7 +93,7 @@ func GetMinutesSummarylogListAll(articleId int) (items []*MinutesSummaryChartPer
 	return
 }
 
-//列表
+// 列表
 func GetMinutesSummarylogSonListAll(articleId, chartPermissionId int) (items []*CygxMinutesSummaryLogDetail, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT   l.link_article_id,l.body ,a.video_url 
@@ -102,7 +105,7 @@ func GetMinutesSummarylogSonListAll(articleId, chartPermissionId int) (items []*
 	return
 }
 
-//列表
+// 列表
 func GetMinutesSummarylogSonListSecond(articleId int, artType string) (items []*CygxResearchSummaryLogSecond, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT c.permission_name ,c.chart_permission_id ,c.image_url_m as image_url, l.* 
@@ -116,7 +119,7 @@ func GetMinutesSummarylogSonListSecond(articleId int, artType string) (items []*
 	return
 }
 
-//列表
+// 列表
 func GetMinutesSummarylogListThird(articleId, chartPermissionId int, artType string) (items []*CygxResearchSummaryLogThird, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT  l.link_article_id,l.body ,a.video_url

+ 9 - 2
models/report.go

@@ -297,12 +297,17 @@ type ReportDetailRoadshow struct {
 	Body             string `description:"内容"`
 	CategoryName     string `description:"行业名称"`
 	ReportLink       string `orm:"column(link_article_id)"description:"报告链接"`
+	IsCollect        bool   `description:"是否收藏:true,已收藏,false:未收藏"`
+	IsRoadShow       bool   `description:"是否是路演精华"`
+	CategoryId       int    `description:"文章分类ID"`
+	VisibleRange     int    `description:"设置可见范围1全部,0内部"`
 }
 
 type RoadshowDetailResp struct {
 	Detail        *ReportDetailRoadshow
-	HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
-	HasFree       int `description:"1:已付费(至少包含一个品类的权限),2:未付费(没有任何品类权限)"`
+	HasPermission int  `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	HasFree       int  `description:"1:已付费(至少包含一个品类的权限),2:未付费(没有任何品类权限)"`
+	IsShow        bool `description:"是否展示"`
 }
 
 func GetReportRoadshowDetailById(articleId int) (item *ReportDetailRoadshow, err error) {
@@ -908,6 +913,8 @@ type ArticleReportBillboardResp struct {
 	Pv             int    `description:"PV"`
 	CollectNum     int    `description:"收藏人数"`
 	Source         int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	IsRoadShow     bool   `description:"是否是路演精华"`
+	CategoryId     int    `description:"分类ID"`
 	List           []*IndustrialManagementIdInt
 }
 

+ 29 - 4
models/report_mapping.go

@@ -56,7 +56,7 @@ func GetReportMappingStrategyAll() (items []*ReportMapping, err error) {
 }
 
 // 获取策略下面的所有分类
-func GetReportMappingStrategyHomeAll() (items []*ReportMappingHome, err error) {
+func GetReportMappingStrategyHomeAll(chartPermissionId int) (items []*ReportMappingHome, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
 	re.category_id,re.sub_category_name,re.match_type_name
@@ -65,12 +65,12 @@ FROM
 	INNER JOIN cygx_article AS art ON art.category_id = re.category_id 
 WHERE
 	re.report_type = 1 
-	AND re.chart_permission_id = 23 
+	AND re.chart_permission_id = ? 
 GROUP  BY
 	re.match_type_name
 ORDER BY
 	sort DESC , art.publish_date DESC`
-	_, err = o.Raw(sql).QueryRows(&items)
+	_, err = o.Raw(sql, chartPermissionId).QueryRows(&items)
 	return
 }
 
@@ -136,7 +136,7 @@ func GetdetailByCategoryIdSet(categoryId int) (ids string, err error) {
 // 通过分类ID获取详情
 func GetdetailByCategoryIdPush(categoryId int) (item *ReportMapping, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_report_mapping WHERE category_id=? `
+	sql := `SELECT * FROM cygx_report_mapping WHERE category_id=?  LIMIT 1 `
 	err = o.Raw(sql, categoryId).QueryRow(&item)
 	return
 }
@@ -252,3 +252,28 @@ WHERE
 	err = o.Raw(sql, categoryId).QueryRow(&item)
 	return
 }
+
+// 获取分类
+func GetReportMappingList(condition string, pars []interface{}) (items []*ReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping WHERE  1=1 `
+	if condition != `` {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取所有的报告分类
+func GetReportMappingByPermissionName(chartPermissionName string) (items []*ReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				* 
+			FROM
+				cygx_report_mapping
+			WHERE
+				1 = 1 
+				AND chart_permission_name = ? `
+	_, err = o.Raw(sql, chartPermissionName).QueryRows(&items)
+	return
+}

+ 2 - 0
models/report_selection.go

@@ -40,6 +40,7 @@ type DetailCygxReportSelectionRep struct {
 	MarketStrategy     string `description:"市场策略核心逻辑汇总"`
 	ReportLink         string `description:"报告链接"`
 	CeLueArticleId     int    `description:"策略报告详情"`
+	VisibleRange       int    `description:"设置可见范围1全部,0内部"`
 }
 
 type ReportSelectionLetailResp struct {
@@ -47,6 +48,7 @@ type ReportSelectionLetailResp struct {
 	HasPermission         int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
 	List                  []*ReportSelectionChartPermission
 	ListPermissionSubject []*ReportSelectionChartLogPermission `description:"行业列表"`
+	IsShow                bool                                 `description:"是否展示"`
 }
 
 type ReportSelectionChartPermission struct {

+ 31 - 0
models/report_selection_subject_history.go

@@ -0,0 +1,31 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportSelectionSubjectHistory struct {
+	Id                  int       `orm:"column(id);pk"`
+	ArticleId           int       `description:"文章ID"`
+	UserId              int       `description:"用户ID"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	Mobile              string    `description:"手机号"`
+	Email               string    `description:"邮箱"`
+	CompanyId           int       `description:"公司id"`
+	CompanyName         string    `description:"公司名称"`
+	IndustrialSubjectId int       `description:"标的ID"`
+}
+
+type AddCygxReportSelectionSubjectHistoryReq struct {
+	ArticleId           int `description:"文章id"`
+	IndustrialSubjectId int `description:"标的ID"`
+}
+
+// 添加
+func AddCygxReportSelectionSubjectHistory(item *CygxReportSelectionSubjectHistory) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 5 - 5
models/researchSummary.go

@@ -51,7 +51,7 @@ type ResearchSummaryId struct {
 	ArticleId int `description:"报告I"`
 }
 
-//通过纪要ID获取详情
+// 通过纪要ID获取详情
 func GetCygxResearchSummaryInfoById(articleId int) (item *DetailCygxResearchSummaryRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_research_summary  WHERE article_id=?  AND publish_status = 1 `
@@ -72,7 +72,7 @@ type CygxResearchSummaryLog struct {
 	Type                   string    `description:"类型'SDBG深度报告片篇,’CYDYJY:产业调研纪要’,’SJDP事件点评,’BZCHJH:本周晨会精华’"`
 }
 
-//列表
+// 列表
 func GetResearchSummarylogListFirst(articleId int) (items []*ResearchSummaryChartPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT l.* 
@@ -84,7 +84,7 @@ func GetResearchSummarylogListFirst(articleId int) (items []*ResearchSummaryChar
 	return
 }
 
-//列表
+// 列表
 func GetResearchSummarylogSonListSecond(articleId int, artType string) (items []*CygxResearchSummaryLogSecond, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT c.permission_name ,c.chart_permission_id ,c.image_url_m as image_url, l.* 
@@ -98,7 +98,7 @@ func GetResearchSummarylogSonListSecond(articleId int, artType string) (items []
 	return
 }
 
-//列表
+// 列表
 func GetResearchSummarylogSonListThird(articleId, chartPermissionId int, artType string) (items []*CygxResearchSummaryLogThird, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT  l.link_article_id,l.body ,a.video_url
@@ -129,4 +129,4 @@ func UpdateReportSelectionVoiceCounts(articleId int) (err error) {
 	o := orm.NewOrm()
 	_, err = o.Raw(sql, articleId).Exec()
 	return
-}
+}

+ 12 - 12
models/user.go

@@ -154,7 +154,7 @@ func GetArticleUserCollectCount(userId int) (count int, err error) {
 }
 
 func GetArticleUserCollectList(startSize, pageSize, userId int) (items []*ArticleReportBillboardResp, err error) {
-	sql := `SELECT a.* FROM cygx_article_collect AS a INNER JOIN cygx_article as art ON art.article_id = a.article_id
+	sql := `SELECT a.*,art.category_id FROM cygx_article_collect AS a INNER JOIN cygx_article as art ON art.article_id = a.article_id
 			WHERE a.user_id=? 
            ORDER BY a.create_time DESC LIMIT ?,? `
 	_, err = orm.NewOrm().Raw(sql, userId, startSize, pageSize).QueryRows(&items)
@@ -239,7 +239,7 @@ func AddCountryCode(CountryCode string, user *WxUserItem) (err error) {
 	return
 }
 
-//修改外呼手机号
+// 修改外呼手机号
 type OutboundMobileItem struct {
 	OutboundMobile      string `description:"外呼手机号"`
 	OutboundCountryCode string `description:"外呼手机号区号"`
@@ -271,7 +271,7 @@ func AddOutboundMobile(item *OutboundMobileItem, userId int) (err error) {
 	return
 }
 
-//用户绑定手机号时同时绑定外呼手机号
+// 用户绑定手机号时同时绑定外呼手机号
 func BindUserOutboundMobile(mobile, countryCode string, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET outbound_mobile=? ,outbound_country_code = ?, country_code= ? WHERE user_id=? `
@@ -279,7 +279,7 @@ func BindUserOutboundMobile(mobile, countryCode string, userId int) (err error)
 	return
 }
 
-//已经绑定手机号,没有绑定外呼手机号的的用户,预约外呼的时候,将外呼手机号同步成手机号
+// 已经绑定手机号,没有绑定外呼手机号的的用户,预约外呼的时候,将外呼手机号同步成手机号
 func BindUserOutboundMobileByMobile(mobile, countryCode string, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET outbound_mobile=? ,outbound_country_code = ? WHERE user_id=? `
@@ -287,7 +287,7 @@ func BindUserOutboundMobileByMobile(mobile, countryCode string, userId int) (err
 	return
 }
 
-//将手机号为11位的用户,区号默认设置为86
+// 将手机号为11位的用户,区号默认设置为86
 func ChangeUserOutboundMobileByMobile(userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET country_code = 86 WHERE user_id=? `
@@ -310,7 +310,7 @@ type UserWhiteListRep struct {
 	List []*UserWhiteList
 }
 
-//获取正式试用用户白名单
+// 获取正式试用用户白名单
 func GetFormalUserWhiteList(fieldStr, condition string) (items []*UserWhiteList, err error) {
 	sql := `SELECT ` + fieldStr + `
 		(SELECT cp.seller_name FROM company_product  AS cp WHERE cp.company_id = u.company_id ORDER BY cp.product_id DESC  LIMIT 0,1 ) as seller_name,
@@ -329,7 +329,7 @@ func GetFormalUserWhiteList(fieldStr, condition string) (items []*UserWhiteList,
 	return
 }
 
-//获取永续用户白名单
+// 获取永续用户白名单
 func GetSustainableUserWhiteList(fieldStr, condition string) (items []*UserWhiteList, err error) {
 	sql := `SELECT ` + fieldStr + `
 			(SELECT cp.seller_name FROM company_product  AS cp WHERE cp.company_id = u.company_id ORDER BY cp.product_id DESC  LIMIT 0,1 ) as seller_name,
@@ -355,7 +355,7 @@ func GetSustainableUserWhiteList(fieldStr, condition string) (items []*UserWhite
 	return
 }
 
-//权益用户
+// 权益用户
 type GetSendEmailAllUserWithRAIRep struct {
 	CompanyName  string `description:"客户名称"`
 	CreditCode   string `description:"社会统一信用码"`
@@ -402,7 +402,7 @@ func GetSendEmailAllUserWithRAI() (items []*GetSendEmailAllUserWithRAIRep, err e
 	return
 }
 
-//权益用户
+// 权益用户
 type GetSendEmailAllUserWithCompanyRep struct {
 	RealName    string `description:"姓名"`
 	Mobile      string `description:"手机号"`
@@ -440,7 +440,7 @@ type Headimgurl struct {
 	Headimgurl string `description:"用户头像"`
 }
 
-//更改用户手机号
+// 更改用户手机号
 func UpdateUserHeadimgurl(headimgurl string, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET headimgurl = ? WHERE user_id=? `
@@ -448,7 +448,7 @@ func UpdateUserHeadimgurl(headimgurl string, userId int) (err error) {
 	return
 }
 
-//更新用户标签
+// 更新用户标签
 func UpdateUserLabel(userLabel string, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET user_label = ? WHERE user_id=? `
@@ -456,7 +456,7 @@ func UpdateUserLabel(userLabel string, userId int) (err error) {
 	return
 }
 
-//更新用户互动量
+// 更新用户互动量
 func UpdateUserInteractionNum(interactionNum, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wx_user SET interaction_num = ? WHERE user_id=? `

+ 14 - 9
models/wx_template_msg.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_cygx/utils"
 )
 
 type SendTemplateResponse struct {
@@ -27,15 +28,6 @@ func GetOpenIdList() (items []*OpenIdList, err error) {
 	return
 }
 
-func GetWxOpenIdList() (items []*OpenIdList, err error) {
-	sql := `SELECT open_id FROM wx_user AS wu 
-          INNER JOIN company AS c ON c.company_id = wu.company_id 
-          WHERE open_id=? `
-	openId := "oW3Gts7V3hj-sTAE1VDi0MhGlee8"
-	_, err = orm.NewOrm().Raw(sql, openId).QueryRows(&items)
-	return
-}
-
 func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
 	//sql := `SELECT * FROM user_record WHERE bind_account IN (` + utils.WxMsgTemplateIdAskMsgMobile + `) AND create_platform = 1`
 	sql := `SELECT cr.*,user_id FROM user_record  as c
@@ -68,3 +60,16 @@ func GetAdminOpendidByCompany(condition string, pars []interface{}) (list []*Adm
 	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&list)
 	return
 }
+
+func GetWxOpenIdByMobileSliceList(mobiles []string) (items []*OpenIdList, err error) {
+	itemsLen := len(mobiles)
+	if itemsLen == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT cr.*,user_id FROM user_record  as c
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = c.union_id
+			WHERE bind_account IN (` + utils.GetOrmInReplace(itemsLen) + `) AND create_platform = 4`
+	_, err = o.Raw(sql, mobiles).QueryRows(&items)
+	return
+}

+ 42 - 0
models/xzs_choose_category.go

@@ -0,0 +1,42 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxXzsChooseCategory struct {
+	Id          int       `orm:"column(id);pk"`
+	UserId      int       `description:"用户ID"`
+	Mobile      string    `description:"手机号"`
+	Email       string    `description:"邮箱"`
+	CompanyId   int       `description:"公司id"`
+	CompanyName string    `description:"公司名称"`
+	RealName    string    `description:"用户实际名称"`
+	CategoryId  int       `description:"权益文章对应分类,cygx_article"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+}
+
+// 根据手机号获取用户关注的产业
+func GetCygxXzsChooseCategoryList(mobile string) (items []*CygxXzsChooseCategory, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_xzs_choose_category WHERE mobile = ?`
+	_, err = o.Raw(sql, mobile).QueryRows(&items)
+	return
+}
+
+// 添加
+func AddCygxCategoryFllow(item *CygxXzsChooseCategory) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 删除
+func RemoveCygxCategoryFllow(mobile string, CategoryId int) (err error) {
+	o := orm.NewOrm()
+	sql := `DELETE FROM cygx_xzs_choose_category WHERE mobile=? AND category_id=? `
+	_, err = o.Raw(sql, mobile, CategoryId).Exec()
+	return
+}

+ 26 - 17
routers/commentsRouter.go

@@ -124,15 +124,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
-        beego.ControllerComments{
-            Method: "ActivityList",
-            Router: `/list_del_test`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "MeetingReminderAdd",
@@ -189,8 +180,8 @@ func init() {
 
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
-            Method: "SpecialDetail",
-            Router: `/special/detail`,
+            Method: "SpecialList",
+            Router: `/special/del_list`,
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),
             Filters: nil,
@@ -198,18 +189,18 @@ func init() {
 
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
-            Method: "SpecialMsg",
-            Router: `/special/follow`,
-            AllowHTTPMethods: []string{"post"},
+            Method: "SpecialDetail",
+            Router: `/special/detail`,
+            AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
 
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
-            Method: "SpecialList",
-            Router: `/special/list`,
-            AllowHTTPMethods: []string{"get"},
+            Method: "SpecialMsg",
+            Router: `/special/follow`,
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -1024,6 +1015,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ReportSelectionController"],
+        beego.ControllerComments{
+            Method: "ClickHistory",
+            Router: `/click/history`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ReportSelectionController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ResearchController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ResearchController"],
         beego.ControllerComments{
             Method: "ArticleHotList",

+ 5 - 0
routers/router.go

@@ -139,6 +139,11 @@ func init() {
 				&controllers.IndustryController{},
 			),
 		),
+		web.NSNamespace("/report_selection",
+			web.NSInclude(
+				&controllers.ReportSelectionController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 237 - 51
services/activity.go

@@ -313,7 +313,6 @@ func EditUserOutboundMobile(cont context.Context) (err error) {
 
 // 获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户
 func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
-
 	var permissionStr, permissionZhengShiStr string
 	if companyId <= 1 {
 		userType = 0
@@ -331,43 +330,42 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 				err = errs
 				return
 			}
-			permissionStr, errs = models.GetCompanyPermissionByUser(companyId)
+			permissionStr, errs = models.GetCompanyPermission(companyId)
 			if errs != nil {
 				err = errs
 				return
 			}
+			permissionStrnew = permissionStr
+			//大套餐客户,数据库添加标识,
+			companyUserTypeDetail, errs := models.GetCygxCompanyUserType(companyId)
+			if errs != nil && errs.Error() != utils.ErrNoRow() {
+				err = errs
+				return
+			}
+			if companyUserTypeDetail != nil {
+				if companyUserTypeDetail.CustomerTypeId != 0 {
+					userType = companyUserTypeDetail.CustomerTypeId
+					return
+				}
+			}
 			permissionZhengShiStr, errs = models.GetCompanyPermissionByUserZhengShi(companyId)
 			if errs != nil {
 				err = errs
 				return
 			}
-
-			//1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
+			//1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户、 10: 30W套餐客户
 			//大套餐客户定义:医药、消费、科技、智造、策略。5个行业中任意4个及以上是正式权限的,属于大套餐客户(医药、消费、科技、智造需要主客观都开)
 			if companyDetail.Status == "永续" {
 				userType = 1
 			} else if companyDetail.Status == "试用" {
 				userType = 5
-			} else if companyDetail.Status == "正式" {
-				if permissionStr == "专家" {
-					userType = 4
-				} else if strings.Count(permissionZhengShiStr, "医药") == 2 && strings.Count(permissionZhengShiStr, "消费") == 2 && strings.Count(permissionZhengShiStr, "科技") == 2 && strings.Count(permissionZhengShiStr, "智造") == 2 {
-					userType = 2
-				} else {
-					userType = 3
-				}
-				if userType == 3 {
-					if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
-						userType = 4
-					}
-				}
 			} else if companyDetail.Status == "冻结" {
 				userType = 6
 			} else if companyDetail.Status == "流失" {
 				userType = 7
 			}
 			//大套餐客户定义:医药、消费、科技、智造、策略。5个行业中任意4个及以上是正式权限的,属于大套餐客户(医药、消费、科技、智造需要主客观都开)
-			if userType == 3 {
+			if userType == 0 && companyDetail.Status == "正式" {
 				var permissionZhegnshiNum int
 				if strings.Count(permissionZhengShiStr, "医药") == 2 {
 					permissionZhegnshiNum++
@@ -384,8 +382,17 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 				if strings.Count(permissionZhengShiStr, "策略") == 1 {
 					permissionZhegnshiNum++
 				}
+				if strings.Count(permissionZhengShiStr, "路演服务") == 1 {
+					permissionZhegnshiNum++
+				}
+				//if permissionZhegnshiNum == 6 {
+				//	userType = 2
+				//} else
+				//大套餐客户,数据库添加标识,条件大于等于四的都是 30W套餐客户
 				if permissionZhegnshiNum >= 4 {
-					userType = 2
+					userType = 10
+				} else {
+					userType = 3
 				}
 			}
 		}
@@ -394,6 +401,139 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 	return
 }
 
+// GetSpecialDetailUserPower 处理用户查看详情的权限
+func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.ActivityDetail) (havePower bool, err error) {
+	var companyDetailStatus string
+	var userTypeStr string
+	//如果是弘则的用户或者宏观的权限不做校验
+	if user.CompanyId == utils.HZ_COMPANY_ID || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
+		havePower = true
+		return
+	}
+	userType, permissionStr, e := GetUserType(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+		return
+	}
+	if activityInfo.LimitPeopleNum > 0 {
+		mapUserType, e := GetActivityCcustomerTypeList()
+		if e != nil {
+			err = e
+			return
+		}
+		userTypeStr = mapUserType[userType]
+		// 永续客户、大套餐客户、30W套餐客户可以查看行业升级套餐客户 权限
+		if userTypeStr == "1" || userTypeStr == "2" || userTypeStr == "AA" {
+			if strings.Contains(activityInfo.CustomerTypeIds, userTypeStr) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
+				havePower = true
+				//return
+			}
+		}
+	}
+	//判断管理规模是否满足
+	companyProduct, e := models.GetCompanyProductDetail(user.CompanyId, 2)
+	if e != nil {
+		err = e
+		return
+	}
+	if companyProduct != nil && activityInfo.Scale != "" {
+		if strings.Contains(activityInfo.Scale, companyProduct.Scale) {
+			havePower = true
+		}
+	}
+
+	if user.CompanyId <= 1 {
+		return
+	} else {
+		if permissionStr == "" {
+			return
+		} else {
+			companyDetail, e := models.GetCompanyDetailById(user.CompanyId)
+			if e != nil {
+				err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+				return
+			}
+			if companyDetail == nil {
+				err = errors.New("客户不存在,uid:" + strconv.Itoa(user.UserId) + "CompanyId:" + strconv.Itoa(user.CompanyId))
+				return
+			}
+			companyDetailStatus = companyDetail.Status
+		}
+	}
+	if activityInfo.ChartPermissionId == 1 {
+		havePower = true
+		return
+	}
+	if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
+		havePower = true
+	} else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
+		havePower = true
+	} else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
+		havePower = true
+	} else if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
+		havePower = true
+	}
+	if (strings.Contains(activityInfo.ChartPermissionName, "研选") || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+		havePower = true
+		return
+	}
+	if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 || activityInfo.ActivityTypeId == 7 {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
+			havePower = true
+		} else {
+			havePower = false
+		}
+	} else {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(客观)") {
+			havePower = true
+		} else {
+			havePower = false
+		}
+	}
+	//如果主客观校验不通过,那么直接返回
+	if !havePower {
+		return
+	}
+
+	//如果是易董的活动且属于研选类型,只要开通任何权限就可以查看详情
+	if activityInfo.YidongActivityId != "" && permissionStr != "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+		havePower = true
+	}
+
+	permissionShengji, errs := models.GetCompanyPermissionByUserTrip(user.CompanyId)
+	if errs != nil {
+		err = errs
+		return
+	}
+
+	//fmt.Println("主客观2", havePower)
+	//if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, userTypeStr) {
+	//	havePower = true
+	//}
+	//fmt.Println("主客观3", havePower)
+	//处理升级权限以及用户身份的 双重判断
+	if activityInfo.CustomerTypeIds != "" {
+		if !strings.Contains(activityInfo.CustomerTypeIds, userTypeStr) && userTypeStr != "8" {
+			havePower = false
+			if strings.Contains(permissionShengji, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
+				havePower = true
+			}
+		}
+	}
+	if havePower && activityInfo.LimitPeopleNum > 0 {
+		//对于一些特殊的活动,即使权限满足也不给产看
+		noPower, e := GetShareNoPowe(activityInfo, permissionStr, userType, user)
+		if e != nil {
+			err = errors.New("GetShareNoPowe, Err: " + e.Error())
+			return
+		}
+		if noPower {
+			havePower = false
+		}
+	}
+	return
+}
+
 // 校验被分享的用户是否有查看详情的权限
 func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int, user *models.WxUserItem) (noPower bool, err error) {
 	//如果是弘则的就不进行可见权限校验
@@ -401,21 +541,33 @@ func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, u
 		return
 	}
 	//var noPower bool
-	if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
-		noPower = true
-	}
+	//if !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
+	//	noPower = true
+	//}
 	//1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
-	if userType == 2 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
-		noPower = true
-	}
-	if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
-		noPower = true
-	}
-	if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
-		noPower = true
-	}
-	if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
-		noPower = true
+	//if userType == 2 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
+	//	noPower = true
+	//}
+	//if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
+	//	noPower = true
+	//}
+	//if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
+	//	noPower = true
+	//}
+	//if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
+	//	noPower = true
+	//}
+	fmt.Println(userType)
+	if userType == 8 {
+		permissionShengji, errs := models.GetCompanyPermissionByUserZhengShiTrip(user.CompanyId)
+		if errs != nil {
+			err = errs
+			return
+		}
+		if !strings.Contains(permissionShengji, activityInfo.ChartPermissionName) {
+			noPower = true
+			return
+		}
 	}
 	if !noPower {
 		noPower, err = CheckUserPowerByActivityChoose(user, activityInfo)
@@ -449,7 +601,6 @@ func CheckUserPowerByActivityChoose(user *models.WxUserItem, activityInfo *model
 			noPower = true
 		}
 	}
-	fmt.Println(noPower)
 	return
 }
 
@@ -534,26 +685,31 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 	permissionNameStr = strings.Replace(permissionNameStr, "(主观)", "", -1)
 	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
 	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
-
+	mapUserType, e := GetActivityCcustomerTypeList()
+	if e != nil {
+		err = e
+		return
+	}
+	var userTypeStr string
+	userTypeStr = mapUserType[userType]
 	// 查研观向7.4-始终查询宏观的权限(无论是否有权限)
 	if permissionNameStr == `` {
 		permissionNameStr = `'宏观'`
 	} else {
 		permissionNameStr += `, '宏观'`
 	}
-
 	var condition string
 	var conditionAdmin string
 	var conditionHz string // 弘则权限处理
 	var sqlExport string   // 专家权限处理
-	permissionSqlStr = `  AND art.chart_permission_name  IN (` + permissionNameStr + `)`
-	sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
-	if userType == 2 {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
-	}
-	if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
-	}
+	//permissionSqlStr = `  AND art.chart_permission_name  IN (` + permissionNameStr + `)`
+	sqlExport = ` AND (art.customer_type_ids LIKE '%` + userTypeStr + `%' `
+	//if userType == 2 {
+	//	sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
+	//}
+	//if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
+	//	sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
+	//}
 	sqlExport += `) `
 	// 如果是C类电话会就不展示内容,且合并到分析师电话会
 	if activityTypeId != "" {
@@ -621,8 +777,6 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
 	}
 
-	fmt.Println(keyWord)
-	fmt.Println(keyWordNoIk)
 	//有搜索条件传过来时,不判进行状态条件
 	if keyWord != "" {
 		if ikType == 2 || ikType == 3 {
@@ -683,20 +837,27 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 		if len(ativityVIdArry) > 0 {
 			ativityVIdstr := strings.Join(ativityVIdArry, ",")
 			condition += ` AND art.activity_id IN  (` + ativityVIdstr + `) `
+		} else {
+			condition += ` AND art.activity_id = 0    `
 		}
 	}
 
 	//查询全部可见的数据(是否全部客户可见)
 	//condition += ` AND art.visible_range != 1  AND art.publish_status = 1 `
 	condition += `   AND art.publish_status = 1 `
-	conditionHz = condition
+	if adminIds == "" {
+		//condition += `  AND art.visible_range != 1 `
+	} else {
+		condition += ` 	AND ( art.visible_range != 1  OR  (	 art.admin_id IN ( ` + adminIds + ` )  AND art.visible_range = 1 ))  `
+	}
 
+	conditionHz = condition
 	//活动仅决策人可见
 	if isMaker == 0 {
 		condition += ` AND art.is_maker_show = 0  `
 	}
 	conditionAdmin = condition + `  AND art.visible_range = 1 `
-	condition += `  AND art.visible_range != 1 `
+	//condition += `  AND art.visible_range != 1 `
 	if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
 		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
 	}
@@ -718,7 +879,10 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 	}
 
 	if adminIds != "" {
-		conditionOr += ` OR (  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' ` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		if userType == 3 {
+			conditionAdmin += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+		}
+		conditionOr += ` OR (  art.customer_type_ids LIKE '%` + userTypeStr + `%' ` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
 		if companyProduct != nil {
 			if companyProduct.Scale != "" {
 				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
@@ -726,8 +890,23 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 		}
 	}
 
+	conditionShengji, conditionZhengshi, conditionHangYe, e := ActivityLabelSpecialUserSql(user)
+	if e != nil {
+		err = errors.New("ActivityLabelSpecialUserSql, Err: " + e.Error())
+		return
+	}
+	if conditionShengji != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionShengji + condition + ` ) `
+	}
+	if conditionZhengshi != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionZhengshi + condition + ` ) `
+	}
+	if conditionHangYe != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionHangYe + condition + ` ) `
+	}
+
 	//弘则研究下的客户不做权限,限制,C类电话会,仅本组销售、部门管理员、admin、权益研究员账号能看到
-	if user.CompanyId == 16 {
+	if user.CompanyId == utils.HZ_COMPANY_ID {
 		mapMobile, e := GetAdminMobileMap()
 		if e != nil {
 			err = e
@@ -737,7 +916,9 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 			conditionOr += ` OR (  art.publish_status = 1 ` + conditionHz + `) `
 		}
 	}
-
+	if userType == 3 {
+		condition += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+	}
 	conditionActivity = condition + permissionSqlStr + sqlExport + conditionOr
 	return
 }
@@ -1615,6 +1796,11 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 	if articleDetail.SourceType != 2 {
 		articleDetail.SourceType = 1
 	}
+	//如果是易董创建的活动,展示我要报名,不展示预约外呼
+	if articleDetail.IsYidongConduct {
+		articleDetail.IsShowSignup = true
+		articleDetail.IsShowOutboundCall = false
+	}
 	activityTimeText := articleDetail.ActivityTimeText
 	activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
 	activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)

+ 11 - 4
services/activity_button.go

@@ -225,17 +225,24 @@ func HandleActivityListButton(list []*models.ActivityDetail, user *models.WxUser
 			list[k].ActivityTypeName = "买方研选电话会"
 			list[k].ImgUrlText = utils.YAN_XUAN_IMG
 		}
-		if v.ActivityType == 0 {
-			if mapAddress[v.City] != "" {
-				list[k].ImgUrl = mapAddress[v.City]
+		if v.SourceType == 1 {
+			if v.ActivityType == 0 {
+				if mapAddress[v.City] != "" {
+					list[k].ImgUrl = mapAddress[v.City]
+				} else {
+					list[k].ImgUrl = mapAddress["其它"]
+				}
 			} else {
-				list[k].ImgUrl = mapAddress["其它"]
+				if mapChart[v.ChartPermissionName] != "" {
+					list[k].ImgUrl = mapChart[v.ChartPermissionName]
+				}
 			}
 		} else {
 			if mapChart[v.ChartPermissionName] != "" {
 				list[k].ImgUrl = mapChart[v.ChartPermissionName]
 			}
 		}
+
 		expertTxt, _ := GetReportContentTextSub(v.Expert)
 		list[k].Expert = expertTxt
 		if v.IsHideAppointment == 0 {

+ 293 - 57
services/activity_special.go

@@ -15,6 +15,61 @@ import (
 //	UpdateCygxActivitySpecialSignupNum()
 //}
 
+// ActivityLabelSpecialUserSql 专项产业调研用户权限查询数据预处理
+func ActivityLabelSpecialUserSql(user *models.WxUserItem) (conditionShengji, conditionZhengshi, conditionHangYe string, err error) {
+	_, userType, e := HandleActivityLabelSpecialTripPermission(user)
+	if e != nil {
+		err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+		return
+	}
+	// 8: 行业升级套餐客户:该活动对应行业为升级权限的客户
+	permissionShengji, errs := models.GetCompanyPermissionByUserZhengShiTrip(user.CompanyId)
+	if errs != nil {
+		err = errs
+		return
+	}
+	if permissionShengji != "" {
+		slicePerShengji := strings.Split(permissionShengji, ",")
+		permissionShengji = ""
+		for _, v := range slicePerShengji {
+			permissionShengji += "'" + v + "',"
+		}
+		permissionShengji = strings.TrimRight(permissionShengji, ",")
+		conditionShengji = ` art.customer_type_ids LIKE '%8%' AND art.chart_permission_name  IN (` + permissionShengji + `)`
+	}
+	//9:其他行业正式客户:前述所有正式客户以外的正式客户 查询处理
+	permissionZhengShiStr, errs := models.GetCompanyPermissionByUserZhengShi(user.CompanyId)
+	if errs != nil {
+		err = errs
+		return
+	}
+	if permissionZhengShiStr != "" {
+		slicePerZhengshi := strings.Split(permissionZhengShiStr, ",")
+		permissionZhengShiStr = ""
+		for _, v := range slicePerZhengshi {
+			if userType == 1 {
+				//研选权限处理(永续客户无法查看研选)
+				if !strings.Contains(v, utils.CHART_PERMISSION_NAME_YANXUAN) {
+					permissionZhengShiStr += "'" + v + "',"
+				}
+			} else {
+				permissionZhengShiStr += "'" + v + "',"
+			}
+		}
+		permissionZhengShiStr = strings.Replace(permissionZhengShiStr, "(主观)", "", -1)
+		permissionZhengShiStr = strings.Replace(permissionZhengShiStr, "(客观)", "", -1)
+		permissionZhengShiStr = strings.TrimRight(permissionZhengShiStr, ",")
+		permissionZhengShiStr += `, '宏观'`
+		if userType != 1 && userType != 2 && userType != 10 {
+			conditionHangYe = `  art.customer_type_ids LIKE '%3%'	   AND art.chart_permission_name    IN (` + permissionZhengShiStr + `)`
+		}
+		if userType == 3 {
+			conditionZhengshi = `  art.customer_type_ids LIKE '%9%'	   AND art.chart_permission_name  NOT  IN (` + permissionZhengShiStr + `)`
+		}
+	}
+	return
+}
+
 // 修改专项调研,用户与公司的参与数量
 func UpdateCygxActivitySpecialSignupNum(cont context.Context) (err error) {
 	defer func() {
@@ -79,7 +134,8 @@ func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPerm
 		item = itemList
 		return
 	}
-	userType, e := GetSpecialUserType(user)
+	//userType, e := GetSpecialUserType(user)
+	userType, _, e := GetUserType(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetSpecialUserType, Err: " + e.Error())
 		return
@@ -96,14 +152,15 @@ func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPerm
 	}
 	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
 	var condition string
+	var conditionUser string
 	if companyDetail.Status == "永续" {
-		condition, e = HandleActivityLabelSpecialPermission(user)
+		conditionUser, e = HandleActivityLabelSpecialPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
 		}
 	} else {
-		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		conditionUser, _, e = HandleActivityLabelSpecialTripPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
@@ -111,7 +168,6 @@ func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPerm
 	}
 	var pars []interface{}
 	condition += ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0 `
-
 	//行业名称
 	if isPower == 1 {
 		condition += ` AND art.chart_permission_name  IN (` + permissionNameStr + `) `
@@ -119,18 +175,84 @@ func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPerm
 	if chartPermissionIds != "" {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `) `
 	}
+
+	//condition += conditionUser
+	conditionShengji, conditionZhengshi, conditionHangYe, e := ActivityLabelSpecialUserSql(user)
+	if e != nil {
+		err = errors.New("ActivityLabelSpecialUserSql, Err: " + e.Error())
+		return
+	}
+
 	conditionTrip := condition
-	conditionTrip += ` AND art.activity_time_end > ` + "'" + time.Now().Format(utils.FormatDateTime) + " '"
-	conditionTrip += ` AND art.days > 0  ORDER BY art.activity_time ASC `
-	specialList, err := models.GetActivityLabelSpecialListAll(conditionTrip, pars, 0, 8)
+	conditionNoTrip := condition
+	conditionTripSql := condition
+	conditionNoTripSql := condition
+	conditionTrip += ` AND art.days > 0   AND art.activity_time_end  > '` + time.Now().Format(utils.FormatDateTime) + ` '`
+
+	var conditionZhengshiTrip string
+	var conditionShengjiTrip string
+	var conditionHangYeTrip string
+
+	//处理专项调研确认行程的其它正式客户权限查询
+	if conditionZhengshi != "" {
+		conditionZhengshiTrip = ` OR ( ` + conditionZhengshi + conditionTrip + ` )`
+	}
+	//处理升级权限查询
+	if conditionShengji != "" {
+		conditionShengjiTrip = ` OR ( ` + conditionShengji + conditionTrip + ` )`
+	}
+	//处理行业套餐客户权限查询
+	if conditionHangYe != "" {
+		conditionHangYeTrip = ` OR ( ` + conditionHangYe + conditionTrip + ` )`
+	}
+	if conditionZhengshi != "" {
+		conditionTrip += conditionZhengshiTrip
+	}
+	if conditionShengjiTrip != "" {
+		conditionTrip += conditionShengjiTrip
+	}
+	if conditionHangYeTrip != "" {
+		conditionTrip += conditionHangYeTrip
+	}
+
+	//行业套餐客户勾选项单独处理
+	if userType == 3 {
+		conditionTripSql += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+	}
+
+	conditionTripSql += conditionUser + conditionTrip + `  ORDER BY art.activity_time ASC `
+	specialList, err := models.GetActivityLabelSpecialListAll(conditionTripSql, pars, 0, 80)
 	if err != nil {
 		return
 	}
-	//if len(specialList) < 8 {
-	//	conditionTrip += ` AND art.days = 0  ORDER BY art.last_updated_time DESC`
-
-	condition += ` AND art.days = 0  ORDER BY art.last_updated_time DESC`
-	specialListNotrip, e := models.GetActivityLabelSpecialListAll(condition, pars, 0, 20)
+	conditionNoTrip += ` AND art.days = 0  `
+	var conditionShengjiNoTrip string
+	var conditionZhengshiNoTrip string
+	var conditionHangYeNoTrip string
+	if conditionShengji != "" {
+		conditionShengjiNoTrip = ` OR ( ` + conditionShengji + conditionNoTrip + ` )`
+	}
+	if conditionZhengshi != "" {
+		conditionZhengshiNoTrip = ` OR ( ` + conditionZhengshi + conditionNoTrip + ` )`
+	}
+	if conditionHangYe != "" {
+		conditionHangYeNoTrip = ` OR ( ` + conditionHangYe + conditionNoTrip + ` )`
+	}
+	if conditionShengji != "" {
+		conditionNoTrip += conditionShengjiNoTrip
+	}
+	if conditionZhengshi != "" {
+		conditionNoTrip += conditionZhengshiNoTrip
+	}
+	if conditionHangYe != "" {
+		conditionNoTrip += conditionHangYeNoTrip
+	}
+	//行业套餐客户勾选项单独处理
+	if userType == 3 {
+		conditionNoTripSql += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+	}
+	conditionNoTripSql += conditionUser + conditionNoTrip + ` ORDER BY art.last_updated_time DESC`
+	specialListNotrip, e := models.GetActivityLabelSpecialListAll(conditionNoTripSql, pars, 0, 200)
 	if e != nil {
 		err = e
 		return
@@ -184,25 +306,34 @@ func HandleActivityLabelSpecialPermission(user *models.WxUserItem) (condition st
 	}
 	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
 	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0  `
-	if permissionSqlStr != "" {
-		condition += ` AND art.chart_permission_name  IN (` + permissionSqlStr + `) `
-	}
+	//if permissionSqlStr != "" {
+	//	condition += ` AND art.chart_permission_name  IN (` + permissionSqlStr + `) `
+	//}
 	condition += ` AND  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
 	return
 }
 
 // HandleActivityLabelSpecialPermisseion 处理专项产业调研的查询权限sql
-func HandleActivityLabelSpecialTripPermission(user *models.WxUserItem) (condition string, err error) {
+func HandleActivityLabelSpecialTripPermission(user *models.WxUserItem) (condition string, userType int, err error) {
 	permissionStr, e := GetCompanyPermission(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetCompanyPermission, Err: " + e.Error())
 		return
 	}
-	userType, e := GetSpecialUserType(user)
+	userType, _, e = GetUserType(user.CompanyId)
+	//userType, e := GetSpecialUserType(user)
 	if e != nil {
 		err = errors.New("GetSpecialUserType, Err: " + e.Error())
 		return
 	}
+	mapUserType, e := GetActivityCcustomerTypeList()
+	if e != nil {
+		err = e
+		return
+	}
+	var userTypeStr string
+	userTypeStr = mapUserType[userType]
+	//fmt.Println(userType)
 	slicePer := strings.Split(permissionStr, ",")
 	var permissionSqlStr string
 	for _, v := range slicePer {
@@ -216,10 +347,13 @@ func HandleActivityLabelSpecialTripPermission(user *models.WxUserItem) (conditio
 	}
 	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
 	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0  `
-	if permissionSqlStr != "" {
+	if permissionSqlStr != "" && userType == 3 {
 		condition += ` AND art.chart_permission_name  IN (` + permissionSqlStr + `) `
 	}
-	condition += ` AND  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+	condition += ` AND  art.customer_type_ids LIKE '%` + userTypeStr + `%' `
+
+	//if userType != 2 {
+
 	return
 }
 
@@ -232,14 +366,15 @@ func GetActivitySpecialPrepareList(user *models.WxUserItem, startSize, pageSize
 	}
 	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
 	var condition string
+	var conditionUser string
 	if companyDetail.Status == "永续" {
-		condition, e = HandleActivityLabelSpecialPermission(user)
+		conditionUser, e = HandleActivityLabelSpecialPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
 		}
 	} else {
-		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		conditionUser, _, e = HandleActivityLabelSpecialTripPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
@@ -252,13 +387,46 @@ func GetActivitySpecialPrepareList(user *models.WxUserItem, startSize, pageSize
 		condition += ` AND art.research_theme LIKE ? `
 		pars = append(pars, keywords)
 	}
-	totalPrepare, e = models.GetActivitySpecialCount(condition, pars)
+
+	conditionShengji, conditionZhengshi, conditionHangYe, e := ActivityLabelSpecialUserSql(user)
+	if e != nil {
+		err = errors.New("ActivityLabelSpecialUserSql, Err: " + e.Error())
+		return
+	}
+	conditionNoTrip := condition
+	var conditionShengjiNoTrip string
+	var conditionZhengshiNoTrip string
+	var conditionHangYeNoTrip string
+	if conditionShengji != "" {
+		conditionShengjiNoTrip = ` OR ( ` + conditionShengji + conditionNoTrip + ` )`
+	}
+	if conditionZhengshi != "" {
+		conditionZhengshiNoTrip = ` OR ( ` + conditionZhengshi + conditionNoTrip + ` )`
+	}
+	//处理行业套餐权限查询
+	if conditionHangYe != "" {
+		conditionHangYeNoTrip = ` OR ( ` + conditionHangYe + conditionNoTrip + ` )`
+	}
+
+	if conditionShengji != "" {
+		conditionNoTrip += conditionShengjiNoTrip
+	}
+	if conditionZhengshi != "" {
+		conditionNoTrip += conditionZhengshiNoTrip
+	}
+	if conditionHangYe != "" {
+		conditionNoTrip += conditionHangYeNoTrip
+	}
+	conditionNoTripSql := conditionUser + conditionNoTrip
+	//condition += conditionUser + conditionOr
+	totalPrepare, e = models.GetActivitySpecialCount(conditionNoTripSql, pars)
 	if e != nil {
 		err = errors.New("GetActivitySpecialCount, Err: " + e.Error())
 		return
 	}
-	condition += `  ORDER BY art.last_updated_time DESC `
-	list, e = models.GetCygxActivitySpecialDetailList(condition, pars, user.UserId, startSize, pageSize)
+
+	conditionNoTripSql += `  ORDER BY art.last_updated_time DESC `
+	list, e = models.GetCygxActivitySpecialDetailList(conditionNoTripSql, pars, user.UserId, startSize, pageSize)
 	if e != nil {
 		err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
 		return
@@ -271,22 +439,26 @@ func GetActivitySpecialPrepareList(user *models.WxUserItem, startSize, pageSize
 state 进行状态 1:未开始,2:进行中,3:已结束,4:未开始、进行中 不传默认查询全部items []*CygxActivitySpecialDetail
 */
 func GetActivityLabelSpecialConfirmList(user *models.WxUserItem, startSize, pageSize, state int, keywords string) (list []*models.CygxActivitySpecialDetail, totalConfirm int, err error) {
-	//var condition string
 	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(user.CompanyId)
-	if e != nil {
+	if e != nil && e.Error() != utils.ErrNoRow() {
 		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
 		return
 	}
+	if companyDetail == nil {
+		return
+	}
 	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
 	var condition string
+	var conditionUser string
+	//var userType int
 	if companyDetail.Status == "永续" {
-		condition, e = HandleActivityLabelSpecialPermission(user)
+		conditionUser, e = HandleActivityLabelSpecialPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
 		}
 	} else {
-		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		conditionUser, _, e = HandleActivityLabelSpecialTripPermission(user)
 		if e != nil {
 			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
 			return
@@ -295,35 +467,68 @@ func GetActivityLabelSpecialConfirmList(user *models.WxUserItem, startSize, page
 	var pars []interface{}
 	condition += ` AND art.days >0  AND art.publish_status =1   AND art.is_offline = 0  `
 	if state == 1 {
-		condition += ` AND art.activity_time > ? `
-		pars = append(pars, time.Now())
+		condition += ` AND art.activity_time >  '` + time.Now().Format(utils.FormatDateTime) + `'`
 	}
 	if state == 2 {
-		condition += ` AND art.activity_time < ? `
-		pars = append(pars, time.Now())
-		condition += ` AND art.activity_time_end > ? `
-		pars = append(pars, time.Now())
+		condition += ` AND art.activity_time < '` + time.Now().Format(utils.FormatDateTime) + `'`
+		condition += ` AND art.activity_time_end > '` + time.Now().Format(utils.FormatDateTime) + `'`
 	}
 	if state == 3 {
-		condition += ` AND art.activity_time_end < ? `
-		pars = append(pars, time.Now())
+		condition += ` AND art.activity_time_end < '` + time.Now().Format(utils.FormatDateTime) + `'`
 	}
 	if state == 4 {
-		condition += ` AND art.activity_time_end > ? `
-		pars = append(pars, time.Now())
+		condition += ` AND art.activity_time_end > '` + time.Now().Format(utils.FormatDateTime) + `'`
 	}
 	if keywords != "" {
 		keywords = "%" + keywords + "%"
-		condition += ` AND art.research_theme LIKE ? `
-		pars = append(pars, keywords)
+		condition += ` AND art.research_theme LIKE  ` + keywords
+		//pars = append(pars, keywords)
 	}
-	totalConfirm, e = models.GetActivitySpecialCount(condition, pars)
+	conditionTrip := condition
+	conditionTripSql := condition
+
+	conditionShengji, conditionZhengshi, conditionHangYe, e := ActivityLabelSpecialUserSql(user)
+	if e != nil {
+		err = errors.New("ActivityLabelSpecialUserSql, Err: " + e.Error())
+		return
+	}
+	conditionTrip += ` AND art.days > 0   AND art.activity_time_end  > '` + time.Now().Format(utils.FormatDateTime) + ` '`
+
+	var conditionZhengshiTrip string
+	var conditionShengjiTrip string
+	var conditionHangYeTrip string
+
+	//处理专项调研确认行程的其它正式客户权限查询
+	if conditionZhengshi != "" {
+		conditionZhengshiTrip = ` OR ( ` + conditionZhengshi + conditionTrip + ` )`
+	}
+	//处理专项调研确认行程的升级权限查询
+	if conditionShengji != "" {
+		conditionShengjiTrip = ` OR ( ` + conditionShengji + conditionTrip + ` )`
+	}
+	//处理行业套餐客户权限查询
+	if conditionHangYe != "" {
+		conditionHangYeTrip = ` OR ( ` + conditionHangYe + conditionTrip + ` )`
+	}
+
+	if conditionZhengshi != "" {
+		conditionTrip += conditionZhengshiTrip
+	}
+	if conditionShengjiTrip != "" {
+		conditionTrip += conditionShengjiTrip
+	}
+	if conditionHangYeTrip != "" {
+		conditionTrip += conditionHangYeTrip
+	}
+	conditionTripSql += conditionUser + conditionTrip + `  ORDER BY art.activity_time ASC `
+
+	totalConfirm, e = models.GetActivitySpecialCount(conditionTripSql, pars)
 	if e != nil {
 		err = errors.New("GetActivitySpecialCount, Err: " + e.Error())
 		return
 	}
 	condition += `  ORDER BY art.activity_time ASC `
-	list, e = models.GetCygxActivitySpecialDetailList(condition, pars, user.UserId, startSize, pageSize)
+	list, e = models.GetCygxActivitySpecialDetailList(conditionTripSql, pars, user.UserId, startSize, pageSize)
 	if e != nil {
 		err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
 		return
@@ -402,10 +607,13 @@ func GetSpecialTripUserSchedule(userId int) (total int, err error) {
 // GetActivitySpecialList 获取专项调研列表
 func GetActivitySpecialList(user *models.WxUserItem, currentIndex, pageSize int, keywords string) (list []*models.CygxActivitySpecialDetail, total int, err error) {
 	listConfirm, totalConfirm, e := GetActivityLabelSpecialConfirmList(user, (currentIndex-1)*pageSize, pageSize, 4, keywords)
-	if e != nil {
-		err = errors.New("GetActivityLabelSpecialConfirmList, Err: " + e.Error())
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetActivityLabelSpecialConfirmList11, Err: " + e.Error())
 		return
 	}
+	//if totalConfirm == 0 {
+	//	return
+	//}
 	if currentIndex == 1 && len(listConfirm) > 0 {
 		listConfirm[0].Explain = utils.ACtIVITY_SPECIAL_TRIP_EXPLAIN
 	}
@@ -439,7 +647,6 @@ func GetActivitySpecialList(user *models.WxUserItem, currentIndex, pageSize int,
 		}
 	}
 	total = totalConfirm + totalPrepare
-
 	//处理封面图片
 	detail, e := models.GetConfigByCode("city_img_url")
 	if e != nil {
@@ -648,10 +855,13 @@ func GetActivitySpecialUserType(companyId int) (userType int, permissionStrnew s
 func GetSpecialUserType(user *models.WxUserItem) (userType int, err error) {
 	companyId := user.CompanyId
 	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(companyId)
-	if e != nil {
+	if e != nil && e.Error() != utils.ErrNoRow() {
 		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
 		return
 	}
+	if companyDetail == nil {
+		return
+	}
 	if companyId <= 1 {
 		userType = 0
 	} else {
@@ -690,29 +900,49 @@ func GetSpecialUserType(user *models.WxUserItem) (userType int, err error) {
 
 // GetSpecialDetailUserPower 处理用户查看专项调研详情的权限
 func GetSpecialDetailUserPower(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (havePower bool, err error) {
-	permissionStr, e := GetCompanyPermissionUpgrade(user.CompanyId)
+	if user.CompanyId == utils.HZ_COMPANY_ID {
+		havePower = true
+		return
+	}
+	userType, _, e := GetUserType(user.CompanyId)
 	if e != nil {
-		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
 		return
 	}
-	fmt.Println(permissionStr)
-	//如果没有对应的升级权限,则返回
-	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+	if userType == 0 {
 		return
 	}
-	userType, e := GetSpecialUserType(user)
+	mapUserType, e := GetActivityCcustomerTypeList()
 	if e != nil {
-		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		err = e
 		return
 	}
-	if userType == 0 {
+	var userTypeStr string
+	userTypeStr = mapUserType[userType]
+	// 永续客户、大套餐客户可以查看行业升级套餐客户 权限
+	if userTypeStr == "1" || userTypeStr == "2" {
+		if strings.Contains(activityInfo.CustomerTypeIds, userTypeStr) || strings.Contains(activityInfo.CustomerTypeIds, "8") {
+			havePower = true
+			return
+		}
+	}
+
+	permissionStr, e := GetCompanyPermissionUpgrade(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
 	}
+	//如果没有对应的升级权限,则返回
+	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+		return
+	}
+	//userType, e := GetSpecialUserType(user)
+
 	var pars []interface{}
 	var condition string
 	var userTypes string
 	condition += `  AND art.publish_status = 1 AND art.is_offline = 0   `
-	userTypes = "%" + strconv.Itoa(userType) + "%"
+	userTypes = "%" + userTypeStr + "%"
 	condition += ` AND art.customer_type_ids LIKE ? `
 	pars = append(pars, userTypes)
 
@@ -726,6 +956,12 @@ func GetSpecialDetailUserPower(user *models.WxUserItem, activityInfo *models.Cyg
 	}
 	if total == 1 {
 		havePower = true
+		return
+	}
+
+	if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
+		havePower = true
+		return
 	}
 	return
 }
@@ -860,7 +1096,7 @@ func SendWxMsgActivitySpecialTwoDays(cont context.Context) (err error) {
 			keyword4 = v.City
 		}
 		remark := "点击查看活动详情"
-		SendWxMsgWithFrequency(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
+		SendWxMsgWithFrequencySpecial(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
 
 		//活动开始前两天08:00,提醒报名客户的对口销售
 		companyIdsLen := len(companyIds)
@@ -898,7 +1134,7 @@ func SendWxMsgActivitySpecialTwoDays(cont context.Context) (err error) {
 				keyword2 = vM
 				openIdList = make([]*models.OpenIdList, 0)
 				openIdList = append(openIdList, &models.OpenIdList{OpenId: mapSllerOpenid[k]})
-				SendWxMsgWithFrequency(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
+				SendWxMsgWithFrequencySpecial(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
 			}
 		}
 	}

+ 27 - 18
services/activity_special_trip.go

@@ -51,14 +51,15 @@ func SpecialTripPopupMsg(activityInfo *models.CygxActivitySpecialDetail, user *m
 	return
 }
 
-//获取用户剩余报名次数
+// 获取用户剩余报名次数
 func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, tripRemaining int, err error) {
 
 	//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户 8:行业升级套餐客户
 	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
-	var tripTota int
+	//var tripTota int
 	var airborneTota int
-	userType, _, e := GetActivitySpecialUserType(user.CompanyId)
+	//userType, _, e := GetActivitySpecialUserType(user.CompanyId)
+	userType, _, e := GetUserType(user.CompanyId)
 	if e != nil {
 		err = errors.New("获取客户身份信息失败 GetActivitySpecialUserType, Err: " + e.Error())
 		return
@@ -81,20 +82,25 @@ func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *model
 			err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
 			return
 		}
-
-		condition += ` AND is_valid = 1 `
-
-		tripTota, e = models.GetActivitySpecialTripCountByActivitySpecial(condition, pars)
+		//condition += ` AND is_valid = 1 `
+		//查询当年的数据
+		condition += ` AND create_time >= ?  `
+		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
 		if e != nil {
 			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
 			return
 		}
-		tripTota += airborneTota
-		if tripTota >= 12 {
+		var TripBillNum int
+		for _, v := range listTripBill {
+			TripBillNum += v.BillDetailed
+		}
+		tripRemaining = 10 - airborneTota + TripBillNum
+		if tripRemaining <= 0 {
 			errMsg = msgTemplate
 			return
 		}
-		tripRemaining = 12 - tripTota
+		//tripRemaining = 12 - tripTota
 	} else {
 		var condition string
 		var pars []interface{}
@@ -110,25 +116,28 @@ func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *model
 			err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
 			return
 		}
-
-		condition += ` AND is_valid = 1 `
-
-		tripTota, e = models.GetActivitySpecialTripCountByActivitySpecial(condition, pars)
+		//查询当年的数据
+		condition += ` AND create_time >= ?  `
+		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
 		if e != nil {
 			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
 			return
 		}
-		tripTota += airborneTota
-		if tripTota >= 6 {
+		var TripBillNum int
+		for _, v := range listTripBill {
+			TripBillNum += v.BillDetailed
+		}
+		tripRemaining = 5 - airborneTota + TripBillNum
+		if tripRemaining <= 0 {
 			errMsg = msgTemplate
 			return
 		}
-		tripRemaining = 6 - tripTota
 	}
 	return
 }
 
-//用户搜专项调研操作操作行为,模板消息推送
+// 用户搜专项调研操作操作行为,模板消息推送
 func ActivitySpecialUserRmind(user *models.WxUserItem, activityId, TripStatus int) (err error) {
 	defer func() {
 		if err != nil {

+ 85 - 0
services/activity_wx_template_msg.go

@@ -0,0 +1,85 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"time"
+)
+
+// SendResearchActivitiesTemplateMsg 线下调研活动报名给所属销售跟建会人员推送
+func SendResearchActivitiesTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
+	//如果不是公司线下调研就返回
+	if activityDetail.ActivityTypeId != 4 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("线下调研活动报名给所属销售跟建会人员推送失败Err"+time.Now().Format("2006-01-02 15:04:05"), ";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("线下调研活动报名给所属销售跟建会人员推送失败Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
+		}
+	}()
+	var mobiles []string
+	//获取销售信息
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if sellerItem != nil {
+		mobiles = append(mobiles, sellerItem.Mobile)
+	}
+	//获取建会人员信息
+	admin, err := models.GetSysAdminById(activityDetail.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if admin != nil {
+		mobiles = append(mobiles, admin.Mobile)
+	}
+
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+	var redirectUrl string
+
+	first = "【" + activityDetail.ActivityName + "】有客户报名"
+	keyword1 = user.RealName + "——" + user.CompanyName + "(所属销售:" + sellerItem.RealName + ")"
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = activityDetail.ActivityName
+	remark = "点击查看报告详情"
+
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityDetail.ArticleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}

+ 15 - 0
services/admin.go

@@ -15,3 +15,18 @@ func GetAdminMobileMap() (mapItem map[string]string, err error) {
 	mapItem = mapMobile
 	return
 }
+
+func GetActivityCcustomerTypeList() (mapItem map[int]string, err error) {
+	list, e := models.GetActivityCcustomerTypeList()
+	if e != nil {
+		err = e
+		return
+	}
+	mapUserType := make(map[int]string)
+	for _, v := range list {
+		mapUserType[v.CustomerTypeId] = v.PermissionValue
+	}
+	mapUserType[0] = "0"
+	mapItem = mapUserType
+	return
+}

+ 53 - 12
services/article.go

@@ -674,15 +674,16 @@ func GetArticleListByApi(cont context.Context) (err error) {
 	return
 }
 
-func init122() {
-	allList, err := models.GetArticleAll()
-
-	fmt.Println(err)
-	for _, v := range allList {
-		HandleArticleListByApi(v.ArticleId)
-	}
+//func init() {
+//allList, err := models.GetArticleAll()
+//
+//fmt.Println(err)
+//for _, v := range allList {
+//	HandleArticleListByApi(v.ArticleId)
+//}
+//HandleArticleListByApi(7930)
 
-}
+//}
 
 // 处理同步过来的文章
 func HandleArticleListByApi(artcleId int) (err error) {
@@ -1160,7 +1161,7 @@ func HandleArticleListByApi(artcleId int) (err error) {
 }
 
 //func init() {
-//	DoArticleOnenIdWxTemplateMsg(6940)
+//	DoArticleOnenIdWxTemplateMsg(8081)
 //}
 
 // 过滤策略平台报告,研选报告重复推送,以及权限勾选的推送
@@ -1191,6 +1192,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	articleInfo.Abstract, _ = GetReportContentTextSub(articleInfo.Abstract)
 	var chartPermissionId int
 
+	//固收的权限,暂时当策略的逻辑一样处理
 	var chartPermissionName string
 	reportMapDetail, err := models.GetdetailByCategoryIdPush(articleInfo.CategoryId)
 	if err != nil {
@@ -1198,6 +1200,8 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	}
 	if reportMapDetail.ChartPermissionId == utils.CE_LUE_ID {
 		chartPermissionId = utils.CE_LUE_ID
+	} else if reportMapDetail.ChartPermissionId == utils.GU_SHOU_ID {
+		chartPermissionId = utils.GU_SHOU_ID
 	} else {
 		if reportMapDetail.PermissionType == 1 {
 			chartPermissionName = reportMapDetail.ChartPermissionName + "(主观)"
@@ -1214,7 +1218,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	//文章关联的产业
 	var industryName string
 	var industrialManagementId string
-	if chartPermissionId == utils.CE_LUE_ID {
+	if chartPermissionId == utils.CE_LUE_ID || chartPermissionId == utils.GU_SHOU_ID {
 		industryName = reportMapDetail.SubCategoryName
 	} else {
 		detailIndustryNameList, err := models.GetIndustrialManagemenDetailByAaticleID(articleId)
@@ -1298,6 +1302,9 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	slicepermissionId := strings.Split(strconv.Itoa(chartPermissionId), ",")
 	if len(slicepermissionId) > 0 {
 		for _, v := range slicepermissionId {
+			if v == strconv.Itoa(utils.GU_SHOU_ID) {
+				v = strconv.Itoa(utils.CE_LUE_ID)
+			}
 			permissionIdList = append(permissionIdList, v)
 		}
 		condition += ` AND p.chart_permission_id  IN (` + utils.GetOrmInReplace(len(slicepermissionId)) + ` )  `
@@ -1307,12 +1314,13 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	if err != nil {
 		return err
 	}
+	//return
 	for _, v := range openidPowerList {
 		mapOpenidPower[v.UserId] = v.OpenId
 	}
 	//获取关注这个文章对应产业的用户的 openid
 	mapOpenidFllow := make(map[int]string)
-	if chartPermissionId != utils.CE_LUE_ID {
+	if chartPermissionId != utils.CE_LUE_ID && chartPermissionId != utils.GU_SHOU_ID {
 		openidFllowList, err := models.GetCygxUserFllowOpenid(articleId)
 		if err != nil {
 			return err
@@ -1359,7 +1367,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	keyword4 := articleInfo.Abstract
 	mapAlreadySend := make(map[int]int)
 	//如果是策略就按照策略的推送方式来写
-	if reportMapDetail.ChartPermissionName == utils.CE_LUE_NAME {
+	if reportMapDetail.ChartPermissionName == utils.CE_LUE_NAME || reportMapDetail.ChartPermissionName == utils.GU_SHOU_NAME {
 		//获取提交过推送规则的用户的 openid
 		mapUserFllowCeLue := make(map[int]string)
 		userFllowCeLueList, err := models.GetCygxUserFllowCeLueOpenid(articleInfo.CategoryId)
@@ -1981,3 +1989,36 @@ func GetReportLinkToArticleid(reportLink string) (articleId int, err error) {
 	}
 	return
 }
+
+//func init() {
+//	GetArticleStockMap()
+//}
+
+// GetArticleStockMap 获取个股标签所对应的文章ID
+func GetArticleStockMap() (mapResp map[string]int, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取个股标签所对应的文章ID失败"+err.Error(), 2)
+		}
+	}()
+	list, err := models.GetArticleStock()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	mapResp = make(map[string]int, 0)
+	if len(list) > 0 {
+		//一对一精准匹配
+		for _, v := range list {
+			sliceSubjects := strings.Split(v.Stock, "/")
+			if len(sliceSubjects) > 0 {
+				for _, vSubject := range sliceSubjects {
+					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+					subject := sliceXiahuaxian[0]
+					mapResp[subject] = v.ArticleId
+				}
+			}
+		}
+	}
+	return
+}

+ 33 - 0
services/articlt_collect.go

@@ -0,0 +1,33 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+)
+
+//func init() {
+//	GetCygxArticleCollectMap(90)
+//}
+
+// GetCygxArticleCollectMap 根据用户ID获取所有文章收藏
+func GetCygxArticleCollectMap(userId int) (mapResp map[int]bool, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("根据用户ID获取所有文章收藏失败 ErrMsg:"+err.Error(), 2)
+
+		}
+	}()
+	list, e := models.GetCygxArticleCollectByUser(userId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("根据用户ID获取所有文章收藏,GetCygxArticleCollectByUser " + e.Error())
+		return
+	}
+	mapResp = make(map[int]bool, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			mapResp[v.ArticleId] = true
+		}
+	}
+	return
+}

+ 83 - 4
services/company_permission.go

@@ -7,7 +7,7 @@ import (
 	"strings"
 )
 
-//GetCompanyPermission 获取公司对应的权限名称
+// GetCompanyPermission 获取公司对应的权限名称
 func GetCompanyPermission(companyId int) (permissionStr string, err error) {
 	permissionStr, err = models.GetCompanyPermission(companyId)
 	if err != nil {
@@ -18,7 +18,7 @@ func GetCompanyPermission(companyId int) (permissionStr string, err error) {
 	return
 }
 
-//GetCompanyPermissionUpgrade 获取公司对应的升级权限名称
+// GetCompanyPermissionUpgrade 获取公司对应的升级权限名称
 func GetCompanyPermissionUpgrade(companyId int) (permissionStr string, err error) {
 	permissionStr, err = models.GetCompanyPermissionByUserTrip(companyId)
 	if err != nil {
@@ -29,7 +29,7 @@ func GetCompanyPermissionUpgrade(companyId int) (permissionStr string, err error
 	return
 }
 
-//获取用户对应的权限申请状态
+// 获取用户对应的权限申请状态
 func GetUserHasPermission(user *models.WxUserItem) (hasPermission int, sellerName, sellerMobile, popupMsg string, err error) {
 	//HasPermission     int    `description:"操作方式,1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请,5:有IFCC、无权益"`
 	uid := user.UserId
@@ -68,13 +68,36 @@ func GetUserHasPermission(user *models.WxUserItem) (hasPermission int, sellerNam
 					hasPermission = 5
 				}
 			}
+		} else {
+			sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetSellerByCompanyIdCheckFicc_Qy, Err: " + e.Error())
+				return
+			}
+			if sellerItemQy != nil {
+				hasPermission = 2
+				sellerMobile = sellerItemQy.Mobile
+				sellerName = sellerItemQy.RealName
+			} else {
+				//获取FICC销售信息
+				sellerItemFicc, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 1)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+					return
+				}
+				if sellerItemFicc != nil {
+					hasPermission = 3
+				} else {
+					hasPermission = 5
+				}
+			}
 		}
 	}
 	popupMsg = "需要升级行业套餐权限才可参与此活动,请联系对口销售"
 	return
 }
 
-//获取用户对应的权限申请状态 文章详情
+// 获取用户对应的权限申请状态 文章详情
 func GetUserHasPermissionArticle(user *models.WxUserItem) (hasPermission int, sellerName, sellerMobile, popupMsg string, err error) {
 	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
 	uid := user.UserId
@@ -116,3 +139,59 @@ func GetUserHasPermissionArticle(user *models.WxUserItem) (hasPermission int, se
 	popupMsg = "需要升级行业套餐权限才可查看此报告,请联系对口销售"
 	return
 }
+
+// 获取用户对应的权限申请状态 活动详情
+func GetUserHasPermissionActivity(user *models.WxUserItem, activityInfo *models.ActivityDetail) (hasPermission int, sellerName, sellerMobile, popupMsg string, err error) {
+	//HasPermission     int    `description:"操作方式,1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请,5:有IFCC、无权益"`
+	uid := user.UserId
+	applyCount, e := models.GetApplyRecordCount(uid)
+	if e != nil {
+		err = errors.New("GetApplyRecordCount, Err: " + e.Error())
+		return
+	}
+	popupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
+	companyItem, err := models.GetCompanyDetailById(user.CompanyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			if applyCount > 0 {
+				hasPermission = 4
+			} else {
+				//获取FICC销售信息
+				sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 1)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = e
+					return
+				}
+				if sellerItem != nil {
+					hasPermission = 5
+				} else {
+					hasPermission = 3
+				}
+			}
+			hasPermission = hasPermission
+			popupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
+			return
+		} else {
+			return
+		}
+	}
+	if companyItem.ProductId == 2 {
+		hasPermission = 2
+		sellerMobile = companyItem.Mobile
+		sellerName = companyItem.SellerName
+		companyPermission, e := models.GetCompanyPermission(user.CompanyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyPermission, Err: " + e.Error())
+			return
+		}
+		if companyPermission == "专家" {
+			popupMsg = "您暂无权限参加【" + activityInfo.ActivityTypeName + "】类型活动,若想参加请联系对口销售--" + companyItem.SellerName + ":" + companyItem.Mobile
+
+		} else {
+			popupMsg = "您暂无权限参加【" + activityInfo.ChartPermissionName + "】行业活动,若想参加请联系对口销售--" + companyItem.SellerName + ":" + companyItem.Mobile
+		}
+	} else {
+		hasPermission = 5
+	}
+	return
+}

+ 32 - 0
services/config.go

@@ -47,3 +47,35 @@ func GetIndustryUserFollowMap(user *models.WxUserItem) (itemMap map[int]bool, er
 	itemMap = follwMap
 	return
 }
+
+func init1231() {
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND  t.id < 10000 	 `
+
+	list, err := models.GetCygxActivitySpecialTripListinit(condition, pars)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range list {
+		//流水记录表
+		itemBill := new(models.CygxActivitySpecialTripBill)
+		itemBill.UserId = v.UserId
+		itemBill.ActivityId = v.ActivityId
+		itemBill.CreateTime = v.CreateTime
+		itemBill.Mobile = v.Mobile
+		itemBill.Email = v.Email
+		itemBill.CompanyId = v.CompanyId
+		itemBill.CompanyName = v.CompanyName
+		itemBill.RealName = v.RealName
+		itemBill.Source = 1
+		itemBill.DoType = 1
+		itemBill.BillDetailed = -1 // 流水减一
+		itemBill.RegisterPlatform = 1
+		itemBill.ChartPermissionId = v.ChartPermissionId
+		go models.AddCygxActivitySpecialTripBill(itemBill)
+	}
+}

+ 300 - 1
services/elastic.go

@@ -901,6 +901,11 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 		keyWordArr = append(keyWordArr, keyWord)
 		keyWordLen = len(keyWordArr)
 	}
+	fmt.Println(keyWordArr)
+	//如果没有联想词,而且查询的还是联想词就返回
+	if ikType == 2 && keyWordLen == 1 {
+		return
+	}
 	//Es 的高级查询有 自定义排序 文档一时半会儿撸不懂,先做多次查询手动过滤 2023.2.2
 	//ikType 查询方式 ,0:查所有 、 1:查询键入词 、 2:查询除了查询键入词之外的联想词
 	mustMap := make([]interface{}, 0)
@@ -1045,6 +1050,11 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 			"order": "desc",
 		},
 	})
+	//sortMap = append(sortMap, map[string]interface{}{
+	//	"_score": map[string]interface{}{
+	//		"order": "desc",
+	//	},
+	//})
 	//高亮
 	highlightMap := make(map[string]interface{}, 0)
 	highlightMap = map[string]interface{}{
@@ -1110,9 +1120,286 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 				}
 				searchItem := new(models.SearchItem)
 				searchItem.ArticleId, _ = strconv.Atoi(v.Id)
+				if len(v.Highlight["Annotation"]) > 0 {
+					for _, vText := range v.Highlight["Annotation"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
+				if len(v.Highlight["Abstract"]) > 0 {
+					for _, vText := range v.Highlight["Abstract"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
 				if len(v.Highlight["BodyText"]) > 0 {
-					searchItem.Body = v.Highlight["BodyText"]
+					for _, vText := range v.Highlight["BodyText"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
+
+				if len(searchItem.Body) == 0 {
+					bodyRune := []rune(article.BodyText)
+					bodyRuneLen := len(bodyRune)
+					if bodyRuneLen > 100 {
+						bodyRuneLen = 100
+					}
+					body := string(bodyRune[:bodyRuneLen])
+					searchItem.Body = []string{body}
+				}
+
+				//if len(v.Highlight["BodyText"]) > 0 {
+				//	searchItem.Body = v.Highlight["BodyText"]
+				//} else {
+				//	bodyRune := []rune(article.BodyText)
+				//	bodyRuneLen := len(bodyRune)
+				//	if bodyRuneLen > 100 {
+				//		bodyRuneLen = 100
+				//	}
+				//	body := string(bodyRune[:bodyRuneLen])
+				//	searchItem.Body = []string{body}
+				//}
+				var title string
+				if len(v.Highlight["Title"]) > 0 {
+					title = v.Highlight["Title"][0]
 				} else {
+					title = article.Title
+				}
+				searchItem.Title = title
+				searchItem.PublishDate = article.PublishDate
+				searchItem.ExpertBackground = article.ExpertBackground
+				searchItem.CategoryId = article.CategoryId
+				for _, v_result := range result {
+					if v_result.ArticleId == searchItem.ArticleId {
+						isAppend = true
+					}
+				}
+				if !isAppend {
+					result = append(result, searchItem)
+				}
+			}
+		}
+		total = searchByMatch.Hits.TotalHits.Value
+	}
+	return
+}
+
+func EsArticleSearchBody(keyWord string, startSize, pageSize int, orderColumn string, searchType int) (result []*models.SearchItem, total int64, err error) {
+	if keyWord == "" {
+		return
+	}
+	indexName := utils.IndexName
+	client := utils.Client
+
+	//Es 的高级查询有 自定义排序 文档一时半会儿撸不懂,先做多次查询手动过滤 2023.2.2
+	//ikType 查询方式 ,0:查所有 、 1:查询键入词 、 2:查询除了查询键入词之外的联想词
+	mustMap := make([]interface{}, 0)
+	shouldMap := make(map[string]interface{}, 0)
+	shouldMapquery := make([]interface{}, 0)
+
+	mustNotMap := make([]interface{}, 0)
+	shouldNotMap := make(map[string]interface{}, 0)
+	shouldNotMapquery := make([]interface{}, 0)
+	// @Param   OrderColumn   query   int  true       "排序字段 ,Comprehensive综合 ,Matching匹配度 ,PublishDate 发布时间 "
+	//keyWordWeight := GetWeight(keyWordLen)
+	var boost int
+
+	//如果是 2:查询标题,摘要,核心观点的词
+	if searchType == 1 {
+		shouldMapquery = append(shouldMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Title"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+		shouldMapquery = append(shouldMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Abstract"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+		shouldMapquery = append(shouldMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Annotation"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+	}
+
+	//如果是 2:查询body的相关词
+	if searchType == 2 {
+
+		shouldNotMapquery = append(shouldNotMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Title"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+		shouldNotMapquery = append(shouldNotMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Abstract"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+		shouldNotMapquery = append(shouldNotMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"Annotation"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+
+		//shouldNotMapquery = append(shouldNotMapquery, map[string]interface{}{
+		//	"function_score": map[string]interface{}{
+		//		"query": map[string]interface{}{
+		//			"multi_match": map[string]interface{}{
+		//				//"boost":  (lenkeyWordArr-k)*boost - 1, //给查询的值赋予权重
+		//				"boost":  boost, //给查询的值赋予权重
+		//				"fields": []interface{}{"BodyText"},
+		//				"query":  keyWord,
+		//			},
+		//		},
+		//	},
+		//})
+		shouldMapquery = append(shouldMapquery, map[string]interface{}{
+			"function_score": map[string]interface{}{
+				"query": map[string]interface{}{
+					"multi_match": map[string]interface{}{
+						//"boost":  (lenkeyWordArr-k)*boost - 1, //给查询的值赋予权重
+						"boost":  boost, //给查询的值赋予权重
+						"fields": []interface{}{"BodyText"},
+						"query":  keyWord,
+					},
+				},
+			},
+		})
+	}
+
+	shouldMap = map[string]interface{}{
+		"should": shouldMapquery,
+	}
+
+	shouldNotMap = map[string]interface{}{
+		"should": shouldNotMapquery,
+	}
+	//排序
+	sortMap := make([]interface{}, 0)
+
+	//时间
+	sortMap = append(sortMap, map[string]interface{}{
+		"PublishDate": map[string]interface{}{
+			"order": "desc",
+		},
+	})
+	//高亮
+	highlightMap := make(map[string]interface{}, 0)
+	highlightMap = map[string]interface{}{
+		"fields": map[string]interface{}{
+			"BodyText":   map[string]interface{}{},
+			"Title":      map[string]interface{}{},
+			"Abstract":   map[string]interface{}{},
+			"Annotation": map[string]interface{}{},
+		},
+		//样式 红色
+		"post_tags": []interface{}{"</font>"},
+		"pre_tags":  []interface{}{"<font color='red'>"},
+	}
+
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+	mustNotMap = append(mustNotMap, map[string]interface{}{
+		"bool": shouldNotMap,
+	})
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": mustMap,
+			},
+		},
+	}
+	//把第一次的筛选条件过滤掉
+	if searchType == 2 {
+		queryMap = map[string]interface{}{
+			"query": map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must":     mustMap,
+					"must_not": mustNotMap,
+				},
+			},
+		}
+	}
+	if orderColumn == "Matching" {
+		queryMap["sort"] = sortMap
+	}
+	queryMap["from"] = startSize
+	queryMap["size"] = pageSize
+	queryMap["highlight"] = highlightMap
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+	//utils.FileLog.Info(string(jsonBytes))
+	request := client.Search(indexName).Source(queryMap) // sets the JSON request
+	searchByMatch, err := request.Do(context.Background())
+	if searchByMatch != nil {
+		if searchByMatch.Hits != nil {
+			for _, v := range searchByMatch.Hits.Hits {
+				var isAppend bool
+				articleJson, err := v.Source.MarshalJSON()
+				if err != nil {
+					return nil, 0, err
+				}
+				article := new(models.CygxArticleEs)
+				err = json.Unmarshal(articleJson, &article)
+				if err != nil {
+					return nil, 0, err
+				}
+				searchItem := new(models.SearchItem)
+				searchItem.ArticleId, _ = strconv.Atoi(v.Id)
+				if len(v.Highlight["Annotation"]) > 0 {
+					for _, vText := range v.Highlight["Annotation"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
+				if len(v.Highlight["Abstract"]) > 0 {
+					for _, vText := range v.Highlight["Abstract"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
+				if len(v.Highlight["BodyText"]) > 0 {
+					for _, vText := range v.Highlight["BodyText"] {
+						searchItem.Body = append(searchItem.Body, vText)
+					}
+				}
+
+				if len(searchItem.Body) == 0 {
 					bodyRune := []rune(article.BodyText)
 					bodyRuneLen := len(bodyRune)
 					if bodyRuneLen > 100 {
@@ -1121,6 +1408,18 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 					body := string(bodyRune[:bodyRuneLen])
 					searchItem.Body = []string{body}
 				}
+
+				//if len(v.Highlight["BodyText"]) > 0 {
+				//	searchItem.Body = v.Highlight["BodyText"]
+				//} else {
+				//	bodyRune := []rune(article.BodyText)
+				//	bodyRuneLen := len(bodyRune)
+				//	if bodyRuneLen > 100 {
+				//		bodyRuneLen = 100
+				//	}
+				//	body := string(bodyRune[:bodyRuneLen])
+				//	searchItem.Body = []string{body}
+				//}
 				var title string
 				if len(v.Highlight["Title"]) > 0 {
 					title = v.Highlight["Title"][0]

+ 62 - 0
services/industrial_management.go

@@ -670,3 +670,65 @@ func IndustrialManagementHotMapGropuPermission() (mapResp map[int]bool, err erro
 	}
 	return
 }
+
+// GetLyjhTypeMap 获取路演精华对应分类ID
+func GetLyjhTypeMap() (mapResp map[int]int, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取路演精华对应分类ID失败 ErrMsg:"+err.Error(), 2)
+
+		}
+	}()
+	condition := " AND match_type_name = '路演精华'  "
+	var pars []interface{}
+	list, e := models.GetReportMappingList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("报告最早发布时间有误,GetindustryVideo " + e.Error())
+		return
+	}
+	mapResp = make(map[int]int, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			mapResp[v.CategoryId] = v.CategoryId
+		}
+	}
+	return
+}
+
+// GetLyjhArticleMap 获取路演精华对应文章ID
+func GetLyjhArticleMap() (mapResp map[int]bool, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取路演精华对应文章ID失败 ErrMsg:"+err.Error(), 2)
+		}
+	}()
+	condition := " AND match_type_name = '路演精华'  "
+	var pars []interface{}
+	list, e := models.GetReportMappingList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("报告最早发布时间有误,GetindustryVideo " + e.Error())
+		return
+	}
+	var categoryId []int
+	mapResp = make(map[int]bool, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			categoryId = append(categoryId, v.CategoryId)
+		}
+	}
+	lencategoryId := len(categoryId)
+	if lencategoryId > 0 {
+		pars = make([]interface{}, 0)
+		condition = ` AND a.category_id IN (` + utils.GetOrmInReplace(lencategoryId) + `)`
+		pars = append(pars, categoryId)
+		listArticle, e := models.GetHomeList(condition, pars, 0, 1000)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetResourceDataList, Err: " + e.Error())
+			return
+		}
+		for _, v := range listArticle {
+			mapResp[v.ArticleId] = true
+		}
+	}
+	return
+}

+ 26 - 0
services/report_mapping.go

@@ -0,0 +1,26 @@
+package services
+
+import (
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+)
+
+func GetReportMappingMap() (mapResp map[int]bool, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("GetReportMappingMap, ErrMsg: "+err.Error(), 3)
+		}
+	}()
+	mapResp = make(map[int]bool, 0)
+	list, err := models.GetReportMappingByPermissionName(utils.CE_LUE_NAME)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if len(list) > 0 {
+		for _, v := range list {
+			mapResp[v.CategoryId] = true
+		}
+	}
+	return
+
+}

+ 3 - 0
services/resource_data.go

@@ -74,6 +74,7 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 		}
 		for _, v := range listArticle {
 			v.Body = ""
+			v.BodyHtml = ""
 			mapItems[fmt.Sprint("article", v.ArticleId)].Article = v
 		}
 	}
@@ -150,6 +151,7 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 					imgUrlResp = mapChart[v.ChartPermissionName]
 				}
 			}
+			v.SourceType = 1
 			mapItems[fmt.Sprint("activity", v.ActivityId)].Activity = v
 		}
 	}
@@ -197,6 +199,7 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 			} else {
 				v.TripStatus = 2
 				v.TripImgLink = v.TripImgLinkFix
+				v.ActivityTimeText = v.ActivityTimeTextByDay
 			}
 			resultTimeStart := utils.StrTimeToTime(v.ActivityTime)  //时间字符串格式转时间格式
 			resultTimeEnd := utils.StrTimeToTime(v.ActivityTimeEnd) //时间字符串格式转时间格式

+ 1 - 1
services/user_permission.go

@@ -61,7 +61,7 @@ func GetUserRaiPermissionInfo(userId, companyId int) (authInfo models.UserPermis
 	}
 
 	// permissions示例: 医药,消费,科技,智造,策略,专家,买方研选
-	permissions, e := models.GetCompanyPermission(companyId)
+	permissions, e := models.GetCompanyPermissionName(companyId)
 	if e != nil {
 		err = errors.New("获取客户权限失败, Err: " + e.Error())
 		return

+ 12 - 25
services/wechat_send_msg.go

@@ -13,7 +13,7 @@ import (
 	"time"
 )
 
-//访谈申请
+// 访谈申请
 func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -60,7 +60,7 @@ func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle s
 	return
 }
 
-//访谈申请取消
+// 访谈申请取消
 func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -102,7 +102,7 @@ func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleT
 	return
 }
 
-//权限申请
+// 权限申请
 func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -116,28 +116,15 @@ func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod s
 	}()
 
 	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
+	accessToken, err = models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
 	}
-
 	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
 
 	sendMap := make(map[string]interface{})
@@ -244,7 +231,7 @@ type SendWxTemplate struct {
 	OpenIdArr      []string `description:"消息接收者openid"`
 }
 
-//推送模板消息
+// 推送模板消息
 func PublicSendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
 	postData, err := json.Marshal(sendInfo)
 	if err != nil {

+ 37 - 30
services/wx_template_msg.go

@@ -13,6 +13,7 @@ import (
 	"time"
 )
 
+// 活动预开始模版消息通知
 func SendWxMsgWithFrequency(first, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
 	var msg string
 	defer func() {
@@ -51,6 +52,42 @@ func SendWxMsgWithFrequency(first, activityName, reserveResults, activityTime, a
 	return
 }
 
+// 专项调研活动预开始消息通知
+func SendWxMsgWithFrequencySpecial(first, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.WxMsgTemplateIdActivityApplyXzs
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["activity_name"] = map[string]interface{}{"value": activityName, "color": "#173177"}
+	sendData["reserve_results"] = map[string]interface{}{"value": reserveResults, "color": "#173177"}
+	sendData["activity_time"] = map[string]interface{}{"value": activityTime, "color": "#173177"}
+	sendData["activity_address"] = map[string]interface{}{"value": activityAddress, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
+	return
+}
+
 // 发送报告提问消息提醒
 func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
 	var msg string
@@ -62,17 +99,6 @@ func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.
 		}
 		fmt.Println("line 21", err, msg)
 	}()
-	//utils.FileLog.Info("%s", "services SendMsg")
-	////accessToken, err := models.GetWxAccessToken()
-	//accessToken, err := models.GetWxAccessTokenByXzs()
-	//if err != nil {
-	//	msg = "GetWxAccessToken Err:" + err.Error()
-	//	return
-	//}
-	//if accessToken == "" {
-	//	msg = "accessToken is empty"
-	//	return
-	//}
 	var first string
 	var keyword1 string
 	var keyword2 string
@@ -85,23 +111,6 @@ func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.
 	keyword2 = ""
 	keyword4 = askMsg
 	remark = title
-	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	////templateId := utils.WxMsgTemplateIdAskMsg
-	//templateId := utils.WxMsgTemplateIdAskMsgXzs
-	//sendMap := make(map[string]interface{})
-	//sendData := make(map[string]interface{})
-	//sendMap["template_id"] = templateId
-	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
-	////sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "path": "article/detail?ArticleId=1000001"}
-	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	//sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	//sendData["keyword2"] = map[string]interface{}{"value": "", "color": "#173177"}
-	//sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-	//sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-	//sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
-	//sendMap["data"] = sendData
-	//WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
-
 	openIdArr := make([]string, 0)
 	for _, v := range openIdList {
 		openIdArr = append(openIdArr, v.OpenId)
@@ -137,8 +146,6 @@ func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openId
 			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-
-	utils.FileLog.Info("%s", "services SendMsg")
 	accessToken, err := models.GetWxAccessToken()
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()

+ 29 - 0
services/xzs_choose_category.go

@@ -0,0 +1,29 @@
+package services
+
+import (
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+)
+
+func GetChooseCategoryMap(wxUser *models.WxUserItem) (mapResp map[int]bool, err error) {
+	if wxUser.Mobile == "" {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("GetChooseCategoryMap, ErrMsg: "+err.Error(), 3)
+		}
+	}()
+	mapResp = make(map[int]bool, 0)
+	list, err := models.GetCygxXzsChooseCategoryList(wxUser.Mobile)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if len(list) > 0 {
+		for _, v := range list {
+			mapResp[v.CategoryId] = true
+		}
+	}
+	return
+
+}

+ 15 - 13
services/yidong.go

@@ -12,7 +12,7 @@ import (
 	"time"
 )
 
-//GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
+// GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
 func GetActivityTypeIdWithYiDong(industrySwName string) (chartPermissionId int) {
 	mapIndustrySwName := map[string]int{
 		"家用电器": utils.XIAO_FEI_ID,
@@ -69,7 +69,7 @@ func GetActivityTypeIdWithYiDong(industrySwName string) (chartPermissionId int)
 	return
 }
 
-//GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
+// GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
 func GetActivityTypeNameWithYiDong(industrySwName string) (chartPermissionName string) {
 	mapIndustrySwName := map[string]string{
 		"家用电器": utils.XIAO_FEI_NAME,
@@ -126,7 +126,7 @@ func GetActivityTypeNameWithYiDong(industrySwName string) (chartPermissionName s
 	return
 }
 
-//获取易董token
+// 获取易董token
 func GetYiDongToken() (token string, err error) {
 	defer func() {
 		if err != nil {
@@ -177,7 +177,7 @@ func GetYiDongToken() (token string, err error) {
 	return
 }
 
-//获取易董活动列表
+// 获取易董活动列表
 func GetYiDongActivity(cont context.Context) (err error) {
 	//func GetYiDongActivity() (err error) {
 	defer func() {
@@ -257,11 +257,11 @@ func GetYiDongActivity(cont context.Context) (err error) {
 			item.YidongActivityId = v.ID
 			item.ActivityTypeId = 3
 			item.ActivityTypeName = "公司调研电话会"
-			sliceCompanyInfo := strings.Split(v.Title, "(")
-			sliceActivityTitle := strings.Split(v.Title, ")")
+			sliceCompanyInfo := strings.Split(v.CompanyInfo, "(")
+			sliceActivityTitle := strings.Split(v.CompanyInfo, ")")
 			companyInfo := sliceCompanyInfo[0]
 			if len(sliceActivityTitle) > 1 {
-				item.ActivityName = companyInfo + sliceActivityTitle[len(sliceActivityTitle)-1]
+				item.ActivityName = companyInfo + v.Title
 			} else {
 				item.ActivityName = v.Title
 			}
@@ -281,6 +281,7 @@ func GetYiDongActivity(cont context.Context) (err error) {
 			item.ActivityTimeText = GetActivityTextTime(v.Start)
 			item.YidongActivityUrl = v.URL
 			item.ActivityJoinType = v.ActivityJoinType
+			item.IsExternalLabel = 1
 			detailYidng, err := GetYiDongActivityDetail(v.ID)
 			if err != nil {
 				return err
@@ -323,6 +324,7 @@ func GetYiDongActivity(cont context.Context) (err error) {
 					updateParams["ActivityJoinType"] = item.ActivityJoinType
 					updateParams["YidongSignUpStart"] = item.YidongSignUpStart
 					updateParams["YidongSignUpEnd"] = item.YidongSignUpEnd
+					updateParams["IsExternalLabel"] = 1
 					updateParams["LastUpdatedTime"] = time.Now()
 					whereParam := map[string]interface{}{"yidong_activity_id": item.YidongActivityId}
 					err = models.UpdateByExpr(models.CygxActivity{}, whereParam, updateParams)
@@ -336,7 +338,7 @@ func GetYiDongActivity(cont context.Context) (err error) {
 	return
 }
 
-//获取易董活动详情
+// 获取易董活动详情
 func GetYiDongActivityDetail(activityId string) (detail *models.ApifoxModaldetail, err error) {
 	defer func() {
 		if err != nil {
@@ -390,7 +392,7 @@ func GetYiDongActivityDetail(activityId string) (detail *models.ApifoxModaldetai
 	return
 }
 
-//生成用户相关信息接口 获取用户tgc
+// 生成用户相关信息接口 获取用户tgc
 func GetYiDongCreateUserInfo(user *models.WxUserItem) (userTgc string, err error) {
 	defer func() {
 		if err != nil {
@@ -441,7 +443,7 @@ func GetYiDongCreateUserInfo(user *models.WxUserItem) (userTgc string, err error
 	return
 }
 
-//GetYiDongOriginalLink 将易懂的短连接转为长链接
+// GetYiDongOriginalLink 将易懂的短连接转为长链接
 func GetYiDongOriginalLink(item *models.ActivityDetail) (yidongLongLink string, err error) {
 	defer func() {
 		if err != nil {
@@ -504,7 +506,7 @@ func GetYiDongOriginalLink(item *models.ActivityDetail) (yidongLongLink string,
 	return
 }
 
-//处理易董这边过来的时间格式
+// 处理易董这边过来的时间格式
 func GetActivityTextTime(timeYidong string) (timeText string) {
 	strTime := timeYidong
 	startTime := utils.StrTimeToTime(strTime)
@@ -546,7 +548,7 @@ func init232() {
 	//fmt.Println(timeText)
 }
 
-//GetYiDongActivityMeeting获取易董到会详情
+// GetYiDongActivityMeeting获取易董到会详情
 func GetYiDongActivityMeeting(cont context.Context) (err error) {
 	var condition string
 
@@ -672,7 +674,7 @@ func GetYiDongActivityMeeting(cont context.Context) (err error) {
 	return
 }
 
-//YidongActivityGroup 添加活动与产业标的的关联
+// YidongActivityGroup 添加活动与产业标的的关联
 func YidongActivityGroup(subjectName string, activityId int) (err error) {
 	subjectList, err := models.GetCygxIndustrialSubjectList(subjectName)
 	if err != nil {

+ 3 - 0
utils/constants.go

@@ -13,6 +13,7 @@ const (
 	FormatDateTimeNoSecond = "2006-01-02 15:04"        //完整时间格式
 	FormatDateTimeUnSpace  = "20060102150405"          //完整时间格式
 	PageSize15             = 15                        //列表页每页数据量
+	FormatYearDate         = "2006"                    //日期格式
 	PageSize5              = 5
 	PageSize10             = 10
 	PageSize20             = 20
@@ -98,6 +99,8 @@ const (
 	HZ_COMPANY_ID                    int    = 16                                                                                                                                                                                                 // 弘则公司的ID
 	HONG_GUAN_NAME                   string = "宏观"
 	HONG_GUAN_ID                     int    = 1
+	GU_SHOU_NAME                     string = "固收"
+	GU_SHOU_ID                       int    = 100000   // 自定义权限类型ID ,十万起步
 	YAN_XUAN_ARTICLE_TYPE_IDS        string = "1,2,12" // 属于研选的报告类型ID
 	NO_YAN_XUAN_ARTICLE_TYPE_IDS     string = "13"     // 不属于研选的报告类型ID
 )

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff