宠物项目...


    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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值