diff --git a/src/main/java/api/ApiApplication.java b/src/main/java/api/ApiApplication.java
index c28da07..c074efd 100644
--- a/src/main/java/api/ApiApplication.java
+++ b/src/main/java/api/ApiApplication.java
@@ -2,18 +2,32 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import scheduler.SchedulerService;
 import tracker.DataCaptureServer;
 import java.io.IOException;
 
 @SpringBootApplication
 public class ApiApplication {
-    public static void main(String[] args) {
+    private static SchedulerService schedulerService;
     
+    public static void main(String[] args) {
         try{
             DataCaptureServer.start();
         }catch(IOException e){
             System.out.println(e);
         }
+        
+        // 启动定时任务服务
+        schedulerService = new SchedulerService();
+        schedulerService.start();
+        
+        // 添加关闭钩子，确保应用关闭时停止定时任务
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            if (schedulerService != null) {
+                schedulerService.stop();
+            }
+        }));
+        
         SpringApplication.run(ApiApplication.class, args);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index 1141c5b..5ca7c04 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -418,17 +418,30 @@
     @Override
     public void PunishUser(){
         EntityManager entityManager = emf.createEntityManager();
-        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
-        entity.QUser qUser = entity.QUser.user;
-        List<User> users = queryFactory
-            .selectFrom(qUser)
-            .where(qUser.detectedCount.gt(config.getCheatTime()) 
-                .or(qUser.fakeDetectedCount.gt(config.getFakeTime())))
-            .fetch();
-
-        for (User user : users) {
-            user.accountstate = true;
-            entityManager.merge(user);
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            entity.QUser qUser = entity.QUser.user;
+            List<User> users = queryFactory
+                .selectFrom(qUser)
+                .where(qUser.detectedCount.gt(config.getCheatTime()) 
+                    .or(qUser.fakeDetectedCount.gt(config.getFakeTime())))
+                .fetch();
+            if (users.isEmpty()) {
+                System.out.println("No users to punish.");
+                return;
+            }
+            entityManager.getTransaction().begin();
+            for (User user : users) {
+                user.accountstate = true;
+                entityManager.merge(user);
+            }
+            entityManager.getTransaction().commit();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (entityManager != null) {
+                entityManager.close();
+            }
         }
     }
 
diff --git a/src/main/java/scheduler/SchedulerService.java b/src/main/java/scheduler/SchedulerService.java
new file mode 100644
index 0000000..2ca443e
--- /dev/null
+++ b/src/main/java/scheduler/SchedulerService.java
@@ -0,0 +1,74 @@
+package scheduler;
+
+import cheat.Cheat;
+import database.Database1;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 定时任务服务，负责定期执行各种维护任务
+ */
+public class SchedulerService {
+    private static final Logger logger = LoggerFactory.getLogger(SchedulerService.class);
+    private final ScheduledExecutorService scheduler;
+    private final Cheat cheat;
+    private final Database1 database1;
+    
+    public SchedulerService() {
+        this.scheduler = Executors.newScheduledThreadPool(2);
+        this.cheat = new Cheat();
+        this.database1 = new Database1();
+        logger.info("SchedulerService 初始化完成");
+    }
+    
+    /**
+     * 启动所有定时任务
+     */
+    public void start() {
+        // 每分钟执行一次 PunishUser 函数
+        scheduler.scheduleAtFixedRate(
+            this::executePunishUser,
+            0, // 初始延迟1分钟
+            1, // 每1分钟执行一次
+            TimeUnit.MINUTES
+        );
+        
+        logger.info("定时任务已启动 - PunishUser 任务将每分钟执行一次");
+    }
+    
+    /**
+     * 执行用户惩罚任务
+     */
+    private void executePunishUser() {
+        try {
+            logger.info("开始执行 PunishUser 定时任务");
+            cheat.PunishUser();
+            database1.SettleBeg();
+            logger.info("PunishUser 定时任务执行完成");
+        } catch (Exception e) {
+            logger.error("执行 PunishUser 定时任务时发生错误: {}", e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * 停止所有定时任务
+     */
+    public void stop() {
+        if (scheduler != null && !scheduler.isShutdown()) {
+            scheduler.shutdown();
+            try {
+                if (!scheduler.awaitTermination(10, TimeUnit.SECONDS)) {
+                    scheduler.shutdownNow();
+                }
+                logger.info("定时任务服务已停止");
+            } catch (InterruptedException e) {
+                scheduler.shutdownNow();
+                Thread.currentThread().interrupt();
+                logger.warn("停止定时任务服务时被中断");
+            }
+        }
+    }
+}
