diff --git a/pom.xml b/pom.xml
index c8021eb..72dc917 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,12 @@
spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
com.baomidou
diff --git a/src/main/java/com/gameplatform/server/annotation/README_RepeatCall.md b/src/main/java/com/gameplatform/server/annotation/README_RepeatCall.md
new file mode 100644
index 0000000..b6fd886
--- /dev/null
+++ b/src/main/java/com/gameplatform/server/annotation/README_RepeatCall.md
@@ -0,0 +1,108 @@
+# 重试机制使用说明
+
+本项目提供了两种不同的重试机制,用于不同的业务场景。
+
+## 🔄 两种重试机制对比
+
+| 特性 | @RepeatCall 注解 | retry() 方法 |
+|------|-----------------|--------------|
+| **触发条件** | 无论成功失败都执行指定次数 | 只有在请求失败时才重试 |
+| **适用场景** | 确保脚本端接收到关键操作 | 网络不稳定的查询操作 |
+| **执行次数** | 固定执行N次 | 最多重试N次(成功则停止) |
+| **性能影响** | 较大(总是执行多次) | 较小(成功时只执行1次) |
+
+## 🎯 @RepeatCall 注解机制
+
+### 功能介绍
+无论成功还是失败都会执行指定次数,主要用于确保脚本端能够可靠接收到请求。
+
+### 使用方法
+
+```java
+@RepeatCall(times = 3, description = "设置次数")
+public Mono setTimes(String codeNo, int times) {
+ // 无论成功失败都会执行3次
+ return webClient.post()...;
+}
+```
+
+### 参数说明
+- `times`: 重复执行次数(默认3次)
+- `delayMs`: 每次调用之间的延迟时间(毫秒,默认0)
+- `logEachCall`: 是否记录每次调用的详细日志(默认true)
+- `description`: 描述信息,用于日志记录(默认为方法名)
+
+### 已应用的方法
+- `setTimes()` - 设置次数
+- `selectRegion()` - 选区操作
+- `refresh()` - 刷新操作
+- `checkRefresh()` - 判断刷新
+- `saveTotalTimes()` - 保存总次数
+- `refundOrder()` - 退单操作
+
+## 🔁 retry() 重试机制
+
+### 功能介绍
+只有在请求失败(超时、404、网络错误等)时才会重试,成功则立即返回结果。
+
+### 使用方法
+
+```java
+public Mono getQrPng(String path) {
+ return webClient.get()
+ .uri(path)
+ .retrieve()
+ .bodyToMono(byte[].class)
+ .timeout(Duration.ofSeconds(5))
+ .retry(3) // 失败时重试3次
+ .doOnError(e -> log.warn("获取失败: {}", e.toString()));
+}
+```
+
+### 已应用的方法
+- `getQrPng()` - 获取二维码图片
+- `getImagePng()` - 获取通用图片
+- `getText()` - 获取文本内容
+- `checkAvailableDevice()` - 检查空闲设备
+- `checkLoginStatus()` - 检查上号状态
+- `getDeviceQrCode()` - 获取设备二维码
+- `getTargetScore()` - 获取目标分数
+- `getDeviceStatus()` - 获取设备状态
+
+## 📋 使用场景选择指南
+
+### 选择 @RepeatCall 的场景:
+✅ **关键状态同步操作**
+- 设置游戏次数
+- 选择游戏区域
+- 刷新操作
+- 退单操作
+
+✅ **需要确保脚本端接收的操作**
+- 重要参数设置
+- 状态变更通知
+
+### 选择 retry() 的场景:
+✅ **数据查询操作**
+- 获取图片资源
+- 检查设备状态
+- 获取分数信息
+
+✅ **可能因网络问题失败的操作**
+- 文件下载
+- API 调用
+- 状态检查
+
+## 💡 最佳实践
+
+1. **@RepeatCall**:用于重要的业务操作,确保执行到位
+2. **retry()**:用于查询操作,提高成功率但不影响性能
+3. **超时设置**:两种机制都应配合合理的超时时间
+4. **日志记录**:重要操作要有详细的日志记录
+
+## ⚠️ 注意事项
+
+1. **@RepeatCall** 会显著增加执行时间,请谨慎使用
+2. **retry()** 对幂等操作更安全
+3. 需要添加 `spring-boot-starter-aop` 依赖支持 @RepeatCall
+4. 建议根据业务重要性选择合适的重试机制
diff --git a/src/main/java/com/gameplatform/server/annotation/RepeatCall.java b/src/main/java/com/gameplatform/server/annotation/RepeatCall.java
new file mode 100644
index 0000000..4ce3dfd
--- /dev/null
+++ b/src/main/java/com/gameplatform/server/annotation/RepeatCall.java
@@ -0,0 +1,36 @@
+package com.gameplatform.server.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 重复调用注解
+ * 用于标记需要重复执行的方法,无论成功失败都会执行指定次数
+ * 主要用于确保脚本端能够可靠接收到请求
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RepeatCall {
+
+ /**
+ * 重复执行次数(默认3次)
+ */
+ int times() default 3;
+
+ /**
+ * 每次调用之间的延迟时间(毫秒,默认0)
+ */
+ long delayMs() default 0;
+
+ /**
+ * 是否记录每次调用的详细日志(默认true)
+ */
+ boolean logEachCall() default true;
+
+ /**
+ * 描述信息,用于日志记录
+ */
+ String description() default "";
+}
diff --git a/src/main/java/com/gameplatform/server/aspect/RepeatCallAspect.java b/src/main/java/com/gameplatform/server/aspect/RepeatCallAspect.java
new file mode 100644
index 0000000..bf8a2a3
--- /dev/null
+++ b/src/main/java/com/gameplatform/server/aspect/RepeatCallAspect.java
@@ -0,0 +1,81 @@
+package com.gameplatform.server.aspect;
+
+import com.gameplatform.server.annotation.RepeatCall;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Mono;
+
+/**
+ * 重复调用切面
+ * 处理被 @RepeatCall 注解标记的方法,实现重复执行逻辑
+ * 目前主要支持返回 Mono 类型的方法
+ */
+@Aspect
+@Component
+public class RepeatCallAspect {
+
+ private static final Logger log = LoggerFactory.getLogger(RepeatCallAspect.class);
+
+ @Around("@annotation(repeatCall)")
+ public Object repeatCall(ProceedingJoinPoint joinPoint, RepeatCall repeatCall) throws Throwable {
+ String methodName = joinPoint.getSignature().getName();
+ String className = joinPoint.getTarget().getClass().getSimpleName();
+
+ int times = repeatCall.times();
+ String description = repeatCall.description().isEmpty() ? methodName : repeatCall.description();
+
+ log.info("开始重复调用: {}.{} - {} (将执行{}次)", className, methodName, description, times);
+
+ // 执行第一次调用
+ Mono