# hellodemo **Repository Path**: mythink/hellodemo ## Basic Information - **Project Name**: hellodemo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-14 - **Last Updated**: 2025-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 考勤数据计算功能设计文档 ## 功能概述 基于现有的打卡数据表 `tbl_clock_infos`,实现考勤数据的统计计算功能,包括每个用户每月的出勤率、迟到率、早退率等指标,并通过Web页面进行展示和查询。 ## 业务目标 - 自动计算每个用户每月的考勤统计数据 - 基于实际工作日进行出勤率计算 - 基于朝九晚五工作制(09:00-17:00)判定迟到和早退 - 提供友好的Web界面供用户查询考勤数据 ## 核心业务规则 ### 工作日判定规则 - 工作日范围: 周一至周五 - 非工作日: 周六、周日 - 暂不考虑法定节假日和调休 ### 考勤记录匹配规则 - 每个用户每天的考勤由一对打卡记录组成: 签到(type=1) + 签退(type=0) - 上班时间: 当天首次签到时间 - 下班时间: 当天最后一次签退时间 - 如果一天有多次签到或签退,仅取首次签到和末次签退 ### 迟到判定规则 - 标准上班时间: 09:00:00 - 判定逻辑: 首次签到时间 > 09:00:00 则判定为迟到 - 迟到不区分严重程度,超过1分钟即算迟到 ### 早退判定规则 - 标准下班时间: 17:00:00 - 判定逻辑: 最后签退时间 < 17:00:00 则判定为早退 - 早退不区分严重程度,提前1分钟即算早退 ### 缺卡处理规则 - 只有签到无签退: 算作半天异常(早退) - 只有签退无签到: 算作半天异常(迟到) - 整天无打卡记录: 算作缺勤,不计入出勤 ### 出勤率计算规则 出勤率 = (实际出勤天数 / 当月工作日天数) × 100% - 实际出勤天数: 当月有打卡记录的工作日天数(至少有签到或签退之一) - 当月工作日天数: 当月所有周一至周五的天数 ### 迟到率计算规则 迟到率 = (迟到次数 / 实际出勤天数) × 100% - 迟到次数: 当月首次签到时间晚于09:00的天数 ### 早退率计算规则 早退率 = (早退次数 / 实际出勤天数) × 100% - 早退次数: 当月最后签退时间早于17:00的天数 ## 数据模型设计 ### 数据库表设计 #### 考勤统计表(新增) 表名: `tbl_attendance_statistics` | 字段名 | 类型 | 说明 | |--------|------|------| | id | BIGINT | 主键,自增 | | user_id | VARCHAR(64) | 用户ID | | stat_month | VARCHAR(7) | 统计月份,格式: YYYY-MM | | work_days | INT | 当月工作日天数 | | actual_attendance_days | INT | 实际出勤天数 | | late_count | INT | 迟到次数 | | early_leave_count | INT | 早退次数 | | absence_count | INT | 缺勤天数 | | attendance_rate | DECIMAL(5,2) | 出勤率(百分比,保留2位小数) | | late_rate | DECIMAL(5,2) | 迟到率(百分比,保留2位小数) | | early_leave_rate | DECIMAL(5,2) | 早退率(百分比,保留2位小数) | | create_time | DATETIME | 创建时间 | | update_time | DATETIME | 更新时间 | 索引设计: - 主键索引: id - 唯一索引: (user_id, stat_month) - 确保每个用户每月只有一条统计记录 - 普通索引: stat_month - 用于按月份查询 #### 考勤明细表(新增) 表名: `tbl_attendance_detail` | 字段名 | 类型 | 说明 | |--------|------|------| | id | BIGINT | 主键,自增 | | user_id | VARCHAR(64) | 用户ID | | attendance_date | DATE | 考勤日期 | | check_in_time | DATETIME | 签到时间 | | check_out_time | DATETIME | 签退时间 | | is_late | TINYINT | 是否迟到: 1-是, 0-否 | | is_early_leave | TINYINT | 是否早退: 1-是, 0-否 | | is_normal | TINYINT | 是否正常: 1-是, 0-否 | | status | VARCHAR(20) | 状态: NORMAL-正常, LATE-迟到, EARLY_LEAVE-早退, LATE_AND_EARLY-迟到且早退, ABSENCE-缺勤, INCOMPLETE-缺卡 | | create_time | DATETIME | 创建时间 | | update_time | DATETIME | 更新时间 | 索引设计: - 主键索引: id - 唯一索引: (user_id, attendance_date) - 每个用户每天一条记录 - 普通索引: attendance_date - 用于按日期查询 ### 实体类设计 #### AttendanceStatistics(考勤统计实体) | 属性名 | 类型 | 说明 | |--------|------|------| | id | Long | 主键 | | userId | String | 用户ID | | statMonth | String | 统计月份 | | workDays | Integer | 工作日天数 | | actualAttendanceDays | Integer | 实际出勤天数 | | lateCount | Integer | 迟到次数 | | earlyLeaveCount | Integer | 早退次数 | | absenceCount | Integer | 缺勤天数 | | attendanceRate | BigDecimal | 出勤率 | | lateRate | BigDecimal | 迟到率 | | earlyLeaveRate | BigDecimal | 早退率 | | createTime | LocalDateTime | 创建时间 | | updateTime | LocalDateTime | 更新时间 | #### AttendanceDetail(考勤明细实体) | 属性名 | 类型 | 说明 | |--------|------|------| | id | Long | 主键 | | userId | String | 用户ID | | attendanceDate | LocalDate | 考勤日期 | | checkInTime | LocalDateTime | 签到时间 | | checkOutTime | LocalDateTime | 签退时间 | | isLate | Boolean | 是否迟到 | | isEarlyLeave | Boolean | 是否早退 | | isNormal | Boolean | 是否正常 | | status | String | 状态 | | createTime | LocalDateTime | 创建时间 | | updateTime | LocalDateTime | 更新时间 | #### ClockInfo(打卡信息实体 - 已存在) 基于现有表 `tbl_clock_infos` 的实体映射 | 属性名 | 类型 | 说明 | |--------|------|------| | id | Long | 主键 | | userId | String | 用户ID | | clockDate | LocalDate | 打卡日期 | | clockTime | LocalDateTime | 打卡时间 | | type | Integer | 类型: 1-签到, 0-签退 | | clockMethod | Integer | 打卡方式: 1-手动, 2-自动 | | createTime | LocalDateTime | 创建时间 | | updateTime | LocalDateTime | 更新时间 | ### DTO设计 #### AttendanceQueryDTO(考勤查询条件) | 属性名 | 类型 | 说明 | |--------|------|------| | userId | String | 用户ID(可选) | | statMonth | String | 统计月份,格式: YYYY-MM | | pageNum | Integer | 页码 | | pageSize | Integer | 每页条数 | #### AttendanceStatisticsVO(考勤统计视图对象) | 属性名 | 类型 | 说明 | |--------|------|------| | userId | String | 用户ID | | userName | String | 用户姓名(如有用户表则关联) | | statMonth | String | 统计月份 | | workDays | Integer | 工作日天数 | | actualAttendanceDays | Integer | 实际出勤天数 | | lateCount | Integer | 迟到次数 | | earlyLeaveCount | Integer | 早退次数 | | absenceCount | Integer | 缺勤天数 | | attendanceRate | String | 出勤率,格式: xx.xx% | | lateRate | String | 迟到率,格式: xx.xx% | | earlyLeaveRate | String | 早退率,格式: xx.xx% | #### AttendanceDetailVO(考勤明细视图对象) | 属性名 | 类型 | 说明 | |--------|------|------| | userId | String | 用户ID | | userName | String | 用户姓名 | | attendanceDate | String | 考勤日期,格式: YYYY-MM-DD | | weekDay | String | 星期几 | | checkInTime | String | 签到时间,格式: HH:mm:ss | | checkOutTime | String | 签退时间,格式: HH:mm:ss | | status | String | 状态描述 | | statusLabel | String | 状态标签: 正常/迟到/早退/缺勤等 | ## 系统架构设计 ### 分层架构 系统采用经典的三层架构模式: ``` 表现层(Controller) ↓ 业务逻辑层(Service) ↓ 数据访问层(Mapper) ↓ 数据库(MySQL) ``` ### 核心组件设计 #### Controller层 **AttendanceController** - 考勤数据查询控制器 职责: - 接收前端请求,参数校验 - 调用Service层获取数据 - 返回页面或JSON数据 主要接口: - 页面路由: `/attendance/statistics` - 考勤统计页面 - 页面路由: `/attendance/detail` - 考勤明细页面 - 数据接口: `/attendance/api/statistics/query` - 查询统计数据 - 数据接口: `/attendance/api/detail/query` - 查询明细数据 - 操作接口: `/attendance/api/calculate` - 触发计算指定月份考勤数据 #### Service层 **AttendanceCalculationService** - 考勤计算服务 职责: - 计算指定月份的工作日天数 - 从打卡记录中提取考勤明细 - 判定迟到、早退、缺勤 - 计算统计指标 - 保存计算结果 核心方法: - `calculateMonthlyAttendance(String month)` - 计算指定月份所有用户的考勤数据 - `calculateUserAttendance(String userId, String month)` - 计算指定用户指定月份的考勤数据 - `calculateWorkDays(String month)` - 计算指定月份的工作日天数 - `extractDailyAttendance(String userId, LocalDate date)` - 提取用户某天的考勤记录 **AttendanceQueryService** - 考勤查询服务 职责: - 查询考勤统计数据 - 查询考勤明细数据 - 数据格式转换和封装 核心方法: - `queryStatistics(AttendanceQueryDTO queryDTO)` - 查询统计数据 - `queryDetails(String userId, String month)` - 查询明细数据 - `exportStatistics(String month)` - 导出统计数据(预留) **WorkDayService** - 工作日计算服务 职责: - 判断某天是否为工作日 - 计算某月的工作日列表 - 提供工作日相关工具方法 核心方法: - `isWorkDay(LocalDate date)` - 判断是否为工作日 - `getWorkDaysInMonth(String month)` - 获取某月所有工作日 - `countWorkDays(String month)` - 统计某月工作日天数 #### Mapper层 **AttendanceStatisticsMapper** - 考勤统计数据访问 继承 MyBatis-Plus 的 BaseMapper 接口,提供基础CRUD能力 自定义方法: - `selectByUserIdAndMonth(String userId, String month)` - 查询指定用户指定月份的统计数据 - `selectByMonth(String month)` - 查询指定月份所有用户的统计数据 **AttendanceDetailMapper** - 考勤明细数据访问 继承 MyBatis-Plus 的 BaseMapper 接口 自定义方法: - `selectByUserIdAndMonth(String userId, String month)` - 查询指定用户指定月份的明细数据 - `selectByUserIdAndDate(String userId, LocalDate date)` - 查询指定用户指定日期的明细 **ClockInfoMapper** - 打卡信息数据访问 继承 MyBatis-Plus 的 BaseMapper 接口 自定义方法: - `selectByUserIdAndDate(String userId, LocalDate date)` - 查询指定用户指定日期的所有打卡记录 - `selectByUserIdAndMonth(String userId, String month)` - 查询指定用户指定月份的所有打卡记录 - `selectCheckInByUserIdAndDate(String userId, LocalDate date)` - 查询指定用户指定日期的首次签到 - `selectCheckOutByUserIdAndDate(String userId, LocalDate date)` - 查询指定用户指定日期的最后签退 ## 核心业务流程设计 ### 考勤数据计算流程 ```mermaid flowchart TD Start[开始计算] --> Input[输入: 统计月份] Input --> GetUsers[获取所有需要统计的用户列表] GetUsers --> CalcWorkDays[计算当月工作日天数] CalcWorkDays --> LoopUsers{遍历用户} LoopUsers -->|每个用户| GetClockData[获取用户当月打卡数据] GetClockData --> LoopDays{遍历工作日} LoopDays -->|每个工作日| ExtractDaily[提取当天打卡记录] ExtractDaily --> HasClock{有打卡记录?} HasClock -->|否| MarkAbsence[标记缺勤] HasClock -->|是| GetCheckIn[获取首次签到时间] GetCheckIn --> GetCheckOut[获取最后签退时间] GetCheckOut --> CheckLate{签到>09:00?} CheckLate -->|是| MarkLate[标记迟到] CheckLate -->|否| CheckEarly{签退<17:00?} MarkLate --> CheckEarly CheckEarly -->|是| MarkEarlyLeave[标记早退] CheckEarly -->|否| MarkNormal[标记正常] MarkAbsence --> SaveDetail[保存考勤明细] MarkLate --> SaveDetail MarkEarlyLeave --> SaveDetail MarkNormal --> SaveDetail SaveDetail --> NextDay{还有工作日?} NextDay -->|是| LoopDays NextDay -->|否| CalcStats[计算统计指标] CalcStats --> CalcAttendanceRate[计算出勤率] CalcAttendanceRate --> CalcLateRate[计算迟到率] CalcLateRate --> CalcEarlyRate[计算早退率] CalcEarlyRate --> SaveStats[保存统计数据] SaveStats --> NextUser{还有用户?} NextUser -->|是| LoopUsers NextUser -->|否| End[计算完成] ``` ### 考勤统计查询流程 ```mermaid flowchart TD Start[用户访问统计页面] --> LoadPage[加载统计页面] LoadPage --> ShowForm[显示查询表单] ShowForm --> InputCondition[用户输入查询条件] InputCondition --> Submit[提交查询] Submit --> Validate{参数校验} Validate -->|失败| ShowError[显示错误信息] Validate -->|成功| QueryDB[查询数据库] QueryDB --> HasData{有数据?} HasData -->|否| CheckCalculated{是否已计算?} HasData -->|是| FormatData[格式化数据] CheckCalculated -->|否| TriggerCalc[触发计算任务] CheckCalculated -->|是| ShowEmpty[显示无数据提示] TriggerCalc --> WaitCalc[等待计算完成] WaitCalc --> QueryDB FormatData --> BuildVO[构建视图对象] BuildVO --> RenderTable[渲染数据表格] RenderTable --> ShowPage[展示统计页面] ShowError --> ShowForm ShowEmpty --> ShowPage ``` ### 考勤明细查询流程 ```mermaid flowchart TD Start[用户访问明细页面] --> LoadPage[加载明细页面] LoadPage --> ShowForm[显示查询表单] ShowForm --> InputCondition[输入用户ID和月份] InputCondition --> Submit[提交查询] Submit --> Validate{参数校验} Validate -->|失败| ShowError[显示错误信息] Validate -->|成功| QueryDetail[查询考勤明细] QueryDetail --> HasData{有明细数据?} HasData -->|否| ShowEmpty[显示无数据提示] HasData -->|是| SortByDate[按日期排序] SortByDate --> FormatData[格式化数据] FormatData --> AddWeekDay[添加星期标识] AddWeekDay --> ColorStatus[根据状态着色] ColorStatus --> RenderCalendar[渲染考勤日历] RenderCalendar --> ShowPage[展示明细页面] ShowError --> ShowForm ShowEmpty --> ShowPage ``` ## 前端页面设计 ### 页面结构 #### 考勤统计页面 页面路径: `/attendance/statistics` 页面布局: - 页面标题: 考勤统计查询 - 查询区域: 月份选择器 + 用户ID输入框(可选) + 查询按钮 - 数据展示区域: 统计表格 - 操作区域: 重新计算按钮、导出按钮(预留) 统计表格字段: | 列名 | 说明 | |------|------| | 用户ID | 用户唯一标识 | | 统计月份 | YYYY-MM格式 | | 工作日天数 | 当月应工作天数 | | 实际出勤天数 | 实际有打卡的天数 | | 迟到次数 | 迟到总次数 | | 早退次数 | 早退总次数 | | 缺勤天数 | 缺勤总天数 | | 出勤率 | 百分比显示 | | 迟到率 | 百分比显示 | | 早退率 | 百分比显示 | | 操作 | 查看明细按钮 | #### 考勤明细页面 页面路径: `/attendance/detail` 页面布局: - 页面标题: 考勤明细查询 - 查询区域: 用户ID输入框 + 月份选择器 + 查询按钮 - 汇总信息区域: 显示当月统计摘要 - 明细展示区域: 日历视图或表格视图 明细表格字段: | 列名 | 说明 | |------|------| | 日期 | YYYY-MM-DD | | 星期 | 星期一至星期五 | | 签到时间 | HH:mm:ss,无记录显示-- | | 签退时间 | HH:mm:ss,无记录显示-- | | 状态 | 正常/迟到/早退/缺勤等 | 状态颜色标识: - 正常: 绿色 - 迟到: 橙色 - 早退: 橙色 - 迟到且早退: 红色 - 缺勤: 灰色 - 缺卡: 黄色 ### Thymeleaf模板设计 #### statistics.html - 统计页面模板 模板变量: - `statisticsList` - 统计数据列表 - `queryMonth` - 查询月份 - `queryUserId` - 查询用户ID 关键区域: - 表单区域: 使用 th:action 提交查询 - 表格区域: 使用 th:each 遍历统计数据 - 数据格式化: 使用 th:text 和 #numbers 工具类格式化百分比 - 条件渲染: 使用 th:if 判断数据是否为空 #### detail.html - 明细页面模板 模板变量: - `detailList` - 明细数据列表 - `statistics` - 汇总统计信息 - `queryMonth` - 查询月份 - `queryUserId` - 查询用户ID 关键区域: - 汇总卡片: 展示出勤率、迟到率、早退率 - 明细表格: 使用 th:each 遍历每日明细 - 状态着色: 使用 th:class 根据状态动态添加CSS类 - 时间格式化: 使用 #temporals 工具类格式化时间 ### 前后端交互设计 #### 查询统计数据交互 请求方式: GET 请求路径: `/attendance/statistics` 请求参数: - `month` - 统计月份,格式: YYYY-MM,必填 - `userId` - 用户ID,选填 响应方式: 返回Thymeleaf渲染的HTML页面 #### 查询明细数据交互 请求方式: GET 请求路径: `/attendance/detail` 请求参数: - `userId` - 用户ID,必填 - `month` - 统计月份,格式: YYYY-MM,必填 响应方式: 返回Thymeleaf渲染的HTML页面 #### 触发计算交互(可选) 请求方式: POST 请求路径: `/attendance/api/calculate` 请求参数: - `month` - 统计月份,格式: YYYY-MM,必填 响应方式: JSON ``` { "success": true, "message": "计算完成", "data": { "month": "2025-10", "userCount": 10, "calculateTime": "2025-01-15 10:30:00" } } ``` ## 技术实现要点 ### MyBatis-Plus集成 配置要点: - 在 pom.xml 中添加 MyBatis-Plus 依赖 - 在 application.properties 中配置数据源和 MyBatis-Plus 参数 - 使用 @MapperScan 注解扫描 Mapper 接口 - Mapper 接口继承 BaseMapper,自动获得基础CRUD能力 ### 数据库连接配置 在 application.properties 中配置: - 数据库驱动: MySQL驱动 - 连接URL: 包含数据库地址、端口、库名 - 用户名和密码 - 连接池配置(可选) ### 日期时间处理 使用 Java 8 日期时间API: - LocalDate: 处理日期(年月日) - LocalDateTime: 处理日期时间(年月日时分秒) - LocalTime: 处理时间(时分秒) - DateTimeFormatter: 格式化日期时间 - DayOfWeek: 判断星期几 工作日判定逻辑: ``` 判断某天是否为工作日: 1. 获取该日期的星期值 2. 如果星期值为 SATURDAY 或 SUNDAY,返回false 3. 否则返回true ``` ### 统计指标计算 出勤率计算逻辑: ``` 1. 获取当月工作日总天数 workDays 2. 统计实际出勤天数 actualDays(有签到或签退记录的工作日) 3. 计算: attendanceRate = (actualDays / workDays) × 100 4. 保留2位小数 ``` 迟到率计算逻辑: ``` 1. 获取实际出勤天数 actualDays 2. 统计迟到次数 lateCount(签到时间>09:00的天数) 3. 计算: lateRate = (lateCount / actualDays) × 100 4. 保留2位小数 5. 如果actualDays为0,返回0 ``` 早退率计算逻辑: ``` 1. 获取实际出勤天数 actualDays 2. 统计早退次数 earlyLeaveCount(签退时间<17:00的天数) 3. 计算: earlyLeaveRate = (earlyLeaveCount / actualDays) × 100 4. 保留2位小数 5. 如果actualDays为0,返回0 ``` ### 数据写入策略 使用Python脚本生成测试数据: - 编写Python脚本生成SQL INSERT语句 - 脚本输出可直接执行的SQL文件 - 避免使用PowerShell脚本,确保跨平台兼容性 - 脚本应支持参数化配置(如用户数量、月份范围等) 测试数据脚本设计要点: - 生成多个用户的打卡记录 - 覆盖正常、迟到、早退、缺勤等多种场景 - 随机生成打卡时间,模拟真实情况 - 确保数据符合业务规则 ### 事务管理 使用 Spring 声明式事务: - 在 Service 方法上使用 @Transactional 注解 - 计算考勤数据时,明细和统计的保存需在同一事务中 - 事务传播行为: REQUIRED(默认) - 事务隔离级别: READ_COMMITTED(默认) 关键事务边界: - calculateMonthlyAttendance 方法: 整个月的计算作为一个事务 - calculateUserAttendance 方法: 单个用户的计算作为一个事务 ### 异常处理 异常分类: - 参数校验异常: 月份格式错误、用户ID为空等 - 业务异常: 数据不存在、计算失败等 - 系统异常: 数据库连接失败、SQL执行错误等 异常处理策略: - Controller层捕获异常,返回友好提示信息 - Service层抛出业务异常,由上层统一处理 - 使用 @ControllerAdvice 实现全局异常处理 - 日志记录所有异常详细信息 ## 依赖管理 ### Maven依赖清单 需要在 pom.xml 中添加的依赖: | 依赖 | 说明 | 版本 | |------|------|------| | mybatis-plus-boot-starter | MyBatis-Plus核心依赖 | 3.4.3 | | mysql-connector-java | MySQL驱动 | 8.0.23 | | druid-spring-boot-starter | Druid连接池(可选) | 1.2.6 | 已有依赖(无需添加): - spring-boot-starter-web: Web支持 - spring-boot-starter-thymeleaf: 模板引擎 - lombok: 简化实体类编写 ## 配置管理 ### application.properties 配置项 数据库配置: ``` spring.datasource.url - 数据库连接URL spring.datasource.username - 数据库用户名 spring.datasource.password - 数据库密码 spring.datasource.driver-class-name - 数据库驱动类 ``` MyBatis-Plus配置: ``` mybatis-plus.mapper-locations - Mapper XML文件路径 mybatis-plus.type-aliases-package - 实体类包路径 mybatis-plus.configuration.map-underscore-to-camel-case - 下划线转驼峰 mybatis-plus.configuration.log-impl - SQL日志实现 ``` 业务配置: ``` attendance.work-start-time - 上班时间,默认09:00:00 attendance.work-end-time - 下班时间,默认17:00:00 attendance.auto-calculate-enabled - 是否启用自动计算,默认false ``` ## 扩展性设计 ### 预留扩展点 1. 节假日支持 - 预留 HolidayService 接口 - WorkDayService 可注入 HolidayService - 数据库预留节假日配置表 2. 工作时间自定义 - 通过配置文件配置上下班时间 - 支持不同用户组配置不同工作时间(预留) 3. 自动定时计算 - 预留定时任务触发点 - 可配置每月自动计算上月考勤数据 4. 数据导出功能 - 预留导出接口 - 支持Excel、CSV等格式导出 5. 用户信息关联 - 预留用户表关联 - 统计页面显示用户姓名、部门等信息 ### 性能优化考虑 1. 批量处理 - 计算时批量查询打卡记录,减少数据库交互 - 使用 MyBatis-Plus 的批量插入功能 2. 缓存策略 - 工作日计算结果可缓存(月度粒度) - 统计数据可缓存(短期缓存) 3. 异步计算 - 大数据量计算可改为异步任务 - 使用消息队列解耦计算和查询 4. 索引优化 - 关键查询字段建立索引 - 复合索引支持常用查询组合 ## 测试策略 ### 单元测试 测试范围: - WorkDayService: 工作日判定逻辑 - AttendanceCalculationService: 考勤计算逻辑 - 各类率值计算方法 测试数据: - 正常场景: 按时打卡 - 边界场景: 正好09:00签到、正好17:00签退 - 异常场景: 缺卡、缺勤、迟到、早退 - 组合场景: 迟到且早退 ### 集成测试 测试范围: - Controller到Service到Mapper的完整链路 - 数据库事务正确性 - 页面渲染正确性 测试用例: - 查询不存在的月份数据 - 查询已计算的月份数据 - 触发重新计算 - 并发查询测试 ### 测试数据准备 使用Python脚本生成测试数据: - 生成10个用户 - 生成2025年10月、11月的打卡记录 - 覆盖各种考勤场景 - 每个用户至少20条打卡记录 ## 部署说明 ### 数据库初始化 执行顺序: 1. 创建数据库(如不存在) 2. 执行 `ddl_tbl_clock_infos.sql` (已存在) 3. 执行新建表的DDL脚本 4. 执行测试数据脚本(可选) ### 应用启动 启动步骤: 1. 配置 application.properties 中的数据库连接信息 2. 使用Maven构建项目 3. 运行Spring Boot主类启动应用 4. 访问 http://localhost:8080/attendance/statistics 验证功能 ### 验证清单 - 数据库表创建成功 - 应用启动无异常 - 统计页面可正常访问 - 查询功能正常 - 计算功能正常 - 明细页面显示正确