Browse Source

Merge branch 'master' into cygx_12.0

# Conflicts:
#	controllers/user.go
#	models/db.go
#	models/report.go
#	routers/router.go
#	utils/constants.go
ziwen 1 year ago
parent
commit
16f7f53f77
53 changed files with 2789 additions and 736 deletions
  1. 136 39
      controllers/activity.go
  2. 87 28
      controllers/article.go
  3. 93 0
      controllers/banner.go
  4. 131 0
      controllers/collection.go
  5. 255 240
      controllers/home.go
  6. 12 64
      controllers/report.go
  7. 89 1
      controllers/report_selection.go
  8. 8 0
      controllers/search.go
  9. 19 2
      controllers/tag.go
  10. 41 22
      controllers/user.go
  11. 104 89
      models/activity.go
  12. 3 2
      models/activity_type.go
  13. 8 0
      models/admin.go
  14. 77 0
      models/apply_collection.go
  15. 3 0
      models/apply_record.go
  16. 33 28
      models/article.go
  17. 39 0
      models/article_apply_appointment_expert.go
  18. 2 0
      models/article_history_record.go
  19. 10 0
      models/banner.go
  20. 74 0
      models/banner_yx_survey.go
  21. 33 12
      models/cygx_tag.go
  22. 6 0
      models/db.go
  23. 1 47
      models/industrial_activity_group_management.go
  24. 19 0
      models/industrial_subject.go
  25. 28 0
      models/industry_fllow_log.go
  26. 12 12
      models/micro_roadshow.go
  27. 18 16
      models/report.go
  28. 27 0
      models/report_mapping_category_group.go
  29. 16 17
      models/report_selection.go
  30. 58 0
      models/report_selection_log.go
  31. 63 0
      models/report_selection_log_apply.go
  32. 2 0
      models/resource_data.go
  33. 60 0
      models/resource_data_industrial_group_management.go
  34. 1 0
      models/search.go
  35. 13 0
      models/user_record.go
  36. 72 0
      routers/commentsRouter.go
  37. 6 0
      routers/router.go
  38. 328 9
      services/activity.go
  39. 6 0
      services/activity_button.go
  40. 1 1
      services/activity_signup.go
  41. 41 3
      services/article.go
  42. 159 0
      services/article_apply_appointment_expert.go
  43. 126 0
      services/banner_yx_survey.go
  44. 94 0
      services/collection.go
  45. 5 3
      services/es_comprehensive.go
  46. 31 0
      services/industry_fllow.go
  47. 72 0
      services/report_mapping_category_group.go
  48. 70 0
      services/report_selection.go
  49. 30 94
      services/resource_data.go
  50. 143 0
      services/tag.go
  51. 1 1
      services/wx_template_msg.go
  52. 9 6
      services/yidong.go
  53. 14 0
      utils/constants.go

+ 136 - 39
controllers/activity.go

@@ -20,7 +20,6 @@ type ActivityNoLoginController struct {
 	BaseAuthMobileController
 }
 
-
 // @Title 活动类型下的主题列表
 // @Description 获取活动类型下的主题列表接口
 // @Param   ChartPermissionIds   query   string  false     "行业id 多个用 , 隔开"
@@ -30,6 +29,7 @@ type ActivityNoLoginController struct {
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
 // @Param   IsExternalLabel   query   int  false       "是否仅展示外部资源 1:是、0:否 默认0"
 // @Param   IsResearchPoints   query   int  false       "是否仅展示研选扣点 1:是、0:否 默认0"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.ActivityTypeListHomeResp
 // @router /labelTypeList [get]
 func (this *ActivityNoLoginController) LabelTypeList() {
@@ -50,6 +50,7 @@ func (this *ActivityNoLoginController) LabelTypeList() {
 	activeState := this.GetString("ActiveState")
 	isExternalLabel, _ := this.GetInt("IsExternalLabel")   //
 	isResearchPoints, _ := this.GetInt("IsResearchPoints") //
+	isResearch, _ := this.GetBool("IsResearch", false)     // 是否为研选 查研观向11.0 (研选活动独立显示)
 	var condition string
 	var conditioninit string
 	var pars []interface{}
@@ -62,9 +63,17 @@ func (this *ActivityNoLoginController) LabelTypeList() {
 	//condition += `AND art.activity_time > ?  `
 	//pars = append(pars, time.Now().AddDate(0, -3, 0).Format(utils.FormatDate))
 
+	if isResearch {
+		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
+	} else {
+		conditioninit += ` AND ( art.chart_permission_id  !=  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `  OR  ( art.is_show_hz = 1 AND art.chart_permission_id  =  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `)  )`
+		conditioninit += ` AND IF (	 art.active_state = 3, art.chart_permission_id != ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `, 1 = 1 ) ` //V 11.0 研选活动结束后就不在已结束页面展示了
+	}
 	//行业名称
 	if len(chartPermissionIds) > 0 {
-		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		//conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		conditioninit += `  AND IF ( art.yidong_activity_id != '' , art.chart_permission_id_deputy  IN (` + chartPermissionIds + `) ,1=1 ) `
+		conditioninit += `  AND IF ( art.yidong_activity_id = '' , art.chart_permission_id  IN (` + chartPermissionIds + `) ,1=1 ) `
 	}
 	//哪一天
 	if whichDay != "" {
@@ -145,9 +154,13 @@ func (this *ActivityNoLoginController) LabelTypeList() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	//return
-
-	list, err := models.GetActivityTypeHomeList()
+	var conditionType string
+	if isResearch {
+		conditionType = " AND  source_type IN (0,2) "
+	} else {
+		conditionType = " AND  source_type IN (0,1) "
+	}
+	list, err := models.GetActivityTypeHomeList(conditionType)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -198,6 +211,7 @@ func (this *ActivityNoLoginController) LabelTypeList() {
 // @Param   Filter			query	int		false	"筛选条件 0:全部 1:视频 2:音频"
 // @Param   IsExternalLabel   query   int  false       "是否仅展示外部资源 1:是、0:否 默认0"
 // @Param   IsResearchPoints   query   int  false       "是否仅展示研选扣点 1:是、0:否 默认0"
+// @Param   IsResearch   query   bool  false       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /list [get]
 func (this *ActivityNoLoginController) ActivityListNew() {
@@ -229,7 +243,7 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 	activityId, _ := this.GetInt("ActivityId")             // 仅用于判断【新】标签
 	isExternalLabel, _ := this.GetInt("IsExternalLabel")   //
 	isResearchPoints, _ := this.GetInt("IsResearchPoints") //
-
+	isResearch, _ := this.GetBool("IsResearch", false)     // 是否为研选 查研观向11.0 (研选活动独立显示)
 	var startSize int
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -246,9 +260,21 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 	if label != "" {
 		conditioninit += ` AND art.label  LIKE "%` + label + `%" `
 	}
+
+	//是否是研选
+	if isResearch {
+		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
+	} else {
+		conditioninit += ` AND ( art.chart_permission_id  !=  '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `'  OR  ( art.is_show_hz = 1 AND art.chart_permission_id  =  '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `')  )`
+
+		conditioninit += ` AND IF (	 art.active_state = 3, art.chart_permission_id != ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `, 1 = 1 ) ` //V 11.0 研选活动结束后就不在已结束页面展示了
+	}
+
 	//行业名称
 	if len(chartPermissionIds) > 0 {
-		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		//conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		conditioninit += `  AND IF ( art.yidong_activity_id != '' , art.chart_permission_id_deputy  IN (` + chartPermissionIds + `) ,1=1 ) `
+		conditioninit += `  AND IF ( art.yidong_activity_id = '' , art.chart_permission_id  IN (` + chartPermissionIds + `) ,1=1 ) `
 	}
 	//哪一天
 	if whichDay != "" {
@@ -352,7 +378,6 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 
 	condition = ""
 	//活动可见限制
-	//conditionActivity, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 1)
 	conditionActivity, err := services.ActivityConditioninitSql(user, conditioninit, isPower)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
@@ -380,8 +405,8 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 	if label != "" && activeState == "1" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
-
-	if activeState == "1" {
+	//未开始进行中默认按照时间正序
+	if activeState == "1" || activeState == "1,2" || activeState == "" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
 
@@ -440,7 +465,7 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 		}
 
 		if strings.Contains(v.ChartPermissionName, "研选") && v.ActivityTypeId == 1 {
-			list[k].ActivityTypeName = "买方研选电话会"
+			//list[k].ActivityTypeName = "买方研选电话会"
 			list[k].ImgUrlText = utils.YAN_XUAN_IMG
 		}
 		if v.ActivityType == 0 {
@@ -513,6 +538,13 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 			if v.ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, v.ChartPermissionName) {
 				au.HasPermission = 2
 			}
+
+			//如果是易董的活动,主、副权限有一个满足即可 查研观向 11.0
+			if v.YidongActivityId != "" {
+				if utils.InArrayByStr(permissionArr, v.ChartPermissionName) || utils.InArrayByStr(permissionArr, v.ChartPermissionNameDeputy) {
+					au.HasPermission = 1
+				}
+			}
 		}
 
 		// 无权限的弹框提示
@@ -546,9 +578,10 @@ func (this *ActivityNoLoginController) ActivityListNew() {
 				list[k].VideoDetail = mapActivityVideo[v.ActivityId]
 			}
 		}
-		activityList = append(activityList, services.ActivityButtonShow(list[k], user, permissionArr))
-	}
+		//activityList = append(activityList, services.ActivityButtonShow(list[k], user, permissionArr))
 
+	}
+	activityList = services.ActivityArrButtonShow(list, user, permissionArr)
 	//处理不同的报名方式按钮回显
 	mapActivitySignup, err := services.GetActivitySignupResp(mapActivityId, user)
 	if err != nil {
@@ -1680,26 +1713,7 @@ func (this *ActivityController) AskAdd() {
 		return
 	}
 	content := req.Content
-	//itemToken, err := services.WxGetToken()
-	//if err != nil {
-	//	br.Msg = "GetWxAccessToken Err:" + err.Error()
-	//	return
-	//}
-	//if itemToken.AccessToken == "" {
-	//	br.Msg = "accessToken is empty"
-	//	return
-	//}
-	//commerr, err := weapp.MSGSecCheck(itemToken.AccessToken, content)
-	//if err != nil {
-	//	br.Msg = "内容校验失败!"
-	//	br.ErrMsg = "内容校验失败,Err:" + err.Error()
-	//	return
-	//}
-	//if commerr.ErrCode != 0 {
-	//	br.Msg = "内容违规,请重新提交!"
-	//	br.ErrMsg = "颜文字内容违规,Err:" + commerr.ErrMSG
-	//	return
-	//}
+
 	activityId := req.ActivityId
 	activityInfo, errInfo := models.GetAddActivityInfoById(activityId)
 	if activityInfo == nil {
@@ -1892,11 +1906,13 @@ func (this *ActivityController) ActivityListSearch() {
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
 	}
+
 	if currentIndex <= 0 {
 		currentIndex = 1
 	}
 	startSize = utils.StartIndex(currentIndex, pageSize)
 	var condition string
+
 	//活动可见限制
 	conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "3", "", 0, 1, keyWord, playBack, 1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1904,10 +1920,18 @@ func (this *ActivityController) ActivityListSearch() {
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 		return
 	}
+
 	if source == 1 {
 		condition += ` AND art.yidong_activity_id = '' `
 	}
-	condition += ` AND art.is_limit_people = 1 AND art.publish_status = 1 ` + conditionActivity
+
+	//conditionActivity, err := services.ActivityConditioninitSql(user, conditionInit, 0)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
+	//	return
+	//}
+	condition += ` AND art.publish_status = 1 ` + conditionActivity
 	listActivity, total, err := services.GetActivitySpecialSearcheList(user, condition, startSize, pageSize, playBack, keyWord)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -1968,6 +1992,7 @@ func (this *ActivityController) ActivityListSearch() {
 		item.IsLimitPeople = v.IsLimitPeople
 		item.IsResearchPoints = v.IsResearchPoints
 		item.SiginupDeadline = v.SiginupDeadline
+		item.IsYidongActivity = v.IsYidongActivity
 		// 判断是否属于研选类型的活动
 		if strings.Contains(v.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 			item.IsResearch = true
@@ -1997,6 +2022,12 @@ func (this *ActivityController) ActivityListSearch() {
 			if v.ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, v.ChartPermissionName) {
 				au.HasPermission = 2
 			}
+			//如果是易董的活动,主、副权限有一个满足即可 查研观向 11.0
+			if v.YidongActivityId != "" {
+				if utils.InArrayByStr(permissionArr, v.ChartPermissionName) || utils.InArrayByStr(permissionArr, v.ChartPermissionNameDeputy) {
+					au.HasPermission = 1
+				}
+			}
 		}
 		// 无权限的弹框提示
 		if au.HasPermission != 1 {
@@ -2022,9 +2053,9 @@ func (this *ActivityController) ActivityListSearch() {
 		list = make([]*models.CygxResourceDataResp, 0)
 	}
 	//添加活动搜索记录
-	if keyWord != "" {
-		//go services.AddActivitykeyWordSearch(keyWord, user)
-	}
+	//if keyWord != "" {
+	//go services.AddActivitykeyWordSearch(keyWord, user)
+	//}
 	resp.Paging = page
 	resp.List = list
 	br.Ret = 200
@@ -2191,7 +2222,7 @@ func (this *ActivityController) ScheduleList() {
 			list[k].IsResearch = true
 		}
 		if strings.Contains(v.ChartPermissionName, "研选") && v.ActivityTypeId == 1 {
-			list[k].ActivityTypeName = "买方研选电话会"
+			//list[k].ActivityTypeName = "买方研选电话会"
 			//list[k].ImgUrlText = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202112/20211221/bIdfv8t86xrFRpDOeGGHXOmKEuKl.png"
 			list[k].ImgUrlText = utils.YAN_XUAN_IMG
 		}
@@ -2463,4 +2494,70 @@ func (this *ActivityController) ActivityVoiceHistoryAdd() {
 	br.Success = true
 	br.Msg = "操作成功"
 	return
-}
+}
+
+// @Title  获取易董活动跳转地址详情
+// @Description 获取易董活动跳转地址详情接口
+// @Param   ActivityId   query   int  true       "活动ID"
+// @Success Ret=200 {object} models.CygxActivityResp
+// @router /get_yidong_url [get]
+func (this *ActivityController) GetYidongUrl() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	activityId, _ := this.GetInt("ActivityId")
+	if activityId < 1 {
+		br.Msg = "请输入活动ID"
+		return
+	}
+	resp := new(models.CygxYidongActivityUrlResp)
+	activityInfo, err := models.GetAddActivityInfoByIdShow(uid, activityId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取活动详情信息失败,Err:" + err.Error()
+		return
+	}
+	havePower, isResearchSpecial, err := services.GetActivityDetailUserPower(user, activityInfo)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "校验用户权限失败,Err:" + err.Error()
+		return
+	}
+	resp.IsResearchSpecial = isResearchSpecial
+	if havePower {
+		resp.HasPermission = 1
+		if activityInfo.YidongActivityId != "" {
+			ydTgc, _ := services.GetYiDongCreateUserInfo(user)
+			yidongLongLink, _ := services.GetYiDongOriginalLink(activityInfo)
+			if yidongLongLink != "" {
+				resp.YidongActivityUrl = yidongLongLink + "%26source=11%26fromHz=true%26tgc=" + ydTgc
+			}
+		}
+	} else {
+		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		popupMsg = "暂无查看权限"
+		resp.PopupMsg = popupMsg
+		resp.HasPermission = hasPermission
+		resp.SellerName = sellerName
+		resp.SellerMobile = sellerMobile
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 87 - 28
controllers/article.go

@@ -153,7 +153,7 @@ func (this *ArticleController) Detail() {
 		} else {
 			hasPermission = 1
 			hasFree = 1
-			var articlePermissionPermissionName string
+			var articlePermissionName string
 			if detail.CategoryId > 0 {
 				articlePermission, err := models.GetArticlePermission(detail.CategoryId)
 				if err != nil {
@@ -166,12 +166,12 @@ func (this *ArticleController) Detail() {
 					br.ErrMsg = "报告权限不存在,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
 					return
 				}
-				articlePermissionPermissionName = articlePermission.PermissionName
+				articlePermissionName = articlePermission.PermissionName
 			} else {
-				articlePermissionPermissionName = detail.CategoryName
+				articlePermissionName = detail.CategoryName
 			}
 			var hasPersion bool
-			slice := strings.Split(articlePermissionPermissionName, ",")
+			slice := strings.Split(articlePermissionName, ",")
 			for _, v := range slice {
 				if strings.Contains(companyPermission, v) {
 					hasPersion = true
@@ -186,30 +186,34 @@ func (this *ArticleController) Detail() {
 			if userType == 1 && strings.Contains(detail.CategoryName, "研选") {
 				hasPersion = false
 			}
-			if detail.IsReport == 1 {
-				detailCategory, err := models.GetdetailByCategoryIdSando(detail.CategoryId)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "获取信息失败,Err:" + err.Error() + "categoryID 不存在:" + strconv.Itoa(detail.CategoryId)
-					return
-				}
-				permissionStr, err := models.GetCompanyPermissionByUser(user.CompanyId)
-				if err != nil {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
-					return
-				}
-				if detailCategory != nil {
-					if detailCategory.PermissionType == 1 {
-						if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(主观)") {
-							hasPersion = false
-						}
-					} else if detailCategory.PermissionType == 2 {
-						if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(客观)") {
-							hasPersion = false
-						}
-					}
-				}
+			//if detail.IsReport == 1 {
+			//	detailCategory, err := models.GetdetailByCategoryIdSando(detail.CategoryId)
+			//	if err != nil && err.Error() != utils.ErrNoRow() {
+			//		br.Msg = "获取信息失败"
+			//		br.ErrMsg = "获取信息失败,Err:" + err.Error() + "categoryID 不存在:" + strconv.Itoa(detail.CategoryId)
+			//		return
+			//	}
+			//	permissionStr, err := models.GetCompanyPermissionByUser(user.CompanyId)
+			//	if err != nil {
+			//		br.Msg = "获取信息失败"
+			//		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			//		return
+			//	}
+			//	if detailCategory != nil {
+			//		if detailCategory.PermissionType == 1 {
+			//			if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(主观)") {
+			//				hasPersion = false
+			//			}
+			//		} else if detailCategory.PermissionType == 2 {
+			//			if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(客观)") {
+			//				hasPersion = false
+			//			}
+			//		}
+			//	}
+			//}
+			//大行业通过权限校验,再校验主客观权限。只有医药、消费、科技、智造,才会校验主客观权限
+			if hasPersion && utils.InArrayByStr([]string{utils.YI_YAO_NAME, utils.XIAO_FEI_NAME, utils.KE_JI_NAME, utils.ZHI_ZAO_NAME}, articlePermissionName) {
+				hasPersion = services.CheckArticlePermissionType(articleId, user)
 			}
 			if !hasPersion {
 				if applyCount == 0 {
@@ -315,6 +319,9 @@ Loop:
 			utils.Rc.Put(key, 1, 30*time.Second)
 		}
 	}
+	if detail.ArticleTypeId == 14 {
+		detail.IsApplyAppointmentExpert = true //判断文章类型是否属于专家访谈  查研观向11.0
+	}
 	if detail.SubCategoryName == "专项调研" {
 		detail.IsSpecialArticle = true
 	}
@@ -793,3 +800,55 @@ Loop:
 	br.Msg = "操作成功"
 	br.Data = resp
 }
+
+// @Title 约访专家
+// @Description 约访专家接口
+// @Param  request	body models.CygxArticleIdReq true "type json string"
+// @Success 200 {object}
+// @router /applyAppointmentExpert [post]
+func (this *ArticleController) ApplyAppointmentExpert() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxArticleIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	articleId := req.ArticleId
+	var condition string
+	var pars []interface{}
+	condition += ` AND article_id =? AND user_id = ?  `
+	pars = append(pars, articleId, user.UserId)
+	total, err := models.GetCygxArticleApplyAppointmentExpertCount(condition, pars)
+	if err != nil {
+		br.Msg = "约访专家失败"
+		br.ErrMsg = "约访专家失败,Err:" + err.Error()
+		return
+	}
+	if total > 0 {
+		br.Msg = "您已提交申请,请勿重复提交。"
+		return
+	}
+	err = services.AddArticleApplyAppointmentExpert(user, articleId)
+	if err != nil {
+		br.Msg = "约访专家失败"
+		br.ErrMsg = "约访专家失败,Err:" + err.Error()
+		return
+	}
+	services.SendArticleApplyAppointmentExpertTemplateMsg(user, articleId)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 93 - 0
controllers/banner.go

@@ -4,6 +4,8 @@ import (
 	"encoding/json"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/services"
+	"hongze/hongze_clpt/utils"
+	"time"
 )
 
 // Banner
@@ -201,3 +203,94 @@ func (this *BannerController) History() {
 	br.Success = true
 	br.Msg = "记录成功"
 }
+
+// @Title 研选banner列表
+// @Description 研选banner列表接口
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /listYx [get]
+func (this *BaseBannerController) ListYx() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	resp := new(models.BannerUrlYxListResp)
+	var listA []*models.BannerUrlYxResp
+	var listB []*models.BannerUrlYxResp
+	listA = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/web_1.png", Path: "/index/"},
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/web_2.png", Path: ""},
+	}
+
+	listB = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/web_3.png", Path: "/index/"},
+	}
+	resp.ListA = listA
+	resp.ListB = listB
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 提交我要调研内容
+// @Description 提交我要调研内容接口
+// @Param	request	body cygx.CygxBannerIdReq true "type json string"
+// @Success 200 Ret=200 提交成功
+// @router /add/yxSurvey [post]
+func (this *BannerController) YxSurvey() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxBannerYxSurveyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	content := req.Content
+	if content == "" {
+		br.Msg = "内容不能为空"
+		br.ErrMsg = "内容不能为空"
+		return
+	}
+	item := new(models.CygxBannerYxSurvey)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.Content = content
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	newId, err := models.AddCygxBannerYxSurvey(item)
+	if err != nil {
+		br.Msg = "申请失败"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	go services.SendCygxBannerYxSurveyTemplateMsg(user, content, int(newId))
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}

+ 131 - 0
controllers/collection.go

@@ -0,0 +1,131 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/services"
+	"hongze/hongze_clpt/utils"
+	"time"
+)
+
+// Collection
+type CollectionController struct {
+	BaseAuthController
+}
+
+type BaseCollectionController struct {
+	BaseCommonController
+}
+
+// @Title 精选看板、路演banner列表
+// @Description 精选看板、路演banner列表接口
+// @Success Ret=200 {object} cygx.CollectionBannerListResp
+// @router /banner/list [get]
+func (this *BaseCollectionController) BannerList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	resp := new(models.CollectionBannerListResp)
+	var listA []*models.CollectionBannerResp
+	listB := new(models.CollectionBannerResp)
+	listA = []*models.CollectionBannerResp{
+		&models.CollectionBannerResp{Title: "策略系列培训视频", IndexImg: "https://hzstatic.hzinsights.com/cygx/banner/web/lyhf.png", Path: "https://web.hzinsights.com/internal/article/43"},
+	}
+	listB.Title = "专题看板"
+	listB.IndexImg = "https://hzstatic.hzinsights.com/cygx/banner/web/jxkb.png"
+	listB.IsShowSustainable = true
+	resp.ListA = listA
+	resp.ListB = listB
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 精选看板跳转详情地址
+// @Description 精选看板跳转详情地址接口
+// @Success Ret=200 {object} cygx.CollectionBannerListResp
+// @router /detail [get]
+func (this *CollectionController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(models.CollectionDetailResp)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 提交精选看板申请接口
+// @Description 提交精选看板申请接口
+// @Param	request	body cygx.CygxBannerIdReq true "type json string"
+// @Success 200 Ret=200 提交成功
+// @router /apply/add [post]
+func (this *CollectionController) ApplyAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.ApplyCollectionReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	content := req.Content
+	if content == "" {
+		br.Msg = "内容不能为空"
+		br.ErrMsg = "内容不能为空"
+		return
+	}
+	item := new(models.CygxApplyCollection)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.Content = content
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	newId, err := models.AddCygxApplyCollection(item)
+	go services.SendCygxApplyCollectionTemplateMsg(user, content, int(newId))
+	if err != nil {
+		br.Msg = "申请失败"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}

+ 255 - 240
controllers/home.go

@@ -1,7 +1,6 @@
 package controllers
 
 import (
-	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/services"
@@ -227,6 +226,7 @@ func (this *MobileHomeController) List() {
 					Abstract:    v.Abstract,
 					ImgUrlPc:    v.ImgUrlPc,
 					PublishDate: v.PublishDate,
+					IsResearch:  v.IsResearch,
 				})
 			}
 		}
@@ -282,212 +282,224 @@ func (this *MobileHomeController) NewList() {
 	var conditionInit string
 	var pars []interface{}
 	var total int
+	var err error
 	resp := new(models.HomeResourceDataListNewResp)
 
-	var articleTypes, activityTypes, industries, subjectNames string
-	articleTypeCondSlice := make([]string,0)
-	activityTypesCondSlice := make([]string,0)
-	industriesCondSlice := make([]string,0)
-	subjectNamesSlice := make([]string,0)
-	articleTypeSlice := make([]string,0)
-	if tagIds != "" {
-		tags := strings.Split(tagIds, ",")
-		for _, tagIdStr := range tags {
-			tagId, err := strconv.Atoi(tagIdStr)
-			if err != nil {
-				br.Msg = "转换失败"
-				br.ErrMsg = "tagid转换失败,Err:" + err.Error()
-				return
-			}
-			tagInfo, err := models.GetCygxTagByTagId(tagId)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "GetCygxTagByTagId,Err:" + err.Error()
-				return
-			}
-			// 只有AB或CD的情况
-			if (tagInfo.ActivityTypes == "" && tagInfo.ArticleTypes == "") || (tagInfo.Industries == "" && tagInfo.SubjectNames == "") {
-				if tagInfo.ActivityTypes != "" {
-					activityTypes += tagInfo.ActivityTypes + ","
-				}
-				if tagInfo.ArticleTypes != "" {
-					articleTypes += tagInfo.ArticleTypes + ","
-				}
-				if tagInfo.Industries != "" {
-					industries += tagInfo.Industries + ","
-				}
-				if tagInfo.SubjectNames != "" {
-					subjectNames += tagInfo.SubjectNames + ","
-				}
-			} else {
-				// ABCD都有的情况
-				// 每一个tag都单独处理
-				var articleType, activityType, industry, subjectName string
-
-				if tagInfo.ActivityTypes != "" {
-					activityType = tagInfo.ActivityTypes
-				}
-				if tagInfo.ArticleTypes != "" {
-					articleType = tagInfo.ArticleTypes
-				}
-				if tagInfo.Industries != "" {
-					industry = tagInfo.Industries
-				}
-				if tagInfo.SubjectNames != "" {
-					subjectName = tagInfo.SubjectNames
-				}
-				articleTypeCond := ``
-				var articleTypeStr string
-				if articleType != "" {
-					articleTypeSlice := strings.Split(articleType, ",")
-					newArticleTypeSlice := make([]string,0)
-					for _, s := range articleTypeSlice {
-						newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
-					}
-					articleTypeStr = strings.Join(newArticleTypeSlice, ",")
-					articleTypeStr = strings.TrimRight(articleTypeStr,",")
-					articleTypeCond += ` AND (art.sub_category_name In (`+ articleTypeStr +`) OR (art.article_type_name In (`+ articleTypeStr +`) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
-				}
-				activityTypesCond := ``
-				if activityType != "" {
-					activityTypeSlice := strings.Split(activityType, ",")
-					newActivityTypeSlice := make([]string,0)
-					for _, s := range activityTypeSlice {
-						newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
-					}
-					activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-					activityTypeStr = strings.TrimRight(activityTypeStr,",")
-					activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
-				}
-				industriesCond := ``
-				var industryStr string
-				if industry != "" {
-					industrieSlice := strings.Split(industry, ",")
-					newIndustrieSlice := make([]string,0)
-					for _, s := range industrieSlice {
-						newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
-					}
-					industryStr = strings.Join(newIndustrieSlice, ",")
-					industryStr = strings.TrimRight(industryStr, ",")
-					industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
-				}
-				subjectNamesCond := ``
-				var subjectNameStr string
-				if subjectName != "" {
-					subjectNameSlice := strings.Split(subjectName, ",")
-					newSubjectNameSlice := make([]string,0)
-					for _, s := range subjectNameSlice {
-						newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
-					}
-					subjectNameStr = strings.Join(newSubjectNameSlice, ",")
-					subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-					subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
-				}
-				articleTypeCondSlice = append(articleTypeCondSlice, articleTypeCond)
-				activityTypesCondSlice = append(activityTypesCondSlice, activityTypesCond)
-				industriesCondSlice = append(industriesCondSlice, industryStr)
-				subjectNamesSlice = append(subjectNamesSlice, subjectNameStr)
-				articleTypeSlice = append(articleTypeSlice, articleType)
-			}
-
-		}
-	}
-
-	// 先拿abdc都有的tag取合集的ids。。。
-	soloTagArticleIds, soloTagActivityIds, soloMmIds, err := models.GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
-		return
-	}
-
-	articleTypes = strings.TrimRight(articleTypes,",")
-	activityTypes = strings.TrimRight(activityTypes,",")
-	industries = strings.TrimRight(industries,",")
-	subjectNames = strings.TrimRight(subjectNames,",")
-
-	articleTypesCond := ``
-	var articleTypeStr string
-	if articleTypes != "" {
-		articleTypeSlice := strings.Split(articleTypes, ",")
-		newArticleTypeSlice := make([]string,0)
-		for _, s := range articleTypeSlice {
-			newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
-		}
-		articleTypeStr = strings.Join(newArticleTypeSlice, ",")
-		articleTypeStr = strings.TrimRight(articleTypeStr,",")
-		articleTypesCond += ` AND (art.sub_category_name In (`+ articleTypeStr +`) OR (art.article_type_name In (`+ articleTypeStr +`) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
-	}
-	activityTypesCond := ``
-	if activityTypes != "" {
-		activityTypeSlice := strings.Split(activityTypes, ",")
-		newActivityTypeSlice := make([]string,0)
-		for _, s := range activityTypeSlice {
-			newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
-		}
-		activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-		activityTypeStr = strings.TrimRight(activityTypeStr,",")
-		activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
-	}
-	industriesCond := ``
-	var industryStr string
-	if industries != "" {
-		industrieSlice := strings.Split(industries, ",")
-		newIndustrieSlice := make([]string,0)
-		for _, s := range industrieSlice {
-			newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
-		}
-		industryStr = strings.Join(newIndustrieSlice, ",")
-		industryStr = strings.TrimRight(industryStr, ",")
-		industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
-	}
-	subjectNamesCond := ``
-	var subjectNameStr string
-	if subjectNames != "" {
-		subjectNameSlice := strings.Split(subjectNames, ",")
-		newSubjectNameSlice := make([]string,0)
-		for _, s := range subjectNameSlice {
-			newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
-		}
-		subjectNameStr = strings.Join(newSubjectNameSlice, ",")
-		subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-		subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
-	}
+	//var articleTypes, activityTypes, industries, subjectNames string
+	//articleTypeCondSlice := make([]string, 0)
+	//activityTypesCondSlice := make([]string, 0)
+	//industriesCondSlice := make([]string, 0)
+	//subjectNamesSlice := make([]string, 0)
+	//articleTypeSlice := make([]string, 0)
+	//if tagIds != "" {
+	//	tags := strings.Split(tagIds, ",")
+	//	for _, tagIdStr := range tags {
+	//		tagId, err := strconv.Atoi(tagIdStr)
+	//		if err != nil {
+	//			br.Msg = "转换失败"
+	//			br.ErrMsg = "tagid转换失败,Err:" + err.Error()
+	//			return
+	//		}
+	//		tagInfo, err := models.GetCygxTagByTagId(tagId)
+	//		if err != nil && err.Error() != utils.ErrNoRow() {
+	//			br.Msg = "获取失败"
+	//			br.ErrMsg = "GetCygxTagByTagId,Err:" + err.Error()
+	//			return
+	//		}
+	//		// 只有AB或CD的情况
+	//		if (tagInfo.ActivityTypes == "" && tagInfo.ArticleTypes == "") || (tagInfo.Industries == "" && tagInfo.SubjectNames == "") {
+	//			if tagInfo.ActivityTypes != "" {
+	//				activityTypes += tagInfo.ActivityTypes + ","
+	//			}
+	//			if tagInfo.ArticleTypes != "" {
+	//				articleTypes += tagInfo.ArticleTypes + ","
+	//			}
+	//			if tagInfo.Industries != "" {
+	//				industries += tagInfo.Industries + ","
+	//			}
+	//			if tagInfo.SubjectNames != "" {
+	//				subjectNames += tagInfo.SubjectNames + ","
+	//			}
+	//		} else {
+	//			// ABCD都有的情况
+	//			// 每一个tag都单独处理
+	//			var articleType, activityType, industry, subjectName string
+	//
+	//			if tagInfo.ActivityTypes != "" {
+	//				activityType = tagInfo.ActivityTypes
+	//			}
+	//			if tagInfo.ArticleTypes != "" {
+	//				articleType = tagInfo.ArticleTypes
+	//			}
+	//			if tagInfo.Industries != "" {
+	//				industry = tagInfo.Industries
+	//			}
+	//			if tagInfo.SubjectNames != "" {
+	//				subjectName = tagInfo.SubjectNames
+	//			}
+	//			articleTypeCond := ``
+	//			var articleTypeStr string
+	//			if articleType != "" {
+	//				articleTypeSlice := strings.Split(articleType, ",")
+	//				newArticleTypeSlice := make([]string, 0)
+	//				for _, s := range articleTypeSlice {
+	//					newArticleTypeSlice = append(newArticleTypeSlice, "'"+s+"'")
+	//				}
+	//				articleTypeStr = strings.Join(newArticleTypeSlice, ",")
+	//				articleTypeStr = strings.TrimRight(articleTypeStr, ",")
+	//				articleTypeCond += ` AND (art.sub_category_name In (` + articleTypeStr + `) OR (art.article_type_name In (` + articleTypeStr + `) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
+	//			}
+	//			activityTypesCond := ``
+	//			if activityType != "" {
+	//				activityTypeSlice := strings.Split(activityType, ",")
+	//				newActivityTypeSlice := make([]string, 0)
+	//				for _, s := range activityTypeSlice {
+	//					newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
+	//				}
+	//				activityTypeStr := strings.Join(newActivityTypeSlice, ",")
+	//				activityTypeStr = strings.TrimRight(activityTypeStr, ",")
+	//				activityTypesCond += ` AND act.activity_type_name In (` + activityTypeStr + `) `
+	//			}
+	//			industriesCond := ``
+	//			var industryStr string
+	//			if industry != "" {
+	//				industrieSlice := strings.Split(industry, ",")
+	//				newIndustrieSlice := make([]string, 0)
+	//				for _, s := range industrieSlice {
+	//					newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
+	//				}
+	//				industryStr = strings.Join(newIndustrieSlice, ",")
+	//				industryStr = strings.TrimRight(industryStr, ",")
+	//				industriesCond += ` AND im.industry_name In (` + industryStr + `) `
+	//			}
+	//			subjectNamesCond := ``
+	//			var subjectNameStr string
+	//			if subjectName != "" {
+	//				subjectNameSlice := strings.Split(subjectName, ",")
+	//				newSubjectNameSlice := make([]string, 0)
+	//				for _, s := range subjectNameSlice {
+	//					newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
+	//				}
+	//				subjectNameStr = strings.Join(newSubjectNameSlice, ",")
+	//				subjectNameStr = strings.TrimRight(subjectNameStr, ",")
+	//				subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
+	//			}
+	//			articleTypeCondSlice = append(articleTypeCondSlice, articleTypeCond)
+	//			activityTypesCondSlice = append(activityTypesCondSlice, activityTypesCond)
+	//			industriesCondSlice = append(industriesCondSlice, industryStr)
+	//			subjectNamesSlice = append(subjectNamesSlice, subjectNameStr)
+	//			articleTypeSlice = append(articleTypeSlice, articleType)
+	//		}
+	//
+	//	}
+	//}
+	//
+	//// 先拿abdc都有的tag取合集的ids。。。
+	//soloTagArticleIds, soloTagActivityIds, soloMmIds, err := models.GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
+	//	return
+	//}
+	//
+	//articleTypes = strings.TrimRight(articleTypes, ",")
+	//activityTypes = strings.TrimRight(activityTypes, ",")
+	//industries = strings.TrimRight(industries, ",")
+	//subjectNames = strings.TrimRight(subjectNames, ",")
+	//
+	//articleTypesCond := ``
+	//var articleTypeStr string
+	//if articleTypes != "" {
+	//	articleTypeSlice := strings.Split(articleTypes, ",")
+	//	newArticleTypeSlice := make([]string, 0)
+	//	for _, s := range articleTypeSlice {
+	//		newArticleTypeSlice = append(newArticleTypeSlice, "'"+s+"'")
+	//	}
+	//	articleTypeStr = strings.Join(newArticleTypeSlice, ",")
+	//	articleTypeStr = strings.TrimRight(articleTypeStr, ",")
+	//	articleTypesCond += ` AND (art.sub_category_name In (` + articleTypeStr + `) OR (art.article_type_name In (` + articleTypeStr + `) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
+	//}
+	//activityTypesCond := ``
+	//if activityTypes != "" {
+	//	activityTypeSlice := strings.Split(activityTypes, ",")
+	//	newActivityTypeSlice := make([]string, 0)
+	//	for _, s := range activityTypeSlice {
+	//		newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
+	//	}
+	//	activityTypeStr := strings.Join(newActivityTypeSlice, ",")
+	//	activityTypeStr = strings.TrimRight(activityTypeStr, ",")
+	//	activityTypesCond += ` AND act.activity_type_name In (` + activityTypeStr + `) `
+	//}
+	//industriesCond := ``
+	//var industryStr string
+	//if industries != "" {
+	//	industrieSlice := strings.Split(industries, ",")
+	//	newIndustrieSlice := make([]string, 0)
+	//	for _, s := range industrieSlice {
+	//		newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
+	//	}
+	//	industryStr = strings.Join(newIndustrieSlice, ",")
+	//	industryStr = strings.TrimRight(industryStr, ",")
+	//	industriesCond += ` AND im.industry_name In (` + industryStr + `) `
+	//}
+	//subjectNamesCond := ``
+	//var subjectNameStr string
+	//if subjectNames != "" {
+	//	subjectNameSlice := strings.Split(subjectNames, ",")
+	//	newSubjectNameSlice := make([]string, 0)
+	//	for _, s := range subjectNameSlice {
+	//		newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
+	//	}
+	//	subjectNameStr = strings.Join(newSubjectNameSlice, ",")
+	//	subjectNameStr = strings.TrimRight(subjectNameStr, ",")
+	//	subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
+	//}
+	//
+	//var tagArticleIds, tagActivityIds, mmIds string
+	//if articleTypesCond != "" || activityTypesCond != "" || industryStr != "" || subjectNameStr != "" {
+	//	tagArticleIds, tagActivityIds, mmIds, err = models.GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, industryStr, subjectNameStr, articleTypeStr)
+	//	if err != nil && err.Error() != utils.ErrNoRow() {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = "获取单个标签ids失败,Err:" + err.Error()
+	//		return
+	//	}
+	//}
+	//
+	//if soloTagArticleIds != "" {
+	//	if tagArticleIds != "" {
+	//		tagArticleIds += "," + soloTagArticleIds
+	//	} else {
+	//		tagArticleIds = soloTagArticleIds
+	//	}
+	//}
+	//if soloTagActivityIds != "" {
+	//	if tagActivityIds != "" {
+	//		tagActivityIds += "," + soloTagActivityIds
+	//	} else {
+	//		tagActivityIds = soloTagActivityIds
+	//	}
+	//}
+	//if soloMmIds != "" {
+	//	if mmIds != "" {
+	//		mmIds += "," + soloMmIds
+	//	} else {
+	//		mmIds = soloMmIds
+	//	}
+	//}
 
-	var tagArticleIds,tagActivityIds, mmIds string
-	if articleTypesCond != "" || activityTypesCond != "" || industryStr != "" || subjectNameStr != ""{
-		tagArticleIds, tagActivityIds, mmIds, err = models.GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, industryStr, subjectNameStr, articleTypeStr)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+	if tagIds != "" {
+		conditionTagIdsInit, err := services.GetConditionInitByTagIds(tagIds)
+		if err != nil {
 			br.Msg = "获取失败"
-			br.ErrMsg = "获取单个标签ids失败,Err:" + err.Error()
+			br.ErrMsg = "获取活动权限数据失败,GetConditionInitByTagIds Err:" + err.Error()
 			return
 		}
+		conditionInit += conditionTagIdsInit
+	} else {
+		//查询近一个月的数据
+		conditionInit = " AND publish_date  >   '" + time.Now().AddDate(0, 0, -30).Format(utils.FormatDateTime) + "'"
 	}
-
-	if soloTagArticleIds != "" {
-		if tagArticleIds != "" {
-			tagArticleIds += "," + soloTagArticleIds
-		} else {
-			tagArticleIds = soloTagArticleIds
-		}
-	}
-	if soloTagActivityIds != "" {
-		if tagActivityIds != "" {
-			tagActivityIds += "," + soloTagActivityIds
-		} else {
-			tagActivityIds = soloTagActivityIds
-		}
-	}
-	if soloMmIds != "" {
-		if mmIds != "" {
-			mmIds += "," + soloMmIds
-		} else {
-			mmIds = soloMmIds
-		}
-	}
-
-	//查询近一个月的数据
-	conditionInit = " AND publish_date  >   '" + time.Now().AddDate(0, 0, -30).Format(utils.FormatDateTime) + "'"
+	//return
 	//conditionInit += `  AND source IN ('newchart')`
 	if user.CompanyId <= 1 {
 		condition += " AND source IN ('roadshow','article') "
@@ -495,13 +507,14 @@ func (this *MobileHomeController) NewList() {
 		pageSize = utils.PageSize5
 	} else {
 		condition += ` AND source NOT IN ('activity','activityspecial','newchart') ` + conditionInit
-		conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "1,2,3", "", 0, 0, "", 0, 1)
+		//conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "1,2,3", "", 0, 0, "", 0, 1)
+		conditionActivity, err := services.ActivityConditioninitSql(user, "", 0)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 			return
 		}
-		conditionActivity += ` AND art.is_limit_people = 1 AND art.publish_status = 1 `
+		conditionActivity += `  AND art.publish_status = 1 `
 		var conditionOrder string
 		conditionOrder = ` ORDER BY art.activity_time DESC ,  art.active_state ASC   `
 		conditionActivity += conditionOrder
@@ -522,7 +535,6 @@ func (this *MobileHomeController) NewList() {
 		}
 		lenActivityIds := len(activityIds)
 
-
 		listActivitySpecial, _, err := services.GetActivitySpecialList(user, 1, 200, "", "", "")
 		if err != nil {
 			br.Msg = "获取失败"
@@ -536,57 +548,57 @@ func (this *MobileHomeController) NewList() {
 		}
 		lenActivityspecialIds := len(activityspecialIds)
 
-
-		if tagIds != "" {
-			if tagArticleIds != "" {
-				condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
-				if mmIds != "" {
-					condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
-				}
-				if tagActivityIds != "" && lenActivityIds > 0 {
-					condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) )) `
-					pars = append(pars, activityIds)
-				} else {
-					// 无可见活动
-					condition += ` OR (source = 'activity' AND source_id IN (0))) `
-				}
-			} else if tagActivityIds != "" {
-				condition = ` AND ((source = 'article' AND source_id IN (0))  `
-				if mmIds != "" {
-					condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
-				}
-				if tagActivityIds != "" && lenActivityIds > 0 {
-					condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `))) `
-					pars = append(pars, activityIds)
-				} else {
-					// 无可见活动
-					condition += ` OR (source = 'activity' AND source_id IN (0))) `
-				}
-			} else if mmIds != "" {
-				condition = ` AND ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
-			} else {
-				condition += ` AND ((source = 'article' AND source_id IN (0)) OR (source = 'activity' AND source_id IN (0))) `
-			}
-		}
-
-		if lenActivityIds > 0 && tagIds == "" {
+		//if tagIds != "" {
+		//	if tagArticleIds != "" {
+		//		condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
+		//		if mmIds != "" {
+		//			condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+		//		}
+		//		if tagActivityIds != "" && lenActivityIds > 0 {
+		//			condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) )) `
+		//			pars = append(pars, activityIds)
+		//		} else {
+		//			// 无可见活动
+		//			condition += ` OR (source = 'activity' AND source_id IN (0))) `
+		//		}
+		//	} else if tagActivityIds != "" {
+		//		condition = ` AND ((source = 'article' AND source_id IN (0))  `
+		//		if mmIds != "" {
+		//			condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+		//		}
+		//		if tagActivityIds != "" && lenActivityIds > 0 {
+		//			condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `))) `
+		//			pars = append(pars, activityIds)
+		//		} else {
+		//			// 无可见活动
+		//			condition += ` OR (source = 'activity' AND source_id IN (0))) `
+		//		}
+		//	} else if mmIds != "" {
+		//		condition = ` AND ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+		//	} else {
+		//		condition += ` AND ((source = 'article' AND source_id IN (0)) OR (source = 'activity' AND source_id IN (0))) `
+		//	}
+		//}
+
+		//if lenActivityIds > 0 && tagIds == "" {
+		if lenActivityIds > 0 {
 			condition += ` OR ( source = 'activity' AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) ` + conditionInit + ` )    `
 			pars = append(pars, activityIds)
 		}
 
-		if lenActivityspecialIds > 0  && tagIds == "" {
+		if lenActivityspecialIds > 0 {
 			condition += ` OR ( source = 'activityspecial' AND source_id IN (` + utils.GetOrmInReplace(lenActivityspecialIds) + `) ` + conditionInit + ` )   `
 			pars = append(pars, activityspecialIds)
 		}
 	}
-	fmt.Println("condition:",condition)
+	//return
 	total, err = models.GetResourceDataCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
 		return
 	}
-
+	//return
 	if user.CompanyId <= 1 {
 		total = utils.PageSize5
 	}
@@ -599,6 +611,9 @@ func (this *MobileHomeController) NewList() {
 		br.ErrMsg = "获取数据列表失败,Err:" + err.Error()
 		return
 	}
+	if len(list) == 0 {
+		list = make([]*models.CygxResourceDataNewResp, 0)
+	}
 	page = paging.GetPaging(currentIndex, pageSize, total)
 	resp.Paging = page
 	resp.List = list

+ 12 - 64
controllers/report.go

@@ -541,52 +541,6 @@ func (this *MobileReportController) List() {
 			imgUrlChart = vslice[len(vslice)-1]
 			mapCategoryUrl[categoryIdStr] = imgUrlChart
 		}
-		//if detail.CeLueFieldId != "" {
-		//	condition = ` AND ce_lue_field_id IN(` + detail.CeLueFieldId + `)`
-		//} else if detail.PolymerizationId != "" {
-		//	condition = ` AND category_id IN(` + detail.PolymerizationId + `)`
-		//} else {
-		//	categoryIdSet, errCategory := models.GetdetailByCategoryIdSet(categoryId)
-		//	if errCategory != nil {
-		//		br.Msg = "获取信息失败"
-		//		br.ErrMsg = "获取信息失败,Err:" + errCategory.Error() + "categoryID 不存在:" + strconv.Itoa(categoryId)
-		//		return
-		//	}
-		//	if categoryIdSet != "" {
-		//		condition = ` AND category_id IN(` + categoryIdSet + `)`
-		//	} else {
-		//		condition = ` AND category_id IN(` + strconv.Itoa(categoryId) + `)`
-		//	}
-		//}
-		//
-		//if industrialManagementId > 0 {
-		//	industrialManageentList, err := models.GetIndustrialArticleGroupManagementByIndustrialManagementId(industrialManagementId)
-		//	if err != nil {
-		//		br.Msg = "获取信息失败"
-		//		br.Msg = "获取产业关联的文章ID失败,GetIndustrialArticleGroupManagementByIndustrialManagementIdErr:" + err.Error()
-		//		return
-		//	}
-		//	articleIdList := make([]string, 0)
-		//	for _, v := range industrialManageentList {
-		//		articleIdList = append(articleIdList, strconv.Itoa(v.ArticleId))
-		//	}
-		//	condition += ` AND a.article_id IN (  ` + utils.GetOrmInReplace(len(articleIdList)) + ` )  `
-		//	pars = append(pars, articleIdList)
-		//}
-
-		//total, err = models.GetHomeCount(condition, pars)
-		//if err != nil {
-		//	br.Msg = "获取信息失败"
-		//	br.Msg = "获取帖子总数失败,Err:" + err.Error()
-		//	return
-		//}
-		//
-		//list, err = models.GetHomeListNew(condition, pars, startSize, pageSize)
-		//if err != nil {
-		//	br.Msg = "获取信息失败"
-		//	br.Msg = "获取帖子数据失败,Err:" + err.Error()
-		//	return
-		//}
 
 		list, total, err = models.GetReportAndproductInteriorIndustrialList(pars, categoryId, industrialManagementId, uid, startSize, pageSize)
 		if err != nil {
@@ -607,16 +561,6 @@ func (this *MobileReportController) List() {
 				list[k].IsRed = true
 			}
 		}
-		//if categoryId > 0 {
-		//	detail, errCategory := models.GetdetailByCategoryId(categoryId)
-		//	if errCategory != nil {
-		//		br.Msg = "获取信息失败"
-		//		br.ErrMsg = "获取信息失败,Err:" + errCategory.Error() + "categoryID 不存在:" + strconv.Itoa(categoryId)
-		//		return
-		//	}
-		//	resp.MatchTypeName = detail.MatchTypeName
-		//}
-		//resp.CategoryImgUrlPc = mapChartPermission[detail.ChartPermissionName]
 	}
 
 	listPublic, err := services.HandleArticleCategoryImg(list, user)
@@ -707,15 +651,17 @@ func (this *ReportController) IndustrialFllow() {
 		return
 	}
 	resp := new(models.CygxIndustryFllowResp)
+	item := new(models.CygxIndustryFllow)
+	item.IndustrialManagementId = industrialManagementId
+	item.UserId = uid
+	item.Email = user.Email
+	item.Mobile = user.Mobile
+	item.RealName = user.RealName
+	item.Source = utils.REGISTER_PLATFORM
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+
 	if count == 0 {
-		item := new(models.CygxIndustryFllow)
-		item.IndustrialManagementId = industrialManagementId
-		item.UserId = uid
-		item.Email = user.Email
-		item.Mobile = user.Mobile
-		item.RealName = user.RealName
-		item.CompanyId = user.CompanyId
-		item.CompanyName = user.CompanyName
 		item.Type = 1
 		item.CreateTime = time.Now()
 		item.ModifyTime = time.Now()
@@ -728,6 +674,7 @@ func (this *ReportController) IndustrialFllow() {
 		resp.Status = 1
 		br.Msg = "关注成功"
 	} else {
+		item.Type = 2
 		err = models.RemoveCygxIndustryFllow(uid, industrialManagementId)
 		if err != nil {
 			br.Msg = "操作失败"
@@ -740,6 +687,7 @@ func (this *ReportController) IndustrialFllow() {
 	//处理是否关注全部赛道字段
 	go services.IndustryFllowWithTrack(industrialManagementId, count, uid)
 	go services.IndustryFllowUserLabelLogAdd(industrialManagementId, count, uid) //处理用户标签
+	go services.AddCygxIndustryFllowLog(item)                                    //添加操作日志记录
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp

+ 89 - 1
controllers/report_selection.go

@@ -131,8 +131,14 @@ func (this *ReportSelectionController) Detail() {
 						br.ErrMsg = "获取信息失败,Err:" + err.Error()
 						return
 					}
-					listSonLog[k2].OverviewArticleId = articleStockMap[v2.SubjectName]
+					//后台如果勾了隐藏那么这里就不展示  V11.3  2023-08-17
+					if listSonLog[k2].IsShowOverviewArticle == 1 {
+						listSonLog[k2].OverviewArticleId = articleStockMap[v2.SubjectName]
+					} else {
+						listSonLog[k2].OverviewArticleId = 0
+					}
 					listSonLog[k2].List = listIndustrial
+					//listSonLog[k2].IsShowApplyButton = true
 					if v2.Label != "" {
 						CompanyLabelSlice := strings.Split(v2.Label, "{|}")
 						for _, vCompanyLabel := range CompanyLabelSlice {
@@ -310,3 +316,85 @@ func (this *ReportSelectionController) AddStopTime() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// @Title 报告精选申请路演
+// @Description 报告精选申请路演
+// @Param	request	body cygx.CygxBannerIdReq true "type json string"
+// @Success 200 Ret=200 提交成功
+// @router /report_selection_log/apply [post]
+func (this *ReportSelectionController) ReportSelectionLogApply() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxReportSelectionLogApplyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	articleId := req.ArticleId
+	subjectName := req.SubjectName
+
+	var condition string
+	var pars []interface{}
+	condition += ` AND  article_id = ? AND subject_name = ? AND user_id = ?  `
+	pars = append(pars, articleId, subjectName, user.UserId)
+	totalApply, err := models.GetCygxReportSelectionLogApplyCount(condition, pars)
+	if err != nil {
+		br.Msg = "申请失败!"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	if totalApply > 0 {
+		br.Msg = "您已提交过此公司的路演申请,请等待销售与您联系!"
+		return
+	}
+
+	logDetail, err := models.GetCygxReportSelectionLogDetail(articleId, subjectName)
+	if err != nil {
+		br.Msg = "申请失败!"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+
+	item := new(models.CygxReportSelectionLogApply)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.ArticleId = logDetail.ArticleId
+	item.SubjectName = logDetail.SubjectName
+	item.IndustrialSubjectId = logDetail.IndustrialSubjectId
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	_, err = models.AddCygxReportSelectionLogApply(item)
+	if err != nil {
+		br.Msg = "申请失败"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	go services.SendCygxReportSelectionLogApplyTemplateMsg(user, logDetail.SubjectName)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}

+ 8 - 0
controllers/search.go

@@ -170,6 +170,7 @@ func (this *MobileSearchController) ListHomeArtAndChart() {
 	resp.ChartList = chartList
 	var result []*models.SearchItem
 	var total int64
+	var articleIds []int
 	if listType == 1 || listType == 2 {
 		//if orderColumn == "PublishDate" {
 		//	tmpResult, tmpTotal, tmpErr := services.EsMultiMatchFunctionScoreQueryTimeSort(indexName, keyWord, startSize, 100, user.UserId)
@@ -246,8 +247,10 @@ func (this *MobileSearchController) ListHomeArtAndChart() {
 				result[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
 			}
 			result[k].Source = 1
+			articleIds = append(articleIds, v.ArticleId)
 		}
 	}
+
 	//ListType   query   int  true       "列表类型,1最新/全部,2 纪要 ,3图表 默认1"
 	//记录用户搜索关键词
 	//var source int
@@ -270,6 +273,11 @@ func (this *MobileSearchController) ListHomeArtAndChart() {
 	}
 	if len(result) == 0 {
 		result = make([]*models.SearchItem, 0)
+	} else {
+		yxArticleIdMap := services.GetYxArticleIdMap(articleIds)
+		for _, v := range result {
+			v.IsResearch = yxArticleIdMap[v.ArticleId] // 添加是否属于研选的标识
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, int(total))
 	resp.Paging = page

+ 19 - 2
controllers/tag.go

@@ -10,7 +10,6 @@ type TagController struct {
 	BaseAuthController
 }
 
-
 // @Title 获取标签列表-自定义顺序
 // @Description 获取标签列表-自定义顺序接口
 // @Success 200 {object} cygx.ChartPermissionResp
@@ -55,6 +54,24 @@ func (this *TagController) TagCustomizeList() {
 		br.ErrMsg = "获取标签信息失败,Err:" + err.Error()
 		return
 	}
+	for _, v := range list {
+		if v.ArticleTypes != "" {
+			v.Atag = true
+			v.CheckList = append(v.CheckList, "A")
+		}
+		if v.ActivityTypes != "" {
+			v.Btag = true
+			v.CheckList = append(v.CheckList, "B")
+		}
+		if v.Industries != "" {
+			v.Ctag = true
+			v.CheckList = append(v.CheckList, "C")
+		}
+		if v.SubjectNames != "" {
+			v.Dtag = true
+			v.CheckList = append(v.CheckList, "D")
+		}
+	}
 	resp.List = list
 	br.Ret = 200
 	br.Success = true
@@ -97,4 +114,4 @@ func (this *TagController) History() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "记录成功"
-}
+}

+ 41 - 22
controllers/user.go

@@ -290,8 +290,12 @@ func (this *UserController) ApplyTryOut() {
 	uid := user.UserId
 
 	var title string
+	var sourceId int
+	var source string
 	tryType := req.TryType
 	detailId := req.DetailId
+	sourceId = detailId
+	source = tryType
 	var isResearch bool // 是否属于研选
 	if tryType == "Article" {
 		detail, err := models.GetArticleDetailById(detailId)
@@ -301,7 +305,6 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = detail.Title
-		title = detail.Title
 		if detail.ArticleTypeId > 0 {
 			isResearch = true
 		}
@@ -325,6 +328,19 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = microAudio.VoiceName
+		sourceId = microAudio.ActivityId
+		source = "activityvoice"
+	} else if tryType == "ActivityVideo" {
+		// 活动视频
+		activityVideo, e := models.GetCygxActivityVideoById(detailId)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "微路演音频信息有误, 不存在的VoiceId: " + strconv.Itoa(detailId)
+			return
+		}
+		title = activityVideo.Title
+		sourceId = activityVideo.ActivityId
+		source = "activityvideo"
 	} else if tryType == "MicroVideo" {
 		// 微路演视频
 		microVideo, e := models.GetMicroRoadshowVideoById(detailId)
@@ -334,6 +350,7 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = microVideo.VideoName
+		source = "roadshow"
 	} else if tryType == "Researchsummary" {
 		// 本周研究汇总
 		ResearchSummaryInfo, e := models.GetCygxResearchSummaryInfoById(detailId)
@@ -343,6 +360,7 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = ResearchSummaryInfo.Title
+		source = "researchsummary"
 	} else if tryType == "Minutessummary" {
 		// 上周纪要汇总
 		MinutesSummaryInfo, e := models.GetCygxMinutesSummaryInfoById(detailId)
@@ -352,6 +370,7 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = MinutesSummaryInfo.Title
+		source = "minutessummary"
 	} else if tryType == "ReportSelection" {
 		// 报告精选
 		ReportSelectionInfo, e := models.GetCygxReportSelectionInfoById(detailId)
@@ -361,6 +380,7 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = ReportSelectionInfo.Title
+		source = "reportselection"
 	} else if tryType == "ProductInterior" {
 		// 产品内测
 		ProductInteriorDetail, e := models.GetCygxProductInteriorDetail(detailId)
@@ -370,6 +390,7 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = ProductInteriorDetail.Title
+		source = "productinterior"
 	}
 
 	//缓存校验
@@ -579,6 +600,9 @@ func (this *UserController) ApplyTryOut() {
 		//如果是潜在客户就标记来源
 		item.InviteCompanySource = 2
 	}
+	item.Title = title
+	item.SourceId = sourceId
+	item.Source = strings.ToLower(source)
 	item.RegisterPlatform = utils.REGISTER_PLATFORM
 	err = models.AddApplyRecord(item)
 
@@ -903,20 +927,21 @@ func (this *UserController) CollectList() {
 		item := list[i]
 		article := articleMap[item.ArticleId]
 		if list[i].IsSpecial != 1 {
-			list[i].Title = article.Title
-			list[i].DepartmentId = article.DepartmentId
-			list[i].NickName = article.NickName
-			list[i].PublishDate = article.PublishDate
-			if article.ArticleId < utils.SummaryArticleId {
-				list[i].Source = 1
-			} else {
-				list[i].Source = 2
-			}
-			if mapArticleCollectNum[article.ArticleId] != nil {
-				list[i].CollectNum = mapArticleCollectNum[article.ArticleId].CollectNum
-				list[i].Pv = mapArticleCollectNum[article.ArticleId].Pv
-				list[i].IsCollect = mapArticleCollectNum[article.ArticleId].IsCollect
-			}
+		list[i].Title = article.Title
+		list[i].DepartmentId = article.DepartmentId
+		list[i].NickName = article.NickName
+		list[i].PublishDate = article.PublishDate
+		if article.ArticleTypeId == 0 {
+			list[i].Source = 1
+		} else {
+			list[i].Source = 2
+			list[i].IsResearch = true
+		}
+				if mapArticleCollectNum[article.ArticleId] != nil {
+			list[i].CollectNum = mapArticleCollectNum[article.ArticleId].CollectNum
+			list[i].Pv = mapArticleCollectNum[article.ArticleId].Pv
+			list[i].IsCollect = mapArticleCollectNum[article.ArticleId].IsCollect
+		}
 		}
 		if item.ArticleTypeId == -1 {
 			list[i].ArticleTypeName = utils.CYGX_YANXUAN_SPECIAL
@@ -929,13 +954,7 @@ func (this *UserController) CollectList() {
 		if item.MyCollectNum > 0 {
 			list[i].IsCollect = true
 		}
-		//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
+
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp.List = list

+ 104 - 89
models/activity.go

@@ -64,94 +64,96 @@ type CygxActivity struct {
 
 // 活动详情
 type ActivityDetail struct {
-	ActivityId              int                        `orm:"column(activity_id);pk";description:"活动ID "`
-	ActivityTypeId          int                        `description:"活动类型id"`
-	ActivityTypeName        string                     `description:"活动类型名称"`
-	ChartPermissionId       int                        `description:"行业id"`
-	ChartPermissionName     string                     `description:"行业名称"`
-	ChartPermissionNames    string                     `description:"行业名称辅助字段,区分研选子分类"`
-	Body                    string                     `description:"内容"`
-	CreateTime              string                     `description:"创建时间"`
-	IsLimitPeople           int                        `description:"是否限制人数 1是,0否"`
-	LimitPeopleNum          int                        `description:"限制的人数数量"`
-	LastUpdatedTime         string                     `description:"更新时间"`
-	ActivityTime            string                     `description:"活动时间"`
-	ActivityTimeText        string                     `description:"活动时间带文字"`
-	DistinguishedGuest      string                     `description:"嘉宾"`
-	Host                    string                     `description:"主持人"`
-	Speaker                 string                     `description:"主讲人"`
-	MainlandTell            string                     `description:"大陆拨入号"`
-	HongKongTell            string                     `description:"香港拨入号"`
-	TaiwanTell              string                     `description:"台湾拨入号"`
-	AmericaTell             string                     `description:"美国拨入号"`
-	ParticipationCode       string                     `description:"参会密码"`
-	Theme                   string                     `description:"主题"`
-	Expert                  string                     `description:"专家"`
-	ActivityName            string                     `description:"活动名称"`
-	OnlineParticipation     string                     `description:"网络参会"`
-	ReportLink              string                     `description:"报告链接"`
-	City                    string                     `description:"城市"`
-	Address                 string                     `description:"活动地址"`
-	Highlights              string                     `description:"活动亮点"`
-	Remarks                 string                     `description:"备注"`
-	ShowType                string                     `description:"人数限制类型,1不展示限制,2可选限制,3强制限制"`
-	IsSignup                int                        `description:"是否已报名 1是 ,0 否"`
-	IsAppointment           int                        `description:"是否已预约纪要 1是 ,0 否"`
-	SignupNum               int                        `description:"已报名人数"`
-	SignupType              int                        `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
-	ActiveState             string                     `description:"活动进行状态 未开始:1、进行中2、已结束3"`
-	IsCancelMeetingReminder int                        `description:"是否取消会议提醒 1展示取消会议提醒 ,0展示会议提醒"`
-	ArticleId               int                        `description:"报告id(报告链接跳转使用)"`
-	CustomerTypeIds         string                     `description:"活动可见的客户类型,多个ID用 , 隔开"`
-	IsShowSustainable       bool                       `description:"是否展示限免标签"`
-	Description             string                     `description:"研选内容说明"`
-	IsResearch              bool                       `description:"是否属于研选"`
-	LinkParticipants        string                     `description:"链接参会"`
-	AppAttendance           string                     `description:"App参会"`
-	ConferencePassword      string                     `description:"会议密码"`
-	Scale                   string                     `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	IsShowAppointment       bool                       `description:"是否展示预约纪要"`
-	IsHideAppointment       int                        `description:"是否隐藏预约纪要按钮  1是,0 否"`
-	IsCClassMeeting         bool                       `description:"是否是c类电话会"`
-	ArticleList             []*ActivityArticleResp     // 下面是列表添加的部分结构体
-	IsBrackets              int                        `description:"是否有方括号 1是 ,0 否"`
-	Label                   string                     `description:"主题标签"`
-	ImgUrl                  string                     `description:"图片链接"`
-	ImgUrlText              string                     `description:"图片链接文字"`
-	ActivityType            int                        `description:"活动线上线下类型 1线上,0 线下"`
-	JmcjRoadshowTitle       string                     `description:"进门财经手动匹配的活动名称"`
-	Listndustrial           []*IndustrialManagementRep `description:"活动关联的产业信息"`
-	IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
-	IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
-	IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
-	IsShowSignup            bool                       `description:"是否展示我要报名"`
-	IsShowDetails           bool                       `description:"是否展示查看详情按钮"`
-	TemporaryLabel          string                     `description:"临时标签"`
-	IsCanAppointmentMinutes int                        `description:"是否可预约纪要 1是 ,0 否 默认0 "`
-	YidongActivityId        string                     `description:"易董活动ID"`
-	YidongActivityUrl       string                     `description:"易董活动跳转地址"`
-	AudioLink               bool                       `description:"是否展示回放按钮"`
-	VoiceList               *CygxActivityVoiceReq      `description:"音频数据"`
-	AdminId                 int                        `description:"管理员、销售ID "`
-	IsMakerShow             int                        `description:"是否仅决策人可见 0,否 、1,是"`
-	VisibleRange            int                        `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
-	VideoDetail             *CygxActivityVideoListResp `description:"视频数据"`
-	FileType                int                        `description:"类型: 1-音频; 2-视频"`
-	SourceType              int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
-	TripImgLink             string                     `description:"专项产业调研行程链接"`
-	ActivityTimeEnd         string                     `description:"专项产业调研活动预期结束时间"`
-	AuthInfo                *UserPermissionAuthInfo    `description:"用户查看视频的权限"`
-	Days                    int                        `description:"调研天数"`
-	Title                   string                     `description:"标题"`
-	IsYidongConduct         bool                       `description:"是否属于易董办会 1:是 、0:否"`
-	IsCanOutboundCall       int                        `description:"是否提供外呼 1:是 、0:否"`
-	TencentConferenceNumber string                     `description:"腾讯会议号"`
-	IsResearchSpecial       bool                       `description:"是否属于特殊的研选"`
-	IsNeedEmail             int                        `description:"是否需要提供邮箱 1是,0否"`
-	SiginupDeadline         string                     `description:"报名截止时间"`
-	IsExternalLabel         bool                       `description:"是否为外部资源"`
-	IsResearchPoints        bool                       `description:"是否为研选扣点"`
-	CancelDeadline          string                     `description:"取消报名截止时间"`
+	ActivityId                int                        `orm:"column(activity_id);pk";description:"活动ID "`
+	ActivityTypeId            int                        `description:"活动类型id"`
+	ActivityTypeName          string                     `description:"活动类型名称"`
+	ChartPermissionId         int                        `description:"行业id"`
+	ChartPermissionName       string                     `description:"行业名称"`
+	ChartPermissionNames      string                     `description:"行业名称辅助字段,区分研选子分类"`
+	Body                      string                     `description:"内容"`
+	CreateTime                string                     `description:"创建时间"`
+	IsLimitPeople             int                        `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum            int                        `description:"限制的人数数量"`
+	LastUpdatedTime           string                     `description:"更新时间"`
+	ActivityTime              string                     `description:"活动时间"`
+	ActivityTimeText          string                     `description:"活动时间带文字"`
+	DistinguishedGuest        string                     `description:"嘉宾"`
+	Host                      string                     `description:"主持人"`
+	Speaker                   string                     `description:"主讲人"`
+	MainlandTell              string                     `description:"大陆拨入号"`
+	HongKongTell              string                     `description:"香港拨入号"`
+	TaiwanTell                string                     `description:"台湾拨入号"`
+	AmericaTell               string                     `description:"美国拨入号"`
+	ParticipationCode         string                     `description:"参会密码"`
+	Theme                     string                     `description:"主题"`
+	Expert                    string                     `description:"专家"`
+	ActivityName              string                     `description:"活动名称"`
+	OnlineParticipation       string                     `description:"网络参会"`
+	ReportLink                string                     `description:"报告链接"`
+	City                      string                     `description:"城市"`
+	Address                   string                     `description:"活动地址"`
+	Highlights                string                     `description:"活动亮点"`
+	Remarks                   string                     `description:"备注"`
+	ShowType                  string                     `description:"人数限制类型,1不展示限制,2可选限制,3强制限制"`
+	IsSignup                  int                        `description:"是否已报名 1是 ,0 否"`
+	IsAppointment             int                        `description:"是否已预约纪要 1是 ,0 否"`
+	SignupNum                 int                        `description:"已报名人数"`
+	SignupType                int                        `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
+	ActiveState               string                     `description:"活动进行状态 未开始:1、进行中2、已结束3"`
+	IsCancelMeetingReminder   int                        `description:"是否取消会议提醒 1展示取消会议提醒 ,0展示会议提醒"`
+	ArticleId                 int                        `description:"报告id(报告链接跳转使用)"`
+	CustomerTypeIds           string                     `description:"活动可见的客户类型,多个ID用 , 隔开"`
+	IsShowSustainable         bool                       `description:"是否展示限免标签"`
+	Description               string                     `description:"研选内容说明"`
+	IsResearch                bool                       `description:"是否属于研选"`
+	LinkParticipants          string                     `description:"链接参会"`
+	AppAttendance             string                     `description:"App参会"`
+	ConferencePassword        string                     `description:"会议密码"`
+	Scale                     string                     `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	IsShowAppointment         bool                       `description:"是否展示预约纪要"`
+	IsHideAppointment         int                        `description:"是否隐藏预约纪要按钮  1是,0 否"`
+	IsCClassMeeting           bool                       `description:"是否是c类电话会"`
+	ArticleList               []*ActivityArticleResp     // 下面是列表添加的部分结构体
+	IsBrackets                int                        `description:"是否有方括号 1是 ,0 否"`
+	Label                     string                     `description:"主题标签"`
+	ImgUrl                    string                     `description:"图片链接"`
+	ImgUrlText                string                     `description:"图片链接文字"`
+	ActivityType              int                        `description:"活动线上线下类型 1线上,0 线下"`
+	JmcjRoadshowTitle         string                     `description:"进门财经手动匹配的活动名称"`
+	Listndustrial             []*IndustrialManagementRep `description:"活动关联的产业信息"`
+	IsShowOutboundCall        bool                       `description:"是否展示预约外呼"`
+	IsShowMeetingReminder     bool                       `description:"是否展示会议提醒"`
+	IsShowHelpSsk             bool                       `description:"是否展示帮我带问"`
+	IsShowSignup              bool                       `description:"是否展示我要报名"`
+	IsShowDetails             bool                       `description:"是否展示查看详情按钮"`
+	TemporaryLabel            string                     `description:"临时标签"`
+	IsCanAppointmentMinutes   int                        `description:"是否可预约纪要 1是 ,0 否 默认0 "`
+	YidongActivityId          string                     `description:"易董活动ID"`
+	IsYidongActivity          bool                       `description:"是否属于易董同步过来的活动"`
+	YidongActivityUrl         string                     `description:"易董活动跳转地址"`
+	AudioLink                 bool                       `description:"是否展示回放按钮"`
+	VoiceList                 *CygxActivityVoiceReq      `description:"音频数据"`
+	AdminId                   int                        `description:"管理员、销售ID "`
+	IsMakerShow               int                        `description:"是否仅决策人可见 0,否 、1,是"`
+	VisibleRange              int                        `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
+	VideoDetail               *CygxActivityVideoListResp `description:"视频数据"`
+	FileType                  int                        `description:"类型: 1-音频; 2-视频"`
+	SourceType                int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
+	TripImgLink               string                     `description:"专项产业调研行程链接"`
+	ActivityTimeEnd           string                     `description:"专项产业调研活动预期结束时间"`
+	AuthInfo                  *UserPermissionAuthInfo    `description:"用户查看视频的权限"`
+	Days                      int                        `description:"调研天数"`
+	Title                     string                     `description:"标题"`
+	IsYidongConduct           bool                       `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall         int                        `description:"是否提供外呼 1:是 、0:否"`
+	TencentConferenceNumber   string                     `description:"腾讯会议号"`
+	IsResearchSpecial         bool                       `description:"是否属于特殊的研选"`
+	IsNeedEmail               int                        `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline           string                     `description:"报名截止时间"`
+	IsExternalLabel           bool                       `description:"是否为外部资源"`
+	IsResearchPoints          bool                       `description:"是否为研选扣点"`
+	CancelDeadline            string                     `description:"取消报名截止时间"`
+	ChartPermissionNameDeputy string                     `description:"副行业名称"`
 }
 
 // 活动详情
@@ -229,6 +231,7 @@ type ActivityListResp struct {
 	IsResearchPoints        bool                       `description:"是否为研选扣点"`
 	SiginupDeadline         string                     `description:"报名截止时间"`
 	CancelDeadline          string                     `description:"取消报名截止时间"`
+	IsYidongActivity        bool                       `description:"是否属于易董同步过来的活动"`
 }
 
 type ActivityCheck struct {
@@ -264,10 +267,20 @@ type CygxActivityResp struct {
 	Detail            *ActivityListResp
 }
 
+type CygxYidongActivityUrlResp struct {
+	HasPermission     int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	PopupMsg          string `description:"权限弹窗信息"`
+	SellerMobile      string `description:"销售电话"`
+	SellerName        string `description:"销售姓名"`
+	IsResearch        bool   `description:"是否属于研选"`
+	IsResearchSpecial bool   `description:"是否属于特殊的研选"`
+	YidongActivityUrl string `description:"易董活动跳转地址"`
+}
+
 // 列表
 func GetCygxActivityList(condition string, pars []interface{}, sortTime string, startSize, pageSize int) (items []*CygxActivity, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	activity_id,city, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id , activity_type_id,is_external_label,is_research_points
+	sql := `SELECT	activity_id,chart_permission_id, city, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id , activity_type_id,is_external_label,is_research_points
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -561,6 +574,7 @@ func GetScheduleAndSpecilList(condition string, pars []interface{}, conditionSpe
 			art.activity_time,
 			0 AS days,
 			art.city AS city,
+			art.is_external_label,
 			art.is_yidong_conduct,
 			art.is_can_outbound_call,
 			art.is_research_points,
@@ -603,6 +617,7 @@ func GetScheduleAndSpecilList(condition string, pars []interface{}, conditionSpe
 			"",
 			"",
 			"",
+			"",
 			art.host 
 		FROM
 			cygx_activity_special AS art

+ 3 - 2
models/activity_type.go

@@ -59,12 +59,13 @@ type CygxActivityLabelList struct {
 	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	City              string `description:"城市"`
 	Days              int    `description:"天数"`
+	IsResearch        bool   `description:"是否属于研选"`
 }
 
 // 列表
-func GetActivityTypeHomeList() (items []*ActivityTypeHome, err error) {
+func GetActivityTypeHomeList(condition string) (items []*ActivityTypeHome, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_activity_type WHERE activity_type_id != 7   ORDER BY sort DESC`
+	sql := `SELECT * FROM cygx_activity_type WHERE activity_type_id != 7 ` + condition + `   ORDER BY sort DESC`
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 8 - 0
models/admin.go

@@ -33,3 +33,11 @@ func GetRaiAdmin() (items []*AdminMobileResp, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 根据角色名称获取手机号
+func GetAdminByRoleName(roleName string) (items []*AdminMobileResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT mobile  FROM admin  WHERE role_name =? ' `
+	_, err = o.Raw(sql, roleName).QueryRows(&items)
+	return
+}

+ 77 - 0
models/apply_collection.go

@@ -0,0 +1,77 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CollectionBannerResp struct {
+	Title             string `description:"标题"`
+	IndexImg          string `description:"小程序封面图"`
+	Path              string `description:"小程序路径"`
+	IsShowSustainable bool   `description:"是否展示限免标签"`
+}
+
+type CollectionBannerListResp struct {
+	ListA []*CollectionBannerResp
+	ListB *CollectionBannerResp
+}
+
+type CollectionDetailResp struct {
+	HttpUrl string `description:"跳转地址"`
+}
+
+type ApplyCollectionReq struct {
+	Content string `description:"内容"`
+}
+
+// 精选看板申请表
+type CygxApplyCollection struct {
+	ApplyCollectionId int       `orm:"column(apply_collection_id);pk" description:"主键ID"`
+	UserId            int       `description:"用户ID"`         // 用户ID
+	Mobile            string    `description:"手机号"`          // 手机号
+	Email             string    `description:"邮箱"`           // 邮箱
+	CompanyId         int       `description:"公司ID"`         // 公司ID
+	CompanyName       string    `description:"公司名称"`         // 公司名称
+	RealName          string    `description:"用户实际名称"`       // 用户实际名称
+	SellerName        string    `description:"所属销售"`         // 所属销售
+	CreateTime        time.Time `description:"创建时间"`         // 创建时间
+	ModifyTime        time.Time `description:"修改时间"`         // 修改时间
+	RegisterPlatform  int       `description:"来源 1小程序,2:网页"` // 来源 1小程序,2:网页
+	Content           string    `description:" 内容"`          // 内容
+}
+
+// 精选看板申请表
+type CygxApplyCollectionResp struct {
+	ApplyCollectionId int       `gorm:"column:"`
+	UserId            int       `gorm:"column:"`                    // 用户ID
+	Mobile            string    `gorm:"column:"`                    // 手机号
+	Email             string    `gorm:"column:"`                    // 邮箱
+	CompanyId         int       `gorm:"column:;default:0"`          // 公司ID
+	CompanyName       string    `gorm:"column:"`                    // 公司名称
+	RealName          string    `gorm:"column:"`                    // 用户实际名称
+	SellerName        string    `gorm:"column:"`                    // 所属销售
+	CreateTime        time.Time `gorm:"column:"`                    // 创建时间
+	ModifyTime        time.Time `gorm:"column:"`                    // 修改时间
+	RegisterPlatform  int       `gorm:"column:;default:1;NOT NULL"` // 来源 1小程序,2:网页
+	Content           string    `gorm:"column:;NOT NULL"`           // 内容
+}
+
+// 添加信息
+func AddCygxApplyCollection(item *CygxApplyCollection) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 通过ID获取详情
+func GetCygxApplyCollectionDetail(applyCollectionId int) (item *CygxApplyCollectionResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_apply_collection  WHERE apply_collection_id=?  `
+	err = o.Raw(sql, applyCollectionId).QueryRow(&item)
+	return
+}
+
+type CygxApplyCollectionDetailResp struct {
+	Detail *CygxApplyCollectionResp
+}

+ 3 - 0
models/apply_record.go

@@ -19,6 +19,9 @@ type CygxApplyRecord struct {
 	ApplyMethod         int       `description:"1:已付费客户申请试用,2:非客户申请试用"`
 	RegisterPlatform    int       `description:"来源 1小程序,2:网页"`
 	InviteCompanySource int       `description:"来源 1小程序,2:网页"`
+	SourceId            int       `description:"资源ID"`
+	Source              string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	Title               string    `description:"标题"`
 }
 
 func AddApplyRecord(item *CygxApplyRecord) (err error) {

+ 33 - 28
models/article.go

@@ -50,34 +50,39 @@ type CygxArticle struct {
 }
 
 type ArticleDetail struct {
-	ArticleId            int             `description:"报告id"`
-	ArticleIdMd5         string          `description:"报告MD5id"`
-	IsReport             int             `description:"是否属于报告,1是,0否"`
-	Title                string          `description:"标题"`
-	CategoryName         string          `description:"一级分类"`
-	CategoryId           int             `description:"分类ID"`
-	CreateDate           string          `description:"创建时间"`
-	PublishDate          string          `description:"发布时间"`
-	Body                 string          `description:"内容"`
-	Abstract             string          `description:"摘要"`
-	Annotation           string          `description:"核心观点"`
-	IsInterviewApply     bool            `description:"是否申请访谈:true,已申请,false:未申请"`
-	InterviewApplyStatus string          `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
-	IsFollow             bool            `description:"是否关注,1是,0否"`
-	FollowNum            int             `description:"关注数量"`
-	IsCollect            bool            `description:"是否收藏:true,已收藏,false:未收藏"`
-	CollectionNum        int             `description:"收藏数量"`
-	DepartmentId         int             `description:"作者ID"`
-	DepartmentImgUrl     string          `description:"作者头像"`
-	NickName             string          `description:"作者昵称"`
-	HttpUrl              string          `description:"文章链接跳转地址"`
-	IsNeedJump           bool            `description:"是否需要跳转链接地址"`
-	Seller               SellerResp      `description:"作者昵称"`
-	DepartmentDetail     *DepartmentResp `description:"作者昵称"`
-	Disclaimers          string          `description:"免责声明"`
-	IsSpecialArticle     bool            `description:"是否属于专项调研报告"`
-	SubCategoryName      string          `description:"二级分类"`
-	ArticleTypeId        int             `description:"文章类型ID"`
+	ArticleId                int             `description:"报告id"`
+	ArticleIdMd5             string          `description:"报告MD5id"`
+	IsReport                 int             `description:"是否属于报告,1是,0否"`
+	Title                    string          `description:"标题"`
+	CategoryName             string          `description:"一级分类"`
+	CategoryId               int             `description:"分类ID"`
+	CreateDate               string          `description:"创建时间"`
+	PublishDate              string          `description:"发布时间"`
+	Body                     string          `description:"内容"`
+	Abstract                 string          `description:"摘要"`
+	Annotation               string          `description:"核心观点"`
+	IsInterviewApply         bool            `description:"是否申请访谈:true,已申请,false:未申请"`
+	InterviewApplyStatus     string          `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
+	IsFollow                 bool            `description:"是否关注,1是,0否"`
+	FollowNum                int             `description:"关注数量"`
+	IsCollect                bool            `description:"是否收藏:true,已收藏,false:未收藏"`
+	CollectionNum            int             `description:"收藏数量"`
+	DepartmentId             int             `description:"作者ID"`
+	DepartmentImgUrl         string          `description:"作者头像"`
+	NickName                 string          `description:"作者昵称"`
+	HttpUrl                  string          `description:"文章链接跳转地址"`
+	IsNeedJump               bool            `description:"是否需要跳转链接地址"`
+	Seller                   SellerResp      `description:"作者昵称"`
+	DepartmentDetail         *DepartmentResp `description:"作者昵称"`
+	Disclaimers              string          `description:"免责声明"`
+	IsSpecialArticle         bool            `description:"是否属于专项调研报告"`
+	SubCategoryName          string          `description:"二级分类"`
+	ArticleTypeId            int             `description:"文章类型ID"`
+	IsApplyAppointmentExpert bool            `description:"是否属于专家访谈"`
+}
+
+type CygxArticleIdReq struct {
+	ArticleId int `description:"文章id"`
 }
 
 type SellerResp struct {

+ 39 - 0
models/article_apply_appointment_expert.go

@@ -0,0 +1,39 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxArticleApplyAppointmentExpert struct {
+	Id               int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
+	ArticleId        int       `gorm:"column:article_id" json:"article_id"`                                  // cygx_article表article_id
+	UserId           int       `gorm:"column:user_id" json:"user_id"`                                        // 用户ID
+	Mobile           string    `gorm:"column:mobile" json:"mobile"`                                          // 手机号
+	Email            string    `gorm:"column:email" json:"email"`                                            // 邮箱
+	CompanyId        int       `gorm:"column:company_id;default:0" json:"company_id"`                        // 公司ID
+	CompanyName      string    `gorm:"column:company_name" json:"company_name"`                              // 公司名称
+	RealName         string    `gorm:"column:real_name" json:"real_name"`                                    // 用户实际名称
+	SellerName       string    `gorm:"column:seller_name" json:"seller_name"`                                // 所属销售
+	CreateTime       time.Time `gorm:"column:create_time" json:"create_time"`                                // 创建时间
+	ModifyTime       time.Time `gorm:"column:modify_time" json:"modify_time"`                                // 修改时间
+	RegisterPlatform int       `gorm:"column:register_platform;default:1;NOT NULL" json:"register_platform"` // 来源 1小程序,2:网页
+}
+
+// 添加历史信息
+func AddCygxArticleApplyAppointmentExpert(item *CygxArticleApplyAppointmentExpert) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 获取数量
+func GetCygxArticleApplyAppointmentExpertCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_apply_appointment_expert WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 2 - 0
models/article_history_record.go

@@ -61,6 +61,7 @@ func GetTopReadRecordArticleListByCondition(limit int, condition string, pars []
 			a.publish_date,
 			a.annotation,
 			a.abstract,
+			a.article_type_id,
 			m.chart_permission_name,
 			a.category_id
 		FROM
@@ -81,6 +82,7 @@ func GetTopReadRecordArticleListByConditionYx(limit int, condition string, pars
 	a.article_id,
 	a.title,
 	a.publish_date,
+	a.article_type_id,
 	'31' AS chart_permission_id,
 	'买方研选' AS permission_name,
 	COUNT( 1 ) AS pv 

+ 10 - 0
models/banner.go

@@ -76,6 +76,16 @@ type BannerUrlResp struct {
 	Body              string `description:"内容"`
 }
 
+type BannerUrlYxResp struct {
+	IndexImg string `description:"小程序封面图"`
+	Path     string `description:"小程序路径"`
+}
+
+type BannerUrlYxListResp struct {
+	ListA []*BannerUrlYxResp
+	ListB []*BannerUrlYxResp
+}
+
 // 列表
 func GetCygxBannerImgList() (items []*CygxBannerImgResp, err error) {
 	o := orm.NewOrm()

+ 74 - 0
models/banner_yx_survey.go

@@ -0,0 +1,74 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//type CygxBannerYxSurvey struct {
+//	SuveryId         int       `gorm:"column:suvery_id;primary_key;AUTO_INCREMENT" json:"suvery_id"`
+//	UserId           int       `gorm:"column:user_id" json:"user_id"`                                        // 用户ID
+//	Mobile           string    `gorm:"column:mobile" json:"mobile"`                                          // 手机号
+//	Email            string    `gorm:"column:email" json:"email"`                                            // 邮箱
+//	CompanyId        int       `gorm:"column:company_id;default:0" json:"company_id"`                        // 公司ID
+//	CompanyName      string    `gorm:"column:company_name" json:"company_name"`                              // 公司名称
+//	RealName         string    `gorm:"column:real_name" json:"real_name"`                                    // 用户实际名称
+//	SellerName       string    `gorm:"column:seller_name" json:"seller_name"`                                // 所属销售
+//	CreateTime       time.Time `gorm:"column:create_time" json:"create_time"`                                // 创建时间
+//	ModifyTime       time.Time `gorm:"column:modify_time" json:"modify_time"`                                // 修改时间
+//	RegisterPlatform int       `gorm:"column:register_platform;default:1;NOT NULL" json:"register_platform"` // 来源 1小程序,2:网页
+//	Content          string    `gorm:"column:content;NOT NULL" json:"content"`                               // 内容
+//}
+
+type CygxBannerYxSurvey struct {
+	SuveryId         int `orm:"column(suvery_id);pk"`
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	Content          string    `description:"内容"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+type CygxBannerYxSurveyReq struct {
+	Content string `description:"内容"`
+}
+
+type CygxBannerYxSurveyResp struct {
+	SuveryId         int    `gorm:"column:suvery_id;primary_key;AUTO_INCREMENT" json:""`
+	UserId           int    `gorm:"column:user_id" json:""`                              // 用户ID
+	Mobile           string `gorm:"column:mobile" json:""`                               // 手机号
+	Email            string `gorm:"column:email" json:""`                                // 邮箱
+	CompanyId        int    `gorm:"column:company_id;default:0" json:""`                 // 公司ID
+	CompanyName      string `gorm:"column:company_name" json:""`                         // 公司名称
+	RealName         string `gorm:"column:real_name" json:""`                            // 用户实际名称
+	SellerName       string `gorm:"column:seller_name" json:""`                          // 所属销售
+	CreateTime       string `gorm:"column:create_time" json:""`                          // 创建时间
+	ModifyTime       string `gorm:"column:modify_time" json:""`                          // 修改时间
+	RegisterPlatform int    `gorm:"column:register_platform;default:1;NOT NULL" json:""` // 来源 1小程序,2:网页
+	Content          string `gorm:"column:content;NOT NULL" json:""`                     // 内容
+}
+
+// 添加信息
+func AddCygxBannerYxSurvey(item *CygxBannerYxSurvey) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 通过ID获取详情
+func GetCygxBannerYxSurveyDetail(suveryId int) (item *CygxBannerYxSurveyResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_banner_yx_survey  WHERE suvery_id=?  `
+	err = o.Raw(sql, suveryId).QueryRow(&item)
+	return
+}
+
+type CygxBannerYxSurveyRespDetailResp struct {
+	Detail *CygxBannerYxSurveyResp
+}

+ 33 - 12
models/cygx_tag.go

@@ -34,20 +34,41 @@ func (m *CygxTag) Update(cols []string) (err error) {
 }
 
 type CygxTagList struct {
-	TagId         int64  `orm:"column(tag_id);pk"`
-	TagName       string `orm:"column(tag_name);NOT NULL"`       // 标签名
-	ArticleTypes  string `orm:"column(article_types);NOT NULL"`  // 报告系列
-	ActivityTypes string `orm:"column(activity_types);NOT NULL"` // 活动类型
-	Industries    string `orm:"column(industries);NOT NULL"`     // 产业
-	SubjectNames  string `orm:"column(subject_names);NOT NULL"`  // 标的
-	Sort          int    `orm:"column(sort);"`                   // 优先级
-	ModifyTime    string `orm:"column(modify_time)"`             // 修改时间
-	CreateTime    string `orm:"column(create_time)"`             // 创建时间
-	OnlineTime    string `orm:"column(online_time)"`             // 上线时间
-	OfflineTime   string `orm:"column(offline_time)"`            // 下线时间
-	Status        int    `orm:"column(status);NOT NULL"`         // 状态:0-禁用 1-启用
+	TagId         int64    `orm:"column(tag_id);pk"`
+	TagName       string   `orm:"column(tag_name);NOT NULL"`       // 标签名
+	ArticleTypes  string   `orm:"column(article_types);NOT NULL"`  // 报告系列
+	ActivityTypes string   `orm:"column(activity_types);NOT NULL"` // 活动类型
+	Industries    string   `orm:"column(industries);NOT NULL"`     // 产业
+	SubjectNames  string   `orm:"column(subject_names);NOT NULL"`  // 标的
+	Sort          int      `orm:"column(sort);"`                   // 优先级
+	ModifyTime    string   `orm:"column(modify_time)"`             // 修改时间
+	CreateTime    string   `orm:"column(create_time)"`             // 创建时间
+	OnlineTime    string   `orm:"column(online_time)"`             // 上线时间
+	OfflineTime   string   `orm:"column(offline_time)"`            // 下线时间
+	Status        int      `orm:"column(status);NOT NULL"`         // 状态:0-禁用 1-启用
+	Atag          bool     // A标签是否有值
+	Btag          bool     // A标签是否有值
+	Ctag          bool     // A标签是否有值
+	Dtag          bool     // A标签是否有值
+	CheckList     []string // ABCD勾选了哪几列
 }
 
+// 列表
+func GetCygxTagListCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxTagList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_tag as a WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+
+	return
+}
 
 // 获取tag列表
 func GetCygxTagList(cond string) (items []*CygxTagList, err error) {

+ 6 - 0
models/db.go

@@ -77,6 +77,12 @@ func init() {
 		new(CygxTagHistory),
 		new(CygxActivitySpecialMeetingDetail),
 		new(CygxActivityVoiceHistory),
+		new(CygxApplyCollection),
+		new(CygxActivitySpecialInheritPointsCompany),
+		new(CygxArticleApplyAppointmentExpert),
+		new(CygxBannerYxSurvey),
+		new(CygxReportSelectionLogApply),
+		new(CygxIndustryFllowLog),
 		new(CygxYanxuanSpecialRecord),
 		new(CygxYanxuanSpecialCollect),
 		new(CygxYanxuanSpecial),

+ 1 - 47
models/industrial_activity_group_management.go

@@ -21,52 +21,6 @@ type CygxIndustrialActivityGroupSubject struct {
 	CreateTime          time.Time `description:"创建时间"`
 }
 
-type CygxIndustrialSubject struct {
-	IndustrialSubjectId    int       `orm:"column(industrial_subject_id);pk" description:"标的id"`
-	IndustrialManagementId int       `description:"产业id"`
-	SubjectName            string    `description:"标的名称"`
-	CreateTime             time.Time `description:"创建时间"`
-	Source                 int       `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
-}
-
-//获取标的列表
-func GetCygxIndustrialSubjectList(subjectName string) (items []*CygxIndustrialSubject, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT
-				s.*
-			FROM
-				cygx_industrial_subject as s 
-				INNER JOIN  cygx_industrial_management as m ON  m.industrial_management_id = s.industrial_management_id
-			WHERE
-				subject_name = ? `
-	_, err = o.Raw(sql, subjectName).QueryRows(&items)
-	return
-}
-
-// AddCygxActiuvityGroupMulti 批量添加
-func AddCygxActiuvityGroupMulti(items []*CygxIndustrialActivityGroupManagement, itemsSubject []*CygxIndustrialActivityGroupSubject) (err error) {
-	o, err := orm.NewOrm().Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err == nil {
-			o.Commit()
-		} else {
-			o.Rollback()
-		}
-	}()
-	if len(items) > 0 {
-		//批量添加关联的产业
-		_, err = o.InsertMulti(len(items), items)
-	}
-	if len(itemsSubject) > 0 {
-		//批量添加关联的标的
-		_, err = o.InsertMulti(len(itemsSubject), itemsSubject)
-	}
-	return
-}
-
 // GetActivityIndustryRelationList 获取活动与产业关联列表
 func GetActivityIndustryRelationList(condition string, pars []interface{}) (list []*CygxIndustrialActivityGroupManagement, err error) {
 	sql := `SELECT
@@ -84,7 +38,7 @@ func GetActivityIndustryRelationList(condition string, pars []interface{}) (list
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialActivityGroupManagementList(activityId int) (items []*IndustrialManagementRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT

+ 19 - 0
models/industrial_subject.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"time"
 )
 
 type IndustrialSubjectByArticle struct {
@@ -17,6 +18,14 @@ type SubjectArticlGroupList struct {
 	IndustrialSubjectId int    `description:"cygx_industrial_subject表的文章ID"`
 }
 
+type CygxIndustrialSubject struct {
+	IndustrialSubjectId    int       `orm:"column(industrial_subject_id);pk" description:"标的id"`
+	IndustrialManagementId int       `description:"产业id"`
+	SubjectName            string    `description:"标的名称"`
+	CreateTime             time.Time `description:"创建时间"`
+	Source                 int       `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
+}
+
 // 获取标的列表
 func GetArticleGroupSubjectList(pars []interface{}, condition string) (items []*IndustrialSubjectByArticle, err error) {
 	o := orm.NewOrm()
@@ -55,3 +64,13 @@ func GetcygxIndustrialSubject(industrialManagementId int) (items []*IndustrialSu
 	_, err = o.Raw(sql, industrialManagementId).QueryRows(&items)
 	return
 }
+
+// GetCygxIndustrialSubjectList 获取标的列表
+func GetCygxIndustrialSubjectListCondition(condition string, pars []interface{}) (items []*CygxIndustrialSubject, err error) {
+	sql := `SELECT * FROM cygx_industrial_subject WHERE 1 = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 28 - 0
models/industry_fllow_log.go

@@ -0,0 +1,28 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxIndustryFllowLog struct {
+	Id                     int       `orm:"column(id);pk"`
+	IndustrialManagementId int       `description:"产业D"`
+	UserId                 int       `description:"用户ID"`
+	Mobile                 string    `description:"手机号"`
+	Email                  string    `description:"邮箱"`
+	CompanyId              int       `description:"公司id"`
+	CompanyName            string    `description:"公司名称"`
+	Type                   int       `description:"操作方式,1报名,2取消报名"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"更新时间"`
+	RealName               string    `description:"用户实际名称"`
+	Source                 int       `description:"来源1查研观向,2查研观向小助手,3勾选全部赛道的用户进行自动关注"`
+}
+
+// 添加
+func AddCygxIndustryFllowLog(item *CygxIndustryFllowLog) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}

+ 12 - 12
models/micro_roadshow.go

@@ -242,9 +242,9 @@ func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string,
 			art.chart_permission_id,
 			art.chart_permission_name,
 			"" AS play_seconds,
-			"" AS background_img,
+			v.background_img,
 			"" AS industry_name,
-			"" AS share_img,
+			v.share_img,
 			0 AS industrial_management_id,
 			v.activity_id
 		FROM
@@ -269,9 +269,9 @@ func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string,
 			b.chart_permission_id,
 			b.chart_permission_name,
 			a.voice_play_seconds AS play_seconds,
-			a.img_url AS background_img,
+			a.background_img,
 			"" AS industry_name,
-			"" AS share_img,
+			a.share_img,
 			0 AS industrial_management_id,
 			a.activity_id 
 		FROM
@@ -341,9 +341,9 @@ func CountMicroRoadShowVideoPageList(condition string, pars []interface{}, condi
 			art.chart_permission_id,
 			art.chart_permission_name,
 			"" AS play_seconds,
-			"" AS background_img,
+			v.background_img,
 			"" AS industry_name,
-			"" AS share_img,
+			v.share_img,
 			v.activity_id
 		FROM
 			cygx_activity_video as v
@@ -362,9 +362,9 @@ func CountMicroRoadShowVideoPageList(condition string, pars []interface{}, condi
 			b.chart_permission_id,
 			b.chart_permission_name,
 			a.voice_play_seconds AS play_seconds,
-			a.img_url AS background_img,
+			a.background_img,
 			"" AS industry_name,
-			"" AS share_img,
+			a.share_img,
 			a.activity_id 
 		FROM
 			cygx_activity_voice AS a
@@ -421,10 +421,10 @@ func GetMicroRoadShowVideoPageListIkWord(startSize, pageSize int, condition stri
 			art.chart_permission_id,
 			art.chart_permission_name,
 			"" AS play_seconds,
-			"" AS background_img,
+			v.background_img,
 			"" AS industry_name,
 			0 AS industrial_management_id,
-			"" AS share_img,
+			v.share_img,
 			v.activity_id
 		FROM
 			cygx_activity_video as v
@@ -448,10 +448,10 @@ func GetMicroRoadShowVideoPageListIkWord(startSize, pageSize int, condition stri
 			b.chart_permission_id,
 			b.chart_permission_name,
 			a.voice_play_seconds AS play_seconds,
-			a.img_url AS background_img,
+			a.background_img,
 			"" AS industry_name,
 			0 AS industrial_management_id,
-			"" AS share_img,
+			a.share_img,
 			a.activity_id 
 		FROM
 			cygx_activity_voice AS a

+ 18 - 16
models/report.go

@@ -169,7 +169,7 @@ func GetReportAndproductIndustrylList(categoryId, startSize, pageSize int) (item
 			cygx_article AS art 
 		WHERE
 			art.publish_status = 1 
-			AND category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) UNION ALL
+			AND art.article_id IN ( SELECT article_id FROM cygx_report_mapping_category_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) UNION ALL
 		SELECT
 			art.product_interior_id AS article_id,
 			art.title,
@@ -351,7 +351,7 @@ func GetReportAndproductInteriorIndustrialList(pars []interface{}, categoryId, i
 			INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = art.article_id 
 		WHERE
 			art.publish_status = 1 
-			AND category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) 
+			AND art.article_id IN ( SELECT article_id FROM cygx_report_mapping_category_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) 
 			AND art.is_class = 1 
 			AND man_g.industrial_management_id =` + strconv.Itoa(industrialManagementId) + ` 
 		GROUP BY
@@ -499,6 +499,7 @@ func GetReportCollectionBillboardList(limit int, pars []interface{}, condition s
 			a.title,
 			a.annotation,
 			a.publish_date,
+			a.article_type_id,
 			m.chart_permission_name,
 			COUNT(ac.id) AS collection_num
 		FROM
@@ -782,24 +783,25 @@ func GetTimeLineReportIndustrialPublishdateList(industrialIdArr []int) (items []
 
 // 报告榜单start
 type ArticleReportBillboardResp struct {
-	ArticleId       int    `description:"文章id"`
-	Title           string `description:"标题"`
-	PublishDate     string `description:"发布时间"`
-	PermissionName  string `description:"行业名称"`
-	DepartmentId    int    `description:"作者Id"`
-	NickName        string `description:"作者昵称"`
-	IsCollect       bool   `description:"本人是否收藏"`
-	Pv              int    `description:"PV"`
-	CollectNum      int    `description:"收藏人数"`
-	Source          int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
-	ArticleTypeId   int    `description:"文章类型ID"`
+	ArticleId      int    `description:"文章id"`
+	Title          string `description:"标题"`
+	PublishDate    string `description:"发布时间"`
+	PermissionName string `description:"行业名称"`
+	DepartmentId   int    `description:"作者Id"`
+	NickName       string `description:"作者昵称"`
+	IsCollect      bool   `description:"本人是否收藏"`
+	Pv             int    `description:"PV"`
+	CollectNum     int    `description:"收藏人数"`
+	Source         int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	ArticleTypeId  int    `description:"文章类型ID判断是否是研选使用"`
+	IsResearch     bool   `description:"是否属于研选"`
 	ArticleTypeName string `description:"文章类型名称"`
 	IsSpecial       int    `description:"是否为研选专栏"`
 	SpecialTags     string `description:"研选专栏标签"`
 	MyCollectNum    int    `description:"本人是否收藏"`
 	SpecialType     int    `description:"专栏类型 1:笔记,2:观点"`
 	UserId          int    `description:"作者id"`
-	List            []*IndustrialManagementIdInt
+	List           []*IndustrialManagementIdInt
 }
 
 type ArticleReportBillboardLIstPageResp struct {
@@ -911,10 +913,10 @@ func GetArticleResearchList(condition string, pars []interface{}, startSize, pag
 	JOIN cygx_yanxuan_special_author AS b ON a.user_id = b.user_id
 	WHERE
 	1 = 1  AND a.status = 3 `
-		sql += ` ORDER  BY publish_date DESC  LIMIT ?,? `
+		sql += ` GROUP BY a.article_id ORDER  BY a.publish_date DESC  LIMIT ?,? `
 		_, err = o.Raw(sql, userId, userId, pars, startSize, pageSize).QueryRows(&items)
 	} else {
-		sql += ` ORDER  BY publish_date DESC  LIMIT ?,? `
+		sql += ` GROUP BY a.article_id ORDER  BY a.publish_date DESC  LIMIT ?,? `
 		_, err = o.Raw(sql, userId, pars, startSize, pageSize).QueryRows(&items)
 	}
 	return

+ 27 - 0
models/report_mapping_category_group.go

@@ -0,0 +1,27 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportMappingCategoryGroupResp struct {
+	Id                int       `orm:"column(id);pk" description:"id"`
+	ChartPermissionId int       `description:"行业ID"`
+	IdCygx            int       `description:"表cygx_report_mapping_cygx 主键ID"`
+	ArticleId         int       `description:"报告Id"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"更新时间"`
+	PermissionType    int       `description:"1主观,2客观 ,0不限制"`
+}
+
+// 列表
+func GetCygxReportMappingCategoryGroupList(condition string, pars []interface{}) (items []*CygxReportMappingCategoryGroupResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping_category_group as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 16 - 17
models/report_selection.go

@@ -3,7 +3,6 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"time"
 )
 
 type CygxReportSelectionRep struct {
@@ -16,6 +15,8 @@ type CygxReportSelectionRep struct {
 	UpdateDescription string `description:"更新说明"`
 	IsRed             bool   `description:"是否标记红点"`
 	ReadNum           int    `description:"阅读次数"`
+	Periods           string `description:"期数"`
+	MarketStrategy    string `description:"市场策略核心逻辑汇总"`
 }
 
 type CygxReportSelectionListPublicRep struct {
@@ -74,11 +75,13 @@ type CygxReportSelectionLogDetail struct {
 	IndustrialManagementId string   `description:"产业Id"`
 	IndustrialSubjectId    int      `description:"标的ID"`
 	SubjectName            string   `description:"标的名称"`
+	IsShowApplyButton      bool     `description:"是否展示申请路由按钮"`
 	IsNew                  bool     `description:"是否展示新标签"`
 	Body                   string   `description:"内容"`
 	CompanyLabel           []string `description:"公司标签"`
 	Label                  string   `description:"公司标签"`
 	OverviewArticleId      int      `description:"综述报告Id"`
+	IsShowOverviewArticle  int      `description:"是否展示综述报告 1展示,0隐藏"`
 	List                   []*IndustriaReportSelection
 }
 type IndustriaReportSelection struct {
@@ -141,22 +144,6 @@ func GetReportSelectionListHome(condition, tbdb string, pars []interface{}, star
 	return
 }
 
-type CygxReportSelectionLog struct {
-	ArticleSunId           int       `description:"子级报告id"`
-	ArticleId              int       `description:"父级报告Id"`
-	ChartPermissionId      int       `description:"行业ID"`
-	PermissionName         string    `description:"行业ID"`
-	CreateTime             time.Time `description:"创建时间"`
-	Body                   string    `description:"内容"`
-	IndustrialSubjectId    int       `description:"标的ID"`
-	IndustrialManagementId string    `description:"产业资源包Id  多个用 , 隔开"`
-	SubjectName            string    `description:"标的名称"`
-	IcoLink                string    `orm:"column(image_url)"description:"图标链接"`
-	CompanyLabel           []string  `description:"公司标签"`
-	Label                  string    `description:"公司标签"`
-	OverviewArticleId      int       `description:"综述报告Id"`
-}
-
 // 列表
 func GetReportSelectionlogListAll(articleId int) (items []*CygxReportSelectionLog, err error) {
 	o := orm.NewOrm()
@@ -196,3 +183,15 @@ type AddReportSelectionStopTimeRep struct {
 	OutType   int `description:"退出方式,1正常退出,2强制关闭"`
 	Source    int `description:"来源,1:深度研究、2:本周研究汇总、3:上周纪要汇总"`
 }
+
+// 列表
+func GetReportSelectionList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxReportSelectionRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_selection  as art WHERE 1= 1 AND art.publish_status = 1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `   LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 58 - 0
models/report_selection_log.go

@@ -0,0 +1,58 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportSelectionLog struct {
+	ArticleSunId           int       `description:"子级报告id"`
+	ArticleId              int       `description:"父级报告Id"`
+	ChartPermissionId      int       `description:"行业ID"`
+	PermissionName         string    `description:"行业ID"`
+	CreateTime             time.Time `description:"创建时间"`
+	Body                   string    `description:"内容"`
+	IndustrialSubjectId    int       `description:"标的ID"`
+	IndustrialManagementId string    `description:"产业资源包Id  多个用 , 隔开"`
+	SubjectName            string    `description:"标的名称"`
+	IcoLink                string    `orm:"column(image_url)"description:"图标链接"`
+	CompanyLabel           []string  `description:"公司标签"`
+	Label                  string    `description:"公司标签"`
+	OverviewArticleId      int       `description:"综述报告Id"`
+}
+
+type CygxReportSelectionLogResp struct {
+	ArticleSunId           int       `description:"子级报告id"`
+	ArticleId              int       `description:"父级报告Id"`
+	ChartPermissionId      int       `description:"行业ID"`
+	PermissionName         string    `description:"行业ID"`
+	CreateTime             time.Time `description:"创建时间"`
+	Body                   string    `description:"内容"`
+	IndustrialSubjectId    int       `description:"标的ID"`
+	IndustrialManagementId string    `description:"产业资源包Id  多个用 , 隔开"`
+	SubjectName            string    `description:"标的名称"`
+	IcoLink                string    `orm:"column(image_url)"description:"图标链接"`
+	CompanyLabel           []string  `description:"公司标签"`
+	Label                  string    `description:"公司标签"`
+	OverviewArticleId      int       `description:"综述报告Id"`
+}
+
+// 列表
+func GetCygxReportSelectionLog(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxReportSelectionLog, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_selection_log as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 通过ID获取详情
+func GetCygxReportSelectionLogDetail(articleId int, subjectName string) (item *CygxReportSelectionLogResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_selection_log  WHERE article_id=? AND subject_name = ?  LIMIT 1 `
+	err = o.Raw(sql, articleId, subjectName).QueryRow(&item)
+	return
+}

+ 63 - 0
models/report_selection_log_apply.go

@@ -0,0 +1,63 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportSelectionLogApply struct {
+	ReportSelectionLogApplyId int `orm:"column(report_selection_log_apply_id);pk"`
+	UserId                    int
+	CreateTime                time.Time
+	Mobile                    string    `description:"手机号"`
+	Email                     string    `description:"邮箱"`
+	CompanyId                 int       `description:"公司id"`
+	CompanyName               string    `description:"公司名称"`
+	ModifyTime                time.Time `description:"修改时间"`
+	RealName                  string    `description:"用户实际名称"`
+	SellerName                string    `description:"所属销售"`
+	RegisterPlatform          int       `description:"来源 1小程序,2:网页"`
+	ArticleId                 int       `description:"报告Id"`
+	IndustrialSubjectId       int       `description:"标的ID"`
+	SubjectName               string    `description:"标的名称"`
+}
+
+type CygxReportSelectionLogApplyReq struct {
+	ArticleId   int    `description:"报告Id"`
+	SubjectName string `description:"标的ID"`
+}
+
+// 添加信息
+func AddCygxReportSelectionLogApply(item *CygxReportSelectionLogApply) (lastId int64, err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//更新申请数量
+	sql := ` UPDATE cygx_report_selection SET  apply_total= 1 + apply_total WHERE  article_id  = ?`
+	_, err = o.Raw(sql, item.ArticleId).Exec()
+	if err != nil {
+		return
+	}
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 获取数量
+func GetCygxReportSelectionLogApplyCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_report_selection_log_apply as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 2 - 0
models/resource_data.go

@@ -47,6 +47,7 @@ type CygxResourceDataResp struct {
 	IsLimitPeople           int    `description:"是否限制人数 1是,0否"`
 	IsShowDetails           bool   `description:"是否展示查看详情按钮"`
 	YidongActivityUrl       string `description:"易董活动跳转地址"`
+	IsYidongActivity        bool   `description:"是否属于易董同步过来的活动"`
 	TripStatus              int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	IsTrip                  int    `description:"确定行程是否报名 1是 ,0 否"`
 	ActivityTimeText        string `description:"活动预期时间带文字"`
@@ -103,6 +104,7 @@ type CygxResourceDataNewResp struct {
 	Meetingreviewchapt *CygxMorningMeetingGatherDetailListResp `description:"晨会精华"`
 	ProductInterior    *CygxProductInteriorResp                `description:"产品内测"`
 	IndustrialResource *IndustrialManagement                   `description:"产业资源包"`
+	ReportSelection    *CygxReportSelectionRep                 `description:"重点公司(原报告精选)"`
 }
 
 // 列表

+ 60 - 0
models/resource_data_industrial_group_management.go

@@ -0,0 +1,60 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// 首页资源表与产业的关系
+type CygxResourceDataIndustrialGroupManagement struct {
+	Id                     int       `orm:"column(id);pk" description:"主键ID"`
+	ResourceDataId         int       `description:"cygx_resource_data 主键ID"`
+	SourceId               int       `description:"资源ID"`
+	Source                 string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	IndustrialManagementId int       `description:"cygx_industrial_management表的主键ID"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+// 首页资源表与产业的关系
+type CygxResourceDataIndustrialGroupSubject struct {
+	Id                  int       `orm:"column(id);pk" description:"主键ID"`
+	ResourceDataId      int       `description:"cygx_resource_data 主键ID"`
+	SourceId            int       `description:"资源ID"`
+	Source              string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	IndustrialSubjectId int       `description:"cygx_industrial_subject表的主键ID"`
+	CreateTime          time.Time `description:"创建时间"`
+}
+
+// 关联产业列表
+func GetCygxResourceDataIndustrialGroupManagementList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxResourceDataIndustrialGroupManagement, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_resource_data_industrial_group_management as a WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+
+	return
+}
+
+// 关联标的列表
+func GetCygxResourceDataIndustrialGroupSubjectList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxResourceDataIndustrialGroupSubject, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_resource_data_industrial_group_subject as a WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+
+	return
+}

+ 1 - 0
models/search.go

@@ -14,6 +14,7 @@ type SearchItem struct {
 	ImgUrlPc         string   `description:"图片链接"`
 	CategoryId       string   `description:"文章分类"`
 	Source           int      `description:"来源  1:文章, 2:图表"`
+	IsResearch       bool     `description:"是否属于研选"`
 }
 
 type CategoryItem struct {

+ 13 - 0
models/user_record.go

@@ -126,3 +126,16 @@ func GetUserRecordListByMobile(platform int, bindAccount string) (items []*OpenI
 	_, err = orm.NewOrm().Raw(sql, platform).QueryRows(&items)
 	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
+}

+ 72 - 0
routers/commentsRouter.go

@@ -61,6 +61,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ActivityController"],
+        beego.ControllerComments{
+            Method: "GetYidongUrl",
+            Router: `/get_yidong_url`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ActivityController"],
         beego.ControllerComments{
             Method: "ActivityListSearch",
@@ -214,6 +223,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "ApplyAppointmentExpert",
+            Router: `/applyAppointmentExpert`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
         beego.ControllerComments{
             Method: "AskAdd",
@@ -268,6 +286,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "YxSurvey",
+            Router: `/add/yxSurvey`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"],
         beego.ControllerComments{
             Method: "List",
@@ -277,6 +304,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"],
+        beego.ControllerComments{
+            Method: "ListYx",
+            Router: `/listYx`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseCollectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseCollectionController"],
+        beego.ControllerComments{
+            Method: "BannerList",
+            Router: `/banner/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseConfigController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseConfigController"],
         beego.ControllerComments{
             Method: "ResearchHb",
@@ -331,6 +376,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:CollectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:CollectionController"],
+        beego.ControllerComments{
+            Method: "ApplyAdd",
+            Router: `/apply/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:CollectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:CollectionController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ConfigController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ConfigController"],
         beego.ControllerComments{
             Method: "AboutUs",
@@ -781,6 +844,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ReportSelectionController"],
+        beego.ControllerComments{
+            Method: "ReportSelectionLogApply",
+            Router: `/report_selection_log/apply`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ResourceController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ResourceController"],
         beego.ControllerComments{
             Method: "FileUpload",

+ 6 - 0
routers/router.go

@@ -144,6 +144,12 @@ func init() {
 				&controllers.TagController{},
 			),
 		),
+		web.NSNamespace("/collection",
+			web.NSInclude(
+				&controllers.CollectionController{},
+				&controllers.BaseCollectionController{},
+			),
+		),
 		web.NSNamespace("/yanxuan_special",
 			web.NSInclude(
 				&controllers.YanxuanSpecialController{},

+ 328 - 9
services/activity.go

@@ -520,6 +520,16 @@ func HandleActivityTypeHomeList(listType []*models.ActivityTypeHome, listActivit
 		}
 		item.Resource = 1
 		item.ActivityId = v.ActivityId
+
+		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			item.IsResearch = true
+		}
+
+		//易董同步过来的活动只展示外部资源标签
+		if v.YidongActivityId != "" {
+			item.IsResearchPoints = false
+			item.IsResearch = false
+		}
 		if v.IsExternalLabel > 0 {
 			item.IsExternalLabel = true
 		}
@@ -609,8 +619,9 @@ func ActivityButtonShow(item *models.ActivityDetail, user *models.WxUserItem, pe
 	if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 		activityDetail.IsResearch = true
 	}
-	//如果是 公司调研电话会:3,或 专家线下沙龙:5  而且  除易董同步过来的以外的研选类型活动,必须要有研选的正式权限
-	if (activityDetail.ActivityTypeId == 3 || activityDetail.ActivityTypeId == 5) && activityDetail.YidongActivityId == "" && strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && utils.InArrayByStr(permissionArr, utils.CHART_PERMISSION_NAME_MF_YANXUAN) {
+
+	//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+	if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityDetail.ActivityId] {
 		activityDetail.IsResearchSpecial = true
 	}
 	if activityDetail.SiginupDeadline == utils.FormatDateTimeInit { //报名截止时间处理
@@ -702,6 +713,12 @@ func ActivityButtonShow(item *models.ActivityDetail, user *models.WxUserItem, pe
 				activityDetail.IsShowSignup = true
 				activityDetail.IsShowMeetingReminder = true
 			}
+
+			//买方线下交流 8 // 查研观向 11.0
+			if activityDetail.ActivityTypeId == 8 {
+				activityDetail.IsShowSignup = true
+			}
+
 			//如果是易董创建的活动,展示我要报名,不展示预约外呼
 			if activityDetail.IsYidongConduct {
 				activityDetail.IsShowSignup = true
@@ -709,12 +726,19 @@ func ActivityButtonShow(item *models.ActivityDetail, user *models.WxUserItem, pe
 			}
 		}
 	}
+
 	activityDetail.IsResearchPoints = activityPointsByUserAllMap[activityDetail.ActivityId]
 	authInfo, permissionArr, e := GetUserRaiPermissionInfo(user.UserId, user.CompanyId)
 	if e != nil {
 		e = errors.New("获取用户权限失败, Err: " + e.Error())
 		return
 	}
+	//如果是易董同步过来的,只展示外部资源标签
+	if activityDetail.YidongActivityId != "" {
+		activityDetail.IsExternalLabel = true
+		activityDetail.IsResearch = false
+		activityDetail.IsResearchSpecial = false
+	}
 	v := activityDetail
 	itemActivity = &models.ActivityListResp{
 		ActivityId:              v.ActivityId,
@@ -796,6 +820,13 @@ func ActivityButtonShow(item *models.ActivityDetail, user *models.WxUserItem, pe
 		if v.ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, v.ChartPermissionName) {
 			au.HasPermission = 2
 		}
+
+		//如果是易董的活动,主、副权限有一个满足即可 查研观向 11.0
+		if v.YidongActivityId != "" {
+			if utils.InArrayByStr(permissionArr, v.ChartPermissionName) || utils.InArrayByStr(permissionArr, v.ChartPermissionNameDeputy) {
+				au.HasPermission = 1
+			}
+		}
 	}
 
 	// 无权限的弹框提示
@@ -834,6 +865,279 @@ func ActivityButtonShow(item *models.ActivityDetail, user *models.WxUserItem, pe
 		//itemActivity.TripImgLink = itemActivity.TripImgLinkFix
 		//activityDetail.Explain = utils.ACtIVITY_SPECIAL_TRIP_EXPLAIN
 	}
+
+	return
+}
+
+func ActivityArrButtonShow(items []*models.ActivityDetail, user *models.WxUserItem, permissionArr []string) (itemsActivity []*models.ActivityListResp) {
+
+	var activityIds []int
+	authInfo, permissionArr, e := GetUserRaiPermissionInfo(user.UserId, user.CompanyId)
+	if e != nil {
+		e = errors.New("获取用户权限失败, Err: " + e.Error())
+		return
+	}
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
+	for _, activityDetail := range items {
+
+		//IsShowAppointment       bool                       `description:"是否展示预约纪要"`
+		//IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
+		//IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
+		//IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
+		//IsShowSignup            bool                       `description:"是否展示我要报名"`
+
+		if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+			activityDetail.IsResearch = true
+		}
+		//如果是 公司调研电话会:3,或 专家线下沙龙:5  而且  除易董同步过来的以外的研选类型活动
+		//if (activityDetail.ActivityTypeId == 3 || activityDetail.ActivityTypeId == 5) && activityDetail.YidongActivityId == "" && strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+		//	activityDetail.IsResearchSpecial = true
+		//}
+		//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+		if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityDetail.ActivityId] {
+			activityDetail.IsResearchSpecial = true
+		}
+
+		if activityDetail.SiginupDeadline == utils.FormatDateTimeInit { //报名截止时间处理
+			activityDetail.SiginupDeadline = ""
+		}
+		//如果报名截止时间不规范,或者是非研选扣点活动就把截止时间设置为空
+		if activityDetail.CancelDeadline == utils.FormatDateTimeInit || !activityDetail.IsResearchPoints {
+			activityDetail.CancelDeadline = ""
+		}
+
+		activityTimeText := activityDetail.ActivityTimeText
+		activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
+		activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)
+		activityDetail.ActivityTimeText = activityTimeText
+		var yidongActivityUrl string
+		activityDetail.IsShowAppointment = false
+		//易董的操作按钮都隐藏
+		if activityDetail.YidongActivityId != "" {
+			activityDetail.IsShowSignup = false
+			activityDetail.IsShowDetails = true
+			activityDetail.IsYidongActivity = true
+
+			//if activityDetail.YidongActivityId != "" {
+			//	ydTgc, _ := GetYiDongCreateUserInfo(user)
+			//	yidongLongLink, _ := GetYiDongOriginalLink(activityDetail)
+			//	if yidongLongLink != "" {
+			//		yidongActivityUrl = yidongLongLink + "%26source=11%26fromHz=true%26tgc=" + ydTgc
+			//	}
+			//}
+		} else {
+
+			//专家电话会 1
+			if activityDetail.ActivityTypeId == 1 && activityDetail.IsLimitPeople == 0 && (activityDetail.ActiveState == "1" || activityDetail.ActiveState == "2") {
+				activityDetail.IsShowHelpSsk = true
+			}
+			if activityDetail.ActiveState == "1" {
+				//新的是否展示规则
+				if activityDetail.IsCanAppointmentMinutes == 1 {
+					activityDetail.IsShowAppointment = true
+				}
+
+				//专家电话会 1
+				if activityDetail.ActivityTypeId == 1 {
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+					activityDetail.IsShowHelpSsk = true
+				}
+
+				//分析师电话会 2
+				if activityDetail.ActivityTypeId == 2 {
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+				}
+
+				if activityDetail.ActivityTypeId == 3 {
+					//司调研电话会(3)、扣点的研选活动只展示我要报名
+					if activityDetail.IsResearchPoints || activityDetail.LimitPeopleNum > 0 {
+						activityDetail.IsShowSignup = true
+					} else {
+						activityDetail.IsShowMeetingReminder = true
+						activityDetail.IsShowOutboundCall = true
+					}
+				}
+
+				//公司线下调研 4
+				if activityDetail.ActivityTypeId == 4 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//专家线下沙龙 5
+				if activityDetail.ActivityTypeId == 5 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//分析师线下沙龙 6
+				if activityDetail.ActivityTypeId == 6 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//分析师电话会(C类) 7
+				if activityDetail.ActivityTypeId == 7 {
+					activityDetail.IsShowSignup = true
+					activityDetail.IsShowMeetingReminder = true
+				}
+
+				//买方线下交流 8 // 查研观向 11.0
+				if activityDetail.ActivityTypeId == 8 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//如果是易董创建的活动,展示我要报名,不展示预约外呼
+				if activityDetail.IsYidongConduct {
+					activityDetail.IsShowSignup = true
+					activityDetail.IsShowOutboundCall = false
+				}
+			}
+		}
+
+		activityDetail.IsResearchPoints = activityPointsByUserAllMap[activityDetail.ActivityId]
+
+		v := activityDetail
+		itemActivity := &models.ActivityListResp{
+			ActivityId:              v.ActivityId,
+			ActivityTypeId:          v.ActivityTypeId,
+			ActivityTypeName:        v.ActivityTypeName,
+			ChartPermissionId:       v.ChartPermissionId,
+			ChartPermissionName:     v.ChartPermissionName,
+			IsLimitPeople:           v.IsLimitPeople,
+			LimitPeopleNum:          v.LimitPeopleNum,
+			LastUpdatedTime:         v.LastUpdatedTime,
+			ActivityTime:            v.ActivityTime,
+			ActivityTimeText:        v.ActivityTimeText,
+			DistinguishedGuest:      v.DistinguishedGuest,
+			Host:                    v.Host,
+			Speaker:                 v.Speaker,
+			MainlandTell:            v.MainlandTell,
+			HongKongTell:            v.HongKongTell,
+			TaiwanTell:              v.TaiwanTell,
+			AmericaTell:             v.AmericaTell,
+			ParticipationCode:       v.ParticipationCode,
+			Theme:                   v.Theme,
+			Expert:                  v.Expert,
+			ActivityName:            v.ActivityName,
+			OnlineParticipation:     v.OnlineParticipation,
+			ReportLink:              v.ReportLink,
+			AppAttendance:           v.AppAttendance,
+			ConferencePassword:      v.ConferencePassword,
+			City:                    v.City,
+			Address:                 v.Address,
+			Highlights:              v.Highlights,
+			Remarks:                 v.Remarks,
+			IsSignup:                v.IsSignup,
+			IsCancelMeetingReminder: v.IsCancelMeetingReminder,
+			IsAppointment:           v.IsAppointment,
+			ActiveState:             v.ActiveState,
+			IsShowSustainable:       v.IsShowSustainable,
+			Description:             v.Description,
+			IsResearch:              v.IsResearch,
+			IsHideAppointment:       v.IsHideAppointment,
+			IsCClassMeeting:         v.IsCClassMeeting,
+			Label:                   v.Label,
+			ImgUrl:                  v.ImgUrl,
+			ImgUrlText:              v.ImgUrlText,
+			ActivityType:            v.ActivityType,
+			IsShowOutboundCall:      v.IsShowOutboundCall,
+			IsShowMeetingReminder:   v.IsShowMeetingReminder,
+			IsShowHelpSsk:           v.IsShowHelpSsk,
+			IsShowSignup:            v.IsShowSignup,
+			IsShowAppointment:       v.IsShowAppointment,
+			IsShowDetails:           v.IsShowDetails,
+			AudioLink:               v.AudioLink,
+			VoiceDetail:             v.VoiceList,
+			VideoDetail:             v.VideoDetail,
+			FileType:                v.FileType,
+			SourceType:              v.SourceType,
+			SignupNum:               v.SignupNum,
+			YidongActivityUrl:       yidongActivityUrl,
+			Explain:                 utils.ACtIVITY_SPECIAL_EXPLAIN,
+			TripImgLink:             v.TripImgLink,
+			Days:                    v.Days,
+			SignupType:              v.SignupType,
+			IsYidongConduct:         v.IsYidongConduct,
+			IsCanOutboundCall:       v.IsCanOutboundCall,
+			TencentConferenceNumber: v.TencentConferenceNumber,
+			IsResearchSpecial:       v.IsResearchSpecial,
+			LinkParticipants:        v.LinkParticipants,
+			IsResearchPoints:        v.IsResearchPoints,
+			IsExternalLabel:         v.IsExternalLabel,
+			SiginupDeadline:         v.SiginupDeadline,
+			CancelDeadline:          v.CancelDeadline,
+			IsYidongActivity:        v.IsYidongActivity,
+		}
+		au := new(models.UserPermissionAuthInfo)
+		au.SellerName = authInfo.SellerName
+		au.SellerMobile = authInfo.SellerMobile
+		au.HasPermission = authInfo.HasPermission
+		au.OperationMode = authInfo.OperationMode
+		if au.HasPermission == 1 {
+			// 非宏观权限进一步判断是否有权限
+			if v.ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, v.ChartPermissionName) {
+				au.HasPermission = 2
+			}
+			//如果是易董的活动,主、副权限有一个满足即可 查研观向 11.0
+			if v.YidongActivityId != "" {
+				if utils.InArrayByStr(permissionArr, v.ChartPermissionName) || utils.InArrayByStr(permissionArr, v.ChartPermissionNameDeputy) {
+					au.HasPermission = 1
+				}
+			}
+		}
+
+		// 无权限的弹框提示
+		if au.HasPermission != 1 {
+			if au.OperationMode == UserPermissionOperationModeCall {
+				if v.FileType == 1 {
+					au.PopupMsg = UserPermissionPopupMsgCallMicroVoice
+				} else {
+					au.PopupMsg = UserPermissionPopupMsgCallMicroVideo
+				}
+			} else {
+				if v.FileType == 1 {
+					au.PopupMsg = UserPermissionPopupMsgApplyMicroVoice
+				} else {
+					au.PopupMsg = UserPermissionPopupMsgApplyMicroVideo
+				}
+			}
+		}
+		//如果是易董同步过来的,只展示外部资源标签
+		if activityDetail.YidongActivityId != "" {
+			itemActivity.IsExternalLabel = true
+			itemActivity.IsResearch = false
+			itemActivity.IsResearchSpecial = false
+		}
+		itemActivity.AuthInfo = au
+		//处理用户已经报名了的行程
+		activityIds = append(activityIds, v.ActivityId)
+		itemsActivity = append(itemsActivity, itemActivity)
+	}
+
+	//处理专项调研
+	UserMap, e := GetSpecialTripUserMap(activityIds, user.UserId)
+	if e != nil {
+		e = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
+		return
+	}
+	for _, v := range itemsActivity {
+		if _, ok := UserMap[v.ActivityId]; ok {
+			v.IsTrip = 1
+		}
+		if v.Days == 0 {
+			v.TripStatus = 1
+		} else {
+			v.TripStatus = 2
+		}
+	}
 	return
 }
 
@@ -972,6 +1276,11 @@ func GetIndustryNewLabelMap(industryIds []int) (labelMap map[int]bool, err error
 func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.ActivityDetail) (havePower, isResearchSpecial bool, err error) {
 	var companyDetailStatus string
 	var userTypeStr string
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
+	//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityInfo.ActivityId] {
+		isResearchSpecial = true
+	}
 
 	//如果是弘则的用户或者宏观的权限不做校验
 	if (GetBelongingRai(user.Mobile) && user.CompanyId == utils.HZ_COMPANY_ID) || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
@@ -983,10 +1292,20 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
 	}
-	//如果是 公司调研电话会:3,或 专家线下沙龙:5  而且  除易董同步过来的以外的研选类型活动,必须要有研选的正式权限
-	if (activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 5) && activityInfo.YidongActivityId == "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		isResearchSpecial = true
+
+	//如果是易董的活动,主、副权限有一个满足即可
+	if activityInfo.YidongActivityId != "" {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName) || strings.Contains(permissionStr, activityInfo.ChartPermissionNameDeputy) {
+			havePower = true
+			return
+		}
 	}
+
+	//如果权限不包含那么直接返回
+	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+		return
+	}
+
 	//如果是 对用户的研选扣点的必须要有研选的正式权限
 	if activityInfo.IsResearchPoints {
 		//获取活动对用户要扣的点
@@ -996,10 +1315,10 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 			return
 		}
 		if userPointsNum > 0 {
-			if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
-				//如果连试用权限都没有,那么久按照普通的研选样式展示
-				isResearchSpecial = false
-			}
+			//if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
+			//	//如果连试用权限都没有,那么久按照普通的研选样式展示
+			//	isResearchSpecial = false
+			//}
 			if !strings.Contains(permissionStrZhengShi, activityInfo.ChartPermissionName) {
 				havePower = false
 				return

+ 6 - 0
services/activity_button.go

@@ -330,6 +330,7 @@ func ActivityButtonShowSearch(item *models.ActivityDetail, user *models.WxUserIt
 			if yidongLongLink != "" {
 				activityDetail.YidongActivityUrl = yidongLongLink + "%26source=11%26fromHz=true%26tgc=" + ydTgc
 			}
+			activityDetail.IsYidongActivity = true
 		}
 	} else {
 		//专家电话会 1
@@ -395,6 +396,11 @@ func ActivityButtonShowSearch(item *models.ActivityDetail, user *models.WxUserIt
 				activityDetail.IsShowSignup = true
 				activityDetail.IsShowMeetingReminder = true
 			}
+
+			//买方线下交流 8 // 查研观向 11.0
+			if activityDetail.ActivityTypeId == 8 {
+				activityDetail.IsShowSignup = true
+			}
 		}
 	}
 	return

+ 1 - 1
services/activity_signup.go

@@ -79,7 +79,7 @@ func CheckActivitySignUpLimit(user *models.WxUserItem, activityInfo *models.Acti
 // 校验报名截止时间
 func CheckSiginupDeadline(activityInfo *models.ActivityDetail) (checkTime bool, popupMsg string) {
 	checkTime = true
-	if activityInfo.SiginupDeadline != utils.FormatDateTimeInit {
+	if activityInfo.SiginupDeadline != utils.FormatDateTimeInit && activityInfo.SiginupDeadline != "" {
 		timeResp := utils.StrTimeToTime(activityInfo.SiginupDeadline)
 		fmt.Println(timeResp)
 		if timeResp.Before(time.Now()) {

+ 41 - 3
services/article.go

@@ -159,8 +159,9 @@ func HandleArticleCategoryImg(list []*models.ArticleListResp, user *models.WxUse
 				list[k].ImgUrlPc = utils.ZHI_ZAO_OTHER_IMG
 			}
 		}
-		list[k].IsResearch = utils.InArrayByInt(utils.YAN_XUAN_ARTICLE_TYPE_ID, v.ArticleTypeId)
-
+		if v.ArticleTypeId > 0 {
+			list[k].IsResearch = true
+		}
 	}
 
 	articleIds := make([]int, 0)
@@ -278,7 +279,17 @@ func GetArticNewLabelWhithActivity3Month() (labelMap map[int]bool, err error) {
 
 // GetSpecialArticleDetailUserPower 处理用户查看专项调研文章详情的权限
 func GetSpecialArticleDetailUserPower(user *models.WxUserItem, articleInfo *models.ArticleDetail) (havePower bool, err error) {
-	permissionStr, e := GetCompanyPermission(user.CompanyId)
+	userType, _, e := GetUserType(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	// 永续客户、大套餐客户可以查看行业升级套餐客户 权限
+	if userType == 1 || userType == 2 {
+		havePower = true
+		return
+	}
+	permissionStr, e := GetCompanyPermissionUpgrade(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
@@ -719,3 +730,30 @@ func GetAiQianYanArtilceList(startSize, pageSize int) (items []*models.HomeArtic
 	}
 	return
 }
+
+// GetYxArticleIdMap 获取研选文章ID
+func GetYxArticleIdMap(articleIds []int) (mapResp map[int]bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取研选文章ID失败,GetYxArticleIdMap"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition = ` AND  article_type_id > 0 `
+	if len(articleIds) > 0 {
+		condition += ` AND article_id IN (` + utils.GetOrmInReplace(len(articleIds)) + `)`
+		pars = append(pars, articleIds)
+	}
+	articleList, e := models.GetArticleList(condition, pars)
+	if e != nil {
+		err = errors.New("GetArticleList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[int]bool, 0)
+	for _, v := range articleList {
+		mapResp[v.ArticleId] = true
+	}
+	return
+}

+ 159 - 0
services/article_apply_appointment_expert.go

@@ -0,0 +1,159 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 约访专家的请求
+func AddArticleApplyAppointmentExpert(user *models.WxUserItem, articleId int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	item := new(models.CygxArticleApplyAppointmentExpert)
+	item.UserId = user.UserId
+	item.ArticleId = articleId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	_, e := models.AddCygxArticleApplyAppointmentExpert(item)
+	if e != nil {
+		err = errors.New("AddCygxArticleApplyAppointmentExpert, Err: " + e.Error())
+		return
+	}
+
+	return
+}
+
+// 用户约访专家的请求,向对应销售发送模版消息
+func SendArticleApplyAppointmentExpertTemplateMsg(user *models.WxUserItem, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+msg, 2)
+		}
+	}()
+	//文章详情
+	detailArticle, e := models.GetArticleDetailById(articleId)
+	if e != nil {
+		err = errors.New("GetArticleDetailById, Err: " + e.Error())
+		return
+	}
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+	//内容组全员手机号
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	//汪洋手机号
+	cnfWangYang, e := models.GetConfigByCode(utils.TPL_MSG_WANG_YANG)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, cnfWangYang.ConfigValue)
+	listMobile := strings.Split(cnf.ConfigValue, ",")
+	for _, v := range listMobile {
+		mobiles = append(mobiles, v)
+	}
+
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error() + configCode)
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint("约访专家(", detailArticle.Title, ")")
+	var redirectUrl string
+	redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}
+
+// 获取用户数是否约访专家的请求
+func GetIsApplyAppointmentExpert(user *models.WxUserItem, articleId int) (isApplyAppointmentExpert bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("获取用户数是否约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND article_id =? AND user_id = ?  `
+	pars = append(pars, articleId, user.UserId)
+	total, e := models.GetCygxArticleApplyAppointmentExpertCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxArticleApplyAppointmentExpertCount, Err: " + e.Error())
+		return
+	}
+	fmt.Println(total)
+	if total > 0 {
+		isApplyAppointmentExpert = true
+	}
+	return
+}

+ 126 - 0
services/banner_yx_survey.go

@@ -0,0 +1,126 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 约访专家的请求
+func AddCygxBannerYxSurvey(user *models.WxUserItem, content string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	item := new(models.CygxBannerYxSurvey)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.Content = content
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	_, e := models.AddCygxBannerYxSurvey(item)
+	if e != nil {
+		err = errors.New("AddCygxBannerYxSurvey, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 用户提交研选调研需求,给汪洋、对口销售、内容组全员发模板消息
+func SendCygxBannerYxSurveyTemplateMsg(user *models.WxUserItem, content string, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("SendCygxBannerYxSurveyTemplateMsg Err"+msg, 2)
+		}
+	}()
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+	//内容组全员手机号
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	//汪洋手机号
+	cnfWangYang, e := models.GetConfigByCode(utils.TPL_MSG_WANG_YANG)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, cnfWangYang.ConfigValue)
+	listMobile := strings.Split(cnf.ConfigValue, ",")
+	for _, v := range listMobile {
+		mobiles = append(mobiles, v)
+	}
+	mobiles = append(mobiles, utils.MobileShenTao, utils.MobileZhangChuanXin, utils.MobileWangFang) // 添加沈涛、张传星、王芳手机号
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error() + configCode)
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint("研选调研需求:", content)
+	var redirectUrl string
+	if utils.RunMode == "release" {
+		redirectUrl = utils.WX_MSG_PATH_YX_SURVEY_DETAIL + strconv.Itoa(articleId)
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 94 - 0
services/collection.go

@@ -0,0 +1,94 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//精选看板
+
+// 用户提交研选调研需求,给王芳、对口销售、内容组全员发模板消息
+func SendCygxApplyCollectionTemplateMsg(user *models.WxUserItem, content string, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("SendCygxBannerYxSurveyTemplateMsg Err"+msg, 2)
+		}
+	}()
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+	//内容组全员手机号
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	//王芳手机号
+	cnfWangFang, e := models.GetConfigByCode(utils.TPL_MSG)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, cnfWangFang.ConfigValue)
+	listMobile := strings.Split(cnf.ConfigValue, ",")
+	for _, v := range listMobile {
+		mobiles = append(mobiles, v)
+	}
+
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error() + configCode)
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint("精选看板:", content)
+	var redirectUrl string
+	if utils.RunMode == "release" {
+		redirectUrl = utils.WX_MSG_PATH_APPLY_COLLECTION_DETAIL + strconv.Itoa(articleId)
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 5 - 3
services/es_comprehensive.go

@@ -481,9 +481,11 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 			return
 		}
 		var activityListRersp []*models.ActivityListResp
-		for _, v := range activityList {
-			activityListRersp = append(activityListRersp, ActivityButtonShow(v, user, make([]string, 0)))
-		}
+		//for _, v := range activityList {
+		//	activityListRersp = append(activityListRersp, ActivityButtonShow(v, user, make([]string, 0)))
+		//}
+		//var pArr []string
+		activityListRersp = ActivityArrButtonShow(activityList, user, make([]string, 0))
 		//处理不同的报名方式按钮回显
 		mapActivitySignup, e := GetActivitySignupResp(activityIds, user)
 		if e != nil {

+ 31 - 0
services/industry_fllow.go

@@ -0,0 +1,31 @@
+package services
+
+import (
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"time"
+)
+
+// 添加用户关注,取消关注产业日志记录
+func AddCygxIndustryFllowLog(item *models.CygxIndustryFllow) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("添加用户关注,取消关注产业日志记录失败"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	itemlog := new(models.CygxIndustryFllowLog)
+	itemlog.IndustrialManagementId = item.IndustrialManagementId
+	itemlog.UserId = item.UserId
+	itemlog.Email = item.Email
+	itemlog.Mobile = item.Mobile
+	itemlog.RealName = item.RealName
+	itemlog.CompanyId = item.CompanyId
+	itemlog.CompanyName = item.CompanyName
+	itemlog.Type = item.Type
+	itemlog.Source = utils.REGISTER_PLATFORM
+	itemlog.CreateTime = time.Now()
+	itemlog.ModifyTime = time.Now()
+	_, err = models.AddCygxIndustryFllowLog(itemlog)
+	return err
+}

+ 72 - 0
services/report_mapping_category_group.go

@@ -0,0 +1,72 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"strings"
+)
+
+// 校验文章主客观权限
+func CheckArticlePermissionType(articleId int, user *models.WxUserItem) (checkPermissionType bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("校验文章主客观权限,失败"+err.Error()+fmt.Sprint("uid:", user.UserId, "articleId", articleId), 2)
+		}
+	}()
+	permissionStr, e := models.GetCompanyPermissionByUser(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionByUser, Err: " + e.Error())
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition += ` AND article_id = ? `
+	pars = append(pars, articleId)
+	list, e := models.GetCygxReportMappingCategoryGroupList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxReportMappingCategoryGroupList, Err: " + e.Error())
+		return
+	}
+	if len(list) == 0 {
+		checkPermissionType = true
+		return
+	}
+	var chartPermissionId int
+	var chartPermissionName string
+	var permissionTypeZg bool
+	var permissionTypeKg bool
+	for _, v := range list {
+		chartPermissionId = v.ChartPermissionId
+		if v.PermissionType == 1 || v.PermissionType == 0 {
+			permissionTypeZg = true
+		}
+		if v.PermissionType == 2 || v.PermissionType == 0 {
+			permissionTypeKg = true
+		}
+	}
+
+	categoryinfo, e := models.GetChartPermissionById(chartPermissionId)
+	if e != nil {
+		err = errors.New("GetChartPermissionById, Err: " + e.Error())
+		return
+	}
+
+	if permissionTypeZg {
+		chartPermissionName = categoryinfo.PermissionName + "(主观)"
+	}
+	if permissionTypeKg {
+		chartPermissionName = categoryinfo.PermissionName + "(客观)"
+	}
+
+	if permissionTypeKg && permissionTypeZg {
+		chartPermissionName = categoryinfo.PermissionName
+	}
+
+	if strings.Contains(permissionStr, chartPermissionName) {
+		checkPermissionType = true
+	}
+	return
+}

+ 70 - 0
services/report_selection.go

@@ -0,0 +1,70 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"time"
+)
+
+// 重点公司路演申请,给吴昂迪、对口销售
+func SendCygxReportSelectionLogApplyTemplateMsg(user *models.WxUserItem, content string) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, content)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("SendCygxReportSelectionLogApplyTemplateMsg Err"+msg+err.Error(), 2)
+		}
+	}()
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, "")
+	mobiles = append(mobiles, utils.MobileShenTao, utils.MobileZhangChuanXin, utils.MobileWuAngDi) // 添加沈涛、张传星、吴昂迪手机号
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	fmt.Println(openIdArr)
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint(content, "(申请路演)")
+	var redirectUrl string
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 30 - 94
services/resource_data.go

@@ -43,6 +43,7 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 	var minutessummaryIds []int     //上周纪要汇总
 	var meetingreviewchaptIds []int //晨会精华
 	var productinteriorIds []int    //产品内测
+	var reportselectionIds []int    // 报告精选
 	//Source      string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial 、 本周研究汇总: researchsummary 、 上周纪要汇总 :minutessummary 、晨会精华 :meetingreviewchapt  、 产品内测:productinterior
 	for _, v := range list {
 		if v.Source == "article" {
@@ -67,6 +68,8 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 			meetingreviewchaptIds = append(meetingreviewchaptIds, v.SourceId)
 		} else if v.Source == "productinterior" {
 			productinteriorIds = append(productinteriorIds, v.SourceId)
+		} else if v.Source == "reportselection" {
+			reportselectionIds = append(reportselectionIds, v.SourceId)
 		}
 	}
 	detail, e := models.GetConfigByCode("city_img_url")
@@ -206,9 +209,10 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 			return
 		}
 		var activityListRersp []*models.ActivityListResp
-		for _, v := range activityList {
-			activityListRersp = append(activityListRersp, ActivityButtonShow(v, user, make([]string, 0)))
-		}
+		//for _, v := range activityList {
+		//	activityListRersp = append(activityListRersp, ActivityButtonShow(v, user, make([]string, 0)))
+		//}
+		activityListRersp = ActivityArrButtonShow(activityList, user, make([]string, 0))
 		//处理不同的报名方式按钮回显
 		mapActivitySignup, e := GetActivitySignupResp(activityIds, user)
 		if e != nil {
@@ -296,97 +300,6 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 		}
 	}
 
-	////处理路演
-	//if len(roadshowIds) > 0 {
-	//	pars = make([]interface{}, 0)
-	//	condition = ` AND video_id IN (` + utils.GetOrmInReplace(len(roadshowIds)) + `)`
-	//	pars = append(pars, roadshowIds)
-	//	roadshowVideoList, e := models.GetMicroRoadshowVideoListBycondition(condition, pars, 0, len(roadshowIds))
-	//	if e != nil {
-	//		err = errors.New("GetResourceDataList, Err: " + e.Error())
-	//		return
-	//	}
-	//	for _, v := range roadshowVideoList {
-	//		mapItems[fmt.Sprint("roadshow", v.VideoId)].Title = v.VideoName
-	//		mapItems[fmt.Sprint("roadshow", v.VideoId)].ImgUrl = v.ImgUrl
-	//		mapItems[fmt.Sprint("roadshow", v.VideoId)].PublishDate = v.CreateTime.Format(utils.FormatDateTime)
-	//	}
-	//}
-	////处理路活动视频
-	//if len(activityvideoIds) > 0 {
-	//	pars = make([]interface{}, 0)
-	//	condition = ` AND video_id IN (` + utils.GetOrmInReplace(len(activityvideoIds)) + `)`
-	//	pars = append(pars, activityvideoIds)
-	//	activityVideoList, e := models.GetActivityVideoList(condition, pars, 0, len(activityvideoIds))
-	//	if e != nil {
-	//		err = errors.New("GetResourceDataList, Err: " + e.Error())
-	//		return
-	//	}
-	//	//// 获取默认图配置
-	//	_, videoMap, _, _, e := GetMicroRoadShowDefaultImgConfig()
-	//	if e != nil {
-	//		err = errors.New("GetMicroRoadShowDefaultImgConfig, Err: " + e.Error())
-	//		return
-	//	}
-	//	for _, v := range activityVideoList {
-	//		mapItems[fmt.Sprint("activityvideo", v.VideoId)].Title = v.VideoName
-	//		mapItems[fmt.Sprint("activityvideo", v.VideoId)].ImgUrl = videoMap[v.ChartPermissionId]
-	//		mapItems[fmt.Sprint("activityvideo", v.VideoId)].ChartPermissionId = v.ChartPermissionId
-	//	}
-	//}
-	////处理路活音频
-	//if len(activityvoiceIds) > 0 {
-	//	pars = make([]interface{}, 0)
-	//	condition = ` AND activity_voice_id IN (` + utils.GetOrmInReplace(len(activityvoiceIds)) + `)`
-	//	pars = append(pars, activityvoiceIds)
-	//	activityVoiceList, e := models.GetActivityVoiceList(condition, pars, 0, len(activityvoiceIds))
-	//	if e != nil {
-	//		err = errors.New("GetResourceDataList, Err: " + e.Error())
-	//		return
-	//	}
-	//
-	//	// 用户权限
-	//	authInfo, permissionArr, e := GetUserRaiPermissionInfo(user.UserId, user.CompanyId)
-	//	if e != nil {
-	//		err = errors.New("GetUserRaiPermissionInfo, Err: " + e.Error())
-	//		return
-	//	}
-	//
-	//	// 获取默认图配置
-	//	audioMap, _, _, _, e := GetMicroRoadShowDefaultImgConfig()
-	//	if e != nil {
-	//		err = errors.New("GetMicroRoadShowDefaultImgConfig, Err: " + e.Error())
-	//		return
-	//	}
-	//	for i, v := range activityVoiceList {
-	//		au := new(models.UserPermissionAuthInfo)
-	//		au.SellerName = authInfo.SellerName
-	//		au.SellerMobile = authInfo.SellerMobile
-	//		au.HasPermission = authInfo.HasPermission
-	//		au.OperationMode = authInfo.OperationMode
-	//		if au.HasPermission == 1 {
-	//			// 非宏观权限进一步判断是否有权限
-	//			if activityVoiceList[i].ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, activityVoiceList[i].ChartPermissionName) {
-	//				au.HasPermission = 2
-	//			}
-	//		}
-	//		// 无权限的弹框提示
-	//		if au.HasPermission != 1 {
-	//			if au.OperationMode == UserPermissionOperationModeCall {
-	//				au.PopupMsg = UserPermissionPopupMsgCallActivity
-	//			} else {
-	//				au.PopupMsg = UserPermissionPopupMsgApplyActivity
-	//			}
-	//		}
-	//		mapItems[fmt.Sprint("activityvoice", v.ActivityVoiceId)].AuthInfo = au
-	//		mapItems[fmt.Sprint("activityvoice", v.ActivityVoiceId)].Title = v.VoiceName
-	//		mapItems[fmt.Sprint("activityvoice", v.ActivityVoiceId)].ImgUrl = audioMap[v.ChartPermissionId]
-	//		if au.HasPermission == 1 {
-	//			mapItems[fmt.Sprint("activityvoice", v.ActivityVoiceId)].ResourceUrl = v.VoiceUrl
-	//		}
-	//	}
-	//}
-
 	//处理路演 处理路活动视频 处理路活音频
 	if len(roadshowIds)+len(activityvideoIds)+len(activityvoiceIds) > 0 {
 
@@ -507,8 +420,31 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 		}
 	}
 
+	//处理报告精选
+	lenreportselectionIds := len(reportselectionIds)
+	if lenreportselectionIds > 0 {
+		pars = make([]interface{}, 0)
+		condition = ` AND article_id IN (` + utils.GetOrmInReplace(lenreportselectionIds) + `)`
+		pars = append(pars, reportselectionIds)
+		listreportselection, e := models.GetReportSelectionList(condition, pars, 0, lenreportselectionIds)
+		if e != nil {
+			err = errors.New("GetReportSelectionList, Err: " + e.Error())
+			return
+		}
+		for _, v := range listreportselection {
+			v.Title += "(第" + v.Periods + "期)"
+			v.MarketStrategy = AnnotationHtml(v.MarketStrategy)
+			v.PublishDate = utils.TimeRemoveHms2(v.PublishDate)
+			mapItems[fmt.Sprint("reportselection", v.ArticleId)].ReportSelection = v
+		}
+	}
+
 	for _, vList := range list {
 		for _, v := range mapItems {
+			//如果这些类型都为空,那么就不合并
+			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil && v.ReportSelection == nil {
+				continue
+			}
 			if v.SourceId == vList.SourceId {
 				items = append(items, v)
 			}

+ 143 - 0
services/tag.go

@@ -1,9 +1,11 @@
 package services
 
 import (
+	"errors"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -36,3 +38,144 @@ func AddCygxTagHistory(user *models.WxUserItem, tagId int) (err error) {
 	_, err = models.AddCygxTagHistory(historyRecord)
 	return
 }
+
+//func init() {
+//	conditionInit, err := GetConditionInitByTagIds("43")
+//	fmt.Println(err)
+//	fmt.Println()
+//	fmt.Println(conditionInit)
+//}
+
+func GetConditionInitByTagIds(tagIds string) (conditionInit string, err error) {
+	if tagIds == "" {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	var searchTag, industries, subjectNames []string
+	tagslice := strings.Split(tagIds, ",")
+	condition = ` AND tag_id IN (` + utils.GetOrmInReplace(len(tagslice)) + `)`
+	pars = append(pars, tagslice)
+	listTag, e := models.GetCygxTagListCondition(condition, pars, 0, 0)
+	if e != nil {
+		err = errors.New("GetActivityListByCondition, Err: " + e.Error())
+		return
+	}
+
+	for _, tagInfo := range listTag {
+		//ActivityTypes 与 ArticleTypes 进行合并
+		if tagInfo.ActivityTypes != "" {
+			sliceObj := strings.Split(tagInfo.ActivityTypes, ",")
+			for _, v := range sliceObj {
+				searchTag = append(searchTag, v)
+			}
+		}
+		if tagInfo.ArticleTypes != "" {
+			sliceObj := strings.Split(tagInfo.ArticleTypes, ",")
+			for _, v := range sliceObj {
+				searchTag = append(searchTag, v)
+			}
+		}
+		if tagInfo.Industries != "" {
+			sliceObj := strings.Split(tagInfo.Industries, ",")
+			for _, v := range sliceObj {
+				industries = append(industries, v)
+			}
+			//industries = append(industries, tagInfo.Industries)
+		}
+		if tagInfo.SubjectNames != "" {
+			sliceObj := strings.Split(tagInfo.SubjectNames, ",")
+			for _, v := range sliceObj {
+				subjectNames = append(subjectNames, v)
+			}
+			//subjectNames = append(subjectNames, tagInfo.SubjectNames)
+		}
+	}
+
+	//拼接search_tag 搜索内容
+	if len(searchTag) > 0 {
+		//search_tag_two 兼容报告类型一对多的这种,时间不够,产品也有可能变先这么做
+		conditionInit += " AND ( search_tag IN  ('" + strings.Join(searchTag, "','") + "')  OR search_tag_two IN( '" + strings.Join(searchTag, "','") + "' )  )"
+	}
+
+	var resourceDataIds []int //cygx_resource_data 主键ID
+	//如果产业有组合,那么就去捞产业相关的内容
+	if len(industries) > 0 {
+		var conditionIndustry string
+		var parsIndustry []interface{}
+		conditionIndustry += " AND industry_name IN  ('" + strings.Join(industries, "','") + "')"
+		listIndustry, e := models.GetTopOneMonthArtReadNumIndustryAll(conditionIndustry, parsIndustry)
+		if e != nil {
+			err = errors.New("GetTopOneMonthArtReadNumIndustryAll, Err: " + e.Error())
+			return
+		}
+		var industrialManagementIds []int // 产业ID合集
+		for _, v := range listIndustry {
+			industrialManagementIds = append(industrialManagementIds, v.IndustrialManagementId)
+		}
+
+		var conditionIndustryResource string
+		var parsIndustryResource []interface{}
+		lenArrindustrial := len(industrialManagementIds)
+		conditionIndustryResource = ` AND industrial_management_id IN (` + utils.GetOrmInReplace(lenArrindustrial) + `)`
+		parsIndustryResource = append(parsIndustryResource, industrialManagementIds)
+
+		if lenArrindustrial > 0 {
+			listResourceDataIndustrial, e := models.GetCygxResourceDataIndustrialGroupManagementList(conditionIndustryResource, parsIndustryResource, 0, 0)
+			//return
+			if e != nil {
+				err = errors.New("GetCygxResourceDataIndustrialGroupManagementList, Err: " + e.Error())
+				return
+			}
+			for _, v := range listResourceDataIndustrial {
+				resourceDataIds = append(resourceDataIds, v.ResourceDataId)
+			}
+		}
+	}
+	//return
+	//如果标的有组合,那么就去捞标的相关的内容
+	if len(subjectNames) > 0 {
+		var conditionsubject string
+		var parssubject []interface{}
+		conditionsubject += " AND subject_name IN  ('" + strings.Join(subjectNames, "','") + "')"
+		listsubject, e := models.GetCygxIndustrialSubjectListCondition(conditionsubject, parssubject)
+		if e != nil {
+			err = errors.New("GetTopOneMonthArtReadNumIndustry, Err: " + e.Error())
+			return
+		}
+		var industrialsubjectIds []int // 标的ID集合
+		for _, v := range listsubject {
+			industrialsubjectIds = append(industrialsubjectIds, v.IndustrialSubjectId)
+		}
+		var conditionsubjectResource string
+		var parssubjectResource []interface{}
+		lenArrsubject := len(industrialsubjectIds)
+		conditionsubjectResource = ` AND industrial_subject_id IN (` + utils.GetOrmInReplace(lenArrsubject) + `)`
+		parssubjectResource = append(parssubjectResource, industrialsubjectIds)
+		if lenArrsubject > 0 {
+			listResourceDatasubject, e := models.GetCygxResourceDataIndustrialGroupSubjectList(conditionsubjectResource, parssubjectResource, 0, 0)
+			if e != nil {
+				err = errors.New("GetCygxResourceDataIndustrialGroupSubjectList, Err: " + e.Error())
+				return
+			}
+			for _, v := range listResourceDatasubject {
+				resourceDataIds = append(resourceDataIds, v.ResourceDataId)
+			}
+		}
+	}
+
+	//拼接 cygx_resource_data 表主键查询ID
+	if len(resourceDataIds) > 0 {
+		var resourceDataIdStrs []string
+		resourceDataIdMap := make(map[int]bool)
+		for _, v := range resourceDataIds {
+			if resourceDataIdMap[v] {
+				continue
+			}
+			resourceDataIdStrs = append(resourceDataIdStrs, strconv.Itoa(v))
+			resourceDataIdMap[v] = true
+		}
+		conditionInit += " AND id IN  (" + strings.Join(resourceDataIdStrs, ",") + ") "
+	}
+	return
+}

+ 1 - 1
services/wx_template_msg.go

@@ -413,7 +413,7 @@ func SendActivitieCancelSignTemplateMsg(user *models.WxUserItem, activityDetail
 	}()
 	//获取销售手机号
 	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil {
 		return
 	}
 	configCode := utils.TPL_MSG_NEI_RONG_ZU

+ 9 - 6
services/yidong.go

@@ -11,7 +11,7 @@ import (
 	"time"
 )
 
-//GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
+// GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
 func GetActivityTypeIdWithYiDong(industrySwName string) (chartPermissionId int) {
 	mapIndustrySwName := map[string]int{
 		"家用电器": utils.XIAO_FEI_ID,
@@ -68,7 +68,7 @@ func GetActivityTypeIdWithYiDong(industrySwName string) (chartPermissionId int)
 	return
 }
 
-//GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
+// GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
 func GetActivityTypeNameWithYiDong(industrySwName string) (chartPermissionName string) {
 	mapIndustrySwName := map[string]string{
 		"家用电器": utils.XIAO_FEI_NAME,
@@ -125,7 +125,7 @@ func GetActivityTypeNameWithYiDong(industrySwName string) (chartPermissionName s
 	return
 }
 
-//获取易董token
+// 获取易董token
 func GetYiDongToken() (token string, err error) {
 	defer func() {
 		if err != nil {
@@ -176,12 +176,15 @@ func GetYiDongToken() (token string, err error) {
 	return
 }
 
-//生成用户相关信息接口 获取用户tgc
+// 生成用户相关信息接口 获取用户tgc
 func GetYiDongCreateUserInfo(user *models.WxUserItem) (userTgc string, err error) {
 	defer func() {
 		if err != nil {
 			fmt.Println(err)
-			go utils.SendAlarmMsg("生成用户相关信息接口 获取用户tgc失败:"+err.Error(), 2)
+			//易董测试环境有问题,先屏蔽一段时间
+			if utils.RunMode == "" {
+				go utils.SendAlarmMsg("生成用户相关信息接口 获取用户tgc失败:"+err.Error(), 2)
+			}
 			utils.FileLog.Info(err.Error())
 		}
 	}()
@@ -227,7 +230,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 {

+ 14 - 0
utils/constants.go

@@ -118,6 +118,7 @@ const (
 	COMPANY_PRODUCT_FICC_NAME = "ficc"
 	COMPANY_PRODUCT_RAI_ID    = 2
 	COMPANY_PRODUCT_RAI_NAME  = "权益"
+	ROLE_TYPE_RAI_PRODUCT     = "权益产品"
 )
 
 const (
@@ -177,6 +178,8 @@ const (
 	WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT = "reportPages/IndustryReport/IndustryReport?id="   //产业文章列表模板消息地址
 	WX_MSG_PATH_ACTIVITY_DETAIL          = "activityPages/activityDetail/activityDetail?id=" //活动模板消息地址
 	WX_MSG_PATH_APPLY_DETAIL             = "pages-message/applyFor/applyFor?id="             //潜在用户试用权限申请
+	WX_MSG_PATH_YX_SURVEY_DETAIL         = "pages-purchaser/survey/surveyDetail?surveyId="   //用户提交研选调研需求
+	WX_MSG_PATH_APPLY_COLLECTION_DETAIL  = "reportPages/bulletinDetail/bulletinDetail?id="   //精选看板申请详情页
 )
 
 // 微信模板消息推送公共接口的秘钥
@@ -210,6 +213,17 @@ const (
 	TPL_MSG_NEI_RONG_ZU         = "tpl_msg_nei_rong_zu"         //内容组四人
 )
 
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
+	MobileWuAngDi       = "18701809782" // 吴昂迪手机号
+)
+
+const (
+	COLLECTIONS_INFO_HTTP_URL = "https://vmp.hzinsights.com/v2/collections" // 上海策略平台精选看板路由
+)
+
 const (
 	CYGX_YANXUAN_SPECIAL           = "研选专栏"           //用户阅读数据
 )