package service import ( cm "app.yhyue.com/moapp/jybase/common" elastic "app.yhyue.com/moapp/jybase/esv1" . "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/entity" "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/rpc/knowledge/knowledge" "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/rpc/knowledge/util" "github.com/zeromicro/go-zero/core/logx" "log" "strconv" "time" ) type CommonPhrasesService struct{} var ( INDEX = "common_phrases" TYPE = "common_phrases" ) // CommonPhrasesAdd 客服话术添加 func (c *CommonPhrasesService) CommonPhrasesAdd(param *knowledge.CommonPhrasesAddReq, segment string) (ok bool, msg string) { ok = true msg = "操作成功" //分词 keywords := "" keywordsArr := util.HanlpGetNormalWords(param.Content, segment) if len(keywordsArr) != 0 { for _, val := range keywordsArr { keywords += val + " " } } if keywords == "" { keywords = param.Content } now := time.Now() if param.Id > 0 { //编辑 updateData := map[string]interface{}{ "classify": param.Classify, "content": param.Content, "createPerson": param.EntUserId, "updateTime": time.Now().Local().Format(util.DateFullLayout), "keywords": keywords, } ok1 := Mysql.Update(util.COMMONPHRASES, map[string]interface{}{"id": param.Id}, updateData) if ok1 { query := `{"query":{"bool":{"must":[{"term":{"phrasesId":"` + strconv.Itoa(int(param.Id)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}` //修改es数据 insertData := map[string]interface{}{ "entId": param.EntId, "appId": param.AppId, "classify": param.Classify, "content": param.Content, "createPerson": param.EntUserId, "status": 0, "createTime": now.Unix(), "keywords": keywords, "phrasesId": param.Id, } ok2 := elastic.Del(INDEX, TYPE, query) ok3 := elastic.Save(INDEX, TYPE, insertData) if !(ok2 && ok3) { ok = false msg = "操作失败" } } else { ok = false msg = "操作失败" } } else { insertData := map[string]interface{}{ "entId": param.EntId, "appId": param.AppId, "classify": param.Classify, "content": param.Content, "createPerson": param.EntUserId, "status": 0, "createTime": now.Local().Format(util.DateFullLayout), "keywords": keywords, "updateTime": now.Format(util.DateFullLayout), } in := Mysql.Insert(util.COMMONPHRASES, insertData) if in > -1 { insertData["createTime"] = now.Unix() insertData["phrasesId"] = in delete(insertData, "updateTime") ok := elastic.Save(INDEX, TYPE, insertData) if !ok { ok = false msg = "操作失败" } } else { ok = false msg = "操作失败" } } return ok, msg } // CommonPhrasesInfo 客服话术详情 func (c *CommonPhrasesService) CommonPhrasesInfo(id int64) (data *knowledge.CommonPhrases, ok bool) { info := Mysql.FindOne(util.COMMONPHRASES, map[string]interface{}{"id": id}, "", "") if info != nil && len(*info) > 0 { data = &knowledge.CommonPhrases{} data.Id = cm.Int64All((*info)["id"]) data.Classify = cm.ObjToString((*info)["classify"]) data.Content = cm.ObjToString((*info)["content"]) return data, true } return nil, false } // CommonPhrasesDel 客服话术删除 func (c *CommonPhrasesService) CommonPhrasesDel(id int64) bool { ok := Mysql.Update(util.COMMONPHRASES, map[string]interface{}{"id": id}, map[string]interface{}{"status": 1, "updateTime": time.Now().Local().Format(util.DateFullLayout)}) if ok { //删除es数据 query := `{"query":{"bool":{"must":[{"term":{"phrasesId":"` + strconv.Itoa(int(id)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}` ok = elastic.Del(INDEX, TYPE, query) log.Println(ok, "---------------") } return ok } // CommonPhrasesList 客服话术列表 func (c *CommonPhrasesService) CommonPhrasesList(param *knowledge.CommonPhrasesListReq) *knowledge.CommonPhrasesList { var commonPhrasesList knowledge.CommonPhrasesList var data []*knowledge.CommonPhrases count := Mysql.Count(util.COMMONPHRASES, map[string]interface{}{"status": 0, "appId": param.AppId, "entId": param.EntId}) if count > 0 { dataList := Mysql.Find(util.COMMONPHRASES, map[string]interface{}{"status": 0, "appId": param.AppId, "entId": param.EntId}, "", "updateTime desc", cm.IntAll((param.PageIndex-1)*param.PageSize), cm.IntAll(param.PageSize)) if dataList != nil && len(*dataList) > 0 { for _, val := range *dataList { data = append(data, &knowledge.CommonPhrases{ Id: cm.Int64All(val["id"]), Content: cm.ObjToString(val["content"]), Classify: cm.ObjToString(val["classify"]), }) } } commonPhrasesList.Data = data commonPhrasesList.Total = count } return &commonPhrasesList } // CommonPhrasesClassList 客服话术分类 func (c *CommonPhrasesService) CommonPhrasesClassList(param *knowledge.CommonPhrasesClassListReq) []*knowledge.CommonPhrasesClassListData { var classListArr []*knowledge.CommonPhrasesClassListData //先查询数据在分类、排序 data := &[]map[string]interface{}{} if param.Query != "" { data = Mysql.SelectBySql("SELECT classify,content FROM `socialize_common_phrases` WHERE entId = ? AND appId = ? AND status = 0 AND (content like '%"+param.Query+"%' OR classify like '%"+param.Query+"%') ORDER BY CONVERT(classify USING GBK) ASC", param.EntId, param.AppId) } else { data = Mysql.SelectBySql("SELECT classify,content FROM `socialize_common_phrases` WHERE entId = ? AND appId = ? AND status = 0 ORDER BY CONVERT(classify USING GBK) ASC", param.EntId, param.AppId) } if data != nil && len(*data) > 0 { m := map[string][]string{} for _, val := range *data { classify := cm.ObjToString(val["classify"]) m[classify] = append(m[classify], cm.ObjToString(val["content"])) } if m != nil && len(m) > 0 { for k, v := range m { classList := &knowledge.CommonPhrasesClassListData{} classList.Classify = k for _, i := range v { classList.ClassList = append(classList.ClassList, &knowledge.Content{ Content: i, }) } classListArr = append(classListArr, classList) } //sort.Sort(classListArr) } } return classListArr } func (c *CommonPhrasesService) CommonPhraseQuery(param *knowledge.CommonPhraseQueryReq, segment string, findCount int) []*knowledge.Content { var ( keyWords = "" searchField = `"content"` contents []*knowledge.Content ) //根据问题进行分词 keywordsArr := util.HanlpGetNormalWords(param.Query, segment) logx.Info("keywordsArr", keywordsArr) if len(keywordsArr) != 0 { for _, val := range keywordsArr { keyWords += val + " " } } if keyWords == "" { keyWords = param.Query } //logx.Info("entId:", SE.Decode4Hex(param.RobotEntId)) var query = util.DSL4SearchByKwsOrid(keyWords, strconv.Itoa(int(param.EntId)), 1) res := elastic.GetAllByNgram(INDEX, TYPE, query, "", "", searchField, 0, findCount, 0, false) if res != nil && len(*res) > 0 { for _, val := range *res { contents = append(contents, &knowledge.Content{ Content: cm.ObjToString(val["content"]), }) } log.Println("推荐答案:", contents) } return contents }