diff --git a/src/com/engine/sskj/util/SskjUtil.java b/src/com/engine/sskj/util/SskjUtil.java index ce5a565..7970d7f 100644 --- a/src/com/engine/sskj/util/SskjUtil.java +++ b/src/com/engine/sskj/util/SskjUtil.java @@ -1,9 +1,18 @@ package com.engine.sskj.util; +import com.engine.kq.biz.KQOvertimeRulesBiz; +import org.apache.commons.lang3.StringUtils; +import weaver.conn.RecordSet; import weaver.formmode.setup.ModeRightInfo; import weaver.general.BaseBean; +import weaver.general.Util; +import javax.xml.transform.Result; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author chenwnj @@ -14,6 +23,9 @@ public class SskjUtil { BaseBean basebean = new BaseBean(); + final String THISMONTH = "uf_jbtxdyfjs"; + final String OTHERMONTH = "uf_jbtxgyfff"; + /** * 建模权限重构 * @param userId @@ -26,7 +38,9 @@ public class SskjUtil { ModeRightInfo.editModeDataShare( userId, Integer.parseInt(jobGroupDesModeId), Integer.parseInt(billid)); } - // 获取两个时间相差分钟数 + /** + * 获取两个时间相差分钟数 + */ public long getTime(String oldTime,String newTime) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -43,4 +57,85 @@ public class SskjUtil { return diff; } + /** + * 判断培训时长扣减去哪张表中查找 + */ + public String getTableName(String resourceId, String kqDate) { + basebean.writeLog("SskjUtil getTableName start"); + + RecordSet rs = new RecordSet(); + String tableName = ""; + //首先判断该人员是当月还是隔月 4-当月,5、6-隔月 + String acqOverTimeTypeSql = "select field28 from cus_fielddata where id = ? and scopeid = 3 and scope = 'HrmCustomFieldByInfoType'"; + rs.executeQuery(acqOverTimeTypeSql, resourceId); + while ( rs.next()) { + String field28 = Util.null2String(rs.getString("field28")); + if (StringUtils.isNotBlank(field28)) { + if ("4".equals(field28)) { + tableName = THISMONTH; + } + if ("5".equals(field28) || "6".equals(field28)) { + tableName = OTHERMONTH; + } + } + } + + //再判断找那个明细表 + if (StringUtils.isNotBlank(tableName)) { + //根据加班日期的类型来判断 + //1-节假日、2-工作日、3-休息日、-1-数据异常,无效数据 + int changeType = KQOvertimeRulesBiz.getChangeType(resourceId, kqDate); + if (changeType == 1) { + tableName = tableName + "_dt1"; + } else if (changeType == 2) { + tableName = tableName + "_dt3"; + } else if (changeType == 3) { + tableName = tableName + "_dt4"; + } + } + + return tableName; + + } + + /** + * 根据加班时长处理是否需要删除转事假对应的事假 + */ + public boolean handleCasLeave(String resourceId, String kqDate, String requestid, double duration) { + + String tableName = getTableName(resourceId, kqDate); + String[] split = tableName.split("_dt"); + String handleTabel = split[0] + "_dt6"; + String acqCasData = "select qjsc, qjbid from " + handleTabel + " where sfdk = ? "; + RecordSet rs = new RecordSet(); + + Map casMap = new HashMap<>(); + rs.executeQuery(acqCasData); + while ( rs.next()) { + double qjsc = Util.getDoubleValue(Util.null2String(rs.getString("qjsc"))); + String qjbid = Util.null2String(rs.getString("qjbid")); + if (StringUtils.isNotBlank(qjbid)) { + casMap.put("qjbid", qjsc); + } + } + if (casMap != null && casMap.size() > 0) { + String modCasSql = "update " + handleTabel + " set qjsc = ?, sfdk = ?, dklcid = ? where qjbid = ?"; + String modLeaveSql = "update kq_flow_split_leave set duration = ?, durationdb = ? where id = ?"; + String delLeaveSql = ""; + List modCasList = new ArrayList<>(); + List tempList = new ArrayList(); + for (String key : casMap.keySet()) { + double qjsc = casMap.get(key); + double temp = duration - qjsc; + if (temp > 0) { + tempList.add(0); + } + + } + } + + return true; + } + + } diff --git a/src/weaver/interfaces/sskj/job/DeductTrainTimesJob.java b/src/weaver/interfaces/sskj/job/DeductTrainTimesJob.java index 6857b8d..8732f2a 100644 --- a/src/weaver/interfaces/sskj/job/DeductTrainTimesJob.java +++ b/src/weaver/interfaces/sskj/job/DeductTrainTimesJob.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alipay.api.domain.RecordDetail; import com.engine.kq.biz.KQFormatBiz; +import com.engine.kq.biz.KQLeaveRulesBiz; import com.engine.kq.biz.KQLeaveRulesComInfo; import com.engine.kq.timer.KQQueue; import com.engine.kq.timer.KQTaskBean; @@ -47,7 +48,13 @@ public class DeductTrainTimesJob extends BaseCronJob { bb.writeLog("-----DeductTrainTimesJob start-----"); try { RecordSet rs = new RecordSet(); + RecordSet rs2 = new RecordSet(); + //获取事假类型 + String calLeaveTypeId = bb.getPropValue("project_sskj", "calLeaveId"); + //获取事假单位规则 + KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo(); + String minimumUnit = kqLeaveRulesComInfo.getMinimumUnit(calLeaveTypeId); //获取当前年月日 String nowDay = DateUtil.format(new Date(),"yyyy-MM-dd"); String firstDayOfMonth = DateUtil.format(DateUtil.beginOfMonth(new Date()),"yyyy-MM-dd"); @@ -55,10 +62,12 @@ public class DeductTrainTimesJob extends BaseCronJob { Map trainInfo = new HashMap<>(); List< Map> trainInfos = new ArrayList<>(); - String acqTrainInfoSql = "select a.pxsj, a.kssj1, a.jssj1, b.xm, b.id " + + String acqTrainInfoSql = "select a.pxsj, a.kssj1, a.jssj1, a.ksh, b.xm, b.id, c.departmentid, c.subcompanyid1, c.jobtitle " + " from uf_pxjl a " + " left join uf_pxjl_dt1 b " + " on b.mainid = a.id " + + " left join hrmresource c " + + " on c.id = b.xm " + " where (b.isdeduct is null or b.isdeduct = 0) and b.xm is not null " + " and a.pxsj is not null and a.kssj1 is not null and a.jssj1 is not null " + " and a.pxsj >='" + firstDayOfMonth + "' and a.pxsj <='" + nowDay + "' "; @@ -71,19 +80,25 @@ public class DeductTrainTimesJob extends BaseCronJob { String jssj = Util.null2String(rs.getString("jssj1")); String xm = Util.null2String(rs.getString("xm")); String detailId = Util.null2String(rs.getString("id")); + String ksh = Util.null2String(rs.getString("ksh")); + String departmentid = Util.null2String(rs.getString("departmentid")); + String subcompanyid = Util.null2String(rs.getString("subcompanyid1")); + String jobtitle = Util.null2String(rs.getString("jobtitle")); trainInfo.put("detailId",detailId); trainInfo.put("pxsj",pxsj); trainInfo.put("kssj",kssj); trainInfo.put("jssj",jssj); trainInfo.put("xm",xm); + trainInfo.put("ksh",ksh); + trainInfo.put("departmentid",departmentid); + trainInfo.put("subcompanyid",subcompanyid); + trainInfo.put("jobtitle",jobtitle); trainInfos.add(trainInfo); } if ( trainInfos.size() > 0) { - List deduIdList = new ArrayList<>();//记录满足减去培训时长的加班数据 - Map< String, Object > deduTiaoxiuMap = new HashMap<>();//记录调休扣减的数据 - Map< String, Integer > overtimeTiaoxiuMap = new HashMap<>();//记录加班和调休id - List< List > deduOvertimeList = new ArrayList<>();//批量修改加班时长的数据 + + String modTrainStatusSql = "update uf_pxjl_dt1 set isdeduct = ? where id = ?"; for ( Map train: trainInfos) { String detailId = Util.null2String(train.get("detailId")); @@ -91,196 +106,79 @@ public class DeductTrainTimesJob extends BaseCronJob { String kssj = Util.null2String(train.get("kssj")); String jssj = Util.null2String(train.get("jssj")); String xm = Util.null2String(train.get("xm")); - String acqOverTimeSql = "select id, duration_min, tiaoxiuid from kq_flow_overtime where resourceid = ? and belongdate = ? " + - "and fromtimedb <='" + kssj + "' and totimedb >='" + jssj + "' "; - rs.executeQuery(acqOverTimeSql, xm, pxsj); - while ( rs.next()) { - Integer id = Util.getIntValue(Util.null2String(rs.getString("id"))); - Integer durationMin = Util.getIntValue(Util.null2String(rs.getString("duration_min"))); - String tiaoxiuid = Util.null2String(rs.getString("tiaoxiuid")); - //加班时长减去培训时长 - long minutesDifference = 0; - if ( durationMin> 0 ) { - List deduId = new ArrayList(); - deduId.add(detailId); - deduIdList.add(deduId); - LocalTime timeStart = LocalTime.parse(pxsj +" " + kssj); - LocalTime timeEnd = LocalTime.parse(pxsj +" " + jssj); - - minutesDifference = ChronoUnit.MINUTES.between(timeStart, timeEnd); - - durationMin = durationMin - ((int) minutesDifference); - if ( durationMin < 0) { - durationMin = 0; - } - } - List deduOvertime = new ArrayList<>(); - deduOvertime.add(durationMin); - deduOvertime.add(id); - deduOvertimeList.add(deduOvertime); - - //记录调休id - if (StringUtils.isNotBlank(tiaoxiuid)) { - deduTiaoxiuMap.put(tiaoxiuid,minutesDifference); - //记录加班和调休id - overtimeTiaoxiuMap.put(tiaoxiuid,id); + String departmentid = Util.null2String(train.get("departmentid")); + String subcompanyid = Util.null2String(train.get("subcompanyid")); + String jobtitle = Util.null2String(train.get("jobtitle")); + double ksh = Util.getDoubleValue(Util.null2String(train.get("ksh"))); + //查找加班记录 + SskjUtil sskjUtil = new SskjUtil(); + String tableName = sskjUtil.getTableName(xm, pxsj); + if (StringUtils.isNotBlank(tableName)) { + String acqOverTimeSql = "select count(*) as number from " + tableName + " where jbry = ? and belongdate = ? and kssj <='" + kssj + "' " + + " and jssj >='" + jssj + "' "; + String[] split = tableName.split("_dt"); + String addTraNa = ""; + String addLeaNa = ""; + String addOverNa = ""; + if (split.length > 0) { + addTraNa = split[0] + "_dt5"; + addLeaNa = split[0] + "_dt6"; + addOverNa = split[0]; } - - } - } - //先扣除掉加班的时长 - String subOverTimeSql = "update kq_flow_overtime set duration_min = ? where id = ?"; - boolean subOverTimeSqlFlag = rs.executeBatchSql(subOverTimeSql, deduOvertimeList); - bb.writeLog("subOverTimeSqlFlag: " + subOverTimeSqlFlag); - - //再回写培训台账 - String syncTrainSql = "update uf_pxjl set isdeduct = 1 where id = ? "; - boolean syncTrainSqlFlag = rs.executeBatchSql(syncTrainSql, deduIdList); - bb.writeLog("syncTrainSqlFlag: " + syncTrainSqlFlag); - - //处理调休时长 - String tiaoxiuLeaveId = Util.null2String(bb.getPropValue("project_sskj","tiaoxiuleaveid")); - String casualLeaveId = Util.null2String(bb.getPropValue("project_sskj","casualleaveid")); - if (StringUtils.isNotBlank(tiaoxiuLeaveId) && StringUtils.isNotBlank(casualLeaveId) ) { - - String overtimeSubTrainModeId = bb.getPropValue("project_sskj", "overtimeSubTrainModeId"); - Integer modedatacreater = 1; - Integer modedatacreatertype = 0; - String modedatacreatedate = DateUtil.format(new Date(), "yyyy-MM-dd"); - String modedatacreatetime = DateUtil.format(new Date(), "HH:mm:ss"); - - //获取在职员工的信息 - Map> resInfos = new HashMap<>(); - String acqResSql = "select id, subcompanyid1, departmentid, jobtitle from hrmresource where status in (0,1,2,3)"; - rs.executeQuery(acqResSql); - while ( rs.next()) { - String id = Util.null2String(rs.getString("id")); - String subcompanyid = Util.null2String(rs.getString("subcompanyid1")); - String departmentid = Util.null2String(rs.getString("departmentid")); - String jobtitle = Util.null2String(rs.getString("jobtitle")); - List infos = new ArrayList<>(); - infos.add(subcompanyid); - infos.add(departmentid); - infos.add(jobtitle); - resInfos.put(id, infos); - } - //获取事假最小请假单位 - String minimumUnit = new KQLeaveRulesComInfo().getMinimumUnit(casualLeaveId); - - //调休时长扣减 - List tiaoxiuSubList = new ArrayList<>(); - //转事假 - List casualLeaveList = new ArrayList<>(); - //变动记录 - List changeLogList = new ArrayList<>(); - - String leaveDetailIds = deduTiaoxiuMap.keySet().stream() - .map(Object::toString) - .collect(Collectors.joining(",")); - - String acqTiaoxiuSql = "select id, tiaoxiuamount, usedAmount, resourceId from kq_balanceofleave where id in (" + leaveDetailIds + ")"; - rs.executeQuery(acqTiaoxiuSql); - while ( rs.next()) { - double tiaoxiuAmount = Util.getDoubleValue(Util.null2String(rs.getString("tiaoxiuamount"))); - double usedAmount = Util.getDoubleValue(Util.null2String(rs.getString("usedAmount"))); - int resourceId = Util.getIntValue(Util.null2String(rs.getString("resourceId"))); - int id = Util.getIntValue(Util.null2String(rs.getString("id")));//调休表id - double duration = Util.getDoubleValue(Util.null2String(deduTiaoxiuMap.get(id))); - if ( (tiaoxiuAmount - usedAmount - duration) >=0 ) {//调休 - List tiaoxiuSub = new ArrayList(); - tiaoxiuSub.add(tiaoxiuAmount - duration); - tiaoxiuSub.add(id); - tiaoxiuSubList.add(tiaoxiuSub); - List changeLog = new ArrayList(); - changeLog.add(resourceId); - Integer overtimeId = overtimeTiaoxiuMap.get(String.valueOf(id)); - changeLog.add(overtimeId); - changeLog.add(id); - changeLog.add(duration); - changeLog.add(tiaoxiuAmount); - changeLog.add(tiaoxiuAmount - duration); - changeLog.add(tiaoxiuLeaveId); - changeLogList.add(changeLog); - } else {//事假 - List casualLeave = new ArrayList(); - casualLeave.add(resourceId);//resourceid - casualLeave.add(resourceId);//fromdate - casualLeave.add(resourceId);//fromtime - casualLeave.add(resourceId);//todate - casualLeave.add(resourceId);//totime - casualLeave.add(casualLeaveId);//newleavetype - casualLeave.add(duration);//duration - casualLeave.add(minimumUnit);//durationrule - casualLeave.add(resourceId);//fromdatedb - casualLeave.add(resourceId);//fromtimedb - casualLeave.add(resourceId);//todatedb - casualLeave.add(resourceId);//totimedb - casualLeave.add(duration);//durationdb - casualLeave.add(resourceId);//belongdate - List infos = resInfos.get(resourceId); - String subcompanyid = infos.get(0); - String departmentid = infos.get(1); - String jobtitle = infos.get(2); - casualLeave.add(subcompanyid);//subcompanyid - casualLeave.add(departmentid);//departmentid - casualLeave.add(jobtitle);//jobtitle - casualLeave.add(resourceId);//changetype - casualLeaveList.add(casualLeave); - List changeLog = new ArrayList(); - changeLog.add(resourceId); - Integer overtimeId = overtimeTiaoxiuMap.get(String.valueOf(id)); - changeLog.add(overtimeId); - changeLog.add("0"); - changeLog.add(duration); - changeLog.add("0.0000"); - changeLog.add(duration); - changeLog.add(casualLeaveId); - changeLog.add(overtimeSubTrainModeId); - changeLog.add(modedatacreater); - changeLog.add(modedatacreatertype); - changeLog.add(modedatacreatedate); - changeLog.add(modedatacreatetime); - String uuid = UUID.randomUUID().toString(); - changeLog.add(uuid); - changeLogList.add(changeLog); + String addTrainSql = "insert into " + addTraNa + " (pxry, pxrq, kssj, jssj, pxsc) values (?,?,?,?,?)"; + String addLeaSql = "insert into " + addLeaNa + " (qjry, qjlx, qjrq, kssj, jssj, sfdk, qjbid, qjsc) values (?,?,?,?,?,?,?,?)"; + String acqOverSql = "select jbzsy from " + addOverNa + " where xm = ? and ny = ? "; + String addCaslLeaSql = "insert into kq_flow_split_leave (resourceid, fromdate, fromtime, todate, totime, newleavetype, " + + " duration, durationrule, fromdatedb, fromtimedb, todatedb, totimedb, durationdb, belongdate, subcompanyid, " + + " departmentid, jobtitle, changetype, casleaveuuid ) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + String acqCasLeaveSql = "select id from kq_flow_split_leave where casleaveuuid = ?"; + String modTrainSql = "update " + addOverNa + " set pxzsc = (select sum(pxsc) from " + addTraNa + " as dt_table where " + + " dt_table.mainid = " + addOverNa + ".id ) where xm = ? and ny = ? "; + String modOverSql = "update " + addOverNa + " set jbzsy = (psjbsy + zmjbsy + jrjbsy - pxzsc) where xm = ? and ny = ? "; + + rs.executeQuery(acqOverTimeSql, xm, pxsj); + while (rs.next()) { + int number = Util.getIntValue(Util.null2String(rs.getString("number"))); + if (number > 0) { + //插入一条培训记录 + boolean b = rs2.executeUpdate(addTrainSql, xm, pxsj, kssj, jssj, ksh); + //重新计算主表培训总时长 + if (b) { + boolean b1 = rs2.executeUpdate(modTrainSql, xm, pxsj.substring(0, 7)); + bb.writeLog("重新计算主表培训总时长: " + b1); + if (b1) { + //重新计算主表加班总剩余时长 + boolean b2 = rs2.executeUpdate(modOverSql, xm, pxsj.substring(0, 7)); + bb.writeLog("重新计算主表加班总剩余时长: " + b2); + } + } + } } - } - //调休扣减 - String subTiaoxiuSql = "update kq_balanceofleave set tiaoxiuamount = ? where id = ?"; - boolean subTiaoxiuSqlFlag = rs.executeBatchSql(subTiaoxiuSql, tiaoxiuSubList); - bb.writeLog("subTiaoxiuSqlFlag: " + subTiaoxiuSqlFlag); - - //事假扣减 - String addCasSql = "insert into kq_flow_split_leave " + - " (resourceid, fromdate, fromtime, todate, totime, newleavetype, duration, durationrule, fromdatedb, fromtimedb, todatedb, totimedb," + - " durationdb, belongdate, subcompanyid, departmentid, jobtitle, changetype )" + - " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; - boolean addCasSqlFlag = rs.executeBatchSql(addCasSql, casualLeaveList); - bb.writeLog("addCasSqlFlag: " + addCasSqlFlag); - - //变动记录 - String syncChangeSql = "insert into uf_overtimesubtrain " + - " (resourceId, overtimedataId, tiaoxiudataId, subduration, beforeduration, afterduration, leavetype, " + - " formmodeid, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, MODEUUID ) " + - " values (?,?,?,?,?,?,?,?,?,?,?,?,?)"; - bb.writeLog("syncChangeSql:" + syncChangeSql); - - boolean syncChangeSqlFlag = rs.executeBatchSql(syncChangeSql, changeLogList); - bb.writeLog("addFlag:" + syncChangeSqlFlag); - if (syncChangeSqlFlag) { - for ( List changeLog: changeLogList) { - String uuid = Util.null2String(changeLog.get(changeLog.size() - 1)); - String billid = "-1"; - String acqModeIdSql = "select id from uf_NoOutEmpNum where MODEUUID = ?"; - rs.executeQuery(acqModeIdSql, uuid); - while (rs.next()) { - billid = Util.null2String(rs.getString("id")); + //根据目前加班剩余时长来判断是否需要插入一条事假的数据 + rs2.executeQuery(acqOverSql, xm, pxsj.substring(0, 7)); + while (rs2.next()) { + double jbzsy = Util.getDoubleValue(Util.null2String(rs.getString("jbzsy"))); + double temp = ksh - jbzsy; + if (temp > 0) { + Integer casleaveId = -1; + //生成一条事假数据 + String uuid = UUID.randomUUID().toString(); + boolean b = rs.executeUpdate(addCaslLeaSql, xm, pxsj, kssj, pxsj, jssj, calLeaveTypeId, ksh, + minimumUnit, pxsj, kssj, pxsj, jssj, ksh, pxsj, subcompanyid, departmentid, jobtitle, 0, uuid); + if (b) { + rs.executeQuery(acqCasLeaveSql, uuid); + while (rs.next()) { + casleaveId = Util.getIntValue(Util.null2String(rs.getString("id"))); + } + } + //记录事假台账 + rs.executeUpdate(addLeaSql, xm, calLeaveTypeId, pxsj, kssj, jssj, 0, casleaveId, temp); } - bb.writeLog("billid:" + billid); - SskjUtil sskjUtil = new SskjUtil(); - sskjUtil.modePerRecon(modedatacreater, overtimeSubTrainModeId, billid); } } + //回写培训台账修改状态 + rs.executeUpdate(modTrainStatusSql, 1, detailId); + } } } catch (Exception e) {