package com.engine.kq.biz; import com.alibaba.fastjson.JSONObject; import com.api.hrm.util.ServiceUtil; import com.engine.kq.entity.KQBalanceOfLeaveEntity; import com.engine.kq.log.KQLog; import com.engine.kq.util.KQTransMethod; import com.weaver.general.TimeUtil; import org.apache.commons.lang.StringUtils; import weaver.conn.RecordSet; import weaver.general.StringUtil; import weaver.general.Util; import weaver.hrm.User; import weaver.hrm.common.Tools; import weaver.hrm.resource.ResourceComInfo; import weaver.systeminfo.SystemEnv; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class KQLeaveRulesBiz { public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); /** * 记录日志 */ private static KQLog logger = new KQLog(); /** * 根据假期规则ID获取假期规则名称 * * @param ruleId 假期规则的ID * @return */ public static String getLeaveName(String ruleId) { String leaveName = ""; KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); leaveName = kqLeaveRulesComInfo.getLeaveName(ruleId); return leaveName; } /** * 判断是否具有假期余额 * * @param ruleId * @return */ public static boolean getBalanceEnable(String ruleId) { int balanceEnable = 0; KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); balanceEnable = Util.getIntValue(kqLeaveRulesComInfo.getBalanceEnable(ruleId), 0); if (balanceEnable == 1) { return true; } else { return false; } } /** * 判断优先假期类型id字符串 * * @param ruleId * @return */ public static String getLeaveids(String ruleId) { int schevacationON = 0; String schevacation = "-1"; KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); schevacationON = Util.getIntValue(kqLeaveRulesComInfo.getSchevacationON(ruleId), 0); if (schevacationON == 1) { schevacation=Util.null2s(kqLeaveRulesComInfo.getSchevacation(ruleId), "-1"); } return schevacation; } /** * 判断人员的假期类型id字符串 * * @param scheLeaveids * @param resourceId * @return */ public static String getusedLeaveids(String scheLeaveids, String resourceId) { try { ResourceComInfo resourceComInfo = new ResourceComInfo(); String subcompanyId = resourceComInfo.getSubCompanyID(resourceId); String departmentId = resourceComInfo.getDepartmentID(resourceId); List scheLeaveidsList = Util.splitString2List(scheLeaveids, ","); /** * 加载应用范围为总部的以及应用范围为分部(但是范围中包含了所属分部ID)的假期规则 */ RecordSet recordSet = new RecordSet(); String sql = "select * from kq_LeaveRules "; String sqlWhere = " where (isDelete is null or isDelete <>1) and isEnable=1 and balanceEnable=1 "; /*如果找不到人员所在分部,则只返回应用范围为总部的假期规则*/ if (!resourceId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere += " and ( (scopeType=3 and ','+scopeValue+',' like '%," + resourceId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere += " and ( (scopeType=3 and concat(',',scopeValue,',') like '%," + resourceId + ",%') "; } else { sqlWhere += " and ( (scopeType=3 and ','||scopeValue||',' like '%," + resourceId + ",%') "; } } if (!departmentId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere += " or (scopeType=2 and ','+scopeValue+',' like '%," + departmentId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere += " or (scopeType=2 and concat(',',scopeValue,',') like '%," + departmentId + ",%') "; } else { sqlWhere += " or (scopeType=2 and ','||scopeValue||',' like '%," + departmentId + ",%') "; } } if (!subcompanyId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere += " or (scopeType=1 and ','+scopeValue+',' like '%," + subcompanyId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere += " or (scopeType=1 and concat(',',scopeValue,',') like '%," + subcompanyId + ",%') "; } else { sqlWhere += " or (scopeType=1 and ','||scopeValue||',' like '%," + subcompanyId + ",%') "; } } sqlWhere += " or scopeType=0 )"; sql = sql + sqlWhere + " order by showOrder,id "; scheLeaveids = ""; List remleaveidsList = new ArrayList<>(); recordSet.executeQuery(sql); /*如果指定人员所在分部下面单独设置过假期规则,则取分部下面的假期规则*/ while (recordSet.next()) { String leaveid = recordSet.getString("id");//假期类型id remleaveidsList.add(leaveid); } for (String id : scheLeaveidsList) { if (remleaveidsList.contains(id)) { if (scheLeaveids.equals("")) { scheLeaveids = id; } else { scheLeaveids += "," + id; } } } } catch (Exception e) { e.printStackTrace(); } return scheLeaveids; } /** * 获取最小请假单位 * 1-按天请假 * 2-按半天请假 * 3-按小时请假 * 4-按整天请假 * 其他:无效数据 * * @param ruleId 指定的假期规则ID * @return */ public static int getMinimumUnit(String ruleId) { int minimumUnit = -1;//最小请假单位 KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); minimumUnit = Util.getIntValue(kqLeaveRulesComInfo.getMinimumUnit(ruleId), -1); return minimumUnit; } /** * 获取请假时长计算方式 * 1-按照工作日计算请假时长 * 2-按照自然日计算请假时长 * 其他:无效数据 * * @param ruleId 指定的假期规则ID * @return */ public static int getComputingMode(String ruleId) { int computingMode = -1;//计算请假时长方式 KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); computingMode = Util.getIntValue(kqLeaveRulesComInfo.getComputingMode(ruleId), -1); return computingMode; } /** * 按照自然日计算请假时长排除节假日、休息日 * 0-不排除 * 1-排除节假日 * 2-排除休息日 * 1,2-排除节假日和休息日 * * @param ruleId 指定的假期规则ID * @return */ public static String getFilterHolidays(String ruleId) { KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); String filterHolidays = Util.null2s(kqLeaveRulesComInfo.getFilterHolidays(ruleId), "0"); return filterHolidays; } /** * 获取日折算时长(多少小时算一天) * * @param ruleId 指定的假期规则ID * @return */ public static String getHoursToDay(String ruleId) { double hoursToDay = -1;//日折算时长 int computingMode = -1;//计算请假时长方式 int minimumUnit = -1;//最小请假单位 KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); hoursToDay = Util.getDoubleValue(kqLeaveRulesComInfo.getHoursToDay(ruleId), -1); computingMode = Util.getIntValue(kqLeaveRulesComInfo.getComputingMode(ruleId), -1); minimumUnit = Util.getIntValue(kqLeaveRulesComInfo.getMinimumUnit(ruleId), -1); if (computingMode != 2) { hoursToDay = -1; } return String.format("%.2f", hoursToDay); } /** * 1-按天请假 * 2-按半天请假 * 3-按小时请假 * 4-按整天请假 * * @param minimumUnit * @param lan * @return */ public static String getMinimumUnitName(String minimumUnit, int lan) { String minimumUnitName = ""; switch (minimumUnit) { case "1": minimumUnitName = SystemEnv.getHtmlLabelName(1925, lan); break; case "2": minimumUnitName = SystemEnv.getHtmlLabelName(1925, lan); break; case "3": case "5": case "6": minimumUnitName = SystemEnv.getHtmlLabelName(391, lan); break; case "4": minimumUnitName = SystemEnv.getHtmlLabelName(1925, lan); break; default: break; } return minimumUnitName; } /** * 获取所有的假期规则 * unitType:1-按天请假、2-按半天请假、3-按小时请假、4-按整天请假、-1:数据异常,无效数据 * * @return */ public static List> getAllLeaveRules() { Map ruleMap = new HashMap(); List> ruleList = new ArrayList>(); KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); kqLeaveRulesComInfo.setTofirstRow(); while (kqLeaveRulesComInfo.next()) { if (kqLeaveRulesComInfo.getIsEnable().equals("1")) { ruleMap = new HashMap(); ruleMap.put("id", kqLeaveRulesComInfo.getId()); ruleMap.put("name", kqLeaveRulesComInfo.getLeaveName()); ruleMap.put("unitType", kqLeaveRulesComInfo.getMinimumUnit()); ruleMap.put("proportion", kqLeaveRulesComInfo.getProportion()); ruleMap.put("scopeType",kqLeaveRulesComInfo.getScopeType()); ruleMap.put("scopeValue",kqLeaveRulesComInfo.getScopeValue()); ruleList.add(ruleMap); } } return ruleList; } /** * 根据人员ID获取其可见的所有假期类型 * * @param resourceId 指定人员ID * @return */ public static String getAllLeaveRulesByUserId(String resourceId, String languageId) { String resultStr = ""; try { ResourceComInfo resourceComInfo = new ResourceComInfo(); String subcomId = resourceComInfo.getSubCompanyID(resourceId); String deptId = resourceComInfo.getDepartmentID(resourceId); List tempList = new ArrayList(); Map itemMap = new HashMap(); List itemList = new ArrayList(); String sql = "select * from kq_leaveRules where 1=1 and (isDelete is null or isDelete <>1) and isEnable=1"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); while (recordSet.next()) { String scopeType = recordSet.getString("scopeType"); String scopeValue = recordSet.getString("scopeValue"); String leaveName = recordSet.getString("leaveName"); String id = recordSet.getString("id"); if (scopeType.equals("1")) { tempList = Util.TokenizerString(scopeValue, ","); if (!tempList.contains(subcomId)) { continue; } } itemMap = new HashMap(); itemMap.put("name", Util.formatMultiLang(leaveName, languageId)); itemMap.put("id", id); itemList.add(itemMap); } resultStr = JSONObject.toJSONString(itemList); } catch (Exception e) { e.printStackTrace(); } return resultStr; } public static boolean filterSubLeaveRule(KQLeaveRulesComInfo kqLeaveRulesComInfo, User user, String leaveId) { return filterSubLeaveRule(Util.null2String(user.getUID()), kqLeaveRulesComInfo.getScopeType(leaveId), kqLeaveRulesComInfo.getScopeValue(leaveId), Util.null2String(user.getUserSubCompany1()),Util.null2String(user.getUserDepartment())); } public static boolean filterSubLeaveRule(String userId, String scopeType, String scopeValue, String subCompany, String deptId) { boolean isAdmin = ServiceUtil.isAdmin(userId); if (isAdmin) { return false; } if ("1".equals(scopeType)) { if (scopeValue.indexOf(",") > 0) { String[] split = scopeValue.split(","); for (String v : split) { if (!StringUtil.isEmpty(v) && v.equals(subCompany)) { return false; } } return true; } else { return !scopeValue.equals(subCompany); } }else if("2".equals(scopeType)){ if (scopeValue.indexOf(",") > 0) { String[] split = scopeValue.split(","); for (String v : split) { if (!StringUtil.isEmpty(v) && v.equals(deptId)) { return false; } } return true; } else { return !scopeValue.equals(deptId); } }else if("3".equals(scopeType)){ if (scopeValue.indexOf(",") > 0) { String[] split = scopeValue.split(","); for (String v : split) { if (!StringUtil.isEmpty(v) && v.equals(userId)) { return false; } } return true; } else { return !scopeValue.equals(userId); } } return false; } /** * 初始化年假 * * @param ruleId * @return */ public static boolean initAnnualLeave(int ruleId) { boolean isInitSuccess = false; try { /*判断年假是否初始化过*/ RecordSet recordSet = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='年假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=1," + "isDelete=0,isEnable=1,leaveCode='annualLeave' where id=" + ruleId; isInitSuccess = recordSet.executeUpdate(updateSql); if (!isInitSuccess) { return false; } String deleteDetailSql = "delete from kq_LeaveRulesDetail where scopeType=0 and ruleId=" + ruleId; recordSet.executeUpdate(deleteDetailSql); String insertDetailSql = "insert into kq_LeaveRulesDetail(ruleName,ruleId,scopeType,scopeValue,distributionMode,annualAmount,priority,validityRule,expirationMonth,expirationDay,extensionEnable,extendedDays,releaseRule,calcMethod)" + "values('年假-总部规则'," + ruleId + ",0,'',3,0,1,0,'','',0,0,0,0)"; isInitSuccess = recordSet.executeUpdate(insertDetailSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'年假-初始化',0,'',1,8,1,1,0,1,'annualLeave')"; isInitSuccess = recordSet.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String insertDetailSql = "insert into kq_LeaveRulesDetail(ruleName,ruleId,scopeType,scopeValue,distributionMode,annualAmount,priority,validityRule,expirationMonth,expirationDay,extensionEnable,extendedDays,releaseRule,calcMethod)" + "values('年假-总部规则'," + nextId + ",0,'',3,0,1,0,'','',0,0,0,0)"; isInitSuccess = recordSet.executeUpdate(insertDetailSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set annualLeave=" + nextId + " where id=1"; isInitSuccess = recordSet.executeUpdate(historySql); ruleId = nextId; } String detailId = ""; sql = "select * from kq_LeaveRulesDetail where scopeType=0 and ruleId=" + ruleId; recordSet.executeQuery(sql); if (recordSet.next()) { detailId = recordSet.getString("id"); } if (detailId.equals("")) { return false; } /*先删除原来的明细记录,在插入新的明细记录*/ String detailSql = "delete from kq_WorkingAgeToLeave where leaveRulesId=" + detailId; isInitSuccess = recordSet.executeUpdate(detailSql); if (!isInitSuccess) { sql = "delete from kq_LeaveRules where leaveRulesId=" + detailId; recordSet.executeUpdate(sql); return false; } /*插入明细记录*/ detailSql = "insert into kq_WorkingAgeToLeave(leaveRulesId,lowerLimit,upperLimit,amount) values(?,?,?,?)"; isInitSuccess = recordSet.executeUpdate(detailSql, detailId, 0, 1, 0); isInitSuccess = recordSet.executeUpdate(detailSql, detailId, 1, 10, 5); isInitSuccess = recordSet.executeUpdate(detailSql, detailId, 10, 20, 10); isInitSuccess = recordSet.executeUpdate(detailSql, detailId, 20, 9999, 15); } catch (Exception e) { logger.info(e.getMessage()); } return isInitSuccess; } /** * 初始化带薪事假 * * @param ruleId * @return */ public static boolean initPaidCompassionateLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='带薪事假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='paidCompassionateLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'带薪事假-初始化',0,'',1,8,1,0,0,1,'paidCompassionateLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set paidCompassionateLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化带薪病假 * * @param ruleId * @return */ public static boolean initPaidSickLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='带薪病假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='paidSickLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'带薪病假-初始化',0,'',1,8,1,0,0,1,'paidSickLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set paidSickLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化调休 * * @param ruleId * @return */ public static boolean initVacationLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='调休-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=1," + "isDelete=0,isEnable=1,leaveCode='vacationLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } String deleteDetailSql = "delete from kq_LeaveRulesDetail where scopeType=0 and ruleId=" + ruleId; rs.executeUpdate(deleteDetailSql); String insertDetailSql = "insert into kq_LeaveRulesDetail(ruleName,ruleId,scopeType,scopeValue,distributionMode,annualAmount,priority,validityRule,expirationMonth,expirationDay,extensionEnable,extendedDays,releaseRule,calcMethod)" + "values('调休-总部规则'," + ruleId + ",0,'',5,0,1,0,'','',0,0,0,0)"; isInitSuccess = rs.executeUpdate(insertDetailSql); if (!isInitSuccess) { return false; } } else { /*判断系统中是否已经存在调休了,如果已存在,则不允许新建新的调休假期*/ sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id in (select ruleId from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=5)"; rs.executeQuery(sql); if (rs.getCounts() > 0) { return false; } KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'调休-初始化',0,'',1,8,1,1,0,1,'vacationLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String insertDetailSql = "insert into kq_LeaveRulesDetail(ruleName,ruleId,scopeType,scopeValue,distributionMode,annualAmount,priority,validityRule,expirationMonth,expirationDay,extensionEnable,extendedDays,releaseRule,calcMethod)" + "values('调休-总部规则'," + nextId + ",0,'',5,0,1,0,'','',0,0,0,0)"; isInitSuccess = rs.executeUpdate(insertDetailSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set vacationLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化事假 * * @param ruleId * @return */ public static boolean initCompassionateLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='事假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='compassionateLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'事假-初始化',0,'',1,8,1,0,0,1,'compassionateLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set compassionateLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化病假 * * @param ruleId * @return */ public static boolean initSickLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='病假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='sickLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'病假-初始化',0,'',1,8,1,0,0,1,'sickLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set sickLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化产假 * * @param ruleId * @return */ public static boolean initMaternityLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='产假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=2,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='maternityLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'产假-初始化',0,'',1,8,2,0,0,1,'maternityLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set maternityLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化陪产假 * * @param ruleId * @return */ public static boolean initPaternityLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (recordSet.next()) { String updateSql = "update kq_LeaveRules set leaveName='陪产假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=2,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='paternityLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'陪产假-初始化',0,'',1,8,2,0,0,1,'paternityLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set paternityLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化婚假 * * @param ruleId * @return */ public static boolean initMarriageLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='婚假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=2,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='marriageLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'婚假-初始化',0,'',1,8,2,0,0,1,'marriageLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set marriageLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化丧假 * * @param ruleId * @return */ public static boolean initFuneralLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='丧假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='funeralLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'丧假-初始化',0,'',1,8,1,0,0,1,'funeralLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set funeralLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 初始化哺乳假 * * @param ruleId * @return */ public static boolean initBreastfeedingLeave(int ruleId) { /*判断是否初始化过*/ RecordSet recordSet = new RecordSet(); RecordSet rs = new RecordSet(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete<>1) and id=" + ruleId; recordSet.executeQuery(sql); boolean initialized = recordSet.getCounts() > 0; /*没有初始化过就新建,已经初始化过就更新*/ boolean isInitSuccess = false; if (initialized) { String updateSql = "update kq_LeaveRules set leaveName='哺乳假-初始化',scopeType=0,scopeValue='',minimumUnit=1,hoursToDay=8,computingMode=1,balanceEnable=0," + "isDelete=0,isEnable=1,leaveCode='breastfeedingLeave' where id=" + ruleId; isInitSuccess = rs.executeUpdate(updateSql); if (!isInitSuccess) { return false; } } else { KQTransMethod kqTransMethod = new KQTransMethod(); int nextId = kqTransMethod.getNextId(); String insertSql = "insert into kq_LeaveRules(id,leaveName,scopeType,scopeValue,minimumUnit,hoursToDay,computingMode,balanceEnable,isDelete,isEnable,leaveCode)" + "values(" + nextId + ",'哺乳假-初始化',0,'',1,8,1,0,0,1,'breastfeedingLeave')"; isInitSuccess = rs.executeUpdate(insertSql); if (!isInitSuccess) { return false; } String historySql = "update kq_initHistory set breastfeedingLeave=" + nextId + " where id=1"; isInitSuccess = rs.executeUpdate(historySql); } return isInitSuccess; } /** * 根据人员ID以及名称获取对应的假期规则ID(主要对于对接小E) * * @param resourceId 人员ID * @param leaveName 假期规则名称 * @return */ public static List getLeaveRuleIdByName(String resourceId, String leaveName) { List dataList = new ArrayList(); try { ResourceComInfo resourceComInfo = new ResourceComInfo(); String subcomId = resourceComInfo.getSubCompanyID(resourceId); Map dataMap = new HashMap(); String sql = "select * from kq_LeaveRules where (isDelete is null or isDelete <>1) and isEnable=1 and leaveName like '%" + leaveName + "%'"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql); while (recordSet.next()) { int scopeType = Util.getIntValue(recordSet.getString("scopeType"), 0); String scopeValue = Util.null2String(recordSet.getString("scopeValue")); if (scopeType == 1) { List tempList = Util.TokenizerString(scopeValue, ","); if (!tempList.contains(subcomId)) { continue; } } dataMap = new HashMap(); dataMap.put("ruleId", recordSet.getString("id")); dataMap.put("name", Util.formatMultiLang(recordSet.getString("leaveName"), "7")); dataList.add(dataMap); } } catch (Exception e) { e.printStackTrace(); } return dataList; } /** * 判断此请假类型是否是由 法定年假+福利年假 组合而成的混合模式 * * @param ruleId 指定的请假类型的id(对应于kq_LeaveRules表的主键ID) * @return true--是混合模式、false--不是 */ public static boolean isMixMode(String ruleId) { boolean flag = false; try { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=6 and ruleId=?"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql, ruleId); if (recordSet.next()) { flag = true; } } catch (Exception e) { logger.info(e.getMessage()); } return flag; } /** * 获取请假类型的颜色(随机生成) * * @return */ public static String getColor() { String color = ""; try { StringBuffer result = new StringBuffer(); for (int i = 0; i < 6; i++) { //随机生成0-15的数值并转换成16进制 result.append(Integer.toHexString(new Random().nextInt(16))); } color = "#" + result.toString().toUpperCase(); } catch (Exception e) { System.out.println("获取16进制字符串异常,返回默认..."); color = "#00CCCC"; } return color; } public static String getChildName(String balanceofleaveid){ String name = ""; try { String sql = "select childId from kq_balanceOfLeave where id=?"; RecordSet recordSet = new RecordSet(); KQChildrenComInfo kqChildrenComInfo = new KQChildrenComInfo(); recordSet.executeQuery(sql, balanceofleaveid); if (recordSet.next()) { String chlid = Util.null2s(recordSet.getString("childId"), ""); if(StringUtils.isNotBlank(chlid)){ name= kqChildrenComInfo.getChildrenName(chlid); } } } catch (Exception e) { logger.info(e.getMessage()); } return name; } /** * 是否是调休 * @param ruleId * @return */ public static boolean isTiaoXiu(String ruleId){ boolean flag = false; try { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=5 and ruleId=?"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql, ruleId); if (recordSet.next()) { flag = true; } } catch (Exception e) { logger.info(e.getMessage()); } return flag; } public static boolean isTiaoXiu(String ruleId, String subCompanyId, String departmentId, String resourceId) { boolean flag = false; RecordSet recordSet = new RecordSet(); try { KQLeaveRulesDetailComInfo detailComInfo = new KQLeaveRulesDetailComInfo(); recordSet.writeLog("isTiaoXiu>>1=" +ruleId+";2="+ subCompanyId+";3="+ departmentId+";4="+ resourceId ); int distributionMode = Util.getIntValue(detailComInfo.getDistributionMode(ruleId, subCompanyId, departmentId, resourceId), 1); if (distributionMode == 5) { flag = true; } recordSet.writeLog("isTiaoXiu>>distributionMode=" +distributionMode); // if (!flag) { if (true) { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) " + "and distributionMode=5 and ruleId=? "; String sqlWhere = ""; if (!resourceId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=3 and ','+scopeValue+',' like '%," + resourceId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=3 and concat(',',scopeValue,',') like '%," + resourceId + ",%') "; } else { sqlWhere = " and (scopeType=3 and ','||scopeValue||',' like '%," + resourceId + ",%') "; } recordSet.writeLog("isTiaoXiu>>sql1=" + sql + sqlWhere); recordSet.executeQuery(sql + sqlWhere, ruleId); if (recordSet.next()) { return true; } } else if (!departmentId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=2 and ','+scopeValue+',' like '%," + departmentId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=2 and concat(',',scopeValue,',') like '%," + departmentId + ",%') "; } else { sqlWhere = " and (scopeType=2 and ','||scopeValue||',' like '%," + departmentId + ",%') "; } recordSet.writeLog("isTiaoXiu>>sql2=" + sql + sqlWhere); recordSet.executeQuery(sql + sqlWhere, ruleId); if (recordSet.next()) { return true; } } else if (!subCompanyId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=1 and ','+scopeValue+',' like '%," + subCompanyId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=1 and concat(',',scopeValue,',') like '%," + subCompanyId + ",%') "; } else { sqlWhere = " and (scopeType=1 and ','||scopeValue||',' like '%," + subCompanyId + ",%') "; } recordSet.writeLog("isTiaoXiu>>sql3=" + sql + sqlWhere); recordSet.executeQuery(sql + sqlWhere, ruleId); if (recordSet.next()) { return true; } } else { sqlWhere = " and scopeType=0 "; recordSet.writeLog("isTiaoXiu>>sql4=" + sql + sqlWhere); recordSet.executeQuery(sql + sqlWhere, ruleId); if (recordSet.next()) { return true; } } } recordSet.writeLog("isTiaoXiu>>flag=" + flag); } catch (Exception e) { recordSet.writeLog(e.getMessage()); recordSet.writeLog(e); } return flag; } public static int getTiaoXiu(String subCompanyId, String departmentId, String resourceId) { int ruleid = 0; RecordSet recordSet = new RecordSet(); try { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) " + "and distributionMode=5 "; String sqlWhere = ""; if (!resourceId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=3 and ','+scopeValue+',' like '%," + resourceId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=3 and concat(',',scopeValue,',') like '%," + resourceId + ",%') "; } else { sqlWhere = " and (scopeType=3 and ','||scopeValue||',' like '%," + resourceId + ",%') "; } recordSet.executeQuery(sql + sqlWhere); while (recordSet.next()) { ruleid = recordSet.getInt("ruleId"); return ruleid; } } if (!departmentId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=2 and ','+scopeValue+',' like '%," + departmentId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=2 and concat(',',scopeValue,',') like '%," + departmentId + ",%') "; } else { sqlWhere = " and (scopeType=2 and ','||scopeValue||',' like '%," + departmentId + ",%') "; } recordSet.executeQuery(sql + sqlWhere); while (recordSet.next()) { ruleid = recordSet.getInt("ruleId"); return ruleid; } } if (!subCompanyId.equals("")) { if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sqlWhere = " and (scopeType=1 and ','+scopeValue+',' like '%," + subCompanyId + ",%') "; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sqlWhere = " and (scopeType=1 and concat(',',scopeValue,',') like '%," + subCompanyId + ",%') "; } else { sqlWhere = " and (scopeType=1 and ','||scopeValue||',' like '%," + subCompanyId + ",%') "; } recordSet.executeQuery(sql + sqlWhere); while (recordSet.next()) { ruleid = recordSet.getInt("ruleId"); return ruleid; } } sqlWhere = " and scopeType=0 "; recordSet.executeQuery(sql + sqlWhere); while (recordSet.next()) { ruleid = recordSet.getInt("ruleId"); return ruleid; } } catch (Exception e) { recordSet.writeLog(e.getMessage()); recordSet.writeLog(e); } return ruleid; } public static Map isRepeat(String ruleid,int scopeType,String scopeValue,User user,String ruleDetailId){ Map result = new HashMap<>(); result.put("flag","0");//0=未重复,1=重复了不让保存 // String sql = "select id,ruleid,scopetype,scopevalue,distributionmode from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=5 "; String sql = "select id,ruleid,scopetype,scopevalue,distributionmode from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) "; RecordSet recordSet = new RecordSet(); recordSet.writeLog("ruleid="+ruleid+",scopeType="+scopeType+",scopeValue="+scopeValue); recordSet.executeQuery(sql); while (recordSet.next()) { String tmp_id = Util.null2String(recordSet.getString("id")); String tmp_ruleid = Util.null2String(recordSet.getString("ruleid")); String tmp_scopetype = Util.null2String(recordSet.getString("scopetype")); String tmp_scopevalue = Util.null2String(recordSet.getString("scopevalue")); String tmp_distributionmode = Util.null2String(recordSet.getString("distributionmode")); recordSet.writeLog("tmp_id="+tmp_id+",tmp_ruleid="+tmp_ruleid+",tmp_scopetype="+tmp_scopetype+",tmp_scopevalue="+tmp_scopevalue); if(tmp_ruleid.equals(ruleid) && ("".equals(ruleDetailId) || !tmp_id.equals(ruleDetailId))){ //同一个假期类型,不能同时设置为【加班自动计入调休】和其他的规则,比如按工龄自动发放 if(!tmp_distributionmode.equals("5")){ result.put("flag","1"); result.put("msg", SystemEnv.getHtmlLabelName(546798, user.getLanguage())); return result; } } if(tmp_distributionmode.equals("5") && tmp_scopetype.equals(Util.null2String(scopeType)) && ("".equals(ruleDetailId) || !tmp_id.equals(ruleDetailId))){ //总部级别的范围单独处理下,因为存在之前是分部级别,维护了分部id,这个时候即便是scopytype=0,但是scopevalue依然有值了,所以总部级别不用进行scopevalue的比对 if("0".equals(tmp_scopetype)){ result.put("flag","1"); result.put("msg", SystemEnv.getHtmlLabelName(546797, user.getLanguage())); return result; } if(null != scopeValue && scopeValue.indexOf(",")>-1){ String[] values = scopeValue.split(","); for (String value : values) { if((","+tmp_scopevalue+",").indexOf(","+value+",")>-1){ result.put("flag","1"); result.put("msg", SystemEnv.getHtmlLabelName(546797, user.getLanguage())); return result; } } }else { if((","+tmp_scopevalue+",").indexOf(","+scopeValue+",")>-1){ result.put("flag","1"); result.put("msg", SystemEnv.getHtmlLabelName(546797, user.getLanguage())); return result; } } } } return result; } /** * 是否是育儿假,且不开启叠加 * @param ruleId * @return */ public static boolean isLeaveOfParental(String ruleId){ boolean flag = false; try { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=8 and ruleId=?"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql, ruleId); if (recordSet.next()) { String severalChildren = Util.null2s(recordSet.getString("severalChildren"), "0"); if(severalChildren.equals("0")){ flag = true; } } } catch (Exception e) { logger.info(e.getMessage()); } return flag; } /** * 是否是育儿假且开启了叠加 * @param ruleId * @return */ public static boolean isLeaveOfParentalNum(String ruleId){ boolean flag = false; try { String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and distributionMode=8 and ruleId=?"; RecordSet recordSet = new RecordSet(); recordSet.executeQuery(sql, ruleId); if (recordSet.next()) { String severalChildren = Util.null2s(recordSet.getString("severalChildren"), "0"); if(severalChildren.equals("1")){ flag = true; } } } catch (Exception e) { logger.info(e.getMessage()); } return flag; } /** * 半天单位 时间选择方式:1-下拉框选择 、2-具体时间 * @param ruleId * @return */ public static int getTimeselection(String ruleId) { int timeselection = 1;//最小请假单位 KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); timeselection = Util.getIntValue(kqLeaveRulesComInfo.getTimeSelection(ruleId), 1); return timeselection; } public void updateChildLeaveDate(int scopeType,String scopeValue,int validityRule,String ruleId){ RecordSet rs = new RecordSet(); try { // 查询当年育儿假数据 String sql = "select * from kq_balanceOfLeave where (isDelete is null or isDelete<>1) and leaveRulesId = "+ruleId ; if (scopeType == 1 ) { sql += " and resourceid in (select id from hrmresource where subCompanyId1 in (" + scopeValue + ") )"; }else if (scopeType == 2 ) { sql += " and resourceid in (select id from hrmresource where departmentId in (" + scopeValue + ") )"; }else if (scopeType == 3) { sql += " and (" + Tools.getOracleSQLIn(scopeValue, "resourceid") + ") "; } KQBalanceOfLeaveEntity balanceEntity = null; ArrayList balanceEntities = new ArrayList<>(); rs.executeQuery(sql); while (rs.next()) { int id = rs.getInt("id"); String childId = Util.null2s(rs.getString("childId"), ""); if(StringUtils.isNotBlank(childId)){ String expirationDate = Util.null2s(rs.getString("expirationDate"), ""); String effectiveDate = Util.null2s(rs.getString("effectiveDate"), ""); balanceEntity = new KQBalanceOfLeaveEntity(); balanceEntity.setId(id); balanceEntity.setExpirationDate(expirationDate); balanceEntity.setEffectiveDate(effectiveDate); balanceEntities.add(balanceEntity); } } sql = " update kq_balanceOfLeave set expirationDate =? where id= ? "; for (int i = 0; balanceEntities != null && i < balanceEntities.size(); i++) { KQBalanceOfLeaveEntity balance = balanceEntities.get(i); String uid = Util.null2String(balance.getId()); String effectiveDate = Util.null2String(balance.getEffectiveDate()); String expirationDate = "2222-12-31"; if (validityRule != 0) { expirationDate = TimeUtil.dateAdd(TimeUtil.yearAdd(effectiveDate, 1), -1); } rs.executeUpdate(sql, expirationDate,uid); } }catch (Exception e){ e.printStackTrace(); rs.writeLog(e); } } }