Browse Source

Merge branch 'master' of http://8.136.199.33:3000/cxzhang/hongze_clpt into cygx_11.1

xingzai 1 year ago
parent
commit
eb27472faf

+ 52 - 36
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,6 +63,12 @@ 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 + `)`
@@ -145,9 +152,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 +209,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 +241,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,6 +258,16 @@ 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 + `)`
@@ -352,7 +374,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 +401,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 +461,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 +534,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 +574,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 +1709,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 {
@@ -1997,6 +2007,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 +2038,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 +2207,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 +2479,4 @@ func (this *ActivityController) ActivityVoiceHistoryAdd() {
 	br.Success = true
 	br.Msg = "操作成功"
 	return
-}
+}

+ 55 - 0
controllers/article.go

@@ -315,6 +315,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 +796,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 = "记录成功"
+}

+ 42 - 43
controllers/home.go

@@ -227,6 +227,7 @@ func (this *MobileHomeController) List() {
 					Abstract:    v.Abstract,
 					ImgUrlPc:    v.ImgUrlPc,
 					PublishDate: v.PublishDate,
+					IsResearch:  v.IsResearch,
 				})
 			}
 		}
@@ -285,11 +286,11 @@ func (this *MobileHomeController) NewList() {
 	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)
+	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 {
@@ -340,48 +341,48 @@ func (this *MobileHomeController) NewList() {
 				var articleTypeStr string
 				if articleType != "" {
 					articleTypeSlice := strings.Split(articleType, ",")
-					newArticleTypeSlice := make([]string,0)
+					newArticleTypeSlice := make([]string, 0)
 					for _, s := range articleTypeSlice {
-						newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
+						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 ) ) `
+					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)
+					newActivityTypeSlice := make([]string, 0)
 					for _, s := range activityTypeSlice {
-						newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+						newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
 					}
 					activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-					activityTypeStr = strings.TrimRight(activityTypeStr,",")
-					activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
+					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)
+					newIndustrieSlice := make([]string, 0)
 					for _, s := range industrieSlice {
-						newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+						newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
 					}
 					industryStr = strings.Join(newIndustrieSlice, ",")
 					industryStr = strings.TrimRight(industryStr, ",")
-					industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
+					industriesCond += ` AND im.industry_name In (` + industryStr + `) `
 				}
 				subjectNamesCond := ``
 				var subjectNameStr string
 				if subjectName != "" {
 					subjectNameSlice := strings.Split(subjectName, ",")
-					newSubjectNameSlice := make([]string,0)
+					newSubjectNameSlice := make([]string, 0)
 					for _, s := range subjectNameSlice {
-						newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+						newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
 					}
 					subjectNameStr = strings.Join(newSubjectNameSlice, ",")
 					subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-					subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
+					subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
 				}
 				articleTypeCondSlice = append(articleTypeCondSlice, articleTypeCond)
 				activityTypesCondSlice = append(activityTypesCondSlice, activityTypesCond)
@@ -401,61 +402,61 @@ func (this *MobileHomeController) NewList() {
 		return
 	}
 
-	articleTypes = strings.TrimRight(articleTypes,",")
-	activityTypes = strings.TrimRight(activityTypes,",")
-	industries = strings.TrimRight(industries,",")
-	subjectNames = strings.TrimRight(subjectNames,",")
+	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)
+		newArticleTypeSlice := make([]string, 0)
 		for _, s := range articleTypeSlice {
-			newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
+			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 ) ) `
+		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)
+		newActivityTypeSlice := make([]string, 0)
 		for _, s := range activityTypeSlice {
-			newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+			newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
 		}
 		activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-		activityTypeStr = strings.TrimRight(activityTypeStr,",")
-		activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
+		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)
+		newIndustrieSlice := make([]string, 0)
 		for _, s := range industrieSlice {
-			newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+			newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
 		}
 		industryStr = strings.Join(newIndustrieSlice, ",")
 		industryStr = strings.TrimRight(industryStr, ",")
-		industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
+		industriesCond += ` AND im.industry_name In (` + industryStr + `) `
 	}
 	subjectNamesCond := ``
 	var subjectNameStr string
 	if subjectNames != "" {
 		subjectNameSlice := strings.Split(subjectNames, ",")
-		newSubjectNameSlice := make([]string,0)
+		newSubjectNameSlice := make([]string, 0)
 		for _, s := range subjectNameSlice {
-			newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+			newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
 		}
 		subjectNameStr = strings.Join(newSubjectNameSlice, ",")
 		subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-		subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
+		subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
 	}
 
-	var tagArticleIds,tagActivityIds, mmIds string
-	if articleTypesCond != "" || activityTypesCond != "" || industryStr != "" || 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 = "获取失败"
@@ -522,7 +523,6 @@ func (this *MobileHomeController) NewList() {
 		}
 		lenActivityIds := len(activityIds)
 
-
 		listActivitySpecial, _, err := services.GetActivitySpecialList(user, 1, 200, "", "", "")
 		if err != nil {
 			br.Msg = "获取失败"
@@ -536,7 +536,6 @@ func (this *MobileHomeController) NewList() {
 		}
 		lenActivityspecialIds := len(activityspecialIds)
 
-
 		if tagIds != "" {
 			if tagArticleIds != "" {
 				condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
@@ -574,12 +573,12 @@ func (this *MobileHomeController) NewList() {
 			pars = append(pars, activityIds)
 		}
 
-		if lenActivityspecialIds > 0  && tagIds == "" {
+		if lenActivityspecialIds > 0 && tagIds == "" {
 			condition += ` OR ( source = 'activityspecial' AND source_id IN (` + utils.GetOrmInReplace(lenActivityspecialIds) + `) ` + conditionInit + ` )   `
 			pars = append(pars, activityspecialIds)
 		}
 	}
-	fmt.Println("condition:",condition)
+	fmt.Println("condition:", condition)
 	total, err = models.GetResourceDataCount(condition, pars)
 	if err != nil {
 		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

+ 2 - 8
controllers/user.go

@@ -915,23 +915,17 @@ func (this *UserController) CollectList() {
 		list[i].DepartmentId = article.DepartmentId
 		list[i].NickName = article.NickName
 		list[i].PublishDate = article.PublishDate
-		if article.ArticleId < utils.SummaryArticleId {
+		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
 		}
-		//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

+ 92 - 89
models/activity.go

@@ -64,94 +64,95 @@ 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"`
+	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:"副行业名称"`
 }
 
 // 活动详情
@@ -267,7 +268,7 @@ type CygxActivityResp struct {
 // 列表
 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 +562,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 +605,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
+}

+ 47 - 48
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 {
@@ -364,12 +369,11 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 			artSql += articleTypesCond
 		}
 		err = o.Raw(artSql).QueryRow(&artIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
 
-
 	actSql += ` WHERE 1=1 `
 	if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 		if industryStr != "" && subjectNameStr != "" {
@@ -382,7 +386,7 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 			actSql += activityTypesCond
 		}
 		err = o.Raw(actSql).QueryRow(&actIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
@@ -390,14 +394,14 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 	if strings.Contains(articleTypeStr, "晨会精华") {
 		mmSql += ` WHERE 1=1 `
 		if industryStr != "" && subjectNameStr != "" {
-			mmSql +=  ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+			mmSql += ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
 		} else if industryStr == "" && subjectNameStr != "" {
 			mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 		} else if industryStr != "" && subjectNameStr == "" {
 			mmSql += ` AND im.industry_name In (` + industryStr + `) `
 		}
 		err = o.Raw(mmSql).QueryRow(&mmIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
@@ -405,7 +409,6 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 	return
 }
 
-
 // 单个tag时用,取合集
 func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice []string) (artIds, actIds, mmIds string, err error) {
 	o := orm.NewOrm()
@@ -416,7 +419,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 	mmSql := ` SELECT GROUP_CONCAT(DISTINCT mmc.id SEPARATOR ',') AS mm_ids FROM cygx_morning_meeting_review_chapter as mmc `
 
 	for _, s := range industriesCondSlice {
-		if s != ""{
+		if s != "" {
 			artSql += ` INNER JOIN cygx_industrial_article_group_management  AS iam ON iam.article_id = art.article_id 
 				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=iam.industrial_management_id  `
 			actSql += ` INNER JOIN cygx_industrial_activity_group_management  AS iam ON iam.activity_id = act.activity_id 
@@ -428,7 +431,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 		}
 	}
 	for _, s := range subjectNamesSlice {
-		if s != ""{
+		if s != "" {
 			artSql += ` INNER JOIN cygx_industrial_article_group_subject  AS ias ON ias.article_id = art.article_id 
 				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=ias.industrial_subject_id  `
 			actSql += ` INNER JOIN cygx_industrial_activity_group_subject  AS ias ON ias.activity_id = act.activity_id 
@@ -450,7 +453,6 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 		subjectNameStr := subjectNamesSlice[i]
 		articleTypeStr := articleTypeSlice[i]
 
-
 		if articleTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 			if industryStr != "" && subjectNameStr != "" {
 				artSql += articleTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
@@ -462,7 +464,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				artSql += articleTypesCond
 			}
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				artSql += `)) `
 			} else {
 				artSql += `) OR (1=1 `
@@ -471,8 +473,6 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 			isNeedArt = true
 		}
 
-
-
 		if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 			if industryStr != "" && subjectNameStr != "" {
 				actSql += activityTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
@@ -484,7 +484,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				actSql += activityTypesCond
 			}
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				actSql += `)) `
 			} else {
 				actSql += `) OR (1=1 `
@@ -495,14 +495,14 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 
 		if strings.Contains(articleTypeStr, "晨会精华") {
 			if industryStr != "" && subjectNameStr != "" {
-				mmSql +=  ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+				mmSql += ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
 			} else if industryStr == "" && subjectNameStr != "" {
 				mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 			} else if industryStr != "" && subjectNameStr == "" {
 				mmSql += ` AND im.industry_name In (` + industryStr + `) `
 			}
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				mmSql += `)) `
 			} else {
 				mmSql += `) OR (1=1 `
@@ -514,23 +514,22 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 
 	if isNeedArt {
 		err = o.Raw(artSql).QueryRow(&artIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
-	if isNeedAct{
+	if isNeedAct {
 		err = o.Raw(actSql).QueryRow(&actIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
 	if isNeedMm {
 		err = o.Raw(mmSql).QueryRow(&mmIds)
-		if err != nil{
+		if err != nil {
 			return
 		}
 	}
 
-
 	return
 }

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

+ 3 - 0
models/db.go

@@ -78,6 +78,9 @@ func init() {
 		new(CygxActivitySpecialMeetingDetail),
 		new(CygxActivityVoiceHistory),
 		new(CygxApplyCollection),
+		new(CygxActivitySpecialInheritPointsCompany),
+		new(CygxArticleApplyAppointmentExpert),
+		new(CygxBannerYxSurvey),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 3 - 0
models/report.go

@@ -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
@@ -792,6 +793,8 @@ type ArticleReportBillboardResp struct {
 	Pv             int    `description:"PV"`
 	CollectNum     int    `description:"收藏人数"`
 	Source         int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	ArticleTypeId  int    `description:"文章类型ID判断是否是研选使用"`
+	IsResearch     bool   `description:"是否属于研选"`
 	List           []*IndustrialManagementIdInt
 }
 

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

+ 27 - 0
routers/commentsRouter.go

@@ -214,6 +214,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 +277,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 +295,15 @@ 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",

+ 323 - 10
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) {
+
+	//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+	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,277 @@ 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
+
+			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,
+		}
+		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 +1274,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,14 +1290,20 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
 	}
+
+	//如果是易董的活动,主、副权限有一个满足即可
+	if activityInfo.YidongActivityId != "" {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName) || strings.Contains(permissionStr, activityInfo.ChartPermissionNameDeputy) {
+			havePower = true
+			return
+		}
+	}
+
 	//如果权限不包含那么直接返回
 	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
 		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.IsResearchPoints {
 		//获取活动对用户要扣的点
@@ -1000,10 +1313,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

+ 5 - 0
services/activity_button.go

@@ -395,6 +395,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()) {

+ 30 - 2
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)
@@ -719,3 +720,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
+}

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

+ 8 - 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,7 @@ 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="   //精选看板申请详情页
 )
 
@@ -211,6 +213,12 @@ const (
 	TPL_MSG_NEI_RONG_ZU         = "tpl_msg_nei_rong_zu"         //内容组四人
 )
 
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
+)
+
 const (
 	COLLECTIONS_INFO_HTTP_URL = "https://vmp.hzinsights.com/v2/collections" // 上海策略平台精选看板路由
 )