From 809c07ba3b29ba0df5fe68f702351ad3cce45c5f Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Tue, 1 Sep 2026 10:30:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=94=99=E8=AF=AF=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E8=AE=B0=E5=BF=86DAO=E4=B8=8EDTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/error_memory_dao.go | 63 +++++++++++++++++++++++++++++++ model/dto/error_memory_dao_dto.go | 34 +++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 dao/error_memory_dao.go create mode 100644 model/dto/error_memory_dao_dto.go diff --git a/dao/error_memory_dao.go b/dao/error_memory_dao.go new file mode 100644 index 0000000..9b825c2 --- /dev/null +++ b/dao/error_memory_dao.go @@ -0,0 +1,63 @@ +package dao + +import ( + "context" + "model-gateway/consts/public" + "model-gateway/model/entity" + + "gitea.redpowerfuture.com/red-future/common/db/gfdb" +) + +var ErrorMemory = &errorMemoryDao{} + +type errorMemoryDao struct{} + +// GetByKey 按记忆键查询(未命中返回 (nil, nil)) +func (d *errorMemoryDao) GetByKey(ctx context.Context, key string) (res *entity.ErrorMemory, err error) { + r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameErrorMemory). + Where(entity.ErrorMemoryCol.MemoryKey, key). + One() + if err != nil { + return + } + err = r.Struct(&res) + return +} + +// Upsert 存在则更新 retryable/reason/analyzed_by,不存在则插入 +func (d *errorMemoryDao) Upsert(ctx context.Context, m *entity.ErrorMemory) (err error) { + model := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameErrorMemory) + n, err := model.Where(entity.ErrorMemoryCol.MemoryKey, m.MemoryKey).Count() + if err != nil { + return + } + if n > 0 { + _, err = model.Where(entity.ErrorMemoryCol.MemoryKey, m.MemoryKey).Data(map[string]any{ + entity.ErrorMemoryCol.Retryable: m.Retryable, + entity.ErrorMemoryCol.Reason: m.Reason, + entity.ErrorMemoryCol.AnalyzedBy: m.AnalyzedBy, + }).Update() + return + } + _, err = model.Insert(m) + return +} + +// List 分页查询(按 id 倒序) +func (d *errorMemoryDao) List(ctx context.Context, page, pageSize int) (list []entity.ErrorMemory, total int64, err error) { + model := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameErrorMemory) + n, err := model.Count() + if err != nil { + return + } + total = int64(n) + err = model.Page(page, pageSize).OrderDesc(entity.ErrorMemoryCol.Id).Scan(&list) + return +} + +// Delete 按 id 删除(软删除) +func (d *errorMemoryDao) Delete(ctx context.Context, id int64) (err error) { + _, err = gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameErrorMemory). + Where(entity.ErrorMemoryCol.Id, id).Delete() + return +} diff --git a/model/dto/error_memory_dao_dto.go b/model/dto/error_memory_dao_dto.go new file mode 100644 index 0000000..3491e5c --- /dev/null +++ b/model/dto/error_memory_dao_dto.go @@ -0,0 +1,34 @@ +package dto + +import ( + "gitea.redpowerfuture.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// GetErrorMemoryListReq 错误重试记忆列表 +type GetErrorMemoryListReq struct { + g.Meta `path:"/errorMemory/list" method:"get" tags:"错误记忆" summary:"错误重试记忆列表" dc:"查看错误→可重试结论记忆"` + *beans.Page `json:"page"` +} + +type GetErrorMemoryListRes struct { + List []ErrorMemoryItem `json:"list" dc:"记忆条目"` + Total int64 `json:"total" dc:"总数"` +} + +type ErrorMemoryItem struct { + Id int64 `json:"id"` + MemoryKey string `json:"memoryKey"` + Upstream string `json:"upstream"` + ErrorCode string `json:"errorCode"` + MsgFingerprint string `json:"msgFingerprint"` + Retryable bool `json:"retryable"` + Reason string `json:"reason"` + AnalyzedBy string `json:"analyzedBy"` +} + +// DeleteErrorMemoryReq 删除错误重试记忆 +type DeleteErrorMemoryReq struct { + g.Meta `path:"/errorMemory/delete" method:"post" tags:"错误记忆" summary:"删除错误重试记忆" dc:"手动清理永久记忆条目"` + Id int64 `json:"id" v:"required#id不能为空" dc:"记忆ID"` +}