public List<StaffAttendanceResponse> getStaffAttendance(Date startDate, Date endDate) {
// 获取各种类型的天数
List<StaffAttendanceResponse> vacationDaysList = statisticsStaffDao.getVacationDays(startDate, endDate);
List<StaffAttendanceResponse> lateDaysList = statisticsStaffDao.getLateDays(startDate, endDate);
List<StaffAttendanceResponse> absenceDaysList = statisticsStaffDao.getAbsenceDays(startDate, endDate);
List<StaffAttendanceResponse> attendanceDaysList = statisticsStaffDao.getAttendanceDays(startDate, endDate);
List<StaffAttendanceResponse> attendanceDaysList2 = statisticsStaffDao.getAttendanceDays2(startDate, endDate);
// 使用Map存储合并后的结果,键是员工ID,
Map<Object, StaffAttendanceResponse> mergedMap = new HashMap<>();
// 合并休假天数
for (StaffAttendanceResponse record : vacationDaysList) {
mergedMap.put(record.getStaffId(), new StaffAttendanceResponse()
.setStaffId(record.getStaffId())
.setStaffName(record.getStaffName())
.setVacationDays(record.getVacationDays()));
}
// 合并迟到天数
for (StaffAttendanceResponse record : lateDaysList) {
mergedMap.computeIfPresent(record.getStaffId(),
(key, value) -> value.setLateDays(record.getLateDays()));
mergedMap.putIfAbsent(record.getStaffId(), new StaffAttendanceResponse()
.setStaffId(record.getStaffId())
.setStaffName(record.getStaffName())
.setLateDays(record.getLateDays()));
}
// 合并缺勤天数
for (StaffAttendanceResponse record : absenceDaysList) {
mergedMap.computeIfPresent(record.getStaffId(),
(key, value) -> value.setAbsenceDays(record.getAbsenceDays()));
mergedMap.putIfAbsent(record.getStaffId(), new StaffAttendanceResponse()
.setStaffId(record.getStaffId())
.setStaffName(record.getStaffName())
.setAbsenceDays(record.getAbsenceDays()));
}
// 合并出勤天数
for (StaffAttendanceResponse record : attendanceDaysList) {
mergedMap.computeIfPresent(record.getStaffId(),
(key, value) -> value.setAttendanceDays(record.getAttendanceDays()));
mergedMap.putIfAbsent(record.getStaffId(), new StaffAttendanceResponse()
.setStaffId(record.getStaffId())
.setStaffName(record.getStaffName())
.setAttendanceDays(record.getAttendanceDays()));
}
// 将Map转换为List
return mergedMap.values().stream().collect(Collectors.toList());
}
得到时间
public interface StaffAttendanceFetcher<T> {
T fetch(Date startDate, Date endDate);
}
public <T> T getVacationDaysByType(String type, StaffAttendanceFetcher<T> fetcher) {
Calendar cal = Calendar.getInstance();
Date start = null, end = null;
switch (type) {
case "TODAY":
LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
LocalDateTime endOfDay = LocalDate.now().atTime(23, 59, 59);
start = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
end = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
break;
case "WEEK":
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
start = cal.getTime();
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
end = cal.getTime();
break;
case "MONTH":
cal.set(Calendar.DAY_OF_MONTH, 1);
start = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
end = cal.getTime();
break;
case "YEAR":
cal.set(Calendar.DAY_OF_YEAR, 1);
start = cal.getTime();
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
end = cal.getTime();
break;
default:
throw new IllegalArgumentException("请输入正确的参数: " + type + "TODAY,WEEK, MONTH, YEAR.");
}
return fetcher.fetch(start, end);
}
List<StaffAttendanceResponse> attendanceResponse = getVacationDaysByType(type,this::getStaffAttendance);
StaffCircleVo StaffCircleResponse = getVacationDaysByType(typeCircle,this::getTotalVacationDays);
public StaffCircleVo getTotalVacationDays(Date startDate, Date endDate) {
StaffCircleVo result = new StaffCircleVo();
// 计算总休假天数
List<StaffAttendanceResponse> vacationDaysList = statisticsStaffDao.getVacationDays(startDate, endDate);
int totalVacationDays = sumDays(vacationDaysList, StaffAttendanceResponse::getVacationDays);
result.setVacationDays(totalVacationDays);
// 计算总迟到天数
List<StaffAttendanceResponse> lateDaysList = statisticsStaffDao.getLateDays(startDate, endDate);
int totalLateDays = sumDays(lateDaysList, StaffAttendanceResponse::getLateDays);
result.setLateDays(totalLateDays);
// 计算总缺勤天数
List<StaffAttendanceResponse> absenceDaysList = statisticsStaffDao.getAbsenceDays(startDate, endDate);
int totalAbsenceDays = sumDays(absenceDaysList, StaffAttendanceResponse::getAbsenceDays);
result.setAbsenceDays(totalAbsenceDays);
// 计算总出勤天数
List<StaffAttendanceResponse> attendanceDaysList = statisticsStaffDao.getAttendanceDays(startDate, endDate);
int totalAttendanceDays = sumDays(attendanceDaysList, StaffAttendanceResponse::getAttendanceDays);
result.setAttendanceDays(totalAttendanceDays);
return result;
}
private int sumDays(List<StaffAttendanceResponse> list, ToIntFunction<StaffAttendanceResponse> func) {
int totalDays = 0;
for (StaffAttendanceResponse record : list) {
totalDays += func.applyAsInt(record);
}
return totalDays;
}
StaffAttendanceResponse mergedResponse = new StaffAttendanceResponse();
for (StaffAttendanceResponse response : attendanceDaysList2) {
switch (response.getKeyCode()) {
case "vacation":
// 合并 vacationDays
mergedResponse.setVacationDays(mergedResponse.getVacationDays() + response.getVacationDays());
break;
case "late":
// 合并 lateDays
mergedResponse.setLateDays(mergedResponse.getLateDays() + response.getLateDays());
break;
case "absence":
// 合并 absenceDays
mergedResponse.setAbsenceDays(mergedResponse.getAbsenceDays() + response.getAbsenceDays());
break;
case "attendance":
// 合并 attendanceDays
mergedResponse.setAttendanceDays(mergedResponse.getAttendanceDays() + response.getAttendanceDays());
break;
default:
// 在这里处理其他情况
break;
}
public StaffCircleVo getTotalVacationDays(Date startDate, Date endDate) {
StaffCircleVo staffCircleVo = new StaffCircleVo();
List<StaffCirclePercentageVo> circleDataList = new ArrayList<>();
// 获取所有的出勤、缺勤、迟到和休假天数
List<StaffAttendanceResponse> allAttendanceData = statisticsStaffDao.getAttendanceDays2(startDate, endDate);
// 初始化各种类型的总天数
int totalVacationDays = 0, totalLateDays = 0, totalAbsenceDays = 0, totalAttendanceDays = 0;
// 在这里处理 allAttendanceData 列表,按照 'keyCode' 字段将数据分类和统计,
for (StaffAttendanceResponse data : allAttendanceData) {
switch (data.getKeyCode()) {
case "vacation":
totalVacationDays += data.getVacationDays();
break;
case "late":
totalLateDays += data.getLateDays();
break;
case "absence":
totalAbsenceDays += data.getAbsenceDays();
break;
case "attendance":
totalAttendanceDays += data.getAttendanceDays();
break;
}
}
// 创建并添加 StaffCirclePercentageVo 对象到列表
circleDataList.add(createStaffCirclePercentageVo("休假", totalVacationDays));
circleDataList.add(createStaffCirclePercentageVo("迟到", totalLateDays));
circleDataList.add(createStaffCirclePercentageVo("缺勤", totalAbsenceDays));
circleDataList.add(createStaffCirclePercentageVo("正常出勤", totalAttendanceDays));
// 设置各个字段的百分比
double totalDays = (double) (totalVacationDays + totalLateDays + totalAbsenceDays + totalAttendanceDays);
if (totalDays > 0) {
for (StaffCirclePercentageVo vo : circleDataList) {
vo.setPercentage(getStaffPercentage((double) vo.getCount(), totalDays));
}
}
staffCircleVo.setCircleData(circleDataList);
staffCircleVo.setTotal((int) totalDays);
return staffCircleVo;
}
// 创建 StaffCirclePercentageVo 对象的辅助方法
private StaffCirclePercentageVo createStaffCirclePercentageVo(String name, int count) {
StaffCirclePercentageVo vo = new StaffCirclePercentageVo();
vo.setName(name);
vo.setCount(count);
return vo;
}