123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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
- }
|