Skip to content

Commit a0b6038

Browse files
committed
feat: 存储用户对话轮数到 redis
1 parent 39a045f commit a0b6038

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

backend/biz/task/handler/v1/task.go

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ import (
3232

3333
// TaskHandler 任务处理器
3434
type TaskHandler struct {
35-
cfg *config.Config
36-
usecase domain.TaskUsecase
37-
userusecase domain.UserUsecase
38-
pubhost domain.PublicHostUsecase
39-
logger *slog.Logger
40-
taskflow taskflow.Clienter
41-
loki *loki.Client
42-
nls *nls.NLS
43-
taskConns *ws.TaskConn
44-
controlConns *ws.ControlConn
35+
cfg *config.Config
36+
usecase domain.TaskUsecase
37+
userusecase domain.UserUsecase
38+
pubhost domain.PublicHostUsecase
39+
logger *slog.Logger
40+
taskflow taskflow.Clienter
41+
loki *loki.Client
42+
nls *nls.NLS
43+
taskConns *ws.TaskConn
44+
controlConns *ws.ControlConn
4545
taskSummary *service.TaskSummaryService
4646
idleRefresher vmidle.VMIdleRefresher
4747
}
@@ -73,17 +73,17 @@ func NewTaskHandler(i *do.Injector) (*TaskHandler, error) {
7373
}
7474

7575
h := &TaskHandler{
76-
cfg: cfg,
77-
usecase: uc,
78-
userusecase: uuc,
79-
pubhost: pubhost,
80-
logger: logger.With("handler", "task.handler"),
81-
taskflow: tf,
82-
loki: lok,
83-
nls: nlsSvc,
84-
taskConns: tc,
85-
controlConns: cc,
86-
taskSummary: ts,
76+
cfg: cfg,
77+
usecase: uc,
78+
userusecase: uuc,
79+
pubhost: pubhost,
80+
logger: logger.With("handler", "task.handler"),
81+
taskflow: tf,
82+
loki: lok,
83+
nls: nlsSvc,
84+
taskConns: tc,
85+
controlConns: cc,
86+
taskSummary: ts,
8787
idleRefresher: ir,
8888
}
8989

@@ -615,6 +615,9 @@ func (h *TaskHandler) handleClientMessage(ctx context.Context, logger *slog.Logg
615615
if err := h.usecase.Continue(ctx, user, task.ID, string(m.Data)); err != nil {
616616
logger.With("error", err).WarnContext(ctx, "failed to push task content")
617617
}
618+
if err := h.usecase.IncrUserInputCount(ctx, user.ID, task.ID); err != nil {
619+
logger.With("error", err).WarnContext(ctx, "failed to incr user input count")
620+
}
618621
h.enqueueSummary(ctx, logger, task.ID.String(), task.CreatedAt)
619622

620623
case consts.TaskStreamTypeUserStop:

backend/biz/task/usecase/task.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,23 @@ func (a *TaskUsecase) Continue(ctx context.Context, user *domain.User, id uuid.U
256256
return nil
257257
}
258258

259+
// IncrUserInputCount 记录用户输入次数到 Redis Hash,并按天计数
260+
func (a *TaskUsecase) IncrUserInputCount(ctx context.Context, userID, taskID uuid.UUID) error {
261+
// 按 task 维度计数(总量,不设过期)
262+
key := fmt.Sprintf("mcai:user:%s:input_count", userID.String())
263+
if err := a.redis.HIncrBy(ctx, key, taskID.String(), 1).Err(); err != nil {
264+
return err
265+
}
266+
267+
// 按天计数(用于时间范围统计,90 天过期)
268+
dailyKey := fmt.Sprintf("mcai:user:%s:input_daily:%s", userID.String(), time.Now().Format("2006-01-02"))
269+
pipe := a.redis.Pipeline()
270+
pipe.Incr(ctx, dailyKey)
271+
pipe.Expire(ctx, dailyKey, 90*24*time.Hour)
272+
_, err := pipe.Exec(ctx)
273+
return err
274+
}
275+
259276
// Create implements domain.TaskUsecase.
260277
func (a *TaskUsecase) Create(ctx context.Context, user *domain.User, req domain.CreateTaskReq) (*domain.ProjectTask, error) {
261278
r, err := a.taskflow.Host().IsOnline(ctx, &taskflow.IsOnlineReq[string]{
@@ -455,6 +472,10 @@ func (a *TaskUsecase) Create(ctx context.Context, user *domain.User, req domain.
455472
}
456473
a.logger.With("req", req).InfoContext(ctx, "task created")
457474

475+
if err := a.IncrUserInputCount(ctx, user.ID, pt.Edges.Task.ID); err != nil {
476+
a.logger.WarnContext(ctx, "failed to incr user input count on create", "error", err)
477+
}
478+
458479
result := cvt.From(pt, &domain.ProjectTask{})
459480

460481
// 通知 TaskHook(如内部项目的 git task 创建等)

backend/domain/task.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type TaskUsecase interface {
2727
AutoApprove(ctx context.Context, user *User, id uuid.UUID, approve bool) error
2828
GitTask(ctx context.Context, id uuid.UUID) (*GitTask, error)
2929
Delete(ctx context.Context, user *User, id uuid.UUID) error
30+
IncrUserInputCount(ctx context.Context, userID, taskID uuid.UUID) error
3031
}
3132

3233
// TaskRepo 任务数据访问接口

0 commit comments

Comments
 (0)