|
|
@@ -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());
|
|
|
+
|
|
|
+ }
|
|
|
}
|