Răsfoiți Sursa

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into cygx_11.1

xingzai 1 an în urmă
părinte
comite
b2446bfceb

+ 70 - 44
controllers/activity.go

@@ -216,7 +216,7 @@ func (this *ActivityCoAntroller) ScheduleList() {
 			list[k].IsShowSustainable = true
 		}
 		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 {
@@ -529,7 +529,7 @@ func (this *ActivityCoAntroller) Detail() {
 		} else {
 			activityInfo.ArticleList = make([]*models.ActivityArticleResp, 0)
 		}
-		if (activityInfo.ActivityTypeId == 5 || activityInfo.ActivityTypeId == 6) && services.GetBelongingRai(user.Mobile) && activityInfo.SigninImg != "" {
+		if services.GetBelongingRai(user.Mobile) && activityInfo.SigninImg != "" {
 			activityInfo.IsShowSigninButton = true
 			activityInfo.IsShowSignUpDetail = true
 		}
@@ -867,7 +867,6 @@ func (this *ActivityCoAntroller) SignupAdd() {
 		resp.IsResearch = true
 	}
 
-
 	//公司线下调研活动客户报名后给建会人,所属销售推送模板信息
 	if signupStatus == "Success" {
 		go services.SendResearchActivitiesTemplateMsg(user, activityInfo)
@@ -1010,7 +1009,7 @@ func (this *ActivityCoAntroller) SignupCancel() {
 	if activityInfo.ActivityTypeId == 5 {
 		go services.SendActivitieCancelSignTemplateMsg(user, activityInfo)
 	}
-	
+
 	go services.YanXuanActivityPointsBillSignupCancel(activityId, uid) // 用户取消报名添加到处理研选扣点
 	br.Ret = 200
 	br.Success = true
@@ -1021,6 +1020,7 @@ func (this *ActivityCoAntroller) SignupCancel() {
 // @Title  用户搜索详情
 // @Description 获取用户搜索详情接口
 // @Param   IsShowJurisdiction   query   int  true       "是否仅展示有权限的,默认为0,1是,2否 "
+// @Param   IsHideResearch   query   int  true       "是否隐藏研选行业 "
 // @Success Ret=200 {object} models.ActivityUserSearchContentList
 // @router /getUserSearchContent [get]
 func (this *ActivityCoAntroller) GetUserSearchContent() {
@@ -1036,6 +1036,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 		br.Ret = 408
 		return
 	}
+	isHideResearch, _ := this.GetBool("IsHideResearch", false)
 	uid := user.UserId
 	detailSeearch := new(models.CygxActivityUserSearchContent)
 	detailSeearch.IsShowJurisdiction = 0
@@ -1112,7 +1113,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 	}
 	var listChartPermissionidNew2 []*models.ActivityChartPermission
 	for _, v := range list2 {
-		if userType == 1 {
+		if userType == 1 || isHideResearch {
 			//if v.PermissionName != "研选" {
 			if !strings.Contains(v.PermissionName, "研选") {
 				listChartPermissionidNew2 = append(listChartPermissionidNew2, v)
@@ -1124,7 +1125,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 	resp.ListChartPermission2 = listChartPermissionidNew2
 	var listChartPermissionidNew []*models.ActivityChartPermission
 	for _, v := range listChartPermissionid {
-		if userType == 1 {
+		if userType == 1 || isHideResearch {
 			if !strings.Contains(v.PermissionName, "研选") {
 				listChartPermissionidNew = append(listChartPermissionidNew, v)
 			}
@@ -1701,6 +1702,7 @@ func (this *ActivityCoAntroller) LabelMoreList() {
 // @Param   TypeName   query   string  false       "电话会类型 ,1专家电话会 2分析师电话会"
 // @Param   IsExternalLabel   query   int  false       "是否仅展示外部资源 1:是、0:否 默认0"
 // @Param   IsResearchPoints   query   string  false       "是否仅展示研选扣点 1:展示研选扣点、2:展示外部资源 ,1,2两者都展示" //兼容前端
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listNew [get]
 func (this *ActivityCoAntroller) ActivityListNew() {
@@ -1733,7 +1735,7 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	activityId, _ := this.GetInt("ActivityId") // 仅用于判断【新】标签
 	//isExternalLabel, _ := this.GetInt("IsExternalLabel")   //
 	isResearchPoints := this.GetString("IsResearchPoints") //
-
+	isResearch, _ := this.GetBool("IsResearch", false)     // 是否为研选 查研观向11.0 (研选活动独立显示)
 	if label == "undefined" {
 		label = ""
 	}
@@ -1773,6 +1775,14 @@ func (this *ActivityCoAntroller) 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 + `)`
@@ -1913,8 +1923,8 @@ func (this *ActivityCoAntroller) 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  `
 	}
 	//conditionActivityKey += condition + conditionOrder
@@ -1976,7 +1986,7 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 			list[k].IsShowSustainable = 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
 		}
@@ -2056,9 +2066,9 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 			list[k].AudioLink = true
 			list[k].VideoDetail = mapActivityVideo[v.ActivityId]
 		}
-		resp.List = append(resp.List, services.ActivityButtonShow(v))
+		//resp.List = append(resp.List, services.ActivityButtonShow(v))
 	}
-
+	resp.List = services.ActivityArrButtonShow(activityList)
 	// 查研观向7.4-判断标签是否为产业, 为产业时是否跳转资源包
 	if label != "" {
 		industry, e := models.GetIndustryByName(label)
@@ -2197,6 +2207,7 @@ func (this *ActivityCoAntroller) CheckAsk() {
 // @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
 // @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.ActivityTypeListHomeResp
 // @router /labelTypeListV5 [get]
 func (this *ActivityCoAntroller) LabelTypeListV5() {
@@ -2216,7 +2227,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	whichDay := this.GetString("WhichDay")
 	activeState := this.GetString("ActiveState")
-
+	isResearch, _ := this.GetBool("IsResearch", false) // 是否为研选 查研观向11.0 (研选活动独立显示)
 	//入参为 undefined 时的处理
 	if chartPermissionIds == "undefined" {
 		chartPermissionIds = ""
@@ -2227,6 +2238,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	if activeState == "undefined" || activeState == "" {
 		activeState = "1"
 	}
+
 	// 查研观向7.4-始终查询宏观的活动
 	if chartPermissionIds != "" {
 		chartPermissionIds += ",1"
@@ -2267,14 +2279,14 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	permissionNameStr = strings.Replace(permissionNameStr, "(主观)", "", -1)
 	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
 	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
-	//
-	//// 查研观向7.4-始终查询宏观的权限(无论是否有权限)
-	//if permissionNameStr == `` {
-	//	permissionNameStr = `'宏观'`
-	//} else {
-	//	permissionNameStr += `, '宏观'`
-	//}
 
+	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 + `)`
@@ -2329,7 +2341,6 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	} else {
 		conditioninit += ` AND art.active_state  IN (1,2)`
 	}
-
 	var condition string
 	//conditionActivity, err := services.GetActivityonditionList(user, "", chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0, 1)
 
@@ -2374,20 +2385,34 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		}
 		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
+		}
 		item.IsExternalLabel = v.IsExternalLabel
 
 		mapActivity[v.ActivityTypeId] = append(mapActivity[v.ActivityTypeId], item)
 		mapkeyWord[fmt.Sprint(v.ActivityTypeId, "-", item.KeyWord)] = item.KeyWord
 	}
 	//
-	list, err := models.GetActivityTypeHomeList()
+	var conditionType string
+	var parsType []interface{}
+	if isResearch {
+		conditionType = "  AND  source_type IN (0,2) "
+	} else {
+		conditionType = " AND source_type IN (0,1) "
+	}
+	list, err := models.GetActivityTypeHomeList(conditionType, parsType)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-
 	resp := new(models.ActivityTypeListHomeResp)
 	for k, v := range list {
 		if len(mapActivity[v.ActivityTypeId]) > 0 {
@@ -2429,11 +2454,9 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		return
 	}
 	for k, _ := range list {
-		//if v.ActivityTypeId == 1 {
 		for k2 := range list[k].List {
 			list[k].List[k2].IsNew = newLabelMap[list[k].List[k2].ActivityId]
 		}
-		//}
 	}
 
 	var itemsNew []*models.ActivityTypeHome
@@ -2482,23 +2505,25 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 			}
 		}
 	}
+	//研选互动不展示专项产业调研
+	if !isResearch {
+		//查询专项产业调研展示权限 仅对大套餐客户跟永续客户展示
+		if whichDay == "" {
 
-	//查询专项产业调研展示权限 仅对大套餐客户跟永续客户展示
-	if whichDay == "" {
-
-		speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取失败,Err:" + err.Error()
-			return
-		}
-		if leftPx > rightPx {
-			speciaItem.Position = 2
-		} else {
-			speciaItem.Position = 1
-		}
-		if len(speciaItem.List) > 0 {
-			itemsNew = append(itemsNew, speciaItem)
+			speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			if leftPx > rightPx {
+				speciaItem.Position = 2
+			} else {
+				speciaItem.Position = 1
+			}
+			if len(speciaItem.List) > 0 {
+				itemsNew = append(itemsNew, speciaItem)
+			}
 		}
 	}
 	//记录用户搜索的筛选条件
@@ -3147,7 +3172,7 @@ func (this *ActivityCoAntroller) SpecialMsg() {
 // @Param   WhichDay   query   string  false       "哪一天 今天:1、明天:2,多个用 , 隔开"
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
 // @Success 200 {object} models.ActivityTypeListHomeRespPc
-// @router /labelTypeListV6Pc [get]
+// @router /labelTypeListV6Pc_del [get]
 func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -3738,6 +3763,7 @@ func (this *ActivityCoAntroller) ActivityVideoHistoryAdd() {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listSearch [get]
 func (this *ActivityCoAntroller) ActivityListSearch() {
@@ -3844,8 +3870,8 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	var conditionSpecial string
 	var sortTime string
 	var pars []interface{}
-	//已结束的活动
-	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.active_state = 3 `
+	//已结束的活动  不展示研选 11.0
+	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.active_state = 3  AND art.chart_permission_id !=  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
 	if whichDay != "" {
 		var startDate string
 		var endDate string

+ 56 - 0
controllers/article.go

@@ -90,6 +90,7 @@ func (this *ArticleController) Detail() {
 	if strings.Contains(detail.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 		detail.IsResearch = true
 	}
+
 	// 高毅资产的联系人,有权限的行业也不能查看报告详情页。提示无权限页面
 	if detail.ArticleTypeId == 0 && user.CompanyId == utils.GAO_YI_ZI_CHAN_COMPANY_ID {
 		_, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
@@ -422,6 +423,9 @@ Loop:
 			detail.ReportLink += "?token=" + chartUserTokenByMobile
 		}
 	}
+	if detail.ArticleTypeId == 14 {
+		detail.IsApplyAppointmentExpert = true //判断文章类型是否属于专家访谈  查研观向11.0
+	}
 	resp.HasPermission = hasPermission
 	resp.HaveResearch = haveResearch
 	resp.Detail = detail
@@ -1640,3 +1644,55 @@ func (this *ArticleCommonController) PageHistoryPublic() {
 	br.Success = true
 	br.Msg = "新增成功"
 }
+
+// @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 = "操作成功"
+}

+ 132 - 0
controllers/banner.go

@@ -4,6 +4,8 @@ import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
+	"time"
 )
 
 // Banner
@@ -95,3 +97,133 @@ func (this *BannerController) History() {
 	br.Success = true
 	br.Msg = "记录成功"
 }
+
+// @Title 研选banner列表
+// @Description 研选banner列表接口
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /listYx [get]
+func (this *BannerController) ListYx() {
+	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
+	}
+	resp := new(models.BannerUrlYxListResp)
+	var listA []*models.BannerUrlYxResp
+	var listB []*models.BannerUrlYxResp
+	listA = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/1.png", Path: "pages-purchaser/leaflet/leaflet?leafletImage=https%3A%2F%2Fhzstatic.hzinsights.com%2Fcygx%2Fconfig%2Fresearch_11_0.png"},
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/2.png", Path: "pages-purchaser/survey/surveySubmit"},
+	}
+
+	listB = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/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 = "记录成功"
+}
+
+// @Title 我要调研内容详情
+// @Description 我要调研内容详情接口
+// @Param   SuveryId   query   int  true       "ID"
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /yxSurvey/detail [get]
+func (this *BannerController) YxSurveyDetail() {
+	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
+	}
+	suveryId, _ := this.GetInt("SuveryId")
+	resp := new(models.CygxBannerYxSurveyRespDetailResp)
+	detail, err := models.GetCygxBannerYxSurveyDetail(suveryId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 40 - 100
controllers/home.go

@@ -559,64 +559,6 @@ func (this *HomeController) ListHomeArtAndChart() {
 			list = homeList
 		}
 
-		////研选的五张图片
-		//detailResearch, err := models.GetConfigByCode("category_research_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "获取数据研选分类图片失败,Err:" + err.Error()
-		//	return
-		//}
-		//researchList := strings.Split(detailResearch.ConfigValue, "{|}")
-		////对应分类的所图片
-		//detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "行业配置信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//categoryUrlList := strings.Split(detailCategoryUrl.ConfigValue, "{|}")
-		//mapCategoryUrl := make(map[string]string)
-		//var categoryId string
-		//var imgUrlChart string
-		//for _, v := range categoryUrlList {
-		//	vslice := strings.Split(v, "_")
-		//	categoryId = vslice[0]
-		//	imgUrlChart = vslice[len(vslice)-1]
-		//	mapCategoryUrl[categoryId] = imgUrlChart
-		//}
-		//
-		//for k, v := range list {
-		//	if v.HomeType != 0 {
-		//		continue
-		//	}
-		//	item := list[k]
-		//	//如果文章一开始的内容是图片,优先展示第一张图片
-		//	imgurl, _ := services.FixArticleImgUrl(html.UnescapeString(list[k].Body))
-		//	newBody, _ := services.GetReportContentTextSubByarticle(item.Body, item.Annotation, item.ArticleId)
-		//	list[k].Body = newBody
-		//	if imgurl != "" {
-		//		list[k].BodyHtml = imgurl
-		//	}
-		//	list[k].PublishDate = utils.StrTimeToTime(item.PublishDate).Format(utils.FormatDate) //时间字符串格式转时间格式
-		//	if strings.Contains(item.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		//		list[k].IsResearch = true
-		//	}
-		//	if item.Pv > 999 {
-		//		list[k].Pv = 999
-		//	}
-		//	//如果是研选系列的任意取五张图片的中的一张
-		//	if v.CategoryId == "0" {
-		//		knum := v.ArticleId % 5
-		//		list[k].ImgUrlPc = researchList[knum]
-		//	} else {
-		//		list[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
-		//	}
-		//	if list[k].ArticleId < utils.SummaryArticleId {
-		//		list[k].HttpUrl = utils.StrategyPlatform + strconv.Itoa(v.ArticleId)
-		//		list[k].IsNeedJump = true
-		//	}
-		//	list[k].Source = 1
-		//}
 		resp.List, err = services.HandleArticleCategoryImg(list)
 		if err != nil {
 			br.Msg = "获取信息失败"
@@ -684,11 +626,11 @@ func (this *HomeController) NewList() {
 	}
 
 	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 {
@@ -739,48 +681,48 @@ func (this *HomeController) 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)
@@ -800,61 +742,61 @@ func (this *HomeController) 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 = "获取失败"
@@ -923,7 +865,6 @@ func (this *HomeController) NewList() {
 		}
 		lenActivityIds := len(activityIds)
 
-
 		listActivitySpecial, _, err := services.GetActivitySpecialList(user, 1, 200, "")
 		if err != nil {
 			br.Msg = "获取失败"
@@ -937,7 +878,6 @@ func (this *HomeController) NewList() {
 		}
 		lenActivityspecialIds := len(activityspecialIds)
 
-
 		if tagIds != "" {
 			if tagArticleIds != "" {
 				condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
@@ -975,7 +915,7 @@ func (this *HomeController) 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)
 		}

+ 7 - 0
controllers/search.go

@@ -597,6 +597,7 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 	resp.ChartList = chartList
 	var result []*models.SearchItem
 	var total int64
+	var articleIds []int
 	if listType == 1 || listType == 2 {
 		//添加映射关系
 		keyWord = strings.ToUpper(keyWord)
@@ -668,6 +669,7 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 			}
 			result[k].Source = 1
 			v.PublishDate = utils.TimeRemoveHms(v.PublishDate)
+			articleIds = append(articleIds, v.ArticleId)
 		}
 	}
 	//记录用户搜索关键词
@@ -688,6 +690,11 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 	}
 	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 - 1
controllers/user.go

@@ -568,10 +568,11 @@ 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

+ 162 - 154
models/activity.go

@@ -11,63 +11,66 @@ import (
 
 // 活动详情
 type CygxActivity struct {
-	ActivityId              int       `orm:"column(activity_id);pk";description:"活动ID 等于0新增活动,大于0修改活动"`
-	ActivityTypeId          int       `description:"活动类型id"`
-	ActivityTypeName        string    `description:"活动类型名称"`
-	ChartPermissionId       int       `description:"行业id"`
-	ChartPermissionName     string    `description:"行业名称"`
-	ChartPermissionNames    string    `description:"行业名称辅助字段,区分研选子分类"`
-	Body                    string    `description:"内容"`
-	CreateTime              time.Time `description:"创建时间"`
-	IsLimitPeople           int       `description:"是否限制人数 1是,0否"`
-	LimitPeopleNum          int       `description:"限制的人数数量"`
-	CustomerTypeIds         string    `description:"活动可见的客户类型,多个ID用 , 隔开"`
-	PublishStatus           int       `description:"发布状态 1已发布,0未发布"`
-	LastUpdatedTime         time.Time `description:"更新时间"`
-	ActivityTime            string    `description:"活动时间"`
-	ActivityTimeText        string    `description:"活动时间带文字"`
-	DistinguishedGuest      string    `description:"嘉宾"`
-	Host                    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:"活动名称"`
-	ActivityNameTask        string    `description:"活动名称定时任务同步的时候使用"`
-	OnlineParticipation     string    `description:"网络参会"`
-	ReportLink              string    `description:"报告链接"`
-	City                    string    `description:"城市"`
-	Address                 string    `description:"活动地址"`
-	Highlights              string    `description:"活动亮点"`
-	Remarks                 string    `description:"备注"`
-	Speaker                 string    `description:"主讲人"`
-	ArticleId               int       `description:"关联报告id"`
-	Label                   string    `description:"标签"`
-	LinkParticipants        string    `description:"链接参会"`
-	AppAttendance           string    `description:"App参会"`
-	ConferencePassword      string    `description:"会议密码"`
-	TemporaryLabel          string    `description:"临时标签"`
-	IsMakerShow             int       `description:"是否仅决策人可见 0,否 、1,是"`
-	VisibleRange            int       `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
-	Scale                   string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	IsShowSubjectName       int       `description:"小程序内是否展示标的名称 1是 ,0 否 默认0 "`
-	IsHideAppointment       int       `description:"是否隐藏预约纪要按钮 1是 ,0 否 默认0 "`
-	AdminId                 int       `description:"销售/管理员ID"`
-	AdminName               string    `description:"销售/管理员姓名"`
-	IsCanAppointmentMinutes int       `description:"是否可预约纪要 1是 ,0 否 默认0 "`
-	YidongActivityId        string    `description:"易董活动ID"`
-	YidongActivityUrl       string    `description:"易董活动跳转地址"`
-	YidongActivityEndTime   string    `description:"易董活动截止时间"`
-	ActivityJoinType        string    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
-	YidongSignUpEnd         string    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
-	YidongSignUpStart       string    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
-	IsExternalLabel         int       `description:"是否为外部资源 1是,0否"`
-	YidongActivityIdByCygx  string    `description:"通过查研观向建会易董返回的活动ID"`
-	JmcjRoadshowTitle       string    `description:"进门财经的活动标题"`
-	JmcjActivityId          string    `description:"进门财经的活动ID"`
+	ActivityId                int       `orm:"column(activity_id);pk";description:"活动ID 等于0新增活动,大于0修改活动"`
+	ActivityTypeId            int       `description:"活动类型id"`
+	ActivityTypeName          string    `description:"活动类型名称"`
+	ChartPermissionId         int       `description:"行业id"`
+	ChartPermissionName       string    `description:"行业名称"`
+	ChartPermissionNames      string    `description:"行业名称辅助字段,区分研选子分类"`
+	IsShowHz                  int       `description:"是否同时在弘则展示  1是,0否"`
+	ChartPermissionIdDeputy   int       `description:"行业id"`
+	ChartPermissionNameDeputy string    `description:"副行业名称"`
+	Body                      string    `description:"内容"`
+	CreateTime                time.Time `description:"创建时间"`
+	IsLimitPeople             int       `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum            int       `description:"限制的人数数量"`
+	CustomerTypeIds           string    `description:"活动可见的客户类型,多个ID用 , 隔开"`
+	PublishStatus             int       `description:"发布状态 1已发布,0未发布"`
+	LastUpdatedTime           time.Time `description:"更新时间"`
+	ActivityTime              string    `description:"活动时间"`
+	ActivityTimeText          string    `description:"活动时间带文字"`
+	DistinguishedGuest        string    `description:"嘉宾"`
+	Host                      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:"活动名称"`
+	ActivityNameTask          string    `description:"活动名称定时任务同步的时候使用"`
+	OnlineParticipation       string    `description:"网络参会"`
+	ReportLink                string    `description:"报告链接"`
+	City                      string    `description:"城市"`
+	Address                   string    `description:"活动地址"`
+	Highlights                string    `description:"活动亮点"`
+	Remarks                   string    `description:"备注"`
+	Speaker                   string    `description:"主讲人"`
+	ArticleId                 int       `description:"关联报告id"`
+	Label                     string    `description:"标签"`
+	LinkParticipants          string    `description:"链接参会"`
+	AppAttendance             string    `description:"App参会"`
+	ConferencePassword        string    `description:"会议密码"`
+	TemporaryLabel            string    `description:"临时标签"`
+	IsMakerShow               int       `description:"是否仅决策人可见 0,否 、1,是"`
+	VisibleRange              int       `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
+	Scale                     string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	IsShowSubjectName         int       `description:"小程序内是否展示标的名称 1是 ,0 否 默认0 "`
+	IsHideAppointment         int       `description:"是否隐藏预约纪要按钮 1是 ,0 否 默认0 "`
+	AdminId                   int       `description:"销售/管理员ID"`
+	AdminName                 string    `description:"销售/管理员姓名"`
+	IsCanAppointmentMinutes   int       `description:"是否可预约纪要 1是 ,0 否 默认0 "`
+	YidongActivityId          string    `description:"易董活动ID"`
+	YidongActivityUrl         string    `description:"易董活动跳转地址"`
+	YidongActivityEndTime     string    `description:"易董活动截止时间"`
+	ActivityJoinType          string    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
+	YidongSignUpEnd           string    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
+	YidongSignUpStart         string    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
+	IsExternalLabel           int       `description:"是否为外部资源 1是,0否"`
+	YidongActivityIdByCygx    string    `description:"通过查研观向建会易董返回的活动ID"`
+	JmcjRoadshowTitle         string    `description:"进门财经的活动标题"`
+	JmcjActivityId            string    `description:"进门财经的活动ID"`
 }
 
 type ActivityCheck struct {
@@ -141,98 +144,101 @@ type ActivityArticleResp struct {
 
 // 活动详情
 type ActivityDetail struct {
-	ActivityId              int                        `orm:"column(activity_id);pk";description:"活动ID "`
-	ActivityTypeId          int                        `description:"活动类型id"`
-	PublishStatus           int                        `description:"发布状态,0未发布,1已发布"`
-	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-视频"`
-	IsCollect               bool                       `description:"是否收藏"`
-	SourceType              int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
-	TripImgLink             string                     `description:"专项产业调研行程链接"`
-	ActivityTimeEnd         string                     `description:"专项产业调研活动预期结束时间"`
-	IsShowFollowButton      bool                       `description:"是否展示关注取关按钮"`
-	IsFollowButton          bool                       `description:"是否关注"`
-	IsYidongConduct         bool                       `description:"是否属于易董办会 1:是 、0:否"`
-	IsCanOutboundCall       int                        `description:"是否提供外呼 1:是 、0:否"`
-	TencentConferenceNumber string                     `description:"腾讯会议号"`
-	YidongActivityIdByCygx  string                     `description:"通过查研观向建会易董返回的活动ID"`
-	IsShowSigninButton      bool                       `description:"是否展示签到码按钮"`
-	IsShowSignUpDetail      bool                       `description:"是否展示报名详情按钮"`
-	SigninImg               string                     `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"`
+	PublishStatus             int                        `description:"发布状态,0未发布,1已发布"`
+	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:"是否属于研选"`
+	IsResearchSpecial         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-视频"`
+	IsCollect                 bool                       `description:"是否收藏"`
+	SourceType                int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
+	TripImgLink               string                     `description:"专项产业调研行程链接"`
+	ActivityTimeEnd           string                     `description:"专项产业调研活动预期结束时间"`
+	IsShowFollowButton        bool                       `description:"是否展示关注取关按钮"`
+	IsFollowButton            bool                       `description:"是否关注"`
+	IsYidongConduct           bool                       `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall         int                        `description:"是否提供外呼 1:是 、0:否"`
+	TencentConferenceNumber   string                     `description:"腾讯会议号"`
+	YidongActivityIdByCygx    string                     `description:"通过查研观向建会易董返回的活动ID"`
+	IsShowSigninButton        bool                       `description:"是否展示签到码按钮"`
+	IsShowSignUpDetail        bool                       `description:"是否展示报名详情按钮"`
+	SigninImg                 string                     `description:"签到码图片"`
+	IsNeedEmail               int                        `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline           string                     `description:"报名截止时间"`
+	IsExternalLabel           bool                       `description:"是否为外部资源"`
+	IsResearchPoints          bool                       `description:"是否为研选扣点"`
+	ImgUrlBgYx                string                     `description:"研选背景图片"`
+	CancelDeadline            string                     `description:"取消报名截止时间"`
+	ChartPermissionNameDeputy string                     `description:"副行业名称"`
 }
 type ListArticleActivity struct {
 	Title   string `description:"文章标题"`
@@ -551,7 +557,7 @@ func UpdateActivitySattusToHaveInHand() (err error) {
 	condition += ` AND activity_time < NOW()`
 	sqlOr = condition
 	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time > ` + "'" + resultTime_30 + "'" + ")"
-	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
+	condition += ` OR(activity_type_id IN ( 4, 5, 6, 8 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
 	msql := " UPDATE cygx_activity SET active_state = 2 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
 	return
@@ -574,7 +580,7 @@ func UpdateActivitySattusToComplete() (err error) {
 	//condition += ` AND activity_time < NOW()`
 	//sqlOr = condition
 	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time < ` + "'" + resultTime_30 + "'" + ")"
-	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time < ` + "'" + resultTime_60 + "'" + ")"
+	condition += ` OR(activity_type_id IN ( 4, 5, 6 ,8 ) AND  activity_time < ` + "'" + resultTime_60 + "'" + ")"
 	msql := " UPDATE cygx_activity SET active_state = 3 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
 	return
@@ -782,19 +788,21 @@ type CygxActivityLabelList struct {
 	Resource          int    `description:"位置 ,1:活动 ,2:专项产业调研"`
 	TemporaryLabel    string `description:"临时标签"`
 	IsNew             bool   `description:"是否为新:活动存在关联的的产业所关联的报告均在3个月内/无报告则标记新"`
-	YidongActivityId  int    `description:"易董活动ID"`
+	YidongActivityId  string `description:"易董活动ID"`
 	IsExternalLabel   bool   `description:"是否为外部资源"`
 	IsResearchPoints  bool   `description:"是否为研选扣点"`
 	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	City              string `description:"城市"`
 	Days              int    `description:"天数"`
 	ActivityTypeId    int    `description:"活动类型id"`
+	IsResearch        bool   `description:"是否属于研选"`
+	ChartPermissionId int    `description:"行业id"`
 }
 
 // 主题列表
 func GetActivityLabelListAll(condition, sortTime string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityLabelList, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	activity_id,activity_type_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city,is_external_label,is_research_points
+	sql := `SELECT	activity_id,activity_type_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city,is_external_label,is_research_points,chart_permission_id
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -1193,7 +1201,7 @@ func GetActivityListNew(condition string, pars []interface{}, uid, startSize, pa
 	}
 
 	o := orm.NewOrm()
-	sql := `SELECT art.* ,t.activity_type,t.img_url_text,c.image_url as  img_url,
+	sql := `SELECT art.* ,t.activity_type,t.img_url_text,c.image_url as  img_url,t.img_url_bg_yx,
 		( SELECT COUNT( 1 ) FROM cygx_activity_signup AS s WHERE s.activity_id = art.activity_id AND s.user_id = ?   AND s.is_cancel = 0  AND s.do_fail_type = 0) AS is_signup,
 		( SELECT COUNT( DISTINCT user_id ) FROM cygx_activity_signup AS s WHERE s.activity_id = art.activity_id   AND s.is_cancel = 0  AND s.do_fail_type = 0) AS signup_num,
 		( SELECT COUNT( 1 ) FROM cygx_activity_meeting_reminder AS m WHERE m.activity_id = art.activity_id AND m.user_id = ?  AND m.is_cancel = 0  ) AS is_cancel_meeting_reminder,

+ 9 - 6
models/activity_type.go

@@ -18,7 +18,7 @@ type ActivityTypeListResp struct {
 	List []*ActivityType
 }
 
-//列表
+// 列表
 func GetActivityTypeList() (items []*ActivityType, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_activity_type ORDER BY sort DESC`
@@ -61,15 +61,18 @@ type ActivityTypeHomePc struct {
 	List             []*CygxActivityLabelList
 }
 
-//列表
-func GetActivityTypeHomeList() (items []*ActivityTypeHome, err error) {
+// 列表
+func GetActivityTypeHomeList(condition string, pars []interface{}) (items []*ActivityTypeHome, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_activity_type ORDER BY sort DESC`
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := `SELECT * FROM cygx_activity_type  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
-//列表
+// 列表
 func GetActivityTypeHomeListPc() (items []*ActivityTypeHomePc, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_activity_type WHERE activity_type_id != 7   ORDER BY sort DESC`

+ 69 - 70
models/article.go

@@ -79,6 +79,10 @@ type CygxArticleEs struct {
 	MatchTypeName    string `description:"匹配类型"`
 }
 
+type CygxArticleIdReq struct {
+	ArticleId int `description:"文章id"`
+}
+
 // 新增文章
 func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
 	o := orm.NewOrm()
@@ -116,62 +120,64 @@ type HomeArticle struct {
 	Readnum             int                  `description:"阅读数量"`
 	Cover               string               `description:"封面图片"`
 	BodyHighlight       []string             `description:"搜索高亮展示结果"`
+	ArticleTypeId       int                  `description:"文章类型ID"`
 	List                []*IndustrialManagementIdInt
 }
 
 type ArticleDetail struct {
-	ArticleId               int    `description:"报告id"`
-	Title                   string `description:"标题"`
-	TitleEn                 string `description:"英文标题 "`
-	UpdateFrequency         string `description:"更新周期"`
-	CreateDate              string `description:"创建时间"`
-	PublishDate             string `description:"发布时间"`
-	Body                    string `description:"内容"`
-	Abstract                string `description:"摘要"`
-	CategoryName            string `description:"一级分类"`
-	SubCategoryName         string `description:"二级分类"`
-	IsCollect               bool   `description:"是否收藏:true,已收藏,false:未收藏"`
-	IsInterviewApply        bool   `description:"是否申请访谈:true,已申请,false:未申请"`
-	BodyText                string `description:"内容"`
-	InterviewApplyStatus    string `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
-	InterviewDate           string `description:"访谈时间"`
-	ExpertBackground        string `description:"专家背景"`
-	ExpertNumber            string `description:"专家编号"`
-	Department              string `description:"作者"`
-	SellerMobile            string `description:"销售手机号"`
-	SellerName              string `description:"销售名称"`
-	ArticleIdMd5            string `description:"纪要id"`
-	IsClass                 int    `description:"是否归类,1是,0否"`
-	CategoryId              int    `description:"分类ID"`
-	IsSummary               int    `description:"是否是纪要库,1是,0否"`
-	IsReport                int    `description:"是否属于报告,1是,0否"`
-	IsResearch              bool   `description:"是否属于研选"`
-	FileLink                string `description:"下载预览链接"`
-	SellerAndMobile         string `description:"销售和手机号"`
-	IsFollow                bool   `description:"是否关注,1是,0否"`
-	IsBelongSummary         bool   `description:"是否属于纪要库"`
-	IsBelongReport          bool   `description:"是否属于报告"`
-	FollowNum               int    `description:"关注数量"`
-	CollectionNum           int    `description:"收藏数量"`
-	DepartmentId            int    `description:"作者ID"`
-	DepartmentImgUrl        string `description:"作者头像"`
-	NickName                string `description:"作者昵称"`
-	SubjectIds              string `description:"文章关联标的的ID字符串"`
-	IndustrialAndSubjectIds string `description:"文章关联产业和标的的ID字符串"`
-	IndustrialManagementId  int    `description:"文章关联产业ID"`
-	SellerList              []*SellerRep
-	HttpUrl                 string `description:"文章链接跳转地址"`
-	IsNeedJump              bool   `description:"是否需要跳转链接地址"`
-	ReportLink              string `description:"报告链接"`
-	IsShowLinkButton        int    `description:"这种报告类型是否展示查看报告链接"`
-	ArticleTypeId           int    `description:"文章类型ID"`
-	IsSpecialArticle        bool   `description:"是否属于专项调研报告"`
-	Annotation              string `description:"核心观点"`
-	IsShowFollowButton      bool   `description:"是否展示关注取关按钮"`
-	IsFollowButton          bool   `description:"是否关注"`
-	IsRoadShow              bool   `description:"是否是路演精华"`
-	ReportType              int    `description:"报告类型,1行业报告,2产业报告,0无"`
-	FieldName               string `description:"策略平台的领域字段名称"`
+	ArticleId                int    `description:"报告id"`
+	Title                    string `description:"标题"`
+	TitleEn                  string `description:"英文标题 "`
+	UpdateFrequency          string `description:"更新周期"`
+	CreateDate               string `description:"创建时间"`
+	PublishDate              string `description:"发布时间"`
+	Body                     string `description:"内容"`
+	Abstract                 string `description:"摘要"`
+	CategoryName             string `description:"一级分类"`
+	SubCategoryName          string `description:"二级分类"`
+	IsCollect                bool   `description:"是否收藏:true,已收藏,false:未收藏"`
+	IsInterviewApply         bool   `description:"是否申请访谈:true,已申请,false:未申请"`
+	BodyText                 string `description:"内容"`
+	InterviewApplyStatus     string `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
+	InterviewDate            string `description:"访谈时间"`
+	ExpertBackground         string `description:"专家背景"`
+	ExpertNumber             string `description:"专家编号"`
+	Department               string `description:"作者"`
+	SellerMobile             string `description:"销售手机号"`
+	SellerName               string `description:"销售名称"`
+	ArticleIdMd5             string `description:"纪要id"`
+	IsClass                  int    `description:"是否归类,1是,0否"`
+	CategoryId               int    `description:"分类ID"`
+	IsSummary                int    `description:"是否是纪要库,1是,0否"`
+	IsReport                 int    `description:"是否属于报告,1是,0否"`
+	IsResearch               bool   `description:"是否属于研选"`
+	FileLink                 string `description:"下载预览链接"`
+	SellerAndMobile          string `description:"销售和手机号"`
+	IsFollow                 bool   `description:"是否关注,1是,0否"`
+	IsBelongSummary          bool   `description:"是否属于纪要库"`
+	IsBelongReport           bool   `description:"是否属于报告"`
+	FollowNum                int    `description:"关注数量"`
+	CollectionNum            int    `description:"收藏数量"`
+	DepartmentId             int    `description:"作者ID"`
+	DepartmentImgUrl         string `description:"作者头像"`
+	NickName                 string `description:"作者昵称"`
+	SubjectIds               string `description:"文章关联标的的ID字符串"`
+	IndustrialAndSubjectIds  string `description:"文章关联产业和标的的ID字符串"`
+	IndustrialManagementId   int    `description:"文章关联产业ID"`
+	SellerList               []*SellerRep
+	HttpUrl                  string `description:"文章链接跳转地址"`
+	IsNeedJump               bool   `description:"是否需要跳转链接地址"`
+	ReportLink               string `description:"报告链接"`
+	IsShowLinkButton         int    `description:"这种报告类型是否展示查看报告链接"`
+	ArticleTypeId            int    `description:"文章类型ID"`
+	IsSpecialArticle         bool   `description:"是否属于专项调研报告"`
+	Annotation               string `description:"核心观点"`
+	IsShowFollowButton       bool   `description:"是否展示关注取关按钮"`
+	IsFollowButton           bool   `description:"是否关注"`
+	IsRoadShow               bool   `description:"是否是路演精华"`
+	ReportType               int    `description:"报告类型,1行业报告,2产业报告,0无"`
+	FieldName                string `description:"策略平台的领域字段名称"`
+	IsApplyAppointmentExpert bool   `description:"是否属于专家访谈"`
 }
 
 type ArticleDetailFileLink struct {
@@ -798,7 +804,6 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 		err = o.Raw(artSql).QueryRow(&artIds)
 	}
 
-
 	actSql += ` WHERE 1=1 `
 	if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 		if industryStr != "" && subjectNameStr != "" {
@@ -816,7 +821,7 @@ 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 == "" {
@@ -828,8 +833,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()
@@ -840,7 +843,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 
@@ -852,7 +855,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 
@@ -874,7 +877,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 + `) )`
@@ -886,7 +888,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				artSql += articleTypesCond
 			}
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				artSql += `)) `
 			} else {
 				artSql += `) OR (1=1 `
@@ -895,8 +897,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 + `) )`
@@ -908,7 +908,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				actSql += activityTypesCond
 			}
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				actSql += `)) `
 			} else {
 				actSql += `) OR (1=1 `
@@ -919,14 +919,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 `
@@ -938,23 +938,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
+}

+ 10 - 0
models/banner.go

@@ -72,6 +72,16 @@ type BannerUrlResp struct {
 	Path              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 - 0
models/company/company_approval.go

@@ -0,0 +1,33 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyApproval struct {
+	CompanyApprovalId   int `orm:"column(company_approval_id);pk"`
+	CompanyId           int
+	ProductId           int
+	ApproveStatus       string    `description:"'待审批','已审批','驳回','已撤回'"`
+	ApproveUserId       int       `description:"审批人"`
+	ApproveRoleTypeCode string    `description:"审批人角色类型"`
+	ApproveRealName     string    `description:"审批人姓名"`
+	ApproveTime         time.Time `description:"审批时间"`
+	ApproveContent      string    `description:"待审内容"`
+	ApplyMethod         int       `description:"申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新,6:正式客户补充协议"`
+	ApplyReasons        string    `description:"申请原因"`
+	ApplyUserId         int       `description:"申请人"`
+	ApplyRealName       string    `description:"申请人姓名"`
+	CreateTime          time.Time `description:"申请时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CompanyContractId   int       `description:"合同id"`
+	IsFormal            int       `description:"是否已经转正式,0是没有转正式,1是已经转过正式"`
+}
+
+func GetCompanyApprovalById(companyId int) (item *CompanyApproval, err error) {
+	sql := `SELECT * FROM company_approval WHERE company_id=? AND product_id=2 AND approve_status='已审批' order by company_approval_id desc LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}

+ 26 - 0
models/company/company_contract.go

@@ -0,0 +1,26 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyContractPermission struct {
+	Id                int       `orm:"column(id);pk" description:"客户合同id"`
+	CompanyId         int       `description:"客户id"`
+	CompanyContractId int       `description:"合同id"`
+	ChartPermissionId int       `description:"权限id"`
+	IsUpgrade         int       `description:"是否升级,1是,0否"`
+	ExpensiveYx       int       `description:"权益研选: 0-3w; 1-5w"`
+	StartDate         string    `description:"开始日期"`
+	EndDate           string    `description:"结束日期"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+}
+
+func GetCompanyContractPermissionCheck(companyContractId, permissionId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM company_contract_permission AS a WHERE a.company_contract_id=? AND a.chart_permission_id=? `
+	err = o.Raw(sql, companyContractId, permissionId).QueryRow(&count)
+	return
+}

+ 2 - 0
models/db.go

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

+ 1 - 0
models/report.go

@@ -1033,6 +1033,7 @@ type ArticleReportBillboardResp struct {
 	Source         int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
 	IsRoadShow     bool   `description:"是否是路演精华"`
 	CategoryId     int    `description:"分类ID"`
+	IsResearch     bool   `description:"是否属于研选"`
 	List           []*IndustrialManagementIdInt
 }
 

+ 1 - 0
models/search.go

@@ -15,6 +15,7 @@ type SearchItem struct {
 	CategoryId       string   `description:"文章分类"`
 	Source           int      `description:"来源  1:文章, 2:图表"`
 	IsNeedJump       bool     `description:"是否需要跳转链接地址"`
+	IsResearch       bool     `description:"是否属于研选"`
 }
 
 type CategoryItem struct {

+ 37 - 1
routers/commentsRouter.go

@@ -109,7 +109,7 @@ func init() {
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "LabelTypeListV6Pc",
-            Router: `/labelTypeListV6Pc`,
+            Router: `/labelTypeListV6Pc_del`,
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),
             Filters: nil,
@@ -349,6 +349,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "ApplyAppointmentExpert",
+            Router: `/applyAppointmentExpert`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"],
         beego.ControllerComments{
             Method: "AskAdd",
@@ -412,6 +421,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "YxSurvey",
+            Router: `/add/yxSurvey`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
         beego.ControllerComments{
             Method: "List",
@@ -421,6 +439,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "ListYx",
+            Router: `/listYx`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "YxSurveyDetail",
+            Router: `/yxSurvey/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"],
         beego.ControllerComments{
             Method: "Patg",

+ 176 - 11
services/activity.go

@@ -197,9 +197,17 @@ func SendEmailFileToExpert(cont context.Context) (err error) {
 		msg = "发送附件模版消息失败 Err:" + err.Error()
 		return
 	}
+	var activityIds []int
+	for _, v := range listActivity {
+		activityIds = append(activityIds, v.ActivityId)
+	}
+
+	//{
+	//	utils.SendAlarmMsg("预约外呼名单,会前1小时自动发送邮件给专家组 监控日志,监控使用无需处理,活动ID:"+fmt.Sprint(activityIds), 2)
+	//}
 
 	for _, v := range listActivity {
-		time.Sleep(5 * time.Second) //延时五秒,避免邮件发送不成功
+		time.Sleep(30 * time.Second) //延时30秒,避免邮件发送不成功
 		activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
 		if activityInfo == nil {
 			msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
@@ -295,7 +303,7 @@ func SendEmailFileToExpert(cont context.Context) (err error) {
 			}
 			os.Remove(downLoadnFilePath)
 		} else {
-			go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
+			go utils.SendAlarmMsg("发送附件模版消息失败"+activityInfo.ActivityName, 2)
 			utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
 		}
 	}
@@ -535,21 +543,36 @@ func GetUserTypeZhengShi(companyId int) (userType int, permissionStrnew, permiss
 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 {
 		havePower = true
 		return
 	}
+
 	userType, permissionStr, permissionStrZhengShi, e := GetUserTypeZhengShi(user.CompanyId)
 	if e != nil {
 		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 {
 		//获取活动对用户要扣的点
@@ -559,10 +582,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
@@ -1151,7 +1174,7 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 func ActivityConditioninitSql(user *models.WxUserItem, condition string, isPower int) (conditionActivity string, err error) {
 	// cygx_10.9 未绑定联系方式的客户可以看到部分活动
 	if user.UserId == 0 || user.CompanyId == 1 {
-		conditionActivity  = ` AND art.publish_status = 1  AND art.visible_range != 1 AND (art.is_limit_people = 0 OR (art.is_limit_people=1 AND art.is_all_customer_type=1))   ` + condition
+		conditionActivity = ` AND art.publish_status = 1  AND art.visible_range != 1 AND (art.is_limit_people = 0 OR (art.is_limit_people=1 AND art.is_all_customer_type=1))   ` + condition
 		return
 	}
 	condition += `   AND art.publish_status = 1 `
@@ -2276,6 +2299,9 @@ func DoActivityOnenIdWxTemplateMsg(cont context.Context) (err error) {
 }
 
 func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.ActivityDetail) {
+	if item.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		item.IsResearch = true
+	}
 	activityDetail = item
 	//IsShowAppointment       bool                       `description:"是否展示预约纪要"`
 	//IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
@@ -2305,6 +2331,10 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 		activityDetail.SourceType = 1
 		activityDetail.IsShowSignup = false
 		activityDetail.IsShowDetails = true
+
+		activityDetail.IsExternalLabel = true
+		activityDetail.IsResearch = false
+		activityDetail.IsResearchSpecial = false
 		return
 	}
 
@@ -2375,6 +2405,11 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 			activityDetail.IsShowMeetingReminder = true
 			activityDetail.ActivityTypeName = "分析师电话会"
 		}
+
+		//买方线下交流 8 // 查研观向 11.0
+		if activityDetail.ActivityTypeId == 8 {
+			activityDetail.IsShowSignup = true
+		}
 	}
 
 	//如果是易董创建的活动,展示我要报名,不展示预约外呼
@@ -2386,6 +2421,136 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 	return
 }
 
+func ActivityArrButtonShow(items []*models.ActivityDetail) (activityDetails []*models.ActivityDetail) {
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
+	for _, activityDetail := range items {
+		if activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			activityDetail.IsResearch = true
+		}
+		//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+		if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityDetail.ActivityId] {
+			activityDetail.IsResearchSpecial = true
+		}
+		//IsShowAppointment       bool                       `description:"是否展示预约纪要"`
+		//IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
+		//IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
+		//IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
+		//IsShowSignup            bool                       `description:"是否展示我要报名"`
+
+		activityDetail.IsResearchPoints = activityPointsByUserAllMap[activityDetail.ActivityId]
+		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
+		if activityDetail.SourceType != 2 {
+			activityDetail.SourceType = 1
+		}
+		activityDetail.IsShowAppointment = false
+		//易董的操作按钮都隐藏
+		if activityDetail.YidongActivityId != "" {
+			activityDetail.SourceType = 1
+			activityDetail.IsShowSignup = false
+			activityDetail.IsShowDetails = true
+
+		} else {
+			//专家电话会 1
+			if activityDetail.ActivityTypeId == 1 && activityDetail.IsLimitPeople == 0 && (activityDetail.ActiveState == "1" || activityDetail.ActiveState == "2") {
+				activityDetail.IsShowHelpSsk = true
+			}
+			//新的是否展示规则
+			if activityDetail.IsCanAppointmentMinutes == 1 {
+				activityDetail.IsShowAppointment = true
+			} else {
+				activityDetail.IsShowAppointment = false
+			}
+			if activityDetail.ActiveState == "1" {
+				//专家电话会 1
+				//专家电话会限制人数的展示我要报名,不限制的展示预约外外呼
+				if activityDetail.ActivityTypeId == 1 {
+					//articleDetail.IsShowOutboundCall = true
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+						//articleDetail.IsShowHelpSsk = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+					activityDetail.IsShowHelpSsk = true
+				}
+
+				//分析师电话会 2
+				if activityDetail.ActivityTypeId == 2 {
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+						//articleDetail.IsShowHelpSsk = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+				}
+
+				//公司调研电话会 3
+				if activityDetail.ActivityTypeId == 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
+					activityDetail.ActivityTypeName = "分析师电话会"
+				}
+
+				//买方线下交流 8 // 查研观向 11.0
+				if activityDetail.ActivityTypeId == 8 {
+					activityDetail.IsShowSignup = true
+				}
+			}
+
+			//如果是易董创建的活动,展示我要报名,不展示预约外呼
+			if activityDetail.IsYidongConduct {
+				activityDetail.IsShowSignup = true
+				activityDetail.IsShowOutboundCall = false
+			}
+		}
+		//如果是易董同步过来的,只展示外部资源标签
+		if activityDetail.YidongActivityId != "" {
+			activityDetail.IsExternalLabel = true
+			activityDetail.IsResearch = false
+			activityDetail.IsResearchSpecial = false
+		}
+		activityDetails = append(activityDetails, activityDetail)
+	}
+	return
+}
+
 // GetActivityNewLabelMap 获取活动【新】标签Map
 func GetActivityNewLabelMap(activityIds []int) (labelMap map[int]bool, industryNewMap map[int]bool, err error) {
 	labelMap = make(map[int]bool, 0)

+ 28 - 5
services/activity_points.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/company"
 	"hongze/hongze_cygx/utils"
 	"strconv"
 	"time"
@@ -889,7 +890,7 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	}()
 	comapnyId := log.ComapnyId
 
-	comapny, e := models.GetCompanyById(comapnyId)
+	comapnyDetail, e := models.GetCompanyById(comapnyId)
 	if e != nil {
 		err = errors.New("GetCompanyById" + e.Error())
 		return
@@ -913,6 +914,28 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	if companyReportPermissionDetail == nil {
 		return // 如果不存在就不做研选扣点处理
 	}
+
+	//获取最近的一条审批合同信息
+	newCompanyApprovalDetail, e := company.GetCompanyApprovalById(comapnyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyApprovalById, Err: " + e.Error())
+		return
+	}
+	if newCompanyApprovalDetail == nil {
+		return
+	}
+	companyContractId := newCompanyApprovalDetail.CompanyContractId
+
+	totalYxPerminssion, e := company.GetCompanyContractPermissionCheck(companyContractId, utils.CHART_PERMISSION_ID_YANXUAN)
+	if e != nil {
+		err = errors.New("GetCompanyContractPermissionCheck, Err: " + e.Error())
+		return
+	}
+	// 如果最新的审批合同里没有研选的权限,那么就不做处理
+	if totalYxPerminssion == 0 {
+		return
+	}
+
 	var billDetailed float64
 	var content string
 	//ExpensiveYx               int       `description:"权益研选: 0->3w; 1->5w"` 3W3次、5W 15次
@@ -932,8 +955,8 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	item.CreateTime = time.Now()
 	//item.Mobile = user.Mobile
 	//item.Email = user.Email
-	item.CompanyId = comapny.CompanyId
-	item.CompanyName = comapny.CompanyName
+	item.CompanyId = comapnyDetail.CompanyId
+	item.CompanyName = comapnyDetail.CompanyName
 	//item.RealName = user.RealName
 	item.BillDetailed = billDetailed
 	item.RegisterPlatform = log.RegisterPlatform
@@ -948,8 +971,8 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	//更新对应机构的剩余点数
 	var itemCompanys []*models.CygxActivityPointsCompany
 	itemCompany := new(models.CygxActivityPointsCompany)
-	itemCompany.CompanyId = comapny.CompanyId
-	itemCompany.CompanyName = comapny.CompanyName
+	itemCompany.CompanyId = comapnyDetail.CompanyId
+	itemCompany.CompanyName = comapnyDetail.CompanyName
 	itemCompany.Points = item.Points
 	itemCompany.CreateTime = time.Now()
 	itemCompany.ModifyTime = time.Now()

+ 1 - 1
services/activity_signup.go

@@ -77,7 +77,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)
 		if timeResp.Before(time.Now()) {
 			checkTime = false

+ 32 - 0
services/article.go

@@ -1754,6 +1754,11 @@ func HandleArticleCategoryImg(list []*models.HomeArticle) (items []*models.HomeA
 			}
 		}
 
+		//是不是研选报告
+		if v.ArticleTypeId > 0 {
+			list[k].IsResearch = true
+		}
+
 	}
 
 	articleIds := make([]int, 0)
@@ -2153,3 +2158,30 @@ func GetArticleCoverByChartFirst(body string) (cover string) {
 	}
 	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
+}

+ 157 - 0
services/article_apply_appointment_expert.go

@@ -0,0 +1,157 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/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 {
+			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
+	}
+	if total > 0 {
+		isApplyAppointmentExpert = true
+	}
+	return
+}

+ 126 - 0
services/banner_yx_survey.go

@@ -0,0 +1,126 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/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+err.Error(), 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)
+	}
+
+	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
+	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
+}

+ 6 - 1
services/company_permission.go

@@ -150,9 +150,14 @@ func GetUserHasPermissionActivity(user *models.WxUserItem, activityInfo *models.
 		err = errors.New("GetApplyRecordCount, Err: " + e.Error())
 		return
 	}
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
 
 	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		popupMsg = "暂无<b>买方研选</b>权限<br/>您可申请开通试用"
+		if activityPointsByUserAllMap[activityInfo.ActivityId] {
+			popupMsg = "签约买方研选套餐才可参与此活动,请联系对口销售"
+		} else {
+			popupMsg = "暂无<b>买方研选</b>权限<br/>您可申请开通试用"
+		}
 	} else {
 		popupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
 	}

+ 3 - 3
services/task.go

@@ -35,9 +35,6 @@ func Task() {
 		getChartListByApi := task.NewTask("getChartListByApi", "0 */10 * * * *", GetChartDetailByChartId) //同步图表
 		task.AddTask("getChartListByApi", getChartListByApi)
 
-		getYiDongActivity := task.NewTask("getYiDongActivity", "0 */10 * * * *", GetYiDongActivity) //同步易董的活动信息
-		task.AddTask("getYiDongActivity", getYiDongActivity)
-
 		getYiDongActivityMeeting := task.NewTask("getYiDongActivityMeeting", "0 */60 * * * *", GetYiDongActivityMeeting) //同步易董的活动信息
 		task.AddTask("getYiDongActivityMeeting", getYiDongActivityMeeting)
 
@@ -47,6 +44,9 @@ func Task() {
 
 	if utils.IsTask {
 
+		getYiDongActivity := task.NewTask("getYiDongActivity", "0 */10 * * * *", GetYiDongActivity) //同步易董的活动信息
+		task.AddTask("getYiDongActivity", getYiDongActivity)
+
 		//会议提醒模板消息推送
 		sendActivityBeginMsg := task.NewTask("sendActivityBeginMsg", "0 */10 6-23 * * *", SendActivityBeginMsg) //会议前60分钟的提醒
 		task.AddTask("sendActivityBeginMsg", sendActivityBeginMsg)

+ 34 - 3
services/yidong.go

@@ -288,9 +288,15 @@ func GetYiDongActivity(cont context.Context) (err error) {
 			item.LastUpdatedTime = time.Now()
 			item.Label = companyInfo
 			item.TemporaryLabel = companyInfo
-			item.ChartPermissionId = GetActivityTypeIdWithYiDong(v.IndustrySwName)
-			item.ChartPermissionName = GetActivityTypeNameWithYiDong(v.IndustrySwName)
-			item.ChartPermissionNames = GetActivityTypeNameWithYiDong(v.IndustrySwName)
+			item.ChartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN
+			item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+			item.ChartPermissionIdDeputy = GetActivityTypeIdWithYiDong(v.IndustrySwName)
+			item.ChartPermissionNameDeputy = GetActivityTypeNameWithYiDong(v.IndustrySwName)
+			item.ChartPermissionNames = item.ChartPermissionName
+			//if item.ChartPermissionId != item.ChartPermissionIdDeputy {
+
+			item.IsShowHz = 1 //默认弘则活动也展示 11.0
+			//}
 			item.ActivityTime = v.Start
 			item.YidongActivityEndTime = v.End
 			item.YidongSignUpStart = v.SignUpStart
@@ -342,6 +348,9 @@ func GetYiDongActivity(cont context.Context) (err error) {
 					updateParams["ActivityJoinType"] = item.ActivityJoinType
 					updateParams["YidongSignUpStart"] = item.YidongSignUpStart
 					updateParams["YidongSignUpEnd"] = item.YidongSignUpEnd
+					updateParams["ChartPermissionIdDeputy"] = item.ChartPermissionIdDeputy
+					updateParams["ChartPermissionNameDeputy"] = item.ChartPermissionNameDeputy
+					updateParams["IsShowHz"] = item.IsShowHz
 					updateParams["IsExternalLabel"] = 1
 					updateParams["LastUpdatedTime"] = time.Now()
 					whereParam := map[string]interface{}{"yidong_activity_id": item.YidongActivityId}
@@ -837,6 +846,25 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 	if err != nil {
 		return
 	}
+	if len(activityList) == 0 {
+		return
+	}
+	listEmail, e := models.GetAskEmail()
+	if e != nil {
+		err = errors.New("GetAskEmail, Err: " + e.Error())
+		return
+	}
+
+	//获取某一个活动下面不需要推送的主讲人手机号
+	idAndMobileNoSendMap := make(map[string]bool)
+	for _, v := range activityList {
+		for _, vName := range listEmail {
+			if strings.Contains(v.Speaker, vName.Name) {
+				idAndMobileNoSendMap[fmt.Sprint("Id_", v.ActivityId, "Mobile_", vName.Mobile)] = true
+			}
+		}
+	}
+
 	url := utils.YiDongHuaWeiYunUrl + "app/hz/signAppointmentsForThird"
 	var outCallStatus string
 	for _, v := range activityList {
@@ -860,6 +888,9 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 		}
 		sellNameMap := GetSellNameMapByCompanyIds(companyIds)
 		for _, vS := range listSignUp {
+			if idAndMobileNoSendMap[fmt.Sprint("Id_", vS.ActivityId, "Mobile_", vS.Mobile)] {
+				continue //如果这个活动对应的是主讲人的手机号,那么就不做推送
+			}
 			if vS.SignupType == 1 {
 				outCallStatus = "1"
 			} else {

+ 1 - 1
utils/config.go

@@ -170,7 +170,7 @@ func init() {
 		EmailTechnology = "mlluo@hzinsights.com;jxu@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;hwang@hzinsights.com;rli@hzinsights.com"       //科技行业专家邮箱
 		EmailMedicine = "xlzheng@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;yxyan@hzinsights.com;ppwang@hzinsights.com"                       //医药行业专家邮箱
 		EmailConsumption = "yrhuang@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;jxu@hzinsights.com;hychen@hzinsights.com;lwang@hzinsights.com" //消费行业专家邮箱
-		EmailZhizao = "xfma@hzinsights.com;agne@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;kfyu@hzinsights.com"                               //智造行业专家邮箱
+		EmailZhizao = "xfma@hzinsights.com;agne@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                   //智造行业专家邮箱
 		EmailStrategy = "experts@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                                  //策略行业专家邮箱
 		EmailExpert = "experts@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                                    //研选行业专家邮箱
 		EmaiWhiteUserList = "tshen@hzinsights.com;cxzhang@hzinsights.com;yyli@hzinsights.com"                                                                                       //白名单邮箱

+ 7 - 0
utils/constants.go

@@ -181,6 +181,7 @@ const (
 	WX_MSG_PATH_RESEARCHTHEME_DETAIL     = "reportPages/researchTheme/researchTheme?id="                  //主题详情模板消息地址
 	WX_MSG_PATH_ACTIVITY_SIGN            = "pages-message/activityTemplate/activityTemplate?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="                //精选看板申请详情页
 )
 
@@ -217,3 +218,9 @@ const (
 	TPL_MSG                     = "tpl_msg"                     //王芳手机号地址参数
 	TPL_MSG_NEI_RONG_ZU         = "tpl_msg_nei_rong_zu"         //内容组四人
 )
+
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
+)