diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/config/AsyncConfig.java b/server/src/main/java/com/aisino/iles/lawenforcement/config/AsyncConfig.java
new file mode 100644
index 0000000..d818cf9
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/config/AsyncConfig.java
@@ -0,0 +1,53 @@
+package com.aisino.iles.lawenforcement.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig {
+
+ /**
+ * 定义一个专用于@Async任务的线程池Bean。
+ * Spring Boot会自动检测到这个Bean,并用它来执行所有@Async方法。
+ */
+ @Bean
+ public Executor asyncTaskExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+
+ // 核心线程数:线程池中保持的最小线程数,即使它们处于空闲状态。
+ // 通常设置为CPU核心数,以充分利用CPU资源。
+ int corePoolSize = Runtime.getRuntime().availableProcessors();
+ executor.setCorePoolSize(corePoolSize);
+
+ // 最大线程数:线程池允许创建的最大线程数。
+ // 对于I/O密集型任务(如我们的数据同步),可以设置得比核心数大很多。
+ executor.setMaxPoolSize(corePoolSize * 2);
+
+ // 队列容量:当所有核心线程都在忙时,新任务会进入这个队列等待。
+ // 设置一个合理的队列容量可以应对突发流量。
+ executor.setQueueCapacity(200);
+
+ // 线程名称前缀:为线程池中的线程设置一个有意义的前缀。
+ // 这对于日志分析和问题排查至关重要。
+ executor.setThreadNamePrefix("async-task-");
+
+ // 拒绝策略:当线程池和队列都满了之后,如何处理新来的任务。
+ // CallerRunsPolicy:由提交任务的线程自己来执行这个任务。这是一种有效的"反压"策略,
+ // 可以减慢任务提交方的速度,防止系统被压垮。
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+
+ // 空闲线程存活时间:当线程数超过核心数时,多余的空闲线程在终止前等待新任务的最长时间。
+ executor.setKeepAliveSeconds(60);
+
+ // 初始化线程池
+ executor.initialize();
+
+ return executor;
+ }
+}
diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/config/SyncApiProperties.java b/server/src/main/java/com/aisino/iles/lawenforcement/config/SyncApiProperties.java
new file mode 100644
index 0000000..94cacde
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/config/SyncApiProperties.java
@@ -0,0 +1,34 @@
+package com.aisino.iles.lawenforcement.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 数据同步API配置属性。
+ *
+ * 用于从 application.yml 文件中加载与第三方系统同步数据相关的API端点配置。
+ *
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "iles.sync.api")
+public class SyncApiProperties {
+
+ /**
+ * API基础URL。
+ */
+ private String baseUrl;
+
+ /**
+ * API端点映射。
+ *
+ * Key是完全限定的DTO类名 (e.g., "com.aisino.iles.lawenforcement.model.dto.DjbZfajxxRequestDto"),
+ * Value是对应的相对API路径 (e.g., "/djbZfajxx/save").
+ *
+ */
+ private Map endpoints;
+ private Map dtoConverters;
+}
diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/config/ThirdPartyProperties.java b/server/src/main/java/com/aisino/iles/lawenforcement/config/ThirdPartyProperties.java
new file mode 100644
index 0000000..9fc02fd
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/config/ThirdPartyProperties.java
@@ -0,0 +1,52 @@
+package com.aisino.iles.lawenforcement.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Cascade
+ * @description 用于映射所有 third-party.* 配置的统一属性类
+ * @date 2025/07/03
+ */
+@Component
+@ConfigurationProperties(prefix = "third-party")
+@Data
+public class ThirdPartyProperties {
+
+ private Person person = new Person();
+ private Enterprise enterprise = new Enterprise();
+
+ /**
+ * 人员相关配置
+ */
+ @Data
+ public static class Person {
+ /**
+ * 人员查询URL
+ */
+ private String query = "";
+
+ /**
+ * 人员角色列表
+ */
+ private List roles = Collections.emptyList();
+
+ }
+
+ /**
+ * 企业相关配置
+ */
+ @Data
+ public static class Enterprise {
+ /**
+ * 用于获取令牌的移动电话号码
+ */
+ private String yddh;
+
+ }
+
+}
diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeAction.java b/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeAction.java
new file mode 100644
index 0000000..d9d1c88
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeAction.java
@@ -0,0 +1,17 @@
+package com.aisino.iles.lawenforcement.event;
+
+/**
+ * 数据变更操作类型枚举
+ * @author hx
+ */
+public enum DataChangeAction {
+
+ /**
+ * 保存
+ */
+ SAVE,
+ /**
+ * 删除
+ */
+ DELETE
+}
diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeEvent.java b/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeEvent.java
new file mode 100644
index 0000000..5202c22
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/event/DataChangeEvent.java
@@ -0,0 +1,39 @@
+package com.aisino.iles.lawenforcement.event;
+
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * 通用数据变更事件
+ * @param 变更的数据实体类型
+ * @author hx
+ */
+@Getter
+public class DataChangeEvent extends ApplicationEvent {
+
+ private final T data;
+ private final DataChangeAction action;
+ private final Class entityType;
+
+ /**
+ * 创建一个新的 DataChangeEvent.
+ *
+ * @param source 事件源对象
+ * @param data 变更的数据实体
+ * @param action 数据变更的动作类型 (CREATE, UPDATE, DELETE)
+ */
+ public DataChangeEvent(Object source, T data, DataChangeAction action) {
+ super(source);
+ this.data = data;
+ this.action = action;
+ entityType = null;
+ }
+
+ public DataChangeEvent(Object source, T data, DataChangeAction action, Class entityType) {
+ super(source);
+ this.data = data;
+ this.action = action;
+ this.entityType = entityType;
+ }
+
+}
diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/event/aop/DataChangeAspect.java b/server/src/main/java/com/aisino/iles/lawenforcement/event/aop/DataChangeAspect.java
new file mode 100644
index 0000000..2d66275
--- /dev/null
+++ b/server/src/main/java/com/aisino/iles/lawenforcement/event/aop/DataChangeAspect.java
@@ -0,0 +1,123 @@
+package com.aisino.iles.lawenforcement.event.aop;
+
+import com.aisino.iles.lawenforcement.config.SyncApiProperties;
+import com.aisino.iles.lawenforcement.model.dto.DataDtoConverter;
+import com.aisino.iles.lawenforcement.event.DataChangeEvent;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+/**
+ * 数据变更事件发布的AOP切面。
+ * 拦截所有被 @PublishDataChange 注解标记的方法,并在方法成功返回后发布事件。
+ * @author hx
+ */
+@Slf4j
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class DataChangeAspect {
+
+ private final ApplicationEventPublisher eventPublisher;
+ private final SyncApiProperties syncApiProperties;
+
+ /**
+ * 在被 @PublishDataChange 注解标记的方法成功返回后执行。
+ *
+ * @param joinPoint 连接点,包含方法信息
+ * @param annotation 注解实例,用于获取action类型
+ * @param returnedValue 方法的返回值,即被操作的数据实体
+ */
+ @SneakyThrows
+ @AfterReturning(pointcut = "@annotation(annotation)", returning = "returnedValue")
+ public void publishEventOnSuccess(JoinPoint joinPoint, PublishDataChange annotation, Object returnedValue) {
+ if (returnedValue == null) {
+ log.warn("AOP切面: 方法 {} 返回值为null,无法发布数据变更事件。", joinPoint.getSignature().toShortString());
+ return;
+ }
+
+ log.info("AOP切面: 拦截到方法 {} 成功返回, 准备发布 {} 事件。", joinPoint.getSignature().toShortString(), annotation.action());
+
+ if (returnedValue instanceof Collection) {
+ @SuppressWarnings("unchecked") // Safe cast after instanceof check
+ Collection