knowledgeService.go 9.3 KB

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