考勤统计
This commit is contained in:
@ -0,0 +1,93 @@
|
||||
package com.ruoyi.common.util;
|
||||
|
||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
|
||||
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
|
||||
public class DataUtil {
|
||||
|
||||
public static List<BgtAttendanceCountVO> fillMissingDates(List<BgtAttendanceCountVO> countVOS, LocalDate startDate, LocalDate endDate) {
|
||||
// 使用 HashSet 存储已有的日期,方便快速查找
|
||||
Set<LocalDate> existingDates = new HashSet<>();
|
||||
for (BgtAttendanceCountVO vo : countVOS) {
|
||||
existingDates.add(vo.getDate());
|
||||
}
|
||||
|
||||
// 创建一个新的列表,用于存储补充后的结果
|
||||
List<BgtAttendanceCountVO> filledList = new ArrayList<>(countVOS);
|
||||
|
||||
// 遍历日期范围,补充缺失的日期
|
||||
LocalDate currentDate = startDate;
|
||||
while (!currentDate.isAfter(endDate)) {
|
||||
if (!existingDates.contains(currentDate)) {
|
||||
// 如果当前日期不在已有日期集合中,创建一个新的 BgtAttendanceCountVO 对象并添加到结果列表中
|
||||
filledList.add(new BgtAttendanceCountVO(0,0,currentDate,0));
|
||||
}
|
||||
// 日期递增一天
|
||||
currentDate = currentDate.plusDays(1);
|
||||
}
|
||||
|
||||
// 对结果列表按日期排序
|
||||
filledList.sort(Comparator.comparing(BgtAttendanceCountVO::getDate));
|
||||
|
||||
return filledList;
|
||||
}
|
||||
|
||||
|
||||
public static List<BgtAttendanceCountVO> statisticsByMonth(List<BgtAttendanceCountVO> countVOS, LocalDate startDate, LocalDate endDate) {
|
||||
// 用于存储每个月的统计结果
|
||||
Map<YearMonth, BgtAttendanceCountVO> monthMap = new TreeMap<>();
|
||||
|
||||
// 遍历所有的 BgtAttendanceCountVO 对象
|
||||
for (BgtAttendanceCountVO countVO : countVOS) {
|
||||
LocalDate date = countVO.getDate();
|
||||
YearMonth yearMonth = YearMonth.from(date);
|
||||
|
||||
// 如果该月份已经在 map 中,则累加该月份的到岗人数和总人数
|
||||
if (monthMap.containsKey(yearMonth)) {
|
||||
BgtAttendanceCountVO existingVO = monthMap.get(yearMonth);
|
||||
existingVO.setReportToDutyNum(existingVO.getReportToDutyNum() + countVO.getReportToDutyNum());
|
||||
existingVO.setTotalNum(existingVO.getTotalNum()>countVO.getTotalNum()?existingVO.getTotalNum():countVO.getTotalNum());
|
||||
existingVO.setAbsenceDutyNum(existingVO.getAbsenceDutyNum() + countVO.getTotalNum()-countVO.getReportToDutyNum());
|
||||
} else {
|
||||
// 如果该月份不在 map 中,则创建一个新的 BgtAttendanceCountVO 对象
|
||||
BgtAttendanceCountVO newVO = new BgtAttendanceCountVO(countVO.getReportToDutyNum(), countVO.getTotalNum(), date.withDayOfMonth(1),0);
|
||||
monthMap.put(yearMonth, newVO);
|
||||
}
|
||||
}
|
||||
|
||||
// 找出日期范围的起始月份和结束月份
|
||||
if (monthMap.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
YearMonth startMonth = YearMonth.from(startDate);
|
||||
YearMonth endMonth = YearMonth.from(endDate);
|
||||
|
||||
// 补足空白月份
|
||||
List<BgtAttendanceCountVO> result = new ArrayList<>();
|
||||
for (YearMonth currentMonth = startMonth; !currentMonth.isAfter(endMonth); currentMonth = currentMonth.plusMonths(1)) {
|
||||
if (monthMap.containsKey(currentMonth)) {
|
||||
result.add(monthMap.get(currentMonth));
|
||||
} else {
|
||||
// 如果该月份没有统计数据,则创建一个新的 BgtAttendanceCountVO 对象,将到岗人数和总人数都设置为 0
|
||||
BgtAttendanceCountVO emptyVO = new BgtAttendanceCountVO(0, 0, currentMonth.atDay(1),0);
|
||||
result.add(emptyVO);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static Integer getMinutes(LocalDateTime clockInTime,LocalTime beginWorkTime){
|
||||
LocalDateTime workDateTime = LocalDateTime.of(clockInTime.toLocalDate(), beginWorkTime);
|
||||
|
||||
// 计算两个 LocalDateTime 对象之间的时间差
|
||||
Duration duration = Duration.between(workDateTime, clockInTime);
|
||||
|
||||
// 将时间差转换为分钟数
|
||||
long minutes = duration.toMinutes();
|
||||
return (int) minutes;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user