chatHistory.go 3.7 KB

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