@@ -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.
262279func (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 创建等)
0 commit comments