瀏覽代碼

文章相关搜索收藏模块

xingzai 2 年之前
父節點
當前提交
7558828cd4

+ 348 - 9
controllers/article.go

@@ -1,13 +1,15 @@
 package controllers
 
 import (
+	"encoding/json"
 	"fmt"
+	"github.com/medivhzhan/weapp/v2"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/services"
 	"hongze/hongze_clpt/utils"
-	"html"
 	"strconv"
 	"strings"
+	"time"
 )
 
 type ArticleController struct {
@@ -36,7 +38,7 @@ func (this *ArticleController) Detail() {
 		br.Ret = 408
 		return
 	}
-
+	resp := new(models.ArticleDetailResp)
 	uid := user.UserId
 	articleId, err := this.GetInt("ArticleId")
 	if articleId <= 0 {
@@ -69,11 +71,7 @@ func (this *ArticleController) Detail() {
 			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			return
 		}
-		fmt.Println(detail.Body)
-		detail.Body = html.UnescapeString(detail.Body)
-		detail.Body = strings.Replace(detail.Body, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
-		detail.Body = strings.Replace(detail.Body, "pre", "div", -1)
-		//detail.Abstract = html.UnescapeString(detail.Abstract)
+		detail.Body = services.GetReportContentTextArticleBody(detail.Body)
 		detail.Abstract, _ = services.GetReportContentTextSubNew(detail.Abstract)
 		if companyPermission == "" {
 			if applyCount > 0 {
@@ -177,7 +175,6 @@ func (this *ArticleController) Detail() {
 			br.ErrMsg = "获取销售数据失败2,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
 			return
 		}
-		fmt.Println(sellerItem)
 		if sellerItem != nil {
 			detail.Seller.SellerMobile = sellerItem.Mobile
 			detail.Seller.SellerName = sellerItem.RealName
@@ -214,6 +211,7 @@ Loop:
 		}
 		detail.FollowNum = articleFollowdetail.DNum
 		detail.CollectionNum = articleFollowdetail.AcNum
+		detail.Disclaimers = utils.DISCLAIMERS
 		if articleFollowdetail.MdNum > 0 {
 			detail.IsFollow = true
 		}
@@ -245,7 +243,7 @@ Loop:
 	//var haveResearch bool
 	fmt.Println(hasFree)
 	fmt.Println(haveResearch)
-	resp := new(models.ArticleDetailResp)
+
 	resp.HasPermission = hasPermission
 	resp.Detail = detail
 	br.Ret = 200
@@ -253,3 +251,344 @@ Loop:
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 收藏\取消收藏
+// @Description 收藏\取消收藏
+// @Param	request	body models.ArticleCollectReq true "type json string"
+// @Success 200 {object} models.FontsCollectResp
+// @router /collect [post]
+func (this *ArticleController) ArticleCollect() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	var req models.ArticleCollectReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	articleId := req.ArticleId
+	//detail, err := models.GetArticleDetailById(articleId)
+	//if err != nil {
+	//	br.Msg = "获取信息失败"
+	//	br.ErrMsg = "获取信息失败,Err:" + err.Error()
+	//	return
+	//}
+	count, err := models.GetArticleCollectCount(uid, articleId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.ArticleCollectResp)
+	if count <= 0 {
+		item := new(models.CygxArticleCollect)
+		item.ArticleId = req.ArticleId
+		item.UserId = uid
+		item.CreateTime = time.Now()
+		item.Mobile = user.Mobile
+		item.Email = user.Email
+		item.CompanyId = user.CompanyId
+		item.CompanyName = user.CompanyName
+		item.RealName = user.RealName
+		_, err = models.AddCygxArticleCollect(item)
+		if err != nil {
+			br.Msg = "收藏失败"
+			br.ErrMsg = "收藏失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "收藏成功"
+		resp.Status = 1
+		// 文章收藏消息发送
+		//go services.ArticleUserRemind(user, detail, 2)
+	} else {
+		err = models.RemoveArticleCollect(uid, articleId)
+		if err != nil {
+			br.Msg = "取消收藏失败"
+			br.ErrMsg = "取消收藏失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "已取消收藏"
+		resp.Status = 2
+	}
+	collectTotal, err := models.GetArticleCollectUsersCount(articleId)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.CollectCount = collectTotal
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}
+
+// @Title 访谈申请\取消访谈申请
+// @Description 访谈申请\取消访谈申请
+// @Param	request	body models.ArticleInterviewApplyReq true "type json string"
+// @Success 200 {object} models.FontsCollectResp
+// @router /interview/apply [post]
+func (this *ArticleController) InterviewApply() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	var req models.ArticleInterviewApplyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	article, err := models.GetArticleDetailById(req.ArticleId)
+	if err != nil {
+		br.Msg = "获取纪要失败!"
+		br.ErrMsg = "获取纪要失败,Err:" + err.Error()
+		return
+	}
+
+	count, err := models.GetArticleInterviewApplyCount(uid, req.ArticleId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.ArticleInterviewApplyResp)
+	if count <= 0 {
+		item := new(models.CygxInterviewApply)
+		item.ArticleId = req.ArticleId
+		item.UserId = uid
+		item.CompanyId = user.CompanyId
+		item.Status = "待邀请"
+		item.Sort = 1
+		item.ArticleTitle = article.Title
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ArticleIdMd5 = article.ArticleIdMd5
+		_, err = models.AddCygxInterviewApply(item)
+		if err != nil {
+			br.Msg = "申请失败"
+			br.ErrMsg = "申请失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "申请成功"
+		resp.Status = 1
+		//发送模板消息
+		if user.CompanyId > 1 {
+			mobile := user.Mobile
+			if mobile == "" {
+				mobile = user.Email
+			}
+			sellerItem, _ := models.GetSellerByCompanyId(user.CompanyId)
+			if sellerItem != nil && sellerItem.AdminId > 0 && user.Mobile != "" {
+				openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
+				if openIpItem != nil && openIpItem.OpenId != "" {
+					go services.SendInterviewApplyTemplateMsg(user.RealName, sellerItem.CompanyName, mobile, article.Title, openIpItem)
+				}
+			}
+		}
+	} else {
+		err = models.RemoveArticleInterviewApply(uid, req.ArticleId)
+		if err != nil {
+			br.Msg = "取消申请失败"
+			br.ErrMsg = "取消申请失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "已取消申请"
+		resp.Status = 2
+		if user.CompanyId > 1 {
+			mobile := user.Mobile
+			if mobile == "" {
+				mobile = user.Email
+			}
+			sellerItem, _ := models.GetSellerByCompanyId(user.CompanyId)
+			if sellerItem != nil && sellerItem.AdminId > 0 && user.Mobile != "" {
+				openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
+				if openIpItem != nil && openIpItem.OpenId != "" {
+					go services.SendInterviewApplyCancelTemplateMsg(user.RealName, sellerItem.CompanyName, mobile, article.Title, openIpItem)
+				}
+			}
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}
+
+// @Title 文章带问
+// @Description 新增文章带问接口
+// @Param	request	body models.AddArticleAskRep true "type json string"
+// @Success Ret=200 新增成功
+// @router /askAdd [post]
+func (this *ArticleController) AskAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.AddArticleAskRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Content == "" {
+		br.Msg = "建议内容不可为空"
+		return
+	}
+
+	content := req.Content
+	itemToken, err := services.WxGetToken()
+	if err != nil {
+		br.Msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if itemToken.AccessToken == "" {
+		br.Msg = "accessToken is empty"
+		return
+	}
+	commerr, err := weapp.MSGSecCheck(itemToken.AccessToken, content)
+	if err != nil {
+		br.Msg = "内容校验失败!"
+		br.ErrMsg = "内容校验失败,Err:" + err.Error()
+
+		return
+	}
+	if commerr.ErrCode != 0 {
+		br.Msg = "内容违规,请重新提交!"
+		br.ErrMsg = "颜文字内容违规,Err:" + commerr.ErrMSG
+		return
+	}
+
+	articleId := req.ArticleId
+	count, _ := models.GetArticleCountById(articleId)
+	if count == 0 {
+		br.Msg = "操作失败"
+		br.ErrMsg = "文章ID错误,不存在 articleId:" + strconv.Itoa(articleId)
+		return
+	}
+	companyDetail, err := models.GetCompanyDetailById(user.CompanyId)
+	if err != nil {
+		br.Msg = "提交失败!"
+		br.ErrMsg = "获取客户详情失败,Err:" + err.Error()
+		return
+	}
+	if companyDetail == nil {
+		br.Msg = "提交失败!"
+		br.ErrMsg = "客户不存在,uid:" + strconv.Itoa(user.UserId)
+		return
+	}
+	item := new(models.CygxArticleAsk)
+	item.UserId = user.UserId
+	item.ArticleId = req.ArticleId
+	item.CompanyId = user.CompanyId
+	item.CompanyName = companyDetail.CompanyName
+	item.CreateTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.Content = content
+	_, err = models.AddArticleAsk(item)
+	if err != nil {
+		br.Msg = "提交失败"
+		br.ErrMsg = "提交失败,Err:" + err.Error()
+		return
+	}
+	companyItem, err := models.GetSellerDetailAllByCompanyId(user.CompanyId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取所属销售信息失败,Err:" + err.Error()
+		return
+	}
+	var mobile string
+	mobile = utils.WxMsgTemplateIdAskMsgMobile
+	openIdList, err := models.GetWxOpenIdByMobileList(mobile)
+	if err != nil {
+		br.Msg = "提交失败"
+		br.ErrMsg = "提交失败,Err:" + err.Error()
+		return
+	}
+	detail, err := models.GetArticleDetailById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	companyName := user.CompanyName + "-" + user.RealName + "(" + companyItem.SellerName + ")"
+	go services.SendWxMsgWithAsk(companyName, time.Now().Format(utils.FormatDateTime), content, detail.Title, openIdList, req.ArticleId)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "提交成功"
+}
+
+// @Title 文章相关热门收藏
+// @Description 文章相关热门收藏接口
+// @Param   ArticleId   query   int  true       "文章ID"
+// @Success 200 {object} models.ArticleCollectionLIstResp
+// @router /hotList [get]
+func (this *ArticleController) ArticleHotList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	articleId, _ := this.GetInt("ArticleId")
+	if articleId < 1 {
+		br.Msg = "请输入分类ID"
+		return
+	}
+	var condition string
+	condition = ` AND a.article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id IN (SELECT industrial_management_id  FROM cygx_industrial_article_group_management  WHERE  article_id = ` + strconv.Itoa(articleId) + ` ) ) AND a.article_id != ` + strconv.Itoa(articleId) + ` AND a.category_name LIKE '%研选%' AND publish_status = 1 GROUP BY a.article_id ORDER BY collect_num DESC, publish_date DESC LIMIT 3 `
+	list, err := models.GetArticleCollectionList(condition, user.UserId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	for k, v := range list {
+		if v.MyCollectNum > 0 {
+			list[k].IsCollect = true
+		}
+	}
+	resp := new(models.ArticleCollectionLIstResp)
+	if len(list) == 0 {
+		list = make([]*models.ArticleCollectionResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 0
go.mod

@@ -8,6 +8,7 @@ require (
 	github.com/beego/beego/v2 v2.0.5
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/go-sql-driver/mysql v1.6.0
+	github.com/medivhzhan/weapp/v2 v2.5.0 // indirect
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )

+ 2 - 0
go.sum

@@ -301,6 +301,8 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/medivhzhan/weapp/v2 v2.5.0 h1:WfgSHdZ34xM47w4b/5nGTSzaqHo1uizdDDKJsCRB2bY=
+github.com/medivhzhan/weapp/v2 v2.5.0/go.mod h1:lcP2Go0ow4ElqGsEQwEeyTZiiEhr+lC5zMxGZGA7Bsc=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=

+ 58 - 0
models/article.go

@@ -6,6 +6,7 @@ import (
 
 type ArticleDetail struct {
 	ArticleId            int             `description:"报告id"`
+	ArticleIdMd5         string          `description:"报告MD5id"`
 	IsReport             int             `description:"是否属于报告,1是,0否"`
 	Title                string          `description:"标题"`
 	CategoryName         string          `description:"一级分类"`
@@ -28,6 +29,7 @@ type ArticleDetail struct {
 	IsNeedJump           bool            `description:"是否需要跳转链接地址"`
 	Seller               SellerResp      `description:"作者昵称"`
 	DepartmentDetail     *DepartmentResp `description:"作者昵称"`
+	Disclaimers          string          `description:"免责声明"`
 }
 
 type SellerResp struct {
@@ -86,3 +88,59 @@ WHERE
 	err = o.Raw(sql, uid, uid, articleId).QueryRow(&item)
 	return
 }
+
+func GetArticleCountById(articleId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_article WHERE article_id = ? `
+	err = o.Raw(sql, articleId).QueryRow(&count)
+	return
+}
+
+//用户收藏榜start
+type ArticleCollectionResp struct {
+	ArticleId              int    `description:"文章id"`
+	Title                  string `description:"标题"`
+	PublishDate            string `description:"发布时间"`
+	IndustrialManagementId int    `description:"产业Id"`
+	IndustryName           string `description:"产业名称"`
+	DepartmentId           int    `description:"作者Id"`
+	NickName               string `description:"作者昵称"`
+	MyCollectNum           int    `description:"本人是否收藏"`
+	IsCollect              bool   `description:"本人是否收藏"`
+	Pv                     int    `description:"PV"`
+	CollectNum             int    `description:"收藏人数"`
+	Source                 int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+}
+
+//列表
+func GetArticleCollectionList(condition string, userId int) (items []*ArticleCollectionResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			a.article_id,
+			a.title,
+			date_format( a.publish_date, '%Y-%m-%d' ) AS publish_date,
+			m.industry_name,
+			m.industrial_management_id,
+			d.nick_name,
+			d.department_id,
+			( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
+			( SELECT count( 1 ) FROM cygx_article_collect AS ac  INNER JOIN wx_user as u ON  u.user_id = ac.user_id  WHERE ac.article_id = a.article_id  ) AS collect_num, 
+			( SELECT count( 1 ) FROM cygx_article_collect AS ac  INNER JOIN wx_user as u ON  u.user_id = ac.user_id  WHERE ac.article_id = a.article_id AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( ac.create_time )  ) AS collect_num_order, 
+			( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id  AND user_id = ? ) AS my_collect_num
+		FROM
+			cygx_article AS a
+			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
+			INNER JOIN cygx_article_department AS d ON d.department_id = a.department_id 
+		WHERE
+			1 = 1  AND a.publish_status = 1  `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, userId).QueryRows(&items)
+	return
+} //end
+
+type ArticleCollectionLIstResp struct {
+	List []*ArticleCollectionResp
+}

+ 30 - 0
models/article_ask.go

@@ -0,0 +1,30 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxArticleAsk struct {
+	AskId       int       `orm:"column(ask_id);pk" description:"带问id"`
+	UserId      int       `description:"用户id"`
+	ArticleId   int       `description:"文章id"`
+	CreateTime  time.Time `description:"创建时间"`
+	Mobile      string    `description:"手机号"`
+	Email       string    `description:"邮箱"`
+	CompanyId   int       `description:"公司id"`
+	CompanyName string    `description:"公司名称"`
+	Content     string    `description:"内容"`
+}
+
+//添加优化建议
+func AddArticleAsk(item *CygxArticleAsk) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type AddArticleAskRep struct {
+	ArticleId int    `description:"文章id"`
+	Content   string `description:"内容"`
+}

+ 32 - 0
models/user_record.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_clpt/utils"
 	"time"
 )
 
@@ -46,3 +47,34 @@ func UnBindUserRecordByOpenid(openId string) (err error) {
 	_, err = o.Raw(msql, openId).Exec()
 	return
 }
+
+type OpenIdList struct {
+	OpenId string
+	UserId int
+}
+
+//根据用户id和平台id获取用户关系
+func GetUserRecordByMobile(platform int, bindAccount string) (item *OpenIdList, err error) {
+
+	var sql string
+	if utils.RunMode == "release" {
+		sql = `SELECT cr.open_id,user_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			WHERE create_platform=? AND bind_account = ?`
+	} else {
+		platform = 1
+		sql = `SELECT open_id,user_id FROM	user_record  WHERE create_platform =? AND bind_account = ?`
+	}
+
+	err = orm.NewOrm().Raw(sql, platform, bindAccount).QueryRow(&item)
+	return
+}
+
+func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
+	//sql := `SELECT * FROM user_record WHERE bind_account IN (` + utils.WxMsgTemplateIdAskMsgMobile + `) AND create_platform = 1`
+	sql := `SELECT cr.*,user_id FROM user_record  as c
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = c.union_id
+			WHERE bind_account IN (` + mobile + `) AND create_platform = 4`
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}

+ 23 - 0
models/user_template_record.go

@@ -0,0 +1,23 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type UserTemplateRecord struct {
+	Id         int `orm:"column(id);pk"`
+	UserId     int
+	OpenId     string
+	Resource   string
+	SendData   string
+	Result     string
+	CreateDate string
+	CreateTime string
+	SendStatus int
+	SendType   int
+}
+
+//添加banner
+func AddUserTemplateRecord(item *UserTemplateRecord) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 118 - 0
models/wechat.go

@@ -1,5 +1,14 @@
 package models
 
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/http"
+	"hongze/hongze_clpt/utils"
+	"time"
+)
+
 type WxLoginReq struct {
 	Code string `description:"微信code"`
 }
@@ -55,3 +64,112 @@ type WxCheckContentJson struct {
 	Errcode      int    `json:"errcode"`
 	Errmsg       string `json:"errmsg"`
 }
+
+func GetWxAccessToken() (accessTokenStr string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM wx_token LIMIT 1`
+	wxToken := new(WxToken)
+	err = o.Raw(sql).QueryRow(&wxToken)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	//Token不存在
+	if wxToken == nil {
+		fmt.Println("wxToken is empty")
+		accessToken, err := GetWxToken()
+		if err != nil {
+			return "", err
+		}
+		if accessToken.AccessToken != "" {
+			expiresIn := time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second).Unix()
+			addSql := "insert into wx_token (access_token,expires_in) values (?,?)"
+			_, err = o.Raw(addSql, accessToken.AccessToken, expiresIn).Exec()
+			accessTokenStr = accessToken.AccessToken
+		}
+		return accessTokenStr, err
+	} else {
+		//判断token是否过期
+		if time.Now().Unix() > wxToken.ExpiresIn {
+
+			accessToken, err := GetWxToken()
+			fmt.Println(accessToken)
+			if err != nil {
+				return "", err
+			}
+			if accessToken.AccessToken != "" {
+				expiresIn := time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second).Unix()
+				updateSql := "update wx_token set access_token = ?,expires_in = ? "
+				_, err = o.Raw(updateSql, accessToken.AccessToken, expiresIn).Exec()
+				accessTokenStr = accessToken.AccessToken
+				fmt.Println("更新 TOKEN:", err)
+			}
+			return accessTokenStr, err
+		} else {
+			return wxToken.AccessToken, nil
+		}
+	}
+	return
+}
+
+func GetWxToken() (item *WxAccessToken, err error) {
+	getUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + utils.WxPublicAppId + "&secret=" + utils.WxPublicAppSecret
+	result, err := http.Get(getUrl)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println("GetWxToken Unmarshal Err:%s", err.Error())
+		return
+	}
+	if item.Errmsg != "" {
+		utils.FileLog.Info("GetWxToken fail result:%s", string(result))
+		err = fmt.Errorf(item.Errmsg)
+	}
+	return
+}
+
+func GetWxAccessTokenByXzs() (accessTokenStr string, err error) {
+
+	if utils.RunMode == "release" {
+		//缓存校验
+		cacheKey := "xygxxzs_wxtoken"
+		accessTokenStr, _ = utils.Rc.RedisString(cacheKey)
+		if accessTokenStr != "" {
+			return
+		} else {
+			WxAccessToken, errWx := GetWxTokenByXzs()
+			if errWx != nil {
+				err = errWx
+				return
+			}
+			accessTokenStr = WxAccessToken.AccessToken
+			utils.Rc.Put(cacheKey, WxAccessToken.AccessToken, time.Second*7000)
+		}
+	} else {
+		accessTokenStr, err = GetWxAccessToken()
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+//获取小助手的微信Token
+func GetWxTokenByXzs() (item *WxAccessToken, err error) {
+	getUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + utils.WxPublicAppId + "&secret=" + utils.WxPublicAppSecret
+	result, err := http.Get(getUrl)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println("GetWxToken Unmarshal Err:%s", err.Error())
+		return
+	}
+	if item.Errmsg != "" {
+		utils.FileLog.Info("GetWxToken fail result:%s", string(result))
+		err = fmt.Errorf(item.Errmsg)
+	}
+	return
+}

+ 36 - 0
routers/commentsRouter.go

@@ -7,6 +7,24 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "AskAdd",
+            Router: `/askAdd`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "ArticleCollect",
+            Router: `/collect`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
         beego.ControllerComments{
             Method: "Detail",
@@ -16,6 +34,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "ArticleHotList",
+            Router: `/hotList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "InterviewApply",
+            Router: `/interview/apply`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseResourceController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseResourceController"],
         beego.ControllerComments{
             Method: "GetSmsCode",

+ 7 - 0
services/article.go

@@ -69,3 +69,10 @@ func GetReportContentTextSubNew(content string) (contentSub string, err error) {
 	contentSub = strings.Replace(body, " ", "", -1)
 	return
 }
+
+func GetReportContentTextArticleBody(content string) (contentSub string) {
+	contentSub = html.UnescapeString(content)
+	contentSub = strings.Replace(contentSub, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
+	contentSub = strings.Replace(contentSub, "pre", "div", -1)
+	return
+}

+ 227 - 0
services/wechat_send_msg.go

@@ -0,0 +1,227 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"io/ioutil"
+	"net/http"
+	"time"
+)
+
+//访谈申请
+func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("访谈申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	keyword1 := realName + "【" + companyName + "】"
+	first := "您有一条新的访谈申请,请及时处理。"
+	keyword2 := mobile
+	keyword3 := time.Now().Format(utils.FormatDateTime)
+	keyword4 := articleTitle
+	fontColor := "#D9001B"
+	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
+	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
+	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
+
+	sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
+	sendMap["data"] = sendData
+	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	fmt.Println("send end")
+	return
+}
+
+//访谈申请取消
+func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("访谈申请取消模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	first := realName + "-" + mobile + "【" + companyName + "】的访谈申请已取消,请留意。"
+	keyword1 := articleTitle
+	keyword2 := time.Now().Format(utils.FormatDateTime)
+	fontColor := "#D9001B"
+	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
+
+	sendMap["template_id"] = utils.WxMsgTemplateIdApplyCancelXzs
+	sendMap["data"] = sendData
+	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	fmt.Println("send end")
+	return
+}
+
+//权限申请
+func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("权限申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	var accessToken string
+	if utils.RunMode == "release" {
+		accessToken, err = models.GetWxAccessTokenByXzs()
+		if err != nil {
+			msg = "GetWxAccessToken Err:" + err.Error()
+			return
+		}
+		if accessToken == "" {
+			msg = "accessToken is empty"
+			return
+		}
+	} else {
+		accessToken, err = models.GetWxAccessToken()
+		if err != nil {
+			msg = "GetWxAccessToken Err:" + err.Error()
+			return
+		}
+		if accessToken == "" {
+			msg = "accessToken is empty"
+			return
+		}
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	keyword1 := realName + "【" + companyName + "】"
+	first := "查研观向有一条新的权限申请,请及时处理。"
+	keyword2 := mobile
+	keyword3 := time.Now().Format(utils.FormatDateTime)
+	keyword4 := applyMethod
+	fontColor := "#D9001B"
+	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
+	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
+	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
+	if utils.RunMode == "release" {
+		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
+	} else {
+		sendMap["template_id"] = utils.WxMsgTemplateIdApply
+	}
+	sendMap["data"] = sendData
+	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	fmt.Println("send end")
+	return
+}
+
+func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, itemOpenid *models.OpenIdList, resource string, sendType int) (err error) {
+	sendMap["touser"] = itemOpenid.OpenId
+	data, err := json.Marshal(sendMap)
+	if err != nil {
+		fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+		return err
+	}
+	err = toSendTemplateMsg(sendUrl, data, resource, sendType, itemOpenid)
+	if err != nil {
+		fmt.Println("send err:", err.Error())
+	}
+	return
+}
+
+func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
+	client := http.Client{}
+	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	var templateResponse SendTemplateResponse
+	err = json.Unmarshal(body, &templateResponse)
+	fmt.Println(templateResponse)
+	utils.FileLog.Info("SendResult %s:", string(body))
+	if err != nil {
+		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
+		return err
+	}
+	//新增模板消息推送记录
+	{
+		tr := new(models.UserTemplateRecord)
+		tr.UserId = dataItem.UserId
+		tr.OpenId = dataItem.OpenId
+		tr.Resource = resource
+		tr.SendData = string(data)
+		tr.Result = string(body)
+		tr.CreateDate = time.Now().Format(utils.FormatDate)
+		tr.CreateTime = time.Now().Format(utils.FormatDateTime)
+		if templateResponse.Errcode == 0 {
+			tr.SendStatus = 1
+		} else {
+			tr.SendStatus = 0
+		}
+		tr.SendType = sendType
+		go func() {
+			err = models.AddUserTemplateRecord(tr)
+			if err != nil {
+				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
+			}
+		}()
+	}
+	return
+}
+
+type SendTemplateResponse struct {
+	Errcode int    `json:"errcode"`
+	Errmsg  string `json:"errmsg"`
+	MsgID   int    `json:"msgid"`
+}

+ 126 - 0
services/wx_template_msg.go

@@ -0,0 +1,126 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"time"
+)
+
+//发送报告提问消息提醒
+func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+		fmt.Println("line 21", err, msg)
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+	//accessToken, err := models.GetWxAccessToken()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var first string
+	var keyword1 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+	first = "研选报告有新的提问,请及时处理"
+	keyword1 = name
+	keyword3 = askTime
+	keyword4 = askMsg
+	remark = title
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	//templateId := utils.WxMsgTemplateIdAskMsg
+	templateId := utils.WxMsgTemplateIdAskMsgXzs
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "path": "article/detail?ArticleId=1000001"}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": "", "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	return
+}
+
+func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
+	for _, v := range items {
+		sendMap["touser"] = v.OpenId
+		data, err := json.Marshal(sendMap)
+		if err != nil {
+			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+			return err
+		}
+		utils.FileLog.Info("One SendData:%s", string(data))
+		fmt.Println(string(data))
+		err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
+		if err != nil {
+			fmt.Println("send err:", err.Error())
+			return err
+		}
+	}
+	return
+}
+
+func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
+	client := http.Client{}
+	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("SendResult:%s", string(body))
+	var templateResponse SendTemplateResponse
+	err = json.Unmarshal(body, &templateResponse)
+	fmt.Println(templateResponse.Errcode)
+	fmt.Println(templateResponse.Errmsg)
+	if err != nil {
+		return err
+	}
+	//新增模板消息推送记录
+	{
+		tr := new(models.UserTemplateRecord)
+		tr.UserId = dataItem.UserId
+		tr.OpenId = dataItem.OpenId
+		tr.Resource = resource
+		tr.SendData = string(data)
+		tr.Result = string(body)
+		tr.CreateDate = time.Now().Format(utils.FormatDate)
+		tr.CreateTime = time.Now().Format(utils.FormatDateTime)
+		if templateResponse.Errcode == 0 {
+			tr.SendStatus = 1
+		} else {
+			tr.SendStatus = 0
+		}
+		tr.SendType = sendType
+		go func() {
+			err = models.AddUserTemplateRecord(tr)
+			if err != nil {
+				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
+			}
+		}()
+	}
+	return
+}

+ 22 - 7
utils/config.go

@@ -23,9 +23,14 @@ var (
 	WxAppId     string //查研观向小程序
 	WxAppSecret string //查研观向小程序
 
-	WxPublicAppId     string //查研观向小助手公众号
-	WxPublicAppSecret string //查研观向小助手公众号
-	HeadimgurlDefault string //默认头像
+	WxPublicAppId                 string //查研观向小助手公众号
+	WxPublicAppSecret             string //查研观向小助手公众号
+	HeadimgurlDefault             string //默认头像
+	WxMsgTemplateIdApplyXzs       string //申请待处理(小助手)
+	WxMsgTemplateIdApplyCancelXzs string //预约取消提醒(小助手)
+	WxMsgTemplateIdApply          string //申请待处理
+	WxMsgTemplateIdAskMsgMobile   string //手机号用户【XXX】发送模板消息
+	WxMsgTemplateIdAskMsgXzs      string //手机号用户【XXX】发送模板消息模板ID(小助手)
 )
 
 func init() {
@@ -66,11 +71,21 @@ func init() {
 		panic(Re)
 	}
 	if RunMode == "release" {
-		WxPublicAppId = "wxb7cb8a15abad5b8e"                   //查研观向小助手
-		WxPublicAppSecret = "f425ba2863084249722af1e2a5cfffd3" //查研观向小助手
+		WxPublicAppId = "wxb7cb8a15abad5b8e"                                          //查研观向小助手
+		WxPublicAppSecret = "f425ba2863084249722af1e2a5cfffd3"                        //查研观向小助手
+		WxMsgTemplateIdApplyXzs = "IpS-yuNNQc8osCoy20jPHNkvBUyKRL1NGn7c0G9xmQA"       //申请待处理(小助手)
+		WxMsgTemplateIdApplyCancelXzs = "gCSCAWNNhjkzE2V1cjbIV_Ex68R_8LM_u25qDlSKWyM" ////预约取消提醒(小助手)
+		WxMsgTemplateIdApply = "PaoDanHGlt1kFw5q-4_ipJSwO3FyZpxSSNg4rwB7YCk"
+		WxMsgTemplateIdAskMsgMobile = "15557270714,17634786714,18767183922,17516315016"
+		WxMsgTemplateIdAskMsgXzs = "IpS-yuNNQc8osCoy20jPHNkvBUyKRL1NGn7c0G9xmQA" //手机号用户【XXX】发送模板消息模板ID(小助手)
 	} else {
-		WxPublicAppId = "wx9b5d7291e581233a"                   //弘则投研公众号 开发者ID(AppID)
-		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861" //弘则投研公众号秘钥
+		WxPublicAppId = "wx9b5d7291e581233a"                                          //弘则投研公众号 开发者ID(AppID)
+		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861"                        //弘则投研公众号秘钥
+		WxMsgTemplateIdApplyXzs = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"       //申请待处理(小助手)
+		WxMsgTemplateIdApplyCancelXzs = "UU_d7ks0XZBnWg2xFzxL9Heilm4kisX39K7dr4SDdO8" ////预约取消提醒(小助手)
+		WxMsgTemplateIdApply = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"
+		WxMsgTemplateIdAskMsgMobile = "15557270714,17634786714,18767183922,17516315016"
+		WxMsgTemplateIdAskMsgXzs = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo" //手机号用户【XXX】发送模板消息模板ID(小助手)
 	}
 	HeadimgurlDefault = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202202/20220225/XFBBOUmDC5AXkfxnHiuqKpPtoofH.png"
 }

+ 8 - 0
utils/constants.go

@@ -25,6 +25,7 @@ const (
 	ApiAuthorization    = "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJwaG9uZV9udW1iZXIiOiIxMjM0NTY3ODkiLCJuYW1lIjoi5YW25LuWIiwiZW50cmFuY2UiOiJwYXNzd3dvcmQiLCJpYXQiOjE2MzQ4NzA1OTQsImV4cCI6MTYzNDg3NDE5NH0.tho2L9jsbDPn8ltEGUVDve_nHsh0Kzf6ZrSz0RcZ0ag"
 	ApiUrl              = "https://vmp.hzinsights.com/v2api/"
 	CHART_INFO_HTTP_URL = "https://vmp.hzinsights.com/v2/charts/"
+	DISCLAIMERS         = "本文为用户投稿,用户在平台中发表的所有资料、言论等仅代表个人观点,与本平台立场无关,不对您构成任何投资建议。本平台对文中陈述、观点判断保持中立,不对所包含内容及数据的真实性、准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。"
 )
 
 //手机号,电子邮箱正则
@@ -75,3 +76,10 @@ const (
 	StrategyPlatform                 string = "https://vmp.hzinsights.com/v2/articles/"
 	DefaultHeadimgurl                string = "https://hzstatic.hzinsights.com/static/temp/20220426202204/20220426/P5qLR2zzfBdKItp3eX2Du1tvq9Ba.jpg"
 )
+
+//模板消息推送类型
+const (
+	TEMPLATE_MSG_CYGX_ACTIVITY_ADD = 12 //查研观向小程序活动更新推送 12
+	TEMPLATE_MSG_CYGX_ARTICLE_ADD  = 13 //查研观向报告更新推送  13
+	TEMPLATE_MSG_CYGX_APPLY        = 14 //查研观向审批通知
+)