package model import ( "context" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/util/gconv" "time" ) var ( ChatHistory = &cChatHistory{ Arr: make([]*ChatRecord, 0, 100), } ) type cChatHistory struct { Arr []*ChatRecord } type ResHistory struct { Id string `json:"id" dc:"信息加密id"` Content string `json:"content" dc:"内容"` Type int `json:"type" dc:"1:用户提问 2:智能助手回复"` Useful int `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"` Actions int `json:"actions" dc:"1:有功能菜单 0:无功能菜单"` CreateTime time.Time `json:"create_time" dc:"聊天时间"` } type ChatRecord struct { Content string `json:"content" dc:"内容"` Type int `json:"type" dc:"1:用户提问 2:智能助手回复"` Useful int `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"` Actions int `json:"actions" dc:"1:有功能菜单 0:无功能菜单"` Item int `json:"item" dc:"1:常见问题 2:业务意图 3:chatGpt"` QuestionId int64 `json:"question_id" dc:"回答问题的id"` Refer string `json:"refer" dc:"会话来源地址"` PersonId int64 `json:"person_id" dc:"自然人id"` CreateTime string `json:"create_time" dc:"时间"` } // CacheSave 保存聊天信息 func (m *cChatHistory) CacheSave(msg *ChatRecord) { m.Arr = append(m.Arr, msg) if len(m.Arr) > 100 { tmp, ctx := m.Arr, gctx.New() m.Arr = make([]*ChatRecord, 0, 5) val := gconv.Maps(tmp) r, err := g.Model("ai_message_history").Data(val).Insert() if err != nil { g.Log().Error(ctx, "插入聊天记录异常,error:%s\ndata:%v", err, val) g.Dump(val) } affect, _ := r.RowsAffected() if len(tmp) == gconv.Int(affect) { g.Log().Error(ctx, "插入聊天记录异常 共%d条 插入%d条,error:%s\ndata:%v", len(tmp), affect, err, val) g.Dump(val) } else { g.Log().Info(ctx, "插入%d条聊天记录成功", affect) } } } // Save 保存聊天记录 返回最后一条记录id func (m *cChatHistory) Save(ctx context.Context, msgs ...*ChatRecord) (id int64) { val := gconv.Maps(msgs) r, err := g.Model("ai_message_history").Data(val).Insert() if err != nil { g.Log().Error(ctx, "插入聊天记录异常,error:%v\ndata:%v", err, val) g.Dump(val) } else { if id, err = r.LastInsertId(); err != nil { g.Log().Error(ctx, "插入聊天记录异常") g.Dump(val) } } return } // GetMessage 查询聊天信息 func (m *cChatHistory) GetMessage(userId int64, pageNum, pageSize int, prevId string) (h []ResHistory, hasNext bool, err error) { var hTmp []ResHistory if prevId != "" { err = g.Model("ai_message_history").Where("person_id = ? and id < ? ", userId, prevId).OrderDesc("create_time").Limit(pageSize).Scan(&hTmp) } else { err = g.Model("ai_message_history").Where("person_id = ?", userId).OrderDesc("create_time").Limit(pageNum*pageSize, pageSize).Scan(&hTmp) } if err != nil { return } //翻转查询结果 for i := len(hTmp) - 1; i >= 0; i-- { h = append(h, hTmp[i]) } count, _ := g.Model("ai_message_history").Where("person_id = ? ", userId).Count() hasNext = count > (pageNum+1)*pageSize return } // Evaluate 评价 func (m *cChatHistory) Evaluate(userId int64, megId string, value int) error { res, err := g.Model("ai_message_history").One("id =? and person_id =? and type=2", megId, userId) if err != nil { return err } if res == nil { return fmt.Errorf("未找到记录") } r, _ := g.Model("ai_message_history").Data(g.Map{"useful": value}).Where("id =? and person_id =? and type=2", megId, userId).Update() affect, _ := r.RowsAffected() if affect != 1 { return fmt.Errorf("评价异常") } return nil }