package com.engine.hostar.thread; import com.engine.hostar.util.HostarUtil; import com.engine.kq.biz.KQFormatSignData; import com.engine.kq.biz.KQGroupMemberComInfo; import com.engine.kq.biz.KQLeaveRulesComInfo; import com.engine.kq.biz.KQOvertimeRulesBiz; import com.engine.kq.biz.KQShiftRuleInfoBiz; import com.engine.kq.biz.KQTimesArrayComInfo; import com.engine.kq.biz.KQWorkTime; import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean; import com.engine.kq.entity.TimeScopeEntity; import com.engine.kq.entity.WorkTimeEntity; import com.engine.kq.util.KQDurationCalculatorUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.formmode.setup.ModeRightInfo; import weaver.general.BaseBean; import weaver.general.InitServer; import weaver.general.Util; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; /** * @version 1.0 * @Title ecology-9 * @Company 泛微软件 * @CreateDate 2024/3/12 * @Description 处理餐补数据 * @Author AdminZm */ public class HandleCBDataThread extends BaseBean implements Runnable{ BaseBean baseBean = new BaseBean(); private String userId; private String kqDate; private static DecimalFormat df = new DecimalFormat("0.00"); private DecimalFormatSymbols symbols = new DecimalFormatSymbols(); public HandleCBDataThread(String userId, String kqDate) { this.userId = userId; this.kqDate = kqDate; } @Override public void run() { baseBean.writeLog("HandleCBDataThread:" + userId + "、" + kqDate); try { RecordSet rs = new RecordSet(); // 获取考勤二开--夜班补助 String nightShiftSubsidy = getNightShiftSubsidy(userId, kqDate); baseBean.writeLog("nightShiftSubsidy:" + nightShiftSubsidy); if (StringUtils.isEmpty(nightShiftSubsidy)) { nightShiftSubsidy = "0"; } // 获取考勤二开--鸿仁驻点餐补 String otherStatAllowance = getOtherStatAllowance(userId, kqDate); baseBean.writeLog("otherStatAllowance:" + otherStatAllowance); if (StringUtils.isEmpty(otherStatAllowance)) { otherStatAllowance = "0"; } // 考勤二开--精密夜班餐补 String nightAllowance = getNightAllowance(userId, kqDate); baseBean.writeLog("nightAllowance:" + nightAllowance); if (StringUtils.isEmpty(nightAllowance)) { nightAllowance = "0"; } // 考勤二开--驻点餐补 String statAllowance = getStatAllowance(userId, kqDate); baseBean.writeLog("statAllowance:" + statAllowance); if (StringUtils.isEmpty(statAllowance)) { statAllowance = "0"; } // 考勤二开--出差餐补 String mealAllowance = getMealAllowance(userId, kqDate); baseBean.writeLog("mealAllowance:" + mealAllowance); if (StringUtils.isEmpty(mealAllowance)) { mealAllowance = "0"; } // 考勤二开--零点补助 String zeropoint = "0"; rs.executeQuery("select zeropoint from kq_format_total where resourceid = ? and kqdate = ?", userId, kqDate); if (rs.next()) { zeropoint = rs.getString("zeropoint"); } if (StringUtils.isEmpty(zeropoint)) { zeropoint = "0"; } rs.executeQuery("select id from uf_cbxxjlb where xm = ? and rq = ?", userId, kqDate); RecordSet rs1 = new RecordSet(); String cbxxjlModeId = rs1.getPropValue("hostar_zm_prop", "cbxxjl_modeid"); if (rs.next()) { int cbxxjlId = rs.getInt("id"); rs1.executeUpdate("update uf_cbxxjlb set hrzdcb = ?, jmybcb = ?, zdcb = ?, ybbz = ?, cccb = ?, ldbz = ? where id = ?", otherStatAllowance, nightAllowance, statAllowance, nightShiftSubsidy, mealAllowance, zeropoint, cbxxjlId); //权限重构 ModeRightInfo ModeRightInfo = new ModeRightInfo(); ModeRightInfo.setNewRight(true); ModeRightInfo.editModeDataShare(1, Integer.parseInt(cbxxjlModeId), cbxxjlId); } else { String uuidT = UUID.randomUUID().toString(); SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");//设置日期格式 String nowDate = sdfDate.format(new Date()); String nowTime = sdfTime.format(new Date()); String gh = null; String bm = null; rs1.executeQuery("SELECT workcode, departmentid from hrmresource where id = ?", userId); if (rs1.next()) { gh = rs1.getString("workcode"); bm = rs1.getString("departmentid"); } rs1.executeUpdate("insert into uf_cbxxjlb (xm, rq, gh, bm, hrzdcb, jmybcb, zdcb, ybbz, cccb, ldbz, formmodeid, MODEUUID, " + "modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,?, ?)", userId, kqDate, gh, bm, otherStatAllowance, nightAllowance, statAllowance, nightShiftSubsidy, mealAllowance, zeropoint, cbxxjlModeId, uuidT, "1", "0", nowDate, nowTime); RecordSet qxcgRs = new RecordSet(); qxcgRs.execute("select id from uf_cbxxjlb where MODEUUID = '" + uuidT + "'"); Integer idT = 0; while (qxcgRs.next()) { idT = qxcgRs.getInt("id"); } //权限重构 ModeRightInfo ModeRightInfo = new ModeRightInfo(); ModeRightInfo.setNewRight(true); ModeRightInfo.editModeDataShare(1, Integer.parseInt(cbxxjlModeId), idT); } } catch (Exception e) { baseBean.writeLog("HandleCBDataThread error:" + e.getMessage()); } } public String getNightShiftSubsidy(String userId, String kqDate) { BaseBean bb = new BaseBean(); RecordSet rs = new RecordSet(); String value = ""; try { //获取夜班班次 List nightShiftList = new ArrayList<>(); String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0"; rs.executeQuery(acqNightShiftSql); while (rs.next()) { String shift = Util.null2String(rs.getString("shift")); if (StringUtils.isNotBlank(shift)) { nightShiftList.add(shift); } } if (nightShiftList != null & nightShiftList.size() > 0) { HostarUtil houtil = new HostarUtil(); //先获取到出勤时长 Map attendanceMinsMap = new HashMap<>(); String acqAttenSql = " select resourceid, attendancemins, kqdate from kq_format_total where resourceid in (" + userId + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'"; rs.executeQuery(acqAttenSql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); Double attendancemins = Util.getDoubleValue(Util.null2String(rs.getString("attendancemins"))); String kqdate = Util.null2String(rs.getString("kqdate")); if (attendancemins >= 0.00 ) { attendanceMinsMap.put(resourceid+"|"+kqdate, attendancemins); } } KQWorkTime kqWorkTime = new KQWorkTime(); //获取当天班次 Map serialInfo = kqWorkTime.getSerialInfo(userId, kqDate, false); if (serialInfo != null && serialInfo.size() > 0) { int serialid = Util.getIntValue(Util.null2String(serialInfo.get(kqDate)), 0); if (serialid > 0) { if ( !nightShiftList.contains(String.valueOf(serialid))) { return "0"; } } } Double attendanceMins = Util.getDoubleValue(Util.null2String(attendanceMinsMap.get(userId + "|" + kqDate))); value = (( attendanceMins / 60) >= 8.00 ) ? "1" : "0"; } } catch (Exception e) { bb.writeLog("get NightShiftSubsidy error:" + e.getMessage()); } return value; } public String getOtherStatAllowance(String userId, String kqDate) { BaseBean bb = new BaseBean(); RecordSet rs = new RecordSet(); String value = ""; String sqlWhere = " "; try { KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); if(userId.length()>0){ sqlWhere +=" and a.id in("+userId+") "; } //获取加班时长 Map dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance(userId, kqDate); String otherstatsub = Util.null2String(bb.getPropValue("project_hostar", "otherstatsubcompany")); if (StringUtils.isNotBlank(otherstatsub)) { //查询该分部下的人员 List resIds = new ArrayList<>(); sqlWhere += " and a.subcompanyid1 in (" + otherstatsub + ") "; String acqResSql = "select a.id from hrmresource a where a.status in (0,1,2,3) " + sqlWhere; bb.writeLog("acqResSql: " + acqResSql); rs.executeQuery(acqResSql); while (rs.next()) { String id = Util.null2String(rs.getString("id")); if (StringUtils.isNotBlank(id)) { resIds.add(id); } } bb.writeLog("resIds: " + resIds); if (resIds != null && resIds.size() > 0 && StringUtils.isNotBlank(kqDate)) { HostarUtil houtil = new HostarUtil(); //先获取到出勤时长 Map attendanceMinsMap = new HashMap<>(); String acqAttenSql = " select resourceid, attendancemins, kqdate from kq_format_total where resourceid in (" + String.join(",", resIds) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'"; rs.executeQuery(acqAttenSql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); Double attendancemins = Util.getDoubleValue(Util.null2String(rs.getString("attendancemins"))); String kqdate = Util.null2String(rs.getString("kqdate")); if (attendancemins >= 0.00) { attendanceMinsMap.put(resourceid + "|" + kqdate, attendancemins); } } List removeRes = new ArrayList<>(); String acqNoOtherStatAllResSql = "select resourceid from uf_NoOtherStatAllRe where isdelete is null or isdelete = 0 "; rs.executeQuery(acqNoOtherStatAllResSql); while (rs.next()){ String resourceid = Util.null2String(rs.getString("resourceid")); if (StringUtils.isNotBlank(resourceid) ) { removeRes.add(resourceid); } } if ( removeRes != null && removeRes.size() > 0 ) { resIds.removeIf(removeRes::contains); } for (String res : resIds) { //获取考勤打卡 Map otherinfo = new HashMap<>();//存一些用得到的信息 String uuid = UUID.randomUUID().toString(); KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo(); ArrayList hostIps = InitServer.getRealIp();//获取IP boolean oneSign = false;//一天一段出勤时间段 List lsSignTime = new ArrayList<>(); List lsWorkTime = new ArrayList<>(); // List lsRestTime = new ArrayList<>(); KQWorkTime kqWorkTime = new KQWorkTime(); kqWorkTime.setIsFormat(true); WorkTimeEntity workTime = kqWorkTime.getWorkTime(res, kqDate); String preDate = weaver.common.DateUtil.addDate(kqDate, -1);//上一天日期 String nextDate = weaver.common.DateUtil.addDate(kqDate, 1);//下一天日期 if (workTime != null) { lsSignTime = workTime.getSignTime();//允许打卡时间 lsWorkTime = workTime.getWorkTime();//工作时间 // lsRestTime = workTime.getRestTime();//休息时段时间 oneSign = lsWorkTime != null && lsWorkTime.size() == 1; } int shiftCount = lsWorkTime == null ? 0 : lsWorkTime.size(); int shiftI = 0; List lsCheckInfo = new ArrayList<>(); for (int i = 0; lsWorkTime != null && i < lsWorkTime.size(); i++) { shiftI = i; TimeScopeEntity signTimeScope = lsSignTime.get(i); TimeScopeEntity workTimeScope = lsWorkTime.get(i); Map shifRuleMap = Maps.newHashMap(); String workBeginTime = Util.null2String(workTimeScope.getBeginTime()); int workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime); String workEndTime = Util.null2String(workTimeScope.getEndTime()); int workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime); boolean workEndTimeAcross = workTimeScope.getEndTimeAcross(); if (oneSign) { //个性化设置只支持一天一次上下班 ShiftInfoBean shiftInfoBean = new ShiftInfoBean(); shiftInfoBean.setSplitDate(kqDate); shiftInfoBean.setShiftRuleMap(workTime.getShiftRuleInfo()); shiftInfoBean.setSignTime(lsSignTime); shiftInfoBean.setWorkTime(lsWorkTime); List logList = Lists.newArrayList(); KQShiftRuleInfoBiz.getShiftRuleInfo(shiftInfoBean, res, shifRuleMap, logList); if (!shifRuleMap.isEmpty()) { if (!logList.isEmpty()) { otherinfo.put("logList", logList); } otherinfo.put("shiftRule", shifRuleMap); if (shifRuleMap.containsKey("shift_beginworktime")) { String shift_beginworktime = Util.null2String(shifRuleMap.get("shift_beginworktime")); if (shift_beginworktime.length() > 0) { workBeginTime = Util.null2String(shift_beginworktime); workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime); workTimeScope.setBeginTime(workBeginTime); workTimeScope.setBeginTimeAcross(workBeginIdx >= 1440 ? true : false); } } if (shifRuleMap.containsKey("shift_endworktime")) { String shift_endworktime = Util.null2String(shifRuleMap.get("shift_endworktime")); if (shift_endworktime.length() > 0) { workEndTime = Util.null2String(shift_endworktime); workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime); workTimeScope.setEndTime(workEndTime); workTimeScope.setEndTimeAcross(workEndIdx >= 1440 ? true : false); } } } } lsCheckInfo = new KQFormatSignData().getSignInfo(res, signTimeScope, workTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, hostIps, uuid, shiftCount, shiftI); } List signIdList = new ArrayList<>(); for (int i = 0; i < lsCheckInfo.size(); i++) { Object o = lsCheckInfo.get(i); if ( o != null && o != "") { Map temp = (Map) o; String signId = Util.null2String(temp.get("signId")); if (StringUtils.isNotBlank(signId)) { signIdList.add(signId); } } } Integer signNumber = 0; if (signIdList !=null && signIdList.size() > 0) { String acqShowAddress = "select showaddress,addr from hrmschedulesign where id in (" + String.join(",", signIdList) + ") "; // bb.writeLog("acqShowAddress: " + acqShowAddress); rs.executeQuery(acqShowAddress); while (rs.next()) { String showaddress = Util.null2String(rs.getString("showaddress")); String addr = Util.null2String(rs.getString("addr")); if ("鸿仕达".equals(showaddress) || "hostar".equalsIgnoreCase(showaddress) || "鸿仕达".equals(addr) || "hostar".equalsIgnoreCase(addr)) { signNumber = signNumber + 1; } } } if (signNumber == 0) { double workingDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_4leave"))); workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave; double restDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_4leave"))); restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave; double holidayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_4leave"))); holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave; double workingDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_nonleave"))); workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave; double restDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_nonleave"))); restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave; double holidayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_nonleave"))); holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave; double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave + workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave; // bb.writeLog("-=-temp:" + temp); Double attendanceMins = Util.getDoubleValue(Util.null2String(attendanceMinsMap.get(res + "|" + kqDate))); // bb.writeLog("-=-attendanceMins:" + attendanceMins); double v = Math.round (((attendanceMins < 0.00) ? 0.00 : attendanceMins) + temp) / 60.00; value = "0"; if (v >= 4.00 && v < 9.00) { value = "1"; } else if (v >= 9.00) { value = "2"; } } } } } } catch (Exception e) { bb.writeLog("get OtherStatAllowance error:" + e.getMessage()); } return value; } public Map getDailyFlowOverTimeDataAllowance(String userId, String kqDate){ BaseBean bb = new BaseBean(); Map datas = new HashMap<>();; RecordSet rs = new RecordSet(); String sql = ""; String sqlWhere = " "; String valueRes = ""; try{ if(userId.length()>0){ sqlWhere +=" and a.id in("+userId+") "; } KQOvertimeRulesBiz kqOvertimeRulesBiz = new KQOvertimeRulesBiz(); int uintType = kqOvertimeRulesBiz.getMinimumUnit();//当前加班单位 double hoursToDay = kqOvertimeRulesBiz.getHoursToDay();//当前天跟小时计算关系 String valueField = ""; if(uintType==3 || uintType== 5 || uintType== 6){//按小时计算 valueField = "sum( case when durationrule='3' then duration else duration*"+hoursToDay+" end) as val"; }else{//按天计算 valueField = "sum( case when durationrule='3' then duration/"+hoursToDay+" else duration end) as val"; } sql = " select resourceid,changeType,belongdate,paidLeaveEnable, sum(cast(duration_min as decimal(18,4))) as val "+ " from hrmresource a, kq_flow_overtime b "+ " where a.id = b.resourceid and belongdate >='"+kqDate+"' and belongdate <='"+kqDate+"' " +sqlWhere+ " group by resourceid,changeType,paidLeaveEnable,belongdate "; rs.execute(sql); while (rs.next()) { String resourceid = rs.getString("resourceid"); String belongdate = rs.getString("belongdate"); String paidLeaveEnable = rs.getString("paidLeaveEnable"); int changeType =rs.getInt("changeType");//1-节假日、2-工作日、3-休息日 double value = rs.getDouble("val")<0?0:rs.getDouble("val"); if(uintType==3 || uintType== 5 || uintType== 6){//按小时计算 value = Util.getDoubleValue(KQDurationCalculatorUtil.getDurationRound(value+"")); }else{//按天计算 value = Util.getDoubleValue(KQDurationCalculatorUtil.getDurationRound(value+"")); } String flowType = ""; if(changeType==1){ flowType = "holidayOvertime"; }else if(changeType==2){ flowType = "workingDayOvertime"; }else if(changeType==3){ flowType = "restDayOvertime"; } if("1".equalsIgnoreCase(paidLeaveEnable)){ //1表示关联调休 flowType += "_4leave"; }else{ //0表示不关联调休 flowType += "_nonleave"; } //df.format 默认是不四舍五入的 0.125这样的就会直接变成0.12了 symbols.setDecimalSeparator('.'); df.setMaximumFractionDigits(5); df.setDecimalFormatSymbols(symbols); datas.put(resourceid+"|"+belongdate+"|"+flowType, df.format(value)); } }catch (Exception e){ bb.writeLog("getDailyFlowOverTimeDataAllowance error:" + e.getMessage()); } return datas; } public String getNightAllowance(String userId, String kqDate){ BaseBean bb = new BaseBean(); String value = ""; RecordSet rs = new RecordSet(); String sql = ""; String sqlWhere = " "; try { KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); if(userId.length()>0){ sqlWhere +=" and a.id in("+userId+") "; } //获取加班时长 Map dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance(userId, kqDate); //获取夜班班次 List nightShiftList = new ArrayList<>(); String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0"; rs.executeQuery(acqNightShiftSql); while (rs.next()) { String shift = Util.null2String(rs.getString("shift")); if (StringUtils.isNotBlank(shift)) { nightShiftList.add(shift); } } if (nightShiftList != null & nightShiftList.size() > 0) { String nightshiftsub = Util.null2String(bb.getPropValue("project_hostar", "nightshiftsubcompany")); if (StringUtils.isNotBlank(nightshiftsub)) { //查询该分部下的人员 List resIds = new ArrayList<>(); sqlWhere += " and a.subcompanyid1 in (" + nightshiftsub + ") "; String acqResSql = "select a.id from hrmresource a where a.status in (0,1,2,3) " + sqlWhere; bb.writeLog("acqResSql: " + acqResSql); rs.executeQuery(acqResSql); while (rs.next()) { String id = Util.null2String(rs.getString("id")); if (StringUtils.isNotBlank(id)) { resIds.add(id); } } bb.writeLog("resIds: " + resIds); if (resIds != null && resIds.size() > 0) { HostarUtil houtil = new HostarUtil(); //先获取到出勤时长 Map attendanceMinsMap = new HashMap<>(); String acqAttenSql = " select resourceid, attendancemins, kqdate from kq_format_total where resourceid in (" + String.join(",", resIds) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'"; rs.executeQuery(acqAttenSql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); Double attendancemins = Util.getDoubleValue(Util.null2String(rs.getString("attendancemins"))); String kqdate = Util.null2String(rs.getString("kqdate")); if (attendancemins >= 0.00) { attendanceMinsMap.put(resourceid + "|" + kqdate, attendancemins); } } KQWorkTime kqWorkTime = new KQWorkTime(); for (String res : resIds) { //获取当天班次 Map serialInfo = kqWorkTime.getSerialInfo(res, kqDate, false); if (serialInfo != null && serialInfo.size() > 0) { int serialid = Util.getIntValue(Util.null2String(serialInfo.get(kqDate)), 0); if (serialid > 0) { if (!nightShiftList.contains(String.valueOf(serialid))) { continue; } } } double workingDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_4leave"))); workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave; double restDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_4leave"))); restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave; double holidayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_4leave"))); holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave; double workingDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_nonleave"))); workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave; double restDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_nonleave"))); restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave; double holidayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_nonleave"))); holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave; double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave + workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave; // bb.writeLog("-=-temp:" + temp); Double attendanceMins = Util.getDoubleValue(Util.null2String(attendanceMinsMap.get(res + "|" + kqDate))); // bb.writeLog("-=-attendanceMins:" + attendanceMins); value = String.valueOf(Math.floor(((attendanceMins < 0.00 ? 0.00 : attendanceMins) + temp) / 300)); } } } } } catch (Exception e) { bb.writeLog("get NightAllowance error:" + e.getMessage()); } return value; } public String getStatAllowance(String userId, String kqDate) { BaseBean bb = new BaseBean(); String value = "0"; RecordSet rs = new RecordSet(); String sql = ""; String sqlWhere = " "; try { KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); if(userId.length()>0){ sqlWhere +=" and a.id in("+userId+") "; } //获取加班时长 Map dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance(userId, kqDate); //首先去除指定不享有的分部 List subComoanyList = new ArrayList<>(); String acqNoStatAllSql = "select subcompany from uf_NoStatAllSubCom where isdelete = 0 or isdelete is null"; rs.executeQuery(acqNoStatAllSql); while (rs.next()) { String subcompany = Util.null2String(rs.getString("subcompany")); if (StringUtils.isNotBlank(subcompany)) { subComoanyList.add(subcompany); } } String subComoanys = ""; if ( subComoanyList != null && subComoanyList.size() > 0) { subComoanys = String.join(",", subComoanyList); } if (StringUtils.isNotBlank(subComoanys)) { sqlWhere += " and a.subcompanyid1 not in ("+subComoanys+") "; } //指定人员不享受 List noRes = new ArrayList<>(); String acqNoResSql = "select resourceid from uf_NoStatAllRes where isdelete = 0 or isdelete is null"; rs.executeQuery(acqNoResSql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); if (StringUtils.isNotBlank(resourceid)) { noRes.add(resourceid); } } if ( noRes !=null && noRes.size()>0) { sqlWhere += " and a.id not in ("+String.join(",", noRes)+") "; } List resIds = new ArrayList<>(); String acqResSql = "select a.id from hrmresource a where a.status in (0,1,2,3) " + sqlWhere; bb.writeLog("acqResSql: " + acqResSql); rs.executeQuery(acqResSql); while (rs.next()) { String id = Util.null2String(rs.getString("id")); if (StringUtils.isNotBlank(id)) { resIds.add(id); } } bb.writeLog("resIds: " + resIds); if (resIds != null && resIds.size() > 0 && StringUtils.isNotBlank(kqDate)) { HostarUtil houtil = new HostarUtil(); KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); //先获取到出勤时长 Map attendanceMinsMap = new HashMap<>(); String acqAttenSql = " select resourceid, attendancemins, kqdate from kq_format_total where resourceid in (" + String.join(",",resIds) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'"; rs.executeQuery(acqAttenSql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); Double attendancemins = Util.getDoubleValue(Util.null2String(rs.getString("attendancemins"))); String kqdate = Util.null2String(rs.getString("kqdate")); if (attendancemins >= 0.00 ) { attendanceMinsMap.put(resourceid+"|"+kqdate, attendancemins); } } // 获取享受的考勤组 List grouplist = new ArrayList(); String acqGroupSql = "select kqgroup from uf_StatAlloKqGroup where isdelete is null or isdelete = 0 " ; rs.executeQuery(acqGroupSql); while (rs.next()) { String kqgroup = Util.null2String(rs.getString("kqgroup")); if (StringUtils.isNotBlank(kqgroup)) { grouplist.add(kqgroup); } } if ( grouplist != null && grouplist.size() == 0) { return "0"; } for (String res: resIds) { //判断考勤组 /*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/ String groupId = kqGroupMemberComInfo.getKQGroupId(userId, kqDate); if ( !grouplist.contains(groupId)) { continue; } //获取考勤打卡 Map otherinfo = new HashMap<>();//存一些用得到的信息 String uuid = UUID.randomUUID().toString(); KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo(); ArrayList hostIps = InitServer.getRealIp();//获取IP boolean oneSign = false;//一天一段出勤时间段 List lsSignTime = new ArrayList<>(); List lsWorkTime = new ArrayList<>(); KQWorkTime kqWorkTime = new KQWorkTime(); kqWorkTime.setIsFormat(true); WorkTimeEntity workTime = kqWorkTime.getWorkTime(res, kqDate); String preDate = weaver.common.DateUtil.addDate(kqDate, -1);//上一天日期 String nextDate = weaver.common.DateUtil.addDate(kqDate, 1);//下一天日期 if (workTime != null) { lsSignTime = workTime.getSignTime();//允许打卡时间 lsWorkTime = workTime.getWorkTime();//工作时间 oneSign = lsWorkTime!=null&&lsWorkTime.size()==1; } int shiftCount = lsWorkTime == null ? 0 : lsWorkTime.size(); int shiftI = 0; List lsCheckInfo = new ArrayList<>(); for (int i = 0; lsWorkTime != null && i < lsWorkTime.size(); i++) { shiftI = i; TimeScopeEntity signTimeScope = lsSignTime.get(i); TimeScopeEntity workTimeScope = lsWorkTime.get(i); Map shifRuleMap = Maps.newHashMap(); String workBeginTime = Util.null2String(workTimeScope.getBeginTime()); int workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime); String workEndTime = Util.null2String(workTimeScope.getEndTime()); int workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime); boolean workEndTimeAcross = workTimeScope.getEndTimeAcross(); if(oneSign){ //个性化设置只支持一天一次上下班 ShiftInfoBean shiftInfoBean = new ShiftInfoBean(); shiftInfoBean.setSplitDate(kqDate); shiftInfoBean.setShiftRuleMap(workTime.getShiftRuleInfo()); shiftInfoBean.setSignTime(lsSignTime); shiftInfoBean.setWorkTime(lsWorkTime); List logList = Lists.newArrayList(); KQShiftRuleInfoBiz.getShiftRuleInfo(shiftInfoBean, res, shifRuleMap,logList); if(!shifRuleMap.isEmpty()){ if(!logList.isEmpty()){ otherinfo.put("logList", logList); } otherinfo.put("shiftRule", shifRuleMap); if(shifRuleMap.containsKey("shift_beginworktime")){ String shift_beginworktime = Util.null2String(shifRuleMap.get("shift_beginworktime")); if(shift_beginworktime.length() > 0){ workBeginTime = Util.null2String(shift_beginworktime); workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime); workTimeScope.setBeginTime(workBeginTime); workTimeScope.setBeginTimeAcross(workBeginIdx>=1440?true:false); } } if(shifRuleMap.containsKey("shift_endworktime")){ String shift_endworktime = Util.null2String(shifRuleMap.get("shift_endworktime")); if(shift_endworktime.length() > 0){ workEndTime = Util.null2String(shift_endworktime); workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime); workTimeScope.setEndTime(workEndTime); workTimeScope.setEndTimeAcross(workEndIdx>=1440?true:false); } } } } lsCheckInfo = new KQFormatSignData().getSignInfo(res,signTimeScope,workTimeScope,kqDate,preDate,nextDate,kqTimesArrayComInfo,hostIps,uuid,shiftCount,shiftI); } List signIdList = new ArrayList<>(); for (int i = 0; i < lsCheckInfo.size(); i++) { Object o = lsCheckInfo.get(i); if ( o != null && o != "") { Map temp = (Map) o; String signId = Util.null2String(temp.get("signId")); if (StringUtils.isNotBlank(signId)) { signIdList.add(signId); } } } bb.writeLog("signIdList: " + signIdList); Integer signNumber = 0; if (signIdList !=null && signIdList.size() > 0) { String acqShowAddress = "select showaddress,addr from hrmschedulesign where id in (" + String.join(",", signIdList) + ") "; bb.writeLog("acqShowAddress: " + acqShowAddress); rs.executeQuery(acqShowAddress); while (rs.next()) { String showaddress = Util.null2String(rs.getString("showaddress")); String addr = Util.null2String(rs.getString("addr")); if ("鸿仕达".equals(showaddress) || "hostar".equalsIgnoreCase(showaddress) || "鸿仕达".equals(addr) || "hostar".equalsIgnoreCase(addr)) { signNumber = signNumber + 1; } } } if (signNumber == 0 ) { double workingDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_4leave"))); workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave; double restDayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_4leave"))); restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave; double holidayOvertime_4leave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_4leave"))); holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave; double workingDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|workingDayOvertime_nonleave"))); workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave; double restDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|restDayOvertime_nonleave"))); restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave; double holidayOvertime_nonleave = Util.getDoubleValue(Util.null2String(dailyFlowOverTimeData.get(res + "|" + kqDate + "|holidayOvertime_nonleave"))); holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave; double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave + workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave; Double attendanceMins = Util.getDoubleValue(Util.null2String(attendanceMinsMap.get(res + "|" + kqDate))); value = String.valueOf(Math.floor( ((attendanceMins < 0.00 ? 0.00 : attendanceMins) + temp) / 300)); } } } } catch (Exception e) { bb.writeLog("get StatAllowance error:" + e.getMessage()); } return value; } public String getMealAllowance(String id, String kqDateA) { BaseBean bb = new BaseBean(); String value = "0"; RecordSet rs = new RecordSet(); String sql = ""; String sqlWhere = " "; try { KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); if(id.length()>0){ sqlWhere +=" and b.id in("+id+") "; } // 首先获取出差公出流程信息 Map evectionMap = new HashMap<>(); String evectionTableName = Util.null2String(bb.getPropValue("project_hostar","evectionTableName")); sql = " select d.resourceid, d.belongdate, d.longitude, d.latitude from ( " + " select a.belongdate, b.id as resourceid, b.subcompanyid1, b.departmentid, b.managerstr, b.managerid, b.loginid, c.jd as longitude, c.wd as latitude from kq_flow_split_evection a " + " left join hrmresource b " + " on b.id = a.resourceid " + " left join " + evectionTableName + " c " + " on c.requestid = a.requestid " + " where a.belongdate >='"+kqDateA+"' and a.belongdate <='"+kqDateA+"' " + sqlWhere + " ) d " + " where 1=1 " ; bb.writeLog("sql: " + sql); rs.execute(sql); while (rs.next()) { String resourceid = Util.null2String(rs.getString("resourceid")); String belongdate = Util.null2String(rs.getString("belongdate")); String longitude = Util.null2String(rs.getString("longitude")); String latitude = Util.null2String(rs.getString("latitude")); evectionMap.put( belongdate + "|" + resourceid, longitude + "|" + latitude ); } bb.writeLog("evectionMap: " + evectionMap); //获取外勤打卡数据 KQWorkTime kqWorkTime = new KQWorkTime(); kqWorkTime.setIsFormat(true); Map< String, Map> lsCheckInfo = new HashMap<>(); for ( String key: evectionMap.keySet()) { String[] split = key.split("\\|"); String kqDate = split[0]; String userId = split[1]; WorkTimeEntity workTime = kqWorkTime.getWorkTime(userId, kqDate); List lsSignTime = new ArrayList<>(); List lsWorkTime = new ArrayList<>(); if (workTime != null) { lsSignTime = workTime.getSignTime();//允许打卡时间 lsWorkTime = workTime.getWorkTime();//工作时间 } //只支持一天一次上下班 if (lsWorkTime != null && lsWorkTime.size()==1 ) { TimeScopeEntity signTimeScope = lsSignTime.get(0); TimeScopeEntity workTimeScope = lsWorkTime.get(0); List> legWorkInfos = new ArrayList<>(); //获取允许打卡时间 String signBeginTime = signTimeScope.getBeginTime(); if (StringUtils.isNotBlank(signBeginTime)) { signBeginTime = signBeginTime + ":00"; } //获取上班时间 String workBeginTime = workTimeScope.getBeginTime(); if (StringUtils.isNotBlank(workBeginTime)) { workBeginTime = workBeginTime + ":00"; } String acqLegWorkSignSql = "select operate_time, longitude, latitude from mobile_sign where operater = ? and operate_date = '" + kqDate + "' and operate_time >='" + signBeginTime + "' order by operate_time asc "; rs.executeQuery(acqLegWorkSignSql, userId); while ( rs.next()) { String operateTime = Util.null2String(rs.getString("operate_time")); String longitude = Util.null2String(rs.getString("longitude")); String latitude = Util.null2String(rs.getString("latitude")); if ( StringUtils.isNotBlank(operateTime) && StringUtils.isNotBlank(longitude) && StringUtils.isNotBlank(latitude) ) { Map temp = new HashMap<>(); temp.put("operateTime", operateTime); temp.put("longitude", longitude); temp.put("latitude", latitude); legWorkInfos.add(temp); } } if (legWorkInfos != null && legWorkInfos.size() > 0 ) { String tempSignIn = ""; String tempSignInLatitude = ""; String tempSignInLongitude = ""; String tempSignOutLatitude = ""; String tempSignOutLongitude = ""; String tempSignOut = ""; Map checkInfo = new HashMap<>(); if ( legWorkInfos.size() == 1) {//只有一笔外勤卡直接算上班 Map temp = legWorkInfos.get(0); String operateTime = Util.null2String(temp.get("operateTime")); String longitude = Util.null2String(temp.get("longitude")); String latitude = Util.null2String(temp.get("latitude")); checkInfo.put("signDate", kqDate);//签到签退日期 checkInfo.put("signInTime", operateTime);//签到时间 checkInfo.put("signInLatitude", latitude);//签到纬度 checkInfo.put("signInLongitude", longitude);//签到经度 lsCheckInfo.put(userId + "|" + kqDate, checkInfo); } else { for ( Map temp : legWorkInfos) { String operateTime = Util.null2String(temp.get("operateTime")); String longitude = Util.null2String(temp.get("longitude")); String latitude = Util.null2String(temp.get("latitude")); if (operateTime.compareTo(workBeginTime) < 0) {//获取上班时间点之前最早的一笔卡 if (StringUtils.isBlank(tempSignIn)) { tempSignIn = operateTime; tempSignInLatitude = latitude; tempSignInLongitude = longitude; } else { if ( operateTime.compareTo(tempSignIn) < 0 ) { tempSignIn = operateTime; tempSignInLatitude = latitude; tempSignInLongitude = longitude; } } } if ( operateTime.compareTo(workBeginTime) > 0) {//下班卡取最晚的一笔 if (StringUtils.isBlank(tempSignIn)) { tempSignOut = operateTime; tempSignOutLatitude = latitude; tempSignOutLongitude = longitude; } else { if ( operateTime.compareTo(tempSignOut) > 0 ) { tempSignOut = operateTime; tempSignOutLatitude = latitude; tempSignOutLongitude = longitude; } } } } checkInfo.put("signDate", kqDate);//签到签退日期 checkInfo.put("signInTime", tempSignIn);//签到时间 checkInfo.put("signInLatitude", tempSignInLatitude);//签到纬度 checkInfo.put("signInLongitude", tempSignInLongitude);//签到经度 checkInfo.put("signOutTime", tempSignOut);//签退时间 checkInfo.put("signOutLatitude", tempSignOutLatitude);//签退纬度 checkInfo.put("signOutLongitude", tempSignOutLongitude);//签退经度 lsCheckInfo.put(userId + "|" + kqDate, checkInfo); } } } } HostarUtil hostarUtil = new HostarUtil(); String MealAlloTableName = Util.null2String(bb.getPropValue("project_hostar", "MealAllowanceTableName")); if (StringUtils.isNotBlank(MealAlloTableName)) { //获取餐补判断时间 List> MealMap = new ArrayList<>(); String acqTimeSql = "select startTime, endTime from " + MealAlloTableName + " where (isDelete is null or isDelete = 0)"; rs.executeQuery(acqTimeSql); while (rs.next()) { String startTime = Util.null2String(rs.getString("startTime")); String endTime = Util.null2String(rs.getString("endTime")); Map temp = new HashMap<>(); temp.put("startTime",startTime); temp.put("endTime",endTime); MealMap.add(temp); } //根据外勤打卡数据计算餐补数据 for (String key: lsCheckInfo.keySet()) { String[] split = key.split("\\|"); String userId = split[0]; String kqDate = split[1]; Map temp = lsCheckInfo.get(key); String signInTime = Util.null2String(temp.get("signInTime")); String signOutTime = Util.null2String(temp.get("signOutTime")); if (StringUtils.isNotBlank(signInTime) && StringUtils.isNotBlank(signOutTime) ) { for (Map me: MealMap) { String startTime = me.get("startTime"); String endTime = me.get("endTime"); if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { startTime = startTime + ":00"; endTime = endTime + ":00"; } if ( (signInTime.compareTo(startTime) <= 0) && (signOutTime.compareTo(endTime) >= 0) ) { if (StringUtils.isEmpty(value) || StringUtils.equals(value, "0")) { value = "1"; } else { value = String.valueOf(Integer.parseInt(value)); } } } } } } } catch (Exception e) { bb.writeLog("get MealAllowance error:" + e.getMessage()); } return value; } }