You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-develop/src/com/engine/kq/wfset/util/SplitActionUtil.java

3488 lines
180 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.engine.kq.wfset.util;
import org.springframework.beans.BeanUtils;
import com.alibaba.fastjson.JSON;
import com.engine.kq.bean.KQHrmScheduleSign;
import com.engine.kq.bean.KQRepeatBean;
import com.engine.kq.biz.*;
import com.engine.kq.biz.chain.duration.WorkHalfUnitSplitChain;
import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean;
import com.engine.kq.entity.KQOvertimeRulesDetailEntity;
import com.engine.kq.enums.DurationTypeEnum;
import com.engine.kq.jucailin.util.KQDateUtil;
import com.engine.kq.log.KQLog;
import com.engine.kq.timer.KQQueue;
import com.engine.kq.timer.KQTaskBean;
import com.engine.kq.util.KQDurationCalculatorUtil;
import com.engine.kq.wfset.bean.SplitBean;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Date;
import java.sql.Timestamp;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
public class SplitActionUtil extends BaseBean {
public static KQLog kqLog = new KQLog();
private static BaseBean baseBean = new BaseBean();
/**
* 现在先用正常的去执行吧
*
* @param splitBeans
* @param requestid
*/
public static void handleLeaveAction(List<SplitBean> splitBeans, String requestid) {
for (int i = 0; i < splitBeans.size(); i++) {
SplitBean splitBean = splitBeans.get(i);
String resourceId = splitBean.getResourceId();
String duration = splitBean.getDuration();
String newLeaveType = splitBean.getNewLeaveType();
String durationrule = splitBean.getDurationrule();
String fromdate = splitBean.getFromDate();
String fromdatedb = splitBean.getFromdatedb();
kqLog.info("请假扣减:resourceId:" + resourceId + ":fromdate:" + fromdate + ":duration:" + duration + ":newLeaveType:" + newLeaveType + ":durationrule:" + durationrule + ":requestid:" + requestid + ":fromdatedb:" + fromdatedb);
if(Util.getDoubleValue(duration) <= 0){
continue;
}
KQBalanceOfLeaveBiz.addUsedAmount(resourceId, fromdate, newLeaveType, duration, "", requestid, fromdatedb);
}
}
/**
* 单独针对加班规则的第二种模式 生成加班数据
*
* @param splitBeans
* @param requestid
*/
public static void handleOverTimeActionMode2(List<SplitBean> splitBeans, String requestid) {
clearSameRequestTX(requestid);
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
List<String> overKeys = new ArrayList<>();
for (int i = 0; i < splitBeans.size(); i++) {
SplitBean splitBean = splitBeans.get(i);
int computingMode = Util.getIntValue(splitBean.getComputingMode());
if (computingMode == 2 || computingMode == 4) {
//判断流程对应的日期下有没有打卡数据,如果有的话,需要生成相应的调休数据
String belongDate = splitBean.getBelongDate();
String resourceId = splitBean.getResourceId();
String fromtime = splitBean.getFromTime();
int fromtimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(fromtime);
String key = resourceId + "_" + belongDate + "_" + belongDate;
if (fromtimeIndex > 1439) {
//跨天了
key = resourceId + "_" + belongDate + "_" + DateUtil.addDate(belongDate, 1);
}
if (!overKeys.contains(key)) {
overKeys.add(key);
}
}
if (computingMode == 1) {
doComputingMode1_splitBean(splitBean);
}
}
KQOverTimeRuleCalBiz kqOvertimeCalBiz = new KQOverTimeRuleCalBiz();
kqLog.info("加班生成调休:handleOverTimeActionMode2 overKeys:" + JSON.toJSONString(overKeys));
if (overKeys != null && !overKeys.isEmpty()) {
for (String key : overKeys) {
String[] keys = key.split("_", -1);
if (keys.length == 3) {
String resourceId = keys[0];
String fromDate = keys[1];
String belongToDate = keys[2];
if(checkHasKTCard(resourceId, fromDate)){
fromDate = DateUtil.addDate(fromDate,-1);
}
kqOvertimeCalBiz.buildOvertime(resourceId, fromDate, belongToDate, "加班流程生成加班#flow,requestId:" + requestid);
}
}
}
}
/**
* 判斷下昨日的打卡有沒有落在今日的數據,如果有,則加班需要往前多算一天
* @param resourceId
* @param belongDate
* @return
*/
public static boolean checkHasKTCard(String resourceId, String belongDate){
RecordSet recordSet = new RecordSet();
//如果打卡存在跨天的情况
String sql = "select count(*) as cnt from KQ_FORMAT_DETAIL where RESOURCEID="+resourceId+" and KQDATE='"+DateUtil.addDate(belongDate, -1)+"' and (SIGNOUTDATE='"+belongDate+"' or signindate='"+belongDate+"')";
recordSet.executeQuery(sql);
if(recordSet.next()){
String cnt = recordSet.getString("cnt");
if(Util.getIntValue(cnt, 0) > 0){
return true;
}
}
return false;
}
public static void turnOvertimeBeansWithRule(List<SplitBean> splitBeans) {
Map<String, List<SplitBean>> resourceMap = new HashMap<>();
//公众假日加班时长
double D_Pub_Duration = 0.0;
double D_Pub_Mins = 0.0;
//工作日加班时长
double D_Work_Duration = 0.0;
double D_Work_Mins = 0.0;
//休息日加班时长
double D_Rest_Duration = 0.0;
double D_Rest_Mins = 0.0;
//公众假日加班
List<SplitBean> holiday = new ArrayList<>();
//工作日加班
List<SplitBean> work = new ArrayList<>();
//休息日加班
List<SplitBean> rest = new ArrayList<>();
String pub_date = "";
String work_date = "";
String rest_date = "";
//每一天的流程时长都在这里了,搞吧
for (SplitBean sb : splitBeans) {
// * 1-公众假日、2-工作日、3-休息日
String tmpResid = sb.getResourceId();
if (resourceMap.containsKey(tmpResid)) {
resourceMap.get(tmpResid).add(sb);
} else {
List<SplitBean> splitBeans_tmp = new ArrayList<>();
splitBeans_tmp.add(sb);
resourceMap.put(tmpResid, splitBeans_tmp);
}
}
if (!resourceMap.isEmpty()) {
for (Map.Entry<String, List<SplitBean>> me : resourceMap.entrySet()) {
String resourceid = me.getKey();
List<SplitBean> tmp_splitbeans = me.getValue();
for (SplitBean sb : tmp_splitbeans) {
// * 1-公众假日、2-工作日、3-休息日
int changeType = sb.getChangeType();
double durations = Util.getDoubleValue(sb.getDuration(), 0.0);
double durationMins = sb.getD_Mins();
if (1 == changeType) {
D_Pub_Duration += durations;
D_Pub_Mins += durationMins;
pub_date = sb.getBelongDate();
holiday.add(sb);
}
if (2 == changeType) {
D_Work_Duration += durations;
D_Work_Mins += durationMins;
work_date = sb.getBelongDate();
work.add(sb);
}
if (3 == changeType) {
D_Rest_Duration += durations;
D_Rest_Mins += durationMins;
rest_date = sb.getBelongDate();
rest.add(sb);
}
}
if (D_Pub_Duration > 0) {
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceid, pub_date);
if (D_Pub_Mins < minimumUnit) {
for (SplitBean tmp : holiday) {
tmp.setDuration("0.0");
tmp.setD_Mins(0.0);
}
}
}
if (D_Work_Duration > 0) {
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceid, work_date);
if (D_Work_Mins < minimumUnit) {
for (SplitBean tmp : work) {
tmp.setDuration("0.0");
tmp.setD_Mins(0.0);
}
}
}
if (D_Rest_Duration > 0) {
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceid, rest_date);
if (D_Rest_Mins < minimumUnit) {
for (SplitBean tmp : rest) {
tmp.setDuration("0.0");
tmp.setD_Mins(0.0);
}
}
}
}
}
}
/**
* 生成加班数据
*
* @param splitBeans
* @param requestid
* @param canMode2 是否是归档节点 归档节点才可以把加班数据写到加班中间表,不是归档节点的话意味着只生成调休不生成加班,只有强制归档canMode2才是true
* @param from_uuid 来自action的uuid
*/
public static void handleOverTimeAction(List<SplitBean> splitBeans, String requestid,
boolean canMode2, String from_uuid) throws Exception {
// 保证同一个requestid能重复生成调休和加班
if (canMode2) {
clearSameRequestTX(requestid);
}
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
RecordSet rs = new RecordSet();
List<String> overKeys = new ArrayList<>();
for (int i = 0; i < splitBeans.size(); i++) {
SplitBean splitBean = splitBeans.get(i);
String resourceId = splitBean.getResourceId();
String belongDate = splitBean.getBelongDate();
String toDate = splitBean.getToDate();
String duration = splitBean.getDuration();
String durationrule = splitBean.getDurationrule();
int computingMode = Util.getIntValue(splitBean.getComputingMode());
int changeType = splitBean.getChangeType();
String paidSql = "insert into KQ_PAID_VACATION (requestId,workflowId,dataid,detailid,resourceId,fromDate,fromTime,toDate,toTime,duration,durationrule,computingMode,changeType)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isLog = rs.executeUpdate(paidSql, splitBean.getRequestId(), splitBean.getWorkflowId(),
splitBean.getDataId(), splitBean.getDetailId(), splitBean.getResourceId(),
splitBean.getFromDate(), splitBean.getFromTime(), splitBean.getToDate(),
splitBean.getToTime(), splitBean.getDuration(), splitBean.getDurationrule(), computingMode, changeType);
if (isLog) {
kqLog.info("加班生成调休:resourceId:" + resourceId + ":computingMode:" + computingMode + ":belongDate:" + belongDate + ":duration:" + duration + ":durationrule:" + durationrule + ":requestid:" + requestid);
if (computingMode == 1) {
doComputingMode1_4TX(splitBean);
if (canMode2) {
doComputingMode1_splitBean(splitBean);
}
}
if (canMode2 && (computingMode == 2 || computingMode == 4)) {
//判断流程对应的日期下有没有打卡数据,如果有的话,需要生成相应的调休数据
String fromtime = splitBean.getFromTime();
int fromtimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(fromtime);
String key = resourceId + "_" + belongDate + "_" + belongDate;
if (fromtimeIndex > 1439) {
//跨天了
key = resourceId + "_" + belongDate + "_" + DateUtil.addDate(belongDate, 1);
}
if (!overKeys.contains(key)) {
overKeys.add(key);
}
}
}
}
KQOverTimeRuleCalBiz kqOvertimeCalBiz = new KQOverTimeRuleCalBiz();
kqLog.info("加班生成调休:handleOverTimeAction overKeys:" + JSON.toJSONString(overKeys));
if (overKeys != null && !overKeys.isEmpty()) {
for (String key : overKeys) {
String[] keys = key.split("_", -1);
if (keys.length == 3) {
String resourceId = keys[0];
String fromDate = keys[1];
String belongToDate = keys[2];
if(checkHasKTCard(resourceId, fromDate)){
fromDate = DateUtil.addDate(fromDate,-1);
}
kqOvertimeCalBiz.buildOvertime(resourceId, fromDate, belongToDate, "加班流程生成加班#flow,requestId:" + requestid + "#from_uuid|" + from_uuid);
}
}
}
}
/**
* 保证同一个requestid能重复生成调休和加班
*
* @param requestid
*/
public static void clearSameRequestTX(String requestid) {
String all_tiaoxiuids = "";
List<String> all_tiaoxiuidList = Lists.newArrayList();
RecordSet rs = new RecordSet();
String sql = "select * from kq_flow_overtime where requestid = ? ";
rs.executeQuery(sql, requestid);
while (rs.next()) {
String tiaoxiuid = Util.null2String(rs.getString("tiaoxiuid"), "");
if (tiaoxiuid.length() > 0 && Util.getIntValue(tiaoxiuid) > 0) {
all_tiaoxiuids += "," + tiaoxiuid;
all_tiaoxiuidList.add(tiaoxiuid);
}
}
if (all_tiaoxiuids.length() > 0) {
all_tiaoxiuids = all_tiaoxiuids.substring(1);
String tiaoxiuidis0 = "";
String delSql0 = "select * from kq_balanceofleave where " + Util.getSubINClause(all_tiaoxiuids, "id", "in") + " and "
+ " baseamount =0 and extraamount=0 and usedamount=0 and baseamount2=0 and extraamount2=0 and usedamount2=0 ";
if (rs.getDBType().equalsIgnoreCase("oracle")) {
delSql0 = "select * from kq_balanceofleave where " + Util.getSubINClause(all_tiaoxiuids, "id", "in") + " and "
+ " nvl(baseamount,0) =0 and nvl(extraamount,0)=0 and nvl(usedamount,0)=0 and nvl(baseamount2,0)=0 "
+ " and nvl(extraamount2,0)=0 and nvl(usedamount2,0)=0 ";
} else if ((rs.getDBType()).equalsIgnoreCase("mysql")) {
delSql0 = "select * from kq_balanceofleave where " + Util.getSubINClause(all_tiaoxiuids, "id", "in") + " and "
+ " ifnull(baseamount,0) =0 and ifnull(extraamount,0)=0 and ifnull(usedamount,0)=0 and ifnull(baseamount2,0)=0 "
+ " and ifnull(extraamount2,0)=0 and ifnull(usedamount2,0)=0 ";
} else {
delSql0 = "select * from kq_balanceofleave where " + Util.getSubINClause(all_tiaoxiuids, "id", "in") + " and "
+ " isnull(baseamount,0) =0 and isnull(extraamount,0)=0 and isnull(usedamount,0)=0 and isnull(baseamount2,0)=0 "
+ " and isnull(extraamount2,0)=0 and isnull(usedamount2,0)=0 ";
}
rs.executeQuery(delSql0);
kqLog.info("all_tiaoxiuidList:" + all_tiaoxiuidList);
kqLog.info("clearSameRequestTX:" + delSql0);
while (rs.next()) {
String tiaoxiuid = Util.null2String(rs.getString("id"), "");
if (tiaoxiuid.length() > 0 && Util.getIntValue(tiaoxiuid) > 0) {
tiaoxiuidis0 += "," + tiaoxiuid;
all_tiaoxiuidList.remove(tiaoxiuid);
}
}
kqLog.info("all_tiaoxiuidList:" + all_tiaoxiuidList);
kqLog.info("tiaoxiuidis0:" + tiaoxiuidis0);
if (tiaoxiuidis0.length() > 0) {
tiaoxiuidis0 = tiaoxiuidis0.substring(1);
String delSql = "delete from kq_balanceofleave where " + Util.getSubINClause(tiaoxiuidis0, "id", "in");
boolean isok = rs.executeUpdate(delSql);
kqLog.info("delSql:" + delSql + ":isok:" + isok);
}
if (!all_tiaoxiuidList.isEmpty()) {
String clear_tiaoxiuids = all_tiaoxiuidList.stream().collect(Collectors.joining(","));
String clearSql = "update kq_balanceofleave set tiaoxiuamount=0.0,update_time=? where " + Util.getSubINClause(clear_tiaoxiuids, "id", "in");
if (rs.getDBType().equals("postgresql")) {
clearSql = "update kq_balanceofleave set tiaoxiuamount=0.0,update_time=?::timestamp where " + Util.getSubINClause(clear_tiaoxiuids, "id", "in");
}
boolean isclearOk = rs.executeUpdate(clearSql,KQDateUtil.getUpdateTimeStamp());
kqLog.info("clearSql:" + clearSql + ":isclearOk:" + isclearOk);
}
String delUsageSql = "delete from kq_usagehistory where " + Util.getSubINClause(all_tiaoxiuids, "balanceofleaveid", "in");
boolean isdelUsageOk = rs.executeUpdate(delUsageSql);
kqLog.info("delUsageSql:" + delUsageSql + ":isdelUsageOk:" + isdelUsageOk);
}
String delSql = "delete from kq_flow_overtime where requestid = ? ";
boolean isDelOk = rs.executeUpdate(delSql, requestid);
kqLog.info("delSql:" + delSql + ":requestid:" + requestid + ":isDelOk:" + isDelOk);
}
/**
* 加班方式是第一种,如果是先生成调休,后面才生成加班,需要先把调休给按照加班规则给生成出来
*
* @param splitBean
*/
public static void doComputingMode1_4TX(SplitBean splitBean) {
RecordSet rs = new RecordSet();
int changeType = splitBean.getChangeType();
String resourceId = splitBean.getResourceId();
String belongDate = splitBean.getBelongDate();
String duration = splitBean.getDuration();
String fromdateDB = splitBean.getFromdatedb();
String requestId = splitBean.getRequestId();
String fromdate = splitBean.getFromDate();
String fromtime = splitBean.getFromTime();
String todate = splitBean.getToDate();
String totime = splitBean.getToTime();
String overtime_type = splitBean.getOvertime_type();
double D_Mins = splitBean.getD_Mins();
int workMins = splitBean.getWorkmins();
String workingHours = Util.null2String(workMins / 60.0);
Map<String, Integer> changeTypeMap = Maps.newHashMap();
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
KQOverTimeRuleCalBiz kqOverTimeRuleCalBiz = new KQOverTimeRuleCalBiz();
Map<String, KQOvertimeRulesDetailEntity> overRulesDetailMap = Maps.newHashMap();
Map<String, List<String[]>> restTimeMap = Maps.newHashMap();
Map<String, Integer> computingModeMap = Maps.newHashMap();
//先获取一些前提数据,加班規則和假期規則
kqOverTimeRuleCalBiz.getOverTimeDataMap(resourceId, belongDate, belongDate, dateFormatter, changeTypeMap, overRulesDetailMap, restTimeMap, computingModeMap);
String changeType_key = belongDate + "_" + changeType;
if (!overRulesDetailMap.containsKey(changeType_key)) {
return;
}
// 根据加班单位重新生成下加班分钟数
D_Mins = kqOverTimeRuleCalBiz.getD_MinsByUnit(D_Mins);
KQOvertimeRulesDetailEntity kqOvertimeRulesDetailEntity = overRulesDetailMap.get(changeType_key);
int paidLeaveEnable = kqOverTimeRuleCalBiz.getPaidLeaveEnable(kqOvertimeRulesDetailEntity, overtime_type);
Map<String, Object> otherParam = Maps.newHashMap();
otherParam.put("overtime_type", overtime_type);
String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, belongDate, D_Mins + "", "0", workingHours, requestId, "1", fromdateDB, otherParam);
if (Util.getIntValue(tiaoxiuId) > 0) {
//为啥要用kq_overtime_tiaoxiu这个表呢因为kqpaidleaveaction可能和splitaction不是在同一个归档前节点
String split_key = splitBean.getRequestId() + "_" + splitBean.getDataId() + "_" + splitBean.getDetailId() + "_"
+ splitBean.getFromDate() + "_" + splitBean.getFromTime() + "_" + splitBean.getToDate() + "_" +
splitBean.getToTime() + "_" + splitBean.getD_Mins();
String tiaoxiuId_sql = "insert into kq_overtime_tiaoxiu(split_key,tiaoxiu_id) values(?,?) ";
rs.executeUpdate(tiaoxiuId_sql, split_key, tiaoxiuId);
kqLog.info("doComputingMode1 加班生成调休成功!!!");
} else {
kqLog.info("doComputingMode1 加班生成调休失败!!!");
}
}
/**
* 加班方式是第一种,然后再流程归档的时候把加班数据写到加班中间表里
*
* @param splitBean
*/
public static void doComputingMode1_splitBean(SplitBean splitBean) {
try {
kqLog.info("doComputingMode1_splitBean:splitBean: " + (splitBean != null ? JSON.toJSONString(splitBean) : "null"));
RecordSet rs = new RecordSet();
RecordSet rs1 = new RecordSet();
int changeType = splitBean.getChangeType();
String requestId = splitBean.getRequestId();
String resourceId = splitBean.getResourceId();
String belongDate = splitBean.getBelongDate();
String duration = splitBean.getDuration();
String durationrule = splitBean.getDurationrule();
String fromdateDB = splitBean.getFromdatedb();
String fromtimedb = splitBean.getFromtimedb();
String todatedb = splitBean.getTodatedb();
String totimedb = splitBean.getTotimedb();
String fromdate = splitBean.getFromDate();
String fromtime = splitBean.getFromTime();
String todate = splitBean.getToDate();
String totime = splitBean.getToTime();
double D_Mins = splitBean.getD_Mins();
Map<String, Integer> changeTypeMap = Maps.newHashMap();
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
KQOverTimeRuleCalBiz kqOverTimeRuleCalBiz = new KQOverTimeRuleCalBiz();
Map<String, KQOvertimeRulesDetailEntity> overRulesDetailMap = Maps.newHashMap();
Map<String, List<String[]>> restTimeMap = Maps.newHashMap();
Map<String, Integer> computingModeMap = Maps.newHashMap();
//先获取一些前提数据,加班規則和假期規則
kqOverTimeRuleCalBiz.getOverTimeDataMap(resourceId, belongDate, belongDate, dateFormatter, changeTypeMap, overRulesDetailMap, restTimeMap, computingModeMap);
String overtime_type = splitBean.getOvertime_type();
String changeType_key = belongDate + "_" + changeType;
if (!overRulesDetailMap.containsKey(changeType_key)) {
return;
}
KQOvertimeRulesDetailEntity kqOvertimeRulesDetailEntity = overRulesDetailMap.get(changeType_key);
int paidLeaveEnable = kqOverTimeRuleCalBiz.getPaidLeaveEnable(kqOvertimeRulesDetailEntity, overtime_type);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
String tiaoxiu_id = "";
String overtime_tiaoxiu_id = "";
String split_key = splitBean.getRequestId() + "_" + splitBean.getDataId() + "_" + splitBean.getDetailId() + "_"
+ splitBean.getFromDate() + "_" + splitBean.getFromTime() + "_" + splitBean.getToDate() + "_" +
splitBean.getToTime() + "_" + splitBean.getD_Mins();
String check_tiaoxiu_sql = "select * from kq_overtime_tiaoxiu where split_key=? ";
rs1.executeQuery(check_tiaoxiu_sql, split_key);
if (rs1.next()) {
overtime_tiaoxiu_id = rs1.getString("id");
tiaoxiu_id = rs1.getString("tiaoxiu_id");
}
fromtime = fromtime + ":00";
totime = totime + ":00";
Long cur = System.currentTimeMillis();
Timestamp date = new Timestamp(cur);
String flow_overtime_sql = "insert into kq_flow_overtime(requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,fromdatedb,fromtimedb,todatedb,totimedb,tiaoxiuid,create_time,update_time,creator)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
if (rs.getDBType().equals("postgresql")) {
flow_overtime_sql = "insert into kq_flow_overtime(requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,fromdatedb,fromtimedb,todatedb,totimedb,tiaoxiuid,create_time,update_time,creator)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?::timestamp,?::timestamp,?) ";
}
boolean isUp = rs.executeUpdate(flow_overtime_sql, requestId, resourceId, fromdate, fromtime, todate, totime, D_Mins, "", belongDate, "",
unit, changeType, paidLeaveEnable, "1", fromdateDB, fromtimedb, todatedb, totimedb, tiaoxiu_id,date,date,Util.getIntValue(resourceId));
if (!isUp) {
kqLog.info("doComputingMode1 加班数据flow_overtime_sql记录失败");
} else {
kqLog.info("doComputingMode1:flow_overtime_sql: " + flow_overtime_sql);
kqLog.info("doComputingMode1:requestId:" + requestId + ":resourceId:" + resourceId + ":fromdate:" + fromdate + ":fromtime:" + fromtime
+ ":todate:" + todate + ":totime:" + totime + ":D_Mins:" + D_Mins + ":belongDate:" + belongDate + ":unit:" + unit + ":changeType:" + changeType
+ ":paidLeaveEnable:" + paidLeaveEnable + ":fromdateDB:" + fromdateDB + ":fromtimedb:" + fromtimedb + ":todatedb:" + todatedb + ":totimedb:" + totimedb);
}
if (overtime_tiaoxiu_id.length() > 0 && Util.getIntValue(overtime_tiaoxiu_id) > 0) {
String delSql = "delete from kq_overtime_tiaoxiu where id = ? ";
rs1.executeUpdate(delSql, overtime_tiaoxiu_id);
}
} catch (Exception e) {
kqLog.info("加班生成数据报错:doComputingMode1_splitBean:");
StringWriter errorsWriter = new StringWriter();
e.printStackTrace(new PrintWriter(errorsWriter));
kqLog.info(errorsWriter.toString());
}
}
public static List<Map<String, String>> getSplitHalfDayListRepeat(String fromDate, String toDate, String fromTime, String toTime) {
List<Map<String, String>> splitLists = new ArrayList<>();
Map<String, String> splitMap = new HashMap<>();
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
splitMap = new HashMap<>();
LocalDate curLocalDate = localFromDate.plusDays(i);
splitMap.put("splitDate", curLocalDate.format(dateFormatter));
int foreOrAfter = SplitSelectSet.foreOrAfter(fromTime, toTime);
splitMap.put("foreOrAfter", "" + foreOrAfter);
splitLists.add(splitMap);
}
return splitLists;
}
/**
* 签到签退 生成加班数据
*
* @param taskBeans
*/
public void handleOverTime(List<KQTaskBean> taskBeans) throws Exception {
try {
if (true) {
KQOverTimeRuleCalBiz kqOverTimeRuleCalBiz = new KQOverTimeRuleCalBiz();
for (int i = 0; i < taskBeans.size(); i++) {
KQTaskBean taskBean = taskBeans.get(i);
String tasktype = taskBean.getTasktype();
String eventtype = "";
if ("punchcard".equalsIgnoreCase(tasktype)) {
eventtype = "考勤打卡生成加班.";
}
kqOverTimeRuleCalBiz.buildOvertime(taskBean.getResourceId(), taskBean.getOvertime_fromdate(), taskBean.getOvertime_todate(),
eventtype);
}
} else {
handleOverTime_old(taskBeans);
}
} catch (Exception e) {
kqLog.info("加班生成数据报错:handleOverTime:");
StringWriter errorsWriter = new StringWriter();
e.printStackTrace(new PrintWriter(errorsWriter));
kqLog.info(errorsWriter.toString());
}
}
/**
* 这个加班方法后面废弃
* 新的加班都在这里kqOverTimeRuleCalBiz.buildOvertime
* @param taskBeans
* @throws Exception
*/
@Deprecated
public void handleOverTime_old(List<KQTaskBean> taskBeans) throws Exception {
DateTimeFormatter fullFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
int workMins = (int) (KQFlowUtil.getOneDayHour(DurationTypeEnum.OVERTIME, "") * 60);
kqLog.info("handleOverTime:start:" + (taskBeans != null ? JSON.toJSONString(taskBeans) : "is empty"));
//防止bean里重复的
List<KQTaskBean> repeat_taskBeans = new ArrayList<>();
for (int i = 0; i < taskBeans.size(); i++) {
KQTaskBean taskBean = taskBeans.get(i);
if (repeat_taskBeans.contains(taskBean)) {
continue;
} else {
repeat_taskBeans.add(taskBean);
}
taskBean.setWorkmins(workMins);
String resourceId = taskBean.getResourceId();
String taskDate = taskBean.getTaskDate();
int overtimeEnable = KQOvertimeRulesBiz.getOvertimeEnable(resourceId, taskDate);
//如果人再当前指定日期下未开启加班,直接跳过
if (overtimeEnable != 1) {
kqLog.info("签到签退 生成加班数据 handleOverTimeBySign:resourceId" + resourceId + ":taskDate:" + taskDate + "不允许加班");
continue;
}
int computingMode = KQOvertimeRulesBiz.getComputingMode(resourceId, taskDate);
kqLog.info("加班生成调休方式:resourceId:" + resourceId + ":taskDate:" + taskDate + ":computingMode:" + computingMode);
if (computingMode == 1) {
// 需审批,以审批单为准
doComputingMode1(taskBean, fullFormatter);
}
if (computingMode == 2) {
// 需审批,以打卡为准,但是不能超过审批时长
doComputingMode2(taskBean, fullFormatter);
}
if (computingMode == 3) {
// 无需审批,根据打卡时间计算加班时长
doComputingMode3(taskBean, fullFormatter);
}
}
}
/**
* 流程为主的就在流程归档的时候处理下,不在队列里进行处理了
*
* @param taskBean
* @param fullFormatter
* @throws Exception
*/
@Deprecated
private void doComputingMode1(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
SplitBean splitBean = taskBean.getSplitBean();
kqLog.info("doComputingMode1:splitBean: start");
if (splitBean != null) {
RecordSet rs = new RecordSet();
int changeType = splitBean.getChangeType();
String requestId = splitBean.getRequestId();
String resourceId = splitBean.getResourceId();
String belongDate = splitBean.getBelongDate();
String duration = splitBean.getDuration();
String durationrule = splitBean.getDurationrule();
String fromdateDB = splitBean.getFromdatedb();
String fromtimedb = splitBean.getFromtimedb();
String todatedb = splitBean.getTodatedb();
String totimedb = splitBean.getTotimedb();
String fromdate = splitBean.getFromDate();
String fromtime = splitBean.getFromTime();
String todate = splitBean.getToDate();
String totime = splitBean.getToTime();
double D_Mins = splitBean.getD_Mins();
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, belongDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
fromtime = fromtime + ":00";
totime = totime + ":00";
Long cur = System.currentTimeMillis();
Date date = new Date(cur);
String flow_overtime_sql = "insert into kq_flow_overtime(requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,fromdatedb,fromtimedb,todatedb,totimedb,create_time,update_time,creator)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
if (rs.getDBType().equals("postgresql")) {
flow_overtime_sql = "insert into kq_flow_overtime(requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,fromdatedb,fromtimedb,todatedb,totimedb,create_time,update_time,creator)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?::timestamp,?::timestamp,?) ";
}
boolean isUp = rs.executeUpdate(flow_overtime_sql, requestId, resourceId, fromdate, fromtime, todate, totime, D_Mins, "", belongDate, "",
unit, changeType, paidLeaveEnable, "1", fromdateDB, fromtimedb, todatedb, totimedb,date,date,Util.getIntValue(resourceId));
if (!isUp) {
kqLog.info("doComputingMode1 加班数据flow_overtime_sql记录失败");
} else {
kqLog.info("doComputingMode1:flow_overtime_sql: " + flow_overtime_sql);
kqLog.info("doComputingMode1:requestId:" + requestId + ":resourceId:" + resourceId + ":fromdate:" + fromdate + ":fromtime:" + fromtime
+ ":todate:" + todate + ":totime:" + totime + ":D_Mins:" + D_Mins + ":belongDate:" + belongDate + ":unit:" + unit + ":changeType:" + changeType
+ ":paidLeaveEnable:" + paidLeaveEnable + ":fromdateDB:" + fromdateDB + ":fromtimedb:" + fromtimedb + ":todatedb:" + todatedb + ":totimedb:" + totimedb);
}
}
}
/**
* 无需审批,以打卡为准,但是不能超过审批时长
*
* @param taskBean
* @param fullFormatter
*/
private void doComputingMode2(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
String resourceId = taskBean.getResourceId();
String taskDate = taskBean.getTaskDate();
KQFlowDataBiz kqFlowDataBiz = new KQFlowDataBiz.FlowDataParamBuilder().belongDateParam(taskDate).resourceidParam(resourceId).build();
Map<String, Object> flowMaps = new HashMap<>();
List<SplitBean> splitBeans = kqFlowDataBiz.getOverTimeData(flowMaps);
if (!splitBeans.isEmpty()) {
Map<String, String> flowMap = new HashMap<>();
Map<String, String> requestMap = new HashMap<>();
for (int i = 0; i < splitBeans.size(); i++) {
SplitBean splitBean = splitBeans.get(i);
String changeTpe = "" + splitBean.getChangeType();
String requestid = splitBean.getRequestId();
String flowMins = Util.null2String(splitBean.getD_Mins());
if (flowMap.get(changeTpe) != null) {
double tmpMins = Util.getDoubleValue(Util.null2String(flowMap.get(changeTpe)), 0.0);
flowMap.put(changeTpe, "" + (tmpMins + Util.getDoubleValue(flowMins)));
} else {
flowMap.put(changeTpe, flowMins);
}
if (requestMap.get(changeTpe) != null) {
String tmpRequestid = Util.null2String(requestMap.get(changeTpe));
if (("," + tmpRequestid + ",").indexOf(requestid) < 0) {
requestMap.put(changeTpe, tmpRequestid + "," + requestid);
}
} else {
requestMap.put(changeTpe, requestid);
}
}
int changeType = KQOvertimeRulesBiz.getChangeType(resourceId, taskDate);
if (requestMap.get("" + changeType) != null) {
taskBean.setRequestId(requestMap.get("" + changeType));
}
kqLog.info("签到签退 生成加班数据为 doComputingMode2:加班流程数据为 flowMap:" + flowMap);
// 1-节假日、2-工作日、3-休息日
if (changeType == 1) {
doMode2ChangeType1(taskBean, fullFormatter, flowMap.get("1"));
}
if (changeType == 2) {
doMode2ChangeType2(taskBean, fullFormatter, flowMap.get("2"));
}
if (changeType == 3) {
doMode2ChangeType3(taskBean, fullFormatter, flowMap.get("3"));
}
} else {
kqLog.info("签到签退 生成加班数据为 doComputingMode2:加班流程数据为空:resourceId:" + resourceId + ":taskDate:" + taskDate);
}
}
/**
* 需审批,以打卡为准
* 休息日
*
* @param taskBean
* @param fullFormatter
* @param flowMins
*/
private void doMode2ChangeType3(KQTaskBean taskBean, DateTimeFormatter fullFormatter,
String flowMins) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String signInTime4Out = taskBean.getSignInTime4Out();
String requestid = taskBean.getRequestId();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String timesource = Util.null2String(taskBean.getTimesource());
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
if (taskSignTime.length() > 0 && signInTime4Out.length() > 0) {
long mins = calNonWorkDuration(signInTime4Out, taskSignTime, taskDate, resourceId);
if (isBefore && signEndDate.compareTo(signDate) < 0) {
//打卡日期和归属日期不是同一天的话
String fromDateTime = signEndDate + " " + signInTime4Out;
String toDateTime = signDate + " " + taskSignTime;
// 还需要交换一下开始日期和结束日期
String tmpDate = signDate;
signDate = signEndDate;
signEndDate = tmpDate;
mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
}
if (mins > 0) {
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit && Util.getDoubleValue(flowMins) >= minimumUnit) {
RecordSet rs = new RecordSet();
String fromtime = "";
String totime = "";
double D_flowMins = Util.getDoubleValue(flowMins);
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
} else {
checkLastSignTime = after_checkLastSignTime;
}
if (checkLastSignTime.compareTo(signInTime4Out) > 0) {
fromtime = checkLastSignTime;
} else {
fromtime = signInTime4Out;
}
totime = taskSignTime;
if (hasMins >= D_flowMins) {
//如果已经生成过的加班数据已经大于等于流程时长了那么此次的加班时长就是0
mins = 0;
} else {
if (isBefore) {
//如果是上班前 当前的打卡时长+下班后已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + after_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - after_hasMins - before_hasMins);
} else {
mins = (long) (mins - before_hasMins);
}
} else {
//如果是下班后 当前的打卡时长+上班前已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + before_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - before_hasMins - after_hasMins);
} else {
mins = (long) (mins - after_hasMins);
}
}
}
} else {
fromtime = signInTime4Out;
totime = taskSignTime;
if (D_flowMins > 0 && mins > D_flowMins) {
//之前没有生成过加班 打卡加班时长不能超过流程时长
mins = (long) D_flowMins;
}
}
mins = mins < 0 ? 0 : mins;
if (mins <= 0) {
return;
}
String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", "", requestid, "", taskDate, null);
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据成功 doMode2ChangeType3:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
} else {
kqLog.info("生成加班数据失败 doMode2ChangeType3:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, requestid, resourceId, signDate, fromtime, signEndDate, totime, mins, "", taskDate, "", unit, "3", paidLeaveEnable, "2", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType3 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, "", 0, signInTime4Out, mins, signEndDate, timesource,
uuid, tiaoxiuId);
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType2:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit + ":流程时长:Util.getDoubleValue(flowMins):" + Util.getDoubleValue(flowMins));
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType3:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode2ChangeType3:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
}
/**
* 需审批,以打卡为准
* 工作日
*
* @param taskBean
* @param fullFormatter
* @param flowMins
*/
private void doMode2ChangeType2(KQTaskBean taskBean, DateTimeFormatter fullFormatter,
String flowMins) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String lastWorkTime = taskBean.getLastWorkTime();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String requestid = taskBean.getRequestId();
String timesource = Util.null2String(taskBean.getTimesource());
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
int workMins = taskBean.getWorkmins();
if (taskSignTime.length() > 0 && lastWorkTime.length() > 0) {
if (lastWorkTime.length() == 5) {
lastWorkTime = lastWorkTime + ":00";
}
String fromDateTime = signDate + " " + lastWorkTime;
String toDateTime = signEndDate + " " + taskSignTime;
int startTime = KQOvertimeRulesBiz.getStartTime(resourceId, taskDate);
startTime = startTime < 0 ? 0 : startTime;
if (isBefore) {
//上班前就不不需要考虑下班后多久算加班这个逻辑了
startTime = 0;
}
long mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter).plusMinutes(startTime), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
if (mins > 0) {
String workingHours = Util.null2String(workMins / 60.0);
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit && Util.getDoubleValue(flowMins) >= minimumUnit) {
RecordSet rs = new RecordSet();
boolean isLateoutlatein = checkIsLateoutlatein(resourceId, taskDate);
if (!isLateoutlatein) {
String fromDate = "";
String fromtime = "";
String toDate = "";
String totime = "";
double D_flowMins = Util.getDoubleValue(flowMins);
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
String before_checkLastSignTimesource = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
String after_checkLastSignTimesource = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_checkLastSignTimesource = Util.null2String(tmpMap.get("checkLastSignTimesource"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_checkLastSignTimesource = Util.null2String(tmpMap.get("checkLastSignTimesource"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
String checkLastSignDate = "";
String checkLastSignTimesource = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
checkLastSignDate = before_checkLastSignDate;
checkLastSignTimesource = before_checkLastSignTimesource;
} else {
checkLastSignTime = after_checkLastSignTime;
checkLastSignDate = after_checkLastSignDate;
checkLastSignTimesource = after_checkLastSignTimesource;
}
if (isBefore) {
fromDate = signDate;
fromtime = lastWorkTime;
if ("before".equalsIgnoreCase(checkLastSignTimesource)) {
toDate = checkLastSignDate;
totime = checkLastSignTime;
} else {
String[] toDateTimes = toDateTime.split(" ");
if (toDateTimes.length == 2) {
toDate = toDateTimes[0];
totime = toDateTimes[1];
}
}
} else {
if (checkLastSignDate.length() > 0 && checkLastSignTime.length() > 0) {
fromDate = checkLastSignDate;
fromtime = checkLastSignTime;
} else {
fromDate = signDate;
fromtime = lastWorkTime;
}
toDate = signEndDate;
totime = taskSignTime;
}
if (hasMins >= D_flowMins) {
//如果已经生成过的加班数据已经大于等于流程时长了那么此次的加班时长就是0
mins = 0;
} else {
if (isBefore) {
//如果是上班前 当前的打卡时长+下班后已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + after_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - after_hasMins - before_hasMins);
} else {
mins = (long) (mins - before_hasMins);
}
} else {
//如果是下班后 当前的打卡时长+上班前已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + before_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - before_hasMins - after_hasMins);
} else {
mins = (long) (mins - after_hasMins);
}
}
}
} else {
String[] fromDateTimes = fromDateTime.split(" ");
String[] toDateTimes = toDateTime.split(" ");
if (fromDateTimes.length == 2) {
fromDate = fromDateTimes[0];
fromtime = fromDateTimes[1];
}
if (toDateTimes.length == 2) {
toDate = toDateTimes[0];
totime = toDateTimes[1];
}
if (D_flowMins > 0 && mins > D_flowMins) {
//之前没有生成过加班 打卡加班时长不能超过流程时长
mins = (long) D_flowMins;
}
}
mins = mins < 0 ? 0 : mins;
if (mins <= 0) {
return;
}
String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", workingHours, requestid, "", taskDate, null);
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据为成功 doMode2ChangeType2:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins + ":workingHours:" + workingHours);
} else {
kqLog.info("生成加班数据为失败 doMode2ChangeType2:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins + ":workingHours:" + workingHours);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, requestid, resourceId, signDate, fromtime, signEndDate, totime, mins, "", taskDate, "", unit, "2", paidLeaveEnable, "2", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType2 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, lastWorkTime, 0, "", mins, signEndDate, timesource,
uuid, tiaoxiuId);
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType2:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit + ":流程时长:Util.getDoubleValue(flowMins):" + Util.getDoubleValue(flowMins));
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType2:fromDateTime:" + fromDateTime + ":toDateTime:" + toDateTime + ":mins:" + mins);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode2ChangeType2:taskSignTime:" + taskSignTime + ":lastWorkTime:" + lastWorkTime);
}
}
/**
* 需审批,以打卡为准
* 节假日
*
* @param taskBean
* @param fullFormatter
* @param flowMins
*/
private void doMode2ChangeType1(KQTaskBean taskBean, DateTimeFormatter fullFormatter,
String flowMins) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String signInTime4Out = taskBean.getSignInTime4Out();
String requestid = taskBean.getRequestId();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String timesource = Util.null2String(taskBean.getTimesource());
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
if (taskSignTime.length() > 0 && signInTime4Out.length() > 0) {
long mins = calNonWorkDuration(signInTime4Out, taskSignTime, taskDate, resourceId);
if (isBefore && signEndDate.compareTo(signDate) < 0) {
//打卡日期和归属日期不是同一天的话
String fromDateTime = signEndDate + " " + signInTime4Out;
String toDateTime = signDate + " " + taskSignTime;
// 还需要交换一下开始日期和结束日期
String tmpDate = signDate;
signDate = signEndDate;
signEndDate = tmpDate;
mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
}
if (mins > 0) {
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit && Util.getDoubleValue(flowMins) >= minimumUnit) {
RecordSet rs = new RecordSet();
String fromtime = "";
String totime = "";
double D_flowMins = Util.getDoubleValue(flowMins);
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
} else {
checkLastSignTime = after_checkLastSignTime;
}
if (checkLastSignTime.compareTo(signInTime4Out) > 0) {
fromtime = checkLastSignTime;
} else {
fromtime = signInTime4Out;
}
totime = taskSignTime;
if (hasMins >= D_flowMins) {
//如果已经生成过的加班数据已经大于等于流程时长了那么此次的加班时长就是0
mins = 0;
} else {
if (mins > D_flowMins) {
//如果打卡时长大于流程时长
mins = (long) (D_flowMins - hasMins);
} else {
if (isBefore) {
//如果是上班前 当前的打卡时长+下班后已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + after_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - after_hasMins - before_hasMins);
} else {
mins = (long) (mins - before_hasMins);
}
} else {
//如果是下班后 当前的打卡时长+上班前已经生成过的加班时长,和流程总时长的比较
double before_after_mins = mins + before_hasMins;
if (before_after_mins > D_flowMins) {
mins = (long) (D_flowMins - before_hasMins - after_hasMins);
} else {
mins = (long) (mins - after_hasMins);
}
}
}
}
} else {
fromtime = signInTime4Out;
totime = taskSignTime;
if (D_flowMins > 0 && mins > D_flowMins) {
//之前没有生成过加班 打卡加班时长不能超过流程时长
mins = (long) D_flowMins;
}
}
mins = mins < 0 ? 0 : mins;
if (mins <= 0) {
return;
}
String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", "", requestid, "", taskDate, null);
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据成功 doMode2ChangeType1:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
} else {
kqLog.info("生成加班数据失败 doMode2ChangeType1:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, requestid, resourceId, signDate, fromtime, signEndDate, totime, mins, "", taskDate, "", unit, "1", paidLeaveEnable, "2", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType1 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, "", 0, signInTime4Out, mins, signEndDate, timesource,
uuid, tiaoxiuId);
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType1:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit + ":流程时长:Util.getDoubleValue(flowMins):" + Util.getDoubleValue(flowMins));
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode2ChangeType1:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode2ChangeType1:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
}
/**
* 打卡计算非工作时长
*
* @param fromTime
* @param toTime
* @param date
* @param resourceid
* @return
*/
private int calNonWorkDuration(String fromTime, String toTime, String date, String resourceid) {
fromTime = (fromTime.length() > 6 ? fromTime.substring(0, 5) : fromTime);
toTime = (toTime.length() > 6 ? toTime.substring(0, 5) : toTime);
List<String[]> restTimeList = KQOvertimeRulesBiz.getRestTimeList(resourceid, date);
KQTimesArrayComInfo arrayComInfo = new KQTimesArrayComInfo();
int[] initArrays = arrayComInfo.getInitArr();
int startIndex = 0;
int endIndex = 0;
startIndex = arrayComInfo.getArrayindexByTimes(fromTime);
endIndex = arrayComInfo.getArrayindexByTimes(toTime);
if (startIndex > endIndex) {
return 0;
}
//先把要计算的时长填充上0
Arrays.fill(initArrays, startIndex, endIndex, 0);
//再把休息时间填充上去
if (!restTimeList.isEmpty()) {
for (int i = 0; i < restTimeList.size(); i++) {
String[] restTimes = restTimeList.get(i);
if (restTimes.length == 2) {
int restStart = arrayComInfo.getArrayindexByTimes(restTimes[0]);
int restEnd = arrayComInfo.getArrayindexByTimes(restTimes[1]);
Arrays.fill(initArrays, restStart, restEnd, 1);
}
}
}
//最后排除掉休息时间还剩多少加班时长就是最终的结果
int curMins = arrayComInfo.getCnt(initArrays, startIndex, endIndex + 1, 0);
return curMins;
}
/**
* 无需审批,根据打卡时间计算加班时长
*
* @param taskBean
* @param fullFormatter
*/
private void doComputingMode3(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
String resourceId = taskBean.getResourceId();
String taskDate = taskBean.getTaskDate();
int changeType = KQOvertimeRulesBiz.getChangeType(resourceId, taskDate);
// 1-节假日、2-工作日、3-休息日
if (changeType == 1) {
doMode3ChangeType1(taskBean, fullFormatter);
}
if (changeType == 2) {
doMode3ChangeType2(taskBean, fullFormatter);
}
if (changeType == 3) {
doMode3ChangeType3(taskBean, fullFormatter);
}
}
/**
* 无需审批,根据打开时间计算加班时长
* 休息日处理
*
* @param taskBean
* @param fullFormatter
*/
private void doMode3ChangeType3(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String signInTime4Out = taskBean.getSignInTime4Out();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String timesource = Util.null2String(taskBean.getTimesource());
String up_tiaoxiuid = taskBean.getTiaoxiuId();
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
if (taskSignTime.length() > 0 && signInTime4Out.length() > 0) {
long mins = calNonWorkDuration(signInTime4Out, taskSignTime, taskDate, resourceId);
if (isBefore && signEndDate.compareTo(signDate) < 0) {
//打卡日期和归属日期不是同一天的话
String fromDateTime = signEndDate + " " + signInTime4Out;
String toDateTime = signDate + " " + taskSignTime;
// 还需要交换一下开始日期和结束日期
String tmpDate = signDate;
signDate = signEndDate;
signEndDate = tmpDate;
mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
}
if (mins > 0) {
RecordSet rs = new RecordSet();
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit) {
if (taskSignTime.length() == 5) {
taskSignTime += ":00";
}
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
String fromtime = "";
String totime = "";
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
} else {
checkLastSignTime = after_checkLastSignTime;
}
if (checkLastSignTime.compareTo(signInTime4Out) > 0) {
fromtime = checkLastSignTime;
} else {
fromtime = signInTime4Out;
}
totime = taskSignTime;
if (isBefore) {
mins = (long) (mins - before_hasMins);
} else {
mins = (long) (mins - after_hasMins);
}
} else {
fromtime = signInTime4Out;
totime = taskSignTime;
}
mins = mins < 0 ? 0 : mins;
String tiaoxiuId = "";
if (up_tiaoxiuid.length() > 0 && Util.getIntValue(up_tiaoxiuid) > 0) {
boolean is_tiaoxiuId = KQBalanceOfLeaveBiz.updateExtraAmountByDis5(up_tiaoxiuid, Util.getDoubleValue(mins + ""), "");
tiaoxiuId = up_tiaoxiuid;
} else {
tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", "", "", "", taskDate, null);
}
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据成功 doMode3ChangeType3:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
} else {
kqLog.info("生成加班数据失败 doMode3ChangeType3:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, "", resourceId, signDate, fromtime, signEndDate, totime, mins, "", taskDate, "", unit, "3", paidLeaveEnable, "3", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType1 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, "", 0, signInTime4Out, mins, signEndDate, timesource,
uuid, tiaoxiuId);
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType3:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit);
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType3:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode3ChangeType3:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
}
/**
* 无需审批,根据打开时间计算加班时长
* 工作日处理
*
* @param taskBean
* @param fullFormatter
*/
private void doMode3ChangeType2(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String lastWorkTime = taskBean.getLastWorkTime();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String timesource = taskBean.getTimesource();
String up_tiaoxiuid = taskBean.getTiaoxiuId();
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
int workMins = taskBean.getWorkmins();
if (taskSignTime.length() > 0 && lastWorkTime.length() > 0) {
if (lastWorkTime.length() == 5) {
lastWorkTime = lastWorkTime + ":00";
}
String fromDateTime = signDate + " " + lastWorkTime;
String toDateTime = signEndDate + " " + taskSignTime;
int startTime = KQOvertimeRulesBiz.getStartTime(resourceId, taskDate);
startTime = startTime < 0 ? 0 : startTime;
if (isBefore) {
//上班前就不不需要考虑下班后多久算加班这个逻辑了
startTime = 0;
}
long mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter).plusMinutes(startTime), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
if (mins > 0) {
String workingHours = Util.null2String(workMins / 60.0);
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit) {
if (taskSignTime.length() == 5) {
taskSignTime += ":00";
}
RecordSet rs = new RecordSet();
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
String before_checkLastSignTimesource = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
String after_checkLastSignTimesource = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_checkLastSignTimesource = Util.null2String(tmpMap.get("checkLastSignTimesource"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_checkLastSignTimesource = Util.null2String(tmpMap.get("checkLastSignTimesource"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
boolean isLateoutlatein = checkIsLateoutlatein(resourceId, taskDate);
if (!isLateoutlatein) {
String fromDate = "";
String fromtime = "";
String toDate = "";
String totime = "";
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
String checkLastSignDate = "";
String checkLastSignTimesource = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
checkLastSignDate = before_checkLastSignDate;
checkLastSignTimesource = before_checkLastSignTimesource;
} else {
checkLastSignTime = after_checkLastSignTime;
checkLastSignDate = after_checkLastSignDate;
checkLastSignTimesource = after_checkLastSignTimesource;
}
if (isBefore) {
fromDate = signDate;
fromtime = lastWorkTime;
if ("before".equalsIgnoreCase(checkLastSignTimesource)) {
toDate = checkLastSignDate;
totime = checkLastSignTime;
} else {
String[] toDateTimes = toDateTime.split(" ");
if (toDateTimes.length == 2) {
toDate = toDateTimes[0];
totime = toDateTimes[1];
}
}
mins = (long) (mins - before_hasMins);
} else {
if (checkLastSignDate.length() > 0 && checkLastSignTime.length() > 0) {
fromDate = checkLastSignDate;
fromtime = checkLastSignTime;
} else {
fromDate = signDate;
fromtime = lastWorkTime;
}
toDate = signEndDate;
totime = taskSignTime;
mins = (long) (mins - after_hasMins);
}
} else {
String[] fromDateTimes = fromDateTime.split(" ");
String[] toDateTimes = toDateTime.split(" ");
if (fromDateTimes.length == 2) {
fromDate = fromDateTimes[0];
fromtime = fromDateTimes[1];
}
if (toDateTimes.length == 2) {
toDate = toDateTimes[0];
totime = toDateTimes[1];
}
}
mins = mins < 0 ? 0 : mins;
String tiaoxiuId = "";
if (up_tiaoxiuid.length() > 0 && Util.getIntValue(up_tiaoxiuid) > 0) {
boolean is_tiaoxiuId = KQBalanceOfLeaveBiz.updateExtraAmountByDis5(up_tiaoxiuid, Util.getDoubleValue(mins + ""), "");
tiaoxiuId = up_tiaoxiuid;
} else {
tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", "", "", "", taskDate, null);
}
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据成功 doMode3ChangeType2:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins + ":workingHours:" + workingHours);
} else {
kqLog.info("生成加班数据失败 doMode3ChangeType2:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins + ":workingHours:" + workingHours);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, "", resourceId, fromDate, fromtime, toDate, totime, mins, "", taskDate, "", unit, "2", paidLeaveEnable, "3", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType1 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, lastWorkTime, workMins, "", mins, signEndDate, timesource,
uuid, tiaoxiuId);
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType2:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit);
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType2:fromDateTime:" + fromDateTime + ":toDateTime:" + toDateTime + ":mins:" + mins);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode3ChangeType2:taskSignTime:" + taskSignTime + ":lastWorkTime:" + lastWorkTime);
}
}
/**
* 校验多次签退问题
*
* @param taskSignTime 最新的签退日期时间
* @param fullFormatter
*/
public Map<String, Object> checkMultiSign(String resourceId, String taskDate, String taskSignTime, DateTimeFormatter fullFormatter, String timesource) {
RecordSet rs = new RecordSet();
Map<String, Object> mutiMap = new HashMap<>();
long mins = 0L;
boolean hasSigned = false;
//倒数第二新的签退时间
String signDate = "";
String checkLastSignTime = "";
String checkLastSignTimesource = "";
Map<String, Map<String, String>> sourceMap = new HashMap<>();
Map<String, String> minsMap = new HashMap<>();
Map<String, String> datetimeMap = new HashMap<>();
//已经生成了的加班时长
long hasMins = 0L;
String checkSql = "select * from kq_overtime_signtask where resourceid=? and belongdate=? order by signdate ,signtime ";
rs.executeQuery(checkSql, resourceId, taskDate);
while (rs.next()) {
signDate = rs.getString("signdate");
checkLastSignTime = rs.getString("signtime");
checkLastSignTimesource = rs.getString("timesource");
double tmp_mins = Util.getDoubleValue(rs.getString("mins"), 0.0);
hasMins += tmp_mins;
if (sourceMap.containsKey(checkLastSignTimesource)) {
Map<String, String> tmp_minsMap = sourceMap.get(checkLastSignTimesource);
String tmp_hasMins = tmp_minsMap.get("hasMins");
if (checkLastSignTimesource.equalsIgnoreCase("after")) {
tmp_minsMap.put("checkLastSignDate", signDate);
tmp_minsMap.put("checkLastSignTime", checkLastSignTime);
tmp_minsMap.put("checkLastSignTimesource", checkLastSignTimesource);
} else {
//before 上班前的时候,第一条就是最早的打卡时间所以后面不需要更新了
}
double sourceMins = Util.getDoubleValue(tmp_hasMins, 0.0);
tmp_minsMap.put("hasMins", (tmp_mins + sourceMins) + "");
} else {
minsMap = new HashMap<>();
minsMap.put("hasMins", tmp_mins + "");
minsMap.put("checkLastSignDate", signDate + "");
minsMap.put("checkLastSignTime", checkLastSignTime + "");
minsMap.put("checkLastSignTimesource", checkLastSignTimesource + "");
sourceMap.put(checkLastSignTimesource, minsMap);
}
hasSigned = true;
}
mutiMap.put("hasSign", hasSigned ? "1" : "0");
mutiMap.put("hasMins", "" + (hasMins <= 0 ? 0 : hasMins));
mutiMap.put("sourceMap", sourceMap);
return mutiMap;
}
/**
* 记录下多次签退生成加班数据问题
*
* @param resourceId
* @param taskDate
* @param taskSignTime
* @param lastWorkTime
* @param workMins
* @param signInTime4Out
* @param mins
* @param signDate
* @param timesource
* @param uuid
* @param tiaoxiuId
*/
private void logMultiSign(String resourceId, String taskDate, String taskSignTime,
String lastWorkTime, int workMins, String signInTime4Out, long mins, String signDate,
String timesource, String uuid, String tiaoxiuId) throws Exception {
RecordSet rs = new RecordSet();
String logSql = "insert into kq_overtime_signtask(resourceid,belongdate,signtime,lastworktime,workmins,signInTime4Out,mins,signDate,timesource,uuid,tiaoxiuId) values(?,?,?,?,?,?,?,?,?,?,?) ";
boolean isLog = false;
if ("before".equalsIgnoreCase(timesource)) {
isLog = rs.executeUpdate(logSql, resourceId, taskDate, lastWorkTime, taskSignTime, workMins, signInTime4Out, mins, signDate, timesource, uuid, tiaoxiuId);
} else {
isLog = rs.executeUpdate(logSql, resourceId, taskDate, taskSignTime, lastWorkTime, workMins, signInTime4Out, mins, signDate, timesource, uuid, tiaoxiuId);
}
kqLog.info("记录下多次签退生成加班数据问题 logMultiSign:logSql:" + logSql + ":resourceId:" + resourceId + ":isLog:" + isLog
+ ":taskDate:" + taskDate + ":taskSignTime:" + taskSignTime + ":lastWorkTime:" + lastWorkTime + ":workMins:" + workMins + ":signInTime4Out:"
+ signInTime4Out + ":mins:" + mins + ":signDate:" + signDate + ":timesource:" + timesource);
}
/**
* 无需审批,根据打开时间计算加班时长
* 节假日处理
*
* @param taskBean
* @param fullFormatter
*/
private void doMode3ChangeType1(KQTaskBean taskBean,
DateTimeFormatter fullFormatter) throws Exception {
String taskDate = taskBean.getTaskDate();
String resourceId = taskBean.getResourceId();
String taskSignTime = taskBean.getTaskSignTime();
String signInTime4Out = taskBean.getSignInTime4Out();
String signDate = taskBean.getSignDate();
String signEndDate = taskBean.getSignEndDate();
String timesource = Util.null2String(taskBean.getTimesource());
String up_tiaoxiuid = taskBean.getTiaoxiuId();
boolean isBefore = false;
if ("before".equalsIgnoreCase(timesource)) {
isBefore = true;
}
if (taskSignTime.length() > 0 && signInTime4Out.length() > 0) {
long mins = calNonWorkDuration(signInTime4Out, taskSignTime, taskDate, resourceId);
if (isBefore && signEndDate.compareTo(signDate) < 0) {
//打卡日期和归属日期不是同一天的话
String fromDateTime = signEndDate + " " + signInTime4Out;
String toDateTime = signDate + " " + taskSignTime;
// 还需要交换一下开始日期和结束日期
String tmpDate = signDate;
signDate = signEndDate;
signEndDate = tmpDate;
mins = Duration.between(LocalDateTime.parse(fromDateTime, fullFormatter), LocalDateTime.parse(toDateTime, fullFormatter)).toMinutes();
}
if (mins > 0) {
int minimumUnit = KQOvertimeRulesBiz.getMinimumLen(resourceId, taskDate);
int unit = KQOvertimeRulesBiz.getMinimumUnit();
int paidLeaveEnable = KQOvertimeRulesBiz.getPaidLeaveEnable(resourceId, taskDate);
paidLeaveEnable = paidLeaveEnable == 1 ? 1 : 0;
if (mins >= minimumUnit) {
if (taskSignTime.length() == 5) {
taskSignTime += ":00";
}
RecordSet rs = new RecordSet();
String tmp_taskSignTime = signEndDate + " " + taskSignTime;
Map<String, Object> mutiMap = checkMultiSign(resourceId, taskDate, tmp_taskSignTime, fullFormatter, timesource);
String hasSign = Util.null2String(mutiMap.get("hasSign"));
Map<String, Map<String, String>> sourceMap = (Map<String, Map<String, String>>) mutiMap.get("sourceMap");
String before_checkLastSignTime = "";
String before_checkLastSignDate = "";
double before_hasMins = 0.0;
String after_checkLastSignTime = "";
String after_checkLastSignDate = "";
double after_hasMins = 0.0;
if (sourceMap.containsKey("before")) {
Map<String, String> tmpMap = sourceMap.get("before");
before_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
before_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
before_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
if (sourceMap.containsKey("after")) {
Map<String, String> tmpMap = sourceMap.get("after");
after_checkLastSignDate = Util.null2String(tmpMap.get("checkLastSignDate"));
after_checkLastSignTime = Util.null2String(tmpMap.get("checkLastSignTime"));
after_hasMins = Util.getDoubleValue(Util.null2String(tmpMap.get("hasMins")), 0.0);
}
long hasMins = Long.parseLong(Util.null2String(mutiMap.get("hasMins")));
String fromtime = "";
String totime = "";
if ("1".equalsIgnoreCase(hasSign)) {
String checkLastSignTime = "";
if (isBefore) {
checkLastSignTime = before_checkLastSignTime;
} else {
checkLastSignTime = after_checkLastSignTime;
}
if (checkLastSignTime.compareTo(signInTime4Out) > 0) {
fromtime = checkLastSignTime;
} else {
fromtime = signInTime4Out;
}
totime = taskSignTime;
if (isBefore) {
mins = (long) (mins - before_hasMins);
} else {
mins = (long) (mins - after_hasMins);
}
} else {
fromtime = signInTime4Out;
totime = taskSignTime;
}
mins = mins < 0 ? 0 : mins;
String tiaoxiuId = "";
if (up_tiaoxiuid.length() > 0 && Util.getIntValue(up_tiaoxiuid) > 0) {
boolean is_tiaoxiuId = KQBalanceOfLeaveBiz.updateExtraAmountByDis5(up_tiaoxiuid, Util.getDoubleValue(mins + ""), "");
tiaoxiuId = up_tiaoxiuid;
} else {
tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(resourceId, taskDate, mins + "", "0", "", "", "", taskDate, null);
}
if (Util.getIntValue(tiaoxiuId) > 0) {
kqLog.info("生成加班数据成功 doMode3ChangeType1:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
} else {
kqLog.info("生成加班数据失败 doMode3ChangeType1:resourceId:" + resourceId + ":taskDate:" + taskDate + ":mins:" + mins);
}
String uuid = UUID.randomUUID().toString();
String flow_overtime_sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
boolean isUp = rs.executeUpdate(flow_overtime_sql, "", resourceId, signDate, fromtime, signEndDate, totime, mins, "", taskDate, "", unit, "1", paidLeaveEnable, "3", tiaoxiuId, uuid);
if (!isUp) {
kqLog.info("doMode2ChangeType1 加班数据记录失败!!!");
}
logMultiSign(resourceId, taskDate, taskSignTime, "", 0, signInTime4Out, mins, signEndDate, timesource, uuid, tiaoxiuId);
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType1:实际加班时长mins:" + mins + ":最小加班时长minimumUnit:" + minimumUnit);
}
} else {
kqLog.info("签到签退 生成加班数据为 doMode3ChangeType1:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
} else {
kqLog.info("签到签退 生成加班数据异常 doMode3ChangeType1:taskSignTime:" + taskSignTime + ":signInTime4Out:" + signInTime4Out);
}
}
/**
* 根据每一天的班次来拆分
*
* @param splitBean
* @param splitBeans
* @return
*/
public void doSerialSplitList(SplitBean splitBean, List<SplitBean> splitBeans) throws Exception {
String resourceid = splitBean.getResourceId();
String fromDate = splitBean.getFromdatedb();
String toDate = splitBean.getTodatedb();
//哺乳假用到
KQRepeatBean kqRepeatBean = KQRepeatLengthContext.getRepeatBean();
if(kqRepeatBean != null){
//流程上有重复时段,就不需要请假类型的重复时间了
splitBean.setRepeatTime("0");
}
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate preFromDate = localFromDate.minusDays(1);
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
DurationTypeEnum durationTypeEnum = splitBean.getDurationTypeEnum();
boolean shouldLog = true;
if (durationTypeEnum == DurationTypeEnum.COMMON_CAL) {
shouldLog = false;
}
if (shouldLog) {
kqLog.info("resourceid::" + resourceid + "::doSerialSplitList:" + (splitBean != null ? JSON.toJSONString(splitBean) : null));
}
boolean is_flow_humanized = KQSettingsBiz.is_flow_humanized();
long betweenDays = localToDate.toEpochDay() - preFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
if(kqRepeatBean != null){
if(i == 0){
continue;
}
}
LocalDate curLocalDate = preFromDate.plusDays(i);
String splitDate = curLocalDate.format(dateFormatter);
ShiftInfoBean shiftInfoBean = null;
if (shouldLog) {
shiftInfoBean = KQDurationCalculatorUtil.getWorkTime(resourceid, splitDate, false);
} else {
shiftInfoBean = KQDurationCalculatorUtil.getWorkTime(resourceid, splitDate, false, false);
}
if (shouldLog) {
kqLog.info("resourceid::" + resourceid + "::splitDate:" + splitDate + ":shiftInfoBean:" + (shiftInfoBean != null ? JSON.toJSONString(shiftInfoBean) : null));
}
int restShift = 0;
if (shiftInfoBean != null) {
restShift = shiftInfoBean.getRestShift();
}
int[] initArrays = kqTimesArrayComInfo.getInitArr();
boolean isSplit = true;
if (shiftInfoBean != null && 1 != restShift) {
splitBean.setSerialid(Util.null2String(shiftInfoBean.getSerialid()));
if (!shiftInfoBean.isIsfree()) {
isSplit = commonShiftSplit(shiftInfoBean, splitBean, i, kqTimesArrayComInfo, initArrays, localFromDate, localToDate, betweenDays, shouldLog, is_flow_humanized);
if (!isSplit) {
continue;
}
} else {
isSplit = freeShiftSplit(shiftInfoBean, splitBean, i, kqTimesArrayComInfo, initArrays, localFromDate, localToDate, betweenDays);
if (!isSplit) {
continue;
}
}
//根据单位转换时长
turnDuration(splitBean, false);
} else {
//非工作时长
String computingMode = splitBean.getComputingMode();
if ("2".equalsIgnoreCase(computingMode)) {
String filterholidays = splitBean.getFilterholidays();
boolean is_filterholidays = check_filterholidays(filterholidays, resourceid, splitDate, i);
if (is_filterholidays) {
continue;
}
ShiftInfoBean preShiftInfoBean = KQDurationCalculatorUtil.getWorkTime(resourceid, curLocalDate.minusDays(1).format(dateFormatter), false);
isSplit = nonWorkDaySplit(preShiftInfoBean, splitBean, i, kqTimesArrayComInfo, initArrays, localFromDate, localToDate, betweenDays);
if (!isSplit) {
continue;
}
//根据单位转换时长
turnDuration(splitBean, true);
} else {
if (shouldLog) {
kqLog.info("resourceid::" + resourceid + "::doSerialSplitList splitDate:" + splitDate + ":resourceid:" + resourceid + "是非工作日");
}
continue;
}
}
SplitBean newsplitBean = new SplitBean();
//然后把bean重新赋值下根据拆分后的时间
BeanUtils.copyProperties(splitBean, newsplitBean);
// BeanUtil.copyProperties(splitBean,newsplitBean);
// SplitBean newsplitBean = copySplitBean(splitBean);
newsplitBean.setFromDate(splitDate);
newsplitBean.setToDate(splitDate);
newsplitBean.setBelongDate(splitDate);
splitBeans.add(newsplitBean);
}
}
public SplitBean copySplitBean(SplitBean splitBean) {
SplitBean newsplitBean = new SplitBean();
if (null == splitBean) {
return newsplitBean;
}
newsplitBean.setRequestId(splitBean.getRequestId());
newsplitBean.setLeavebackrequestid(splitBean.getLeavebackrequestid());
newsplitBean.setWorkflowId(splitBean.getWorkflowId());
newsplitBean.setUsedetail(splitBean.getUsedetail());
newsplitBean.setDataId(splitBean.getDataId());
// this.detailId = "";
newsplitBean.setDetailId(splitBean.getDetailId());
// this.resourceId = "";
newsplitBean.setResourceId(splitBean.getResourceId());
// this.fromDate = "";
newsplitBean.setFromDate(splitBean.getFromDate());
// this.fromTime = "";
newsplitBean.setFromTime(splitBean.getFromTime());
// this.toDate = "";
newsplitBean.setToDate(splitBean.getToDate());
// this.toTime = "";
newsplitBean.setToTime(splitBean.getToTime());
// this.newLeaveType = "";
newsplitBean.setNewLeaveType(splitBean.getNewLeaveType());
// this.duration = "";
newsplitBean.setDuration(splitBean.getDuration());
// this.pub_duration = "";
newsplitBean.setPub_duration(splitBean.getPub_duration());
// this.work_duration = "";
newsplitBean.setWork_duration(splitBean.getWork_duration());
// this.rest_duration = "";
newsplitBean.setRest_duration(splitBean.getRest_duration());
// this.tablenamedb = "";
newsplitBean.setTablenamedb(splitBean.getTablenamedb());
// this.fromdatedb = "";
newsplitBean.setFromdatedb(splitBean.getFromdatedb());
// this.fromtimedb = "";
newsplitBean.setFromtimedb(splitBean.getFromtimedb());
// this.todatedb = "";
newsplitBean.setTodatedb(splitBean.getTodatedb());
// this.totimedb = "";
newsplitBean.setTotimedb(splitBean.getTotimedb());
// this.durationDB = "";
newsplitBean.setDurationDB(splitBean.getDurationDB());
// this.durationrule = "";
newsplitBean.setDurationrule(splitBean.getDurationrule());
// this.computingMode = "";
newsplitBean.setComputingMode(splitBean.getComputingMode());
// this.vacationInfo = "";
newsplitBean.setVacationInfo(splitBean.getVacationInfo());
// this.status = "";
newsplitBean.setStatus(splitBean.getStatus());
// this.companion = "";
newsplitBean.setCompanion(splitBean.getCompanion());
// this.belongDate = "";
newsplitBean.setBelongDate(splitBean.getBelongDate());
// D_Mins = 0;
newsplitBean.setD_Mins(splitBean.getD_Mins());
// this.serialid = "";
newsplitBean.setSerialid(splitBean.getSerialid());
// this.changeType = 0;
newsplitBean.setChangeType(splitBean.getChangeType());
// this.preChangeType = 0;
newsplitBean.setPreChangeType(splitBean.getPreChangeType());
// this.subcompanyid = "";
newsplitBean.setSubcompanyid(splitBean.getSubcompanyid());
// this.departmentid = "";
newsplitBean.setDepartmentid(splitBean.getDepartmentid());
// this.jobtitle = "";
newsplitBean.setJobtitle(splitBean.getJobtitle());
// this.durationTypeEnum
newsplitBean.setDurationTypeEnum(splitBean.getDurationTypeEnum());
// this.workmins = 0;
newsplitBean.setWorkmins(splitBean.getWorkmins());
// this.oneDayHour = 0.0;
newsplitBean.setOneDayHour(splitBean.getOneDayHour());
// this.groupid = "";
newsplitBean.setGroupid(splitBean.getGroupid());
// this.timeselection = "1";
newsplitBean.setTimeselection(splitBean.getTimeselection());
// processChangeSplitBean = new ProcessChangeSplitBean();
newsplitBean.setProcessChangeSplitBean(splitBean.getProcessChangeSplitBean());
// this.iscompanion = "";
newsplitBean.setIscompanion(splitBean.getIscompanion());
// this.filterholidays = "";
newsplitBean.setFilterholidays(splitBean.getFilterholidays());
// this.overtime_type = "";
newsplitBean.setOvertime_type(splitBean.getOvertime_type());
// this.duration_type = "";
// newsplitBean.setDuration_type(splitBean.getDuration_type());
// this.conversion = "";
newsplitBean.setConversion(splitBean.getConversion());
// this.overtimeBalanceTimeBeans = Lists.newArrayList();
newsplitBean.setOvertimeBalanceTimeBeans(splitBean.getOvertimeBalanceTimeBeans());
newsplitBean.setRepeatTime(splitBean.getRepeatTime());
return newsplitBean;
}
/**
* 监测按照自然日计算,根据排除休息日和节假日的设置,判断当前自然日是否需要排除计算
*
* @param filterholidays
* @param resourceid
* @param splitDate
* @param i
*/
public boolean check_filterholidays(String filterholidays, String resourceid, String splitDate,
int i) {
boolean is_filterholidays = false;
if (i == 0) {
return is_filterholidays;
}
if (Util.null2String(filterholidays).length() > 0) {
List<String> filterholidayList = Arrays.asList(filterholidays.split(","));
if (filterholidayList != null && !filterholidayList.isEmpty()) {
//日期类型1-节假日、2-工作日、3-休息日(节假日设置的优先级高于考勤组中的设置)
int changeType = KQOvertimeRulesBiz.getChangeType(resourceid, splitDate);
if (filterholidayList.contains("1")) {
//排除节假日
if (filterholidayList.contains("2")) {
//排除休息日
if (changeType == 3 || changeType == 1) {
is_filterholidays = true;
}
} else {
if (changeType == 1) {
is_filterholidays = true;
}
}
} else if (filterholidayList.contains("2")) {
//排除休息日
if (changeType == 3) {
is_filterholidays = true;
}
} else {
//不排除休息日,也不排除节假日
}
}
}
return is_filterholidays;
}
/**
* 自由工时的流程数据拆分
*
* @param shiftInfoBean
* @param splitBean
* @param i
* @param kqTimesArrayComInfo
* @param initArrays
* @param localFromDate
* @param localToDate
* @param betweenDays
* @return
*/
public boolean freeShiftSplit(ShiftInfoBean shiftInfoBean, SplitBean splitBean, int i, KQTimesArrayComInfo kqTimesArrayComInfo, int[] initArrays, LocalDate localFromDate, LocalDate localToDate,
long betweenDays) {
String fromTime = splitBean.getFromtimedb();
String toTime = splitBean.getTotimedb();
int fromtimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(fromTime);
int totimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(toTime);
int flowbegintimeIndex = -1;
int flowendtimeIndex = -1;
String fromtimedbOri = splitBean.getFromtimedb();
String totimedbOri = splitBean.getTotimedb();
String repeatTime = "0";
DurationTypeEnum durationTypeEnum = splitBean.getDurationTypeEnum();
if(DurationTypeEnum.LEAVE == durationTypeEnum || DurationTypeEnum.LEAVEBACK == durationTypeEnum){
repeatTime = splitBean.getRepeatTime();
}
boolean isSplit = true;
String freeSignStart = shiftInfoBean.getFreeSignStart();
String freeSignEnd = shiftInfoBean.getFreeSignEnd();
if (freeSignStart.length() == 0) {
shiftInfoBean.setD_Mins(0.0);
isSplit = false;
return isSplit;
}
int freeSignStartIndex = kqTimesArrayComInfo.getArrayindexByTimes(freeSignStart);
int freeSignEndIndex = kqTimesArrayComInfo.getArrayindexByTimes(freeSignEnd);
int freeWorkMins = Util.getIntValue(shiftInfoBean.getFreeWorkMins());
if (i == 0) {
isSplit = false;
return isSplit;
} else {
if (localFromDate.isEqual(localToDate)) {
if (fromtimeIndex > freeSignStartIndex) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = totimeIndex;
} else {
flowbegintimeIndex = freeSignStartIndex;
flowendtimeIndex = totimeIndex;
}
} else {
if (i == 1) {
if (fromtimeIndex > freeSignStartIndex) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = 1440;
} else {
flowbegintimeIndex = freeSignStartIndex;
flowendtimeIndex = 1440;
}
} else if (i == betweenDays) {
if (totimeIndex > freeSignStartIndex) {
flowbegintimeIndex = freeSignStartIndex;
flowendtimeIndex = totimeIndex;
} else {
isSplit = false;
return isSplit;
}
} else {
flowbegintimeIndex = freeSignStartIndex;
flowendtimeIndex = freeSignEndIndex;
}
}
}
kqLog.info("resourceid::" + splitBean.getResourceId() + "::自由班制 isSplit之前 i::" + i + "::flowbegintimeIndex:" + flowbegintimeIndex + ":flowendtimeIndex:" + flowendtimeIndex);
if (isSplit) {
String splitFromTime = kqTimesArrayComInfo.getTimesByArrayindex(flowbegintimeIndex);
String splitToTime = kqTimesArrayComInfo.getTimesByArrayindex(flowendtimeIndex);
if("1".equals(repeatTime)) {
int flowbegintimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(fromtimedbOri);
int flowendtimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(totimedbOri);
if(flowbegintimeIndexO > flowbegintimeIndex){
flowbegintimeIndex = flowbegintimeIndexO;
splitFromTime = kqTimesArrayComInfo.getTimesByArrayindex(flowbegintimeIndex);
}
if(flowendtimeIndexO < flowendtimeIndex){
flowendtimeIndex = flowendtimeIndexO;
splitToTime = kqTimesArrayComInfo.getTimesByArrayindex(flowendtimeIndex);
}
}
int flowMins = flowendtimeIndex - flowbegintimeIndex;
flowMins = flowMins > freeWorkMins ? freeWorkMins : flowMins;
flowMins = flowMins > 0 ? flowMins : 0;
if (flowMins < 0) {
kqLog.info("resourceid::" + splitBean.getResourceId() + "::自由班制 不记录中间表 i::" + i + "::flowbegintimeIndex:" + flowbegintimeIndex + ":flowendtimeIndex:" + flowendtimeIndex + ":flowMins:" + flowMins);
return false;
}
splitBean.setD_Mins(flowMins);
splitBean.setWorkmins(freeWorkMins);
splitBean.setOneDayHour((freeWorkMins / 60.0));
splitBean.setFromTime(splitFromTime);
splitBean.setToTime(splitToTime);
}
return isSplit;
}
/**
* 非工作时长(自然日计算的)
*
* @param preShiftInfoBean
* @param splitBean
* @param i
* @param kqTimesArrayComInfo
* @param initArrays
* @param localFromDate
* @param localToDate
* @param betweenDays
* @return
*/
public boolean nonWorkDaySplit(ShiftInfoBean preShiftInfoBean, SplitBean splitBean, int i,
KQTimesArrayComInfo kqTimesArrayComInfo, int[] initArrays, LocalDate localFromDate,
LocalDate localToDate, long betweenDays) {
boolean isSplit = true;
if (preShiftInfoBean != null) {
String isAcross = preShiftInfoBean.getIsAcross();
if ("1".equalsIgnoreCase(isAcross)) {
List<int[]> workAcrossIndex = preShiftInfoBean.getWorkAcrossIndex();
if (workAcrossIndex != null && !workAcrossIndex.isEmpty()) {
int[] workIndexs = workAcrossIndex.get(workAcrossIndex.size() - 1);
return nonWorkDayCommonSplit(splitBean, i, kqTimesArrayComInfo, localFromDate, localToDate, betweenDays, workIndexs[1]);
}
} else {
return nonWorkDayCommonSplit(splitBean, i, kqTimesArrayComInfo, localFromDate, localToDate, betweenDays, -1);
}
} else {
return nonWorkDayCommonSplit(splitBean, i, kqTimesArrayComInfo, localFromDate, localToDate, betweenDays, -1);
}
return isSplit;
}
/**
* 非工作时长(自然日计算的)
*
* @param splitBean
* @param i
* @param kqTimesArrayComInfo
* @param localFromDate
* @param localToDate
* @param betweenDays
* @param preLastWorkIndex 如果前一天跨天,前一天最晚的下班时间
* @return
*/
public boolean nonWorkDayCommonSplit(SplitBean splitBean, int i,
KQTimesArrayComInfo kqTimesArrayComInfo, LocalDate localFromDate,
LocalDate localToDate, long betweenDays, int preLastWorkIndex) {
boolean isSplit = true;
String fromtimedbOri = splitBean.getFromtimedb();
String totimedbOri = splitBean.getTotimedb();
String repeatTime = "0";
DurationTypeEnum durationTypeEnum = splitBean.getDurationTypeEnum();
if(DurationTypeEnum.LEAVE == durationTypeEnum || DurationTypeEnum.LEAVEBACK == durationTypeEnum){
repeatTime = splitBean.getRepeatTime();
}
String fromTime = splitBean.getFromtimedb();
String toTime = splitBean.getTotimedb();
int fromtimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(fromTime);
int totimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(toTime);
int flowbegintimeIndex = -1;
int flowendtimeIndex = -1;
if (i == 0) {
isSplit = false;
return isSplit;
} else {
if (localFromDate.isEqual(localToDate)) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = totimeIndex;
} else {
if (i == 1) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = 1440;
} else if (i == betweenDays) {
flowbegintimeIndex = 0;
flowendtimeIndex = totimeIndex;
} else {
flowbegintimeIndex = 0;
flowendtimeIndex = 1440;
}
}
}
if (isSplit) {
String splitFromTime = kqTimesArrayComInfo.getTimesByArrayindex(flowbegintimeIndex);
if (preLastWorkIndex > 0) {
if (preLastWorkIndex > flowbegintimeIndex) {
flowbegintimeIndex = preLastWorkIndex;
}
}
if("1".equals(repeatTime)){
int flowbegintimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(fromtimedbOri);
int flowendtimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(totimedbOri);
if(flowbegintimeIndexO > flowbegintimeIndex){
flowbegintimeIndex = flowbegintimeIndexO;
}
if(flowendtimeIndexO < flowendtimeIndex){
flowendtimeIndex = flowendtimeIndexO;
}
}
if ("2".equalsIgnoreCase(splitBean.getDurationrule())) {
if ("2".equalsIgnoreCase(splitBean.getTimeselection())) {
return WorkHalfUnitSplitChain.getSplitDurationBean4NonTime(kqTimesArrayComInfo, splitBean, flowbegintimeIndex, flowendtimeIndex);
}
} else {
splitFromTime = kqTimesArrayComInfo.getTimesByArrayindex(flowbegintimeIndex);
String splitToTime = kqTimesArrayComInfo.getTimesByArrayindex(flowendtimeIndex);
int flowMins = flowendtimeIndex - flowbegintimeIndex;
flowMins = flowMins > 0 ? flowMins : 0;
splitBean.setD_Mins(flowMins);
splitBean.setFromTime(splitFromTime);
splitBean.setToTime(splitToTime);
}
}
return isSplit;
}
/**
* 固定班制和排班制的数据拆分
*
* @param shiftInfoBean
* @param splitBean
* @param i
* @param kqTimesArrayComInfo
* @param initArrays
* @param localFromDate
* @param localToDate
* @param betweenDays
* @param shouldLog
* @return
*/
public boolean commonShiftSplit(ShiftInfoBean shiftInfoBean, SplitBean splitBean, int i,
KQTimesArrayComInfo kqTimesArrayComInfo, int[] initArrays, LocalDate localFromDate,
LocalDate localToDate, long betweenDays, boolean shouldLog) {
return commonShiftSplit(shiftInfoBean, splitBean, i, kqTimesArrayComInfo, initArrays, localFromDate, localToDate, betweenDays, shouldLog, false);
}
public boolean commonShiftSplit(ShiftInfoBean shiftInfoBean, SplitBean splitBean, int i,
KQTimesArrayComInfo kqTimesArrayComInfo, int[] initArrays, LocalDate localFromDate,
LocalDate localToDate, long betweenDays, boolean shouldLog, boolean is_flow_humanized) {
boolean isSplit = true;
String fromTime = splitBean.getFromtimedb();
String toTime = splitBean.getTotimedb();
String fromtimedbOri = splitBean.getFromtimedb();
String totimedbOri = splitBean.getTotimedb();
String repeatTime = "0";
DurationTypeEnum durationTypeEnum = splitBean.getDurationTypeEnum();
if(DurationTypeEnum.LEAVE == durationTypeEnum || DurationTypeEnum.LEAVEBACK == durationTypeEnum){
repeatTime = splitBean.getRepeatTime();
}
int fromtimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(fromTime);
int totimeIndex = kqTimesArrayComInfo.getArrayindexByTimes(toTime);
int flowbegintimeIndex = -1;
int flowendtimeIndex = -1;
String isAcross = shiftInfoBean.getIsAcross();
List<String> real_allLongWorkTime = Lists.newArrayList();
List<String> allLongWorkTime = shiftInfoBean.getAllLongWorkTime();
CollectionUtils.addAll(real_allLongWorkTime, new Object[allLongWorkTime.size()]);
Collections.copy(real_allLongWorkTime, allLongWorkTime);
List<int[]> real_workLongTimeIndex = Lists.newArrayList();
List<int[]> workLongTimeIndex = shiftInfoBean.getWorkLongTimeIndex();
//list带数组这里要深拷贝
for (int[] tmp : workLongTimeIndex) {
int[] real_tmp = new int[tmp.length];
System.arraycopy(tmp, 0, real_tmp, 0, tmp.length);
real_workLongTimeIndex.add(real_tmp);
}
List<int[]> restLongTimeIndex = shiftInfoBean.getRestLongTimeIndex();
if (real_allLongWorkTime == null || real_allLongWorkTime.isEmpty()) {
isSplit = false;
return isSplit;
}
if (real_workLongTimeIndex.size() == 1) {
KQShiftRuleInfoBiz kqShiftRuleInfoBiz = new KQShiftRuleInfoBiz();
kqShiftRuleInfoBiz.rest_workLongTimeIndex(shiftInfoBean, splitBean, real_workLongTimeIndex, kqTimesArrayComInfo, real_allLongWorkTime, is_flow_humanized);
}
//如果不跨天
if (!isAcross.equalsIgnoreCase("1")) {
//如果是请假开始日期的前一天
if (i == 0) {
isSplit = false;
return isSplit;
} else {
int firstTime = kqTimesArrayComInfo.getArrayindexByTimes(real_allLongWorkTime.get(0));
int lastTime = kqTimesArrayComInfo.getArrayindexByTimes(real_allLongWorkTime.get(real_allLongWorkTime.size() - 1));
if (localFromDate.isEqual(localToDate)) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = totimeIndex;
} else {
if (i == 1) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = lastTime;
} else if (i == betweenDays) {
flowbegintimeIndex = firstTime;
flowendtimeIndex = totimeIndex;
} else {
flowbegintimeIndex = firstTime;
flowendtimeIndex = lastTime;
}
}
//工作时段里填充上1
for (int j = 0; real_workLongTimeIndex != null && j < real_workLongTimeIndex.size(); j++) {
int[] longtimeIndexs = real_workLongTimeIndex.get(j);
Arrays.fill(initArrays, longtimeIndexs[0], longtimeIndexs[1], 1);
}
for (int j = 0; restLongTimeIndex != null && j < restLongTimeIndex.size(); j++) {
int[] resttimeIndexs = restLongTimeIndex.get(j);
Arrays.fill(initArrays, resttimeIndexs[0], resttimeIndexs[1], -1);
}
}
} else {
int firstTime = kqTimesArrayComInfo.getArrayindexByTimes(real_allLongWorkTime.get(0));
//lasttime一定是跨天的
int lastTime = kqTimesArrayComInfo.getArrayindexByTimes(real_allLongWorkTime.get(real_allLongWorkTime.size() - 1));
if (i == 0) {
int fromtimeIndex48 = kqTimesArrayComInfo.turn24to48TimeIndex(fromtimeIndex);
int totimeIndex48 = kqTimesArrayComInfo.turn24to48TimeIndex(totimeIndex);
if (fromtimeIndex48 < lastTime) {
flowbegintimeIndex = fromtimeIndex48;
if (localFromDate.isEqual(localToDate)) {
if (totimeIndex48 < lastTime) {
flowendtimeIndex = totimeIndex48;
} else {
flowendtimeIndex = lastTime;
}
} else {
if (betweenDays == 2) {
//流程上开始日期和结束日期就相差一天
if ((totimeIndex48 + 1440) < lastTime) {
flowendtimeIndex = totimeIndex48;
} else {
flowendtimeIndex = lastTime;
}
} else {
//流程上开始日期和结束日期相差超过1天
flowendtimeIndex = lastTime;
}
}
} else {
isSplit = false;
return isSplit;
}
} else {
if (localFromDate.isEqual(localToDate)) {
flowbegintimeIndex = fromtimeIndex;
flowendtimeIndex = totimeIndex;
} else {
if (i == 1) {
flowbegintimeIndex = fromtimeIndex;
if ((i + 1) == (betweenDays)) {
int totimeIndex48 = kqTimesArrayComInfo.turn24to48TimeIndex(totimeIndex);
if (totimeIndex48 < lastTime) {
flowendtimeIndex = totimeIndex48;
} else {
flowendtimeIndex = lastTime;
}
} else {
flowendtimeIndex = lastTime;
}
} else if (i == (betweenDays - 1)) {
flowbegintimeIndex = firstTime;
int totimeIndex48 = kqTimesArrayComInfo.turn24to48TimeIndex(totimeIndex);
if (totimeIndex48 < lastTime) {
flowendtimeIndex = totimeIndex48;
} else {
flowendtimeIndex = lastTime;
}
} else if (i == betweenDays) {
flowbegintimeIndex = firstTime;
flowendtimeIndex = totimeIndex;
if (firstTime > totimeIndex) {
isSplit = false;
return isSplit;
}
} else {
flowbegintimeIndex = firstTime;
flowendtimeIndex = lastTime;
if (firstTime > lastTime) {
isSplit = false;
return isSplit;
}
}
}
}
//工作时段里填充上1
for (int j = 0; j < real_workLongTimeIndex.size(); j++) {
int[] longtimeIndexs = real_workLongTimeIndex.get(j);
Arrays.fill(initArrays, longtimeIndexs[0], longtimeIndexs[1], 1);
}
for (int j = 0; j < restLongTimeIndex.size(); j++) {
int[] resttimeIndexs = restLongTimeIndex.get(j);
Arrays.fill(initArrays, resttimeIndexs[0], resttimeIndexs[1], -1);
}
}
if (isSplit) {
if ("2".equalsIgnoreCase(splitBean.getDurationrule())) {
if ("2".equalsIgnoreCase(splitBean.getTimeselection())) {
return WorkHalfUnitSplitChain.getSplitDurationBean4Time(initArrays, shiftInfoBean, kqTimesArrayComInfo, splitBean, flowbegintimeIndex, flowendtimeIndex);
}
} else {
String splitFromTime = kqTimesArrayComInfo.getTimesByArrayindex(flowbegintimeIndex);
String splitToTime = kqTimesArrayComInfo.getTimesByArrayindex(flowendtimeIndex);
int flowMins = kqTimesArrayComInfo.getCnt(initArrays, flowbegintimeIndex, flowendtimeIndex, 1);
if("1".equals(repeatTime)){
flowMins = 0;
int flowbegintimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(fromtimedbOri);
int flowendtimeIndexO = kqTimesArrayComInfo.getArrayindexByTimes(totimedbOri);
if(flowbegintimeIndexO < flowbegintimeIndex){
flowbegintimeIndexO = flowbegintimeIndex;
}
if(flowendtimeIndexO > flowendtimeIndex){
flowendtimeIndexO = flowendtimeIndex;
}
int flowMinsO = kqTimesArrayComInfo.getCnt(initArrays, flowbegintimeIndexO, flowendtimeIndexO, 1);
if(flowMinsO > 0){
splitFromTime = fromtimedbOri;
splitToTime = totimedbOri;
flowMins += flowMinsO;
}
//还有跨天的情况
int flowbegintimeIndexN = kqTimesArrayComInfo.getArrayindexByTimes(kqTimesArrayComInfo.turn24to48Time(fromtimedbOri));
int flowendtimeIndexN = kqTimesArrayComInfo.getArrayindexByTimes(kqTimesArrayComInfo.turn24to48Time(totimedbOri));
if(flowbegintimeIndexN < flowbegintimeIndex){
flowbegintimeIndexN = flowbegintimeIndex;
}
if(flowendtimeIndexN > flowendtimeIndex){
flowendtimeIndexN = flowendtimeIndex;
}
int flowMinsN = kqTimesArrayComInfo.getCnt(initArrays, flowbegintimeIndexN, flowendtimeIndexN, 1);
if(flowMinsN > 0){
splitFromTime = kqTimesArrayComInfo.turn24to48Time(fromtimedbOri);
splitToTime = kqTimesArrayComInfo.turn24to48Time(totimedbOri);
flowMins += flowMinsN;
}
}
if (shouldLog) {
kqLog.info("resourceid:" + splitBean.getResourceId() + ":::i::" + i + "::flowbegintimeIndex:" + flowbegintimeIndex + ":flowendtimeIndex:" + flowendtimeIndex + ":flowMins:" + flowMins);
}
flowMins = flowMins > 0 ? flowMins : 0;
if (flowMins < 0) {
if (shouldLog) {
kqLog.info("resourceid:" + splitBean.getResourceId() + ":::不记录中间表 i::" + i + "::flowbegintimeIndex:" + flowbegintimeIndex + ":flowendtimeIndex:" + flowendtimeIndex + ":flowMins:" + flowMins);
}
return false;
}
splitBean.setD_Mins(flowMins);
splitBean.setWorkmins(shiftInfoBean.getWorkmins());
splitBean.setFromTime(splitFromTime);
splitBean.setToTime(splitToTime);
String repeatType = splitBean.getRepeatType();
if(StringUtils.isNotEmpty(repeatType)){
if(CollectionUtils.isNotEmpty(real_workLongTimeIndex)){
int startIdx = real_workLongTimeIndex.get(0)[0];
int endIdx = real_workLongTimeIndex.get(real_workLongTimeIndex.size()-1)[1];
splitBean.setFromtimedb(kqTimesArrayComInfo.getTimesByArrayindex(startIdx));
splitBean.setTotimedb(kqTimesArrayComInfo.getTimesByArrayindex(endIdx));
splitBean.setFromTime("00:00");
splitBean.setToTime("00:00");
}
}
splitBean.setConvertAttendDay(shiftInfoBean.getConvertAttendDay());
}
}
return isSplit;
}
/**
* 根据单位来转换时长
*
* @param splitBean
* @param isComputingMode2 是否按照自然日计算
*/
private void turnDuration(SplitBean splitBean, boolean isComputingMode2) {
//哺乳假用到
KQRepeatBean kqRepeatBean = KQRepeatLengthContext.getRepeatBean();
if(kqRepeatBean != null){
Long repeatMins = getRepeatMins(kqRepeatBean);
if(repeatMins != null && repeatMins > 0){
splitBean.setD_Mins(repeatMins);
}
}
String durationrule = splitBean.getDurationrule();
//计算规则 1-按天请假 2-按半天请假 3-按小时请假 4-按整天请假 5半小时 6整小时
//按照天和小时的可以在这里计算,半天的和整天的单独处理
if ("1".equalsIgnoreCase(durationrule)) {
durationrule1(splitBean, isComputingMode2);
} else if ("3".equalsIgnoreCase(durationrule)) {
durationrule3(splitBean, isComputingMode2);
} else if ("5".equalsIgnoreCase(durationrule)) {
String conversion = splitBean.getConversion();
if (conversion.length() > 0 && Util.getIntValue(conversion) > 0) {
double conversionMins = 0.0;
int halfHourInt = 30;
KQOverTimeRuleCalBiz kqOverTimeRuleCalBiz = new KQOverTimeRuleCalBiz();
conversionMins = kqOverTimeRuleCalBiz.getConversionMins(halfHourInt, splitBean.getD_Mins(), Util.getIntValue(conversion));
splitBean.setD_Mins(conversionMins);
}
durationrule3(splitBean, isComputingMode2);
} else if ("6".equalsIgnoreCase(durationrule)) {
String conversion = splitBean.getConversion();
if (conversion.length() > 0 && Util.getIntValue(conversion) > 0) {
double conversionMins = 0.0;
int wholeHourInt = 60;
KQOverTimeRuleCalBiz kqOverTimeRuleCalBiz = new KQOverTimeRuleCalBiz();
conversionMins = kqOverTimeRuleCalBiz.getConversionMins(wholeHourInt, splitBean.getD_Mins(), Util.getIntValue(conversion));
splitBean.setD_Mins(conversionMins);
}
durationrule3(splitBean, isComputingMode2);
}
}
private Long getRepeatMins(KQRepeatBean kqRepeatBean) {
Long repeatMins = 0L;
try{
String repeatType = kqRepeatBean.getRepeatType();
if(StringUtils.isNotEmpty(repeatType)){
Long repeatLate = kqRepeatBean.getRepeatLate();
Long repeatEarly = kqRepeatBean.getRepeatEarly();
if("0".equals(repeatType)){
if(repeatLate != null){
repeatMins += new Double(Double.valueOf(repeatLate)).longValue();
}
}
if("1".equals(repeatType)){
if(repeatEarly != null){
repeatMins += new Double(Double.valueOf(repeatEarly)).longValue();
}
}
if("2".equals(repeatType)){
if(repeatLate != null){
repeatMins += new Double(Double.valueOf(repeatLate)).longValue();
}
if(repeatEarly != null){
repeatMins += new Double(Double.valueOf(repeatEarly)).longValue();
}
}
}
}catch (Exception e){
}
return repeatMins;
}
/**
* 按天请假
*
* @param splitBean
* @param isComputingMode2 是否按照自然日计算
* @return
*/
private void durationrule1(SplitBean splitBean, boolean isComputingMode2) {
String computingMode = splitBean.getComputingMode();
double d_Mins = splitBean.getD_Mins();
double curDays = 0.0;
if (isComputingMode2) {
double oneDayHour = splitBean.getOneDayHour();
if (oneDayHour > 0) {
double oneDayMins = oneDayHour * 60.0;
splitBean.setWorkmins(((int) oneDayMins));
if (d_Mins > oneDayMins) {
d_Mins = oneDayMins;
splitBean.setD_Mins(d_Mins);
}
curDays = (d_Mins) / (oneDayMins);
curDays = curDays > 0 ? curDays : 0.0;
}
} else {
int workmins = splitBean.getWorkmins();
String convertAttendDay = Util.null2s(splitBean.getConvertAttendDay(),"1.0");
double convertAttendDayD = Util.getDoubleValue(convertAttendDay);
if (workmins > 0) {
curDays = (d_Mins / (workmins * 1.0))*convertAttendDayD;
curDays = curDays > 0 ? curDays : 0.0;
}
}
splitBean.setDuration(KQDurationCalculatorUtil.getDurationRound5("" + (curDays)));
}
/**
* 按小时请假
*
* @param splitBean
* @param isComputingMode2
* @return
*/
private double durationrule3(SplitBean splitBean, boolean isComputingMode2) {
double D_Mins = splitBean.getD_Mins();
double hours = 0.0;
if (isComputingMode2) {
double oneDayHour = splitBean.getOneDayHour();
if (oneDayHour > 0) {
double oneDayMins = oneDayHour * 60.0;
splitBean.setWorkmins(((int) oneDayMins));
if (D_Mins > oneDayMins) {
D_Mins = oneDayMins;
splitBean.setD_Mins(D_Mins);
}
}
}
hours = D_Mins / 60.0;
hours = hours > 0 ? hours : 0.0;
splitBean.setDuration(KQDurationCalculatorUtil.getDurationRound("" + (hours)));
return hours;
}
/**
* 根据传入的日期和时间拆分成每一天一条的集合
*
* @param fromDate
* @param toDate
* @param fromTime
* @param toTime
* @return
*/
public static List<Map<String, String>> getSplitList(String fromDate, String toDate, String fromTime, String toTime) {
List<Map<String, String>> splitLists = new ArrayList<>();
Map<String, String> splitMap = new HashMap<>();
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//进入到这里表示是多天
if (localFromDate.isBefore(localToDate)) {
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
splitMap = new HashMap<>();
LocalDate curLocalDate = localFromDate.plusDays(i);
splitMap.put("splitDate", curLocalDate.format(dateFormatter));
if (i == 0) {
splitMap.put("fromTime", fromTime);
splitMap.put("toTime", "23:59");
} else if (i == betweenDays) {
splitMap.put("fromTime", "00:00");
splitMap.put("toTime", toTime);
} else {
splitMap.put("fromTime", "00:00");
splitMap.put("toTime", "23:59");
}
splitLists.add(splitMap);
}
} else if (localFromDate.isEqual(localToDate)) {
//同一天
splitMap.put("splitDate", localFromDate.format(dateFormatter));
splitMap.put("fromTime", fromTime);
splitMap.put("toTime", toTime);
splitLists.add(splitMap);
}
return splitLists;
}
/**
* 根据传入的日期和时间拆分成每一天一条的集合
*
* @param fromDate
* @param toDate
* @param fromTime
* @param toTime
* @return
*/
public static List<Map<String, String>> getSplitListRepeat(String fromDate, String toDate, String fromTime, String toTime) {
List<Map<String, String>> splitLists = new ArrayList<>();
Map<String, String> splitMap = new HashMap<>();
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
splitMap = new HashMap<>();
LocalDate curLocalDate = localFromDate.plusDays(i);
splitMap.put("splitDate", curLocalDate.format(dateFormatter));
splitMap.put("fromTime", fromTime);
splitMap.put("toTime", toTime);
splitLists.add(splitMap);
}
return splitLists;
}
/**
* 根据传入的日期和时间拆分成半天规则的集合
*
* @param fromDate
* @param toDate
* @param fromTime
* @param toTime
* @return
*/
public static List<Map<String, String>> getSplitHalfDayList(String fromDate, String toDate, String fromTime, String toTime) {
List<Map<String, String>> splitLists = new ArrayList<>();
Map<String, String> splitMap = new HashMap<>();
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//进入到这里表示是多天
if (localFromDate.isBefore(localToDate)) {
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
splitMap = new HashMap<>();
LocalDate curLocalDate = localFromDate.plusDays(i);
splitMap.put("splitDate", curLocalDate.format(dateFormatter));
if (i == 0) {
int foreOrAfter = SplitSelectSet.foreOrAfter(fromTime, SplitSelectSet.afternoon_end);
splitMap.put("foreOrAfter", "" + foreOrAfter);
} else if (i == betweenDays) {
int foreOrAfter = SplitSelectSet.foreOrAfter(SplitSelectSet.forenoon_start, toTime);
splitMap.put("foreOrAfter", "" + foreOrAfter);
} else {
splitMap.put("foreOrAfter", "" + SplitSelectSet.fore_after_index);
}
splitLists.add(splitMap);
}
} else if (localFromDate.isEqual(localToDate)) {
//同一天
splitMap.put("splitDate", localFromDate.format(dateFormatter));
int foreOrAfter = SplitSelectSet.foreOrAfter(fromTime, toTime);
splitMap.put("foreOrAfter", "" + foreOrAfter);
splitLists.add(splitMap);
}
return splitLists;
}
/**
* 根据传入的日期分成集合
*
* @param fromDate
* @param toDate
* @return
*/
public static List<Map<String, String>> getSplitDayList(String fromDate, String toDate) {
List<Map<String, String>> splitLists = new ArrayList<>();
Map<String, String> splitMap = new HashMap<>();
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
splitMap = new HashMap<>();
LocalDate curLocalDate = localFromDate.plusDays(i);
splitMap.put("splitDate", curLocalDate.format(dateFormatter));
splitLists.add(splitMap);
}
return splitLists;
}
/**
* 对于工作日加班判断是否是开启了晚走晚到的规则,开启了的话,不试做加班
*
* @return
*/
public boolean checkIsLateoutlatein(String resourceId, String taskDate) {
boolean isLateoutlatein = false;
KQWorkTime kqWorkTime = new KQWorkTime();
Map<String, Object> serialInfo = kqWorkTime.getSerialInfo(resourceId, taskDate, false);
if (serialInfo != null && serialInfo.size() > 0) {
boolean isRest = kqWorkTime.isNonWork(serialInfo);
if(isRest){
return isLateoutlatein;
}
String serialid = Util.null2String(serialInfo.get(taskDate));
if (serialid.length() > 0) {
KQShiftPersonalizedRuleCominfo ruleCominfo = new KQShiftPersonalizedRuleCominfo();
KQShiftPersonalizedRuleDetailComInfo ruleDetailComInfo = new KQShiftPersonalizedRuleDetailComInfo();
String personalizedruleid = ruleCominfo.getID(serialid);
Map<String, Object> ruleDetailMap = ruleDetailComInfo.getPersonalizedRuleDetail(personalizedruleid);
if (ruleDetailMap != null && !ruleDetailMap.isEmpty()) {
List<Object> workSectionList = (List<Object>) ruleDetailMap.get("lateoutlatein");
if (workSectionList != null && !workSectionList.isEmpty()) {
// workSectionList里存的enable都是一致的取一个就行
Map<String, Object> sectionMap = (Map<String, Object>) workSectionList.get(0);
if (sectionMap != null && !sectionMap.isEmpty()) {
String enable = Util.null2String(sectionMap.get("enable"));
if ("1".equalsIgnoreCase(enable)) {
isLateoutlatein = true;
kqLog.info("resourceid:" + resourceId + ":taskDate:" + taskDate + ":::开启了晚走晚到规则,不计算加班 checkIsLateoutlatein:resourceId:" + resourceId + ":taskDate:" + taskDate + ":serialid:" + serialid);
return isLateoutlatein;
}
}
}
}
}
}
return isLateoutlatein;
}
/**
* 推送 补打卡,外勤,考勤同步数据,触发加班规则生成加班数据处理
*
* @param fromDate
* @param toDate
* @param resourceids 支持多个人的
*/
public static void pushOverTimeTasksAll(String fromDate, String toDate, String resourceids) {
kqLog.info("pushOverTimeTasksAll 参数为:resourceids:" + resourceids + ":fromDate:" + fromDate + ":toDate:" + toDate);
if (resourceids.length() == 0 || fromDate.length() == 0 || toDate.length() == 0) {
return;
}
List<KQTaskBean> tasks = new ArrayList<>();
String[] resourceid_arr = resourceids.split(",");
for (int i = 0; i < resourceid_arr.length; i++) {
pushOverTimeTasks(fromDate, toDate, resourceid_arr[i], tasks);
}
if (!tasks.isEmpty()) {
KQQueue.writeTasks(tasks);
}
}
/**
* 推送 补打卡,外勤,考勤同步数据,触发加班规则生成加班数据处理
*
* @param fromDate
* @param toDate
* @param resourceid
* @param tasks
*/
public static void pushOverTimeTasks(String fromDate, String toDate, String resourceid, List<KQTaskBean> tasks) {
try {
if (true) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setOvertime_fromdate(fromDate);
kqTaskBean.setOvertime_todate(toDate);
tasks.add(kqTaskBean);
} else {
pushOverTimeTasks_old(fromDate, toDate, resourceid, tasks);
}
} catch (Exception e) {
baseBean.writeLog(e);
}
}
public static void pushOverTimeTasks_old(String fromDate, String toDate, String resourceid, List<KQTaskBean> tasks) {
// kqLog.info("批量加班推送 pushOverTimeTasks:fromDate:"+fromDate+"::toDate:"+toDate+"::resourceid:"+resourceid);
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
LocalDate curLocalDate = localFromDate.plusDays(i);
LocalDate preCurLocalDate = curLocalDate.minusDays(1);
LocalDate nextCurLocalDate = curLocalDate.plusDays(1);
String splitDate = curLocalDate.format(dateFormatter);
String pre_splitDate = preCurLocalDate.format(dateFormatter);
String next_splitDate = nextCurLocalDate.format(dateFormatter);
Map<String, Object> pre_todayLineMap = KQDurationCalculatorUtil.getWorkButton(resourceid, pre_splitDate, false);
Map<String, Object> todayLineMap = KQDurationCalculatorUtil.getWorkButton(resourceid, splitDate, false);
//因为现在是上班前都归属前一天,所以这里存一下上班前的开始时间
Map<String, String> workTimeStartMap = new HashMap<>();
//如果昨天是工作日,昨天的上班时间作为今天的允许加班开始时间(因为下班后加班都属于前一天的)
String pre_workTime = "";
if (pre_todayLineMap.get("signTime") != null) {
pre_workTime = getEndWorktime(pre_todayLineMap, splitDate, workTimeStartMap, resourceid, pre_splitDate);
} else {
workTimeStartMap.put("pre_isrest", "1");
}
//如果今天是非工作日,明天是工作日,明天的上班时间作为今天的允许加班结束时间
String next_workTime = "";
Map<String, Object> next_todayLineMap = KQDurationCalculatorUtil.getWorkButton(resourceid, next_splitDate, false);
if (next_todayLineMap.get("signTime") != null) {
next_workTime = getStartWorktime(next_todayLineMap, splitDate, workTimeStartMap);
} else {
workTimeStartMap.put("next_isrest", "1");
}
boolean isTodayWorkDay = todayLineMap.get("signTime") != null;
kqLog.info("pushOverTimeTasks splitDate:" + splitDate + ":isTodayWorkDay:" + isTodayWorkDay + ":pre_workTime:" + pre_workTime + ":next_workTime:" + next_workTime);
//如果当前日期是工作日
if (isTodayWorkDay) {
List<Map<String, String>> todaySignTime = (List<Map<String, String>>) todayLineMap.get("signTime");
if (todaySignTime != null && !todaySignTime.isEmpty()) {
overTime4Work(splitDate, pre_splitDate, resourceid, tasks, todayLineMap, todaySignTime, workTimeStartMap);
} else {
overTime4NonWork(splitDate, pre_workTime, resourceid, tasks, next_workTime, workTimeStartMap, pre_splitDate);
}
} else {
overTime4NonWork(splitDate, pre_workTime, resourceid, tasks, next_workTime, workTimeStartMap, pre_splitDate);
}
}
// kqLog.info("批量加班推送 数据为:"+(JSON.toJSONString(tasks)));
}
/**
* 获取最晚允许下班时间
*
* @param pre_todayLineMap
* @param splitDate
* @param workTimeStartMap
* @param resourceid
* @param pre_splitDate
* @return
*/
private static String getEndWorktime(Map<String, Object> pre_todayLineMap, String splitDate,
Map<String, String> workTimeStartMap, String resourceid, String pre_splitDate) {
String pre_workTime = "";
List<Map<String, String>> pre_todaySignTime = (List<Map<String, String>>) pre_todayLineMap.get("signTime");
if (pre_todaySignTime != null && !pre_todaySignTime.isEmpty()) {
Map<String, String> pre_todaySignMap = pre_todaySignTime.get(pre_todaySignTime.size() - 1);
String endtime = pre_todaySignMap.get("endtime");
String endtime_across = pre_todaySignMap.get("endtime_across");
if ("1".equalsIgnoreCase(endtime_across)) {
pre_workTime = splitDate + " " + endtime + ":59";
}
Map<String, String> first_SignMap = pre_todaySignTime.get(0);
String workbengintime = first_SignMap.get("workbengintime");
workTimeStartMap.put("pre_workbengintime", workbengintime);
if (pre_todaySignTime.size() == 1) {
boolean is_flow_humanized = KQSettingsBiz.is_flow_humanized();
if (is_flow_humanized) {
ShiftInfoBean shiftInfoBean = KQDurationCalculatorUtil.getWorkTime(resourceid, pre_splitDate, false);
Map<String, String> shifRuleMap = Maps.newHashMap();
KQShiftRuleInfoBiz.getShiftRuleInfo(shiftInfoBean, resourceid, shifRuleMap);
if (!shifRuleMap.isEmpty()) {
if (shifRuleMap.containsKey("shift_beginworktime")) {
String shift_beginworktime = Util.null2String(shifRuleMap.get("shift_beginworktime"));
if (shift_beginworktime.length() > 0) {
workTimeStartMap.put("pre_workbengintime", shift_beginworktime);
}
}
if (shifRuleMap.containsKey("shift_endworktime")) {
String shift_endworktime = Util.null2String(shifRuleMap.get("shift_endworktime"));
if (shift_endworktime.length() > 0) {
pre_workTime = shift_endworktime;
}
}
}
}
}
} else {
workTimeStartMap.put("pre_isrest", "1");
}
return pre_workTime;
}
/**
* 获取最早允许上班时间
*
* @param next_todayLineMap
* @param splitDate
* @return
*/
private static String getStartWorktime(Map<String, Object> next_todayLineMap, String splitDate,
Map<String, String> workTimeStartMap) {
String next_workTime = "";
List<Map<String, String>> next_todaySignTime = (List<Map<String, String>>) next_todayLineMap.get("signTime");
if (next_todaySignTime != null && !next_todaySignTime.isEmpty()) {
Map<String, String> next_todaySignMap = next_todaySignTime.get(0);
String bengintime = next_todaySignMap.get("bengintime");
String workbengintime = next_todaySignMap.get("workbengintime");
String bengintime_pre_across = next_todaySignMap.get("bengintime_pre_across");
if ("1".equalsIgnoreCase(bengintime_pre_across)) {
next_workTime = splitDate + " " + bengintime + ":00";
}
workTimeStartMap.put("next_workbengintime", workbengintime);
} else {
workTimeStartMap.put("next_isrest", "1");
}
return next_workTime;
}
public static void overTime4Work(String splitDate, String pre_splitDate, String resourceid,
List<KQTaskBean> tasks, Map<String, Object> todayLineMap,
List<Map<String, String>> todaySignTime,
Map<String, String> workTimeStartMap) {
//现在标准是默认取最后一个班次作为加班
Map<String, String> todaySignMap = Maps.newHashMap();
if (todaySignTime.size() == 1) {
todaySignMap = todaySignTime.get(0);
overTime4WorkSign(todaySignMap, splitDate, pre_splitDate, resourceid, tasks, todayLineMap, workTimeStartMap, "");
} else if (todaySignTime.size() > 1) {
for (int i = 0; i < 2; i++) {
if (i == 0) {
todaySignMap = todaySignTime.get(0);
overTime4WorkSign(todaySignMap, splitDate, pre_splitDate, resourceid, tasks, todayLineMap, workTimeStartMap, "before");
} else if (i == 1) {
todaySignMap = todaySignTime.get(todaySignTime.size() - 1);
overTime4WorkSign(todaySignMap, splitDate, pre_splitDate, resourceid, tasks, todayLineMap, workTimeStartMap, "after");
}
}
}
}
public static void overTime4WorkSign(
Map<String, String> todaySignMap, String splitDate, String pre_splitDate,
String resourceid, List<KQTaskBean> tasks,
Map<String, Object> todayLineMap,
Map<String, String> workTimeStartMap, String signsource) {
RecordSet rs = new RecordSet();
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter fullFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
List<String> allWorkTime = (List<String>) todayLineMap.get("allWorkTime");
String firstWorkTime = "";
String lastWorkTime = "";
if (allWorkTime != null && !allWorkTime.isEmpty()) {
firstWorkTime = allWorkTime.get(0);
lastWorkTime = allWorkTime.get(allWorkTime.size() - 1);
}
String yesterday = LocalDate.parse(splitDate).minusDays(1).format(dateFormatter);
String nextday = LocalDate.parse(splitDate).plusDays(1).format(dateFormatter);
String workbengintime = Util.null2s(todaySignMap.get("workbengintime"), "");
String bengintime = Util.null2s(todaySignMap.get("bengintime"), "");
//上班开始时间是否跨天到后一天
String bengintime_across = Util.null2s(todaySignMap.get("bengintime_across"), "");
//上班打卡开始时间是否跨天到前一天
String bengintime_pre_across = Util.null2s(todaySignMap.get("bengintime_pre_across"), "");
String bengintime_end = Util.null2s(todaySignMap.get("bengintime_end"), "");
String bengintime_end_across = Util.null2s(todaySignMap.get("bengintime_end_across"), "");
String endtime = Util.null2s(todaySignMap.get("endtime"), "");
String endtime_across = Util.null2s(todaySignMap.get("endtime_across"), "");
String endtime_start = Util.null2s(todaySignMap.get("endtime_start"), "");
String endtime_start_across = Util.null2s(todaySignMap.get("endtime_start_across"), "");
String workendtime_across = Util.null2s(todaySignMap.get("workendtime_across"), "");
boolean isEndTimeAcross = false;
if ("1".equalsIgnoreCase(workendtime_across)) {
isEndTimeAcross = true;
}
String signInDateTime = splitDate + " " + bengintime + ":00";
if ("1".equalsIgnoreCase(bengintime_pre_across)) {
signInDateTime = yesterday + " " + bengintime + ":00";
}
if ("1".equalsIgnoreCase(bengintime_across)) {
signInDateTime = nextday + " " + bengintime + ":00";
}
String signInEndDateTime = "";
if (bengintime_end.length() > 0) {
signInEndDateTime = splitDate + " " + bengintime_end + ":00";
if ("1".equalsIgnoreCase(bengintime_end_across)) {
signInEndDateTime = nextday + " " + bengintime_end + ":00";
}
}
// if(pre_workTime.length() > 0){
// signInDateTime = splitDate + " " +pre_workTime+":00";
// }
String signOutDateTime = splitDate + " " + endtime + ":59";
if ("1".equalsIgnoreCase(endtime_across)) {
signOutDateTime = nextday + " " + endtime + ":59";
}
String signOutBeginDateTime = "";
if (endtime_start.length() > 0) {
signOutBeginDateTime = splitDate + " " + endtime_start + ":59";
if ("1".equalsIgnoreCase(endtime_start_across)) {
signOutBeginDateTime = nextday + " " + endtime_start + ":59";
}
}
String sign_signSectionTime = "";
String sign_signSectionEndTime = "";
String sign_signSectionBeginTime = "";
String sign_offSignSectionTime = "";
if (signInEndDateTime.length() == 0 && signOutBeginDateTime.length() == 0) {
//如果没设置上班后,下班前打卡
sign_signSectionTime = signInDateTime;
sign_offSignSectionTime = signOutDateTime;
} else {
if (signInEndDateTime.length() > 0) {
if (signOutBeginDateTime.length() > 0) {
//如果上班后,下班前打卡范围都做了控制
sign_signSectionTime = signInDateTime;
sign_signSectionEndTime = signInEndDateTime;
sign_signSectionBeginTime = signOutBeginDateTime;
sign_offSignSectionTime = signOutDateTime;
} else {
LocalDateTime onLocalDateEndTime = LocalDateTime.parse(signInEndDateTime, fullFormatter);
//如果只是上班后打卡范围做了控制
LocalDateTime tmp = LocalDateTime.parse(onLocalDateEndTime.plusMinutes(1).format(datetimeFormatter) + ":00", fullFormatter);
String tmp_datetime = tmp.format(fullFormatter);
sign_signSectionTime = signInDateTime;
sign_signSectionEndTime = signInEndDateTime;
sign_signSectionBeginTime = tmp_datetime;
sign_offSignSectionTime = signOutDateTime;
}
} else if (signOutBeginDateTime.length() > 0) {
//如果只是下班前打卡范围做了控制
LocalDateTime offLocalDateBeginTime = LocalDateTime.parse(signOutBeginDateTime, fullFormatter);
LocalDateTime tmp = LocalDateTime.parse(offLocalDateBeginTime.minusMinutes(1).format(datetimeFormatter) + ":59", fullFormatter);
String tmp_datetime = tmp.format(fullFormatter);
sign_signSectionTime = signInDateTime;
sign_signSectionEndTime = tmp_datetime;
sign_signSectionBeginTime = signOutBeginDateTime;
sign_offSignSectionTime = signOutDateTime;
}
}
KQScheduleSignBiz kqScheduleSignBiz = new KQScheduleSignBiz.KQScheduleSignParamBuilder().resourceidParam(resourceid)
.signSectionTimeParam(sign_signSectionTime).signSectionEndTimeParam(sign_signSectionEndTime)
.signSectionBeginTimeParam(sign_signSectionBeginTime).offSignSectionTimeParam(sign_offSignSectionTime).build();
Map<String, KQHrmScheduleSign> signMap = kqScheduleSignBiz.getScheduleSignInfoWithCardRange();
if (signMap != null && !signMap.isEmpty()) {
KQHrmScheduleSign signInTimeBean = signMap.get("signin");
KQHrmScheduleSign signOutTimeBean = signMap.get("signout");
if (allWorkTime.size() == 2) {
boolean is_flow_humanized = KQSettingsBiz.is_flow_humanized();
if (is_flow_humanized) {
//一天一次打卡的情况下需要考虑个性化设置
if (todayLineMap.containsKey("shiftRuleMap")) {
Map<String, Object> shiftRuleMap = (Map<String, Object>) todayLineMap.get("shiftRuleMap");
if (shiftRuleMap != null && !shiftRuleMap.isEmpty() && shiftRuleMap.containsKey("ruleDetail")) {//处理人性化设置其他规则
Map<String, Object> ruleDetail = (Map<String, Object>) shiftRuleMap.get("ruleDetail");
if (ruleDetail != null && !ruleDetail.isEmpty()) {
Map<String, String> shifRuleMap = KQShiftRuleInfoBiz.do4ShiftRule(ruleDetail, signInTimeBean, signOutTimeBean, allWorkTime, splitDate, nextday, resourceid);
if (!shifRuleMap.isEmpty()) {
if (shifRuleMap.containsKey("shift_beginworktime")) {
String shift_beginworktime = Util.null2String(shifRuleMap.get("shift_beginworktime"));
firstWorkTime = shift_beginworktime;
}
if (shifRuleMap.containsKey("shift_endworktime")) {
String shift_endworktime = Util.null2String(shifRuleMap.get("shift_endworktime"));
if (shift_endworktime.length() > 0) {
lastWorkTime = shift_endworktime;
int lastWorkTime_index = kqTimesArrayComInfo.getArrayindexByTimes(lastWorkTime);
if (lastWorkTime_index >= 1440) {
isEndTimeAcross = true;
lastWorkTime = kqTimesArrayComInfo.turn48to24Time(lastWorkTime);
} else {
isEndTimeAcross = false;
}
}
}
}
}
}
}
}
}
if (signsource.length() > 0) {
if ("before".equalsIgnoreCase(signsource)) {
signOutTimeBean = null;
}
if ("after".equalsIgnoreCase(signsource)) {
signInTimeBean = null;
}
}
if (signInTimeBean != null) {
String signdate = Util.null2String(signInTimeBean.getSigndate());
String signtime = Util.null2String(signInTimeBean.getSigntime());
String pre_bengintime = Util.null2String(workTimeStartMap.get("pre_workbengintime"));
if (pre_bengintime.length() > 0) {
//当前是工作日,前一天是工作日的情况
pre_bengintime = pre_bengintime + ":00";
String tmp_pre_bengintime = splitDate + " " + pre_bengintime;
String tmp_workbengintime = splitDate + " " + workbengintime + ":00";
if (tmp_pre_bengintime.compareTo(tmp_workbengintime) > 0) {
pre_bengintime = workbengintime + ":00";
}
if (firstWorkTime.length() > 0) {
String tmp_firstWorkTime = splitDate + " " + firstWorkTime + ":00";
if (tmp_pre_bengintime.compareTo(tmp_firstWorkTime) > 0) {
tmp_pre_bengintime = tmp_firstWorkTime;
pre_bengintime = firstWorkTime + ":00";
}
}
String tmp_signtime = signdate + " " + signtime;
if (tmp_pre_bengintime.compareTo(tmp_signtime) > 0) {
if (signtime.length() > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(pre_splitDate);
kqTaskBean.setLastWorkTime(signtime);
kqTaskBean.setTaskSignTime(pre_bengintime);
kqTaskBean.setSignDate(signdate);
kqTaskBean.setSignEndDate(splitDate);
kqTaskBean.setTimesource("before");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
} else {
kqLog.info("overTime4Work::signtime is null:" + signtime);
}
}
} else {
//当前是工作日,前一天是非工作日的情况
String pre_isrest = Util.null2String(workTimeStartMap.get("pre_isrest"));
if ("1".equalsIgnoreCase(pre_isrest)) {
if (firstWorkTime.length() > 0) {
String tmp_firstWorkTime = splitDate + " " + firstWorkTime + ":00";
String tmp_signtime = signdate + " " + signtime;
if (tmp_firstWorkTime.compareTo(tmp_signtime) > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(pre_splitDate);
kqTaskBean.setSignDate(splitDate);
kqTaskBean.setSignEndDate(signdate);
kqTaskBean.setSignInTime4Out(signtime);
kqTaskBean.setTaskSignTime(firstWorkTime + ":00");
kqTaskBean.setTimesource("before");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
}
}
}
}
}
if (signOutTimeBean != null) {
String signdate = Util.null2String(signOutTimeBean.getSigndate());
String signtime = Util.null2String(signOutTimeBean.getSigntime());
if (lastWorkTime.length() > 0 && signtime.length() > 0) {
if (signtime.length() == 5) {
signtime += ":00";
}
if (lastWorkTime.length() == 5) {
lastWorkTime += ":00";
}
String tmpsigndatetime = signdate + " " + signtime;
String tmpworkdatetime = splitDate + " " + lastWorkTime;
if (isEndTimeAcross) {
tmpworkdatetime = nextday + " " + lastWorkTime;
}
if (tmpsigndatetime.compareTo(tmpworkdatetime) > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(splitDate);
kqTaskBean.setLastWorkTime(lastWorkTime);
kqTaskBean.setTaskSignTime(signtime);
if (isEndTimeAcross) {
kqTaskBean.setSignDate(nextday);
} else {
kqTaskBean.setSignDate(splitDate);
}
kqTaskBean.setSignEndDate(signdate);
kqTaskBean.setTimesource("after");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
}
} else {
kqLog.info("overTime4Work:lastWorkTime is null :" + lastWorkTime + ":signtime is null:" + signtime);
}
}
}
}
/**
* 针对非工作日推送加班数据
*
* @param splitDate
* @param pre_workTime 前一天是工作日,前一天工作日最后下班时间跨天了会影响到今天开始打卡时间
* @param resourceid
* @param tasks
* @param next_workTime 后一天是工作日,后一天的最早上班时间跨天了,会影响到今天的结束打卡时间
* @param workTimeStartMap
* @param pre_splitDate
*/
public static void overTime4NonWork(String splitDate, String pre_workTime, String resourceid,
List<KQTaskBean> tasks, String next_workTime,
Map<String, String> workTimeStartMap, String pre_splitDate) {
String signInTime4Out = "";
String signTime = "";
String bengintime = "00:00";
String endtime = "23:59";
String signInDateTime = splitDate + " " + bengintime + ":00";
if (pre_workTime.length() > 0) {
signInDateTime = pre_workTime;
}
String signOutDateTime = splitDate + " " + endtime + ":59";
if (next_workTime.length() > 0) {
signOutDateTime = next_workTime;
}
String signDateTimeSql = "";
String buildSql = KQSignUtil.buildSignSql(signInDateTime, signOutDateTime);
if (buildSql.length() > 0) {
signDateTimeSql += buildSql;
}
KQScheduleSignBiz kqScheduleSignBiz = new KQScheduleSignBiz.KQScheduleSignParamBuilder().resourceidParam(resourceid).
signDateTimeSqlParam(signDateTimeSql).signDateParam(splitDate).build();
Map<String, KQHrmScheduleSign> signMap = kqScheduleSignBiz.getScheduleSignInfo();
if (signMap != null && !signMap.isEmpty()) {
KQHrmScheduleSign signInTimeBean = signMap.get("signin");
KQHrmScheduleSign signOutTimeBean = signMap.get("signout");
if (signInTimeBean != null) {
signInTime4Out = Util.null2String(signInTimeBean.getSigntime());
}
if (signOutTimeBean != null) {
signTime = Util.null2String(signOutTimeBean.getSigntime());
}
}
String pre_bengintime = Util.null2String(workTimeStartMap.get("pre_workbengintime"));
if (pre_bengintime.length() > 0) {
pre_bengintime = pre_bengintime + ":00";
if (pre_bengintime.compareTo(signInTime4Out) > 0) {
//非工作日加班的话,签退数据都需要去搞一遍调休
if (pre_bengintime.length() > 0 && signInTime4Out.length() > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(pre_splitDate);
kqTaskBean.setLastWorkTime(signInTime4Out);
kqTaskBean.setTaskSignTime(pre_bengintime);
kqTaskBean.setSignDate(splitDate);
kqTaskBean.setSignEndDate(splitDate);
kqTaskBean.setTimesource("before");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
} else {
kqLog.info("overTime4NonWork:pre_bengintime is null :" + pre_bengintime + ":signInTime4Out is null:" + signInTime4Out);
}
if (pre_bengintime.length() > 0 && signTime.length() > 0) {
//TODO pre_bengintime signTime 需要比较一下大小
if (signTime.compareTo(pre_bengintime) > -1) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(splitDate);
kqTaskBean.setSignDate(splitDate);
kqTaskBean.setSignEndDate(splitDate);
//对于非工作时段,签到就是他的最后一次下班时间
kqTaskBean.setSignInTime4Out(pre_bengintime);
kqTaskBean.setTaskSignTime(signTime);
kqTaskBean.setTimesource("after");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
}
} else {
kqLog.info("overTime4NonWork:pre_bengintime is null :" + pre_bengintime + ":signTime is null:" + signTime);
}
} else {
//非工作日加班的话,签退数据都需要去搞一遍调休
if (signInTime4Out.length() > 0 && signTime.length() > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(splitDate);
kqTaskBean.setSignDate(splitDate);
kqTaskBean.setSignEndDate(splitDate);
//对于非工作时段,签到就是他的最后一次下班时间
kqTaskBean.setSignInTime4Out(signInTime4Out);
kqTaskBean.setTimesource("after");
kqTaskBean.setTaskSignTime(signTime);
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
} else {
kqLog.info("overTime4NonWork:signInTime4Out is null :" + signInTime4Out + ":signTime is null:" + signTime);
}
}
} else {
//非工作日加班的话,签退数据都需要去搞一遍调休
if (signInTime4Out.length() > 0 && signTime.length() > 0) {
KQTaskBean kqTaskBean = new KQTaskBean();
kqTaskBean.setResourceId(resourceid);
kqTaskBean.setTaskDate(splitDate);
kqTaskBean.setSignDate(splitDate);
kqTaskBean.setSignEndDate(splitDate);
//对于非工作时段,签到就是他的最后一次下班时间
kqTaskBean.setSignInTime4Out(signInTime4Out);
kqTaskBean.setTaskSignTime(signTime);
kqTaskBean.setTimesource("after");
if (!tasks.contains(kqTaskBean)) {
tasks.add(kqTaskBean);
}
} else {
kqLog.info("overTime4NonWork:signInTime4Out is null :" + signInTime4Out + ":signTime is null:" + signTime);
}
}
}
}