package weaver.interfaces.sskj.action; import cn.hutool.core.date.DateUtil; import com.engine.kq.biz.*; import com.engine.kq.entity.KQOvertimeRulesDetailEntity; import com.engine.sskj.util.SskjUtil; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.general.BaseBean; import weaver.general.Util; import weaver.interfaces.workflow.action.Action; import weaver.soa.workflow.request.MainTableInfo; import weaver.soa.workflow.request.Property; import weaver.soa.workflow.request.RequestInfo; import java.util.Date; import java.util.Map; import java.util.UUID; /** * 连班加班流程 */ public class OverTimeAction implements Action { BaseBean bb = new BaseBean(); @Override public String execute(RequestInfo requestInfo) { try { bb.writeLog("OverTimeAction start"); RecordSet rs = new RecordSet(); Integer resourceId = -1; String fromDate = ""; String fromTime = ""; String toDate = ""; String toTime = ""; String dataId = ""; String requestId = Util.null2String(requestInfo.getRequestid()); MainTableInfo mainTableInfo = requestInfo.getMainTableInfo(); Property[] properties = mainTableInfo.getProperty(); for (Property property : properties) { if (property.getName().equals("id")) { dataId = Util.null2String(property.getValue()); } if (property.getName().equals("resourceId")) { resourceId = Util.getIntValue(Util.null2String(property.getValue())); } if (property.getName().equals("fromDate")) { fromDate = Util.null2String(property.getValue()); } if (property.getName().equals("fromTime")) { fromTime = Util.null2String(property.getValue()); } if (property.getName().equals("toDate")) { toDate = Util.null2String(property.getValue()); } if (property.getName().equals("toTime")) { toTime = Util.null2String(property.getValue()); } } //计算时长 SskjUtil sskjUtil = new SskjUtil(); String startTime = ""; String endTime = ""; if ( StringUtils.isNotBlank(fromDate) && StringUtils.isNotBlank(fromTime)) { startTime = fromDate + " " +fromTime; } if ( StringUtils.isNotBlank(toDate) && StringUtils.isNotBlank(toTime)) { endTime = toDate + " " +toTime; } if ( StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { startTime = startTime + ":00"; endTime = endTime + ":00"; } long durationOfOvertime = sskjUtil.getTime(startTime, endTime); bb.writeLog("durationOfOvertime:" + durationOfOvertime); bb.writeLog("startTime:" + startTime); bb.writeLog("endTime:" + endTime); bb.writeLog("fromDate:" + fromDate); bb.writeLog("toDate:" + toDate); bb.writeLog("fromTime:" + fromTime); bb.writeLog("toTime:" + toTime); //处理加班时长归属日 String belongTo = fromDate; /*获取加班调休设置*/ //首先获取人员的考勤组 KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); String groupId = kqGroupMemberComInfo.getKQGroupId(Util.null2String(resourceId), belongTo); bb.writeLog("groupId:" + groupId); //根据考勤组获取对应的加班规则 KQOvertimeRulesDetailEntity overtimeRulesDetail = getOvertimeRulesDetail(Util.null2String(resourceId), belongTo); //判断当天是否允许加班 int overtimeEnable = overtimeRulesDetail.getOvertimeEnable(); bb.writeLog("overtimeEnable:" + overtimeEnable); if (overtimeEnable == 0) {//不允许加班 return Action.SUCCESS; } //判断时长是否大于最小加班时长 int minimumLen = overtimeRulesDetail.getMinimumLen(); bb.writeLog("minimumLen:" + minimumLen); if (minimumLen > durationOfOvertime) {//低于最小加班时长,不生成加班数据 return Action.SUCCESS; } //判断当天加班是否需要转调休 int paidLeaveEnable = overtimeRulesDetail.getPaidLeaveEnable(); bb.writeLog("paidLeaveEnable:" + paidLeaveEnable); if (paidLeaveEnable == 0 ) {//不转调休 //直接生成加班数据 int computingMode = overtimeRulesDetail.getComputingMode(); bb.writeLog("computingMode:" + computingMode); int changeType = KQHolidaySetBiz.getChangeType(groupId, belongTo); bb.writeLog("changeType:" + changeType); if (changeType != 1 && changeType != 2 && changeType != 3) { KQWorkTime kqWorkTime = new KQWorkTime(); changeType = kqWorkTime.isWorkDay(Util.null2String(resourceId), belongTo) ? 2 : 3; } bb.writeLog("changeType:" + changeType); boolean b = genOvertimeData(requestId, Util.null2String(resourceId), fromDate, toDate, belongTo, fromTime, toTime, String.valueOf(durationOfOvertime), String.valueOf(changeType), "1", String.valueOf(paidLeaveEnable), String.valueOf(computingMode), null); if (b) { //将加班数据记录到连班加班建模表中 String syncConOverTimeSql = "insert into uf_conOvertime (resourceId, fromDate, fromTime, toDate, toTime, formmodeid, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, MODEUUID)" + " values (?,?,?,?,?,?,?,?,?,?,?)"; String conOvertimeModeId = bb.getPropValue("project_sskj", "conOvertimeModeId"); Integer modedatacreater = 1; Integer modedatacreatertype = 0; String modedatacreatedate = DateUtil.format(new Date(), "yyyy-MM-dd"); String modedatacreatetime = DateUtil.format(new Date(), "HH:mm:ss"); String uuid = UUID.randomUUID().toString(); bb.writeLog("syncConOverTimeSql:" + syncConOverTimeSql); boolean addFlag = rs.executeUpdate(syncConOverTimeSql, resourceId, fromDate, fromTime, toDate, toTime, conOvertimeModeId, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, uuid); bb.writeLog("addFlag:" + addFlag); if (addFlag) { String billid = "-1"; String acqModeIdSql = "select id from uf_conOvertime where MODEUUID = ?"; rs.executeQuery(acqModeIdSql, uuid); while (rs.next()) { billid = Util.null2String(rs.getString("id")); } bb.writeLog("billid:" + billid); sskjUtil.modePerRecon(modedatacreater, conOvertimeModeId, billid); } return Action.SUCCESS; } else { String error = "加班生成失败!"; requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999"); requestInfo.getRequestManager().setMessagecontent(error); return Action.FAILURE_AND_CONTINUE; } } else { /*先生成调休数据*/ //先获取工作时长 String worktime = "0"; String acqWorkTimeSql = "select worktime from kq_shiftmanagement where id = (select serialids from kq_group where id = ? )"; rs.executeQuery(acqWorkTimeSql, groupId); while ( rs.next()) { worktime = Util.null2String(rs.getString("worktime")); } bb.writeLog("worktime:" + worktime); Map otherParam = Maps.newHashMap(); otherParam.put("timepoint_key", "连班加班生成调休"); String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(Util.null2String(resourceId), belongTo, String.valueOf(durationOfOvertime), "0", worktime, requestId, "2", fromDate, otherParam); bb.writeLog("tiaoxiuId:" + tiaoxiuId); boolean flag = Util.getIntValue(tiaoxiuId, -1) > 0; //生成加班数据 if (flag) { int computingMode = overtimeRulesDetail.getComputingMode(); bb.writeLog("computingMode:" + computingMode); int changeType = KQHolidaySetBiz.getChangeType(groupId, belongTo); bb.writeLog("changeType:" + changeType); if (changeType != 1 && changeType != 2 && changeType != 3) { KQWorkTime kqWorkTime = new KQWorkTime(); changeType = kqWorkTime.isWorkDay(Util.null2String(resourceId), belongTo) ? 2 : 3; } bb.writeLog("changeType:" + changeType); boolean b = genOvertimeData(requestId, Util.null2String(resourceId), fromDate, toDate, belongTo, fromTime, toTime, String.valueOf(durationOfOvertime), String.valueOf(changeType), "1", String.valueOf(paidLeaveEnable), String.valueOf(computingMode), tiaoxiuId); if (b) { //将加班数据记录到连班加班建模表中 String syncConOverTimeSql = "insert into uf_conOvertime (resourceId, fromDate, fromTime, toDate, toTime, formmodeid, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, MODEUUID)" + " values (?,?,?,?,?,?,?,?,?,?,?)"; String conOvertimeModeId = bb.getPropValue("project_sskj", "conOvertimeModeId"); Integer modedatacreater = 1; Integer modedatacreatertype = 0; String modedatacreatedate = DateUtil.format(new Date(), "yyyy-MM-dd"); String modedatacreatetime = DateUtil.format(new Date(), "HH:mm:ss"); String uuid = UUID.randomUUID().toString(); bb.writeLog("syncConOverTimeSql:" + syncConOverTimeSql); boolean addFlag = rs.executeUpdate(syncConOverTimeSql, resourceId, fromDate, fromTime, toDate, toTime, conOvertimeModeId, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, uuid); bb.writeLog("addFlag:" + addFlag); if (addFlag) { String billid = "-1"; String acqModeIdSql = "select id from uf_conOvertime where MODEUUID = ?"; rs.executeQuery(acqModeIdSql, uuid); while (rs.next()) { billid = Util.null2String(rs.getString("id")); } bb.writeLog("billid:" + billid); sskjUtil.modePerRecon(modedatacreater, conOvertimeModeId, billid); } return Action.SUCCESS; } else { String error = "加班生成失败!"; requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999"); requestInfo.getRequestManager().setMessagecontent(error); return Action.FAILURE_AND_CONTINUE; } } else { String error = "调休生成失败!"; requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999"); requestInfo.getRequestManager().setMessagecontent(error); return Action.FAILURE_AND_CONTINUE; } } }catch(Exception e) { bb.writeLog("OverTimeAction Exception: " + e); return Action.FAILURE_AND_CONTINUE; } } /** * 生成加班数据 */ private boolean genOvertimeData(String requestId, String resourceId, String fromDate, String toDate, String belongDate, String fromTime, String toTime, String durationMin, String changType, String durationrule, String paidLeaveEnable, String computingMode, String tiaoxiuId) { RecordSet rs = new RecordSet(); String addOverTimeSql = "insert into kq_flow_overtime (requestid, resourceid, fromdate, fromtime, todate, totime, fromdatedb, fromtimedb, todatedb, " + "totimedb, duration_min, belongdate, durationrule, changetype, paidLeaveEnable, computingMode, tiaoxiuid, flow_mins, card_mins) values " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; boolean flag = rs.executeUpdate(addOverTimeSql, requestId, resourceId, fromDate, fromTime+":00", toDate, toTime+":00", fromDate, fromTime, toDate, toTime, durationMin, belongDate, durationrule, changType, paidLeaveEnable, computingMode, tiaoxiuId, 0, 0); bb.writeLog("flag:" + flag); return flag; } /** * 获取加班规则的明细 */ private static KQOvertimeRulesDetailEntity getOvertimeRulesDetail(String resourceId, String date) { BaseBean bb = new BaseBean(); KQOvertimeRulesDetailEntity kqOvertimeRulesDetail = new KQOvertimeRulesDetailEntity(); try { /*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/ KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo(); String groupIds = kqGroupMemberComInfo.getKQGroupId(resourceId, date); if (groupIds.equals("")) { /*该人员不存在于任意一个考勤组中,请为其设置考勤组*/ bb.writeLog("该人员不存在于任意一个考勤组中,请为其设置考勤组。resourceId=" + resourceId + ",date=" + date); } int changeType = KQOvertimeRulesBiz.getChangeType(resourceId, date); /*获取当前日期的日期类型错误*/ if (changeType != 1 && changeType != 2 && changeType != 3) { bb.writeLog("获取当前日期的日期类型错误。resourceId=" + resourceId + ",date=" + date + ",changeType=" + changeType); } int overtimeRuleId = 0;//加班规则的ID RecordSet recordSet = new RecordSet(); String sql = "select id from kq_OvertimeRules where (isDelete is null or isDelete !=1) "; if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) { sql += " and ','+groupIds+',' like '%," + groupIds + ",%'"; } else if (recordSet.getDBType().equalsIgnoreCase("mysql")) { sql += " and concat(',',groupIds,',') like '%," + groupIds + ",%'"; } else { sql += " and ','||groupIds||',' like '%," + groupIds + ",%'"; } recordSet.executeQuery(sql); if (recordSet.next()) { overtimeRuleId = recordSet.getInt("id"); sql = "select * from kq_OvertimeRulesDetail where ruleId=" + overtimeRuleId + " and dayType=" + changeType; recordSet.executeQuery(sql); if (recordSet.next()) { int ruleId = recordSet.getInt("ruleId"); int dayType = recordSet.getInt("dayType"); int overtimeEnable = recordSet.getInt("overtimeEnable"); int computingMode = recordSet.getInt("computingMode"); int startTime = recordSet.getInt("startTime"); int minimumLen = recordSet.getInt("minimumLen"); int paidLeaveEnable = recordSet.getInt("paidLeaveEnable"); double lenOfOvertime = Util.getDoubleValue(recordSet.getString("lenOfOvertime"), 1.00); double lenOfLeave = Util.getDoubleValue(recordSet.getString("lenOfLeave"), 1.00); int hasRestTime = Util.getIntValue(recordSet.getString("hasRestTime")); kqOvertimeRulesDetail.setRuleId(ruleId); kqOvertimeRulesDetail.setDayType(dayType); kqOvertimeRulesDetail.setOvertimeEnable(overtimeEnable); kqOvertimeRulesDetail.setComputingMode(computingMode); kqOvertimeRulesDetail.setStartTime(startTime); kqOvertimeRulesDetail.setMinimumLen(minimumLen); kqOvertimeRulesDetail.setPaidLeaveEnable(paidLeaveEnable); kqOvertimeRulesDetail.setLenOfOvertime(lenOfOvertime); kqOvertimeRulesDetail.setLenOfLeave(lenOfLeave); kqOvertimeRulesDetail.setHasRestTime(hasRestTime); } } else { bb.writeLog("该人员所属的考勤组没有设置过任何加班规则,请为其设置加班规则。resourceId=" + resourceId + ",date="+date+",changeType=" + changeType); } } catch (Exception e) { bb.writeLog("根据人员ID获取加班规则的规则内容出错。resourceId=" + resourceId + ",date=" + date); e.printStackTrace(); } return kqOvertimeRulesDetail; } }