knowledgeService.go 9.4 KB

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