diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipDailyController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipDailyController.java index 2e39137e..6399c816 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipDailyController.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipDailyController.java @@ -99,4 +99,22 @@ public class ZsjyInternshipDailyController extends BaseController { return dailyService.getStatistics(queryBo); } + /** + * 获取学生个人月度考勤统计(移动端专用) + */ + @Operation(summary = "获取学生月度统计", description = "获取指定学生的月度考勤统计数据") + @SaCheckPermission("zsjy:internshipdaily:statistics") + @GetMapping("/monthly-statistics") + public R> getStudentMonthlyStatistics( + @Parameter(description = "学生ID", required = true) @RequestParam Long studentId, + @Parameter(description = "年份", required = true) @RequestParam Integer year, + @Parameter(description = "月份", required = true) @RequestParam Integer month) { + + log.info("=== Controller层调试 ==="); + log.info("接口被调用: /zsjy/internship/daily/monthly-statistics"); + log.info("学生ID: {}, 年月: {}-{}", studentId, year, month); + + return dailyService.getStudentMonthlyStatistics(studentId, year, month); + } + } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipDailyMapper.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipDailyMapper.java index d0de12c7..58137544 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipDailyMapper.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipDailyMapper.java @@ -61,6 +61,18 @@ public interface ZsjyInternshipDailyMapper extends BaseMapper selectStudentMonthlyStatistics(@Param("studentId") Long studentId, + @Param("year") Integer year, + @Param("month") Integer month); + /** * 统计班主任管理的班级数量 * diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipDailyService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipDailyService.java index a5d0dbed..fd52d24b 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipDailyService.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipDailyService.java @@ -61,4 +61,14 @@ public interface IZsjyInternshipDailyService { */ R> getStatistics(ZsjyInternshipDailyQueryBo queryBo); + /** + * 获取学生个人月度考勤统计 + * + * @param studentId 学生ID + * @param year 年份 + * @param month 月份 + * @return 学生月度统计数据 + */ + R> getStudentMonthlyStatistics(Long studentId, Integer year, Integer month); + } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipDailyServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipDailyServiceImpl.java index 0f9da495..817b237c 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipDailyServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipDailyServiceImpl.java @@ -216,6 +216,54 @@ public class ZsjyInternshipDailyServiceImpl implements IZsjyInternshipDailyServi } } + /** + * 获取学生个人月度考勤统计 + */ + @Override + public R> getStudentMonthlyStatistics(Long studentId, Integer year, Integer month) { + try { + // 1. 参数校验 + if (ObjectUtil.isNull(studentId)) { + return R.fail("学生ID不能为空"); + } + if (ObjectUtil.isNull(year) || ObjectUtil.isNull(month)) { + return R.fail("年月参数不能为空"); + } + if (year < 2020 || year > 2030) { + return R.fail("年份参数不合法"); + } + if (month < 1 || month > 12) { + return R.fail("月份参数不合法"); + } + + // 2. 查询学生月度统计数据 + Map statistics = baseMapper.selectStudentMonthlyStatistics(studentId, year, month); + + // 3. 补充默认值 + if (ObjectUtil.isNull(statistics)) { + statistics = new HashMap<>(); + statistics.put("totalDays", 0); + statistics.put("checkedDays", 0); + statistics.put("missedDays", 0); + statistics.put("exceptionDays", 0); + } + + // 4. 确保数据类型正确 + statistics.put("totalDays", ObjectUtil.defaultIfNull(statistics.get("totalDays"), 0)); + statistics.put("checkedDays", ObjectUtil.defaultIfNull(statistics.get("checkedDays"), 0)); + statistics.put("missedDays", ObjectUtil.defaultIfNull(statistics.get("missedDays"), 0)); + statistics.put("exceptionDays", ObjectUtil.defaultIfNull(statistics.get("exceptionDays"), 0)); + + log.info("学生{}的{}-{}月度统计: {}", studentId, year, month, statistics); + return R.ok(statistics); + + } catch (Exception e) { + log.error("获取学生月度统计数据失败: studentId={}, year={}, month={}, error={}", + studentId, year, month, e.getMessage(), e); + return R.fail("获取学生月度统计数据失败: " + e.getMessage()); + } + } + /** * 设置数据权限(班主任只能查看自己班级的学生数据) */ diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipDailyMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipDailyMapper.xml index c741ffea..6e1e5012 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipDailyMapper.xml +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipDailyMapper.xml @@ -184,6 +184,44 @@ ) as attendanceRate + + +