<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="weaver.general.Util"%>
<%@ page import="java.math.BigDecimal" %>
<%@ page import="weaver.conn.RecordSet" %>
<%@ page import="com.engine.kq.util.KQDurationCalculatorUtil" %>
<%@ page import="weaver.hrm.User" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.text.ParseException" %>
<%@ page import="org.apache.commons.lang3.StringUtils" %>
<%@ page import="java.util.*" %>
<%@ page import="java.time.LocalDate" %>
<%@ page import="java.time.format.DateTimeFormatter" %>
<%@ page import="com.engine.kq.biz.KQWorkTime" %>
<%@ page import="com.engine.kq.entity.WorkTimeEntity" %>
<%@ page import="com.engine.kq.biz.KQGroupMemberComInfo" %>
<%@ page import="com.engine.kq.entity.KQGroupEntity" %>
<jsp:useBean id="rs" class="weaver.conn.RecordSet" scope="page" />
<jsp:useBean id="rs1" class="weaver.conn.RecordSet" scope="page" />
<jsp:useBean id="rst" class="weaver.conn.RecordSet" scope="page" />
<jsp:useBean id="bb" class="weaver.general.BaseBean" />
<%
    int sum = 0;
    String userid = Util.null2String(request.getParameter("userid"));
    String fromdate = Util.null2String(request.getParameter("fromdate"));
    String todate = Util.null2String(request.getParameter("todate"));

    User user = new User(Integer.parseInt(userid));

    String username = user.getLastname();

    rs.executeQuery("select groupid,sum(workdays)as workdays from kq_format_total " +
            " where resourceid = ? and kqdate >= ? and kqdate <= ? group by groupid",userid,fromdate,todate);
    rs.next();
    String workdays = Util.null2o(rs.getString("workdays"));

    //请假时长
    String leaveHours = getLeaveHours(fromdate,todate,userid);

    // 应出勤（排班）小时数
    String workhours = getWorkHours(fromdate,todate,userid);

    //月标准工时
    String standardWorkingHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getStandardWorkingHours(fromdate, todate, userid)));

    //应计薪小时数
    String accruedPayHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getAccruedPayHours(fromdate, todate, userid)));

    //国假排班小时（3倍）
    String nationalHoliday3Hours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getNationalHoliday3Hours(fromdate, todate, userid)));

    //国假排班小时（2倍）
    String nationalHoliday2Hours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getNationalHoliday2Hours(fromdate, todate, userid)));

    //国假在职小时数
    String nationalWorkingHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getNationalWorkingHours(fromdate, todate, userid)));

    //补签卡次数
    String replaceCardNum = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getReplaceCardNum(fromdate, todate, userid)));

    //迟到/早退(10分钟以内)/次
    String beLateLeaveEearly10 = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getBeLateLeaveEearly10(fromdate, todate, userid)));

    //迟到/早退(10(含)-30分钟以内)/次
    String beLateLeaveEearly10To30 = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getBeLateLeaveEearly10To30(fromdate, todate, userid)));

    //迟到/早退(30(含)-60分钟以内)/次
    String beLateLeaveEearly30To60 = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getBeLateLeaveEearly30To60(fromdate, todate, userid)));

    //迟到/早退(60分钟以上)/次
    String beLateLeaveEearly60More = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getBeLateLeaveEearly60More(fromdate,todate,userid)));

    //旷工合计小时
    String absenteeismTotalHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getAbsenteeismTotalHours(fromdate,todate,userid)));

    //实际出勤小时数
    String actualAttendanceHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(getActualAttendanceHours(fromdate, todate, userid)));

    // 7：病假 6：事假
    String bjtypeid = "7";
    // 7：病假 6：事假
    String sjtypeid = "6";
    // 病假、事假 小时数
    String bjleavehours = getLeaveTypeHours(bjtypeid,fromdate,todate,userid);

    // 病假、事假 小时数
    String sjleavehours = getLeaveTypeHours(sjtypeid,fromdate,todate,userid);

    // 旷工小时数
    String absencehours = "0";
    // 漏签当天的排班时长之和
    String forgotserialhours = "0";
    rs1.executeQuery("select forgotcheck,forgotBeginWorkCheck,kqdate,absenteeismmins from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? ",userid,fromdate,todate);
    while(rs1.next()){
        String kqdate = Util.null2String(rs1.getString("kqdate"));
        int forgotcheck1 = Util.getIntValue(rs1.getString("forgotcheck"));
        int forgotBeginWorkCheck = Util.getIntValue(rs1.getString("forgotBeginWorkCheck"));
        int forgotcheck = forgotcheck1 + forgotBeginWorkCheck;
        // 旷工小时数
        String count1 = Util.null2o(rs1.getString("absenteeismmins"));
        count1 = floatDivide(count1,"60");
        absencehours = floatAdd(absencehours,count1);

        // 当天有漏签
        if(forgotcheck > 0){
            // 漏签当天的排班时长之和
            String workhour = getWorkHours(kqdate,kqdate,userid);
            workhour = floatMultiply(workhour,String.valueOf(forgotcheck));
            forgotserialhours = floatAdd(forgotserialhours,workhour);
        }
    }

    // 迟到分钟数
    double latemins = getLateMins(fromdate,userid);

    // 早退分钟数
    double leaveearlymins = getLeaveEarlyMins(fromdate,userid);

    KQWorkTime kqWorkTime = new KQWorkTime();
    WorkTimeEntity workTimeEntity = kqWorkTime.getWorkTime(userid, fromdate);
    String searIdFrom = workTimeEntity.getSerialId();
    //第一个班段上班卡的 时间
    String oneStart = getBcTimes(searIdFrom,"start","0");
    oneStart += ":00";

    //第一个班段下班卡的 时间
    String oneEnd = getBcTimes(searIdFrom,"end","0");
    oneEnd += ":00";

    sum++;

%>

<%!
    /**
     * 获取 月标准工时     = 日历表上应出勤天数 * 8
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getStandardWorkingHours(String fromDate, String toDate, String userid){
        RecordSet rs = new RecordSet();
        double result = 0.00;
        int days = 0;
        // 格式化日期
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        rs.executeQuery("select distinct groupid from kq_format_total " +
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        rs.next();
//        String groupid = Util.null2String(rs.getString("groupid"));

        // 后台职能  考勤组id
        String groupid = "5";

        String[] dateStartArr = parseDate(fromDate);
        String[] dateEndtArr = parseDate(toDate);
        LocalDate startDate = LocalDate.of(Integer.parseInt(dateStartArr[0]), Integer.parseInt(dateStartArr[1]), Integer.parseInt(dateStartArr[2]));
        LocalDate endDate = LocalDate.of(Integer.parseInt(dateEndtArr[0]), Integer.parseInt(dateEndtArr[1]), Integer.parseInt(dateEndtArr[2]));
        // 遍历日期范围
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            // 输出格式化后的日期字符串
            String dateString = date.format(formatter);
            // 是 周六或 周日
            if(isSaturdayOrSunday(dateString)) {
                if(checkIsWorkday(groupid,dateString)){
                    days++;
                }
            }else{
                if(!checkIsRestOrHoliday(groupid,dateString)){
                    days++;
                }
            }
        }
        result = Double.valueOf(floatMultiply(String.valueOf(days),"8"));
        return result;
    }

    /**
     * 获取 应计薪小时数  日历表上应出勤天数 * 8 + 法定(公众假日)天数 * 8
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static String getAccruedPayHours(String fromDate, String toDate, String userid){
        String result = "0";
        RecordSet rs = new RecordSet();
        //
        String attenddays = String.valueOf(getStandardWorkingHours(fromDate,toDate,userid));
        //
        String publicHolidays = "0";
//        rs.executeQuery("select distinct groupid from kq_format_total " +
//                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
//        while(rs.next()){
//            String groupid = Util.null2String(rs.getString("groupid"));
            // 后台职能  考勤组id
            String groupid = "5";
            // 法定(公众假日)天数
            publicHolidays = getPublicHolidays(fromDate,toDate,groupid);
//        }
        publicHolidays = floatMultiply(publicHolidays,"8");

        result = floatAdd(attenddays,publicHolidays);
        return result;
    }

    /**
     * 获取 国假排班小时（3倍）
     * 【公众假日】的排班时长(小时数)，且要扣减掉当前的请假时长；
     *  如：10-01号，当前排班9小时，如果他当前请了2小时事假，统计后，则为：7小时，以此类推……
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getNationalHoliday3Hours(String fromDate, String toDate, String userid){
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        // 【公众假日】的排班时长(小时数)
        String holidayHours = "0";
        // 【公众假日】的请假时长(小时数)
        String leaveHours = "0";
        // 【公众假日】的矿工时长(小时数)
        String absenseHours = "0";
        rs.executeQuery("select distinct groupid from kq_format_total " +
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        rs.next();
        String groupid = Util.null2String(rs.getString("groupid"));
        KQGroupMemberComInfo groupMemberComInfo = new KQGroupMemberComInfo();
        // 休息班 班次id
        String rest_serial_id = rs.getPropValue("hrm_zhewen","rest_serial_id");
        rs1.executeQuery("select * from KQ_HolidaySet  where holidayDate between ? and ? and changeType=1 and groupid = ?",fromDate,toDate,groupid);
        while(rs1.next()){
            String holidayDate = Util.null2String(rs1.getString("holidayDate"));
            String holiday_serialid = getSerialId(holidayDate,holidayDate,userid);
            if(holiday_serialid != null && !"".equals(holiday_serialid)){
                // 非休息班次
                if(!rest_serial_id.equals(holiday_serialid)) {
                    KQGroupEntity kqGroupEntity = groupMemberComInfo.getUserKQGroupInfo(userid,holidayDate);
                    if(kqGroupEntity!=null) {
                        String kqtype = kqGroupEntity.getKqtype();
                        //排班制
                        if ("2".equals(kqtype)) {
                            String holiday_hours = getHoursBySerial(holiday_serialid);
                            holidayHours = floatAdd(holidayHours, holiday_hours);

                            String leave_hour = getLeaveHours(holidayDate, holidayDate, userid);
                            leaveHours = floatAdd(leaveHours, leave_hour);

                            String absense_hour = getAbsenteeishours(holidayDate, holidayDate, userid);
                            absenseHours = floatAdd(absenseHours, absense_hour);
                        }
                    }
                }
            }
        }
        String result = floatSubtract(floatSubtract(holidayHours,leaveHours),absenseHours);
        if(floatCompare(result,"0") == -1){
            result = "0";
        }
        return Double.valueOf(result);
    }

    /**
     * 获取 旷工 时长
     * @param fromdate
     * @param todate
     * @param userid
     * @return
     */
    public static String getAbsenteeishours(String fromdate, String todate,String userid){
        String result = "0";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select sum(absenteeismmins) as count from kq_format_total "+
                " where resourceid = ? and kqdate >= ? and kqdate <= ? ",userid,fromdate,todate);
        while(rs.next()){
            String count = Util.null2o(rs.getString("count"));
            result = floatDivide(count,"60");
        }
        return result;
    }

    /**
     * 获取 国假排班小时（2倍）
     * 节假日设置的说明是这俩字【春节】，并且是【调配休息日】排班时长(小时数)，且要扣减掉当前的请假时长；
     * 扣减逻辑同上；只是这个只有春节期间才会统计出来。
     * 如：除开初一初二初三，剩下的休息天数（只有春节有这个加班）
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getNationalHoliday2Hours(String fromDate, String toDate, String userid){
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        // 【公众假日,调配休息日】，假日设置的说明是这俩字【春节】，的排班时长(小时数)
        String AdjustRestHours = "0";
        // 【公众假日】的请假时长(小时数)
        String leaveHours = "0";
        // 【公众假日】的矿工时长(小时数)
        String absenseHours = "0";
        KQGroupMemberComInfo groupMemberComInfo = new KQGroupMemberComInfo();
        rs.executeQuery("select distinct groupid from kq_format_total " +
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        rs.next();
        String groupid = Util.null2String(rs.getString("groupid"));
        // 休息班 班次id
        String rest_serial_id = rs.getPropValue("hrm_zhewen","rest_serial_id");
        rs1.executeQuery("select * from KQ_HolidaySet  where holidayDate between ? and ? and changeType=3 and holidayDesc like '%春节%' and groupid = ?",fromDate,toDate,groupid);
        while(rs1.next()){
            String adjustrestDate = Util.null2String(rs1.getString("holidayDate"));
            String adjustrest_serialid = getSerialId(adjustrestDate,adjustrestDate,userid);
            if(adjustrest_serialid != null && !"".equals(adjustrest_serialid)){
                // 非休息班次
                if(!rest_serial_id.equals(adjustrest_serialid)) {
                    KQGroupEntity kqGroupEntity = groupMemberComInfo.getUserKQGroupInfo(userid,adjustrestDate);
                    if(kqGroupEntity!=null) {
                        String kqtype = kqGroupEntity.getKqtype();
                        //排班制
                        if ("2".equals(kqtype)) {
                            String adjustrest_hours = getHoursBySerial(adjustrest_serialid);
                            AdjustRestHours = floatAdd(AdjustRestHours, adjustrest_hours);

                            String leave_hour = getLeaveHours(adjustrestDate, adjustrestDate, userid);
                            leaveHours = floatAdd(leaveHours, leave_hour);

                            String absense_hour = getAbsenteeishours(adjustrestDate, adjustrestDate, userid);
                            absenseHours = floatAdd(absenseHours, absense_hour);
                        }
                    }
                }
            }
        }
        String result = floatSubtract(floatSubtract(AdjustRestHours,leaveHours),absenseHours);
        if(floatCompare(result,"0") == -1){
            result = "0";
        }
        return Double.valueOf(result);
    }

    /**
     * 获取 国假在职小时数  =  【公众假日】的天数 * 8小时
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getNationalWorkingHours(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 离职日期
        String terminationdate = getTerminationDate(userid);
        //入职日期在开始和结束之间
        if(belongStartCalendar(companystartdate,fromDate,toDate)){
            fromDate = companystartdate;
        }
        //离职日期在开始和结束之间
        if(belongStartCalendar(terminationdate,fromDate,toDate)){
            toDate = terminationdate;
        }
        rs.executeQuery("select distinct groupid from kq_format_total " +
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        while(rs.next()){
            String groupid = Util.null2String(rs.getString("groupid"));
            // 法定(公众假日)天数
            String publicHolidays = getPublicHolidays(fromDate,toDate,groupid);
            String hours = floatMultiply(publicHolidays,"8");
            result = Double.valueOf(hours);
        }
        return result;
    }

    /**
     * 获取 离职日期
     * @param userid
     * @return
     */
    public static String getTerminationDate(String userid){
        String result = "";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select enddate from hrmresource where id=?",userid);
        while(rs.next()){
            result = Util.null2String(rs.getString("enddate"));
        }
        return result;
    }

    /**
     * 获取 补签卡次数
     * 系统提取《补卡流程》的明细数据，一行表示一次，流程中增加控制：只能补3天以内(含3天自然日)的异常考勤
     * (新员工入职30天以内不扣)
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getReplaceCardNum(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        String tablename = rs.getPropValue("hrm_zhewen","replacecard_tablename");
        String detailtable = tablename + "_dt1";
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try {

            //入职30天后的日期  在  统计月份第一天  和 最后一天 之间
            if(belongStartCalendar(company30date,fromDate,toDate)){
                rs.executeQuery("select count(b.id)as count from "+tablename+" a," + detailtable + " b,workflow_requestbase c where a.id=b.mainid and a.requestid=c.requestid and c.currentnodetype='3' and a.resourceId=? and b.detail_signdate >= ? and b.detail_signdate <= ?", userid, company30date, toDate);
                rs.next();
                result = Util.getDoubleValue(rs.getString("count"),0.00);
            }
            //入职30天后的日期  小于 统计月份第一天
            else if(compareDateTime(fromDate,company30date)){
                rs.executeQuery("select count(b.id)as count from "+tablename+" a," + detailtable + " b,workflow_requestbase c where a.id=b.mainid and a.requestid=c.requestid and c.currentnodetype='3' and a.resourceId=? and b.detail_signdate >= ? and b.detail_signdate <= ?", userid, fromDate, toDate);
                rs.next();
                result = Util.getDoubleValue(rs.getString("count"),0.00);
            }else if(compareDateTime(company30date,toDate)){
                result = 0.00;
            }

            if(result < 0){
                result = 0.00;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 获取 迟到/早退(10分钟以内)/次
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getBeLateLeaveEearly10(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try{
            rs.executeQuery("select forgotcheck,kqdate from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
            while(rs.next()){
                String kqdate = Util.null2String(rs.getString("kqdate"));
                int forgotcheck = Util.getIntValue(rs.getString("forgotcheck"),0);
                // 迟到分钟数
                double count_late = getLateMins(kqdate,userid);
                // 早退分钟数
                double count_leaveearly = getLeaveEarlyMins(kqdate,userid);
                //不在 新入职员工 30天内，需要累计
                if(!belongStartCalendar(kqdate,companystartdate,company30date)){
                    // 当天没有漏签
                    if(forgotcheck == 0){
                        if(0 < count_late  && count_late < 10){
                            result ++;
                        }
                        if(0 < count_leaveearly && count_leaveearly < 10){
                            result ++;
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            rs.writeLog(e);
        }

        return result;
    }

    /**
     * 获取 迟到/早退(10(含)-30分钟以内)/次
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getBeLateLeaveEearly10To30(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try{
            rs.executeQuery("select forgotcheck,kqdate from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
            while(rs.next()){
                String kqdate = Util.null2String(rs.getString("kqdate"));
                int forgotcheck = Util.getIntValue(rs.getString("forgotcheck"));
                // 迟到分钟数
                double count_late = getLateMins(kqdate,userid);
                // 早退分钟数
                double count_leaveearly = getLeaveEarlyMins(kqdate,userid);
                //不在 新入职员工 30天内，需要累计
                if(!belongStartCalendar(kqdate,companystartdate,company30date)){
                    // 当天没有漏签
                    if(forgotcheck == 0){
                        if(10 <= count_late && count_late < 30){
                            result ++;
                        }
                        if(10 <= count_leaveearly && count_leaveearly < 30){
                            result ++;
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            rs.writeLog(e);
        }


        return result;
    }

    /**
     * 获取 迟到/早退(30(含)-60分钟以内)/次
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getBeLateLeaveEearly30To60(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try{
            rs.executeQuery("select forgotcheck,kqdate from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? ",userid,fromDate,toDate);
            while(rs.next()){
                String kqdate = Util.null2String(rs.getString("kqdate"));
                int forgotcheck = Util.getIntValue(rs.getString("forgotcheck"));
                // 迟到分钟数
                double count_late = getLateMins(kqdate,userid);
                // 早退分钟数
                double count_leaveearly = getLeaveEarlyMins(kqdate,userid);
                //不在 新入职员工 30天内，需要累计
                if(!belongStartCalendar(kqdate,companystartdate,company30date)){
                    // 当天没有漏签
                    if(forgotcheck == 0){
                        if(30 <= count_late && count_late < 60){
                            result ++;
                        }
                        if(30 <= count_leaveearly && count_leaveearly < 60){
                            result ++;
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            rs.writeLog(e);
        }
        return result;
    }

    /**
     * 获取 迟到/早退(60分钟以上)/次
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getBeLateLeaveEearly60More(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try{
            rs.executeQuery("select forgotcheck,kqdate from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? ",userid,fromDate,toDate);
            while(rs.next()){
                String kqdate = Util.null2String(rs.getString("kqdate"));
                int forgotcheck = Util.getIntValue(rs.getString("forgotcheck"));
                // 迟到分钟数
                double count_late = getLateMins(kqdate,userid);
                // 早退分钟数
                double count_leaveearly = getLeaveEarlyMins(kqdate,userid);
                //不在 新入职员工 30天内，需要累计
                if(!belongStartCalendar(kqdate,companystartdate,company30date)){
                    // 当天没有漏签
                    if(forgotcheck == 0){
                        if(count_late >= 60){
                            result ++;
                        }
                        if(count_leaveearly >= 60){
                            result ++;
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            rs.writeLog(e);
        }
        return result;
    }

    /**
     * 获取  旷工合计小时数  =  旷工小时数  +  漏签当天的排班时长之和  +  迟到/早退(60分钟以上)/次*4小时计
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getAbsenteeismTotalHours(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        // 入职日期
        String companystartdate = getCompanyStartDate(userid);
        // 入职30天后的日期
        String company30date = addDateDay(companystartdate,30);
        try{

//            rs.executeQuery("select belate as count from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? and belatemins >= 60",userid,fromDate,toDate);
//            while(rs.next()){
//                String kqdate = Util.null2String(rs.getString("kqdate"));
//                //不在 新入职员工 30天内，需要累计
//                if(!belongStartCalendar(kqdate,companystartdate,company30date)){
//                    // 迟到/早退(60分钟以上)/次 * 4小时计
//                    double countt = Util.getDoubleValue(rs.getString("count"),0.00);
//                    countt = Double.valueOf(floatMultiply(String.valueOf(countt),"4"));
//                    result += countt;
//                }
//            }

            // 迟到/早退(60分钟以上)/次 * 4小时计
            double lateMins = getBeLateLeaveEearly60More(fromDate,toDate,userid);
            double countt = Double.valueOf(floatMultiply(String.valueOf(lateMins),"4"));
            result += countt;

            rs1.executeQuery("select forgotcheck,forgotBeginWorkCheck,kqdate,absenteeismmins from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? ",userid,fromDate,toDate);
            while(rs1.next()){
                String kqdate = Util.null2String(rs1.getString("kqdate"));
                int forgotcheck1 = Util.getIntValue(rs1.getString("forgotcheck"));
                int forgotBeginWorkCheck = Util.getIntValue(rs1.getString("forgotBeginWorkCheck"));
                int forgotcheck = forgotcheck1 + forgotBeginWorkCheck;
                // 旷工小时数
                double count1 = Util.getDoubleValue(rs1.getString("absenteeismmins"),0.00);
                count1 = Double.valueOf(floatDivide(String.valueOf(count1),"60"));
                result += count1;

                // 当天有漏签
                if(forgotcheck > 0){
                    // 漏签当天的排班时长之和
                    String workhour = getWorkHours(kqdate,kqdate,userid);
                    workhour = floatMultiply(workhour,String.valueOf(forgotcheck));
                    result += Double.valueOf(workhour);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            rs.writeLog(e);
        }
        return result;
    }

    /**
     * 实际出勤小时数  =  排班表总时间-病假小时-事假小时-旷工小时数-漏签旷工小时数
     *
     *    -漏签旷工小时数   这个待确定是否 去除      2024-12-24
     *
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static double getActualAttendanceHours(String fromDate, String toDate, String userid){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        // 应出勤（排班）小时数
        String workhours = getWorkHours(fromDate,toDate,userid);
        // 7：病假 6：事假
        String typeid = "7,6";
        // 病假、事假 小时数
        String leavehours = getLeaveTypeHours(typeid,fromDate,toDate,userid);
        // 旷工小时数
        String absencehours = "0";
        // 漏签当天的排班时长之和
        String forgotserialhours = "0";
        rs1.executeQuery("select forgotcheck,forgotBeginWorkCheck,kqdate,absenteeismmins from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ? ",userid,fromDate,toDate);
        while(rs1.next()){
            String kqdate = Util.null2String(rs1.getString("kqdate"));
            int forgotcheck1 = Util.getIntValue(rs1.getString("forgotcheck"));
            int forgotBeginWorkCheck = Util.getIntValue(rs1.getString("forgotBeginWorkCheck"));
            int forgotcheck = forgotcheck1 + forgotBeginWorkCheck;
            // 旷工小时数
            String count1 = Util.null2o(rs1.getString("absenteeismmins"));
            count1 = floatDivide(count1,"60");
            absencehours = floatAdd(absencehours,count1);

            // 当天有漏签
            if(forgotcheck > 0){
                // 漏签当天的排班时长之和
                String workhour = getWorkHours(kqdate,kqdate,userid);
                workhour = floatMultiply(workhour,String.valueOf(forgotcheck));
                forgotserialhours = floatAdd(forgotserialhours,workhour);
            }
        }
        result = Double.valueOf(floatSubtract(workhours,floatAdd(leavehours,floatAdd(absencehours,forgotserialhours))));
        if(result < 0 ){
            result = 0.00;
        }
        return result;
    }

    /**
     * 获取 请假 时长
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static String getLeaveTypeHours(String typeid,String fromDate, String toDate,String userid){
        String result = "0";
        RecordSet rs = new RecordSet();
        String serialid = getSerialId(fromDate,toDate,userid);
        String serial_hours = getHoursBySerial(serialid);
        rs.executeQuery("select SUM(duration)as count,durationrule,resourceid,newleavetype from kq_flow_split_leave  where 1=1 and newleavetype in ("+typeid+") and belongdate >= '"+fromDate+"' and belongdate <= '"+toDate+"'  and resourceid = ? group by durationrule,resourceid,newleavetype ",userid);
        while(rs.next()){
            String count = Util.null2o(rs.getString("count"));
            // 1-按天请假、2-按半天请假、3-按小时请假、4-按整天请假、5-按半小时请假、6-按整小时请假
            int durationrule = Util.getIntValue(rs.getString("durationrule"));
            // 请假类型
            int leavetype = Util.getIntValue(rs.getString("newleavetype"));
            // 按天，需要 乘以 每天的班次的小时
            if(durationrule == 1 || durationrule == 2 || durationrule == 4){
                // 其中，2-年假、8-产假、9-陪产假、10-婚假、11-丧假，一天按8小时计算扣减；
                if(leavetype == 2 || leavetype == 8 || leavetype == 9 || leavetype == 10 || leavetype == 11){
                    result = floatMultiply(count,"8");
                }else{
                    result = floatMultiply(count,serial_hours);
                }
            }
            // 按小时
            if(durationrule == 3 || durationrule == 5 || durationrule == 6){
                result = count;
            }
        }
        return result;
    }


    /**
     * 获取 应出勤时长 = 排班时长
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static String getWorkHours(String fromDate,String toDate,String userid){
        String result = "0";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select sum(workmins)as mins from kq_format_total "+
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        rs.next();
        String count1 = Util.null2o(rs.getString("mins"));
        result = floatDivide(count1,"60");
        return result;
    }

    /**
     *
     * 方法描述 : 对两个字符串进行金额的相乘
     *  @param a
     *  @param b
     *  @return
     * String
     */
    public static String floatMultiply(String a, String b) {
        a=a.equals("")?"0":a;
        b=b.equals("")?"0":b;
        BigDecimal bg1 = new BigDecimal(a);
        BigDecimal bg2 = new BigDecimal(b);
        BigDecimal bd = bg1.multiply(bg2).setScale(4, BigDecimal.ROUND_HALF_UP);
        return bd.toString();
    }

    /**
     *
     * 方法描述 : 对两个字符串进行金额的相除（默认保留两位小数）
     *  @param a
     *  @param b
     *  @return
     * String
     */
    public static String floatDivide(String a, String b) {
        a=a.equals("")?"0":a;
        b=b.equals("")?"0":b;
        BigDecimal bg1 = new BigDecimal(a);
        BigDecimal bg2 = new BigDecimal(b);
        BigDecimal bd = bg1.divide(bg2, 2, BigDecimal.ROUND_HALF_UP);
        return bd.toString();
    }

    /**
     * 获取 班次id
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static String getSerialId(String fromDate, String toDate,String userid){
        String result = "";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select distinct serialid from kq_format_total " +
                " where resourceid = ? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate);
        while(rs.next()){
            result = Util.null2String(rs.getString("serialid"));
        }
        return result;
    }

    /**
     * 获取班次对应的工作时长  分钟数  转换为  小时
     * @param serialid
     * @return
     */
    public static String getHoursBySerial(String serialid){
        String result = "0";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select * from kq_ShiftManagement where id=?",serialid);
        if(rs.next()) {
            String worktime = Util.null2o(rs.getString("worktime"));
            result = floatDivide(worktime,"60");
        }
        return result;
    }

    /**
     * 获取 法定(公众假日)天数
     * @param fromDate
     * @param toDate
     * @param groupid
     * @return
     */
    public static String getPublicHolidays(String fromDate, String toDate,String groupid){
        String result = "0";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select COUNT(id)as count from KQ_HolidaySet  where holidayDate between ? and ? and changeType=1 and groupid = ?",fromDate,toDate,groupid);
        while(rs.next()){
            result = Util.null2o(rs.getString("count"));
        }
        return result;
    }

    /**
     * 获取 请假 时长
     * @param fromDate
     * @param toDate
     * @param userid
     * @return
     */
    public static String getLeaveHours(String fromDate, String toDate,String userid){
        String result = "0";
        RecordSet rs = new RecordSet();
        String serialid = getSerialId(fromDate,toDate,userid);
        String serial_hours = getHoursBySerial(serialid);
        rs.executeQuery("select SUM(duration)as count,durationrule,resourceid from kq_flow_split_leave  where 1=1 and belongdate between ? and ?  and resourceid = ? group by durationrule,resourceid",fromDate,toDate,userid);
        while(rs.next()){
            String count = Util.null2o(rs.getString("count"));
            // 1-按天请假、2-按半天请假、3-按小时请假、4-按整天请假、5-按半小时请假、6-按整小时请假
            int durationrule = Util.getIntValue(rs.getString("durationrule"));
            // 按天，需要 乘以 每天的班次的小时
            if(durationrule == 1 || durationrule == 2 || durationrule == 4){
                result = floatMultiply(count,serial_hours);
            }else{
//            // 按小时
//            if(durationrule == 3){
                result = count;
            }
        }
        return result;
    }

    /**
     * @param a 任意数
     * @return 是
     */
    private static String isZero(String a) {
        if (a==null || "".equals(a)) {
            a = "0";
        }
        return a;
    }

    /**
     * 大小比较
     *
     * @param a
     * @param b
     * @return -1 小于    0  等于     1 大于
     */
    public static int floatCompare(String a, String b) {
        a = isZero(a);
        b = isZero(b);
        BigDecimal bg1 = new BigDecimal(a);
        BigDecimal bg2 = new BigDecimal(b);
        return bg1.compareTo(bg2);
    }

    /**
     * 方法描述 : 对两个字符串进行金额的相加
     *  @param a
     *  @param b
     *  @return
     * String
     */
    public static String floatAdd(String a, String b) {
        a=a.equals("")?"0":a;
        b=b.equals("")?"0":b;
        BigDecimal bg1 = new BigDecimal(a);
        BigDecimal bg2 = new BigDecimal(b);
        BigDecimal bd = bg1.add(bg2);
        return bd.toString();
    }

    /**
     *
     * 方法描述 : 对两个字符串进行金额的相减
     *  @param a
     *  @param b
     *  @return
     * String
     */
    public static String floatSubtract(String a, String b) {
        a=a.equals("")?"0":a;
        b=b.equals("")?"0":b;
        BigDecimal bg1 = new BigDecimal(a);
        BigDecimal bg2 = new BigDecimal(b);
        BigDecimal bd = bg1.subtract(bg2);
        return bd.toString();
    }

    /**
     * 获取 入职日期
     * @param userid
     * @return
     */
    public static String getCompanyStartDate(String userid){
        String result = "";
        RecordSet rs = new RecordSet();
        rs.executeQuery("select companystartdate from hrmresource where id=?",userid);
        while(rs.next()){
            result = Util.null2String(rs.getString("companystartdate"));
        }
        return result;
    }

    /**
     * 对时间的天数进行加减
     * @param daytime 时间的格式：yyyy-MM-dd HH:mm:ss
     * @param day  天数   -1则代表减一天
     * @return
     */
    public static String addDateDay(String daytime, int day){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(daytime);
            if (date == null){
                return "";
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(Calendar.DAY_OF_MONTH, day);// 加一天
            date = cal.getTime();
            cal = null;
            return format.format(date);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * 计算两个时间字符串日期的相差天数
     *
     * @param date1 字符串时间1
     * @param date2 字符串时间2
     * @return 相差时间
     */
    public static int getDays(String date1, String date2) {
        if (!"".equals(date1) && !"".equals(date2)) {
            String date1Arr[] = date1.split("-");
            String date2Arr[] = date2.split("-");
            Calendar cal1 = Calendar.getInstance();
            cal1.set(Integer.parseInt(date1Arr[0]), Integer.parseInt(date1Arr[1]) - 1, Integer.parseInt(date1Arr[2]));
            Date date1Obj = cal1.getTime();
            Calendar cal2 = Calendar.getInstance();
            cal2.set(Integer.parseInt(date2Arr[0]), Integer.parseInt(date2Arr[1]) - 1, Integer.parseInt(date2Arr[2]));
            Date date2Obj = cal2.getTime();
            return calculateDays(date1Obj, date2Obj);
        }
        return 0;
    }

    /**
     *  计算天数
     * @param date1 日期
     * @param date2 日期
     * @return 天数
     */
    public static int calculateDays(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);
        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        if (year1 != year2) {//不同 年
            int timeDistance = 0;
            if (year1 < year2) {//后面日期年大于前面日期
                for (int i = year1; i < year2; i++) {
                    if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {//闰年
                        timeDistance += 366;
                    } else {//不是闰年
                        timeDistance += 365;
                    }
                }
            } else {
                for (int i = year2; i < year1; i++) {
                    if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {//闰年
                        timeDistance += 366;
                    } else {//不是闰年
                        timeDistance += 365;
                        timeDistance = 0 - timeDistance;
                    }
                }
            }
            return timeDistance + (day2 - day1);
        } else {//同一年
            return day2 - day1;
        }
    }

    /**
     * 判断 日期是否是 周六 或 周日
     * @param dateString
     * @return
     */
    public static boolean isSaturdayOrSunday(String dateString) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        boolean flag = false;
        try {
            date = format.parse(dateString);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
            if(dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY){
                flag = true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 判断 是否是 调配休息日或者是 公众假日
     * @param dateString
     * @return
     */
    public static boolean checkIsRestOrHoliday(String groupid,String dateString){
        boolean bool = false;
        RecordSet rs = new RecordSet();
        rs.executeQuery("select id,changeType from KQ_HolidaySet where groupId=? and holidayDate=?",groupid,dateString);
        if(rs.next()){
           int changeType = Util.getIntValue(rs.getString("changeType"));
           // 1-公众假日 2-调配工作日 3-调配休息日
           if(changeType == 1 || changeType == 3){
               bool = true;
           }
        }
        return bool;
    }

    /**
     * 判断 是否是 调配工作日
     * @param dateString
     * @return
     */
    public static boolean checkIsWorkday(String groupid,String dateString){
        boolean bool = false;
        RecordSet rs = new RecordSet();
        rs.executeQuery("select id,changeType from KQ_HolidaySet where groupId=? and holidayDate=?",groupid,dateString);
        if(rs.next()){
            int changeType = Util.getIntValue(rs.getString("changeType"));
            // 1-公众假日 2-调配工作日 3-调配休息日
            if(changeType == 2){
                bool = true;
            }
        }
        return bool;
    }

    private static String[] parseDate(String date){
        if (StringUtils.isEmpty(date)) {
            return new String[]{"1990", "1", "1"};
        }
        try {
            String[] split = date.split("-");
            List<String> list = new ArrayList<>(Arrays.asList(split));
            // 只有年
            if (list.size() == 1) {
                // 添加月
                list.add("1");
                // 添加日
                list.add("1");

            }
            // 只有年月
            else if (list.size() == 2) {
                list.add("1");
            }
            return list.toArray(new String[]{});
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取 迟到分钟数
     * @param fromDate
     * @param userId
     * @return
     */
    public static double getLateMins(String fromDate,String userId){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        KQWorkTime kqWorkTime = new KQWorkTime();
        WorkTimeEntity workTimeEntity = kqWorkTime.getWorkTime(userId, fromDate);
        String searIdFrom = workTimeEntity.getSerialId();
        //第一个班段上班卡的 时间
        String oneStart = getBcTimes(searIdFrom,"start","0");
        oneStart += ":00";

        //休息开始时间
        String restStart = getRestTime(searIdFrom,"start");
        restStart += ":00";
        //休息结束时间
        String restEnd = getRestTime(searIdFrom,"end");
        restEnd += ":00";

        //当天没有 公出
        if(!checkHasOut(userId,fromDate)) {
            // 当天 有迟到
            if(checkHasLate(userId,fromDate)) {
                rs.executeQuery("select signintime from kq_format_detail where resourceid = ? and kqdate = ?", userId, fromDate);
                if (rs.next()) {
                    String signtime = Util.null2String(rs.getString("signintime"));
                    signtime += ":00";
                    //上班打卡时间 大于等于 休息结束时间
                    if(compareDateTime(fromDate+" "+signtime,fromDate+" "+restEnd)){
                        double oneTimes = getBetwwenMins(oneStart,restStart);
                        double twoTimes = getBetwwenMins(restEnd,signtime);
                        result = oneTimes + twoTimes;
                    }else{
                        // 上班打卡时间 大于等于 休息开始时间
                        if(compareDateTime(fromDate+""+signtime,fromDate+" "+restStart)){
                            double oneTimes = getBetwwenMins(oneStart,restStart);
                            result = oneTimes;
                        }else{
                            double oneTimes = getBetwwenMins(oneStart,signtime);
                            result = oneTimes;
                        }
                    }
                }
            }
        }
        return result;
    }

    /**
     * 获取 早退分钟数
     * @param fromDate
     * @param userId
     * @return
     */
    public static double getLeaveEarlyMins(String fromDate,String userId){
        double result = 0.00;
        RecordSet rs = new RecordSet();
        RecordSet rs1 = new RecordSet();
        KQWorkTime kqWorkTime = new KQWorkTime();
        WorkTimeEntity workTimeEntity = kqWorkTime.getWorkTime(userId, fromDate);
        String searIdFrom = workTimeEntity.getSerialId();
        //第一个班段下班卡的 时间
        String oneEnd = getBcTimes(searIdFrom,"end","0");
        oneEnd += ":00";

        //休息开始时间
        String restStart = getRestTime(searIdFrom,"start");
        restStart += ":00";
        //休息结束时间
        String restEnd = getRestTime(searIdFrom,"end");
        restEnd += ":00";

        // 当天没公出
        if(!checkHasOut(userId,fromDate)) {
            // 当天有早退
            if(checkHasLeaveEarly(userId,fromDate)) {
                rs.executeQuery("select signouttime from kq_format_detail where resourceid = ? and kqdate = ? ", userId, fromDate);
                if (rs.next()) {
                    String signtime = Util.null2String(rs.getString("signouttime"));
                    signtime += ":00";
                    //下班打卡时间 小于 休息开始时间
                    if(compareDateTime(fromDate+" "+restStart,fromDate+" "+signtime)){
                        double oneTimes = getBetwwenMins(signtime,restStart);
                        double twoTimes = getBetwwenMins(restEnd,oneEnd);
                        result = oneTimes + twoTimes;
                    }else{
                        //下班打卡时间在 休息开始和结束之间
                        if(compareDateTime(fromDate+" "+restEnd,fromDate+" "+signtime)){
                            double twoTimes = getBetwwenMins(restEnd,oneEnd);
                            result = twoTimes;
                        }else{
                            double twoTimes = getBetwwenMins(signtime,oneEnd);
                            result = twoTimes;
                        }
                    }

                }
            }
        }
        return result;
    }

    /**
     * 给时间加上几个小时
     * @param day 时间的格式：HH:mm:ss
     * @param hour 需要加的小时数   -1 则代表减1小时
     * @return
     */
    public static String addDateHour(String day, int hour){
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(day);
            if (date == null){
                return "";
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(Calendar.HOUR, hour);// 24小时制
            date = cal.getTime();
            cal = null;
            return format.format(date);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * 两个时间段相差分钟数
     * @param time1
     * @param time2
     * @return
     */
    public static double getBetwwenMins(String time1,String time2){
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        double result = 0;
        try {
            Date date1 = dateFormat.parse(time1);
            Date date2 = dateFormat.parse(time2);

            long diff = date2.getTime() - date1.getTime();
            double diffMinutes = (double)diff / (60*1000);

            result = diffMinutes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 获取班次上班时段
     * @param serial
     * @param status
     * @param record
     * @return  times  00:00
     */
    private static String getBcTimes(String serial,String status,String record){
        RecordSet rs = new RecordSet();
        String sql = "select times from kq_ShiftOnOffWorkSections where serialid = "+serial+" and (isdelete is null or  isdelete <> '1') and onoffworktype = '"+status+"' and record =  "+record;
        rs.execute(sql);
        String times = "";
        if (rs.next()){
            times = Util.null2String(rs.getString("times"));
        }
        return times;
    }

    /**
     * 判断一个时间是否在一个时间段内
     *
     * @param nowTimee 指定时间
     * @param beginTimee 开始时间
     * @param endTimee 结束时间
     */
    public static boolean belongStartCalendar(String nowTimee, String beginTimee, String endTimee) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date nowTime = null;
        Date beginTime = null;
        Date endTime = null;
        boolean b = false;
        try {
            nowTime = format.parse(nowTimee);
            beginTime = format.parse(beginTimee);
            endTime = format.parse(endTimee);

            Calendar date = Calendar.getInstance();
            date.setTime(nowTime);
            Calendar begin = Calendar.getInstance();
            begin.setTime(beginTime);
            Calendar end = Calendar.getInstance();
            end.setTime(endTime);

            if(nowTimee.equals(beginTimee)){
                b = true;
            }else if(date.after(begin) && date.before(end)){//在时间段内
                b = true;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return b;
    }

    /**
     * 判断 当天 是否有 公出
     * @param userid
     * @param date
     * @return
     */
    public static boolean checkHasOut(String userid,String date){
        boolean bool = false;
        RecordSet rs = new RecordSet();
        rs.executeQuery("select id from kq_flow_split_out where resourceid = ? and belongdate = ?",userid,date);
        if(rs.next()){
            bool = true;
        }
        return bool;
    }

    /**
     * 判断 当天是否 早退
     * @param userid
     * @param date
     * @return
     */
    public static boolean checkHasLeaveEarly(String userid,String date){
        boolean bool = false;
        RecordSet rs = new RecordSet();
        rs.executeQuery("select leaveearlymins from kq_format_total where resourceid = ? and kqdate = ?",userid,date);
        while(rs.next()){
            int leaveearlymins = Util.getIntValue(rs.getString("leaveearlymins"));
            if(leaveearlymins > 0){
                bool = true;
            }
        }
        return bool;
    }

    /**
     * 判断 当天是否 迟到
     * @param userid
     * @param date
     * @return
     */
    public static boolean checkHasLate(String userid,String date){
        boolean bool = false;
        RecordSet rs = new RecordSet();
        rs.executeQuery("select belatemins from kq_format_total where resourceid = ? and kqdate = ?",userid,date);
        while(rs.next()){
            int belatemins = Util.getIntValue(rs.getString("belatemins"));
            if(belatemins > 0){
                bool = true;
            }
        }
        return bool;
    }

    /**
     * 获取 休息时间
     * @param serial
     * @param status
     * @return  times  00:00
     */
    private static String getRestTime(String serial,String status){
        RecordSet rs = new RecordSet();
        String sql = "select times from kq_ShiftRestTimeSections where serialid = "+serial+" and (isdelete is null or  isdelete <> '1') and resttype = '"+status+"' ";
        rs.execute(sql);
        String times = "";
        if (rs.next()){
            times = Util.null2String(rs.getString("time"));
        }
        return times;
    }

    /**
     * 比较时间的大小
     * @param a
     * @param b
     * @return
     * @throws ParseException
     */
    public static boolean compareDateTime(String a, String b){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        boolean bool = false;
        try {
            long t1 = sdf.parse(a).getTime();
            long t2 = sdf.parse(b).getTime();
            if (t1 >= t2) {
                bool = true;
            } else {
                bool = false;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return bool;
    }

%>

<HEAD>
</HEAD>
<BODY>
<h1> 以下是  <%=username%>   <%=fromdate%> 到  <%=todate%>   的 相关数据展示 </h1>
<h2> 请假时长  <%=leaveHours%></h2>
<h2> 班次的开始时间   <%=oneStart%></h2>
<h2> 班次的结束时间 <%=oneEnd%></h2>
<h2> 应出勤（排班）小时数   <%=workhours%></h2>
<h2> 月标准工时   <%=standardWorkingHours%></h2>
<h2> 应计薪小时数   <%=accruedPayHours%></h2>
<h2> 国假排班小时（3倍）   <%=nationalHoliday3Hours%></h2>
<h2> 国假排班小时（2倍）   <%=nationalHoliday2Hours%></h2>
<h2> 国假在职小时数   <%=nationalWorkingHours%></h2>
<h2> 补签卡次数   <%=replaceCardNum%></h2>
<h2> 迟到/早退(10分钟以内)/次   <%=beLateLeaveEearly10%></h2>
<h2> 迟到/早退(10(含)-30分钟以内)/次   <%=beLateLeaveEearly10To30%></h2>
<h2> 迟到/早退(30(含)-60分钟以内)/次   <%=beLateLeaveEearly30To60%></h2>
<h2> 迟到/早退(60分钟以上)/次  <%=beLateLeaveEearly60More%>   </h2>
<h2> 旷工合计小时   <%=absenteeismTotalHours%></h2>
<h2> 实际出勤小时数=排班表总时间-病假小时-事假小时-旷工小时数-漏签旷工小时数  <%=actualAttendanceHours%></h2>
<h2> 病假 小时数 <%=bjleavehours%></h2>
<h2> 事假 小时数 <%=sjleavehours%></h2>
<h2> 旷工小时数  <%=absencehours%></h2>
<h2> 漏签旷工小时数  <%=forgotserialhours%></h2>
<h2> 迟到分钟数 <%=latemins%></h2>
<h2> 早退分钟数 <%=leaveearlymins%></h2>
</BODY>