diff --git a/functional-modules/pom.xml b/functional-modules/pom.xml
index c7869ea..578cb8c 100644
--- a/functional-modules/pom.xml
+++ b/functional-modules/pom.xml
@@ -20,6 +20,7 @@
font-resources
monitoring-sync
renkang-test
+ xj-anyan-api
diff --git a/functional-modules/xj-anyan-api/pom.xml b/functional-modules/xj-anyan-api/pom.xml
new file mode 100644
index 0000000..e31b138
--- /dev/null
+++ b/functional-modules/xj-anyan-api/pom.xml
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+
+ com.renkang
+ functional-modules
+ 2.0.0
+
+
+ xj-anyan-api
+ xj安眼系统API
+ 2.0.0
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework
+ spring-web
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+ org.springframework.retry
+ spring-retry
+
+
+ org.jeecgframework.boot
+ jeecg-boot-base-core
+ provided
+
+
+
+
diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java
new file mode 100644
index 0000000..73bacd4
--- /dev/null
+++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java
@@ -0,0 +1,83 @@
+package com.renkang.anyan.client;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.renkang.anyan.model.dto.HealthRoomDTO;
+import com.renkang.anyan.model.dto.HealthSignListParam;
+import com.renkang.anyan.model.vo.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: AnYanClient xj安眼系统接口调用客户端
+ * @Author: feng
+ * @Date: 2025-8-1
+ * @Version: V1.0
+ */
+public interface AnYanClient {
+ /**
+ * 获取服务访问令牌
+ * @return
+ */
+ String getAuthToken();
+
+ /**
+ * 刷新口令
+ */
+ void refreshToken();
+
+ /**
+ * 体检人数统计查询
+ * @param medicalYear 体检年份
+ * @return
+ */
+ List examinationStatistics(Integer medicalYear);
+
+ /**
+ * 健康打卡数据统计查询(血压,减重,血糖)
+ * @param beginDate
+ * @param endDate
+ * @return
+ */
+ HealthSignStatVO healthCheckStatistics(Date beginDate, Date endDate);
+
+ /**
+ *健康打卡异常数据详细查询(血压)
+ * @param healthSignListParam
+ * @return
+ */
+ IPage bloodPressureList(HealthSignListParam healthSignListParam);
+
+ /**
+ *健康打卡异常数据详细查询(减重)
+ * @param healthSignListParam
+ * @return
+ */
+ IPage weightPressureList(HealthSignListParam healthSignListParam);
+
+ /**
+ *健康打卡异常数据详细查询(血糖)
+ * @param healthSignListParam
+ * @return
+ */
+ IPage bloodSugarClockSList(HealthSignListParam healthSignListParam);
+
+ /**
+ * 油田医院数据查询
+ * @return
+ */
+ List hospitalList();
+
+ /**
+ * 健康小屋基础数据查询
+ * @return
+ */
+ List healthPlaceHomList();
+
+ /**
+ * 健康小屋详细数据查询
+ * @param healthRoomDTO
+ * @return
+ */
+ IPage bloodSugarClockSList(HealthRoomDTO healthRoomDTO);
+}
diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java
new file mode 100644
index 0000000..235c160
--- /dev/null
+++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java
@@ -0,0 +1,150 @@
+package com.renkang.anyan.client;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.renkang.anyan.config.AnYanProperties;
+import com.renkang.anyan.config.RestTemplateUtil;
+import com.renkang.anyan.constants.AnYanConstants;
+import com.renkang.anyan.enums.AnYanApiEnum;
+import com.renkang.anyan.model.dto.AuthParam;
+import com.renkang.anyan.model.dto.HealthRoomDTO;
+import com.renkang.anyan.model.dto.HealthSignListParam;
+import com.renkang.anyan.model.vo.*;
+import com.renkang.anyan.utils.PageResultToBeanUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.ExceptionAssertsUtil;
+import org.jeecg.util.RedisClientUtil;
+import org.jeecg.util.RedisKeyPrefix;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: AnYanClientExecutor xj安眼系统接口调用执行器
+ * @Author: feng
+ * @Date: 2025-8-1
+ * @Version: V1.0
+ */
+@Service
+@EnableRetry
+@RequiredArgsConstructor
+public class AnYanClientExecutor implements AnYanClient {
+ private final RedisClientUtil redisClientUtil;
+ private final AnYanProperties anYanProperties;
+
+ @Override
+ public String getAuthToken() {
+ String token = redisClientUtil.get(new RedisKeyPrefix(AnYanConstants.AN_YAN_API_TOKEN_PREFIX) ,"token",String.class);
+ if(StringUtils.isEmpty(token)){
+ AuthResult authResult = getAuthTokenExecutor();
+ if(ObjectUtil.isNotEmpty(authResult) && StrUtil.isNotEmpty(authResult.getAccess_token())){
+ token = authResult.getAccess_token();
+ int expireSeconds = ObjectUtil.isNotEmpty(authResult.getExpires_in())? authResult.getExpires_in() : 7200;
+ redisClientUtil.set(new RedisKeyPrefix(expireSeconds,AnYanConstants.AN_YAN_API_TOKEN_PREFIX),"token", token);
+ }
+ }
+ return token;
+ }
+
+ private AuthResult getAuthTokenExecutor(){
+ AuthParam authParam = new AuthParam();
+ authParam.setClient_id(anYanProperties.getClientId());
+ authParam.setClient_secret(anYanProperties.getClientSecret());
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+ ResponseEntity responseEntity = RestTemplateUtil.postExchange(AnYanApiEnum.QUERY_AUTH_TOKEN,headers,authParam,AuthResult.class);
+ if(HttpStatus.OK.equals(responseEntity.getStatusCode()) && ObjectUtils.isNotEmpty(responseEntity.getBody())){
+ return responseEntity.getBody();
+ }else {
+ ExceptionAssertsUtil.fail("------安眼系统获取token失败------" + responseEntity.getBody());
+ }
+ return new AuthResult();
+ }
+
+ @Override
+ public void refreshToken() {
+ AuthResult authResult = getAuthTokenExecutor();
+ if(ObjectUtil.isNotEmpty(authResult) && StrUtil.isNotEmpty(authResult.getAccess_token())){
+ int expireSeconds = ObjectUtil.isNotEmpty(authResult.getExpires_in())? authResult.getExpires_in() : 7200;
+ redisClientUtil.set(new RedisKeyPrefix(expireSeconds,AnYanConstants.AN_YAN_API_TOKEN_PREFIX),"token", authResult.getAccess_token());
+ }
+ }
+
+ private HttpHeaders buildTokenHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ headers.add(AnYanConstants.AUTHORIZATION, AnYanConstants.TOKEN_TYPE + getAuthToken());
+ return headers;
+ }
+
+ @Override
+ public List examinationStatistics(Integer medicalYear) {
+ if(null == medicalYear){ medicalYear = DateUtil.year(new Date()); }
+ JSONObject param = new JSONObject();
+ param.put("medicalYear",String.valueOf(medicalYear));
+ Result