diff --git a/.gitignore b/.gitignore index 0aa5210..761b3c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /.idea /*.iml /target +settings.local.json \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a16cb1a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,282 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is a Java SDK for holiday/workday calculations called `youfool-holiday-sdk`. It provides functionality to: + +- Calculate workdays by skipping holidays and weekends +- Check if a specific date is a workday +- Check if a specific datetime is within working hours +- Support both online and offline data modes for holiday information + +## Build Commands + +```bash +# Compile the project +mvn compile + +# Build the JAR with sources +mvn clean package + +# Install to local repository +mvn clean install + +# Skip tests during build (default behavior) +mvn clean package -DskipTests +``` + +## Architecture + +The SDK follows a factory pattern with strategy implementation for data management: + +### Core Components + +1. **HolidayCalculator** (`src/main/java/com/chinaweal/youfool/holiday/sdk/HolidayCalculator.java`) + - Main API entry point with static methods + - Provides workday calculation and date/time validation methods + - Must be initialized with `HolidayCalculatorConfig` before use + +2. **HolidayCalculatorConfig** (`src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorConfig.java`) + - Configuration class with Lombok annotations + - Controls online/offline mode, work hours, data refresh intervals + - Online mode: fetches from API endpoint + - Offline mode: loads from local JSON files + +3. **Data Management Strategy Pattern** + - `AbstractHolidayDataManager`: Base class with caching and synchronization logic + - `OnlineHolidayDataManager`: Fetches data from REST API + - `LocationHolidayDataManager`: Loads from local JSON files in classpath or filesystem + +4. **Holiday Entity** (`src/main/java/com/chinaweal/youfool/holiday/sdk/data/entity/Holiday.java`) + - Data model with Jackson JSON serialization + - Contains date, festival name, type (holiday/workday), and descriptions + +### Data Flow + +1. Initialization creates appropriate data manager based on config +2. Data managers implement lazy loading with configurable refresh intervals +3. Thread-safe data access with synchronization blocks +4. Work time validation uses configurable time ranges + +## Dependencies + +- **Lombok 1.18.12**: Code generation for getters/setters +- **FastJSON2 2.0.56**: JSON serialization/deserialization +- **Jackson Annotations 2.18.5**: JSON format annotations +- **JUnit 4.12**: Testing framework + +## 配置方式 + +### 🔧 Spring Boot 项目配置(推荐) + +在 Spring Boot 项目中,SDK 支持自动配置和 YAML/Properties 文件配置: + +#### 1. 添加依赖 + +```xml + + com.chinaweal.youfool + youfool-holiday-sdk + 1.0.0 + +``` + +#### 2. YAML 配置 (`application.yml`) + +```yaml +youfool: + holiday: + # 是否启用假期计算器,默认启用 + enabled: true + + # 数据模式:true=在线模式,false=离线模式,默认离线 + online: false + + # 在线模式下的API服务器地址 + host: http://www.chinaweal.com.cn:8090/holiday-api + + # 离线模式下的本地配置目录 + config-path: classpath:holiday + + # 工作时间配置,多个时间段用分号分隔 + # 格式:HH:mm-HH:mm;HH:mm-HH:mm + work-time: "08:00-12:00;14:00-18:00" + + # 数据刷新间隔(秒),-1表示不刷新,默认15分钟 + flush-interval: 900 + + # 是否在Spring Boot启动时自动初始化 + auto-init: true +``` + +#### 3. Properties 配置 (`application.properties`) + +```properties +# 是否启用假期计算器 +youfool.holiday.enabled=true + +# 数据模式:true=在线模式,false=离线模式 +youfool.holiday.online=false + +# API服务器地址(在线模式) +youfool.holiday.host=http://www.chinaweal.com.cn:8090/holiday-api + +# 本地配置目录(离线模式) +youfool.holiday.config-path=classpath:holiday + +# 工作时间配置 +youfool.holiday.work-time=08:00-12:00;14:00-18:00 + +# 数据刷新间隔(秒) +youfool.holiday.flush-interval=900 + +# 是否自动初始化 +youfool.holiday.auto-init=true +``` + +#### 4. 直接使用(无需手动初始化) + +配置完成后,直接使用: + +```java +@RestController +public class HolidayController { + + @GetMapping("/workdate") + public LocalDate getWorkDate() { + // 计算5个工作日后的日期 + return HolidayCalculator.calcWorkDate(LocalDate.now(), 5); + } + + @GetMapping("/isWorkDay") + public boolean isWorkDay(@RequestParam LocalDate date) { + // 判断指定日期是否为工作日 + return HolidayCalculator.isWorkDay(date); + } + + @GetMapping("/isWorkTime") + public boolean isWorkTime() { + // 判断当前时间是否为工作时间 + return HolidayCalculator.isWorkTime(LocalDateTime.now()); + } +} +``` + +### 📋 配置参数说明 + +| 参数名 | 类型 | 默认值 | 说明 | +|--------|------|--------|------| +| `youfool.holiday.enabled` | boolean | `true` | 是否启用假期计算器 | +| `youfool.holiday.online` | boolean | `false` | 数据模式:true=在线,false=离线 | +| `youfool.holiday.host` | String | `http://www.chinaweal.com.cn:8090/holiday-api` | 在线模式API地址 | +| `youfool.holiday.config-path` | String | `classpath:holiday` | 离线模式配置目录 | +| `youfool.holiday.work-time` | String | `"09:00-18:00"` | 工作时间配置 | +| `youfool.holiday.flush-interval` | long | `900` | 数据刷新间隔(秒) | +| `youfool.holiday.auto-init` | boolean | `true` | 是否自动初始化 | + +### 🕐 工作时间配置详解 + +工作时间支持多个时间段配置: + +```yaml +# 标准工作时间:上午9点到下午6点 +work-time: "09:00-18:00" + +# 分段工作时间:上午和下午分开 +work-time: "08:00-12:00;14:00-17:30" + +# 多个时间段 +work-time: "06:00-09:00;10:00-12:00;14:00-18:00;20:00-22:00" + +# 24小时工作时间 +work-time: "00:00-23:59" +``` + +### 🌐 数据模式选择 + +#### 在线模式 +```yaml +youfool: + holiday: + online: true + host: http://your-api-server.com/holiday-api + flush-interval: 900 # 15分钟刷新一次 +``` +- 从配置的API接口获取假期数据 +- 支持定时刷新数据 +- 适合需要实时数据的场景 + +#### 离线模式(推荐) +```yaml +youfool: + holiday: + online: false + config-path: classpath:holiday +``` +- 从本地JSON文件读取假期数据 +- 性能更好,无网络依赖 +- 支持classpath和文件系统路径 + +#### 离线模式文件结构 +``` +src/main/resources/ +└── holiday/ + ├── 2024.json + ├── 2025.json + └── 2026.json +``` + +### 🔧 传统Java项目配置 + +对于非Spring Boot项目,可以使用传统配置方式: + +#### Online Mode +```java +HolidayCalculatorConfig config = new HolidayCalculatorConfig(); +config.setOnline(true); +config.setHost("http://www.chinaweal.com.cn:8090/holiday-api"); +config.setWorkTime("08:00-12:00;14:00-17:00"); +HolidayCalculator.init(config); +``` + +#### Offline Mode +```java +HolidayCalculatorConfig config = new HolidayCalculatorConfig(); +config.setOnline(false); +config.setConfigPath("classpath:holiday"); +config.setWorkTime("08:00-12:00;14:00-18:00"); +HolidayCalculator.init(config); +``` + +## API Usage + +```java +// Calculate workday 4 days from now +LocalDate workDay = HolidayCalculator.calcWorkDate(LocalDate.now(), 4); + +// Check if today is a workday +boolean isWorkDay = HolidayCalculator.isWorkDay(LocalDate.now()); + +// Check if current time is within working hours +boolean isWorkTime = HolidayCalculator.isWorkTime(LocalDateTime.now()); +``` + +## Data Sources + +- **Online API**: `{host}/api/holiday/list?year={year}` +- **Offline Files**: JSON files in configured directory (e.g., `classpath:holiday/2025.json`) +- **Data Format**: Array of Holiday objects with date, festival name, and type fields + +## Testing + +Tests are currently skipped by default (`true` in pom.xml). To run tests: + +```bash +mvn test -DskipTests=false +``` + +## Deployment + +The project includes Maven source plugin configuration and nexus repository deployment setup for snapshot versions. \ No newline at end of file diff --git a/README.md b/README.md index 94b654d..e887491 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,258 @@ -# youfool-holiday-sdk +# YouFool Holiday SDK -youfool-holiday调度sdk +[![Maven Central](https://img.shields.io/badge/Maven%20Central-1.0.0-blue.svg)](https://search.maven.org/artifact/com.chinaweal.youfool/youfool-holiday-sdk) +[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7%2B%20%7C%203.x-green.svg)](https://spring.io/projects/spring-boot) +[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -## 使用方法 +一个强大的 Java 假期和工作日计算 SDK,支持 Spring Boot 自动配置,提供在线和离线两种数据模式。 -### 配置初始化 +## 🌟 特性 + +- ✅ **工作日计算** - 自动跳过节假日和周末 +- ✅ **工作日判断** - 判断指定日期是否为工作日 +- ✅ **工作时间判断** - 判断指定时间是否在工作时间内 +- ✅ **双重数据模式** - 支持在线API和离线文件两种数据源 +- ✅ **Spring Boot 集成** - 自动配置,开箱即用 +- ✅ **多时间段支持** - 支持复杂的工作时间配置 +- ✅ **高性能缓存** - 内置缓存机制,提升性能 + +## 🚀 快速开始 + +### 1. 添加依赖 + +```xml + + com.chinaweal.youfool + youfool-holiday-sdk + 1.0.0 + +``` + +### 2. 配置文件 + +在 `application.yml` 中添加配置: + +```yaml +youfool: + holiday: + enabled: true + online: false + work-time: "08:00-12:00;14:00-18:00" + config-path: classpath:holiday + auto-init: true +``` + +### 3. 直接使用 + +配置完成后,无需任何初始化代码,直接使用: ```java -// 初始化假期计算器 +@RestController +public class HolidayController { + + @GetMapping("/workdate") + public LocalDate getWorkDate() { + // 计算5个工作日后的日期 + return HolidayCalculator.calcWorkDate(LocalDate.now(), 5); + } + + @GetMapping("/isWorkDay") + public boolean isWorkDay(@RequestParam LocalDate date) { + // 判断指定日期是否为工作日 + return HolidayCalculator.isWorkDay(date); + } + + @GetMapping("/isWorkTime") + public boolean isWorkTime() { + // 判断当前时间是否为工作时间 + return HolidayCalculator.isWorkTime(LocalDateTime.now()); + } +} +``` + +就这么简单!SDK 会自动初始化并开始工作。 + +## 📋 配置参数 + +| 参数名 | 类型 | 默认值 | 说明 | +|--------|------|--------|------| +| `youfool.holiday.enabled` | boolean | `true` | 是否启用假期计算器 | +| `youfool.holiday.online` | boolean | `false` | 数据模式:true=在线,false=离线 | +| `youfool.holiday.host` | String | `http://www.chinaweal.com.cn:8090/holiday-api` | 在线模式API地址 | +| `youfool.holiday.config-path` | String | `classpath:holiday` | 离线模式配置目录 | +| `youfool.holiday.work-time` | String | `"09:00-18:00"` | 工作时间配置 | +| `youfool.holiday.flush-interval` | long | `900` | 数据刷新间隔(秒) | +| `youfool.holiday.auto-init` | boolean | `true` | 是否自动初始化 | + +## ⏰ 工作时间配置 + +支持灵活的工作时间配置: + +```yaml +# 标准工作时间:上午9点到下午6点 +work-time: "09:00-18:00" + +# 分段工作时间:上午和午休分开 +work-time: "08:00-12:00;14:00-17:30" + +# 多个时间段 +work-time: "06:00-09:00;10:00-12:00;14:00-18:00;20:00-22:00" + +# 24小时工作时间 +work-time: "00:00-23:59" +``` + +## 🌐 数据模式选择 + +### 离线模式(推荐) + +```yaml +youfool: + holiday: + online: false + config-path: classpath:holiday +``` + +**优势:** +- 性能更好,无网络依赖 +- 启动速度更快 +- 数据稳定可控 + +**文件结构:** +``` +src/main/resources/ +└── holiday/ + ├── 2024.json + ├── 2025.json + └── 2026.json +``` + +### 在线模式 + +```yaml +youfool: + holiday: + online: true + host: http://your-api-server.com/holiday-api + flush-interval: 900 # 15分钟刷新一次 +``` + +**优势:** +- 数据实时更新 +- 集中管理 +- 适合分布式系统 + +## 🎯 API 使用方法 + +### 核心方法 + +```java +// 计算工作日 +LocalDate workDay = HolidayCalculator.calcWorkDate(startDate, plusDays); + +// 判断工作日 +boolean isWorkDay = HolidayCalculator.isWorkDay(date); + +// 判断工作时间 +boolean isWorkTime = HolidayCalculator.isWorkTime(dateTime); +``` + +### 使用示例 + +```java +@Service +public class BusinessService { + + public LocalDate getDeliveryDate(LocalDate orderDate, int processingDays) { + // 计算处理完成后的工作日(排除节假日和周末) + return HolidayCalculator.calcWorkDate(orderDate, processingDays); + } + + public boolean canProcessNow() { + // 判断当前是否为工作时间 + return HolidayCalculator.isWorkTime(LocalDateTime.now()); + } + + public boolean isValidBusinessDay(LocalDate date) { + // 判断是否为有效工作日 + return HolidayCalculator.isWorkDay(date); + } +} +``` + +## 🔄 传统 Java 项目配置 + +如果你不使用 Spring Boot,可以这样配置: + +```java +// 离线模式 HolidayCalculatorConfig config = new HolidayCalculatorConfig(); -// 是否在线同步数据模式 -config. - -setOnline(Boolean.parseBoolean(environment.getProperty("holiday.online"))); -// 离线模式配置文件路径(默认:classpath:holiday) - config. - -setConfigPath(environment.getProperty("holiday.config-path")); -// 工作时间区间配置,多个用;隔开,示例:08:00-12:00;14:00-17:00 - config. - -setWorkTime(environment.getProperty("holiday.work-time")); -// 数据同步间隔,默认-1(只在初始化时同步) -String interval = environment.getProperty("holiday.flush-interval"); -if(interval !=null){ - config. - -setFlushInterval(Long.parseLong(interval.trim())); - } - HolidayCalculator. - -init(config); -``` - -### 在线假期信息配置路径 - -> 在线模式:config.setOnline(true);时,需要配置在线数据获取路径 - -```java -config.setHost("http://www.chinaweal.com.cn:8090/holiday-api");// 目前公司的数据后端路径 -``` - -> 离线模式:config.setOnline(false);时,需要配置离线数据获取路径 - -```java +config.setOnline(false); config.setConfigPath("classpath:holiday"); +config.setWorkTime("08:00-12:00;14:00-18:00"); +HolidayCalculator.init(config); + +// 在线模式 +HolidayCalculatorConfig config = new HolidayCalculatorConfig(); +config.setOnline(true); +config.setHost("http://api.example.com/holiday"); +config.setWorkTime("08:00-12:00;14:00-18:00"); +HolidayCalculator.init(config); ``` -> json数据通过公司后端接口 http://www.chinaweal.com.cn:8090/holiday-api/api/holiday/export/{year}.json 获取,并以`.json` -> 为扩展名,保存到上面配置的路径下,配置了定时采集任务的时间后,只需通过修改或增添`.json`文件即可。无需重启项目 +## 🏗️ 项目结构 -### 初始化后调用 +``` +youfool-holiday-sdk/ +├── src/main/java/com/chinaweal/youfool/holiday/sdk/ +│ ├── HolidayCalculator.java # 主API类 +│ ├── config/ +│ │ ├── HolidayCalculatorConfig.java # 传统配置类 +│ │ ├── HolidayCalculatorProperties.java # Spring Boot配置类 +│ │ ├── HolidayCalculatorAutoConfiguration.java # Spring Boot 2.x自动配置 +│ │ └── HolidayCalculatorAutoConfigurationV3.java # Spring Boot 3.x自动配置 +│ ├── data/ +│ │ ├── entity/Holiday.java # 假期实体类 +│ │ └── manager/ # 数据管理器 +│ └── ... # 其他工具类 +├── src/main/resources/ +│ ├── META-INF/ +│ │ ├── spring.factories # Spring Boot 2.x自动配置注册 +│ │ └── spring/ # Spring Boot 3.x自动配置注册 +│ └── META-INF/additional-spring-configuration-metadata.json # 配置元数据 +└── example/ # 示例代码 +``` -```java -// 推算工作日 -HolidayCalculator.calcWorkDate(LocalDate.now(), 4); -// 判断是否是工作日 - HolidayCalculator. +## 🔧 构建 -isWorkDay(LocalDate.now()); -// 判断限制是否为工作时间 - HolidayCalculator. +```bash +# 编译项目 +mvn clean compile -isWorkTime(LocalDateTime.now()); -``` \ No newline at end of file +# 打包项目 +mvn clean package + +# 安装到本地仓库 +mvn clean install +``` + +## 📄 文档 + +- [详细配置说明](CLAUDE.md) +- [Spring Boot 集成指南](README-SPRING-BOOT.md) +- [Spring Boot 3 部署指南](SPRING-BOOT-3-GUIDE.md) +- [部署指南](DEPLOYMENT-GUIDE.md) +- [Bean 冲突修复说明](BEAN-CONFLICT-FIX.md) + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 📄 许可证 + +MIT License + +## 🔗 相关链接 + +- [Spring Boot 官方文档](https://spring.io/projects/spring-boot) +- [Maven 中央仓库](https://search.maven.org/) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4c74f3a..76e5b3e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.chinaweal.youfool youfool-holiday-sdk - 1.0.0-SNAPSHOT + 1.0.0 jar ${project.artifactId} https://www.chinaweal.com.cn @@ -26,7 +26,7 @@ org.projectlombok lombok - 1.18.12 + 1.18.30 provided @@ -41,6 +41,24 @@ 4.12 test + + + + org.springframework.boot + spring-boot-autoconfigure + 2.7.18 + provided + true + + + + + org.springframework.boot + spring-boot-configuration-processor + 2.7.18 + provided + true + @@ -69,5 +87,10 @@ Nexus Snapshot Repository http://121.8.152.130:8081/nexus/content/repositories/snapshots/ + + nexus + Nexus Release Repository + http://121.8.152.130:8081/nexus/content/repositories/releases/ + diff --git a/src/main/java/com/chinaweal/youfool/holiday/sdk/HolidayCalculator.java b/src/main/java/com/chinaweal/youfool/holiday/sdk/HolidayCalculator.java index 4666124..3731687 100644 --- a/src/main/java/com/chinaweal/youfool/holiday/sdk/HolidayCalculator.java +++ b/src/main/java/com/chinaweal/youfool/holiday/sdk/HolidayCalculator.java @@ -1,6 +1,7 @@ package com.chinaweal.youfool.holiday.sdk; import com.chinaweal.youfool.holiday.sdk.config.HolidayCalculatorConfig; +import com.chinaweal.youfool.holiday.sdk.config.HolidayCalculatorProperties; import com.chinaweal.youfool.holiday.sdk.data.entity.Holiday; import com.chinaweal.youfool.holiday.sdk.data.manager.HolidayDataManager; import com.chinaweal.youfool.holiday.sdk.data.manager.LocationHolidayDataManager; @@ -78,6 +79,28 @@ public abstract class HolidayCalculator { } } + /** + * 从 Spring Boot 配置属性初始化 + * + * @param properties Spring Boot 配置属性 + * @author lroyia + * @since 2025/11/12 + */ + public static void initFromProperties(HolidayCalculatorProperties properties) { + if (!properties.isEnabled()) { + return; + } + + HolidayCalculatorConfig config = new HolidayCalculatorConfig(); + config.setOnline(properties.isOnline()); + config.setHost(properties.getHost()); + config.setConfigPath(properties.getConfigPath()); + config.setWorkTime(properties.getWorkTime()); + config.setFlushInterval(properties.getFlushInterval()); + + init(config); + } + /** * 计算工作日 * diff --git a/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfiguration.java b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfiguration.java new file mode 100644 index 0000000..8901030 --- /dev/null +++ b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfiguration.java @@ -0,0 +1,61 @@ +package com.chinaweal.youfool.holiday.sdk.config; + +import com.chinaweal.youfool.holiday.sdk.HolidayCalculator; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * 假期计算器自动配置类 + * 兼容 Spring Boot 2.7.x 和 3.x + * + * @author lroyia + * @since 2025/11/12 + */ +@AutoConfiguration +@ConditionalOnClass(HolidayCalculator.class) +@ConditionalOnProperty(prefix = "youfool.holiday", name = "enabled", havingValue = "true", matchIfMissing = true) +@EnableConfigurationProperties(HolidayCalculatorProperties.class) +public class HolidayCalculatorAutoConfiguration { + + /** + * 假期计算器配置属性 Bean + * Spring Boot 2.x 中需要手动创建配置属性 Bean + * + * @param properties 配置属性 + * @return 配置属性 Bean + */ + @Bean + @ConditionalOnMissingBean + public HolidayCalculatorProperties holidayCalculatorProperties() { + System.out.println("Spring Boot 2 - 注册 HolidayCalculatorProperties Bean"); + return new HolidayCalculatorProperties(); + } + + /** + * 自动初始化假期计算器 + * + * @param properties 配置属性 + */ + @Bean + @ConditionalOnProperty(prefix = "youfool.holiday", name = "auto-init", havingValue = "true", matchIfMissing = true) + public HolidayCalculatorInitializer holidayCalculatorInitializer(HolidayCalculatorProperties properties) { + System.out.println("自动初始化假期计算器,配置: 在线模式=" + properties.isOnline() + ", 工作时间=" + properties.getWorkTime()); + + // 初始化假期计算器 + HolidayCalculator.initFromProperties(properties); + + return new HolidayCalculatorInitializer(); + } + + /** + * 假期计算器初始化器 + * 用于标记自动初始化已完成 + */ + public static class HolidayCalculatorInitializer { + // 空实现,仅用于标记 + } +} \ No newline at end of file diff --git a/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfigurationV3.java b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfigurationV3.java new file mode 100644 index 0000000..a465fe6 --- /dev/null +++ b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorAutoConfigurationV3.java @@ -0,0 +1,47 @@ +package com.chinaweal.youfool.holiday.sdk.config; + +import com.chinaweal.youfool.holiday.sdk.HolidayCalculator; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * 假期计算器 Spring Boot 3 自动配置类 + * 针对 Spring Boot 3.x 优化 + * + * @author lroyia + * @since 2025/11/12 + */ +@AutoConfiguration +@ConditionalOnClass(HolidayCalculator.class) +@ConditionalOnProperty(prefix = "youfool.holiday", name = "enabled", havingValue = "true", matchIfMissing = true) +@EnableConfigurationProperties(HolidayCalculatorProperties.class) +public class HolidayCalculatorAutoConfigurationV3 { + + /** + * 自动初始化假期计算器 + * Spring Boot 3 中,@ConfigurationProperties 会自动注册 Bean,不需要手动创建 + * + * @param properties 配置属性(由 Spring Boot 3 自动注入) + */ + @Bean + @ConditionalOnProperty(prefix = "youfool.holiday", name = "auto-init", havingValue = "true", matchIfMissing = true) + public HolidayCalculatorInitializerV3 holidayCalculatorInitializer(HolidayCalculatorProperties properties) { + System.out.println("Spring Boot 3 - 自动初始化假期计算器,配置: 在线模式=" + properties.isOnline() + ", 工作时间=" + properties.getWorkTime()); + + // 初始化假期计算器 + HolidayCalculator.initFromProperties(properties); + + return new HolidayCalculatorInitializerV3(); + } + + /** + * 假期计算器初始化器 + * 用于标记自动初始化已完成 + */ + public static class HolidayCalculatorInitializerV3 { + // 空实现,仅用于标记 + } +} \ No newline at end of file diff --git a/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorProperties.java b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorProperties.java new file mode 100644 index 0000000..f30f3b8 --- /dev/null +++ b/src/main/java/com/chinaweal/youfool/holiday/sdk/config/HolidayCalculatorProperties.java @@ -0,0 +1,53 @@ +package com.chinaweal.youfool.holiday.sdk.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 假期计算器 Spring Boot 配置属性 + * + * @author lroyia + * @since 2025/11/12 + */ +@Data +@ConfigurationProperties(prefix = "youfool.holiday") +public class HolidayCalculatorProperties { + + /** + * 是否启用假期计算器,默认启用 + */ + private boolean enabled = true; + + /** + * 是否在线模式,在线模式会从网络获取数据,离线模式会从本地文件获取数据 + * 默认为离线模式 + */ + private boolean online = false; + + /** + * 服务器地址,在线模式下使用 + */ + private String host = "http://www.chinaweal.com.cn:8090/holiday-api"; + + /** + * 本地假期配置目录,默认为classpath:holiday + */ + private String configPath = "classpath:holiday"; + + /** + * 工作时间区间配置,多个用;隔开,示例:08:00-12:00;14:00-17:00 + * 默认为 09:00-18:00 + */ + private String workTime = "09:00-18:00"; + + /** + * 刷新间隔(秒),-1为不刷新,默认15分钟 + */ + private long flushInterval = 60 * 15; + + /** + * 是否在 Spring Boot 启动时自动初始化,默认自动初始化 + */ + private boolean autoInit = true; +} \ No newline at end of file diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..fa16639 --- /dev/null +++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,46 @@ +{ + "properties": [ + { + "name": "youfool.holiday.enabled", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "是否启用假期计算器。" + }, + { + "name": "youfool.holiday.online", + "type": "java.lang.Boolean", + "defaultValue": false, + "description": "是否在线模式。在线模式会从网络获取数据,离线模式会从本地文件获取数据。" + }, + { + "name": "youfool.holiday.host", + "type": "java.lang.String", + "defaultValue": "http://www.chinaweal.com.cn:8090/holiday-api", + "description": "服务器地址,在线模式下使用。" + }, + { + "name": "youfool.holiday.config-path", + "type": "java.lang.String", + "defaultValue": "classpath:holiday", + "description": "本地假期配置目录。" + }, + { + "name": "youfool.holiday.work-time", + "type": "java.lang.String", + "defaultValue": "09:00-18:00", + "description": "工作时间区间配置,多个用;隔开,示例:08:00-12:00;14:00-17:00。" + }, + { + "name": "youfool.holiday.flush-interval", + "type": "java.lang.Long", + "defaultValue": 900, + "description": "刷新间隔(秒),-1为不刷新,默认15分钟。" + }, + { + "name": "youfool.holiday.auto-init", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "是否在 Spring Boot 启动时自动初始化。" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a1e5a7b --- /dev/null +++ b/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.chinaweal.youfool.holiday.sdk.config.HolidayCalculatorAutoConfiguration \ No newline at end of file diff --git a/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..a846a87 --- /dev/null +++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.chinaweal.youfool.holiday.sdk.config.HolidayCalculatorAutoConfigurationV3 \ No newline at end of file