Ecology-Dev/浙文眼镜/interface/zw/do.jsp

1471 lines
57 KiB
Plaintext
Raw Normal View History

2025-09-01 21:00:02 +08:00
<%@ 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>