commonPhrasesService.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package service
  2. import (
  3. cm "app.yhyue.com/moapp/jybase/common"
  4. elastic "app.yhyue.com/moapp/jybase/esv1"
  5. . "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/entity"
  6. "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/rpc/knowledge/knowledgeclient"
  7. "bp.jydev.jianyu360.cn/SocialPlatform/knowledgeBase/rpc/knowledge/util"
  8. "github.com/zeromicro/go-zero/core/logx"
  9. "log"
  10. "strconv"
  11. "time"
  12. )
  13. type CommonPhrasesService struct{}
  14. var (
  15. INDEX = "common_phrases"
  16. TYPE = "common_phrases"
  17. )
  18. // CommonPhrasesAdd 客服话术添加
  19. func (c *CommonPhrasesService) CommonPhrasesAdd(param *knowledgeclient.CommonPhrasesAddReq, segment string) (ok bool, msg string) {
  20. ok = true
  21. msg = "操作成功"
  22. //分词
  23. keywords := ""
  24. keywordsArr := util.HanlpGetNormalWords(param.Content, segment)
  25. if len(keywordsArr) != 0 {
  26. for _, val := range keywordsArr {
  27. keywords += val + " "
  28. }
  29. }
  30. if keywords == "" {
  31. keywords = param.Content
  32. }
  33. now := time.Now()
  34. if param.Id > 0 { //编辑
  35. updateData := map[string]interface{}{
  36. "classify": param.Classify,
  37. "content": param.Content,
  38. "createPerson": param.EntUserId,
  39. "updateTime": time.Now().Local().Format(util.DateFullLayout),
  40. "keywords": keywords,
  41. }
  42. ok1 := Mysql.Update(util.COMMONPHRASES, map[string]interface{}{"id": param.Id}, updateData)
  43. if ok1 {
  44. query := `{"query":{"bool":{"must":[{"term":{"phrasesId":"` + strconv.Itoa(int(param.Id)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}`
  45. //修改es数据
  46. insertData := map[string]interface{}{
  47. "entId": param.EntId,
  48. "appId": param.AppId,
  49. "classify": param.Classify,
  50. "content": param.Content,
  51. "createPerson": param.EntUserId,
  52. "status": 0,
  53. "createTime": now.Unix(),
  54. "keywords": keywords,
  55. "phrasesId": param.Id,
  56. }
  57. ok2 := elastic.Del(INDEX, TYPE, query)
  58. ok3 := elastic.Save(INDEX, TYPE, insertData)
  59. if !(ok2 && ok3) {
  60. ok = false
  61. msg = "操作失败"
  62. }
  63. }
  64. } else {
  65. insertData := map[string]interface{}{
  66. "entId": param.EntId,
  67. "appId": param.AppId,
  68. "classify": param.Classify,
  69. "content": param.Content,
  70. "createPerson": param.EntUserId,
  71. "status": 0,
  72. "createTime": now.Local().Format(util.DateFullLayout),
  73. "keywords": keywords,
  74. "updateTime": now.Format(util.DateFullLayout),
  75. }
  76. in := Mysql.Insert(util.COMMONPHRASES, insertData)
  77. if in > -1 {
  78. insertData["createTime"] = now.Unix()
  79. insertData["phrasesId"] = in
  80. delete(insertData, "updateTime")
  81. ok := elastic.Save(INDEX, TYPE, insertData)
  82. if !ok {
  83. ok = false
  84. msg = "操作失败"
  85. }
  86. }
  87. }
  88. return ok, msg
  89. }
  90. // CommonPhrasesInfo 客服话术详情
  91. func (c *CommonPhrasesService) CommonPhrasesInfo(id int64) (data *knowledgeclient.CommonPhrases, ok bool) {
  92. info := Mysql.FindOne(util.COMMONPHRASES, map[string]interface{}{"id": id}, "", "")
  93. if info != nil && len(*info) > 0 {
  94. data = &knowledgeclient.CommonPhrases{}
  95. data.Id = cm.Int64All((*info)["id"])
  96. data.Classify = cm.ObjToString((*info)["classify"])
  97. data.Content = cm.ObjToString((*info)["content"])
  98. return data, true
  99. }
  100. return nil, false
  101. }
  102. // CommonPhrasesDel 客服话术删除
  103. func (c *CommonPhrasesService) CommonPhrasesDel(id int64) bool {
  104. ok := Mysql.Update(util.COMMONPHRASES, map[string]interface{}{"id": id}, map[string]interface{}{"status": 1, "updateTime": time.Now().Local().Format(util.DateFullLayout)})
  105. if ok {
  106. //删除es数据
  107. query := `{"query":{"bool":{"must":[{"term":{"phrasesId":"` + strconv.Itoa(int(id)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}`
  108. ok = elastic.Del(INDEX, TYPE, query)
  109. log.Println(ok, "---------------")
  110. }
  111. return ok
  112. }
  113. // CommonPhrasesList 客服话术列表
  114. func (c *CommonPhrasesService) CommonPhrasesList(param *knowledgeclient.CommonPhrasesListReq) *knowledgeclient.CommonPhrasesList {
  115. var commonPhrasesList knowledgeclient.CommonPhrasesList
  116. var data []*knowledgeclient.CommonPhrases
  117. count := Mysql.Count(util.COMMONPHRASES, map[string]interface{}{"status": 0, "appId": param.AppId, "entId": param.EntId})
  118. if count > 0 {
  119. dataList := Mysql.Find(util.COMMONPHRASES, map[string]interface{}{"status": 0, "appId": param.AppId, "entId": param.EntId}, "", "id desc", cm.IntAll((param.PageIndex-1)*param.PageSize), cm.IntAll(param.PageSize))
  120. if dataList != nil && len(*dataList) > 0 {
  121. for _, val := range *dataList {
  122. data = append(data, &knowledgeclient.CommonPhrases{
  123. Id: cm.Int64All(val["id"]),
  124. Content: cm.ObjToString(val["content"]),
  125. Classify: cm.ObjToString(val["classify"]),
  126. })
  127. }
  128. }
  129. commonPhrasesList.Data = data
  130. commonPhrasesList.Total = count
  131. }
  132. return &commonPhrasesList
  133. }
  134. // CommonPhrasesClassList 客服话术分类
  135. func (c *CommonPhrasesService) CommonPhrasesClassList(param *knowledgeclient.CommonPhrasesClassListReq) []*knowledgeclient.CommonPhrasesClassListData {
  136. var classListArr []*knowledgeclient.CommonPhrasesClassListData
  137. //先查询数据在分类、排序
  138. data := &[]map[string]interface{}{}
  139. if param.Query != "" {
  140. data = Mysql.SelectBySql("SELECT classify,content FROM `socialize_common_phrases` WHERE entId = ? AND appId = ? AND status = 0 AND content like '%"+param.Query+"%' ORDER BY CONVERT(classify USING GBK) ASC", param.EntId, param.AppId)
  141. } else {
  142. 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)
  143. }
  144. if data != nil && len(*data) > 0 {
  145. m := map[string][]string{}
  146. for _, val := range *data {
  147. classify := cm.ObjToString(val["classify"])
  148. m[classify] = append(m[classify], cm.ObjToString(val["content"]))
  149. }
  150. if m != nil && len(m) > 0 {
  151. for k, v := range m {
  152. classList := &knowledgeclient.CommonPhrasesClassListData{}
  153. classList.Classify = k
  154. for _, i := range v {
  155. classList.ClassList = append(classList.ClassList, &knowledgeclient.Content{
  156. Content: i,
  157. })
  158. }
  159. classListArr = append(classListArr, classList)
  160. }
  161. //sort.Sort(classListArr)
  162. }
  163. }
  164. return classListArr
  165. }
  166. func (c *CommonPhrasesService) CommonPhraseQuery(param *knowledgeclient.CommonPhraseQueryReq, segment string, findCount int) []*knowledgeclient.Content {
  167. var (
  168. keyWords = ""
  169. searchField = `"content"`
  170. contents []*knowledgeclient.Content
  171. )
  172. //根据问题进行分词
  173. keywordsArr := util.HanlpGetNormalWords(param.Query, segment)
  174. logx.Info("keywordsArr", keywordsArr)
  175. if len(keywordsArr) != 0 {
  176. for _, val := range keywordsArr {
  177. keyWords += val + " "
  178. }
  179. }
  180. if keyWords == "" {
  181. keyWords = param.Query
  182. }
  183. //logx.Info("entId:", SE.Decode4Hex(param.RobotEntId))
  184. var query = util.DSL4SearchByKwsOrid(keyWords, strconv.Itoa(int(param.EntId)), 1)
  185. res := elastic.GetAllByNgram(INDEX, TYPE, query, "", "", searchField, 0, findCount, 0, false)
  186. if res != nil && len(*res) > 0 {
  187. for _, val := range *res {
  188. contents = append(contents, &knowledgeclient.Content{
  189. Content: cm.ObjToString(val["content"]),
  190. })
  191. }
  192. log.Println("推荐答案:", contents)
  193. }
  194. return contents
  195. }