<%@ page import="weaver.general.Util" %> <%@ page import="weaver.conn.RecordSet" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.math.BigDecimal" %> <%@ page import="org.apache.commons.lang.StringUtils" %> <%@ page import="java.util.*" %> <%@ page import="java.text.ParseException" %> <%@ page import="java.time.format.DateTimeFormatter" %> <%@ page import="java.time.LocalDate" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% int sum = 0; String fromDate = request.getParameter("fromdate"); String toDate = request.getParameter("todate"); String id = request.getParameter("userid"); //本月加班工时 String byjbgs = getOvertimeHour(fromDate,toDate,id); //本月调休工时 String bytxgs = getCompensatoryleaveHour(fromDate,toDate,id); //上月加班结余工时 String syjbjygs = getLastOverHour(fromDate,toDate,id); //加班累计工时 String jbljgs = getOverTotalHour(fromDate,toDate,id); sum++; %> <%! /** * 判断一个时间是否在一个时间段内 * * @param nowTimee 指定时间 * @param beginTimee 开始时间 * @param endTimee 结束时间 */ public static boolean belongCalendarNoEnd(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(endTimee)){ b = true; }else if(date.after(begin) && date.before(end)){//在时间段内 b = true; } } catch (Exception ex) { ex.printStackTrace(); } return b; } /** * 对时间的月份进行加减 * @param daytime 时间的格式:yyyy-MM-dd HH:mm:ss * @param month 天数 -1则代表减一天 * @return */ public static String addDateMonth(String daytime, int month){ 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.MONTH, month);// 加一月 date = cal.getTime(); cal = null; return format.format(date); } catch (Exception ex) { ex.printStackTrace(); } return ""; } /** * 判断当月有几天 * @param year int 2020 * @param month int 8 * @return */ public static int getMonthDays(int year, int month) { if (month == 2) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { return 29; } else { return 28; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; } else { return 31; } } /** * @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 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(); } private static String[] parseDate(String date){ if (StringUtils.isEmpty(date)) { return new String[]{"1990", "1", "1"}; } try { String[] split = date.split("-"); List 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 dateString * @return */ public static boolean isSunday(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.SUNDAY){ flag = true; } } catch (ParseException e) { e.printStackTrace(); } return flag; } /** * 获取 下拉框 的名称 * @param fieldid * @param value * @return */ public static String getCusSelectName(String fieldid,String value) { String result = ""; RecordSet rs = new RecordSet(); if(fieldid.startsWith("field")){ fieldid = fieldid.substring(5); } rs.executeQuery("select selectname from cus_selectitem where cancel=0 and fieldid = ? and selectvalue = ?", fieldid, value); if (rs.next()) { result = Util.null2String(rs.getString("selectname")); } return result; } /** * 获取 基本信息里的 自定义字段的 值 * @param userid * @return */ public static String getBaseCusFieldValue(String userid,String fieldid){ String result = ""; RecordSet rs = new RecordSet(); rs.executeQuery("select "+ fieldid +" from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid='-1' and id=?",userid); if(rs.next()){ result = Util.null2String(rs.getString(fieldid)); } return result; } /** * 获取 个人信息里的 自定义字段的 值 * @param userid * @return */ public static String getPersonCusFieldValue(String userid,String fieldid){ String result = ""; RecordSet rs = new RecordSet(); rs.executeQuery("select "+ fieldid +" from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid='1' and id=?",userid); if(rs.next()){ result = Util.null2String(rs.getString(fieldid)); } return result; } /** * 获取 工作信息里的 自定义字段的 值 * @param userid * @return */ public static String getWorkCusFieldValue(String userid,String fieldid){ String result = ""; RecordSet rs = new RecordSet(); rs.executeQuery("select "+ fieldid +" from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid='3' and id=?",userid); if(rs.next()){ result = Util.null2String(rs.getString(fieldid)); } return result; } /** * 获取 自然月的 天数 * @param toDate * @return */ public static String getCalendarDays(String toDate){ int currentyear = Integer.valueOf(toDate.substring(0, 4)); //年 int currentmonth = Integer.valueOf(toDate.substring(5, 7)); //月 int days = getMonthDays(currentyear,currentmonth); return String.valueOf(days); } /** * 获取 周日 天数 * @param fromDate * @param toDate * @return */ public static String getWeekendDay(String fromDate,String toDate){ String result = "0"; // 格式化日期 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 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 (isSunday(dateString)) { result = floatAdd(result,"1"); } } return result; } /** * 获取 公众假日 天数 * @param fromDate * @param toDate * @param userid * @return */ public static String getHolidayDays(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select * from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ String groupid = Util.null2String(rs.getString("groupid")); String kqdate = Util.null2String(rs.getString("kqdate")); if (isHolidayDay(groupid, kqdate)) { result = floatAdd(result,"1"); } } return result; } /** * 获取 标准月 工作日 天数 * @param fromDate * @param toDate * @param userid * @return */ public static String getWorkDays(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(workdays)as days from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("days")); } return result; } /** * 获取 标准月 实际出勤 天数 * @param fromDate * @param toDate * @param userid * @return */ public static String getAttendDays(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(attendancedays)as days from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("days")); } return result; } /** * 获取 标准月 实际出勤 时长 小时 * @param fromDate * @param toDate * @param userid * @return */ public static String getAttendHours(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(attendancemins)as mins from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ String mins = Util.null2o(rs.getString("mins")); result = floatDivide(mins,"60"); } return result; } /** * 判断 指定天数 是否是 公众假日 true 是 false 否 * @param groupid * @param date * @return */ public static boolean isHolidayDay(String groupid,String date){ boolean bool = false; RecordSet rs = new RecordSet(); rs.executeQuery("select * from kq_HolidaySet where groupid=? and holidayDate=?",groupid,date); while(rs.next()){ // 1-公众假日 2-调配工作日 3-调配休息日 int changeType = Util.getIntValue(rs.getString("changeType")); if(changeType == 1){ bool = true; } } return bool; } /** * 获取 工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 * @param userid * @return */ public static String getGszdId(String userid){ String result = ""; RecordSet rs = new RecordSet(); String gszd_fieldid = rs.getPropValue("lwgd_kqreport","gszd_fieldid"); result = getBaseCusFieldValue(userid,gszd_fieldid); return result; } /** * 获取 工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 * @param userid * @return */ public static String getGszdName(String userid){ String result = ""; RecordSet rs = new RecordSet(); String gszd_fieldid = rs.getPropValue("lwgd_kqreport","gszd_fieldid"); String fieldvalue = getGszdId(userid); if(fieldvalue != null && !"".equals(fieldvalue)){ result = getCusSelectName(gszd_fieldid,fieldvalue); } return result; } /** * 查询 岗位的中文名称 * @param gwid * @return */ public static String getGwname(String gwid){ String result = ""; RecordSet rs = new RecordSet(); rs.executeQuery("select gw from uf_gwgl where sfqy=0 and id=?",gwid); if(rs.next()){ result = Util.null2String(rs.getString("gw")); } return result; } /** * 月度排班标准天数 * 1、只针对标准工时制人员:标准出勤天数=当月法定工作日; * 2、其余员工赋值“/” * @param fromDate * @param toDate * @param userid * @return */ public static String getYdpbbzts(String fromDate, String toDate, String userid){ String result = ""; RecordSet rs = new RecordSet(); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); if("0".equals(usertype)){ rs.executeQuery("select sum(workdays) as workdays from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("workdays")); } }else{ result = "/"; } return result; } /** * 月度排班标准工时 * 1、标准工时制人员赋值“/” * 2、综合工时制人员-生产、仓管、图档:166 * 3、综合工时制人员-厂务:(标准月自然日-标准月周日天数-标准月公众假日)*8 * @param fromDate * @param toDate * @param userid * @return */ public static String getYdpbbzgs(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); if("0".equals(usertype)){ result = "/"; }else if("1".equals(usertype)){ result = "166"; }else{ //标准月自然日 String calendarDays = getCalendarDays(toDate); //标准月周日天数 String weekendDays = getWeekendDay(fromDate,toDate); //标准月公众假日天数 String holidayDays = getHolidayDays(fromDate, toDate, userid); String days = floatSubtract(floatSubtract(calendarDays,weekendDays),holidayDays); if(floatCompare(days,"0") == -1){ days = "0"; } result = floatMultiply(days,"8"); } return result; } /** * 获取标准出勤天数 * 标准工时制人员:标准出勤天数=当月法定工作日/在职期间当月法定工作日 * 其余员工赋值“/” * @param fromDate * @param toDate * @param userid * @return */ public static String getBzcqts(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); //入职日期 String rzrq = getRzrq(userid); if("0".equals(usertype)){ //入职日期在开始日期和结束日期之间 if(belongCalendarNoEnd(rzrq,fromDate,toDate)){ fromDate = rzrq; } rs.executeQuery("select sum(attendancedays)as days from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("days")); } }else{ result = "/"; } return result; } /** * 获取 标准出勤工时 * 1、标准工时制人员:赋值为“/” * 2、综合工时制人员-生产、仓管、图档:166/(在职出勤天数/当月法定工作日天数*166) * 3、综合工时制人员-厂务: * (标准月自然日-标准月周日天数-标准月法定天数)*8/(在职月自然日-在职月周日天数-在职月法定天数)*8 * @param fromDate * @param toDate * @param userid * @return */ public static String getBzcqgs(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); //入职日期 String rzrq = getRzrq(userid); if("0".equals(usertype)){ result = "/"; }else if("1".equals(usertype)){ if(belongCalendarNoEnd(rzrq,fromDate,toDate)){ fromDate = rzrq; String attendancedays = "0"; rs.executeQuery("select sum(attendancedays)as days from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ attendancedays = Util.null2o(rs.getString("days")); } String workdays = getWorkDays(fromDate,toDate,userid); result = floatMultiply(floatDivide(attendancedays,workdays),"166"); }else{ result = "166"; } }else if("2".equals(usertype)){ if(belongCalendarNoEnd(rzrq,fromDate,toDate)){ fromDate = rzrq; } //标准月自然日 String calendarDays = getCalendarDays(toDate); //标准月周日天数 String weekendDays = getWeekendDay(fromDate,toDate); //标准月法定天数 String attendDays = getAttendDays(fromDate, toDate, userid); result = floatMultiply(floatSubtract(floatSubtract(calendarDays,weekendDays),attendDays),"8"); } return result; } /** * 获取 夜班 * 取班次为:夜班-生产值班工程师、夜班-厂务值班工程师 两个班次; * 1、排了这个班次,且正常出勤计为1 * 2、排班这个班次,出勤时长超过4H,计为1 * 取1和2的合计值 * @param fromDate * @param toDate * @param userid * @return */ public static String getNightSerial(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); // 格式化日期 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); //夜班班次 String night_serialid = rs.getPropValue("lwgd_kqreport","night_serialid"); 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); //班次id String serialid = getSerialId(dateString,dateString,userid); //实际出勤天数 String attendDay = getAttendDays(dateString, dateString, userid); //实际出勤小时数 String attendHour = getAttendHours(dateString, dateString, userid); //排了夜班班次 if((","+night_serialid+",").contains(","+serialid+",")){ if(floatCompare(attendDay,"1") >= 0){ result = floatAdd(result,"1"); } if(floatCompare(attendHour,"4") >= 0){ result = floatAdd(result,"1"); } } } return result; } /** * 获取 应出勤天数/工时 * 如果【工时制度】=标准工时制,【标准出勤天数/工时】-【年假】-【病假】-【婚假】-【丧假】-【产假】-【陪产假】-【住院病假】-【其他】 * 否则,【标准出勤天数/工时】-(【年假】+【病假】+【婚假】+【丧假】+【产假】+【陪产假】+【住院病假】+【其他】)*8 * @param fromDate * @param toDate * @param userid * @return */ public static String getWorkDayAndHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); //年假 假期类型id String annualleavetype = rs.getPropValue("lwgd_kqreport","annualleavetype"); //病假 假期类型id String sickleavetype = rs.getPropValue("lwgd_kqreport","sickleavetype"); //婚假 假期类型id String marriageleavetype = rs.getPropValue("lwgd_kqreport","marriageleavetype"); //丧假 假期类型id String bereavementleavetype = rs.getPropValue("lwgd_kqreport","bereavementleavetype"); //产假 假期类型id String maternityleavetype = rs.getPropValue("lwgd_kqreport","maternityleavetype"); //陪产假 假期类型id String paternityleavetype = rs.getPropValue("lwgd_kqreport","paternityleavetype"); //住院病假 假期类型id String hospitalleavetype = rs.getPropValue("lwgd_kqreport","hospitalleavetype"); //其他 假期类型id String otherleavetype = rs.getPropValue("lwgd_kqreport","otherleavetype"); //标准实际出勤天数 String attendDays = getAttendDays(fromDate, toDate, userid); // 年假 String annualleaveday = getLeaveDaysByType(annualleavetype, fromDate, toDate, userid); // 病假 String sickleaveday = getLeaveDaysByType(sickleavetype, fromDate, toDate, userid); // 婚假 String marriageleaveday = getLeaveDaysByType(marriageleavetype, fromDate, toDate, userid); // 丧假 String bereavementleaveday = getLeaveDaysByType(bereavementleavetype, fromDate, toDate, userid); // 产假 String maternityleaveday = getLeaveDaysByType(maternityleavetype, fromDate, toDate, userid); // 陪产假 String paternityleaveday = getLeaveDaysByType(paternityleavetype, fromDate, toDate, userid); // 住院病假 String hospitalleaveday = getLeaveDaysByType(hospitalleavetype, fromDate, toDate, userid); // 其他假 String otherleaveday = getLeaveDaysByType(otherleavetype, fromDate, toDate, userid); // String totalLeaveDays = floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(annualleaveday,sickleaveday),marriageleaveday),bereavementleaveday),maternityleaveday),paternityleaveday),hospitalleaveday),otherleaveday); if("0".equals(usertype)){ result = floatSubtract(attendDays,totalLeaveDays); }else{ result = floatMultiply(floatSubtract(attendDays,totalLeaveDays),"8"); } return result; } /** * 【员工月度加班汇总台账】中【ONCALL·时长+ONCALL·调整时长】 * @param toDate * @param userid * @return */ public static String getOncallHours(String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); String currentyearmonth = toDate.substring(0, 7); //年月 rs.executeQuery("select sum(oncallsc)+sum(oncalldzsc) as count from uf_ygydjbhz where xm = ? and yf = ?",userid,currentyearmonth); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 【员工月度加班汇总台账】中【周末-时长 + 周末-调整时长】 * @param toDate * @param userid * @return */ public static String getWeekendHours(String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); String currentyearmonth = toDate.substring(0, 7); //年月 rs.executeQuery("select sum(zmsc)+sum(zmdzsc) as count from uf_ygydjbhz where xm = ? and yf = ?",userid,currentyearmonth); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 获取 本月加班工时/ONCALL工时 * 如果考勤组=【工程师三班倒】、【设备研发部】,取【员工月度加班汇总台账】中【ONCALL·时长+ONCALL·调整时长】 * 如果考勤组!=【工程师三班倒、设备研发部】,且实际出勤天数/工时>应出勤天数/工时,【实际出勤天数/工时-应出勤天数/工时】,否则取0 * @param fromDate * @param toDate * @param userid * @return */ public static String getOvertimeHourThisMonth(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); // 工程师三班倒 考勤组id String gcssbd_groupid = rs.getPropValue("lwgd_kqreport","gcssbd_groupid"); // 工程师三班倒 考勤组id String sbyfb_groupid = rs.getPropValue("lwgd_kqreport","sbyfb_groupid"); // 【员工月度加班汇总台账】中【ONCALL·时长+ONCALL·调整时长】 String oncallHours = getOncallHours(toDate,userid); // 应出勤天数/工时 // String workdayandhour = getWorkDayAndHour(fromDate, toDate, userid); String workdayandhour = "0"; //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); //年假 假期类型id String annualleavetype = rs.getPropValue("lwgd_kqreport","annualleavetype"); //病假 假期类型id String sickleavetype = rs.getPropValue("lwgd_kqreport","sickleavetype"); //婚假 假期类型id String marriageleavetype = rs.getPropValue("lwgd_kqreport","marriageleavetype"); //丧假 假期类型id String bereavementleavetype = rs.getPropValue("lwgd_kqreport","bereavementleavetype"); //产假 假期类型id String maternityleavetype = rs.getPropValue("lwgd_kqreport","maternityleavetype"); //陪产假 假期类型id String paternityleavetype = rs.getPropValue("lwgd_kqreport","paternityleavetype"); //住院病假 假期类型id String hospitalleavetype = rs.getPropValue("lwgd_kqreport","hospitalleavetype"); //其他 假期类型id String otherleavetype = rs.getPropValue("lwgd_kqreport","otherleavetype"); //标准实际出勤天数 String attendDays = getAttendDays(fromDate, toDate, userid); // 年假 String annualleaveday = getLeaveDaysByType(annualleavetype, fromDate, toDate, userid); // 病假 String sickleaveday = getLeaveDaysByType(sickleavetype, fromDate, toDate, userid); // 婚假 String marriageleaveday = getLeaveDaysByType(marriageleavetype, fromDate, toDate, userid); // 丧假 String bereavementleaveday = getLeaveDaysByType(bereavementleavetype, fromDate, toDate, userid); // 产假 String maternityleaveday = getLeaveDaysByType(maternityleavetype, fromDate, toDate, userid); // 陪产假 String paternityleaveday = getLeaveDaysByType(paternityleavetype, fromDate, toDate, userid); // 住院病假 String hospitalleaveday = getLeaveDaysByType(hospitalleavetype, fromDate, toDate, userid); // 其他假 String otherleaveday = getLeaveDaysByType(otherleavetype, fromDate, toDate, userid); // String totalLeaveDays = floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(annualleaveday,sickleaveday),marriageleaveday),bereavementleaveday),maternityleaveday),paternityleaveday),hospitalleaveday),otherleaveday); if("0".equals(usertype)){ workdayandhour = floatSubtract(attendDays,totalLeaveDays); }else{ workdayandhour = floatMultiply(floatSubtract(attendDays,totalLeaveDays),"8"); } // 实际出勤天数/工时 String actualdayandhour = getActualDayAndHour(fromDate, toDate, userid); // String actualdayandhour = "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")); if(gcssbd_groupid.equals(groupid) || sbyfb_groupid.equals(groupid)){ result = oncallHours; }else{ if(floatCompare(actualdayandhour,workdayandhour) > 0){ result = floatSubtract(actualdayandhour,workdayandhour); }else{ result = "0"; } } } return result; } /** * 获取 周末加班工时 * 如果考勤组=【工程师三班倒】、【设备研发部】,取【员工月度加班汇总台账】中【周末·时长+周末·调整时长】 否则,取0 * @param fromDate * @param toDate * @param userid * @return */ public static String getWeekendOverHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); // 工程师三班倒 考勤组id String gcssbd_groupid = rs.getPropValue("lwgd_kqreport","gcssbd_groupid"); // 工程师三班倒 考勤组id String sbyfb_groupid = rs.getPropValue("lwgd_kqreport","sbyfb_groupid"); // 【员工月度加班汇总台账】中【周末-时长 + 周末-调整时长】 String weekendHours = getWeekendHours(toDate,userid); 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")); if(gcssbd_groupid.equals(groupid) || sbyfb_groupid.equals(groupid)){ result = weekendHours; }else{ result = "0"; } } return result; } /** * 获取 本月加班工时 * @param fromDate * @param toDate * @param userid * @return */ public static String getOvertimeHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(duration_min)as mins from KQ_FLOW_OVERTIME where paidleaveenable=1 and changetype in ('2','3') and resourceid=? and belongdate>=? and belongdate <=?",userid,fromDate,toDate); while(rs.next()){ String mins = Util.null2o(rs.getString("mins")); result = floatDivide(mins,"60"); } return result; } /** * 获取 本月调休工时 【调休(天)】*8 * @param fromDate * @param toDate * @param userid * @return */ public static String getCompensatoryleaveHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); // 调休假 假期类型id String compensatoryleavetype = rs.getPropValue("lwgd_kqreport","compensatoryleavetype"); // 调休假天数 String compensatoryleaveday = getLeaveDaysByType(compensatoryleavetype, fromDate, toDate, userid); result = floatMultiply(compensatoryleaveday,"8"); return result; } /** * 获取 上月加班结余工时 上月考勤表·【加班累计工时】 * @param fromDate * @param toDate * @param userid * @return */ public static String getLastOverHour(String fromDate, String toDate, String userid){ String result = "0"; String lastFromDate = addDateMonth(fromDate,-1); String lastToDate = addDateMonth(toDate,-1); result = getOverTotalHour(lastFromDate, lastToDate, userid); return result; } /** * 获取 加班累计工时 上月加班结余工时+本月加班工时-本月调休工时 * @param fromDate * @param toDate * @param userid * @return */ public static String getOverTotalHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); String lastFromDate = addDateMonth(fromDate,-1); String lastToDate = addDateMonth(toDate,-1); // 上月加班结余工时 String lastoveroverhour = getLastOverHour(fromDate,toDate,userid); // 本月加班工时 String overtimehour = getOvertimeHour(fromDate, toDate, userid); // 本月调休工时 String compensatoryleaveHour = getCompensatoryleaveHour(fromDate, toDate, userid); result = floatSubtract(floatAdd(lastoveroverhour,overtimehour),compensatoryleaveHour); return result; } /** * 获取 全勤 * 1.(事+病+产+陪产+其他+年+婚+丧)假期天数≠0 * 2.补签流程表·是否全勤=否 * 3.当月入职、离职人员(可以根据月标准出勤天数/工时≠标准出勤天数/工时判断) * 4.迟到、早退次数/严重迟到早退次数、旷工天数>0 * 5.漏签次数>0 * @param fromDate * @param toDate * @param userid * @return */ public static String getPerfectAttendance(String fromDate, String toDate, String userid){ String result = "0"; // 获取 事+病+产+陪产+其他+年+婚+丧 假期天数 是否 大于0 boolean isSomeLeaveDays = checkSomeLeaveDays(fromDate, toDate, userid); // 补卡流程明细 是否全勤为 否 是否有数据 boolean isCardReplaceIsAllAttend = checkCardReplaceIsAllAttend(fromDate, toDate, userid); // 人员是否在 同一个月 入职、离职 boolean isRzAndLzIsSameMonth = checkIsRzAndLzIsSameMonth(fromDate, toDate, userid); // 日期范围内 是否有 迟到、早退、严重迟到、严重早退、旷工、漏签 boolean isAttendanceException = checkAttendanceException(fromDate, toDate, userid); if(isSomeLeaveDays || isCardReplaceIsAllAttend || isRzAndLzIsSameMonth || isAttendanceException){ result = "否"; }else{ result = "是"; } return result; } /** * 判断 日期范围内 是否有 迟到、早退、严重迟到、严重早退、旷工 * @param fromDate * @param toDate * @param userid * @return */ public static boolean checkAttendanceException(String fromDate, String toDate, String userid){ boolean bool = false; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(belate)as lates,sum(leaveeearly)as leaveeearlys,sum(gravebelate)as gravebelates,sum(graveleaveearly)as graveleaveearlys,sum(absenteeism)as absenteeisms,sum(forgotCheck)+sum(b.forgotBeginWorkCheck) as forgotChecks from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ String lates = Util.null2o(rs.getString("lates")); String leaveeearlys = Util.null2o(rs.getString("leaveeearlys")); String gravebelates = Util.null2o(rs.getString("gravebelates")); String graveleaveearlys = Util.null2o(rs.getString("graveleaveearlys")); String absenteeisms = Util.null2o(rs.getString("absenteeisms")); String forgotChecks = Util.null2o(rs.getString("forgotChecks")); if(floatCompare(lates,"0") > 0){ bool = true; break; }else if(floatCompare(leaveeearlys,"0") > 0){ bool = true; break; }else if(floatCompare(gravebelates,"0") > 0){ bool = true; break; }else if(floatCompare(graveleaveearlys,"0") > 0){ bool = true; break; }else if(floatCompare(absenteeisms,"0") > 0){ bool = true; break; }else if(floatCompare(forgotChecks,"0") > 0){ bool = true; break; } } return bool; } /** * 判断 人员是否在 同一个月 入职、离职 * @param fromDate * @param toDate * @param userid * @return */ public static boolean checkIsRzAndLzIsSameMonth(String fromDate, String toDate, String userid){ boolean bool = false; RecordSet rs = new RecordSet(); // 入职日期 String rzrq = getRzrq(userid); String rz_ny = rzrq.substring(0,7); // 离职日期 String lzrq = getLzrq(userid); if(lzrq != null && !"".equals(lzrq)){ String lz_ny = lzrq.substring(0,7); if(rz_ny.equals(lz_ny)){ bool = true; } } return bool; } /** * 获取 事+病+产+陪产+其他+年+婚+丧 假期天数 * @param fromDate * @param toDate * @param userid * @return */ public static boolean checkSomeLeaveDays(String fromDate, String toDate, String userid){ boolean result = false; RecordSet rs = new RecordSet(); //年假 假期类型id String annualleavetype = rs.getPropValue("lwgd_kqreport","annualleavetype"); //病假 假期类型id String sickleavetype = rs.getPropValue("lwgd_kqreport","sickleavetype"); //婚假 假期类型id String marriageleavetype = rs.getPropValue("lwgd_kqreport","marriageleavetype"); //丧假 假期类型id String bereavementleavetype = rs.getPropValue("lwgd_kqreport","bereavementleavetype"); //产假 假期类型id String maternityleavetype = rs.getPropValue("lwgd_kqreport","maternityleavetype"); //陪产假 假期类型id String paternityleavetype = rs.getPropValue("lwgd_kqreport","paternityleavetype"); //事假 假期类型id String leaveabsencetype = rs.getPropValue("lwgd_kqreport","leaveabsencetype"); //其他 假期类型id String otherleavetype = rs.getPropValue("lwgd_kqreport","otherleavetype"); // 年假 String annualleaveday = getLeaveDaysByType(annualleavetype, fromDate, toDate, userid); // 病假 String sickleaveday = getLeaveDaysByType(sickleavetype, fromDate, toDate, userid); // 婚假 String marriageleaveday = getLeaveDaysByType(marriageleavetype, fromDate, toDate, userid); // 丧假 String bereavementleaveday = getLeaveDaysByType(bereavementleavetype, fromDate, toDate, userid); // 产假 String maternityleaveday = getLeaveDaysByType(maternityleavetype, fromDate, toDate, userid); // 陪产假 String paternityleaveday = getLeaveDaysByType(paternityleavetype, fromDate, toDate, userid); // 事假 String leaveabsenceday = getLeaveDaysByType(leaveabsencetype, fromDate, toDate, userid); // 其他假 String otherleaveday = getLeaveDaysByType(otherleavetype, fromDate, toDate, userid); String somenums = floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(floatAdd(annualleaveday,sickleaveday),marriageleaveday),bereavementleaveday),maternityleaveday),paternityleaveday),leaveabsenceday),otherleaveday); if(floatCompare(somenums,"0") > 0){ result = true; } return result; } /** * 判断 补卡流程明细 是否全勤为 否 是否有数据 * @param fromDate * @param toDate * @param userid * @return */ public static boolean checkCardReplaceIsAllAttend(String fromDate, String toDate, String userid){ boolean bool = false; RecordSet rs = new RecordSet(); String table = rs.getPropValue("",""); String tableDt1 = table+"_dt1"; rs.executeQuery("select b.id from "+ table +" a,"+ tableDt1 +" b,workflow_requestbase c where a.requestid=c.requestid and a.id=b.mainid and c.currentnodetype='3' and b.sfqq='1' and b.xm=? and b.detail_signdate>=? and b.detail_signdate<=?",userid,fromDate,toDate); if(rs.next()){ bool = true; } return bool; } /** * 获取 实际出勤天数/工时 * 如果【工时制度】=标准工时制,【应出勤天数/工时】-【出差天数】-【旷工】-【调休天数】-【事假】 * 否则,【应出勤天数/工时】-(【出差天数】+【旷工】+【调休天数】+【事假】)*8+【加班费·本月加班工时/ONCALL工时】 * @param fromDate * @param toDate * @param userid * @return */ public static String getActualDayAndHour(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); //调休假 String compensatoryleavetype = rs.getPropValue("lwgd_kqreport","compensatoryleavetype"); //事假 String leaveabsencetype = rs.getPropValue("lwgd_kqreport","leaveabsencetype"); //工时制度 0为标准工时制、1为综合工时制-厂务、2为综合工时制-生产、仓管、图档 String usertype = getGszdId(userid); //应出勤天数 String workdays = getWorkDays(fromDate,toDate,userid); // 调休假天数 String compensatoryleaveday = getLeaveDaysByType(compensatoryleavetype, fromDate, toDate, userid); // 事假 String leaveabsenceday = getLeaveDaysByType(leaveabsencetype, fromDate, toDate, userid); // 矿工 String absenteeismsday = getAbsenteeisms(fromDate, toDate, userid); // 出差 String eventionday = getEvectionDays(fromDate, toDate, userid); // 【加班费·本月加班工时/ONCALL工时】 String overtimehoursthismonth = getOvertimeHourThisMonth(fromDate, toDate, userid); // String totalday = floatAdd(floatAdd(floatAdd(eventionday,absenteeismsday),compensatoryleaveday),leaveabsenceday); if("0".equals(usertype)){ result = floatSubtract(workdays,totalday); }else{ result = floatAdd(floatMultiply(floatSubtract(workdays,totalday),"8"),overtimehoursthismonth); } return result; } /** * 获取 法定节假日加班工时 【不关联调休·节假日加班(小时)】 * @param fromDate * @param toDate * @param userid * @return */ public static String getFdjjrjbsc(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(duration_min)as mins from KQ_FLOW_OVERTIME where paidleaveenable='0' and changetype='1' and resourceid=? and belongdate>=? and belongdate <=?",userid,fromDate,toDate); while(rs.next()){ String mins = Util.null2o(rs.getString("mins")); result = floatDivide(mins,"60"); } return result; } /** * 获取 旷工 次数 * @param fromDate * @param toDate * @param userid * @return */ public static String getAbsenteeisms(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(absenteeism)as count from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 获取 出差天数 * @param fromDate * @param toDate * @param userid * @return */ public static String getEvectionDays(String fromDate, String toDate, String userid){ String result = "0"; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(duration) as count from kq_flow_split_evection where belongdate >= ? and belongdate <= ? and resourceid = ? ",fromDate,toDate,userid); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 获取 班次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 a.serialid from kq_format_total a,kq_ShiftManagement b " + " where a.serialid=b.id and a.resourceid = ? and a.kqdate >= ? and a.kqdate <= ? and b.is_rest=0 ",userid,fromDate,toDate); while(rs.next()){ result = Util.null2String(rs.getString("serialid")); } return result; } /** * 获取 指定假期的时长 * @param type * @param fromdate * @param todate * @param userid * @return */ public static String getLeaveDaysByType(String type,String fromdate,String todate,String userid){ String result = "0"; RecordSet rs = new RecordSet(); String halfdays = "0"; String halfbackdays = "0"; // 假期 时长 rs.executeQuery("select sum(duration) as count from kq_flow_split_leave where belongdate >= ? and belongdate <= ? and newleavetype in ("+ type +") and resourceid = ? ",fromdate,todate,userid); while(rs.next()){ halfdays = Util.null2o(rs.getString("count")); } // 销假时长 rs.executeQuery("select sum(duration) as count from kq_flow_split_leaveback where belongdate >= ? and belongdate <= ? and newleavetype in ("+ type +") and resourceid = ? ",fromdate,todate,userid); while(rs.next()){ halfbackdays = Util.null2o(rs.getString("count")); } result = floatSubtract(halfdays,halfbackdays); return result; } /** * 获取 岗位名称 * @param userid * @return */ public static String getNewGw(String userid){ String result = ""; RecordSet rs = new RecordSet(); String gw_fieldid = rs.getPropValue("lwgd_kqreport","gw_fieldid"); String fieldvalue = getBaseCusFieldValue(userid,gw_fieldid); if(fieldvalue != null && !"".equals(fieldvalue)){ result = getGwname(fieldvalue); } return result; } /** * 获取 入职日期 * @param userid * @return */ public static String getRzrq(String userid){ String result = ""; RecordSet rs = new RecordSet(); String rzsj_fieldid = rs.getPropValue("lwgd_kqreport","rzsj_fieldid"); result = getWorkCusFieldValue(userid,rzsj_fieldid); return result; } /** * 获取 调动日期 * @param userid * @return */ public static String getTransferDate(String userid){ String result = ""; RecordSet rs = new RecordSet(); rs.executeQuery("select ksrq from uf_rzxxb where rzry=?",userid); if(rs.next()){ result = Util.null2String(rs.getString("ksrq")); } return result; } /** * 获取 离职日期 * @param userid * @return */ public static String getLzrq(String userid){ String result = ""; RecordSet rs = new RecordSet(); String lzrq_fieldid = rs.getPropValue("lwgd_kqreport","lzrq_fieldid"); result = getWorkCusFieldValue(userid,lzrq_fieldid); return result; } /** * 获取 迟到/早退(30分钟以内)/次 * 迟到(次)+早退(次) * @param fromDate * @param toDate * @param userid * @return */ public static double getBeLateLeaveEearly30(String fromDate, String toDate, String userid){ double result = 0.00; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(isnull(belate,0))+sum(isnull(leaveeearly,0)) as count from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.getDoubleValue(rs.getString("count"),0); } return result; } /** * 获取 迟到/早退(30分钟以上)/次 * 严重迟到(次)+严重早退(次) * @param fromDate * @param toDate * @param userid * @return */ public static double getBeLateLeaveEearly30More(String fromDate, String toDate, String userid){ double result = 0.00; RecordSet rs = new RecordSet(); rs.executeQuery("select sum(isnull(gravebelate,0))+sum(isnull(graveleaveearly,0)) as count from kq_format_total where resourceid=? and kqdate >= ? and kqdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.getDoubleValue(rs.getString("count"),0); } return result; } /** * 获取 签卡(次数)-am * 取【补卡流程表·签卡原因】=个人原因,签卡类型=上班卡 * 签卡类型 detail_signtype 0-上班卡 1-下班卡 * 签卡原因 bkyy 0-机器故障 1-入职补卡 2-工作日延长 3-个人原因 * @param fromDate * @param toDate * @param userid * @return */ public static String getQkcsam(String fromDate,String toDate,String userid){ String result = "0"; RecordSet rs = new RecordSet(); String table = rs.getPropValue("lwgd_kqreport","bklc_tablename"); String tableDt = table+"_dt1"; rs.executeQuery("select count(b.id)as count from "+ table +" a,"+tableDt+" b,workflow_requestbase c where a.requestid=c.requestid and a.id=b.mainid and c.currentnodetype=3 " + "and b.detail_signtype=0 and b.bkyy=3 and b.xm=? and b.detail_signdate >= ? and b.detail_signdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 获取 签卡(次数)-pm * 取【补卡流程表·签卡原因】=个人原因,签卡类型=上班卡 * 签卡类型 detail_signtype 0-上班卡 1-下班卡 * 签卡原因 bkyy 0-机器故障 1-入职补卡 2-工作日延长 3-个人原因 * @param fromDate * @param toDate * @param userid * @return */ public static String getQkcspm(String fromDate,String toDate,String userid){ String result = "0"; RecordSet rs = new RecordSet(); String table = rs.getPropValue("lwgd_kqreport","bklc_tablename"); String tableDt = table+"_dt1"; rs.executeQuery("select count(b.id)as count from "+ table +" a,"+tableDt+" b,workflow_requestbase c where a.requestid=c.requestid and a.id=b.mainid and c.currentnodetype=3 " + "and b.detail_signtype=1 and b.bkyy=3 and b.xm=? and b.detail_signdate >= ? and b.detail_signdate <= ?",userid,fromDate,toDate); while(rs.next()){ result = Util.null2o(rs.getString("count")); } return result; } /** * 获取 签卡(次数) * 签卡(次数)-am+签卡(次数)-pm * @param fromDate * @param toDate * @param userid * @return */ public static String getQkcs(String fromDate,String toDate,String userid){ String result = "0"; String qkcsam = getQkcsam(fromDate,toDate,userid); String qkcspm = getQkcspm(fromDate,toDate,userid); result = floatAdd(qkcsam,qkcspm); return result; } %>

Congratulation Mode 666666 !

sum <%=sum%>

本月加班工时 <%=byjbgs%>

本月调休工时 <%=bytxgs%>

上月加班结余工时 <%=syjbjygs%>

加班累计工时 <%=jbljgs%>