Quellcode durchsuchen

修改学生班级考勤统计

snihwxf vor 3 Wochen
Ursprung
Commit
c0d099de7a

+ 165 - 11
src/main/java/com/xjrsoft/module/attendance/controller/StudentStatisticsController.java

@@ -4,6 +4,8 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -20,12 +22,15 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.dto.StudentDetailsDto;
 import com.xjrsoft.module.attendance.dto.StudentStatisticsDto;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
+import com.xjrsoft.module.attendance.entity.ClassAttendanceStatistics;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceStatistics;
+import com.xjrsoft.module.attendance.service.IClassStatisticsService;
 import com.xjrsoft.module.attendance.service.IStudentStatisticsService;
-import com.xjrsoft.module.attendance.vo.ClassStatisticsVo;
-import com.xjrsoft.module.attendance.vo.StudentStatisticsPageVo;
-import com.xjrsoft.module.attendance.vo.TimeRangeVo;
+import com.xjrsoft.module.attendance.vo.*;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.courseTable.vo.SecondCourseEnrollExcelVo;
 import com.xjrsoft.module.holiday.entity.HolidayDate;
 import com.xjrsoft.module.holiday.service.IHolidayDateService;
 import com.xjrsoft.module.organization.entity.User;
@@ -41,11 +46,11 @@ import com.xjrsoft.module.system.entity.DictionaryDetail;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.DayOfWeek;
@@ -77,7 +82,8 @@ public class StudentStatisticsController {
     private final IHolidayDateService holidayDateService;
     private final IBaseClassService baseClassService;
 
-    private  final IStudentStatisticsService studentStatisticsService;
+    private final IStudentStatisticsService studentStatisticsService;
+    private final IClassStatisticsService classStatisticsService;
 
     @GetMapping(value = "/class-statistics")
     @ApiOperation(value = "班级考勤统计")
@@ -282,6 +288,74 @@ public class StudentStatisticsController {
     }
 
 
+    @GetMapping(value = "/student-attendance")
+    @ApiOperation(value = "学生考勤记录")
+    @XjrLog(value = "学生考勤记录")
+    public RT<PageOutput<StudentStatisticsPageVo>> studentAttendance(@Valid StudentDetailsDto dto) {
+        MPJLambdaWrapper<StudentAttendanceStatistics> queryUser = new MPJLambdaWrapper<>();
+        queryUser.disableSubLogicDel()
+                .eq(StudentAttendanceStatistics::getTimeInterval, dto.getTimePeriod())
+                .eq(StudentAttendanceStatistics::getAttendanceDate, dto.getDate())
+                .eq(StrUtil.isNotEmpty(dto.getAttendanceStatus()), StudentAttendanceStatistics::getAttendanceStatus, dto.getAttendanceStatus())
+
+                .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                .like(StrUtil.isNotEmpty(dto.getCredentialNumber()), User::getCredentialNumber, dto.getCredentialNumber())
+
+                .eq(StrUtil.isNotEmpty(dto.getStduyStatus()), BaseStudentSchoolRoll::getStduyStatus, dto.getStduyStatus())
+                .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
+
+                .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
+
+                .selectAs(BaseClass::getName, StudentStatisticsPageVo::getClassName)
+                .selectAs(User::getName, StudentStatisticsPageVo::getStudentName)
+                .selectAs(StudentAttendanceStatistics::getUserId, StudentStatisticsPageVo::getUserId)
+                .selectAs(StudentAttendanceStatistics::getAttendanceStatus, StudentStatisticsPageVo::getStatus)
+                .selectAs(StudentAttendanceStatistics::getRecordTime, StudentStatisticsPageVo::getRecordTime)
+
+                .select("CONCAT(LEFT(t1.mobile, 3), '****', RIGHT(t1.mobile, 4))", StudentStatisticsPageVo::getMobile)
+                .select("CONCAT(LEFT(t1.credential_number, 6), '****', RIGHT(t1.credential_number, 4))", StudentStatisticsPageVo::getCredentialNumber)
+                .select("CONCAT(LEFT(t4.telephone, 3), '****', RIGHT(t4.telephone, 4))", StudentStatisticsPageVo::getGuardianPhone)
+                .selectAs(DictionaryDetail::getName, StudentStatisticsPageVo::getStduyStatusCn)
+                .select("ut.name", StudentStatisticsPageVo::getTeacherName)
+
+                .innerJoin(User.class, User::getId, StudentAttendanceStatistics::getUserId)
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                .leftJoin(BaseStudentFamily.class, BaseStudentFamily::getUserId, User::getId)
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseStudentSchoolRoll::getStduyStatus)
+                .leftJoin("xjr_user ut on ut.id = t3.teacher_id");
+
+        IPage<StudentStatisticsPageVo> voIPage = studentStatisticsService.selectJoinListPage(ConventPage.getPage(dto), StudentStatisticsPageVo.class, queryUser);
+        PageOutput<StudentStatisticsPageVo> pageOutput = ConventPage.getPageOutput(voIPage, StudentStatisticsPageVo.class);
+        return RT.ok(pageOutput);
+
+    }
+
+
+    @GetMapping(value = "/class-attendance")
+    @ApiOperation(value = "班级考勤记录")
+    @XjrLog(value = "班级考勤记录")
+    public RT<PageOutput<ClassStatisticsVo>> classAttendance(@Valid AttendanceStatisticDto dto) {
+        MPJLambdaWrapper<ClassAttendanceStatistics> queryUser = new MPJLambdaWrapper<>();
+        queryUser.disableSubLogicDel()
+                .eq(ClassAttendanceStatistics::getTimeInterval, dto.getTimePeriod())
+                .eq(ClassAttendanceStatistics::getAttendanceDate, dto.getDate())
+                .eq(ObjectUtil.isNotNull(dto.getClassId()), ClassAttendanceStatistics::getClassId, dto.getClassId())
+
+                .select(ClassStatisticsVo.class, x -> VoToColumnUtil.fieldsToColumns(ClassStatisticsVo.class).contains(x.getProperty()))
+
+                .selectAs(BaseClass::getName, ClassStatisticsVo::getName)
+                .selectAs(User::getName, ClassStatisticsVo::getTeacherName)
+
+                .innerJoin(BaseClass.class, BaseClass::getId, ClassAttendanceStatistics::getClassId)
+                .innerJoin(User.class, User::getId, BaseClass::getTeacherId);
+
+        IPage<ClassStatisticsVo> voIPage = classStatisticsService.selectJoinListPage(ConventPage.getPage(dto), ClassStatisticsVo.class, queryUser);
+        PageOutput<ClassStatisticsVo> pageOutput = ConventPage.getPageOutput(voIPage, ClassStatisticsVo.class);
+        return RT.ok(pageOutput);
+
+    }
+
     @GetMapping(value = "/class-history")
     @ApiOperation(value = "历史考勤")
     @SaCheckPermission("studentStatistics:classhistory")
@@ -441,12 +515,92 @@ public class StudentStatisticsController {
     }
 
 
-    @GetMapping(value = "/student-statistics")
-    @ApiOperation(value = "学生考勤统计")
-    @XjrLog(value = "学生考勤统计")
-    public RT<Boolean> studentStatistics(@Valid StudentStatisticsDto dto) {
+    @GetMapping(value = "/reload-student-attendance")
+    @ApiOperation(value = "刷新学生考勤统计")
+    @XjrLog(value = "刷新学生考勤统计")
+    public RT<Boolean> reloadStudentStatistics(@Valid StudentStatisticsDto dto) {
         studentStatisticsService.studentStatistics(dto.getDate(), dto.getTimePeriod());
+        return RT.ok(true);
+    }
+
+
+    @GetMapping(value = "/reload-class-attendance")
+    @ApiOperation(value = "刷新班级考勤统计")
+    @XjrLog(value = "刷新班级考勤统计")
+    public RT<Boolean> reloadClassStatistics(@Valid StudentStatisticsDto dto) {
         studentStatisticsService.classStatistics(dto.getDate(), dto.getTimePeriod());
         return RT.ok(true);
     }
+
+    @PostMapping("/class-attendance-export-query")
+    @ApiOperation(value = "导出班级考勤记录")
+    @XjrLog(value = "导出班级考勤记录")
+    public ResponseEntity<byte[]> exportClassAttendance(@Valid @RequestBody AttendanceStatisticDto dto) {
+        MPJLambdaWrapper<ClassAttendanceStatistics> queryUser = new MPJLambdaWrapper<>();
+        queryUser.disableSubLogicDel()
+                .eq(ClassAttendanceStatistics::getTimeInterval, dto.getTimePeriod())
+                .eq(ClassAttendanceStatistics::getAttendanceDate, dto.getDate())
+                .eq(ObjectUtil.isNotNull(dto.getClassId()), ClassAttendanceStatistics::getClassId, dto.getClassId())
+
+                .select(ClassAttendanceStatistics.class, x -> VoToColumnUtil.fieldsToColumns(ClassStatisticsExcelVo.class).contains(x.getProperty()))
+
+                .selectAs(BaseClass::getName, ClassStatisticsExcelVo::getName)
+                .selectAs(User::getName, ClassStatisticsExcelVo::getTeacherName)
+
+                .innerJoin(BaseClass.class, BaseClass::getId, ClassAttendanceStatistics::getClassId)
+                .innerJoin(User.class, User::getId, BaseClass::getTeacherId);
+
+        List<ClassStatisticsExcelVo> list = classStatisticsService.selectJoinList(ClassStatisticsExcelVo.class, queryUser);
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, ClassStatisticsExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "class-attendance" + ExcelTypeEnum.XLSX.getValue());
+
+    }
+
+    @PostMapping("/student-attendance-export-query")
+    @ApiOperation(value = "导出学生考勤记录")
+    @XjrLog(value = "导出学生考勤记录")
+    public ResponseEntity<byte[]> exportStudentAttendance(@Valid @RequestBody StudentDetailsDto dto) {
+        MPJLambdaWrapper<StudentAttendanceStatistics> queryUser = new MPJLambdaWrapper<>();
+        queryUser.disableSubLogicDel()
+                .eq(StudentAttendanceStatistics::getTimeInterval, dto.getTimePeriod())
+                .eq(StudentAttendanceStatistics::getAttendanceDate, dto.getDate())
+                .eq(StrUtil.isNotEmpty(dto.getAttendanceStatus()), StudentAttendanceStatistics::getAttendanceStatus, dto.getAttendanceStatus())
+
+                .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                .like(StrUtil.isNotEmpty(dto.getCredentialNumber()), User::getCredentialNumber, dto.getCredentialNumber())
+
+                .eq(StrUtil.isNotEmpty(dto.getStduyStatus()), BaseStudentSchoolRoll::getStduyStatus, dto.getStduyStatus())
+                .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
+
+                .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
+
+                .selectAs(BaseClass::getName, StudentStatisticsExcelVo::getClassName)
+                .selectAs(User::getName, StudentStatisticsExcelVo::getStudentName)
+                .selectAs(StudentAttendanceStatistics::getAttendanceStatus, StudentStatisticsExcelVo::getStatus)
+                .selectAs(StudentAttendanceStatistics::getRecordTime, StudentStatisticsExcelVo::getRecordTime)
+
+                .select("CONCAT(LEFT(t1.mobile, 3), '****', RIGHT(t1.mobile, 4))", StudentStatisticsExcelVo::getMobile)
+                .select("CONCAT(LEFT(t1.credential_number, 6), '****', RIGHT(t1.credential_number, 4))", StudentStatisticsExcelVo::getCredentialNumber)
+                .select("CONCAT(LEFT(t4.telephone, 3), '****', RIGHT(t4.telephone, 4))", StudentStatisticsExcelVo::getGuardianPhone)
+                .selectAs(DictionaryDetail::getName, StudentStatisticsExcelVo::getStduyStatusCn)
+                .select("ut.name", StudentStatisticsExcelVo::getTeacherName)
+
+                .innerJoin(User.class, User::getId, StudentAttendanceStatistics::getUserId)
+                .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                .leftJoin(BaseStudentFamily.class, BaseStudentFamily::getUserId, User::getId)
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseStudentSchoolRoll::getStduyStatus)
+                .leftJoin("xjr_user ut on ut.id = t3.teacher_id");
+
+        List<StudentStatisticsExcelVo> list = studentStatisticsService.selectJoinList(StudentStatisticsExcelVo.class, queryUser);
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, StudentStatisticsExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "student-attendance" + ExcelTypeEnum.XLSX.getValue());
+
+    }
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceStatisticDto.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.time.LocalDate;
+
 @Data
 @EqualsAndHashCode(callSuper = false)
 public class AttendanceStatisticDto extends PageInput {

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/dto/StudentDetailsDto.java

@@ -26,4 +26,7 @@ public class StudentDetailsDto extends PageInput {
 
     @ApiModelProperty("班级id")
     private Long classId;
+
+    @ApiModelProperty("考勤状态")
+    private String attendanceStatus;
 }

+ 65 - 0
src/main/java/com/xjrsoft/module/attendance/vo/ClassStatisticsExcelVo.java

@@ -0,0 +1,65 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ClassStatisticsExcelVo {
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    private String name;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班主任姓名")
+    @ApiModelProperty("班主任姓名")
+    private String teacherName;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学生总人数")
+    @ApiModelProperty("学生总人数")
+    private Integer studentCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("住校人数")
+    @ApiModelProperty("住校人数")
+    private Integer stayCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("走读人数")
+    @ApiModelProperty("走读人数")
+    private Integer notStayCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("请假人数")
+    @ApiModelProperty("请假人数")
+    private Integer leaveCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("迟到人数")
+    @ApiModelProperty("迟到人数")
+    private Integer lateCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("旷课人数")
+    @ApiModelProperty("旷课人数")
+    private Integer playTruantCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实到人数")
+    @ApiModelProperty("实到人数")
+    private Integer actualCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("缺勤人数")
+    @ApiModelProperty("缺勤人数")
+    private Integer absenteeismCount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出勤率")
+    @ApiModelProperty("出勤率")
+    private String attendanceRate;
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/attendance/vo/StudentStatisticsExcelVo.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class StudentStatisticsExcelVo {
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班主任名称")
+    @ApiModelProperty("班主任名称")
+    private String teacherName;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学生名称")
+    @ApiModelProperty("学生名称")
+    private String studentName;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("身份证号")
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("就读方式")
+    @ApiModelProperty("就读方式")
+    private String stduyStatusCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("考勤状态")
+    @ApiModelProperty("考勤状态")
+    private String status;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("考勤时间")
+    @ApiModelProperty("考勤时间")
+    private String recordTime;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("手机号")
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("监护人电话")
+    @ApiModelProperty("监护人电话")
+    private String guardianPhone;
+}

+ 49 - 0
src/main/java/com/xjrsoft/module/job/AttendanceStatisticsTask.java

@@ -0,0 +1,49 @@
+package com.xjrsoft.module.job;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.xjrsoft.module.attendance.service.IStudentStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.Date;
+
+@Component
+@Slf4j
+public class AttendanceStatisticsTask {
+
+    @Autowired
+    private IStudentStatisticsService studentStatisticsService;
+
+    @Async
+    @Scheduled(cron = "0 0 13 * * ?")
+    public void execute() {
+        String active = SpringUtil.getActiveProfile();
+        if (!"prod".equals(active)) {
+            log.info("非正式环境,无法执行数据推送");
+            return;
+        }
+
+        // 创建日期对象
+        Date now = new Date();
+
+        // 创建格式器并定义格式
+        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
+        String date = formatter1.format(now);
+
+        try {
+            studentStatisticsService.studentStatistics(date, 1);
+        } catch (Exception e) {
+            log.info("统计学生考勤出错" + e.getMessage());
+        }
+        try {
+            studentStatisticsService.classStatistics(date, 1);
+        } catch (Exception e) {
+            log.info("统计班级考勤出错" + e.getMessage());
+        }
+    }
+}