chatHistory.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package model
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "github.com/gogf/gf/v2/os/glog"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. "time"
  10. )
  11. var (
  12. ChatHistory = &cChatHistory{
  13. Arr: make([]*ChatRecord, 0, 100),
  14. }
  15. )
  16. type cChatHistory struct {
  17. Arr []*ChatRecord
  18. }
  19. type ResHistory struct {
  20. Id string `json:"id" dc:"信息加密id"`
  21. Content string `json:"content" dc:"内容"`
  22. Type int `json:"type" dc:"1:用户提问 2:智能助手回复"`
  23. Useful int `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
  24. Actions int `json:"actions" dc:"1:有功能菜单 0:无功能菜单"`
  25. CreateTime time.Time `json:"create_time" dc:"聊天时间"`
  26. }
  27. type ChatRecord struct {
  28. Content string `json:"content" dc:"内容"`
  29. Type int `json:"type" dc:"1:用户提问 2:智能助手回复"`
  30. Useful int `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
  31. Actions int `json:"actions" dc:"1:有功能菜单 0:无功能菜单"`
  32. Item int `json:"item" dc:"1:常见问题 2:业务意图 3:chatGpt"`
  33. QuestionId int64 `json:"question_id" dc:"回答问题的id"`
  34. Refer string `json:"refer" dc:"会话来源地址"`
  35. PersonId int64 `json:"person_id" dc:"自然人id"`
  36. CreateTime string `json:"create_time" dc:"时间"`
  37. }
  38. // CacheSave 保存聊天信息
  39. func (m *cChatHistory) CacheSave(msg *ChatRecord) {
  40. m.Arr = append(m.Arr, msg)
  41. if len(m.Arr) > 100 {
  42. tmp, ctx := m.Arr, gctx.New()
  43. m.Arr = make([]*ChatRecord, 0, 5)
  44. val := gconv.Maps(tmp)
  45. r, err := g.Model("ai_message_history").Data(val).Insert()
  46. if err != nil {
  47. glog.Error(ctx, "插入聊天记录异常,error:%s\ndata:%v", err, val)
  48. g.Dump(val)
  49. }
  50. affect, _ := r.RowsAffected()
  51. if len(tmp) == gconv.Int(affect) {
  52. glog.Error(ctx, "插入聊天记录异常 共%d条 插入%d条,error:%s\ndata:%v", len(tmp), affect, err, val)
  53. g.Dump(val)
  54. } else {
  55. glog.Info(ctx, "插入%d条聊天记录成功", affect)
  56. }
  57. }
  58. }
  59. // Save 保存聊天记录 返回最后一条记录id
  60. func (m *cChatHistory) Save(ctx context.Context, msgs ...*ChatRecord) (id int64) {
  61. val := gconv.Maps(msgs)
  62. r, err := g.Model("ai_message_history").Data(val).Insert()
  63. if err != nil {
  64. glog.Error(ctx, "插入聊天记录异常,error:%v\ndata:%v", err, val)
  65. g.Dump(val)
  66. } else {
  67. if id, err = r.LastInsertId(); err != nil {
  68. glog.Error(ctx, "插入聊天记录异常")
  69. g.Dump(val)
  70. }
  71. }
  72. return
  73. }
  74. // GetMessage 查询聊天信息
  75. func (m *cChatHistory) GetMessage(userId int64, pageNum, pageSize int, prevId string) (h []ResHistory, hasNext bool, err error) {
  76. var hTmp []ResHistory
  77. if prevId != "" {
  78. err = g.Model("ai_message_history").Where("person_id = ? and id < ? ", userId, prevId).OrderDesc("id").Limit(pageSize).Scan(&hTmp)
  79. } else {
  80. err = g.Model("ai_message_history").Where("person_id = ?", userId).OrderDesc("id").Limit(pageNum*pageSize, pageSize).Scan(&hTmp)
  81. }
  82. if err != nil {
  83. return
  84. }
  85. //翻转查询结果
  86. for i := len(hTmp) - 1; i >= 0; i-- {
  87. h = append(h, hTmp[i])
  88. }
  89. count, _ := g.Model("ai_message_history").Where("person_id = ? ", userId).Count()
  90. hasNext = count > (pageNum+1)*pageSize
  91. return
  92. }
  93. // Evaluate 评价
  94. func (m *cChatHistory) Evaluate(userId int64, megId string, value int) error {
  95. res, err := g.Model("ai_message_history").One("id =? and person_id =? and type=2", megId, userId)
  96. if err != nil {
  97. return err
  98. }
  99. if res == nil {
  100. return fmt.Errorf("未找到记录")
  101. }
  102. if gconv.Int(res.Map()["useful"]) != 0 {
  103. return fmt.Errorf("已评价")
  104. }
  105. r, _ := g.Model("ai_message_history").Data(g.Map{"useful": value}).Where("id =? and person_id =? and type=2", megId, userId).Update()
  106. affect, _ := r.RowsAffected()
  107. if affect != 1 {
  108. return fmt.Errorf("评价异常")
  109. }
  110. return nil
  111. }