Skip to content

Commit 3f45ae7

Browse files
authored
Merge pull request #488 from LydiaCai1203/feat-calc-conversation-count
feat: 存储用户对话轮数到 redis
2 parents f80ca8c + a0b6038 commit 3f45ae7

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
@@ -35,16 +35,16 @@ var errRoundEnded = errors.New("round ended")
3535

3636
// TaskHandler 任务处理器
3737
type TaskHandler struct {
38-
cfg *config.Config
39-
usecase domain.TaskUsecase
40-
userusecase domain.UserUsecase
41-
pubhost domain.PublicHostUsecase
42-
logger *slog.Logger
43-
taskflow taskflow.Clienter
44-
loki *loki.Client
45-
nls *nls.NLS
46-
taskConns *ws.TaskConn
47-
controlConns *ws.ControlConn
38+
cfg *config.Config
39+
usecase domain.TaskUsecase
40+
userusecase domain.UserUsecase
41+
pubhost domain.PublicHostUsecase
42+
logger *slog.Logger
43+
taskflow taskflow.Clienter
44+
loki *loki.Client
45+
nls *nls.NLS
46+
taskConns *ws.TaskConn
47+
controlConns *ws.ControlConn
4848
taskSummary *service.TaskSummaryService
4949
idleRefresher vmidle.VMIdleRefresher
5050
}
@@ -77,17 +77,17 @@ func NewTaskHandler(i *do.Injector) (*TaskHandler, error) {
7777
}
7878

7979
h := &TaskHandler{
80-
cfg: cfg,
81-
usecase: uc,
82-
userusecase: uuc,
83-
pubhost: pubhost,
84-
logger: logger.With("handler", "task.handler"),
85-
taskflow: tf,
86-
loki: lok,
87-
nls: nlsSvc,
88-
taskConns: tc,
89-
controlConns: cc,
90-
taskSummary: ts,
80+
cfg: cfg,
81+
usecase: uc,
82+
userusecase: uuc,
83+
pubhost: pubhost,
84+
logger: logger.With("handler", "task.handler"),
85+
taskflow: tf,
86+
loki: lok,
87+
nls: nlsSvc,
88+
taskConns: tc,
89+
controlConns: cc,
90+
taskSummary: ts,
9191
idleRefresher: ir,
9292
}
9393

@@ -566,6 +566,9 @@ func (h *TaskHandler) handleClientMessage(ctx context.Context, logger *slog.Logg
566566
if err := h.usecase.Continue(ctx, user, task.ID, string(m.Data)); err != nil {
567567
logger.With("error", err).WarnContext(ctx, "failed to push task content")
568568
}
569+
if err := h.usecase.IncrUserInputCount(ctx, user.ID, task.ID); err != nil {
570+
logger.With("error", err).WarnContext(ctx, "failed to incr user input count")
571+
}
569572
h.enqueueSummary(ctx, logger, task.ID.String(), task.CreatedAt)
570573

571574
case consts.TaskStreamTypeUserStop:

backend/biz/task/usecase/task.go

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

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

480+
if err := a.IncrUserInputCount(ctx, user.ID, pt.Edges.Task.ID); err != nil {
481+
a.logger.WarnContext(ctx, "failed to incr user input count on create", "error", err)
482+
}
483+
463484
result := cvt.From(pt, &domain.ProjectTask{})
464485

465486
// 通知 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)