xingzai 1 жил өмнө
parent
commit
af65f8fefc

+ 5 - 3
controllers/activity.go

@@ -1756,10 +1756,11 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if label != "" {
 	if label != "" {
 		conditioninit += ` AND art.label  LIKE "%` + label + `%" `
 		conditioninit += ` AND art.label  LIKE "%` + label + `%" `
 	}
 	}
+	//是否是研选
 	if isResearch {
 	if isResearch {
 		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
 		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
 	} else {
 	} else {
-		//condition += ` AND art.chart_permission_id  !=  '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `'`
+		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) + `')  )`
 	}
 	}
 	//行业名称
 	//行业名称
 	if len(chartPermissionIds) > 0 {
 	if len(chartPermissionIds) > 0 {
@@ -3730,6 +3731,7 @@ func (this *ActivityCoAntroller) ActivityVideoHistoryAdd() {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listSearch [get]
 // @router /listSearch [get]
 func (this *ActivityCoAntroller) ActivityListSearch() {
 func (this *ActivityCoAntroller) ActivityListSearch() {
@@ -3836,8 +3838,8 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	var conditionSpecial string
 	var conditionSpecial string
 	var sortTime string
 	var sortTime string
 	var pars []interface{}
 	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 != "" {
 	if whichDay != "" {
 		var startDate string
 		var startDate string
 		var endDate string
 		var endDate string

+ 54 - 0
controllers/article.go

@@ -90,6 +90,8 @@ func (this *ArticleController) Detail() {
 	if strings.Contains(detail.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 	if strings.Contains(detail.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 		detail.IsResearch = true
 		detail.IsResearch = true
 	}
 	}
+
+	detail.IsApplyAppointmentExpert = services.GetIsApplyAppointmentExpert(user, articleId) // 获取用户数是否约访专家的请求  查研观向11.0
 	// 高毅资产的联系人,有权限的行业也不能查看报告详情页。提示无权限页面
 	// 高毅资产的联系人,有权限的行业也不能查看报告详情页。提示无权限页面
 	if detail.ArticleTypeId == 0 && user.CompanyId == utils.GAO_YI_ZI_CHAN_COMPANY_ID {
 	if detail.ArticleTypeId == 0 && user.CompanyId == utils.GAO_YI_ZI_CHAN_COMPANY_ID {
 		_, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
 		_, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
@@ -1640,3 +1642,55 @@ func (this *ArticleCommonController) PageHistoryPublic() {
 	br.Success = true
 	br.Success = true
 	br.Msg = "新增成功"
 	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 = "操作成功"
+}

+ 113 - 0
controllers/banner.go

@@ -95,3 +95,116 @@ func (this *BannerController) History() {
 	br.Success = true
 	br.Success = true
 	br.Msg = "记录成功"
 	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"},
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/2.png"},
+	}
+
+	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
+	}
+	//_, err = models.AddCygxBannerYxSurvey(item)
+	err = services.AddCygxBannerYxSurvey(user, content)
+	if err != nil {
+		br.Msg = "申请失败"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}
+
+// @Title 研选banner列表
+// @Description 研选banner列表接口
+// @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
+}

+ 2 - 1
models/activity.go

@@ -231,6 +231,7 @@ type ActivityDetail struct {
 	SiginupDeadline         string                     `description:"报名截止时间"`
 	SiginupDeadline         string                     `description:"报名截止时间"`
 	IsExternalLabel         bool                       `description:"是否为外部资源"`
 	IsExternalLabel         bool                       `description:"是否为外部资源"`
 	IsResearchPoints        bool                       `description:"是否为研选扣点"`
 	IsResearchPoints        bool                       `description:"是否为研选扣点"`
+	ImgUrlBgYx              string                     `description:"研选背景图片"`
 }
 }
 type ListArticleActivity struct {
 type ListArticleActivity struct {
 	Title   string `description:"文章标题"`
 	Title   string `description:"文章标题"`
@@ -1187,7 +1188,7 @@ func GetActivityListNew(condition string, pars []interface{}, uid, startSize, pa
 	}
 	}
 
 
 	o := orm.NewOrm()
 	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( 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( 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,
 		( 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,

+ 67 - 69
models/article.go

@@ -79,6 +79,10 @@ type CygxArticleEs struct {
 	MatchTypeName    string `description:"匹配类型"`
 	MatchTypeName    string `description:"匹配类型"`
 }
 }
 
 
+type CygxArticleIdReq struct {
+	ArticleId int `description:"文章id"`
+}
+
 // 新增文章
 // 新增文章
 func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
 func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
@@ -119,57 +123,58 @@ type HomeArticle struct {
 }
 }
 
 
 type ArticleDetail struct {
 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无"`
+	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无"`
+	IsApplyAppointmentExpert bool   `description:"是否预约过专家"`
 }
 }
 
 
 type ArticleDetailFileLink struct {
 type ArticleDetailFileLink struct {
@@ -794,7 +799,6 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 		err = o.Raw(artSql).QueryRow(&artIds)
 		err = o.Raw(artSql).QueryRow(&artIds)
 	}
 	}
 
 
-
 	actSql += ` WHERE 1=1 `
 	actSql += ` WHERE 1=1 `
 	if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 	if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 		if industryStr != "" && subjectNameStr != "" {
 		if industryStr != "" && subjectNameStr != "" {
@@ -812,7 +816,7 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 	if strings.Contains(articleTypeStr, "晨会精华") {
 	if strings.Contains(articleTypeStr, "晨会精华") {
 		mmSql += ` WHERE 1=1 `
 		mmSql += ` WHERE 1=1 `
 		if industryStr != "" && subjectNameStr != "" {
 		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 != "" {
 		} else if industryStr == "" && subjectNameStr != "" {
 			mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 			mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 		} else if industryStr != "" && subjectNameStr == "" {
 		} else if industryStr != "" && subjectNameStr == "" {
@@ -824,8 +828,6 @@ func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, indu
 	return
 	return
 }
 }
 
 
-
-
 // 单个tag时用,取合集
 // 单个tag时用,取合集
 func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice []string) (artIds, actIds, mmIds string, err error) {
 func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice []string) (artIds, actIds, mmIds string, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
@@ -836,7 +838,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 	mmSql := ` SELECT GROUP_CONCAT(DISTINCT mmc.id SEPARATOR ',') AS mm_ids FROM cygx_morning_meeting_review_chapter as mmc `
 	mmSql := ` SELECT GROUP_CONCAT(DISTINCT mmc.id SEPARATOR ',') AS mm_ids FROM cygx_morning_meeting_review_chapter as mmc `
 
 
 	for _, s := range industriesCondSlice {
 	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 
 			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  `
 				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 
 			actSql += ` INNER JOIN cygx_industrial_activity_group_management  AS iam ON iam.activity_id = act.activity_id 
@@ -848,7 +850,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 		}
 		}
 	}
 	}
 	for _, s := range subjectNamesSlice {
 	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 
 			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  `
 				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 
 			actSql += ` INNER JOIN cygx_industrial_activity_group_subject  AS ias ON ias.activity_id = act.activity_id 
@@ -870,7 +872,6 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 		subjectNameStr := subjectNamesSlice[i]
 		subjectNameStr := subjectNamesSlice[i]
 		articleTypeStr := articleTypeSlice[i]
 		articleTypeStr := articleTypeSlice[i]
 
 
-
 		if articleTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 		if articleTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 			if industryStr != "" && subjectNameStr != "" {
 			if industryStr != "" && subjectNameStr != "" {
 				artSql += articleTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
 				artSql += articleTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
@@ -882,7 +883,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				artSql += articleTypesCond
 				artSql += articleTypesCond
 			}
 			}
 
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				artSql += `)) `
 				artSql += `)) `
 			} else {
 			} else {
 				artSql += `) OR (1=1 `
 				artSql += `) OR (1=1 `
@@ -891,8 +892,6 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 			isNeedArt = true
 			isNeedArt = true
 		}
 		}
 
 
-
-
 		if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 		if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
 			if industryStr != "" && subjectNameStr != "" {
 			if industryStr != "" && subjectNameStr != "" {
 				actSql += activityTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
 				actSql += activityTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
@@ -904,7 +903,7 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 				actSql += activityTypesCond
 				actSql += activityTypesCond
 			}
 			}
 
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				actSql += `)) `
 				actSql += `)) `
 			} else {
 			} else {
 				actSql += `) OR (1=1 `
 				actSql += `) OR (1=1 `
@@ -915,14 +914,14 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 
 
 		if strings.Contains(articleTypeStr, "晨会精华") {
 		if strings.Contains(articleTypeStr, "晨会精华") {
 			if industryStr != "" && subjectNameStr != "" {
 			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 != "" {
 			} else if industryStr == "" && subjectNameStr != "" {
 				mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 				mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
 			} else if industryStr != "" && subjectNameStr == "" {
 			} else if industryStr != "" && subjectNameStr == "" {
 				mmSql += ` AND im.industry_name In (` + industryStr + `) `
 				mmSql += ` AND im.industry_name In (` + industryStr + `) `
 			}
 			}
 
 
-			if i == len(articleTypeCondSlice) -1 {
+			if i == len(articleTypeCondSlice)-1 {
 				mmSql += `)) `
 				mmSql += `)) `
 			} else {
 			} else {
 				mmSql += `) OR (1=1 `
 				mmSql += `) OR (1=1 `
@@ -934,23 +933,22 @@ func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityType
 
 
 	if isNeedArt {
 	if isNeedArt {
 		err = o.Raw(artSql).QueryRow(&artIds)
 		err = o.Raw(artSql).QueryRow(&artIds)
-		if err != nil{
+		if err != nil {
 			return
 			return
 		}
 		}
 	}
 	}
-	if isNeedAct{
+	if isNeedAct {
 		err = o.Raw(actSql).QueryRow(&actIds)
 		err = o.Raw(actSql).QueryRow(&actIds)
-		if err != nil{
+		if err != nil {
 			return
 			return
 		}
 		}
 	}
 	}
 	if isNeedMm {
 	if isNeedMm {
 		err = o.Raw(mmSql).QueryRow(&mmIds)
 		err = o.Raw(mmSql).QueryRow(&mmIds)
-		if err != nil{
+		if err != nil {
 			return
 			return
 		}
 		}
 	}
 	}
 
 
-
 	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:"小程序路径"`
 	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) {
 func GetCygxBannerImgList() (items []*CygxBannerImgResp, err error) {
 	o := orm.NewOrm()
 	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
+}

+ 2 - 0
models/db.go

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

+ 36 - 0
routers/commentsRouter.go

@@ -349,6 +349,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: 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.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "AskAdd",
             Method: "AskAdd",
@@ -412,6 +421,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: 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.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "List",
             Method: "List",
@@ -421,6 +439,24 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: 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.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "Patg",
             Method: "Patg",

+ 131 - 0
services/article_apply_appointment_expert.go

@@ -0,0 +1,131 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"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)
+		}
+	}()
+	//获取权益销售
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if sellerItem == nil {
+		return
+	}
+	//文章详情
+	detailArticle, e := models.GetArticleDetailById(articleId)
+	if e != nil {
+		err = errors.New("GetArticleDetailById, Err: " + e.Error())
+		return
+	}
+	//销售对应的Openid
+	openIdList, e := models.GetWxOpenIdByMobileList(sellerItem.Mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		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.WxMsgTemplateIdArticleUserRemind
+	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
+}

+ 108 - 0
services/banner_yx_survey.go

@@ -0,0 +1,108 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"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, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+msg, 2)
+		}
+	}()
+	//获取权益销售
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if sellerItem == nil {
+		return
+	}
+	//文章详情
+	detailArticle, e := models.GetArticleDetailById(articleId)
+	if e != nil {
+		err = errors.New("GetArticleDetailById, Err: " + e.Error())
+		return
+	}
+	//销售对应的Openid
+	openIdList, e := models.GetWxOpenIdByMobileList(sellerItem.Mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		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.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}