rdluck 4 years ago
parent
commit
39da03a718
6 changed files with 340 additions and 13 deletions
  1. 2 2
      models/article.go
  2. 22 5
      services/elastic.go
  3. 118 0
      services/go-elasticsearch.go
  4. 11 2
      services/task.go
  5. 178 0
      services/wechat_send_msg.go
  6. 9 4
      utils/config.go

+ 2 - 2
models/article.go

@@ -13,6 +13,7 @@ type CygxArticle struct {
 	CreateDate       string `description:"创建时间"`
 	PublishDate      string `description:"发布时间"`
 	Body             string `description:"内容"`
+	BodyText         string `description:"内容"`
 	Abstract         string `description:"摘要"`
 	CategoryName     string `description:"一级分类"`
 	SubCategoryName  string `description:"二级分类"`
@@ -141,7 +142,6 @@ func ModifyArticleContent(articleId int, content, expertNumStr, expertContentStr
 	return
 }
 
-
 type ElasticArticleDetail struct {
 	ArticleId            int    `description:"报告id"`
 	Title                string `description:"标题"`
@@ -163,4 +163,4 @@ type ElasticArticleDetail struct {
 	SellerMobile         string `description:"销售手机号"`
 	SellerName           string `description:"销售名称"`
 	ArticleIdMd5         string `description:"纪要id"`
-}
+}

+ 22 - 5
services/elastic.go

@@ -39,12 +39,12 @@ func EsCreateIndex(indexName, mappingJson string) (err error) {
 		resp, err := client.CreateIndex(indexName).BodyJson(mappingJson).Do(context.Background())
 		//BodyJson(bodyJson).Do(context.Background())
 		if err != nil {
-			fmt.Println("CreateIndex Err:"+err.Error())
+			fmt.Println("CreateIndex Err:" + err.Error())
 			return err
 		}
 		fmt.Println(resp.Index, resp.ShardsAcknowledged, resp.Acknowledged)
-	}else{
-		fmt.Println(indexName+" 已存在")
+	} else {
+		fmt.Println(indexName + " 已存在")
 	}
 	return
 }
@@ -144,7 +144,18 @@ func EsMatchQuery(indexName, keyWord string) (result []*models.SearchItem, err e
 			if _, ok := searchMap[article.ArticleId]; !ok {
 				searchItem := new(models.SearchItem)
 				searchItem.ArticleId, _ = strconv.Atoi(v.Id)
-				searchItem.Body = v.Highlight["BodyText"]
+				if len(v.Highlight["BodyText"]) > 0 {
+					searchItem.Body = v.Highlight["BodyText"]
+				} else {
+					bodyRune := []rune(article.BodyText)
+					bodyRuneLen:=len(bodyRune)
+					if bodyRuneLen>200 {
+						bodyRuneLen=200
+					}
+					body:= string(bodyRune[:bodyRuneLen])
+					fmt.Println(body)
+					searchItem.Body = []string{body}
+				}
 				var title string
 				if len(v.Highlight["Title"]) > 0 {
 					title = v.Highlight["Title"][0]
@@ -176,8 +187,10 @@ func EsMatchPhraseQuery(indexName, keyWord string) (result []*models.SearchItem,
 	matchArr := make([]elastic.Query, 0)
 	//matchq1 := elastic.NewMatchQuery("Title", keyWord).Boost(n + 1).Analyzer("ik_smart")
 	//matchq2 := elastic.NewMatchQuery("BodyText", keyWord).Boost(n + 1).Analyzer("ik_smart")
-	matchq1 := elastic.NewTermQuery("BodyText", keyWord)
+	matchq1 := elastic.NewMatchPhraseQuery("Title", keyWord) //.Analyzer("ik_smart")
+	matchq2 := elastic.NewMatchPhraseQuery("BodyText", keyWord)
 	matchArr = append(matchArr, matchq1)
+	matchArr = append(matchArr, matchq2)
 	//matchArr = append(matchArr, matchq2)
 	//for _, v := range keyWordArr {
 	//	if v != "" {
@@ -189,12 +202,16 @@ func EsMatchPhraseQuery(indexName, keyWord string) (result []*models.SearchItem,
 	//	n--
 	//}
 	//boolquery.Should(matchArr...)
+
 	boolquery.Should(matchArr...)
+
 	highlight := elastic.NewHighlight()
 	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
 	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
 	request := client.Search(indexName).Highlight(highlight).Size(pageSize).Query(boolquery)
 	searchByMatch, err := request.Do(context.Background())
+	fmt.Println("err:", err, searchByMatch)
+	return
 	if searchByMatch.Hits != nil {
 		for _, v := range searchByMatch.Hits.Hits {
 			articleJson, err := v.Source.MarshalJSON()

+ 118 - 0
services/go-elasticsearch.go

@@ -0,0 +1,118 @@
+package services
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/elastic/go-elasticsearch/v7"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"io/ioutil"
+)
+
+/*
+Addresses []string // A list of Elasticsearch nodes to use.
+
+	Logger    estransport.Logger   // The logger object.
+	Selector  estransport.Selector // The selector object.
+*/
+
+//官方库
+func NewEsV7Client() (client *elasticsearch.Client, err error) {
+
+	conf := elasticsearch.Config{
+		Addresses: []string{ES_URL},
+		Username:  ES_USERNAME,
+		Password:  ES_PASSWORD,
+	}
+	client, err = elasticsearch.NewClient(conf)
+	return
+}
+
+func EsV7Search(indexName, keyWord string) (result []*models.SearchItem, err error) {
+	//pageSize := 20
+	client, err := NewEsV7Client()
+	if err != nil {
+		fmt.Println("NewEsV7Client Err:", err.Error())
+		return
+	}
+	var buf bytes.Buffer
+	query := map[string]interface{}{
+		"query": map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"BodyText": map[string]interface{}{
+					"query":    "康立明",
+				},
+			},
+		},
+		"highlight": map[string]interface{}{
+			"pre_tags":  []string{"<font color='red'>"},
+			"post_tags": []string{"</font>"},
+			"fields": map[string]interface{}{
+				"BodyText": map[string]interface{}{},
+			},
+		},
+	}
+	queryJson,err:=json.Marshal(query)
+	utils.FileLog.Info("%s",string(queryJson))
+
+	if err := json.NewEncoder(&buf).Encode(query); err != nil {
+		fmt.Println(err, "Error encoding query")
+	}
+	res, err := client.Search(
+		client.Search.WithIndex(indexName),
+		client.Search.WithBody(&buf),
+		client.Search.WithTrackTotalHits(true),
+		client.Search.WithPretty(),
+		client.Search.WithContext(context.Background()),
+	)
+	if err != nil {
+		fmt.Println("search err:", err)
+	}
+	defer res.Body.Close()
+	body, err := ioutil.ReadAll(res.Body)
+	utils.FileLog.Info("%s", string(body))
+	//boolQuery := elastic.NewBoolQuery()
+	//
+	//matchArr := make([]elastic.Query, 0)
+	////matchq1 := elastic.NewMatchQuery("Title", keyWord).Boost(n + 1).Analyzer("ik_smart")
+	////matchq2 := elastic.NewMatchQuery("BodyText", keyWord).Boost(n + 1).Analyzer("ik_smart")
+	//matchq1 := elastic.NewMatchPhraseQuery("Title", keyWord) //.Analyzer("ik_smart")
+	//matchq2 := elastic.NewMatchPhraseQuery("BodyText", keyWord)
+	//matchArr = append(matchArr, matchq1)
+	//matchArr = append(matchArr, matchq2)
+	////matchArr = append(matchArr, matchq2)
+	////for _, v := range keyWordArr {
+	////	if v != "" {
+	////		matchq1 := elastic.NewMatchQuery("Title", v).Boost(n).Analyzer("ik_smart")
+	////		matchq2 := elastic.NewMatchQuery("BodyText", v).Boost(n).Analyzer("ik_smart")
+	////		matchArr = append(matchArr, matchq1)
+	////		matchArr = append(matchArr, matchq2)
+	////	}
+	////	n--
+	////}
+	////boolquery.Should(matchArr...)
+	//
+	//boolQuery.Should(matchArr...)
+	//
+	//highlight := elastic.NewHighlight()
+	//highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	//highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	//
+	//service := client.Search().Index(indexName).Highlight(highlight).Query(boolQuery).Size(pageSize)
+	//resp, err := service.Do(context.Background())
+	//if err != nil {
+	//	return nil, err
+	//}
+	//
+	//if resp.TotalHits() == 0 {
+	//	return nil, nil
+	//}
+	//for _, e := range resp.Each(reflect.TypeOf(&models.SearchItem{})) {
+	//	us := e.(*models.SearchItem)
+	//	result = append(result, us)
+	//}
+	//return result, nil
+	return
+}

+ 11 - 2
services/task.go

@@ -2,6 +2,7 @@ package services
 
 import (
 	"fmt"
+	//"github.com/astaxie/beego/cache"
 )
 
 func Task() {
@@ -131,11 +132,19 @@ func Task() {
 	//}
 
 	//fmt.Println("bm")
-	//bm, err := cache.NewCache("file", `{"CachePath":"./temp/cache","FileSuffix":".cache","DirectoryLevel":2,"EmbedExpiry":"120"}`)
+	//bm, err := cache.NewCache("file", `{"CachePath":"./cache","FileSuffix":".cache", "EmbedExpiry": "120"}`)
+	////
 	//if err != nil {
 	//	fmt.Println("false",err)
 	//}
-	//fmt.Println(bm)
+	////fmt.Println(bm)
+	//key:="put_key_one"
+	////bm.Put(key,1,1*time.Second)
+	//b:=bm.IsExist(key)
+	//fmt.Println(b)
+	indexName := "article_list"
+	keyWord:=`康立明`
+	EsV7Search(indexName,keyWord)
 	fmt.Println("end")
 }
 

+ 178 - 0
services/wechat_send_msg.go

@@ -0,0 +1,178 @@
+package services
+
+import (
+
+)
+//
+//func SendWxTemplateMsg(reportId int) (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)
+//			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
+//		}
+//		if msg != "" {
+//			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+//		}
+//	}()
+//	utils.FileLog.Info("%s", "services SendMsg")
+//
+//	report, err := models.GetReportById(reportId)
+//	if err != nil {
+//		msg = "GetReportInfo Err:" + err.Error()
+//		return
+//	}
+//	if report == nil {
+//		utils.FileLog.Info("报告信息不存在")
+//		return
+//	}
+//	accessToken, err := models.GetWxAccessToken()
+//	if err != nil {
+//		msg = "GetWxAccessToken Err:" + err.Error()
+//		return
+//	}
+//	if accessToken == "" {
+//		msg = "accessToken is empty"
+//		return
+//	}
+//	openIdList, err := models.GetOpenIdList()
+//	if err != nil {
+//		msg = "get openIdList err:" + err.Error()
+//		return
+//	}
+//	fmt.Println("openIdListCount:", len(openIdList))
+//
+//	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+//	fmt.Println("send start")
+//	utils.FileLog.Info("send start")
+//	//if report.MsgIsSend == 0 {
+//	sendMap := make(map[string]interface{})
+//	sendData := make(map[string]interface{})
+//
+//	redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
+//	keyword1 := "弘则日度点评"
+//	first := "Hi,最新一期日度点评已上线,欢迎查看"
+//	keyword2 := report.Title
+//	//keyword3 := report.PublishTime.Format(utils.FormatDateTime)
+//	keyword3 := report.PublishTime
+//	keyword4 := report.Abstract
+//
+//	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+//	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+//	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+//	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+//	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+//
+//	sendMap["template_id"] = utils.TemplateIdByProduct
+//	sendMap["url"] = redirectUrl
+//	sendMap["data"] = sendData
+//	sendTemplateMsg(sendUrl, sendMap, openIdList)
+//	//}
+//	fmt.Println("send end")
+//	utils.FileLog.Info("send end")
+//	return
+//}
+//
+//func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList) (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())
+//			utils.FileLog.Info("SendTemplateMsgOne Marshal Err:%s", err.Error())
+//			return err
+//		}
+//		err = toSendTemplateMsg(sendUrl, data)
+//		if err != nil {
+//			fmt.Println("send err:", err.Error())
+//			utils.FileLog.Info("ToSendTemplateMsg Err:%s", err.Error())
+//		}
+//	}
+//	return
+//}
+//
+//func toSendTemplateMsg(sendUrl string, data []byte) (err error) {
+//	utils.FileLog.Info("Send:%s", string(data))
+//	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)
+//	if err != nil {
+//		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
+//		return err
+//	}
+//	return
+//}
+//
+//type SendTemplateResponse struct {
+//	Errcode int    `json:"errcode"`
+//	Errmsg  string `json:"errmsg"`
+//	MsgID   int    `json:"msgid"`
+//}
+//
+//func SendCompanyApplyWxTemplateMsg(mobile, applyType string) (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)
+//			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
+//		}
+//		if msg != "" {
+//			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+//		}
+//	}()
+//	utils.FileLog.Info("%s", "services SendMsg")
+//
+//	accessToken, err := models.GetWxAccessToken()
+//	if err != nil {
+//		msg = "GetWxAccessToken Err:" + err.Error()
+//		return
+//	}
+//	if accessToken == "" {
+//		msg = "accessToken is empty"
+//		return
+//	}
+//	utils.FileLog.Info("mobile:%s", mobile)
+//	openIdList, err := models.GetOpenIdListByMobile(mobile)
+//	if err != nil {
+//		msg = "get openIdList err:" + err.Error()
+//		return
+//	}
+//	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
+//	//fmt.Println("openIdListCount:", len(openIdList))
+//	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
+//		utils.FileLog.Info("start send")
+//		sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+//		fmt.Println("send start")
+//		utils.FileLog.Info("send start")
+//		sendMap := make(map[string]interface{})
+//		sendData := make(map[string]interface{})
+//
+//		redirectUrl := "" //utils.TemplateRedirectUrl + strconv.Itoa(reportId)
+//		keyword1 := applyType
+//		first := "Hi,有新的订单需要审批"
+//		keyword2 := time.Now().Format(utils.FormatDateTime)
+//		keyword3 := ""
+//		remark := ""
+//
+//		sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+//		sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+//		sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+//		sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+//		sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+//
+//		sendMap["template_id"] = utils.TemplateIdByCompanyApply
+//		sendMap["url"] = redirectUrl
+//		sendMap["data"] = sendData
+//		sendTemplateMsg(sendUrl, sendMap, openIdList)
+//	}
+//	utils.FileLog.Info("send end")
+//	return
+//}

+ 9 - 4
utils/config.go

@@ -17,11 +17,13 @@ var (
 
 //微信配置信息
 var (
-	WxId                string //微信原始ID
-	WxAppId             string
-	WxAppSecret         string
-)
+	WxId        string //微信原始ID
+	WxAppId     string
+	WxAppSecret string
 
+	WxMsgTemplateIdApply       string //申请待处理
+	WxMsgTemplateIdApplyCancel string //预约取消提醒
+)
 
 func init() {
 	RunMode = beego.AppConfig.String("run_mode")
@@ -45,6 +47,9 @@ func init() {
 		WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
 		WxId = "gh_a9d3744e1072"
 		STATIC_DIR = "/home/static/imgs/"
+
+		WxMsgTemplateIdApply = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"
+		WxMsgTemplateIdApplyCancel = "UU_d7ks0XZBnWg2xFzxL9Heilm4kisX39K7dr4SDdO8"
 	}
 }