commonPhrasesService.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. } else {
  64. ok = false
  65. msg = "操作失败"
  66. }
  67. } else {
  68. insertData := map[string]interface{}{
  69. "entId": param.EntId,
  70. "appId": param.AppId,
  71. "classify": param.Classify,
  72. "content": param.Content,
  73. "createPerson": param.EntUserId,
  74. "status": 0,
  75. "createTime": now.Local().Format(util.DateFullLayout),
  76. "keywords": keywords,
  77. "updateTime": now.Format(util.DateFullLayout),
  78. }
  79. in := Mysql.Insert(util.COMMONPHRASES, insertData)
  80. if in > -1 {
  81. insertData["createTime"] = now.Unix()
  82. insertData["phrasesId"] = in
  83. delete(insertData, "updateTime")
  84. ok := elastic.Save(INDEX, TYPE, insertData)
  85. if !ok {
  86. ok = false
  87. msg = "操作失败"
  88. }
  89. } else {
  90. ok = false
  91. msg = "操作失败"
  92. }
  93. }
  94. return ok, msg
  95. }
  96. // CommonPhrasesInfo 客服话术详情
  97. func (c *CommonPhrasesService) CommonPhrasesInfo(id int64) (data *knowledgeclient.CommonPhrases, ok bool) {
  98. info := Mysql.FindOne(util.COMMONPHRASES, map[string]interface{}{"id": id}, "", "")
  99. if info != nil && len(*info) > 0 {
  100. data = &knowledgeclient.CommonPhrases{}
  101. data.Id = cm.Int64All((*info)["id"])
  102. data.Classify = cm.ObjToString((*info)["classify"])
  103. data.Content = cm.ObjToString((*info)["content"])
  104. return data, true
  105. }
  106. return nil, false
  107. }
  108. // CommonPhrasesDel 客服话术删除
  109. func (c *CommonPhrasesService) CommonPhrasesDel(id int64) bool {
  110. ok := Mysql.Update(util.COMMONPHRASES, map[string]interface{}{"id": id}, map[string]interface{}{"status": 1, "updateTime": time.Now().Local().Format(util.DateFullLayout)})
  111. if ok {
  112. //删除es数据
  113. query := `{"query":{"bool":{"must":[{"term":{"phrasesId":"` + strconv.Itoa(int(id)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}`
  114. ok = elastic.Del(INDEX, TYPE, query)
  115. log.Println(ok, "---------------")
  116. }
  117. return ok
  118. }
  119. // CommonPhrasesList 客服话术列表
  120. func (c *CommonPhrasesService) CommonPhrasesList(param *knowledgeclient.CommonPhrasesListReq) *knowledgeclient.CommonPhrasesList {
  121. var commonPhrasesList knowledgeclient.CommonPhrasesList
  122. var data []*knowledgeclient.CommonPhrases
  123. count := Mysql.Count(util.COMMONPHRASES, map[string]interface{}{"status": 0, "appId": param.AppId, "entId": param.EntId})
  124. if count > 0 {
  125. 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))
  126. if dataList != nil && len(*dataList) > 0 {
  127. for _, val := range *dataList {
  128. data = append(data, &knowledgeclient.CommonPhrases{
  129. Id: cm.Int64All(val["id"]),
  130. Content: cm.ObjToString(val["content"]),
  131. Classify: cm.ObjToString(val["classify"]),
  132. })
  133. }
  134. }
  135. commonPhrasesList.Data = data
  136. commonPhrasesList.Total = count
  137. }
  138. return &commonPhrasesList
  139. }
  140. // CommonPhrasesClassList 客服话术分类
  141. func (c *CommonPhrasesService) CommonPhrasesClassList(param *knowledgeclient.CommonPhrasesClassListReq) []*knowledgeclient.CommonPhrasesClassListData {
  142. var classListArr []*knowledgeclient.CommonPhrasesClassListData
  143. //先查询数据在分类、排序
  144. data := &[]map[string]interface{}{}
  145. if param.Query != "" {
  146. 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)
  147. } else {
  148. 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)
  149. }
  150. if data != nil && len(*data) > 0 {
  151. m := map[string][]string{}
  152. for _, val := range *data {
  153. classify := cm.ObjToString(val["classify"])
  154. m[classify] = append(m[classify], cm.ObjToString(val["content"]))
  155. }
  156. if m != nil && len(m) > 0 {
  157. for k, v := range m {
  158. classList := &knowledgeclient.CommonPhrasesClassListData{}
  159. classList.Classify = k
  160. for _, i := range v {
  161. classList.ClassList = append(classList.ClassList, &knowledgeclient.Content{
  162. Content: i,
  163. })
  164. }
  165. classListArr = append(classListArr, classList)
  166. }
  167. //sort.Sort(classListArr)
  168. }
  169. }
  170. return classListArr
  171. }
  172. func (c *CommonPhrasesService) CommonPhraseQuery(param *knowledgeclient.CommonPhraseQueryReq, segment string, findCount int) []*knowledgeclient.Content {
  173. var (
  174. keyWords = ""
  175. searchField = `"content"`
  176. contents []*knowledgeclient.Content
  177. )
  178. //根据问题进行分词
  179. keywordsArr := util.HanlpGetNormalWords(param.Query, segment)
  180. logx.Info("keywordsArr", keywordsArr)
  181. if len(keywordsArr) != 0 {
  182. for _, val := range keywordsArr {
  183. keyWords += val + " "
  184. }
  185. }
  186. if keyWords == "" {
  187. keyWords = param.Query
  188. }
  189. //logx.Info("entId:", SE.Decode4Hex(param.RobotEntId))
  190. var query = util.DSL4SearchByKwsOrid(keyWords, strconv.Itoa(int(param.EntId)), 1)
  191. res := elastic.GetAllByNgram(INDEX, TYPE, query, "", "", searchField, 0, findCount, 0, false)
  192. if res != nil && len(*res) > 0 {
  193. for _, val := range *res {
  194. contents = append(contents, &knowledgeclient.Content{
  195. Content: cm.ObjToString(val["content"]),
  196. })
  197. }
  198. log.Println("推荐答案:", contents)
  199. }
  200. return contents
  201. }