chatHistory.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. ChatHistroy = &cChatHistroy{
  13. Arr: make([]*ChatRecord, 0, 100),
  14. }
  15. )
  16. type cChatHistroy 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. 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. Item int `json:"item" dc:"1:常见问题 2:业务意图 3:chatGpt"`
  31. Refer string `json:"refer" dc:"会话来源地址"`
  32. PersonId int64 `json:"person_id" dc:"自然人id"`
  33. CreateTime string `json:"create_time" dc:"时间"`
  34. }
  35. // CacheSave 保存聊天信息
  36. func (m *cChatHistroy) CacheSave(msg *ChatRecord) {
  37. m.Arr = append(m.Arr, msg)
  38. if len(m.Arr) > 100 {
  39. tmp, ctx := m.Arr, gctx.New()
  40. m.Arr = make([]*ChatRecord, 0, 5)
  41. val := gconv.Maps(tmp)
  42. r, err := g.Model("ai_message_history").Data(val).Insert()
  43. if err != nil {
  44. glog.Error(ctx, "插入聊天记录异常,error:%s\ndata:%v", err, val)
  45. g.Dump(val)
  46. }
  47. affect, _ := r.RowsAffected()
  48. if len(tmp) == gconv.Int(affect) {
  49. glog.Error(ctx, "插入聊天记录异常 共%d条 插入%d条,error:%s\ndata:%v", len(tmp), affect, err, val)
  50. g.Dump(val)
  51. } else {
  52. glog.Info(ctx, "插入%d条聊天记录成功", affect)
  53. }
  54. }
  55. }
  56. // Save 保存聊天记录 返回最后一条记录id
  57. func (m *cChatHistroy) Save(ctx context.Context, msgs ...*ChatRecord) (id int64) {
  58. val := gconv.Maps(msgs)
  59. r, err := g.Model("ai_message_history").Data(val).Insert()
  60. if err != nil {
  61. glog.Error(ctx, "插入聊天记录异常,error:%v\ndata:%v", err, val)
  62. g.Dump(val)
  63. } else {
  64. if id, err = r.LastInsertId(); err != nil {
  65. glog.Error(ctx, "插入聊天记录异常")
  66. g.Dump(val)
  67. }
  68. }
  69. g.Dump(id, "-----", val)
  70. return
  71. }
  72. // GetMessage 查询聊天信息
  73. func (m *cChatHistroy) GetMessage(userId int64, pageNum, pageSize int) (h []ResHistory, err error) {
  74. err = g.Model("ai_message_history").Where("person_id = ?", userId).OrderDesc("create_time").OrderDesc("id").Limit(pageNum, (pageNum+1)*pageSize).Scan(&h)
  75. if err != nil {
  76. return
  77. }
  78. return
  79. }
  80. // Evaluate 评价
  81. func (m *cChatHistroy) Evaluate(userId int64, megId string, value int) error {
  82. res, err := g.Model("ai_message_history").One("id =? and person_id =? and type=2", megId, userId)
  83. if err != nil {
  84. return err
  85. }
  86. if res == nil {
  87. return fmt.Errorf("未找到记录")
  88. }
  89. if gconv.Int(res.Map()["useful"]) != 0 {
  90. return fmt.Errorf("已评价")
  91. }
  92. r, _ := g.Model("ai_message_history").Data(g.Map{"useful": value}).Where("id =? and person_id =? and type=2", megId, userId).Update()
  93. affect, _ := r.RowsAffected()
  94. if affect != 1 {
  95. return fmt.Errorf("评价异常")
  96. }
  97. return nil
  98. }