knowledgeService.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package service
  2. import (
  3. cm "app.yhyue.com/moapp/jybase/common"
  4. . "app.yhyue.com/moapp/jybase/encrypt"
  5. elastic "app.yhyue.com/moapp/jybase/esv1"
  6. "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
  7. "context"
  8. "database/sql"
  9. "errors"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. "knowledgeBase/entity"
  12. . "knowledgeBase/rpc/knowledge/init"
  13. "knowledgeBase/rpc/knowledge/knowledgeclient"
  14. "knowledgeBase/rpc/knowledge/util"
  15. "log"
  16. "strconv"
  17. "time"
  18. )
  19. type KnowledgeService struct{}
  20. func (k *KnowledgeService) KnowledgeAdd(param *knowledgeclient.AddRequest) (bool, string, error) {
  21. //先查找知识库Id
  22. query := map[string]interface{}{"status": 1, "appid": param.AppId, "ent_id": param.EntId}
  23. datalist := Mysql.Find(util.KNOWLEDGE, query, "id", "", -1, -1)
  24. if datalist != nil && *datalist != nil && len(*datalist) > 0 {
  25. //问题进行分词
  26. keywords := util.HttpDo(param.Question)
  27. if keywords == "" {
  28. keywords = param.Question
  29. }
  30. //通过entUserId获取创建人名称,调用用户中心
  31. req := &usercenter.EntUserReq{
  32. EntId: param.EntId,
  33. EntUserId: param.EntUserId,
  34. AppId: param.AppId,
  35. }
  36. resp, err := entity.UserCenterLib.GetEntUserInfo(context.Background(), req)
  37. if err != nil {
  38. logx.Infof("查询用户中台创建人信息失败", param.EntId, param.EntUserId, "err:", err)
  39. return false, "查询用户中台创建人信息失败", err
  40. }
  41. createPerson := resp.Data.Name
  42. var answerId int64
  43. nowTime := time.Now().Local().Format(util.Date_Full_Layout)
  44. fool := Mysql.ExecTx("添加知识", func(tx *sql.Tx) bool {
  45. //插入答案
  46. answerData := map[string]interface{}{
  47. "knowledge_id": (*datalist)[0]["id"],
  48. "status": 1,
  49. "create_time": nowTime,
  50. "update_time": nowTime,
  51. "create_person": createPerson,
  52. "content": param.Answer,
  53. }
  54. answerId = Mysql.Insert(util.ANSWER, answerData)
  55. //插入问题
  56. questionData := map[string]interface{}{
  57. "answer_id": answerId,
  58. "content": param.Question,
  59. "keywords": keywords,
  60. }
  61. questionId := Mysql.Insert(util.QUESTION, questionData)
  62. return answerId > 0 && questionId > 0
  63. })
  64. if fool {
  65. //插入es
  66. knowledge := map[string]interface{}{
  67. "knowledgeId": (*datalist)[0]["id"],
  68. "status": 1,
  69. "createTime": time.Now().Unix(),
  70. "createPerson": createPerson,
  71. "answer": param.Answer,
  72. "question": param.Question,
  73. "keywords": keywords,
  74. "answerId": answerId,
  75. "entId": param.EntId,
  76. }
  77. b := elastic.Save(C.Es.Index, C.Es.Type, knowledge)
  78. if b {
  79. return true, "插入es成功", nil
  80. } else {
  81. return false, "插入es出错", errors.New("插入es出错")
  82. }
  83. } else {
  84. return false, "插入mysql出错", errors.New("插入mysql出错")
  85. }
  86. } else {
  87. return false, "租户不存在", errors.New("租户不存在")
  88. }
  89. }
  90. func (k *KnowledgeService) KnowledgeEdit(param *knowledgeclient.KnowledgeEditReq) (ok bool, msg string, err error) {
  91. //获取问题分词
  92. keywords := util.HttpDo(param.Question)
  93. if keywords == "" {
  94. keywords = param.Question
  95. }
  96. //通过entUserId获取创建人名称
  97. req := &usercenter.EntUserReq{
  98. EntId: param.EntId,
  99. EntUserId: param.EntUserId,
  100. AppId: param.AppId,
  101. }
  102. resp := &usercenter.EntUserResp{}
  103. resp, err = entity.UserCenterLib.GetEntUserInfo(context.Background(), req)
  104. if err != nil {
  105. logx.Infof("查询用户中台创建人信息失败", param.EntId, param.EntUserId, "err:", err)
  106. return false, "查询用户中台创建人信息失败", err
  107. }
  108. createPerson := resp.Data.Name
  109. fool := Mysql.ExecTx("编辑问题、答案", func(tx *sql.Tx) bool {
  110. //修改答案
  111. answerUpdate := map[string]interface{}{
  112. "update_time": time.Now().Local().Format(util.Date_Full_Layout),
  113. "content": param.Answer,
  114. }
  115. ok1 := Mysql.UpdateByTx(tx, util.ANSWER, map[string]interface{}{"id": param.AnswerId}, answerUpdate)
  116. //修改问题
  117. questionUpdate := map[string]interface{}{
  118. "content": param.Question,
  119. "keywords": keywords,
  120. }
  121. ok2 := Mysql.UpdateByTx(tx, util.QUESTION, map[string]interface{}{"answer_id": param.AnswerId}, questionUpdate)
  122. return ok1 && ok2
  123. })
  124. if fool {
  125. query := `{"query":{"bool":{"must":[{"term":{"answerId":"` + strconv.Itoa(int(param.AnswerId)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"facets":{}}`
  126. //修改es数据
  127. newKnowledge := map[string]interface{}{
  128. "knowledgeId": param.KnowledgeId,
  129. "status": 1,
  130. "createTime": time.Now().Unix(),
  131. "createPerson": createPerson,
  132. "answer": param.Answer,
  133. "question": param.Question,
  134. "keywords": keywords,
  135. "answerId": param.AnswerId,
  136. "entId": param.EntId,
  137. }
  138. ok1 := elastic.Del(C.Es.Index, C.Es.Type, query)
  139. ok := elastic.Save(C.Es.Index, C.Es.Type, newKnowledge)
  140. if ok && ok1 {
  141. ok = true
  142. msg = "修改问题成功"
  143. } else {
  144. ok = false
  145. err = errors.New("删除es问题失败")
  146. msg = "删除es问题失败"
  147. }
  148. } else {
  149. ok = false
  150. err = errors.New("修改mysql问题失败")
  151. msg = "修改mysql问题失败"
  152. }
  153. return
  154. }
  155. func (k *KnowledgeService) KnowledgeList(param *knowledgeclient.ListRequest) *knowledgeclient.ListData {
  156. var knowledgeList knowledgeclient.ListData
  157. var data []*knowledgeclient.KnowledgeEntity
  158. countSql := "SELECT COUNT(b.id) FROM " + util.KNOWLEDGE +
  159. " a LEFT JOIN " + util.ANSWER + " b ON a.id = b.knowledge_id LEFT JOIN " + util.QUESTION +
  160. " c ON b.id = c.answer_id WHERE b.`status` =1 and a.ent_id=?"
  161. count := Mysql.CountBySql(countSql, param.EntId)
  162. log.Println("总数:", count)
  163. if count > 0 {
  164. //列表数据
  165. sql1 := "SELECT b.content as answer,c.content as question,b.id,b.knowledge_id FROM " + util.KNOWLEDGE +
  166. " a LEFT JOIN " + util.ANSWER + " b ON a.id = b.knowledge_id LEFT JOIN " + util.QUESTION +
  167. " c ON b.id = c.answer_id WHERE b.`status` =1 and a.ent_id=? order by b.update_time desc limit ?,?"
  168. //log.Println(sql, param.EntId, (param.PageIndex-1)*param.PageSize, param.PageSize)
  169. datalist := Mysql.SelectBySql(sql1, param.EntId, (param.PageIndex-1)*param.PageSize, param.PageSize)
  170. if datalist != nil && *datalist != nil && len(*datalist) > 0 {
  171. for _, value := range *datalist {
  172. knowledge := knowledgeclient.KnowledgeEntity{}
  173. knowledge.Answer = cm.ObjToString(value["answer"])
  174. knowledge.Question = cm.ObjToString(value["question"])
  175. knowledge.AnswerId = cm.Int64All(value["id"])
  176. knowledge.KnowledgeId = cm.Int64All(value["knowledge_id"])
  177. data = append(data, &knowledge)
  178. }
  179. }
  180. //log.Println("数据:", data)
  181. knowledgeList.Total = count
  182. knowledgeList.Data = data
  183. }
  184. return &knowledgeList
  185. }
  186. func (k *KnowledgeService) KnowledgeInfo(answerId int64) (data *knowledgeclient.KnowledgeEntity, ok bool) {
  187. sql1 := "SELECT b.content as answer,c.content as question,b.id,b.knowledge_id FROM " + util.ANSWER +
  188. " b LEFT JOIN " + util.QUESTION + " c ON b.id = c.answer_id WHERE b.`status` =1 AND b.id = ? "
  189. datalist := Mysql.SelectBySql(sql1, answerId)
  190. if datalist != nil && *datalist != nil && len(*datalist) > 0 {
  191. knowledge := knowledgeclient.KnowledgeEntity{}
  192. knowledge.Answer = cm.ObjToString((*datalist)[0]["answer"])
  193. knowledge.Question = cm.ObjToString((*datalist)[0]["question"])
  194. knowledge.AnswerId = cm.Int64All((*datalist)[0]["id"])
  195. knowledge.KnowledgeId = cm.Int64All((*datalist)[0]["knowledge_id"])
  196. return &knowledge, true
  197. }
  198. return nil, false
  199. }
  200. func (k *KnowledgeService) KnowledgeDel(answerId int64) (ok bool, msg string) {
  201. //修改答案
  202. answerUpdate := map[string]interface{}{
  203. "update_time": time.Now().Local().Format(util.Date_Full_Layout),
  204. "status": 0,
  205. }
  206. fool := Mysql.Update(util.ANSWER, map[string]interface{}{"id": answerId}, answerUpdate)
  207. if fool {
  208. //删除es数据
  209. query := `{"query":{"bool":{"must":[{"term":{"answerId":"` + strconv.Itoa(int(answerId)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"facets":{}}`
  210. ok := elastic.Del(C.Es.Index, C.Es.Type, query)
  211. if ok {
  212. return true, "删除成功"
  213. } else {
  214. return false, "删除es问题失败"
  215. }
  216. }
  217. return false, "删除mysql问题失败"
  218. }
  219. func (k *KnowledgeService) FindAnswer(param *knowledgeclient.FindAnswerReq) *knowledgeclient.Question {
  220. var question knowledgeclient.Question
  221. robotEntId := SE.Decode4Hex(param.RobotEntId)
  222. logx.Info("机器人企业id:", robotEntId)
  223. //组装es query
  224. query := util.DSL4SmartResponse(param.Question, robotEntId, int(param.Type))
  225. logx.Info("es查询:", query)
  226. res := elastic.Get(C.Es.Index, C.Es.Type, query)
  227. if res != nil && len(*res) > 0 {
  228. data := (*res)[0]
  229. question.Answer = cm.ObjToString(data["answer"])
  230. question.Question = cm.ObjToString(data["question"])
  231. }
  232. return &question
  233. }
  234. func (k *KnowledgeService) RecommendAnswer(param *knowledgeclient.FindAnswerReq) []*knowledgeclient.Question {
  235. var (
  236. keyWords = ""
  237. searchField = `"answer","question"`
  238. answers []*knowledgeclient.Question
  239. )
  240. //根据问题进行分词
  241. keyWords = util.HttpDo(param.Question)
  242. log.Println("问题分词关键字:", keyWords)
  243. var query = util.DSL4SearchByKwsOrid(keyWords, SE.Decode4Hex(param.RobotEntId))
  244. res := elastic.GetAllByNgram(C.Es.Index, C.Es.Type, query, "", "", searchField, 0, 3, 0, false)
  245. //log.Println("推荐3个答案:", res)
  246. if res != nil && len(*res) > 0 {
  247. for _, val := range *res {
  248. answers = append(answers, &knowledgeclient.Question{
  249. Question: cm.ObjToString(val["question"]),
  250. Answer: cm.ObjToString(val["answer"]),
  251. })
  252. }
  253. }
  254. return answers
  255. }