package com.engine.kq.biz; import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean; import com.engine.kq.entity.KQOvertimeRulesDetailEntity; import com.engine.kq.log.KQLog; import com.engine.kq.util.KQDurationCalculatorUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import weaver.conn.RecordSet; import weaver.general.BaseBean; import weaver.general.Util; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; import weaver.systeminfo.SystemEnv; import weaver.wechat.util.DateUtil; import java.math.BigDecimal; import java.util.*; /** * 加班规则的相关接口 */ public class KQOvertimeRulesBiz { private static KQLog logger = new KQLog();//用于记录日志信息 private static KQOvertimeRulesDetailEntity kqOvertimeRulesDetail = new KQOvertimeRulesDetailEntity();//加班规则实体类 /** * 根据指定人员ID以及指定日期判断这一天是工作日还是休息日还是节假日 * * @param resourceId 指定人员ID * 根据指定人员ID获取考勤组ID,根据考勤组得到对应日期是工作日还是休息日 * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日(这里综合考虑考勤组和节假日设置,节假日设置的优先级最高) * @return 1-节假日、2-工作日、3-休息日、-1-数据异常,无效数据 */ public static int getChangeType(String resourceId, String date) { int changeType = -1; /*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/ KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); String groupId = kqGroupMemberComInfo.getKQGroupId(resourceId, date); /*该人员不存在于任意一个考勤组中,请为其设置考勤组*/ if(groupId.equals("")){ logger.writeLog("该人员不存在于任意一个考勤组中,请为其设置考勤组。resourceId=" + resourceId + ",date=" + date); } changeType = KQHolidaySetBiz.getChangeType(groupId, date); if (changeType != 1 && changeType != 2 && changeType != 3) { KQWorkTime kqWorkTime = new KQWorkTime(); changeType = kqWorkTime.isWorkDay(resourceId, date) ? 2 : 3; } return changeType; } /** * 判断是否允许加班 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return 0-不允许加班、1-允许加班 */ public static int getOvertimeEnable(String resourceId, String date) { int overtimeEnable = 0; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); overtimeEnable = kqOvertimeRulesDetail.getOvertimeEnable(); return overtimeEnable; } /** * 获取加班方式计算 * 1-需审批,以审批单为准 * 2-需审批,以打卡为准,但是不能超过审批时长 * 3-无需审批,根据打卡时间计算加班时长 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return -1:接口异常,返回的无效数据。 */ public static int getComputingMode(String resourceId, String date) { int computingMode = -1; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); computingMode = kqOvertimeRulesDetail.getComputingMode(); return computingMode; } /** * 获取加班起算时间 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return -1:接口异常,返回的无效数据。 */ public static int getStartTime(String resourceId, String date) { int startTime = -1; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); startTime = kqOvertimeRulesDetail.getStartTime(); return startTime; } /** * 获取最小加班时长 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return -1:接口异常,返回的无效数据。 */ public static int getMinimumLen(String resourceId, String date) { int minimumUnit = -1; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); minimumUnit = kqOvertimeRulesDetail.getMinimumLen(); return minimumUnit; } /** * 是否允许加班补偿 * 0-不允许加班转调休、1-允许加班转调休 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return */ public static int getPaidLeaveEnable(String resourceId, String date) { int paidLeaveEnable = 0; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); paidLeaveEnable = kqOvertimeRulesDetail.getPaidLeaveEnable(); return paidLeaveEnable; } /** * 获取加班时长转调休时长比例中的分母 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return -1:接口异常,返回的无效数据。 */ public static double getLenOfOvertime(String resourceId, String date) { double lenOfOvertime = -1; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); lenOfOvertime = kqOvertimeRulesDetail.getLenOfOvertime(); BigDecimal bigDecimal = new BigDecimal(lenOfOvertime); lenOfOvertime = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return lenOfOvertime; } /** * 获取加班时长转调休时长比例中的分子 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return -1:接口异常,返回的无效数据。 */ public static double getLenOfLeave(String resourceId, String date) { double lenOfLeave = -1; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); lenOfLeave = kqOvertimeRulesDetail.getLenOfLeave(); BigDecimal bigDecimal = new BigDecimal(lenOfLeave); lenOfLeave = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return lenOfLeave; } /** * 判断是否需要排除休息时间 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return 0-不需要排除休息时间、1-需要排除休息时间 */ public static int getHasRestTime(String resourceId, String date) { int hasRestTime = 0; kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); hasRestTime = kqOvertimeRulesDetail.getHasRestTime(); return hasRestTime; } /** * 获取休息时段 * startType:0-开始时间为本日、1-开始时间为次日 * startTime:开始时间 * endType:0-结束时间为本日、1-结束时间为次日 * endTime:结束时间 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param date 指定日期 * 根据日期判断是工作日还是节假日还是休息日 * @return */ public static List getRestTimeList(String resourceId, String date) { List restTimeList = new ArrayList(); /** * 因为休息时段可以设置次日的数据,所以获取某一天的休息时段的时候,需要先考虑上一个日期所设置的次日的休息时段 */ String lastDay = DateUtil.addDay(date, -1, "yyyy-MM-dd"); kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, lastDay); int overtimeEnable = kqOvertimeRulesDetail.getOvertimeEnable(); int hasRestTime = kqOvertimeRulesDetail.getHasRestTime(); if (overtimeEnable == 1 && hasRestTime == 1) { int dayType = kqOvertimeRulesDetail.getDayType(); int ruleId = kqOvertimeRulesDetail.getRuleId(); String sql = "select * from kq_OvertimeRestTime where ruleId=" + ruleId + " and dayType=" + dayType; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); while (recordSet.next()) { String startType = recordSet.getString("startType"); String startTime = recordSet.getString("startTime"); String endType = recordSet.getString("endType"); String endTime = recordSet.getString("endTime"); if (startType.equals("0") && endType.equals("1")) { String[] str = new String[]{"00:00", endTime}; restTimeList.add(str); } else if (startType.equals("1") && endType.equals("1")) { String[] str = new String[]{startTime, endTime}; restTimeList.add(str); } } } kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, date); overtimeEnable = kqOvertimeRulesDetail.getOvertimeEnable(); hasRestTime = kqOvertimeRulesDetail.getHasRestTime(); if (overtimeEnable == 1 && hasRestTime == 1) { int dayType = kqOvertimeRulesDetail.getDayType(); int ruleId = kqOvertimeRulesDetail.getRuleId(); String sql = "select * from kq_OvertimeRestTime where ruleId=" + ruleId + " and dayType=" + dayType; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); while (recordSet.next()) { String startType = recordSet.getString("startType"); String startTime = recordSet.getString("startTime"); String endType = recordSet.getString("endType"); String endTime = recordSet.getString("endTime"); if (startType.equals("0") && endType.equals("0")) { String[] str = new String[]{startTime, endTime}; restTimeList.add(str); } else if (startType.equals("0") && endType.equals("1")) { String[] str = new String[]{startTime, "24:00"}; restTimeList.add(str); } } } return restTimeList; } /** * 获取加班规则的明细 * * @param resourceId 指定人员 * 根据人员ID获取人员所在的考勤组ID,找出对应的加班规则ID * @param changeType 日期类型:1-节假日、2-工作日、3-休息日 * @return */ private static KQOvertimeRulesDetailEntity getOvertimeRulesDetail(String resourceId, String date) { KQOvertimeRulesDetailEntity kqOvertimeRulesDetail = new KQOvertimeRulesDetailEntity(); try { /*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/ KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); String groupIds = kqGroupMemberComInfo.getKQGroupId(resourceId, date); if (groupIds.equals("")) { /*该人员不存在于任意一个考勤组中,请为其设置考勤组*/ logger.writeLog("该人员不存在于任意一个考勤组中,请为其设置考勤组。resourceId=" + resourceId + ",date=" + date); } int changeType = getChangeType(resourceId, date); /*获取当前日期的日期类型错误*/ if (changeType != 1 && changeType != 2 && changeType != 3) { logger.writeLog("获取当前日期的日期类型错误。resourceId=" + resourceId + ",date=" + date + ",changeType=" + changeType); } int overtimeRuleId = 0;//加班规则的ID RecordSet recordSet = new RecordSet(); String sql = "select id from kq_OvertimeRules where (isDelete is null or isDelete !=1) "; if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sql += " and ','+groupIds+',' like '%," + groupIds + ",%'"; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sql += " and concat(',',groupIds,',') like '%," + groupIds + ",%'"; } else { sql += " and ','||groupIds||',' like '%," + groupIds + ",%'"; } recordSet.executeQuery(sql); if (recordSet.next()) { overtimeRuleId = recordSet.getInt("id"); sql = "select * from kq_OvertimeRulesDetail where ruleId=" + overtimeRuleId + " and dayType=" + changeType; recordSet.executeQuery(sql); if (recordSet.next()) { int ruleId = recordSet.getInt("ruleId"); int dayType = recordSet.getInt("dayType"); int overtimeEnable = recordSet.getInt("overtimeEnable"); int computingMode = recordSet.getInt("computingMode"); int startTime = recordSet.getInt("startTime"); int minimumLen = recordSet.getInt("minimumLen"); int paidLeaveEnable = recordSet.getInt("paidLeaveEnable"); double lenOfOvertime = Util.getDoubleValue(recordSet.getString("lenOfOvertime"), 1.00); double lenOfLeave = Util.getDoubleValue(recordSet.getString("lenOfLeave"), 1.00); int hasRestTime = Util.getIntValue(recordSet.getString("hasRestTime")); kqOvertimeRulesDetail.setRuleId(ruleId); kqOvertimeRulesDetail.setDayType(dayType); kqOvertimeRulesDetail.setOvertimeEnable(overtimeEnable); kqOvertimeRulesDetail.setComputingMode(computingMode); kqOvertimeRulesDetail.setStartTime(startTime); kqOvertimeRulesDetail.setMinimumLen(minimumLen); kqOvertimeRulesDetail.setPaidLeaveEnable(paidLeaveEnable); kqOvertimeRulesDetail.setLenOfOvertime(lenOfOvertime); kqOvertimeRulesDetail.setLenOfLeave(lenOfLeave); kqOvertimeRulesDetail.setHasRestTime(hasRestTime); } } else { logger.writeLog("该人员所属的考勤组没有设置过任何加班规则,请为其设置加班规则。resourceId=" + resourceId + ",date="+date+",changeType=" + changeType); } } catch (Exception e) { logger.writeLog("根据人员ID获取加班规则的规则内容出错。resourceId=" + resourceId + ",date=" + date); e.printStackTrace(); } return kqOvertimeRulesDetail; } /** * 新建加班规则 * * @param params * @return */ public static int addOvertimeRules(Map params, User user) { /*是否保存成功*/ boolean flag = false; /*新插入的加班规则的ID*/ int ruleId = -1; try { boolean canAdd = HrmUserVarify.checkUserRight("KQOvertimeRulesAdd:Add", user);//是否具有新建权限 if (!canAdd) { logger.info(user.getLastname() + "暂时没有权限!"); return -1; } /*加班规则名称*/ String name = Util.null2String(params.get("name")); /*考勤组的ID*/ String groupIds = Util.null2String(params.get("groupIds")); /*工作日是否允许加班:0-不允许、1-允许*/ int overtimeEnable2 = Util.getIntValue((String) params.get("overtimeEnable2"), 1); /*工作日的加班方式:1-需审批,以审批单为准、2-需审批,以打卡为准,但是不能超过审批时长、3-无需审批,根据打卡时间计算加班时长*/ int computingMode2 = Util.getIntValue((String) params.get("computingMode2"), 1); /*工作日下班多少分钟后开始计算加班*/ int startTime2 = Util.getIntValue((String) params.get("startTime2"), 30); /*工作日最小加班时长*/ int minimumLen2 = Util.getIntValue((String) params.get("minimumLen2"), 30); /*工作日是否允许加班转调休*/ int paidLeaveEnable2 = Util.getIntValue((String) params.get("paidLeaveEnable2"), 0); /*工作日加班转调休比例中的加班时长*/ int lenOfOvertime2 = Util.getIntValue((String) params.get("lenOfOvertime2"), 1); /*工作日加班转调休比例中的调休时长*/ int lenOfLeave2 = Util.getIntValue((String) params.get("lenOfLeave2"), 1); /*休息日是否允许加班:0-不允许、1-允许*/ int overtimeEnable3 = Util.getIntValue((String) params.get("overtimeEnable3"), 1); /*休息日的加班方式:1-需审批,以审批单为准、2-需审批,以打卡为准,但是不能超过审批时长、3-无需审批,根据打卡时间计算加班时长*/ int computingMode3 = Util.getIntValue((String) params.get("computingMode3"), 1); /*休息日的最小加班时长*/ int minimumLen3 = Util.getIntValue((String) params.get("minimumLen3"), 30); /*休息日是否允许加班转调休*/ int paidLeaveEnable3 = Util.getIntValue((String) params.get("paidLeaveEnable3"), 0); /*休息日加班转调休比例中的加班时长*/ int lenOfOvertime3 = Util.getIntValue((String) params.get("lenOfOvertime3"), 1); /*休息日加班转调休比例中的调休时长*/ int lenOfLeave3 = Util.getIntValue((String) params.get("lenOfLeave3"), 1); /*休息日是否有休息时间*/ int hasRestTime3 = Util.getIntValue((String) params.get("hasRestTime3"), 0); /*节假日是否允许加班:0-不允许、1-允许*/ int overtimeEnable1 = Util.getIntValue((String) params.get("overtimeEnable1"), 1); /*节假日的加班方式:1-需审批,以审批单为准、2-需审批,以打卡为准,但是不能超过审批时长、3-无需审批,根据打卡时间计算加班时长*/ int computingMode1 = Util.getIntValue((String) params.get("computingMode1"), 1); /*节假日的最小加班时长*/ int minimumLen1 = Util.getIntValue((String) params.get("minimumLen1"), 30); /*节假日是否允许加班转调休*/ int paidLeaveEnable1 = Util.getIntValue((String) params.get("paidLeaveEnable1"), 0); /*节假日加班转调休比例中的加班时长*/ int lenOfOvertime1 = Util.getIntValue((String) params.get("lenOfOvertime1"), 1); /*节假日加班转调休比例中的调休时长*/ int lenOfLeave1 = Util.getIntValue((String) params.get("lenOfLeave1"), 1); /*节假日是否有休息时间*/ int hasRestTime1 = Util.getIntValue((String) params.get("hasRestTime1"), 0); int paidLeaveEnableType2 = Util.getIntValue((String) params.get("paidLeaveEnableType2"), 2); int paidLeaveEnableType3 = Util.getIntValue((String) params.get("paidLeaveEnableType3"), 2); int paidLeaveEnableType1 = Util.getIntValue((String) params.get("paidLeaveEnableType1"), 2); int paidLeaveEnableFlowType2 = Util.getIntValue((String) params.get("paidLeaveEnableFlowType2"), 1); int paidLeaveEnableFlowType3 = Util.getIntValue((String) params.get("paidLeaveEnableFlowType3"), 1); int paidLeaveEnableFlowType1 = Util.getIntValue((String) params.get("paidLeaveEnableFlowType1"), 1); /*获取今天的日期*/ Calendar today = Calendar.getInstance(); String currentDate = Util.add0(today.get(Calendar.YEAR), 4) + "-" + Util.add0(today.get(Calendar.MONTH) + 1, 2) + "-" + Util.add0(today.get(Calendar.DAY_OF_MONTH), 2); String tomorrowDate = weaver.common.DateUtil.addDate(currentDate, 1); /*校验休息日排除休息时间的设置是否正确*/ if (hasRestTime3 == 1) { int restTimeLen3 = Util.getIntValue((String) params.get("restTimeLen3"), 0); List fromList = new ArrayList(); List toList = new ArrayList(); for (int i = 0; i < restTimeLen3; i++) { String startType = "0"; String startTime = Util.getIntValues((String) params.get("startTime3_" + i)); String endType = "0"; String endTime = Util.getIntValues((String) params.get("endTime3_" + i)); String fromDateTime = (startType.equals("0") ? currentDate : tomorrowDate) + " " + startTime + ":00"; String toDateTime = (endType.equals("0") ? currentDate : tomorrowDate) + " " + endTime + ":00"; if (fromDateTime.compareTo(toDateTime) > 0) { logger.info("结束时间必须大于开始时间,fromDateTime=" + fromDateTime + ",toDateTime=" + toDateTime); return -1; } fromList.add(fromDateTime); toList.add(toDateTime); } /*利用冒泡法对日期时间进行排序*/ for (int i = 0; i < fromList.size(); i++) { for (int j = 0; j < fromList.size() - i - 1; j++) { if (fromList.get(j).compareTo(fromList.get(j + 1)) > 0) { String str = fromList.get(j); fromList.set(j, fromList.get(j + 1)); fromList.set(j + 1, str); str = toList.get(j); toList.set(j, toList.get(j + 1)); toList.set(j + 1, str); } } } /*根据排序后的数据判断是否时间段有重叠*/ for (int i = 0; i < fromList.size() - 1; i++) { if (fromList.get(i + 1).compareTo(toList.get(i)) < 0) { logger.info("休息时段不能交叉"); return -1; } } } /*校验休息日排除休息时间的设置是否正确*/ if (hasRestTime1 == 1) { int restTimeLen1 = Util.getIntValue((String) params.get("restTimeLen1"), 0); List fromList = new ArrayList(); List toList = new ArrayList(); for (int i = 0; i < restTimeLen1; i++) { String startType = "0"; String startTime = Util.getIntValues((String) params.get("startTime1_" + i)); String endType = "0"; String endTime = Util.getIntValues((String) params.get("endTime1_" + i)); String fromDateTime = (startType.equals("0") ? currentDate : tomorrowDate) + " " + startTime + ":00"; String toDateTime = (endType.equals("0") ? currentDate : tomorrowDate) + " " + endTime + ":00"; if (fromDateTime.compareTo(toDateTime) > 0) { logger.info("结束时间必须大于开始时间:fromDateTime=" + fromDateTime + ",toDateTime=" + toDateTime); return -1; } fromList.add(fromDateTime); toList.add(toDateTime); } /*利用冒泡法对日期时间进行排序*/ for (int i = 0; i < fromList.size(); i++) { for (int j = 0; j < fromList.size() - i - 1; j++) { if (fromList.get(j).compareTo(fromList.get(j + 1)) > 0) { String str = fromList.get(j); fromList.set(j, fromList.get(j + 1)); fromList.set(j + 1, str); str = toList.get(j); toList.set(j, toList.get(j + 1)); toList.set(j + 1, str); } } } /*根据排序后的数据判断是否时间段有重叠*/ for (int i = 0; i < fromList.size() - 1; i++) { if (fromList.get(i + 1).compareTo(toList.get(i)) < 0) { logger.info("休息时段不能交叉"); return -1; } } } String sql = "insert into kq_OvertimeRules(name,groupIds,isDelete) values(?,?,0)"; RecordSet recordSet = new RecordSet(); flag = recordSet.executeUpdate(sql, name, groupIds); if (!flag) { logger.info("加班规则保存失败");//保存失败 return -1; } sql = "select max(id) maxId from kq_OvertimeRules"; recordSet.executeQuery(sql); if (recordSet.next()) { ruleId = recordSet.getInt("maxId"); } if (ruleId != 0) { sql = "insert into kq_OvertimeRulesDetail(ruleId,dayType,overtimeEnable,computingMode,startTime,minimumLen,paidLeaveEnable,lenOfOvertime,lenOfLeave,hasRestTime,paidleaveenabletype,paidleaveenableflowtype) " + "values(?,?,?,?,?,?,?,?,?,?,?,?)"; /** * 保存工作日加班规则 */ flag = recordSet.executeUpdate(sql, ruleId, 2, overtimeEnable2, computingMode2, startTime2, minimumLen2, paidLeaveEnable2, lenOfOvertime2, lenOfLeave2, 0,paidLeaveEnableType2,paidLeaveEnableFlowType2); if (!flag) { logger.info("工作日加班规则保存失败");//保存失败 return -1; } /** * 保存休息日加班规则 */ flag = recordSet.executeUpdate(sql, ruleId, 3, overtimeEnable3, computingMode3, 0, minimumLen3, paidLeaveEnable3, lenOfOvertime3, lenOfLeave3, hasRestTime3,paidLeaveEnableType3,paidLeaveEnableFlowType3); if (!flag) { logger.info("休息日加班规则保存失败");//保存失败 return -1; } if (hasRestTime3 == 1) { int restTimeLen3 = Util.getIntValue((String) params.get("restTimeLen3"), 0); for (int i = 0; i < restTimeLen3; i++) { String startType = "0"; String startTime = Util.getIntValues((String) params.get("startTime3_" + i)); String endType = "0"; String endTime = Util.getIntValues((String) params.get("endTime3_" + i)); String restTimeSql = "insert into kq_OvertimeRestTime(ruleId,dayType,startType,startTime,endType,endTime) values(?,?,?,?,?,?)"; flag = recordSet.executeUpdate(restTimeSql, ruleId, 3, startType, startTime, endType, endTime); if (!flag) { logger.info("休息日加班规则休息时段保存失败");//保存失败 return -1; } } } /** * 保存节假日加班规则 */ flag = recordSet.executeUpdate(sql, ruleId, 1, overtimeEnable1, computingMode1, 0, minimumLen1, paidLeaveEnable1, lenOfOvertime1, lenOfLeave1, hasRestTime1,paidLeaveEnableType1,paidLeaveEnableFlowType1); if (!flag) { logger.info("节假日加班规则保存失败"); return -1; } if (hasRestTime1 == 1) { int restTimeLen1 = Util.getIntValue((String) params.get("restTimeLen1"), 0); for (int i = 0; i < restTimeLen1; i++) { String startType = "0"; String startTime = Util.getIntValues((String) params.get("startTime1_" + i)); String endType = "0"; String endTime = Util.getIntValues((String) params.get("endTime1_" + i)); String restTimeSql = "insert into kq_OvertimeRestTime(ruleId,dayType,startType,startTime,endType,endTime) values(?,?,?,?,?,?)"; flag = recordSet.executeUpdate(restTimeSql, ruleId, 1, startType, startTime, endType, endTime); if (!flag) { logger.info("节假日加班规则休息时段保存失败"); return -1; } } } } } catch (Exception e) { ruleId = -1; } return ruleId; } /************************************************加班单位的相关接口************************************************/ /** * 获取最小加班单位 * 1-按天加班 * 2-按半天加班 * 3-按小时加班 * 4-按整天加班 * 5-按半小时加班 * 6-按整小时加班 * @return -1:接口异常,返回的无效数据。 */ public static int getMinimumUnit() { int minimumUnit = -1; String sql = "select * from kq_OvertimeUnit where (isDelete is null or isDelete !=1) and id=1"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); if (recordSet.next()) { minimumUnit = recordSet.getInt("minimumUnit"); } return minimumUnit; } /** * 获取最小加班单位 * 1-按天加班 * 2-按半天加班 * 3-按小时加班 * 4-按整天加班 * 5-按半小时加班 * 6-按整小时加班 * @return -1:接口异常,返回的无效数据。 */ public static Map getMinimumUnitAndConversion() { Map map = Maps.newHashMap(); int minimumUnit = -1; int overtimeConversion = -1; String sql = "select * from kq_OvertimeUnit where (isDelete is null or isDelete !=1) and id=1"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); if (recordSet.next()) { minimumUnit = recordSet.getInt("minimumUnit"); overtimeConversion = recordSet.getInt("overtimeConversion"); map.put("minimumUnit", ""+minimumUnit); map.put("overtimeConversion", ""+overtimeConversion); } return map; } /** * 获取加班单位的日折算时长 * * @return -1:接口异常,返回的无效数据。 */ public static double getHoursToDay() { double hoursToDay = -1.00; String sql = "select * from kq_OvertimeUnit where (isDelete is null or isDelete !=1) and id=1"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); if (recordSet.next()) { hoursToDay = recordSet.getDouble("hoursToDay"); } BigDecimal bigDecimal = new BigDecimal(hoursToDay); return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 获取半天显示类型,是时间还是下拉框 * 半天单位 时间选择方式:1-下拉框选择 、2-具体时间 * @return */ public static String getTimeselection() { int timeselection = 1; String sql = "select * from kq_OvertimeUnit where (isDelete is null or isDelete !=1) and id=1"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); if (recordSet.next()) { timeselection = recordSet.getInt("timeselection"); } if(timeselection == 1 || timeselection == 2){ return ""+timeselection; }else{ return "1"; } } /** * 获取加班所有需要的数据 * @param resourceId * @param date * @param changeTypeMap * @return */ public static void getOverTimeData(String resourceId, String date, Map changeTypeMap,Map overRulesDetailMap,Map> restTimeMap,Map computingModeMap) { int changeType = -1; /*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/ KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); String groupId = Util.null2s(kqGroupMemberComInfo.getKQGroupId(resourceId, date),""); /*该人员不存在于任意一个考勤组中,请为其设置考勤组*/ if(groupId.length() == 0){ logger.writeLog("该人员不存在于任意一个考勤组中,请为其设置考勤组。resourceId=" + resourceId + ",date=" + date); return ; } changeType = KQHolidaySetBiz.getChangeType(groupId, date); if (changeType != 1 && changeType != 2 && changeType != 3) { KQWorkTime kqWorkTime = new KQWorkTime(); changeType = kqWorkTime.isWorkDay(resourceId, date) ? 2 : 3; } String change_key = date+"_"+resourceId; changeTypeMap.put(change_key, changeType); List restTimeList = new ArrayList(); int overtimeRuleId = 0;//加班规则的ID RecordSet recordSet = new RecordSet(); String sql = "select id from kq_OvertimeRules where (isDelete is null or isDelete !=1) "; if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sql += " and ','+groupIds+',' like '%," + groupId + ",%'"; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sql += " and concat(',',groupIds,',') like '%," + groupId + ",%'"; } else { sql += " and ','||groupIds||',' like '%," + groupId + ",%'"; } recordSet.executeQuery(sql); if (recordSet.next()) { overtimeRuleId = recordSet.getInt("id"); sql = "select * from kq_OvertimeRulesDetail where ruleId=" + overtimeRuleId + " and dayType=" + changeType; recordSet.executeQuery(sql); if (recordSet.next()) { int id = recordSet.getInt("id"); int ruleId = recordSet.getInt("ruleId"); int dayType = recordSet.getInt("dayType"); int overtimeEnable = recordSet.getInt("overtimeEnable"); int computingMode = recordSet.getInt("computingMode"); int startTime = recordSet.getInt("startTime"); int minimumLen = recordSet.getInt("minimumLen"); int paidLeaveEnable = recordSet.getInt("paidLeaveEnable"); double lenOfOvertime = Util.getDoubleValue(recordSet.getString("lenOfOvertime"), 1.00); double lenOfLeave = Util.getDoubleValue(recordSet.getString("lenOfLeave"), 1.00); int hasRestTime = Util.getIntValue(recordSet.getString("hasRestTime")); int before_startTime = recordSet.getInt("before_startTime"); int paidLeaveEnableType = recordSet.getInt("paidLeaveEnableType"); int paidLeaveEnableDefaultType = recordSet.getInt("paidLeaveEnableDefaultType"); int paidLeaveEnableFlowType = recordSet.getInt("paidLeaveEnableFlowType"); int restTimeType = recordSet.getInt("restTimeType"); int has_cut_point = Util.getIntValue(Util.null2s(recordSet.getString("has_cut_point"),"0"),0); if(paidLeaveEnableType <= 0){ paidLeaveEnableType = 1; } if(paidLeaveEnableDefaultType <= 0){ paidLeaveEnableDefaultType = 1; } if(paidLeaveEnableFlowType <= 0){ paidLeaveEnableFlowType = 1; } if(paidLeaveEnableType == 1 && paidLeaveEnable == 0){ //如果就没有开启关联调休,那么默认的加班转调休方式就是第一种 paidLeaveEnableDefaultType = 1; } if(restTimeType <= 0){ restTimeType = 1; } String cut_point = Util.null2s(recordSet.getString("cut_point"),""); String key = date+"_"+changeType; KQOvertimeRulesDetailEntity kqOvertimeRulesDetail = new KQOvertimeRulesDetailEntity(); kqOvertimeRulesDetail.setRuleId(ruleId); kqOvertimeRulesDetail.setDayType(dayType); kqOvertimeRulesDetail.setOvertimeEnable(overtimeEnable); kqOvertimeRulesDetail.setComputingMode(computingMode); kqOvertimeRulesDetail.setStartTime(startTime); kqOvertimeRulesDetail.setMinimumLen(minimumLen); kqOvertimeRulesDetail.setPaidLeaveEnable(paidLeaveEnable); kqOvertimeRulesDetail.setLenOfOvertime(lenOfOvertime); kqOvertimeRulesDetail.setLenOfLeave(lenOfLeave); kqOvertimeRulesDetail.setHasRestTime(hasRestTime); kqOvertimeRulesDetail.setBefore_startTime(before_startTime); kqOvertimeRulesDetail.setCut_point(cut_point); kqOvertimeRulesDetail.setHas_cut_point(has_cut_point); kqOvertimeRulesDetail.setId(id); kqOvertimeRulesDetail.setPaidLeaveEnableType(paidLeaveEnableType); kqOvertimeRulesDetail.setPaidLeaveEnableDefaultType(paidLeaveEnableDefaultType); kqOvertimeRulesDetail.setPaidLeaveEnableFlowType(paidLeaveEnableFlowType); kqOvertimeRulesDetail.setRestTimeType(restTimeType); overRulesDetailMap.put(key, kqOvertimeRulesDetail); computingModeMap.put(key, computingMode); /** * 因为休息时段可以设置次日的数据,所以获取某一天的休息时段的时候,需要先考虑上一个日期所设置的次日的休息时段 */ String lastDay = DateUtil.addDay(date, -1, "yyyy-MM-dd"); KQOvertimeRulesDetailEntity pre_kqOvertimeRulesDetail = getOvertimeRulesDetail(resourceId, lastDay); int pre_overtimeEnable = pre_kqOvertimeRulesDetail.getOvertimeEnable(); int pre_hasRestTime = pre_kqOvertimeRulesDetail.getHasRestTime(); if (pre_overtimeEnable == 1 && pre_hasRestTime == 1) { int pre_dayType = pre_kqOvertimeRulesDetail.getDayType(); int pre_ruleId = pre_kqOvertimeRulesDetail.getRuleId(); sql = "select * from kq_OvertimeRestTime where ruleId=" + pre_ruleId + " and dayType=" + pre_dayType; RecordSet recordSet1 = new RecordSet(); recordSet1.executeQuery(sql); while (recordSet1.next()) { String startType = recordSet1.getString("startType"); String startTime1 = recordSet1.getString("startTime"); String endType = recordSet1.getString("endType"); String endTime = recordSet1.getString("endTime"); if (startType.equals("0") && endType.equals("1")) { String[] str = new String[]{"00:00", endTime}; restTimeList.add(str); } else if (startType.equals("1") && endType.equals("1")) { String[] str = new String[]{startTime1, endTime}; restTimeList.add(str); } } } overtimeEnable = kqOvertimeRulesDetail.getOvertimeEnable(); hasRestTime = kqOvertimeRulesDetail.getHasRestTime(); restTimeType = kqOvertimeRulesDetail.getRestTimeType(); if (overtimeEnable == 1 && hasRestTime == 1) { if(restTimeType == 1){ sql = "select * from kq_OvertimeRestTime where ruleId=" + ruleId + " and dayType=" + dayType; RecordSet recordSet1 = new RecordSet(); recordSet1.executeQuery(sql); while (recordSet1.next()) { String startType = recordSet1.getString("startType"); String startTime1 = recordSet1.getString("startTime"); String endType = recordSet1.getString("endType"); String endTime = recordSet1.getString("endTime"); if (startType.equals("0") && endType.equals("0")) { String[] str = new String[]{startTime1, endTime}; restTimeList.add(str); } else if (startType.equals("0") && endType.equals("1")) { String[] str = new String[]{startTime1, "24:00"}; restTimeList.add(str); } } }else{ sql = "select * from kq_OvertimeRestlength where ruleId=" + ruleId + " and dayType=" + dayType+" order by dsporder "; RecordSet recordSet1 = new RecordSet(); recordSet1.executeQuery(sql); while (recordSet1.next()) { String overlength = Util.null2String(recordSet1.getString("overlength")); String cutlength = Util.null2String(recordSet1.getString("cutlength")); if(overlength.length() > 0 && cutlength.length() > 0){ String[] str = new String[]{overlength, cutlength}; restTimeList.add(str); } } } } restTimeMap.put(key, restTimeList); } } else { logger.writeLog("该人员所属的考勤组没有设置过任何加班规则,请为其设置加班规则。resourceId=" + resourceId + ",date="+date+",changeType=" + changeType); } return ; } /** * 按加班时长范围设置转调休时长 * 按照加班时长从大到小排序 取到最大的满足了,那么调休就直接按照这个来转调休了 */ public Map> getBalanceLengthDetailMap(int ruleDetailid){ Map> balanceLengthDetailMap = Maps.newHashMap(); RecordSet recordSet = new RecordSet(); List overtimelengthList = Lists.newArrayList(); List balancelengthList = Lists.newArrayList(); String sql = "select * from kq_OvertimeBalanceLengthDetail where rulesdetailid= ? order by overtimelength desc "; recordSet.executeQuery(sql, ruleDetailid); while (recordSet.next()){ String overtimelength = recordSet.getString("overtimelength"); String balancelength = recordSet.getString("balancelength"); overtimelengthList.add(overtimelength); balancelengthList.add(balancelength); } if(!overtimelengthList.isEmpty() && !balancelengthList.isEmpty()){ balanceLengthDetailMap.put("overtimelengthList", overtimelengthList); balanceLengthDetailMap.put("balancelengthList", balancelengthList); return balanceLengthDetailMap; } return balanceLengthDetailMap; } /** * 按加班的时间段设置转调休时长 */ public Map> getBalanceTimeDetailMap(int ruleDetailid){ Map> balanceTimethDetailMap = Maps.newHashMap(); RecordSet recordSet = new RecordSet(); List idList = Lists.newArrayList(); List timepointList = Lists.newArrayList(); List lenOfOvertimeList = Lists.newArrayList(); List lenOfLeaveList = Lists.newArrayList(); String sql = "select * from kq_OvertimeBalanceTimeDetail where rulesdetailid= ? order by dsporder "; recordSet.executeQuery(sql, ruleDetailid); while (recordSet.next()){ String id = recordSet.getString("id"); String timepoint = recordSet.getString("timepoint"); String lenOfOvertime = recordSet.getString("lenOfOvertime"); String lenOfLeave = recordSet.getString("lenOfLeave"); idList.add(id); timepointList.add(timepoint); lenOfOvertimeList.add(lenOfOvertime); lenOfLeaveList.add(lenOfLeave); } if(!timepointList.isEmpty() && !lenOfOvertimeList.isEmpty() && !lenOfLeaveList.isEmpty()){ balanceTimethDetailMap.put("idList", idList); balanceTimethDetailMap.put("timepointList", timepointList); balanceTimethDetailMap.put("lenOfOvertimeList", lenOfOvertimeList); balanceTimethDetailMap.put("lenOfLeaveList", lenOfLeaveList); return balanceTimethDetailMap; } return balanceTimethDetailMap; } }