3586 lines
152 KiB
Plaintext
3586 lines
152 KiB
Plaintext
package com.engine.kq.biz;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean;
|
||
import com.engine.kq.entity.KQShiftRuleEntity;
|
||
import com.engine.kq.entity.TimeScopeEntity;
|
||
import com.engine.kq.entity.WorkTimeEntity;
|
||
import com.engine.kq.enums.FlowReportTypeEnum;
|
||
import com.engine.kq.jucailin.genid.IdGenerator;
|
||
import com.engine.kq.jucailin.util.KQDateUtil;
|
||
import com.engine.kq.log.KQLog;
|
||
import com.engine.kq.wfset.util.KQFlowCardUtil;
|
||
import com.google.common.collect.Lists;
|
||
import com.google.common.collect.Maps;
|
||
import com.googlecode.aviator.AviatorEvaluator;
|
||
import com.googlecode.aviator.Expression;
|
||
import java.io.PrintWriter;
|
||
import java.io.StringWriter;
|
||
import java.math.BigDecimal;
|
||
import java.math.RoundingMode;
|
||
import java.sql.Timestamp;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
import weaver.common.DateUtil;
|
||
import weaver.conn.BatchRecordSet;
|
||
import weaver.conn.RecordSet;
|
||
import weaver.conn.RecordSetTrans;
|
||
import weaver.formmode.setup.ModeRightInfo;
|
||
import weaver.general.BaseBean;
|
||
import weaver.general.InitServer;
|
||
import weaver.general.TimeUtil;
|
||
import weaver.general.Util;
|
||
import weaver.hrm.resource.ResourceComInfo;
|
||
|
||
import java.text.SimpleDateFormat;
|
||
import java.time.LocalDate;
|
||
import java.time.LocalDateTime;
|
||
import java.time.LocalTime;
|
||
import java.time.format.DateTimeFormatter;
|
||
import java.time.temporal.ChronoUnit;
|
||
import java.util.*;
|
||
import java.util.regex.Matcher;
|
||
import java.util.regex.Pattern;
|
||
|
||
/**
|
||
* 考勤数据格式化
|
||
*/
|
||
public class KQFormatData extends BaseBean {
|
||
private String today = DateUtil.getCurrentDate();
|
||
private KQLog kqLog = new KQLog();
|
||
private boolean writeLog = false;
|
||
private LinkedHashMap<String,Object> logInfo = new LinkedHashMap<>();
|
||
|
||
/***
|
||
* 该方法不允许直接调用
|
||
* @param userId
|
||
* @param kqDate
|
||
* @return
|
||
*/
|
||
public Map<String, Object> formatKqDate(String userId, String kqDate) {
|
||
List<List<Object>> lsParam = new ArrayList<>();
|
||
//非工作日处理
|
||
List<Object> nonlsParam = null;
|
||
Map<String, Object> resultMap = new HashMap<>();
|
||
BatchRecordSet bRs = new BatchRecordSet();
|
||
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
String sql = "";
|
||
try {
|
||
kqLog.info("formatKqDate in userId=" + userId + "kqDate==" + kqDate);
|
||
if (DateUtil.timeInterval(kqDate, today) < 0) {//今天之后的无需处理
|
||
kqLog.info("今天之后的无需处理的数据:resourceid=="+userId+"kqdate=="+kqDate+"today=="+today);
|
||
return resultMap;
|
||
}
|
||
String uuid = UUID.randomUUID().toString();
|
||
KQFormatFreeData kqFormatFreeData = new KQFormatFreeData();
|
||
KQWorkTime kqWorkTime = new KQWorkTime();
|
||
kqWorkTime.setIsFormat(true);
|
||
String kqDateNext = DateUtil.addDate(kqDate, 1);
|
||
|
||
KQFlowDataBiz kqFlowDataBiz = new KQFlowDataBiz.FlowDataParamBuilder().resourceidParam(userId).fromDateParam(kqDate).toDateParam(kqDateNext).build();
|
||
Map<String, Object> workFlowInfo = new HashMap<>();//userid|date--工作流程
|
||
kqFlowDataBiz.getAllFlowData(workFlowInfo,false);
|
||
WorkTimeEntity workTime = kqWorkTime.getWorkTime(userId, kqDate);
|
||
kqLog.info("userId:"+userId+":kqDate:"+kqDate+":formatKqDate workTime=" + JSONObject.toJSONString(workTime)+"::uuid::"+uuid);
|
||
kqLog.info("userId:"+userId+":kqDate:"+kqDate+":formatKqDate workFlowInfo=" + JSONObject.toJSONString(workFlowInfo)+"::uuid::"+uuid);
|
||
|
||
if(this.writeLog) {
|
||
logInfo.put("userId",userId);
|
||
logInfo.put("kqDate",kqDate);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(16253,weaver.general.ThreadVarLanguage.getLang())+"",workTime);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(126871,weaver.general.ThreadVarLanguage.getLang())+"",workFlowInfo);
|
||
}
|
||
|
||
new KQFormatBiz().delFormatData(userId, kqDate);
|
||
// deleteKqModeInfo(userId,kqDate,rs);
|
||
|
||
String excludecount = Util.null2String(kqGroupComInfo.getExcludecount(workTime.getGroupId()));//是否参与考勤报表统计
|
||
if (workTime.getIsExclude()) {//无需考勤人员没有异常状态
|
||
if(!excludecount.equals("1")){
|
||
kqLog.info("无需考勤人员没有异常状态 workTime.getIsExclude()="+workTime.getIsExclude()+"excludecount=="+excludecount);
|
||
return resultMap;
|
||
}
|
||
}
|
||
if( Util.null2String(workTime.getGroupId()).length()==0){
|
||
//没有考勤组不需格式化
|
||
return resultMap;
|
||
}
|
||
if (workTime == null || (workTime != null && workTime.getWorkMins() == 0 && workTime.getNonWorkShift() != 1)) {
|
||
kqLog.info("workTime == null || workTime.getWorkMins() == 0 插入空记录");
|
||
deleteKqModeInfo(userId,kqDate);
|
||
nonlsParam = new ArrayList<>();
|
||
formatNonWork(userId, kqDate,nonlsParam,workTime, workFlowInfo);
|
||
|
||
if(!nonlsParam.isEmpty()){
|
||
sql = " insert into kq_format_detail(resourceid,kqdate,groupid,serialnumber,signindate,signintime,signinid,signoutdate,signouttime,signoutid,leaveMins,leaveinfo,evectionMins,outMins,day_type,create_time,update_time,id)values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
|
||
rs.executeUpdate(sql, nonlsParam);
|
||
|
||
Long id = IdGenerator.generate();
|
||
String baseField = "";
|
||
if ("mysql".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = "sysdate(),sysdate(),"+id;
|
||
}else if ("oracle".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = "SYSDATE,SYSDATE,"+id;
|
||
}else if ("postgresql".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = "to_char(now(), 'yyyy-mm-dd hh24:mi:ss'),to_char(now(), 'yyyy-mm-dd hh24:mi:ss'),"+id;
|
||
}else{
|
||
baseField = "CONVERT(varchar(40), GETDATE(), 20),CONVERT(varchar(40), GETDATE(), 20),"+id;
|
||
}
|
||
sql = " insert into kq_format_total(resourceid,kqdate,subcompanyid,departmentid,jobtitle,groupid,serialid,workdays," +
|
||
" workmins,attendancedays,attendancemins,signdays,signmins,belate,belatemins,gravebelate,gravebelatemins,leaveeearly,leaveearlymins," +
|
||
" graveleaveearly,graveleaveearlymins,absenteeism,absenteeismmins,forgotcheck, forgotcheckMins,leaveMins,evectionMins,outMins,create_time,update_time,id)" +
|
||
" select a.resourceid,kqdate,b.subcompanyid1,b.departmentid,b.jobtitle,groupid,serialid," +
|
||
" case when sum(workmins)>0 then 1 end as workdays, sum(workmins) as workmins," +
|
||
" 0 as attendancedays, sum(attendanceMins) as attendanceMins," +
|
||
" 0 as signdays, sum(signmins) as signmins," +
|
||
" sum(case when belatemins> 0 then 1 else 0 end) as belate,sum(belatemins) as belatemins," +
|
||
" sum(case when graveBeLateMins> 0 then 1 else 0 end) as graveBeLate,sum(graveBeLateMins) as graveBeLateMins," +
|
||
" sum(case when leaveearlymins> 0 then 1 else 0 end) as leaveearly,sum(leaveearlymins) as leaveearlymins," +
|
||
" sum(case when graveLeaveEarlyMins> 0 then 1 else 0 end) as graveLeaveEarly,sum(graveLeaveEarlyMins) as graveLeaveEarlyMins," +
|
||
" sum(case when absenteeismmins> 0 then 1 else 0 end) as absenteeism,sum(absenteeismmins) as absenteeismmins," +
|
||
" sum(case when forgotcheckmins> 0 then 1 else 0 end) as forgotcheck,sum(forgotcheckmins) as forgotcheckmins, " +
|
||
" sum(leaveMins) as leaveMins, sum(evectionMins) as evectionMins, sum(outMins) as outMins," +baseField+
|
||
" from kq_format_detail a, hrmresource b" +
|
||
" where a.resourceid = b.id and resourceid =? and kqdate=?" +
|
||
" group by resourceid,kqdate,b.subcompanyid1,b.departmentid,b.jobtitle,groupid,serialid,workmins";
|
||
rs.executeUpdate(sql, userId, kqDate);
|
||
}
|
||
}else{
|
||
Map<String,Object> definedFieldInfo = new KQFormatBiz().getDefinedField();
|
||
String definedField = "";
|
||
String definedParam = "";
|
||
String definedParamSum = "";
|
||
String convertAttendDay = workTime != null ? Util.null2s(workTime.getConvertAttendDay(),"1.0") : "1.0";
|
||
String zlxxb = "0";
|
||
String rzlxZdy = findRqlx(userId,kqDate);
|
||
//日期类型,0是工作日、1是周六、2是周日
|
||
Integer rqlx = -1;
|
||
if("0".equals(rzlxZdy)){
|
||
rqlx = 0;
|
||
}else if("1".equals(rzlxZdy)){
|
||
rqlx = 1;
|
||
}else if("2".equals(rzlxZdy)){
|
||
rqlx = 2;
|
||
}else if(DateUtil.getWeek(kqDate) == 6){
|
||
rqlx = 1;
|
||
}else if(DateUtil.getWeek(kqDate) == 7){
|
||
rqlx = 2;
|
||
}else {
|
||
rqlx = 0;
|
||
}
|
||
|
||
if (workTime.getKQType().equals("3")) {//自由工时
|
||
lsParam.addAll(kqFormatFreeData.format(userId, kqDate, workFlowInfo));
|
||
} else {
|
||
definedField = Util.null2String(definedFieldInfo.get("definedField"));
|
||
definedParam = Util.null2String(definedFieldInfo.get("definedParam"));
|
||
definedParamSum = Util.null2String(definedFieldInfo.get("definedParamSum"));
|
||
lsParam.addAll(format(userId, kqDate, workTime, workFlowInfo,uuid));
|
||
}
|
||
|
||
if (lsParam.size() > 0) {
|
||
if (rs.getDBType().equals("postgresql")) {
|
||
// qc 添加了cardOvertime字段
|
||
sql = " insert into kq_format_detail( " +
|
||
" resourceid,kqdate,groupid,serialid,serialnumber,workbegindate,workbegintime,workenddate,workendtime,workmins," +
|
||
" signindate,signintime,signinid,signoutdate,signouttime,signoutid,signMins," +
|
||
" attendanceMins,belatemins,graveBeLateMins,leaveearlymins,graveLeaveEarlyMins,absenteeismmins,forgotcheckMins," +
|
||
" leaveMins,leaveinfo,evectionMins,outMins,forgotbeginworkcheckmins,cardOvertime,otherinfo"+(definedField.length()>0?","+definedField+"":"")+",day_type,create_time,update_time,id) " +
|
||
" values(?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?"+(definedField.length()>0?","+definedParam+"":"")+",?,?::timestamp,?::timestamp,?)";
|
||
|
||
}else{
|
||
sql = " insert into kq_format_detail( " +
|
||
" resourceid,kqdate,groupid,serialid,serialnumber,workbegindate,workbegintime,workenddate,workendtime,workmins," +
|
||
" signindate,signintime,signinid,signoutdate,signouttime,signoutid,signMins," +
|
||
" attendanceMins,belatemins,graveBeLateMins,leaveearlymins,graveLeaveEarlyMins,absenteeismmins,forgotcheckMins," +
|
||
" leaveMins,leaveinfo,evectionMins,outMins,forgotbeginworkcheckmins,cardOvertime,otherinfo"+(definedField.length()>0?","+definedField+"":"")+",day_type,create_time,update_time,id) " +
|
||
" values(?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?"+(definedField.length()>0?","+definedParam+"":"")+",?,?,?,?)";
|
||
}
|
||
for (int i = 0; i < lsParam.size(); i++) {
|
||
List<Object> param = lsParam.get(i);
|
||
boolean isok = rs.executeUpdate(sql, param);
|
||
kqLog.info("插入记录:userId:"+userId+":kqDate:"+kqDate+":param:"+JSON.toJSONString(param)+":isok:"+isok+"::uuid::"+uuid);
|
||
}
|
||
String attendancedaysF = " (cast(sum(attendanceMins)AS decimal(10, 2))*"+Util.getDoubleValue(convertAttendDay)+")/sum(workmins) as attendancedays, sum(attendanceMins) as attendanceMins, ";
|
||
String workF = " case when sum(workmins)>0 then "+convertAttendDay+" end as workdays, sum(workmins) as workmins,";
|
||
String belateminsF = " sum(case when belatemins> 0 then 1 else 0 end) as belate,sum(belatemins) as belatemins,";
|
||
String graveBeLateMinsF = " sum(case when graveBeLateMins> 0 then 1 else 0 end) as graveBeLate,sum(graveBeLateMins) as graveBeLateMins,";
|
||
String leaveearlyminsF = " sum(case when leaveearlymins> 0 then 1 else 0 end) as leaveearly,sum(leaveearlymins) as leaveearlymins,";
|
||
String graveLeaveEarlyMinsF = " sum(case when graveLeaveEarlyMins> 0 then 1 else 0 end) as graveLeaveEarly,sum(graveLeaveEarlyMins) as graveLeaveEarlyMins, ";
|
||
String absenteeismminsF = " sum(case when absenteeismmins> 0 then 1 else 0 end) as absenteeism,sum(absenteeismmins) as absenteeismmins,";
|
||
String forgotcheckminsF = " sum(case when forgotcheckmins> 0 then 1 else 0 end) as forgotcheck,sum(forgotcheckmins) as forgotcheckmins,";
|
||
String forgotbeginworkcheckminsF = " sum(case when forgotbeginworkcheckmins> 0 then 1 else 0 end) as forgotbeginworkcheck,sum(forgotbeginworkcheckmins) as forgotbeginworkcheckmins ";
|
||
String signF = " cast(sum(signmins)AS decimal(10, 2))/sum(workmins) as signdays, sum(signmins) as signmins,";
|
||
if(1 == workTime.getNonWorkShift()){
|
||
attendancedaysF = " 0 as attendancedays, 0 as attendanceMins, ";
|
||
String serialidG = Util.null2String(workTime.getSerialId());
|
||
//公休班二开逻辑
|
||
if(checkGxb(serialidG)){
|
||
//是公休班
|
||
workF = " 1 as workdays, 480 as workmins,";
|
||
}else{
|
||
workF = " 0 as workdays, 0 as workmins,";
|
||
}
|
||
belateminsF = " 0 as belate,0 as belatemins,";
|
||
graveBeLateMinsF = " 0 as graveBeLate,0 as graveBeLateMins,";
|
||
leaveearlyminsF = " 0 as leaveearly,0 as leaveearlymins,";
|
||
graveLeaveEarlyMinsF = " 0 as graveLeaveEarly,0 as graveLeaveEarlyMins, ";
|
||
absenteeismminsF = " 0 as absenteeism,0 as absenteeismmins,";
|
||
forgotcheckminsF = " 0 as forgotcheck,0 as forgotcheckmins,";
|
||
forgotbeginworkcheckminsF = " 0 as forgotbeginworkcheck,0 as forgotbeginworkcheckmins ";
|
||
signF = " 0 as signdays, 0 as signmins,";
|
||
|
||
//考勤组大小周A
|
||
String dxzA = bb.getPropValue("jgKq_main","dxzA");
|
||
//考勤组大小周B
|
||
String dxzB = bb.getPropValue("jgKq_main","dxzB");
|
||
//休息班统计
|
||
String groupIdXxb = workTime.getGroupId();
|
||
if(rqlx == 1){
|
||
//周六
|
||
if(dxzA.equals(groupIdXxb) || dxzB.equals(groupIdXxb)){
|
||
zlxxb = "1";
|
||
}
|
||
}
|
||
|
||
bb.writeLog("userIdxxb:"+userId+"kqDate:"+kqDate+"groupIdXxb:"+groupIdXxb+"dxzA:"+dxzA+"dxzB:"+dxzB+"zlxxb:"+zlxxb);
|
||
|
||
}
|
||
|
||
Long id = IdGenerator.generate();
|
||
String baseField = "";
|
||
if ("mysql".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = " now(),now(),"+id;
|
||
}else if ("oracle".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = " sysdate,sysdate,"+id;
|
||
}else if ("postgresql".equalsIgnoreCase(rs.getDBType())){
|
||
baseField = " now(),now(),"+id;
|
||
}else{
|
||
baseField = " getdate(),getdate(),"+id;
|
||
}
|
||
|
||
sql = " insert into kq_format_total(resourceid,kqdate,subcompanyid,departmentid,jobtitle,groupid,serialid,workdays,workmins," +
|
||
" attendancedays,attendancemins,signdays,signmins,belate,belatemins,gravebelate,gravebelatemins,leaveeearly,leaveearlymins,graveleaveearly," +
|
||
" graveleaveearlymins,absenteeism,absenteeismmins,forgotcheck,forgotcheckmins," +
|
||
" leaveMins,cardOvertime,evectionMins,outMins,forgotbeginworkcheck,forgotbeginworkcheckmins"+(definedField.length()>0?","+definedField+"":"")+",create_time,update_time,id) " +
|
||
" select a.resourceid,kqdate,b.subcompanyid1,b.departmentid,b.jobtitle,groupid,serialid," +
|
||
workF +
|
||
attendancedaysF +
|
||
signF +
|
||
belateminsF +
|
||
graveBeLateMinsF +
|
||
leaveearlyminsF +
|
||
graveLeaveEarlyMinsF +
|
||
absenteeismminsF +
|
||
forgotcheckminsF+
|
||
" sum(leaveMins) as leaveMins," +
|
||
// qc 添加刷卡加班
|
||
" sum(cardOvertime) as cardOvertime," +
|
||
" sum(evectionMins) as evectionMins,sum(outMins) as outMins, " +
|
||
forgotbeginworkcheckminsF +
|
||
(definedField.length()>0?","+definedParamSum+"":"")+","+baseField+
|
||
" from kq_format_detail a, hrmresource b" +
|
||
" where a.resourceid = b.id and resourceid = ? and kqdate=?" +
|
||
" group by resourceid,kqdate,b.subcompanyid1,b.departmentid,b.jobtitle,groupid,serialid";
|
||
rs.executeUpdate(sql, userId, kqDate);
|
||
|
||
ResourceComInfo resourceComInfo = new ResourceComInfo();
|
||
String fbid = resourceComInfo.getSubCompanyID(userId);
|
||
//无需比大小分部id
|
||
String unDept = bb.getPropValue("jgKq_main","unDept");
|
||
boolean ifneedBj = true;
|
||
if (Arrays.asList(unDept.split(",")).contains(fbid)){
|
||
ifneedBj = false;
|
||
}
|
||
Boolean checkUnShow = checkSubcompany(userId);
|
||
//节假日天数-二开
|
||
String jjrts = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, kqDate);
|
||
KQHolidaySetComInfo holidaySetComInfo = new KQHolidaySetComInfo();
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
/*获取考勤组的ID,因为考勤组有有效期,所以需要传入日期*/
|
||
String groupId = kqGroupMemberComInfo.getKQGroupId(userId, kqDate);
|
||
String changeTypeNew = holidaySetComInfo.getChangeType(groupId, kqDate);
|
||
if("1".equals(changeTypeNew)){
|
||
jjrts = "1";
|
||
//节假日为3
|
||
rqlx = 3;
|
||
}
|
||
|
||
Integer checkM = checkKqModeInfo(userId,kqDate,rs);
|
||
bb.writeLog("checkM"+checkM);
|
||
bb.writeLog("usr:"+userId+"kqd:"+kqDate+"unDept:"+unDept+"ifneedBj:"+ifneedBj+"rqlx:"+rqlx+"changeTypeNew:"+changeTypeNew+"checkUnShow:"+checkUnShow);
|
||
|
||
|
||
//实际出勤天数0.54和0.46转成0.5,处理和请假天数不一致的问题
|
||
String sjmins = geSjcqsc(userId,kqDate,rs);
|
||
if(StringUtils.isNotBlank(sjmins)){
|
||
Integer sjminsI = Integer.valueOf(sjmins);
|
||
if(220<= sjminsI && sjminsI <= 275){
|
||
updateSjcq(userId,kqDate);
|
||
}
|
||
}
|
||
|
||
//补卡次数计算-二开
|
||
Integer bkcs = bkcsCreate(userId,kqDate,rs);
|
||
//正常工作天数计算-二开
|
||
String zcgzDay = "0";
|
||
if(rqlx == 0){
|
||
zcgzDay = geSjcqts(userId,kqDate,rs);
|
||
}
|
||
//有薪假天数计算-二开
|
||
String yxjts = getZcgzTs(userId,kqDate,bb,rs);
|
||
|
||
if(rqlx == 0){
|
||
zcgzDay = add(zcgzDay,yxjts);
|
||
if(Double.valueOf(zcgzDay)>1){
|
||
zcgzDay = "1";
|
||
}
|
||
}
|
||
|
||
|
||
//夜班天数-二开
|
||
String serialid = Util.null2String(workTime.getSerialId());
|
||
String ybts = "0";
|
||
if(checkYb(serialid)){
|
||
//是夜班
|
||
if(checkDk(userId,kqDate)){
|
||
//当天有打卡
|
||
ybts = "1";
|
||
}
|
||
}
|
||
//周六白天打卡时长-二开
|
||
String signWeekZl = "0";
|
||
String bxsWeekZl ="0";
|
||
|
||
//周六晚上加班(夜班)-二开
|
||
String signWeekZlws = "0";
|
||
if(rqlx == 1){
|
||
if(checkYb(serialid)){
|
||
String zlMins = geSignMinsWeekY(userId,kqDate,rs);
|
||
bb.writeLog("zlMins"+zlMins+"usr"+userId+"date"+kqDate);
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
bb.writeLog("zlMinsNew"+zlMinsNew);
|
||
if(zlMinsNew >480){
|
||
zlMinsNew = 480.0;
|
||
Double signWeekZlwsNew = Double.parseDouble(sub(zlMins,"480"));
|
||
if(signWeekZlwsNew>210){
|
||
signWeekZlwsNew = 210.0;
|
||
}
|
||
bb.writeLog("signWeekZlwsNew"+signWeekZlwsNew);
|
||
signWeekZlws = divide(String.valueOf(changeBxs(signWeekZlwsNew.intValue())),"60");
|
||
bb.writeLog("signWeekZlws"+signWeekZlws);
|
||
}
|
||
if(zlMinsNew>=465){
|
||
zlMinsNew = 480.0;
|
||
}
|
||
bxsWeekZl = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
signWeekZl = divide(bxsWeekZl,"60");
|
||
}
|
||
}else{
|
||
String zlMins = "";
|
||
if(checkUnShow){
|
||
zlMins = geSignMinsWeek(userId,kqDate,rs);
|
||
}else{
|
||
zlMins = geSignMinsWeekY(userId,kqDate,rs);
|
||
}
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
if(checkUnShow){
|
||
if(zlMinsNew >= 210.0 && zlMinsNew <= 300.0){
|
||
zlMinsNew = 240.0;
|
||
}
|
||
}
|
||
if(zlMinsNew>=465){
|
||
zlMinsNew = 480.0;
|
||
}
|
||
|
||
bxsWeekZl = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
signWeekZl = divide(bxsWeekZl,"60");
|
||
}
|
||
}
|
||
}
|
||
//周末加班转调休
|
||
String overWeekZrZtx = "0";
|
||
|
||
//假期类型的缓存类
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
//[调休]的假期类型的ID
|
||
String leaveRulesId = "";
|
||
//找到[调休]的假期类型ID
|
||
rulesComInfo.setTofirstRow();
|
||
while (rulesComInfo.next()) {
|
||
if (KQLeaveRulesBiz.isTiaoXiu(rulesComInfo.getId())) {
|
||
if("1".equals(rulesComInfo.getIsEnable())){
|
||
leaveRulesId = rulesComInfo.getId();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//周六白天加班时长-二开
|
||
String overWeekZl = "0";
|
||
if(rqlx == 1){
|
||
Map<String,String> zrInfo = updateJbscXxr(userId,kqDate,signWeekZl,ifneedBj,rqlx,rs);
|
||
String zrjb = Util.null2String(zrInfo.get("zrjb"));
|
||
String zrjbztx = Util.null2String(zrInfo.get("zrjbzts"));
|
||
bb.writeLog(userId+"zrjbztx"+zrjbztx);
|
||
String tiaoxFind = getTxTime(kqDate,userId,leaveRulesId,rs);
|
||
// String tiaoxFind = findTiaoXiuAmount(leaveRulesId,userId,kqDate);
|
||
if(StringUtils.isBlank(zrjb)){
|
||
zrjb = "0";
|
||
}
|
||
|
||
String zrjbOri = zrjb;
|
||
if(StringUtils.isBlank(zrjbztx)){
|
||
zrjbztx = "0";
|
||
}
|
||
|
||
if("0".equals(zrjb)){
|
||
zrjb = geSjcqsc(userId,kqDate,rs);
|
||
//有薪假时长
|
||
String scYxj = getQjts(userId,kqDate,rs);
|
||
//有薪假退假时长
|
||
String scYxjTj = getTjts(userId,kqDate,rs);
|
||
if(StringUtils.isBlank(scYxj)){
|
||
scYxj = "0";
|
||
}
|
||
if(StringUtils.isBlank(scYxjTj)){
|
||
scYxjTj = "0";
|
||
}
|
||
String endDay = divide(sub(scYxj,scYxjTj),"60");
|
||
zrjb = add(divide(zrjb,"60"),endDay);
|
||
}
|
||
if(StringUtils.isBlank(tiaoxFind)){
|
||
tiaoxFind = "0";
|
||
}else{
|
||
tiaoxFind = divide(tiaoxFind,"60");
|
||
}
|
||
|
||
if(checkUnShow){
|
||
if(Double.parseDouble(zrjb) >8) {
|
||
zrjb = "8";
|
||
}
|
||
}
|
||
|
||
if(Double.parseDouble(zrjb) <3) {
|
||
zrjb = "0";
|
||
}
|
||
if(Double.parseDouble(zrjbOri) <3) {
|
||
zrjbOri = "0";
|
||
}
|
||
|
||
//考勤组大小周A
|
||
String dxzA = bb.getPropValue("jgKq_main","dxzA");
|
||
//考勤组大小周B
|
||
String dxzB = bb.getPropValue("jgKq_main","dxzB");
|
||
String rykqz = getCusFieldData(Integer.valueOf(userId),"field31",3);
|
||
if("4".equals(rykqz) || dxzA.equals(rykqz) || dxzB.equals(rykqz)){
|
||
overWeekZl = zrjb;
|
||
}else{
|
||
overWeekZl = zrjbOri;
|
||
}
|
||
overWeekZrZtx = zrjbztx;
|
||
}
|
||
|
||
bb.writeLog("usr:"+userId+"kqd:"+kqDate+"overWeekZl:"+overWeekZl+"overWeekZrZtx"+overWeekZrZtx);
|
||
|
||
//周日白天打卡时长-二开
|
||
String signWeekZr = "0";
|
||
String bxsWeekZr ="0";
|
||
if(rqlx == 2){
|
||
if(checkYb(serialid)){
|
||
String zlMins = geSignMinsWeekY(userId,kqDate,rs);
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
if(zlMinsNew >480){
|
||
zlMinsNew = 480.0;
|
||
Double signWeekZlwsNew = Double.parseDouble(sub(zlMins,"480"));
|
||
if(signWeekZlwsNew>210){
|
||
signWeekZlwsNew = 210.0;
|
||
}
|
||
signWeekZlws = divide(String.valueOf(changeBxs(signWeekZlwsNew.intValue())),"60");
|
||
}
|
||
if(zlMinsNew>=465){
|
||
zlMinsNew = 480.0;
|
||
}
|
||
bxsWeekZr = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
signWeekZr = divide(bxsWeekZr,"60");
|
||
}
|
||
}else{
|
||
// String zlMins = "";
|
||
// if("27".equals(serialid)){
|
||
// zlMins = geSignMinsWeekNew(userId,kqDate);
|
||
// }else{
|
||
// zlMins = geSignMinsWeek(userId,kqDate);
|
||
// }
|
||
|
||
String zlMins = "";
|
||
if(checkUnShow){
|
||
if("27".equals(serialid)){
|
||
zlMins = geSignMinsWeekNew(userId,kqDate,rs);
|
||
}else{
|
||
zlMins = geSignMinsWeek(userId,kqDate,rs);
|
||
}
|
||
}else{
|
||
zlMins = geSignMinsWeekY(userId,kqDate,rs);
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
if(checkUnShow){
|
||
if(zlMinsNew >= 210.0 && zlMinsNew <= 300.0){
|
||
zlMinsNew = 240.0;
|
||
}
|
||
}
|
||
if(zlMinsNew>=465){
|
||
zlMinsNew = 480.0;
|
||
}
|
||
bxsWeekZr = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
signWeekZr = divide(bxsWeekZr,"60");
|
||
}
|
||
}
|
||
|
||
}
|
||
//周日白天加班时长-二开
|
||
String overWeekZr = "0";
|
||
if(rqlx == 2){
|
||
Map<String,String> zrInfo = updateJbscXxrZr(userId,kqDate,signWeekZr,ifneedBj,rqlx,rs);
|
||
String zrjb = Util.null2String(zrInfo.get("zrjb"));
|
||
String zrjbztx = Util.null2String(zrInfo.get("zrjbzts"));
|
||
if(StringUtils.isBlank(zrjb)){
|
||
zrjb = "0";
|
||
}
|
||
|
||
if(StringUtils.isBlank(zrjbztx)){
|
||
zrjbztx = "0";
|
||
}
|
||
|
||
// if("0".equals(zrjb)){
|
||
// zrjb = geSjcqsc(userId,kqDate,rs);
|
||
//
|
||
// zrjb = divide(zrjb,"60");
|
||
// }
|
||
String tiaoxFind = getTxTime(kqDate,userId,leaveRulesId,rs);
|
||
if(StringUtils.isBlank(tiaoxFind)){
|
||
tiaoxFind = "0";
|
||
}else{
|
||
tiaoxFind = divide(tiaoxFind,"60");
|
||
}
|
||
|
||
overWeekZr = add(zrjb,tiaoxFind);
|
||
|
||
// overWeekZr = zrjb;
|
||
overWeekZrZtx = zrjbztx;
|
||
}
|
||
|
||
Double overWeekZrZtxNew = Double.parseDouble(overWeekZrZtx);
|
||
bb.writeLog(userId+"overWeekZrZtxNew"+overWeekZrZtxNew);
|
||
if(overWeekZrZtxNew>6.9 && checkUnShow){
|
||
bb.writeLog(userId+"转调休时长置为8");
|
||
overWeekZrZtx = "8";
|
||
}
|
||
|
||
//节假日白天打卡时长-二开
|
||
String signWeekJjr = "0";
|
||
String bxsWeekJjr ="0";
|
||
if(rqlx == 3){
|
||
String zlMins = geSignMinsWeek(userId,kqDate,rs);
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
if(checkUnShow){
|
||
if(zlMinsNew >= 210.0 && zlMinsNew <= 300.0){
|
||
zlMinsNew = 240.0;
|
||
}
|
||
}
|
||
|
||
if(zlMinsNew>=465){
|
||
zlMinsNew = 480.0;
|
||
}
|
||
bxsWeekJjr = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
signWeekJjr = divide(bxsWeekJjr,"60");
|
||
}
|
||
}
|
||
//节假日白天加班时长-二开
|
||
String overWeekJjr = "0";
|
||
if(rqlx == 3){
|
||
Map<String,String> zrInfo = updateJbscJjr(userId,kqDate,signWeekJjr,ifneedBj,rqlx,rs);
|
||
String zrjb = Util.null2String(zrInfo.get("zrjb"));
|
||
String zrjbztx = Util.null2String(zrInfo.get("zrjbzts"));
|
||
if(StringUtils.isBlank(zrjb)){
|
||
zrjb = "0";
|
||
}
|
||
|
||
if(StringUtils.isBlank(zrjbztx)){
|
||
zrjbztx = "0";
|
||
}
|
||
|
||
if("0".equals(zrjb)){
|
||
zrjb = geSjcqsc(userId,kqDate,rs);
|
||
|
||
zrjb = divide(zrjb,"60");
|
||
}
|
||
String tiaoxFind = getTxTime(kqDate,userId,leaveRulesId,rs);
|
||
if(StringUtils.isBlank(tiaoxFind)){
|
||
tiaoxFind = "0";
|
||
}else{
|
||
tiaoxFind = divide(tiaoxFind,"60");
|
||
}
|
||
|
||
overWeekJjr = add(zrjb,tiaoxFind);
|
||
// overWeekZrZtx = zrjbztx;
|
||
}
|
||
|
||
//直落小时-二开
|
||
String zlxs = "0";
|
||
zlxs = findZlxs(userId,kqDate);
|
||
if (StringUtils.isBlank(zlxs)){
|
||
zlxs = "0";
|
||
}
|
||
bb.writeLog("signWeekZlwse"+signWeekZlws);
|
||
if(checkYb(serialid)){
|
||
//夜班时刷卡加班逻辑调整
|
||
if(rqlx == 1 || rqlx == 2){
|
||
updateCardOver(userId,kqDate,multiply(signWeekZlws,"60"));
|
||
}else{
|
||
String zlMins = geSignMinsWeekY(userId,kqDate,rs);
|
||
if(StringUtils.isNotBlank(zlMins)){
|
||
Double zlMinsNew = Double.parseDouble(zlMins);
|
||
if(zlMinsNew >480){
|
||
Double signWeekZlwsNew = Double.parseDouble(sub(zlMins,"480"));
|
||
if(signWeekZlwsNew>210){
|
||
signWeekZlwsNew = 210.0;
|
||
}
|
||
String skjbsc = String.valueOf(changeBxs(signWeekZlwsNew.intValue()));
|
||
updateCardOver(userId,kqDate,skjbsc);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
String overTimeYw = "0";
|
||
//加班申请比较逻辑-二开
|
||
overTimeYw = updateJbscN(userId,kqDate,ifneedBj,rqlx,rs);
|
||
bb.writeLog("usr:"+userId+"kqd:"+kqDate+"overTimeYw:"+overTimeYw);
|
||
//周六晚上加班时长-二开
|
||
String overWeekZlWs = "0";
|
||
if(rqlx == 1){
|
||
overWeekZlWs = add(overTimeYw,zlxs);
|
||
}
|
||
//周日晚上加班时长-二开
|
||
String overWeekZrWs = "0";
|
||
if(rqlx == 2){
|
||
overWeekZrWs = add(overTimeYw,zlxs);
|
||
}
|
||
|
||
//餐补计算-二开
|
||
String mealValue = mealCount(userId,kqDate,rs);
|
||
|
||
bb.writeLog("zlxs:"+zlxs);
|
||
//平时加班时长
|
||
String psjbsc = findPsjbMins(userId,kqDate);
|
||
if(rqlx == 1 || rqlx == 2){
|
||
psjbsc = "0";
|
||
}else{
|
||
if(StringUtils.isNotBlank(psjbsc)){
|
||
psjbsc = add(divide(psjbsc,"60"),zlxs);
|
||
}else{
|
||
psjbsc = zlxs;
|
||
}
|
||
}
|
||
|
||
|
||
//工作时长-二开
|
||
String gzsc = geGzsc(userId,kqDate);
|
||
String bxsGzsc ="0";
|
||
if(StringUtils.isNotBlank(gzsc)){
|
||
Double gzscNew = Double.parseDouble(gzsc);
|
||
bxsGzsc = String.valueOf(changeBxs(gzscNew.intValue()));
|
||
gzsc = bxsGzsc;
|
||
}else{
|
||
gzsc = "0";
|
||
}
|
||
|
||
//总加班时长
|
||
String zjbsc = add(overWeekZlWs,psjbsc);
|
||
|
||
//需出勤天数
|
||
String xcqts = "0";
|
||
//考勤组大小周A
|
||
String dxzA = bb.getPropValue("jgKq_main","dxzA");
|
||
//考勤组大小周B
|
||
String dxzB = bb.getPropValue("jgKq_main","dxzB");
|
||
String rykqz = getCusFieldData(Integer.valueOf(userId),"field31",3);
|
||
if("4".equals(rykqz)){
|
||
//单休判断是不是周日,是的话不计
|
||
if(rqlx == 2){
|
||
xcqts = "0";
|
||
}else{
|
||
xcqts = "1";
|
||
}
|
||
}else if ("8".equals(rykqz)){
|
||
//双休判断是不是周六周日,是的话不计
|
||
if(rqlx == 1 || rqlx == 2){
|
||
xcqts = "0";
|
||
}else{
|
||
xcqts = "1";
|
||
}
|
||
}else if(dxzA.equals(rykqz) || dxzB.equals(rykqz)){
|
||
//双休判断是不是周六周日,是的话不计
|
||
if(rqlx == 2){
|
||
xcqts = "0";
|
||
}else if (rqlx == 1){
|
||
//周六是工作日的话计
|
||
if("2".equals(changeTypeNew)){
|
||
xcqts = "1";
|
||
}else{
|
||
xcqts = "0";
|
||
}
|
||
}else{
|
||
xcqts = "1";
|
||
}
|
||
}
|
||
//公休班天数
|
||
String gxbts = "0";
|
||
if(checkGxb(serialid)){
|
||
gxbts = "1";
|
||
}
|
||
|
||
if(Double.parseDouble(overWeekJjr)>0){
|
||
jjrts = "0";
|
||
}
|
||
|
||
|
||
|
||
bb.writeLog("userId:"+userId+"kqDate:"+kqDate+"bksc:"+bkcs+"zcgzts:"+zcgzDay+"jjrts:"+jjrts+
|
||
"changeType:"+changeType+"ybts:"+ybts+"zcgzDay:"+zcgzDay+"yxjts:"+yxjts+"zcgzDay:"+zcgzDay+
|
||
"signWeekZl:"+signWeekZl+"overWeekZl:"+overWeekZl+"bxsWeekZl:"+bxsWeekZl+"signWeekZr:"+signWeekZr+
|
||
"overWeekZr:"+overWeekZr+"overWeekZlWs:"+overWeekZlWs+"overWeekZrWs:"+overWeekZrWs+"mealValue:"+mealValue+"psjbsc:"+psjbsc+
|
||
"gzsc:"+gzsc+"overWeekZrZtx:"+overWeekZrZtx+"zlxxb:"+zlxxb+"signWeekJjr:"+signWeekJjr+"overWeekJjr:"+overWeekJjr+"zjbsc:"+zjbsc+"xcqts:"+xcqts+"gxbts:"+gxbts);
|
||
|
||
|
||
if(checkM>0){
|
||
bb.writeLog("已存在更新");
|
||
//更新台账数据
|
||
updateKqModeInfo(bb,rs,userId,kqDate,bkcs,zcgzDay,yxjts,jjrts,ybts,signWeekZl,overWeekZl,signWeekZr,overWeekZr,overWeekZlWs,overWeekZrWs,mealValue,psjbsc,gzsc,overWeekZrZtx,zlxxb,signWeekJjr,overWeekJjr,zjbsc,xcqts,gxbts);
|
||
}else{
|
||
//格式化数据台账生成-二开
|
||
createKqModeInfo(rs,userId,kqDate,bkcs,zcgzDay,yxjts,jjrts,ybts,signWeekZl,overWeekZl,signWeekZr,overWeekZr,overWeekZlWs,overWeekZrWs,mealValue,psjbsc,gzsc,overWeekZrZtx,zlxxb,signWeekJjr,overWeekJjr,zjbsc,xcqts,gxbts);
|
||
}
|
||
|
||
//正常工作天数计算-二开
|
||
String sjcqtsn = "0";
|
||
sjcqtsn = geSjcqts(userId,kqDate,rs);
|
||
sjcqtsn = add(sjcqtsn,yxjts);
|
||
if(Double.valueOf(sjcqtsn)>1){
|
||
sjcqtsn = "1";
|
||
}
|
||
|
||
if(Double.valueOf(sjcqtsn)<0.3){
|
||
sjcqtsn = "0";
|
||
}
|
||
updateSjcqYxj(userId,kqDate,sjcqtsn,rs);
|
||
String sjcqxxb = "0";
|
||
if(workTime.getNonWorkShift() == 1){
|
||
//是休息班,判断双休和大小周人员是否有白天加班
|
||
bb.writeLog(userId+"kqdate"+kqDate+"是休息班,考勤组:"+rykqz+"当天白天加班overWeekZl:"+overWeekZl+"overWeekZr:"+overWeekZr);
|
||
if("8".equals(rykqz)||dxzA.equals(rykqz) || dxzB.equals(rykqz)){
|
||
if((Double.valueOf(overWeekZl)>=4 && Double.valueOf(overWeekZl)<8)){
|
||
sjcqxxb = "0.5";
|
||
}else if(Double.valueOf(overWeekZl)>=8){
|
||
sjcqxxb = "1";
|
||
}
|
||
}
|
||
//更新实际出勤
|
||
updateSjcqYxj(userId,kqDate,sjcqxxb,rs);
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
}catch (Exception e) {
|
||
kqLog.info("考勤重算报错:KQFormatData.Exception:");
|
||
new BaseBean().writeLog("考勤重算报错:KQFormatData.Exception:");
|
||
StringWriter errorsWriter = new StringWriter();
|
||
e.printStackTrace(new PrintWriter(errorsWriter));
|
||
kqLog.info(errorsWriter.toString());
|
||
new BaseBean().writeLog(errorsWriter.toString());
|
||
}
|
||
return resultMap;
|
||
}
|
||
|
||
public List<List<Object>> format(String userId, String kqDate, WorkTimeEntity workTime,
|
||
Map<String, Object> workFlowInfo, String uuid) {
|
||
List<List<Object>> lsParam = new ArrayList<>();
|
||
List<Object> params = null;
|
||
HashMap<String, Integer> middleMap = new HashMap<>();
|
||
try {
|
||
Timestamp date = new Timestamp(System.currentTimeMillis());
|
||
KQSettingsComInfo kqSettingsComInfo = new KQSettingsComInfo();
|
||
String nosign_is_absent = Util.null2String(kqSettingsComInfo.getMain_val("nosign_is_absent"),"1");
|
||
//默认不开启半天的特殊规则,如果开启,那么只要是半天的单位,并且申请考勤流程半天,那么实际出勤就是0.5天,不考虑迟到和早退。当天旷工的情况需要考虑,即如果另外半天是旷工,那么实际出勤自然也是0
|
||
String is_half = Util.null2String(kqSettingsComInfo.getMain_val("is_half"),"0");
|
||
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
|
||
KQFormatShiftRule kqFormatShiftRule = new KQFormatShiftRule();
|
||
String preDate = DateUtil.addDate(kqDate, -1);//上一天日期
|
||
String nextDate = DateUtil.addDate(kqDate, 1);//下一天日期
|
||
String dateKey = userId + "|" + kqDate;
|
||
String nextDateKey = userId + "|" + nextDate;
|
||
ArrayList<String> hostIps = InitServer.getRealIp();
|
||
boolean oneSign = false;
|
||
List<TimeScopeEntity> lsSignTime = new ArrayList<>();
|
||
List<TimeScopeEntity> lsWorkTime = new ArrayList<>();
|
||
List<TimeScopeEntity> lsRestTime = new ArrayList<>();
|
||
List<Object> workFlow = null;
|
||
int restShift = 0;
|
||
if (workTime != null) {
|
||
lsSignTime = workTime.getSignTime();//允许打卡时间
|
||
lsWorkTime = workTime.getWorkTime();//工作时间
|
||
lsRestTime = workTime.getRestTime();//休息时段时间
|
||
oneSign = lsWorkTime!=null&&lsWorkTime.size()==1;
|
||
restShift = workTime.getNonWorkShift();
|
||
}
|
||
kqLog.info("format in >>>>>userId" + userId + "kqDate==" + kqDate+":restShift:"+restShift+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
//特殊班次补打卡数据
|
||
insertDk(userId,kqDate);
|
||
//打卡记录表清空当天的数据
|
||
// deleteSignInfoMo(userId,kqDate);
|
||
|
||
int[] dayMins = new int[2880];//一天所有分钟数
|
||
Arrays.fill(dayMins, -1);
|
||
|
||
//处理半天班次冲销问题
|
||
int[] dayMinsNew = new int[2880];//一天所有分钟数
|
||
Arrays.fill(dayMinsNew, -1);
|
||
int workMins4leave = 0;
|
||
int middleMins = 0;//班次的半天时长
|
||
int middleMins_final = 0;//班次的半天时长
|
||
int shiftNums = lsWorkTime == null ? 0 : lsWorkTime.size();
|
||
|
||
// 一天4次打卡单独做判断,如果是上午下班打卡和下午上班打卡时间重叠,那么上午的下班卡取最早的,下午的上班卡取最晚的。用shiftCount是否等于-1判断,-1就走标准不重叠。2就表示重叠走新的逻辑
|
||
int shiftCount = lsWorkTime == null ? 0 : lsWorkTime.size();
|
||
int shiftI = 0;
|
||
String signEndDateTimeZero = "";
|
||
for (int i = 0; lsWorkTime != null && i < lsWorkTime.size(); i++) {
|
||
shiftI = i;
|
||
TimeScopeEntity signTimeScope = lsSignTime.get(i);
|
||
TimeScopeEntity workTimeScope = lsWorkTime.get(i);
|
||
String signBeginDateTime = signTimeScope.getBeginTimeAcross() ? nextDate : kqDate;
|
||
if(signTimeScope.isBeginTimePreAcross()){
|
||
signBeginDateTime = preDate;
|
||
}
|
||
signBeginDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(signTimeScope.getBeginTime())+":00";
|
||
String signEndDateTime = signTimeScope.getEndTimeAcross() ? nextDate : kqDate;
|
||
signEndDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(signTimeScope.getEndTime())+":59";
|
||
if (shiftCount == 2 && shiftI == 0) {
|
||
signEndDateTimeZero = signEndDateTime;
|
||
}
|
||
if (shiftCount == 2 && shiftI == 1) {
|
||
shiftCount = signBeginDateTime.compareTo(signEndDateTimeZero) <= 0 ? shiftCount : -1;
|
||
}
|
||
|
||
String workBeginTime = Util.null2String(workTimeScope.getBeginTime());
|
||
String ori_workBeginTime = workBeginTime;
|
||
int workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime);
|
||
boolean workBenginTimeAcross = workTimeScope.getBeginTimeAcross();
|
||
String workEndTime = Util.null2String(workTimeScope.getEndTime());
|
||
String ori_workEndTime = workEndTime;
|
||
int workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime);
|
||
boolean workEndTimeAcross = workTimeScope.getEndTimeAcross();
|
||
int workMins = workTimeScope.getWorkMins();
|
||
|
||
String workBeginDate = workBenginTimeAcross ? nextDate : kqDate;
|
||
String workEndDate = workEndTimeAcross ? nextDate : kqDate;
|
||
if(lsRestTime != null && !lsRestTime.isEmpty()){
|
||
for(int k = 0 ; k < lsRestTime.size(); k++){
|
||
TimeScopeEntity restTimeScope = lsRestTime.get(k);
|
||
if (restTimeScope!=null) {
|
||
String restBeginTime = Util.null2String(restTimeScope.getBeginTime());
|
||
String restEndTime = Util.null2String(restTimeScope.getEndTime());
|
||
int beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(restBeginTime);
|
||
int endIdx = kqTimesArrayComInfo.getArrayindexByTimes(restEndTime);
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMinsNew, beginIdx, endIdx, -11);//休息时间
|
||
}
|
||
}
|
||
}
|
||
int all_rest_cnt = kqTimesArrayComInfo.getCnt(dayMinsNew, workBeginIdx, workEndIdx, -11);
|
||
if(all_rest_cnt >= 0){
|
||
workMins = workMins-(all_rest_cnt);
|
||
}
|
||
}
|
||
workMins4leave += workMins;
|
||
}
|
||
middleMins = workMins4leave>0?workMins4leave/2:0;
|
||
middleMins_final = middleMins;
|
||
|
||
for (int i = 0; lsWorkTime != null && i < lsWorkTime.size(); i++) {
|
||
shiftI = i;
|
||
params = new ArrayList<>();
|
||
TimeScopeEntity signTimeScope = lsSignTime.get(i);
|
||
TimeScopeEntity workTimeScope = lsWorkTime.get(i);
|
||
//TimeScopeEntity restTimeScope = lsRestTime.isEmpty()?null:lsRestTime.get(i);
|
||
String workBeginTime = Util.null2String(workTimeScope.getBeginTime());
|
||
String ori_workBeginTime = workBeginTime;
|
||
int workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime);
|
||
boolean workBenginTimeAcross = workTimeScope.getBeginTimeAcross();
|
||
String workEndTime = Util.null2String(workTimeScope.getEndTime());
|
||
String ori_workEndTime = workEndTime;
|
||
int workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime);
|
||
boolean workEndTimeAcross = workTimeScope.getEndTimeAcross();
|
||
int workMins = workTimeScope.getWorkMins();
|
||
|
||
String workBeginDate = workBenginTimeAcross ? nextDate : kqDate;
|
||
String workEndDate = workEndTimeAcross ? nextDate : kqDate;
|
||
|
||
Arrays.fill(dayMins, workBeginIdx, workEndIdx, 1);//工作时段标识 1
|
||
|
||
int beginIdx = 0;
|
||
int endIdx = 0;
|
||
int checkIn = 0;
|
||
int checkOut = 0;
|
||
String signInId = "";
|
||
String signInDate = "";
|
||
String signInTime = "";
|
||
String signOutId = "";
|
||
String signOutDate = "";
|
||
String signOutTime = "";
|
||
int earlyInMins = 0;//早到分钟数
|
||
int lateOutMins = 0;//晚走分钟数
|
||
int earlyInMinsNew = 0;//早到分钟数
|
||
int lateOutMinsNew = 0;//晚走分钟数
|
||
int signMins = 0;//签到签退时长
|
||
int signMinsNew = 0;//打卡时长新
|
||
int tmpAttendanceMins = 0;//出勤分钟数(流程抵扣来的)
|
||
int attendanceMins = 0;
|
||
int beLateMins = 0;
|
||
int graveBeLateMins = 0;
|
||
int leaveEarlyMins = 0;
|
||
int graveLeaveEarlyMins = 0;
|
||
int absenteeismMins = 0;
|
||
int leaveMins = 0;//请假时长
|
||
Map<String,Object> leaveInfo = new HashMap<>();//请假信息
|
||
Map<String,Object> otherinfo = new HashMap<>();//存一些用得到的信息
|
||
int evectionMins = 0;//出差时长
|
||
int outMins = 0;//公出时长
|
||
int otherMins = 0;//异常流程时长
|
||
int forgotCheckMins = 0;
|
||
int forgotBeginWorkCheckMins = 0;//上班漏签
|
||
int signInTimeIndx = -1;
|
||
int flowSignInTimeIndx = -1;
|
||
int signInTimeOutdx = -1;
|
||
//用来计算实际打卡时长用的
|
||
int signInTimeIndx4Sign = -1;
|
||
int signInTimeOutdx4Sign = -1;
|
||
|
||
String signBeginDateTime = signTimeScope.getBeginTimeAcross() ? nextDate : kqDate;
|
||
if(signTimeScope.isBeginTimePreAcross()){
|
||
signBeginDateTime = preDate;
|
||
}
|
||
signBeginDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(signTimeScope.getBeginTime())+":00";
|
||
String signEndDateTime = signTimeScope.getEndTimeAcross() ? nextDate : kqDate;
|
||
signEndDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(signTimeScope.getEndTime())+":59";
|
||
String workBeginDateTime = workTimeScope.getBeginTimeAcross() ? nextDate : kqDate;
|
||
workBeginDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(workTimeScope.getBeginTime())+":00";
|
||
String workEndDateTime = workTimeScope.getEndTimeAcross() ? nextDate : kqDate;
|
||
workEndDateTime+=" "+kqTimesArrayComInfo.turn48to24Time(workTimeScope.getEndTime())+":00";
|
||
|
||
kqLog.info("signBeginDateTime" + signBeginDateTime+"::userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
kqLog.info("signEndDateTime" + signEndDateTime+"::userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
kqLog.info("workBeginDateTime" + workBeginDateTime+"::userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
kqLog.info("workEndDateTime" + workEndDateTime+"::userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
|
||
Map<String, String> shifRuleMap = Maps.newHashMap();
|
||
if (1 != restShift) {
|
||
if(oneSign){
|
||
//个性化设置只支持一天一次上下班
|
||
ShiftInfoBean shiftInfoBean = new ShiftInfoBean();
|
||
shiftInfoBean.setSplitDate(kqDate);
|
||
shiftInfoBean.setShiftRuleMap(workTime.getShiftRuleInfo());
|
||
shiftInfoBean.setSignTime(lsSignTime);
|
||
shiftInfoBean.setWorkTime(lsWorkTime);
|
||
List<String> logList = Lists.newArrayList();
|
||
KQShiftRuleInfoBiz.getShiftRuleInfo(shiftInfoBean, userId, shifRuleMap,logList);
|
||
if(!shifRuleMap.isEmpty()){
|
||
if(!logList.isEmpty()){
|
||
otherinfo.put("logList", logList);
|
||
}
|
||
otherinfo.put("shiftRule", shifRuleMap);
|
||
if(shifRuleMap.containsKey("shift_beginworktime")){
|
||
String shift_beginworktime = Util.null2String(shifRuleMap.get("shift_beginworktime"));
|
||
if(shift_beginworktime.length() > 0){
|
||
workBeginTime = Util.null2String(shift_beginworktime);
|
||
workBeginIdx = kqTimesArrayComInfo.getArrayindexByTimes(workBeginTime);
|
||
workTimeScope.setBeginTime(workBeginTime);
|
||
workTimeScope.setBeginTimeAcross(workBeginIdx>=1440?true:false);
|
||
}
|
||
}
|
||
if(shifRuleMap.containsKey("shift_endworktime")){
|
||
String shift_endworktime = Util.null2String(shifRuleMap.get("shift_endworktime"));
|
||
if(shift_endworktime.length() > 0){
|
||
workEndTime = Util.null2String(shift_endworktime);
|
||
workEndIdx = kqTimesArrayComInfo.getArrayindexByTimes(workEndTime);
|
||
workTimeScope.setEndTime(workEndTime);
|
||
workTimeScope.setEndTimeAcross(workEndIdx>=1440?true:false);
|
||
}
|
||
}
|
||
}
|
||
kqLog.info("个性化之后 signBeginDateTime" + signBeginDateTime);
|
||
kqLog.info("个性化之后 signEndDateTime" + signEndDateTime);
|
||
kqLog.info("个性化之后 workBeginDateTime" + workBeginDateTime);
|
||
kqLog.info("个性化之后 workEndDateTime" + workEndDateTime);
|
||
}
|
||
}
|
||
|
||
List<Object> lsCheckInfo = new KQFormatSignData().getSignInfo(userId,signTimeScope,workTimeScope,kqDate,preDate,nextDate,kqTimesArrayComInfo,hostIps,uuid,shiftCount,shiftI);
|
||
kqLog.info("lsCheckInfo" + JSONObject.toJSONString(lsCheckInfo)+"::userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
if(this.writeLog) {
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005297,weaver.general.ThreadVarLanguage.getLang())+"",signBeginDateTime);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005298,weaver.general.ThreadVarLanguage.getLang())+"",signEndDateTime);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(1940,weaver.general.ThreadVarLanguage.getLang())+"",workBeginDateTime);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005299,weaver.general.ThreadVarLanguage.getLang())+"",workEndDateTime);
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005300,weaver.general.ThreadVarLanguage.getLang())+"",lsCheckInfo);
|
||
}
|
||
for (int j = 0; lsCheckInfo != null && j < lsCheckInfo.size(); j++) {
|
||
Map<String, Object> checkInfo = (Map<String, Object>) lsCheckInfo.get(j);
|
||
String signStatus = Util.null2String(checkInfo.get("signStatus"));
|
||
String signId = Util.null2String(checkInfo.get("signId"));
|
||
String signDate = Util.null2String(checkInfo.get("signDate"));
|
||
String signTime = Util.null2String(checkInfo.get("signTime"));
|
||
String deduct_signintime = Util.null2String(checkInfo.get("deduct_signintime"));
|
||
String deduct_signofftime = Util.null2String(checkInfo.get("deduct_signofftime"));
|
||
String flow_signInTime = "";
|
||
String flow_signOutTime = "";
|
||
if(kqDate.compareTo(signDate) < 0)endIdx+=1440;
|
||
if (signTime.length() > 8) {
|
||
signTime = signTime.substring(0, 8);
|
||
}
|
||
if (checkInfo.get("signType").equals("1")) {//签到
|
||
checkIn++;
|
||
//如果流程抵扣存在,打卡时长也存在,那么相互比较得到出勤时长和打卡时长 暂不这样处理,还是按照漏签的逻辑来处理
|
||
if(signTime.length() > 0){
|
||
signInTimeIndx4Sign = kqTimesArrayComInfo.getArrayindexByTimes(signTime);
|
||
}
|
||
signInId = signId;
|
||
signInDate = signDate;
|
||
signInTime = signTime;
|
||
signInTimeIndx = kqTimesArrayComInfo.getArrayindexByTimes(signInTime);
|
||
if(deduct_signintime.length() > 0){
|
||
if(signTime.length() > 0){
|
||
if(deduct_signintime.compareTo(signTime) < 0){
|
||
flow_signInTime = deduct_signintime;
|
||
}
|
||
}else{
|
||
flow_signInTime = deduct_signintime;
|
||
}
|
||
}
|
||
if(flow_signInTime.length() > 0){
|
||
flowSignInTimeIndx = kqTimesArrayComInfo.getArrayindexByTimes(flow_signInTime);
|
||
}
|
||
if(kqDate.compareTo(signDate) < 0) {
|
||
signInTimeIndx += 1440;
|
||
flowSignInTimeIndx += 1440;
|
||
}else if(kqDate.compareTo(signDate) > 0){
|
||
signInTimeIndx -= 1440;
|
||
signInTimeIndx = signInTimeIndx < 0 ? 0 : signInTimeIndx;
|
||
flowSignInTimeIndx -= 1440;
|
||
flowSignInTimeIndx = flowSignInTimeIndx < 0 ? 0 : flowSignInTimeIndx;
|
||
}
|
||
if(oneSign){
|
||
if(workBeginIdx>signInTimeIndx) {
|
||
earlyInMins = workBeginIdx-signInTimeIndx;
|
||
}
|
||
}
|
||
if(workBeginIdx>signInTimeIndx) {
|
||
earlyInMinsNew = workBeginIdx-signInTimeIndx;
|
||
}
|
||
} else if (checkInfo.get("signType").equals("2")) {//签退
|
||
checkOut++;
|
||
//如果流程抵扣存在,打卡时长也存在,那么相互比较得到出勤时长和打卡时长 暂不这样处理,还是按照漏签的逻辑来处理
|
||
if(signTime.length() > 0){
|
||
signInTimeOutdx4Sign = kqTimesArrayComInfo.getArrayindexByTimes(signTime);
|
||
}
|
||
signOutId = signId;
|
||
signOutDate = signDate;
|
||
signOutTime = signTime;
|
||
signInTimeOutdx = kqTimesArrayComInfo.getArrayindexByTimes(signOutTime);
|
||
if(deduct_signofftime.length() > 0){
|
||
if(signTime.length() > 0){
|
||
if(deduct_signofftime.compareTo(signTime) > 0){
|
||
flow_signOutTime = deduct_signofftime;
|
||
}
|
||
}else{
|
||
flow_signOutTime = deduct_signofftime;
|
||
}
|
||
}
|
||
if(flow_signOutTime.length() > 0){
|
||
signInTimeOutdx = kqTimesArrayComInfo.getArrayindexByTimes(flow_signOutTime);
|
||
}
|
||
if(kqDate.compareTo(signDate) < 0){
|
||
signInTimeOutdx+=1440;
|
||
}else if(kqDate.compareTo(signDate) > 0){
|
||
signInTimeOutdx -= 1440;
|
||
signInTimeOutdx = signInTimeOutdx < 0 ? 0 : signInTimeOutdx;
|
||
}
|
||
if(oneSign){
|
||
if(signInTimeOutdx>workEndIdx) {
|
||
lateOutMins = signInTimeOutdx-workEndIdx;
|
||
}
|
||
}
|
||
if(signInTimeOutdx>workEndIdx) {
|
||
lateOutMinsNew = signInTimeOutdx-workEndIdx;
|
||
}
|
||
}
|
||
if (checkInfo.get("signType").equals("1")) {//签到
|
||
if(signTime.length() > 0){
|
||
String signMinTime = signTime.substring(0,5)+":00";
|
||
endIdx = kqTimesArrayComInfo.getArrayindexByTimes(signTime);
|
||
if(signTime.compareTo(signMinTime) > 0){
|
||
//如果签到时间是带秒的且是迟到,那么签到时间多一秒和多一分钟是一样的
|
||
endIdx += 1;
|
||
signInTimeIndx = signInTimeIndx + 1;//如果是带秒的打卡数据不应该影响流程抵扣的数据的下标
|
||
}
|
||
if(kqDate.compareTo(signDate) < 0){
|
||
endIdx+=1440;
|
||
}else if(kqDate.compareTo(signDate) > 0){
|
||
endIdx -= 1440;
|
||
endIdx = endIdx < 0 ? 0 : endIdx;
|
||
}
|
||
if (endIdx > workBeginIdx) {
|
||
if(flow_signInTime.length() > 0){
|
||
if(flowSignInTimeIndx > workBeginIdx){
|
||
//增加一个判断,流程抵扣打卡如果开启了并且有抵扣上班打卡,那么也就不是迟到了
|
||
Arrays.fill(dayMins, workBeginIdx, endIdx, 2);//迟到时段标识 2
|
||
}
|
||
}else{
|
||
Arrays.fill(dayMins, workBeginIdx, endIdx, 2);//迟到时段标识 2
|
||
}
|
||
}
|
||
}
|
||
} else if (checkInfo.get("signType").equals("2")) {//签退
|
||
if(signTime.length() > 0){
|
||
beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(signTime);
|
||
if(StringUtils.isNotBlank(signDate) && signDate.compareTo(kqDate) > 0){
|
||
beginIdx+=1440;
|
||
}else if(kqDate.compareTo(signDate) > 0){
|
||
beginIdx -= 1440;
|
||
beginIdx = beginIdx < 0 ? 0 : beginIdx;
|
||
}
|
||
if (workEndIdx > beginIdx) {
|
||
if(flow_signOutTime.length() > 0){
|
||
if (workEndIdx > signInTimeOutdx) {
|
||
//增加一个判断,流程抵扣打卡如果开启了并且有抵扣下班打卡,那么也就不是早退了
|
||
Arrays.fill(dayMins, beginIdx, workEndIdx, 3);//早退时段标识 3
|
||
}
|
||
}else{
|
||
|
||
Arrays.fill(dayMins, beginIdx, workEndIdx, 3);//早退时段标识 3
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//打卡时长=签退时间-签到时间(有签到签退才计算)
|
||
if(checkIn==1&&checkOut==1){
|
||
if(signInTimeIndx4Sign > -1 && signInTimeOutdx4Sign > -1){
|
||
if(DateUtil.dayDiff(signInDate,signOutDate)==0){//同一天签到和签退
|
||
signMins=signInTimeOutdx4Sign - signInTimeIndx4Sign;
|
||
}else if(DateUtil.dayDiff(signInDate,signOutDate)==1) {//第一天签到,第二天签退
|
||
if(signInTimeOutdx4Sign<signInTimeIndx4Sign){
|
||
signMins = 1440 + signInTimeOutdx4Sign - signInTimeIndx4Sign;
|
||
}else{
|
||
signMins = 1440 + signInTimeOutdx4Sign - signInTimeIndx4Sign;
|
||
}
|
||
}
|
||
}else{
|
||
signMins=0;
|
||
}
|
||
if(signMins<0){
|
||
signMins=0;
|
||
}
|
||
}
|
||
|
||
if (checkIn == 0 && checkOut == 0) {//旷工(无签到无签退)
|
||
if (workEndIdx > workBeginIdx) {
|
||
Arrays.fill(dayMins, workBeginIdx, workEndIdx, 4);//旷工时段标识 4
|
||
}
|
||
}
|
||
|
||
if (checkOut == 0 && checkIn > 0) {//漏签(有签到无签退)
|
||
if(signInTimeIndx > -1){
|
||
if (workEndIdx > signInTimeIndx) {
|
||
//漏签就是从本次时段内的打卡到下班点
|
||
//上班漏签应该是从签到到签到结束时间,不过这里可以不用管,只是一个次数
|
||
Arrays.fill(dayMins, signInTimeIndx, workEndIdx, 6);//上班漏签时段标识 6
|
||
} else {
|
||
//签到晚于本次时段结束时间,也算漏签
|
||
forgotCheckMins++;
|
||
}
|
||
}else if(flowSignInTimeIndx > -1){
|
||
if (workEndIdx > flowSignInTimeIndx) {
|
||
//漏签就是从本次时段内的打卡到下班点
|
||
//上班漏签应该是从签到到签到结束时间,不过这里可以不用管,只是一个次数
|
||
Arrays.fill(dayMins, flowSignInTimeIndx, workEndIdx, 6);//上班漏签时段标识 6
|
||
} else {
|
||
//签到晚于本次时段结束时间,也算漏签
|
||
forgotCheckMins++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (checkIn == 0 && checkOut > 0) {//漏签(有签退无签到)
|
||
if(signInTimeOutdx > 0){
|
||
if(workBeginIdx < signInTimeOutdx) {
|
||
//下班漏签应该是从签退到签退开始时间,不过这里可以不用管,只是一个次数
|
||
Arrays.fill(dayMins, workBeginIdx, signInTimeOutdx, 66);//下班漏签时段标识 66,66呼应前面的漏签的6
|
||
}else{
|
||
//这种数据理论上不会存在,也记下吧
|
||
forgotBeginWorkCheckMins++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (workFlowInfo.get(dateKey) != null) {
|
||
workFlow = (List<Object>) workFlowInfo.get(dateKey);
|
||
}
|
||
|
||
boolean isHandle1 = false;
|
||
boolean isHandle2 = false;
|
||
for (int j = 0; workFlow != null && j < workFlow.size(); j++) {
|
||
Map<String, Object> data = (Map<String, Object>) workFlow.get(j);
|
||
String flowType = Util.null2String(data.get("flowtype"));
|
||
String newLeaveType = Util.null2String(data.get("newleavetype"));
|
||
String signtype = Util.null2String(data.get("signtype"));
|
||
String durationrule = Util.null2String(data.get("durationrule"));
|
||
String ishalf = Util.null2String(data.get("ishalf"));
|
||
double duration = Util.getDoubleValue(Util.null2String(data.get("duration")));
|
||
if(flowType.equalsIgnoreCase(FlowReportTypeEnum.LEAVE.getFlowType())){
|
||
duration = Util.getDoubleValue(Util.null2String(data.get(newLeaveType)));
|
||
}
|
||
String serial = Util.null2String(data.get("serial"));
|
||
String requestId = Util.null2String(data.get("requestId"));
|
||
beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("begintime")));
|
||
endIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("endtime")));
|
||
if (beginIdx >= endIdx) {
|
||
continue;
|
||
}
|
||
int middleIdx = (workBeginIdx+workEndIdx)/2;//工作时段标识 1
|
||
|
||
if(flowType.equals(FlowReportTypeEnum.EVECTION.getFlowType())){
|
||
if("2".equals(durationrule) && "true".equals(ishalf)){
|
||
isHandle2 = true;
|
||
}
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 7);//出差抵扣时段标识 7
|
||
}else if(flowType.equals(FlowReportTypeEnum.OUT.getFlowType())){
|
||
if("2".equals(durationrule) && "true".equals(ishalf)){
|
||
isHandle2 = true;
|
||
}
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 8);//公出抵扣时段标识 8
|
||
}else if(flowType.equalsIgnoreCase(FlowReportTypeEnum.LEAVE.getFlowType())){
|
||
if("2".equals(durationrule) && "true".equals(ishalf)){
|
||
isHandle1 = true;
|
||
}
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 5);//流程抵扣时段标识 5
|
||
int tmpBeginIdx = beginIdx;
|
||
int tmpEndIdx = endIdx;
|
||
Integer val = 0;
|
||
|
||
if(beginIdx>=workEndIdx){
|
||
continue;
|
||
}
|
||
if(endIdx<=workBeginIdx){
|
||
continue;
|
||
}
|
||
|
||
if(leaveInfo.get(newLeaveType)==null){
|
||
leaveInfo.put(newLeaveType,val);
|
||
}else{
|
||
val = (Integer) leaveInfo.get(newLeaveType);
|
||
}
|
||
|
||
if(beginIdx<workBeginIdx)tmpBeginIdx=workBeginIdx;
|
||
if(endIdx>workEndIdx)tmpEndIdx=endIdx;
|
||
if(tmpEndIdx>tmpBeginIdx){
|
||
leaveInfo.put(newLeaveType,val+(tmpEndIdx-tmpBeginIdx));
|
||
}
|
||
}
|
||
}else{
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 99);//异常流程抵扣时段标识99
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
if (workEndTimeAcross && false) {//跨天需要加入一天的流程
|
||
workFlow = null;
|
||
if (workFlowInfo.get(nextDateKey) != null) {
|
||
workFlow = (List<Object>) workFlowInfo.get(nextDateKey);
|
||
}
|
||
|
||
for (int j = 0; workFlow != null && j < workFlow.size(); j++) {
|
||
Map<String, Object> data = (Map<String, Object>) workFlow.get(j);
|
||
String flowType = Util.null2String(data.get("flowtype"));
|
||
beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("begintime")))+1440;
|
||
endIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("endtime")))+1440;
|
||
if(endIdx>=2880){
|
||
endIdx = 2880;
|
||
}
|
||
if(flowType.equals(FlowReportTypeEnum.EVECTION.getFlowType())){
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 7);//出差抵扣时段标识 7
|
||
}else if(flowType.equals(FlowReportTypeEnum.OUT.getFlowType())){
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 8);//公出抵扣时段标识 8
|
||
}else if(flowType.equalsIgnoreCase(FlowReportTypeEnum.LEAVE.getFlowType())){
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 5);//流程抵扣时段标识 5
|
||
|
||
}
|
||
}else{
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 99);//异常流程抵扣时段标识99
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if(lsRestTime != null && !lsRestTime.isEmpty()){
|
||
for(int k = 0 ; k < lsRestTime.size(); k++){
|
||
TimeScopeEntity restTimeScope = lsRestTime.get(k);
|
||
if (restTimeScope!=null) {
|
||
String restBeginTime = Util.null2String(restTimeScope.getBeginTime());
|
||
String restEndTime = Util.null2String(restTimeScope.getEndTime());
|
||
beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(restBeginTime);
|
||
endIdx = kqTimesArrayComInfo.getArrayindexByTimes(restEndTime);
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, -11);//休息时间
|
||
}
|
||
}
|
||
}
|
||
int all_rest_cnt = kqTimesArrayComInfo.getCnt(dayMins, workBeginIdx, workEndIdx, -11);
|
||
if(all_rest_cnt >= 0){
|
||
workMins = workMins-(all_rest_cnt);
|
||
}
|
||
}
|
||
|
||
for (int j = workBeginIdx; j < workEndIdx; j++) {
|
||
switch (dayMins[j]) {
|
||
case 1:
|
||
tmpAttendanceMins++;
|
||
break;
|
||
case 2:
|
||
beLateMins++;
|
||
break;
|
||
case 3:
|
||
leaveEarlyMins++;
|
||
break;
|
||
case 4:
|
||
absenteeismMins++;
|
||
break;
|
||
case 5:
|
||
leaveMins++;
|
||
break;
|
||
case 6:
|
||
forgotCheckMins++;
|
||
break;
|
||
case 7:
|
||
evectionMins++;
|
||
break;
|
||
case 8:
|
||
outMins++;
|
||
break;
|
||
case 66:
|
||
forgotBeginWorkCheckMins++;
|
||
break;
|
||
case 99:
|
||
otherMins++;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(forgotCheckMins == 1 && beLateMins==0 && tmpAttendanceMins==0){//forgotCheckMins==1表示下班后漏签,不是迟到,流程已完全抵扣异常
|
||
forgotCheckMins = 0;
|
||
}
|
||
|
||
KQShiftRuleEntity kqShiftRuleEntity = new KQShiftRuleEntity();
|
||
kqShiftRuleEntity.setUserId(userId);
|
||
kqShiftRuleEntity.setKqDate(kqDate);
|
||
kqShiftRuleEntity.setBelatemins(beLateMins);
|
||
kqShiftRuleEntity.setLeaveearlymins(leaveEarlyMins);
|
||
kqShiftRuleEntity.setAbsenteeismmins(absenteeismMins);
|
||
kqShiftRuleEntity.setForgotcheckmins(forgotCheckMins);
|
||
kqShiftRuleEntity.setForgotBeginWorkCheckMins(forgotBeginWorkCheckMins);
|
||
kqShiftRuleEntity.setEarlyInMins(earlyInMins);
|
||
kqShiftRuleEntity.setLateOutMins(lateOutMins);
|
||
kqLog.info("人性化规则处理前数据" + JSONObject.toJSONString(kqShiftRuleEntity));
|
||
if(this.writeLog) {
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005301,weaver.general.ThreadVarLanguage.getLang())+"",kqShiftRuleEntity);
|
||
}
|
||
//人性化规则
|
||
kqShiftRuleEntity = kqFormatShiftRule.doShiftRule(workTime,kqShiftRuleEntity);
|
||
kqLog.info("人性化规则处理后数据" + JSONObject.toJSONString(kqShiftRuleEntity));
|
||
if(this.writeLog) {
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005302,weaver.general.ThreadVarLanguage.getLang())+"",kqShiftRuleEntity);
|
||
}
|
||
beLateMins = kqShiftRuleEntity.getBelatemins();
|
||
graveBeLateMins = kqShiftRuleEntity.getGravebelatemins();
|
||
leaveEarlyMins = kqShiftRuleEntity.getLeaveearlymins();
|
||
graveLeaveEarlyMins = kqShiftRuleEntity.getGraveleaveearlymins();
|
||
absenteeismMins = kqShiftRuleEntity.getAbsenteeismmins();
|
||
forgotCheckMins = kqShiftRuleEntity.getForgotcheckmins();
|
||
forgotBeginWorkCheckMins = kqShiftRuleEntity.getForgotBeginWorkCheckMins();
|
||
|
||
boolean isondutyfreecheck =false;
|
||
boolean isoffdutyfreecheck =false;
|
||
Map<String, String> model_ShiftRule = kqFormatShiftRule.getModel_ShiftRule(i, workTime.getSerialId());
|
||
Iterator iter = model_ShiftRule.entrySet().iterator();
|
||
while (iter.hasNext()) {
|
||
Map.Entry entry = (Map.Entry) iter.next();
|
||
String key = Util.null2String(entry.getKey());
|
||
String value = Util.null2String(entry.getValue());
|
||
if(key.equals("start")&&value.equals("1")){
|
||
isondutyfreecheck = true;
|
||
}
|
||
if(key.equals("end")&&value.equals("1")){
|
||
isoffdutyfreecheck = true;
|
||
}
|
||
}
|
||
boolean beforeBegin = !new KQFormatBiz().needCal(workBeginDate,workBeginTime);
|
||
if(beforeBegin) {//还未到上班时间,不用计算任何状态
|
||
kqLog.writeLog("还未到上班时间,不用计算任何状态");
|
||
beLateMins = 0;
|
||
graveBeLateMins = 0;
|
||
leaveEarlyMins = 0;
|
||
graveLeaveEarlyMins = 0;
|
||
absenteeismMins = 0;
|
||
forgotCheckMins = 0;
|
||
forgotBeginWorkCheckMins = 0;
|
||
}else if(!new KQFormatBiz().needCal(workEndDate,workEndTime)) {//还未到下班时间
|
||
kqLog.writeLog("还未到上班时间");
|
||
leaveEarlyMins = 0;
|
||
graveLeaveEarlyMins = 0;
|
||
forgotCheckMins = 0;
|
||
}
|
||
|
||
if (1 == restShift || workTime.getIsExclude()) {//休息日班次或者无需考勤人员没有异常状态
|
||
beLateMins = 0;
|
||
graveBeLateMins = 0;
|
||
leaveEarlyMins = 0;
|
||
graveLeaveEarlyMins = 0;
|
||
absenteeismMins = 0;
|
||
forgotCheckMins = 0;
|
||
forgotBeginWorkCheckMins = 0;
|
||
}
|
||
signMinsNew = signMins;
|
||
if (1 == restShift) {//非工作日班次連打卡時長和出勤时长也不給了
|
||
workMins = 0;
|
||
signMins = 0;
|
||
}
|
||
//允许下班不打卡 ,如果上班也没有打卡,那么算上班旷工0.5天
|
||
if (isoffdutyfreecheck) {
|
||
if (checkIn == 0) {//(无签到),就会有上班漏签,如果有下班卡,那么上班漏签
|
||
if(forgotBeginWorkCheckMins==0&&absenteeismMins>0){
|
||
forgotBeginWorkCheckMins= absenteeismMins ;
|
||
}
|
||
}
|
||
absenteeismMins = 0;
|
||
forgotCheckMins = 0;
|
||
}
|
||
//允许上班不打卡,如果下班也没有打卡,那么算漏签
|
||
if(isondutyfreecheck){
|
||
if (checkOut == 0) {//(无签退)
|
||
if(forgotCheckMins==0&&absenteeismMins>0){
|
||
forgotCheckMins= absenteeismMins ;
|
||
}
|
||
}
|
||
absenteeismMins = 0;
|
||
forgotBeginWorkCheckMins = 0;
|
||
}
|
||
if(isondutyfreecheck&&isoffdutyfreecheck){
|
||
absenteeismMins = 0;
|
||
forgotCheckMins = 0;
|
||
forgotBeginWorkCheckMins = 0;
|
||
}
|
||
//计算实际出勤时间(出差公出算出勤)=应出勤-旷工-请假-迟到-早退
|
||
// attendanceMins = workMins - absenteeismMins-leaveMins-beLateMins-graveBeLateMins-leaveEarlyMins-graveLeaveEarlyMins;
|
||
attendanceMins = workMins - absenteeismMins-leaveMins;
|
||
|
||
if(this.writeLog) {
|
||
logInfo.put("is_half",is_half);
|
||
logInfo.put("shiftNums",shiftNums);
|
||
logInfo.put("isHandle2",isHandle2);
|
||
logInfo.put("isHandle1",isHandle1);
|
||
logInfo.put("workMins"+i,workMins);
|
||
logInfo.put("absenteeismMins"+i,absenteeismMins);
|
||
logInfo.put("middleMins"+i,middleMins);
|
||
}
|
||
//如果开启半天特殊处理的,请假是需要扣除0.5天
|
||
//说明没有打卡的情况,因为有打卡肯定是有迟到、早退、漏签这些异常的,不考虑迟到算旷工,早退算旷工的情况
|
||
//只处理1天1次,和1天2次的情况,因为1天3次的中间点可能在第二段,需要考虑有没有打卡,以及有打卡第三次是否需要处理等情况,和上下午半天的概念不太适用
|
||
if("1".equals(is_half)){
|
||
boolean absentFlag_1 = false;//请假,
|
||
boolean absentFlag_2 = false;//公出或出差
|
||
if(isHandle1 || isHandle2){
|
||
if(absenteeismMins>0 && !(beLateMins >0||graveBeLateMins > 0||leaveEarlyMins > 0||graveLeaveEarlyMins > 0||forgotCheckMins > 0||forgotBeginWorkCheckMins >0)){
|
||
if(isHandle1){
|
||
absentFlag_1 = true;//可以理解为是1天3次和1天1次的情况,因为1天2次的情况,如果有旷工,那么另外半天才是有请假,
|
||
}
|
||
if(isHandle2){
|
||
absentFlag_2 = true;//可以理解为是1天3次和1天1次的情况,因为1天2次的情况,如果有旷工,那么另外半天才是有公出或者出差
|
||
}
|
||
}
|
||
}
|
||
if(this.writeLog) {
|
||
logInfo.put("tmp_absenteeismMins"+i,absenteeismMins);
|
||
logInfo.put("absentFlag_1"+i,absentFlag_1);
|
||
logInfo.put("absentFlag_2"+i,absentFlag_2);
|
||
}
|
||
/*1次---上午3小时,下午5小时
|
||
上午公出,下午旷工
|
||
上午公出,下午打卡
|
||
上午旷工,下午公出
|
||
上午打卡,下午公出
|
||
|
||
2次---上午3小时,下午5小时
|
||
上午公出,下午旷工--需处理实际出勤、旷工时长
|
||
上午公出,下午打卡--需处理实际出勤
|
||
上午旷工,下午公出--需处理实际出勤、旷工时长
|
||
上午打卡,下午公出--需处理实际出勤
|
||
*/
|
||
if(isHandle2){
|
||
if(shiftNums ==1){
|
||
absenteeismMins = absentFlag_2?middleMins_final:0;
|
||
attendanceMins = workMins - absenteeismMins;
|
||
}else if(shiftNums == 2){
|
||
if(workMins>middleMins_final && middleMins_final>0){
|
||
absenteeismMins = (absenteeismMins > middleMins_final)?middleMins_final:((absentFlag_2||outMins>0||evectionMins>0)?Math.abs(workMins - middleMins_final):0);
|
||
absenteeismMins = (i==1 && middleMap.get("attendanceMins0")>0)?(absentFlag_2?absenteeismMins:0):absenteeismMins;//上午打卡3小时,下午公出5小时,下午的就不要显示旷工1小时了
|
||
}
|
||
attendanceMins = workMins - absenteeismMins;
|
||
}
|
||
}
|
||
if(this.writeLog) {
|
||
logInfo.put("absenteeismMins_1"+i,absenteeismMins);
|
||
logInfo.put("attendanceMins_1"+i,attendanceMins);
|
||
}
|
||
|
||
/*1次---上午3小时,下午5小时
|
||
上午请假,下午旷工
|
||
上午请假,下午打卡
|
||
上午旷工,下午请假
|
||
上午打卡,下午请假
|
||
|
||
2次---上午3小时,下午5小时
|
||
上午请假,下午旷工--需处理实际出勤、旷工时长
|
||
上午请假,下午打卡--需处理实际出勤
|
||
上午旷工,下午请假--需处理实际出勤、旷工时长
|
||
上午打卡,下午请假--需处理实际出勤
|
||
*/
|
||
|
||
if(isHandle1){
|
||
if(shiftNums == 1){
|
||
absenteeismMins = absentFlag_1?middleMins_final:0;
|
||
attendanceMins = workMins - absenteeismMins - (leaveMins>0?middleMins_final:(absentFlag_1?(workMins - middleMins_final):0));
|
||
}else if(shiftNums == 2){
|
||
if(workMins>middleMins_final && middleMins_final>0){
|
||
absenteeismMins = (absenteeismMins > middleMins_final)?middleMins_final:((absentFlag_1||leaveMins>0)?Math.abs(workMins - middleMins_final):0);
|
||
absenteeismMins = (i==1 && middleMap.get("attendanceMins0")>0)?0:absenteeismMins;//上午打卡3小时,下午请假5小时,下午的就不要显示旷工1小时了
|
||
}
|
||
attendanceMins = workMins - absenteeismMins - (leaveMins>0?middleMins_final:(absentFlag_1?Math.abs(workMins - middleMins_final):0));
|
||
attendanceMins = attendanceMins>middleMins_final?middleMins_final:attendanceMins;//上午请假3小时,下午打卡5小时
|
||
}else if(shiftNums == 3){//比如一天三次上下班,那么中间点在第二次上下班区间
|
||
// if(workMins>middleMins && middleMins>0){
|
||
// absenteeismMins = (absenteeismMins > middleMins_final)?middleMins_final:((absentFlag_1||leaveMins>0)?(workMins - middleMins):0);
|
||
// absenteeismMins = (i>=1 && middleMap.get("attendanceMins"+(i-1))>0)?0:absenteeismMins;
|
||
// }
|
||
// attendanceMins = workMins - absenteeismMins - (leaveMins>0?middleMins_final:(absentFlag_1?Math.abs(workMins - middleMins_final):0));
|
||
// attendanceMins = attendanceMins>middleMins_final?middleMins_final:attendanceMins;//上午请假3小时,下午打卡5小时
|
||
// if(workMins < middleMins){//客户可能是一天2次,或者3次,那么workmins有可能是小于半天的请假时间
|
||
// middleMins = middleMins-workMins;
|
||
// }else {
|
||
// middleMins = 0;
|
||
// }
|
||
}
|
||
if(absenteeismMins > middleMins_final){//客户可能是一天2次,或者3次
|
||
absenteeismMins = middleMins_final;
|
||
}
|
||
}
|
||
middleMap.put("attendanceMins"+i,attendanceMins);
|
||
middleMap.put("absenteeismMins"+i,absenteeismMins);
|
||
middleMap.put("workMins"+i,workMins);
|
||
middleMap.put("leaveMins"+i,leaveMins);
|
||
middleMap.put("outMins"+i,outMins);
|
||
middleMap.put("evectionMins"+i,evectionMins);
|
||
middleMap.put("isHandle1"+i,isHandle1?1:0);
|
||
middleMap.put("isHandle2"+i,isHandle2?1:0);
|
||
middleMap.put("absentFlag_1"+i,absentFlag_1?1:0);//1表示有旷工
|
||
middleMap.put("absentFlag_2"+i,absentFlag_2?1:0);//1表示有旷工
|
||
}
|
||
|
||
// 如果没有开启"漏签是否算实际出勤"开关,则漏签不算实际出勤时长
|
||
if("0".equals(nosign_is_absent)) {
|
||
attendanceMins = attendanceMins-forgotCheckMins-forgotBeginWorkCheckMins;
|
||
}
|
||
if(beforeBegin || attendanceMins < 0) {//还未到上班时间,不用计算任何状体
|
||
attendanceMins = 0;
|
||
}
|
||
kqLog.info("实际出勤计算公式" + "实际出勤=应出勤- 旷工-请假-迟到-早退 userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
kqLog.info("实际出勤计算结果" + attendanceMins + "=" + workMins + "- " + absenteeismMins + "-" + leaveMins + "-" + (beLateMins + graveBeLateMins) + "-" + (leaveEarlyMins - graveLeaveEarlyMins)+" userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid);
|
||
if(this.writeLog) {
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005303,weaver.general.ThreadVarLanguage.getLang())+"",""+weaver.systeminfo.SystemEnv.getHtmlLabelName(130566,weaver.general.ThreadVarLanguage.getLang())+"="+weaver.systeminfo.SystemEnv.getHtmlLabelName(132056,weaver.general.ThreadVarLanguage.getLang())+"- "+weaver.systeminfo.SystemEnv.getHtmlLabelName(20085,weaver.general.ThreadVarLanguage.getLang())+"-"+weaver.systeminfo.SystemEnv.getHtmlLabelName(670,weaver.general.ThreadVarLanguage.getLang())+"-"+weaver.systeminfo.SystemEnv.getHtmlLabelName(20081,weaver.general.ThreadVarLanguage.getLang())+"-"+weaver.systeminfo.SystemEnv.getHtmlLabelName(20082,weaver.general.ThreadVarLanguage.getLang())+"");
|
||
logInfo.put(""+weaver.systeminfo.SystemEnv.getHtmlLabelName(10005304,weaver.general.ThreadVarLanguage.getLang())+"",attendanceMins+"="+workMins+"- "+absenteeismMins+"-"+leaveMins+"-"+(beLateMins+graveBeLateMins)+"-"+(leaveEarlyMins-graveLeaveEarlyMins));
|
||
}
|
||
//判断当天考勤状态
|
||
// if (beLateMins > 0) {
|
||
// status = ButtonStatusEnum.BELATE.getStatusCode();
|
||
// } else if (leaveEarlyMins > 0) {
|
||
// status = ButtonStatusEnum.LEAVEERALY.getStatusCode();
|
||
// } else if (absenteeismMins > 0) {
|
||
// status = ButtonStatusEnum.ABSENT.getStatusCode();
|
||
// } else if (forgotCheckMins > 0) {
|
||
// status = ButtonStatusEnum.NOSIGN.getStatusCode();
|
||
// } else {
|
||
// status = ButtonStatusEnum.NORMAL.getStatusCode();
|
||
// }
|
||
BaseBean bb = new BaseBean();
|
||
|
||
//周六或周日打卡时长写入
|
||
// if((DateUtil.getWeek(kqDate) == 6 || DateUtil.getWeek(kqDate) == 7)){
|
||
createSignInfoMo(userId,kqDate,signMinsNew,signInTime,signOutTime);
|
||
// }
|
||
|
||
String groupid = Util.null2String(workTime.getGroupId());
|
||
String serialid = Util.null2String(workTime.getSerialId());
|
||
Boolean checkUnShow = checkSubcompany(userId);
|
||
|
||
// qc 如果是 刷卡加班班段就不要添加其他参数
|
||
if(i == lsWorkTime.size() -3){
|
||
params.add(userId);
|
||
params.add(kqDate);
|
||
params.add(groupid.length() == 0 ? null : groupid);
|
||
params.add(serialid.length() == 0 ? null : serialid);
|
||
params.add(i);
|
||
params.add(workBeginDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workBeginTime));
|
||
params.add(workEndDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workEndTime));
|
||
params.add(workMins);
|
||
if(restShift == 1 && !checkJbsq(userId,kqDate) && checkUnShow){
|
||
//休息班未提加班流程不显示打卡记录
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
}else{
|
||
params.add(signInDate);
|
||
params.add(signInTime);
|
||
params.add(signInId.length() == 0 ? null : signInId);
|
||
params.add(signOutDate);
|
||
params.add(signOutTime);
|
||
params.add(signOutId.length() == 0 ? null : signOutId);
|
||
}
|
||
|
||
kqLog.info("format in >>>>>userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid
|
||
+":signInDate:"+signInDate+":signInTime::"+signInTime+":signOutDate:"+signOutDate+":signOutTime::"+signOutTime);
|
||
params.add(signMins);
|
||
params.add(attendanceMins);
|
||
params.add(beLateMins);
|
||
params.add(graveBeLateMins);
|
||
params.add(leaveEarlyMins);
|
||
params.add(graveLeaveEarlyMins);
|
||
params.add(absenteeismMins);
|
||
params.add(forgotCheckMins);
|
||
params.add(leaveMins);
|
||
params.add(JSONObject.toJSONString(leaveInfo));
|
||
params.add(evectionMins);
|
||
params.add(outMins);
|
||
params.add(forgotBeginWorkCheckMins);
|
||
// qc 刷卡加班时长
|
||
params.add(0);
|
||
params.add(JSONObject.toJSONString(otherinfo));
|
||
}else if (i == lsWorkTime.size() -2){
|
||
params.add(userId);
|
||
params.add(kqDate);
|
||
params.add(groupid.length() == 0 ? null : groupid);
|
||
params.add(serialid.length() == 0 ? null : serialid);
|
||
params.add(i);
|
||
params.add(workBeginDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workBeginTime));
|
||
params.add(workEndDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workEndTime));
|
||
params.add(workMins);
|
||
if(restShift == 1 && !checkJbsq(userId,kqDate) && checkUnShow){
|
||
//休息班未提加班流程不显示打卡记录
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
}else{
|
||
params.add(signInDate);
|
||
params.add(signInTime);
|
||
params.add(signInId.length() == 0 ? null : signInId);
|
||
params.add(signOutDate);
|
||
params.add(signOutTime);
|
||
params.add(signOutId.length() == 0 ? null : signOutId);
|
||
}
|
||
kqLog.info("format in >>>>>userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid
|
||
+":signInDate:"+signInDate+":signInTime::"+signInTime+":signOutDate:"+signOutDate+":signOutTime::"+signOutTime);
|
||
params.add(signMins);
|
||
params.add(attendanceMins);
|
||
params.add(beLateMins);
|
||
params.add(graveBeLateMins);
|
||
params.add(leaveEarlyMins);
|
||
params.add(graveLeaveEarlyMins);
|
||
params.add(absenteeismMins);
|
||
params.add(forgotCheckMins);
|
||
params.add(leaveMins);
|
||
params.add(JSONObject.toJSONString(leaveInfo));
|
||
params.add(evectionMins);
|
||
params.add(outMins);
|
||
params.add(forgotBeginWorkCheckMins);
|
||
// qc 刷卡加班时长
|
||
if("13".equals(serialid) || "22".equals(serialid)){
|
||
//特殊班次需要用下班卡-16:00计刷卡加班
|
||
if(StringUtils.isNotBlank(signOutTime)){
|
||
Integer minsNe = divide2(String.valueOf(TimeUtil.timeInterval(signInDate + " " + "16:00:00", signOutDate + " " + signOutTime)), "60").intValue();
|
||
signMinsNew = minsNe;
|
||
}else{
|
||
signMinsNew = 0;
|
||
}
|
||
}else{
|
||
signMinsNew = 0;
|
||
}
|
||
params.add(signMinsNew);
|
||
params.add(JSONObject.toJSONString(otherinfo));
|
||
}else {
|
||
params.add(userId);
|
||
params.add(kqDate);
|
||
params.add(groupid.length() == 0 ? null : groupid);
|
||
params.add(serialid.length() == 0 ? null : serialid);
|
||
params.add(i);
|
||
params.add(workBeginDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workBeginTime));
|
||
params.add(workEndDate);
|
||
params.add(kqTimesArrayComInfo.turn48to24Time(ori_workEndTime));
|
||
params.add(0); //workMins
|
||
//未提加班流程不显示打卡记录
|
||
if((checkJbsq(userId,kqDate) && checkUnShow) || (checkLbJbsq(userId,kqDate) && checkUnShow)){
|
||
params.add(signInDate);
|
||
params.add(signInTime);
|
||
params.add(signInId.length() == 0 ? null : signInId);
|
||
params.add(signOutDate);
|
||
params.add(signOutTime);
|
||
params.add(signOutId.length() == 0 ? null : signOutId);
|
||
}else{
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
params.add("");
|
||
params.add("");
|
||
params.add(null);
|
||
forgotCheckMins = 0;
|
||
forgotBeginWorkCheckMins = 0;
|
||
}
|
||
kqLog.info("format in >>>>>userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid
|
||
+":signInDate:"+signInDate+":signInTime::"+signInTime+":signOutDate:"+signOutDate+":signOutTime::"+signOutTime);
|
||
params.add(signMins);
|
||
params.add(0);//attendanceMins
|
||
params.add(0);//beLateMins
|
||
params.add(0);//graveBeLateMins
|
||
params.add(0);//leaveEarlyMins
|
||
params.add(0);//graveLeaveEarlyMins
|
||
params.add(0);//absenteeismmins
|
||
bb.writeLog("userIdNew"+userId+"earlyInMinsNew"+earlyInMinsNew+"lateOutMinsNew"+lateOutMinsNew+"signMinsNew"+signMinsNew);
|
||
|
||
signMinsNew = signMinsNew - earlyInMinsNew;
|
||
if(signMinsNew<0){
|
||
signMinsNew=0;
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(signInTime)){
|
||
params.add(0);//forgotCheckMins
|
||
int jssjIndex = kqTimesArrayComInfo.getArrayindexByTimes(signInTime);
|
||
int checkIndex = kqTimesArrayComInfo.getArrayindexByTimes("18:30:00");
|
||
if(jssjIndex>checkIndex){
|
||
signMinsNew = signMinsNew + beLateMins;
|
||
signMinsNew = signMinsNew + 3;
|
||
}
|
||
}else{
|
||
params.add(0);//forgotCheckMins
|
||
}
|
||
|
||
params.add(0);//leaveMins
|
||
params.add("");//leaveInfo
|
||
params.add(0);//evectionMins
|
||
params.add(0);//outMins
|
||
params.add(0);//forgotBeginWorkCheckMins
|
||
// qc 刷卡加班时长 这个地方就直接下班减去上班
|
||
// LocalDate _signInDate = LocalDate.parse(signInDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||
// LocalTime _signInTime = LocalTime.parse(signInTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
|
||
// LocalDate _signOutDate = LocalDate.parse(signOutDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||
// LocalTime _signOutTime = LocalTime.parse(signOutTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
|
||
// LocalDateTime signInDateTime = LocalDateTime.of(_signInDate, _signInTime);
|
||
// LocalDateTime signOutDateTime = LocalDateTime.of(_signOutDate, _signOutTime);
|
||
// long minutesBetween = ChronoUnit.MINUTES.between(signInDateTime, signOutDateTime);
|
||
// params.add(minutesBetween);
|
||
if(StringUtils.isNotBlank(signOutTime)){
|
||
String endSub = signOutTime.substring(3,5);
|
||
if("27".equals(endSub)||"28".equals(endSub) || "29".equals(endSub)||"57".equals(endSub)||"58".equals(endSub) ||"59".equals(endSub)){
|
||
signMinsNew = signMinsNew + 3;
|
||
}
|
||
}
|
||
|
||
params.add(signMinsNew);
|
||
params.add(JSONObject.toJSONString(otherinfo));
|
||
}
|
||
|
||
Map<String,Object> definedFieldInfo = new KQFormatBiz().getDefinedField();
|
||
String[] definedFields = Util.splitString(Util.null2String(definedFieldInfo.get("definedField")),",");
|
||
KQReportFieldComInfo kqReportFieldComInfo = new KQReportFieldComInfo();
|
||
for (int tmpIdx = 0; tmpIdx<definedFields.length; tmpIdx++) {
|
||
String fieldname = definedFields[tmpIdx];
|
||
// System.out.println("fieldname=="+fieldname);
|
||
String fieldid = KQReportFieldComInfo.field2Id.get(fieldname);
|
||
String formula = kqReportFieldComInfo.getFormula(fieldid);
|
||
if(formula.length()==0)continue;
|
||
String expression = formula;
|
||
Pattern pattern = Pattern.compile("\\$\\{[^}]+\\}");
|
||
Matcher matcher = pattern.matcher(expression);
|
||
Map<String, Object> env = new HashMap<>();
|
||
String keyname = "";
|
||
while (matcher.find()) {
|
||
String key = matcher.group(0);
|
||
keyname = key.substring(2, key.length() - 1).trim();
|
||
expression = matcher.replaceAll(keyname);
|
||
env.put(keyname, keyname.equals("beLateMins")?beLateMins:leaveEarlyMins);
|
||
}
|
||
Expression compiledExp = AviatorEvaluator.compile(expression,true);
|
||
String value = Util.null2String(compiledExp.execute(env));
|
||
params.add(value);
|
||
if(value.equals("1")) {
|
||
params.add(keyname.equals("beLateMins") ? beLateMins : leaveEarlyMins);
|
||
}else{
|
||
params.add("0");
|
||
}
|
||
}
|
||
kqLog.info("format in >>>>>userId" + userId + "kqDate==" + kqDate+":hostIps:"+hostIps+":uuid::"+uuid
|
||
+":params:"+JSON.toJSONString(params));
|
||
Long id = IdGenerator.generate();
|
||
params.add(workTime.getDayType());
|
||
params.add(date);
|
||
params.add(date);
|
||
params.add(id);
|
||
lsParam.add(params);
|
||
}
|
||
} catch (Exception e) {
|
||
kqLog.info("考勤格式化生成数据报错:KQFormatData:");
|
||
StringWriter errorsWriter = new StringWriter();
|
||
e.printStackTrace(new PrintWriter(errorsWriter));
|
||
kqLog.info(errorsWriter.toString());
|
||
}
|
||
return lsParam;
|
||
}
|
||
|
||
public void setWriteLog(boolean writeLog) {
|
||
this.writeLog = writeLog;
|
||
}
|
||
|
||
public Map<String,Object> getLogInfo() {
|
||
return logInfo;
|
||
}
|
||
|
||
public void formatDateByKQDate(String kqdate) {
|
||
KQFormatBiz kqFormatBiz = new KQFormatBiz();
|
||
kqFormatBiz.formatDateByKQDate(kqdate);
|
||
}
|
||
|
||
public void formatDateByGroupId(String groupid, String kqdate) {
|
||
KQFormatBiz kqFormatBiz = new KQFormatBiz();
|
||
kqFormatBiz.formatDateByGroupId(groupid, kqdate);
|
||
}
|
||
|
||
public void formatDate(String resourceid, String kqdate) {
|
||
KQFormatBiz kqFormatBiz = new KQFormatBiz();
|
||
kqFormatBiz.formatDate(resourceid, kqdate);
|
||
}
|
||
|
||
public void delFormatData(String resourceid, String kqdate) {
|
||
KQFormatBiz kqFormatBiz = new KQFormatBiz();
|
||
kqFormatBiz.delFormatData(resourceid, kqdate);
|
||
}
|
||
|
||
/**
|
||
* 非工作日格式化考勤报表
|
||
* @param userId
|
||
* @param kqDate
|
||
* @param nonlsParam
|
||
* @param workTime
|
||
* @param workFlowInfo
|
||
*/
|
||
public void formatNonWork(String userId, String kqDate, List<Object> nonlsParam, WorkTimeEntity workTime, Map<String, Object> workFlowInfo) {
|
||
String signInId = "";
|
||
String signInDate = "";
|
||
String signInTime = "";
|
||
String signOutId = "";
|
||
String signOutDate = "";
|
||
String signOutTime = "";
|
||
int beginIdx = 0;
|
||
int endIdx = 0;
|
||
int leaveMins = 0;//请假时长
|
||
Map<String,Object> leaveInfo = new HashMap<>();//请假信息
|
||
int evectionMins = 0;//出差时长
|
||
int outMins = 0;//公出时长
|
||
int otherMins = 0;//异常流程时长
|
||
int[] dayMins = new int[2880];//一天所有分钟数
|
||
List<Object> workFlow = null;
|
||
String dateKey = userId + "|" + kqDate;
|
||
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo();
|
||
|
||
String preDate = DateUtil.addDate(kqDate, -1);//上一天日期
|
||
String nextDate = DateUtil.addDate(kqDate, 1);//下一天日期
|
||
WorkTimeEntity pre_workTime = new KQWorkTime().getWorkTime(userId, preDate);
|
||
List<TimeScopeEntity> pre_lsSignTime = new ArrayList<>();
|
||
|
||
if (pre_workTime != null) {
|
||
pre_lsSignTime = pre_workTime.getSignTime();//允许打卡时间
|
||
pre_lsSignTime = pre_lsSignTime != null ? pre_lsSignTime : new ArrayList<>();
|
||
}
|
||
WorkTimeEntity next_workTime = new KQWorkTime().getWorkTime(userId, nextDate);
|
||
List<TimeScopeEntity> next_lsSignTime = new ArrayList<>();
|
||
|
||
if (next_workTime != null) {
|
||
next_lsSignTime = next_workTime.getSignTime();//允许打卡时间
|
||
next_lsSignTime = next_lsSignTime != null ? next_lsSignTime : new ArrayList<>();
|
||
}
|
||
|
||
List<Object> lsCheckInfo = new KQFormatSignData().getNonWorkSignInfo(userId,preDate,kqDate,pre_lsSignTime,next_lsSignTime);
|
||
|
||
for (int j = 0; lsCheckInfo != null && j < lsCheckInfo.size(); j++) {
|
||
Map<String, Object> checkInfo = (Map<String, Object>) lsCheckInfo.get(j);
|
||
String signStatus = Util.null2String(checkInfo.get("signStatus"));
|
||
String signId = Util.null2String(checkInfo.get("signId"));
|
||
String signDate = Util.null2String(checkInfo.get("signDate"));
|
||
String signTime = Util.null2String(checkInfo.get("signTime"));
|
||
if (checkInfo.get("signType").equals("1")) {//签到
|
||
signInId = signId;
|
||
signInDate = signDate;
|
||
signInTime = signTime;
|
||
} else if (checkInfo.get("signType").equals("2")) {//签退
|
||
signOutId = signId;
|
||
signOutDate = signDate;
|
||
signOutTime = signTime;
|
||
}
|
||
}
|
||
|
||
if (workFlowInfo.get(dateKey) != null) {
|
||
workFlow = (List<Object>) workFlowInfo.get(dateKey);
|
||
}
|
||
|
||
for (int j = 0; workFlow != null && j < workFlow.size(); j++) {
|
||
Map<String, Object> data = (Map<String, Object>) workFlow.get(j);
|
||
String flowType = Util.null2String(data.get("flowtype"));
|
||
String newLeaveType = Util.null2String(data.get("newleavetype"));
|
||
beginIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("begintime")));
|
||
endIdx = kqTimesArrayComInfo.getArrayindexByTimes(Util.null2String(data.get("endtime")));
|
||
if(flowType.equals(FlowReportTypeEnum.EVECTION.getFlowType())){
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 7);//出差抵扣时段标识 7
|
||
}else if(flowType.equals(FlowReportTypeEnum.OUT.getFlowType())){
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 8);//公出抵扣时段标识 8
|
||
}else if(flowType.equalsIgnoreCase(FlowReportTypeEnum.LEAVE.getFlowType())){
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 5);//流程抵扣时段标识 5
|
||
int tmpBeginIdx = beginIdx;
|
||
int tmpEndIdx = endIdx;
|
||
Integer val = 0;
|
||
if(leaveInfo.get(newLeaveType)==null){
|
||
leaveInfo.put(newLeaveType,val);
|
||
}else{
|
||
val = (Integer) leaveInfo.get(newLeaveType);
|
||
}
|
||
if(tmpEndIdx>tmpBeginIdx){
|
||
leaveInfo.put(newLeaveType,val+(tmpEndIdx-tmpBeginIdx));
|
||
}
|
||
}
|
||
}else{
|
||
if (endIdx > beginIdx) {
|
||
Arrays.fill(dayMins, beginIdx, endIdx, 99);//异常流程抵扣时段标识99
|
||
}
|
||
}
|
||
}
|
||
|
||
for (int j = 0; j < 2880; j++) {
|
||
switch (dayMins[j]) {
|
||
case 5:
|
||
leaveMins++;
|
||
break;
|
||
case 7:
|
||
evectionMins++;
|
||
break;
|
||
case 8:
|
||
outMins++;
|
||
break;
|
||
case 99:
|
||
otherMins++;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
nonlsParam.add(userId);
|
||
nonlsParam.add(kqDate);
|
||
nonlsParam.add(workTime.getGroupId());
|
||
nonlsParam.add(0);
|
||
nonlsParam.add(signInDate);
|
||
nonlsParam.add(signInTime);
|
||
nonlsParam.add(signInId.length() == 0 ? null : signInId);
|
||
nonlsParam.add(signOutDate);
|
||
nonlsParam.add(signOutTime);
|
||
nonlsParam.add(signOutId.length() == 0 ? null : signOutId);
|
||
nonlsParam.add(leaveMins);
|
||
nonlsParam.add(JSONObject.toJSONString(leaveInfo));
|
||
nonlsParam.add(evectionMins);
|
||
nonlsParam.add(outMins);
|
||
nonlsParam.add(workTime.getDayType());
|
||
Timestamp date = new Timestamp(System.currentTimeMillis());
|
||
Long id = IdGenerator.generate();
|
||
nonlsParam.add(date);
|
||
nonlsParam.add(date);
|
||
nonlsParam.add(id);
|
||
}
|
||
|
||
/**
|
||
* 餐补计算
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static String mealCount(String userId,String date,RecordSet rs){
|
||
RecordSet rs1 = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
String sql = "select attendancedays from kq_format_total where resourceid = "+userId+" and kqdate = '"+date+"' ";
|
||
rs.executeQuery(sql);
|
||
String attendancedays = "0";
|
||
String jbscEnd = "";
|
||
if (rs.next()){
|
||
attendancedays = Util.null2String(rs.getString("attendancedays"));
|
||
}
|
||
bb.writeLog("mealCount == >userId:"+userId+" date:"+date+"attendancedays:"+attendancedays);
|
||
sql = "select field45 from cus_fielddata where id = "+userId+" and scope = 'HrmCustomFieldByInfoType' and scopeid = 3";
|
||
bb.writeLog("updateJbscN-sql:"+sql);
|
||
rs1.executeQuery(sql);
|
||
String field45 = "";
|
||
if(rs1.next()){
|
||
field45 = Util.null2String(rs1.getString("field45"));
|
||
}
|
||
String backValue = "0";
|
||
if(StringUtils.isNotBlank(field45)){
|
||
if(Double.valueOf(attendancedays)<=0.5 && Double.valueOf(attendancedays) >0){
|
||
backValue = multiply("0.5",field45);
|
||
}else if(Double.valueOf(attendancedays)>0.5){
|
||
backValue = field45;
|
||
}
|
||
}
|
||
|
||
return backValue;
|
||
}
|
||
|
||
/**
|
||
* 查询自定义字段的值
|
||
* @param id
|
||
* @param fieldname
|
||
* @param scopeid
|
||
* @return
|
||
*/
|
||
public static String getCusFieldData(Integer id,String fieldname,int scopeid){
|
||
String fieldVal = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select "+fieldname+" from cus_fielddata where id=? and scopeid=? and scope='HrmCustomFieldByInfoType' ";
|
||
rs.executeQuery(sql,id,scopeid);
|
||
if(rs.next()){
|
||
fieldVal = Util.null2String(rs.getString(fieldname));
|
||
}
|
||
return fieldVal;
|
||
}
|
||
|
||
|
||
/**
|
||
* 提供精确的乘法运算。
|
||
* @param v1 被加数
|
||
* @param v2 加数
|
||
* @return 两个参数的和
|
||
*/
|
||
public static String multiply(String v1, String v2) {
|
||
BigDecimal b1 = new BigDecimal(v1);
|
||
BigDecimal b2 = new BigDecimal(v2);
|
||
return b1.multiply(b2).toString();
|
||
}
|
||
|
||
/**
|
||
* 加班申请时长和刷卡加班时长比较逻辑
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static String updateJbscN(String userId,String date,boolean ifneedbj,Integer rqlx,RecordSet rs){
|
||
RecordSet rs1 = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
String sql = "select cardOvertime from kq_format_total where resourceid = "+userId+" and kqdate = '"+date+"' ";
|
||
rs.executeQuery(sql);
|
||
String cardOvertime = "0";
|
||
String jbscEnd = "";
|
||
if (rs.next()){
|
||
cardOvertime = Util.null2String(rs.getString("cardOvertime"));
|
||
}
|
||
bb.writeLog("updateJbscN == >userId:"+userId+" date:"+date+"cardOvertime:"+cardOvertime);
|
||
|
||
if(!ifneedbj){
|
||
Double zlMinsNew = Double.parseDouble(cardOvertime);
|
||
String bxsWeekZr = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
//刷卡加班时长
|
||
String skjbcsy = divide(bxsWeekZr,"60");
|
||
double skjbcsyD = Util.getDoubleValue(skjbcsy, 0);
|
||
bb.writeLog("skjbcsyD:"+skjbcsyD);
|
||
jbscEnd = skjbcsy;
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "-1";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime("",userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}else{
|
||
sql = "select sch,skjbcsy,jbbcfs,lcid from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (1,2)";
|
||
bb.writeLog("updateJbscN-sql:"+sql);
|
||
rs1.executeQuery(sql);
|
||
if(rs1.next()){
|
||
//加班申请时长
|
||
// String sch = Util.null2String(rs1.getString("sch"));
|
||
String sch = geSchWs(userId,date);
|
||
Double zlMinsNew = Double.parseDouble(cardOvertime);
|
||
String bxsWeekZr = String.valueOf(changeBxs(zlMinsNew.intValue()));
|
||
//刷卡加班时长
|
||
String skjbcsy = divide(bxsWeekZr,"60");
|
||
//加班补偿方式
|
||
String jbbcfs = Util.null2String(rs1.getString("jbbcfs"));
|
||
//请求id
|
||
String lcid = Util.null2String(rs1.getString("lcid"));
|
||
|
||
double schD = Util.getDoubleValue(sch, 0);
|
||
double skjbcsyD = Util.getDoubleValue(skjbcsy, 0);
|
||
bb.writeLog("schD:"+schD+"skjbcsyD:"+skjbcsyD);
|
||
|
||
if( schD>skjbcsyD){
|
||
jbscEnd = skjbcsy;
|
||
}else {
|
||
jbscEnd = sch;
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
if("1".equals(jbbcfs)){
|
||
tiaoxiuId = "-1";
|
||
paidLeaveEnable = "0";
|
||
}else if ("0".equals(jbbcfs)){
|
||
paidLeaveEnable = "1";
|
||
//假期类型的缓存类
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
//[调休]的假期类型的ID
|
||
String leaveRulesId = "";
|
||
//找到[调休]的假期类型ID
|
||
rulesComInfo.setTofirstRow();
|
||
while (rulesComInfo.next()) {
|
||
if (KQLeaveRulesBiz.isTiaoXiu(rulesComInfo.getId())) {
|
||
if("1".equals(rulesComInfo.getIsEnable())){
|
||
leaveRulesId = rulesComInfo.getId();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//所属年份
|
||
String belongYear = date.substring(0, 4);
|
||
//失效日期
|
||
String expirationDate = "";
|
||
//根据有效期规则获取有效日期
|
||
expirationDate = KQBalanceOfLeaveBiz.getExpirationDate(leaveRulesId, userId, belongYear, date, expirationDate);
|
||
//日折算时长
|
||
// double hoursToDay = 8.00;
|
||
// BigDecimal _hoursToDay = new BigDecimal("" + hoursToDay);
|
||
// BigDecimal _durationOfOvertime = new BigDecimal(Util.null2s(jbscEnd, "0"));
|
||
// //加班时长类型为小时、调休单位为天----将加班时长转换为天
|
||
// _durationOfOvertime = _durationOfOvertime.divide(_hoursToDay, 5, RoundingMode.HALF_UP);
|
||
String _belongYear = date.substring(0, 4);
|
||
String _belongMonth = date.substring(5, 7);
|
||
Timestamp date1 = KQDateUtil.getUpdateTimeStamp();
|
||
bb.writeLog("expirationDate:"+expirationDate+"leaveRulesId:"+leaveRulesId);
|
||
String tiaoxFind = findTiaoXiuAmount(leaveRulesId,userId,date);
|
||
bb.writeLog("tiaoxFind:"+tiaoxFind);
|
||
if(StringUtils.isNotBlank(tiaoxFind)){
|
||
//更新
|
||
String updateSql = "update KQ_BalanceOfLeave set tiaoxiuamount=? where resourceId=? and effectiveDate=? and leaveRulesId=? and isDelete=0";
|
||
rs1.executeUpdate(updateSql,divide(jbscEnd,"8"),userId,date,leaveRulesId);
|
||
}else {
|
||
//插入
|
||
String sqlInsert = "insert into kq_balanceOfLeave(leaveRulesId,resourceId,belongYear,belongMonth,baseAmount,tiaoxiuamount,usedAmount,baseAmount2,extraAmount2,usedAmount2,status,expirationDate,effectiveDate,overtimeType,isDelete,create_time,update_time,creator,changetype) " +
|
||
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
rs1.executeUpdate(sqlInsert, leaveRulesId, userId, _belongYear, _belongMonth, 0, divide(jbscEnd,"8"), 0, 0, 0, 0, 0, expirationDate, date, "4", 0,date1,date1,Util.getIntValue(userId),changeType);
|
||
}
|
||
|
||
//获取刚才插入的调休明细的ID
|
||
sql = "select max(id) from kq_balanceOfLeave where leaveRulesId=? and resourceId=? and belongYear=?";
|
||
rs1.executeQuery(sql, leaveRulesId, userId, belongYear);
|
||
if (rs1.next()) {
|
||
tiaoxiuId = rs1.getString(1);
|
||
}
|
||
bb.writeLog("tiaoxiuId:"+tiaoxiuId);
|
||
}
|
||
if(StringUtils.isNotBlank(tiaoxiuId)){
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime(lcid,userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
return StringUtils.isBlank(jbscEnd)?"0":jbscEnd;
|
||
}
|
||
|
||
/**
|
||
* 休息日白天加班时长比较逻辑
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static Map<String,String> updateJbscXxr(String userId,String date,String dksc,boolean ifneedBj,Integer rqlx,RecordSet rs){
|
||
BaseBean bb = new BaseBean();
|
||
bb.writeLog("updateJbscN == >userId:"+userId+" date:"+date);
|
||
Map<String,String> zrjbInfo = new HashMap<>();
|
||
String jbscEnd = "";
|
||
|
||
if(!ifneedBj){
|
||
jbscEnd = dksc;
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "-1";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime("",userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}else{
|
||
String sql = "select sch,skjbcsy,jbbcfs,lcid from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (0)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
//加班申请时长
|
||
String sch = geSch(userId,date);
|
||
//加班补偿方式
|
||
String jbbcfs = Util.null2String(rs.getString("jbbcfs"));
|
||
//请求id
|
||
String lcid = Util.null2String(rs.getString("lcid"));
|
||
|
||
double schD = Util.getDoubleValue(sch, 0);
|
||
double skjbcsyD = Util.getDoubleValue(dksc, 0);
|
||
|
||
|
||
if( schD>skjbcsyD){
|
||
jbscEnd = dksc;
|
||
}else {
|
||
jbscEnd = sch;
|
||
}
|
||
bb.writeLog(userId+"schD:"+schD+"skjbcsyD:"+skjbcsyD+"jbscEnd"+jbscEnd);
|
||
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
if("1".equals(jbbcfs)){
|
||
tiaoxiuId = "-1";
|
||
paidLeaveEnable = "0";
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}else if ("0".equals(jbbcfs)){
|
||
paidLeaveEnable = "1";
|
||
//假期类型的缓存类
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
//[调休]的假期类型的ID
|
||
String leaveRulesId = "";
|
||
//找到[调休]的假期类型ID
|
||
rulesComInfo.setTofirstRow();
|
||
while (rulesComInfo.next()) {
|
||
if (KQLeaveRulesBiz.isTiaoXiu(rulesComInfo.getId())) {
|
||
if("1".equals(rulesComInfo.getIsEnable())){
|
||
leaveRulesId = rulesComInfo.getId();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//所属年份
|
||
String belongYear = date.substring(0, 4);
|
||
//失效日期
|
||
String expirationDate = "";
|
||
//根据有效期规则获取有效日期
|
||
expirationDate = KQBalanceOfLeaveBiz.getExpirationDate(leaveRulesId, userId, belongYear, date, expirationDate);
|
||
String _belongYear = date.substring(0, 4);
|
||
String _belongMonth = date.substring(5, 7);
|
||
Timestamp date1 = KQDateUtil.getUpdateTimeStamp();
|
||
bb.writeLog("expirationDate:"+expirationDate+"leaveRulesId:"+leaveRulesId);
|
||
String tiaoxFind = findTiaoXiuAmount(leaveRulesId,userId,date);
|
||
bb.writeLog("tiaoxFind:"+tiaoxFind);
|
||
if(StringUtils.isNotBlank(tiaoxFind)){
|
||
//更新
|
||
String updateSql = "update KQ_BalanceOfLeave set tiaoxiuamount=? where resourceId=? and effectiveDate=? and leaveRulesId=? and isDelete=0";
|
||
rs.executeUpdate(updateSql,divide(jbscEnd,"8"),userId,date,leaveRulesId);
|
||
}else {
|
||
//插入
|
||
String sqlInsert = "insert into kq_balanceOfLeave(leaveRulesId,resourceId,belongYear,belongMonth,baseAmount,tiaoxiuamount,usedAmount,baseAmount2,extraAmount2,usedAmount2,status,expirationDate,effectiveDate,overtimeType,isDelete,create_time,update_time,creator,changetype) " +
|
||
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
rs.executeUpdate(sqlInsert, leaveRulesId, userId, _belongYear, _belongMonth, 0, divide(jbscEnd,"8"), 0, 0, 0, 0, 0, expirationDate, date, "4", 0,date1,date1,Util.getIntValue(userId),changeType);
|
||
}
|
||
|
||
//获取刚才插入的调休明细的ID
|
||
sql = "select max(id) from kq_balanceOfLeave where leaveRulesId=? and resourceId=? and belongYear=?";
|
||
rs.executeQuery(sql, leaveRulesId, userId, belongYear);
|
||
if (rs.next()) {
|
||
tiaoxiuId = rs.getString(1);
|
||
}
|
||
bb.writeLog("tiaoxiuId:"+tiaoxiuId);
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts",jbscEnd);
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(tiaoxiuId)){
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime(lcid,userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}else{
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
return zrjbInfo;
|
||
}
|
||
|
||
|
||
/**
|
||
* 休息日白天加班时长比较逻辑(周日)
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static Map<String,String> updateJbscXxrZr(String userId,String date,String dksc,boolean ifneedBj,Integer rqlx,RecordSet rs){
|
||
BaseBean bb = new BaseBean();
|
||
bb.writeLog("updateJbscN == >userId:"+userId+" date:"+date);
|
||
Map<String,String> zrjbInfo = new HashMap<>();
|
||
String jbscEnd = "";
|
||
|
||
if(!ifneedBj){
|
||
jbscEnd = dksc;
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "-1";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime("",userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}else{
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}
|
||
}else{
|
||
String sql = "select sch,skjbcsy,jbbcfs,lcid from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (0)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
//加班申请时长
|
||
// String sch = Util.null2String(rs.getString("sch"));
|
||
String sch = geSch(userId,date);
|
||
//加班补偿方式
|
||
String jbbcfs = Util.null2String(rs.getString("jbbcfs"));
|
||
//请求id
|
||
String lcid = Util.null2String(rs.getString("lcid"));
|
||
|
||
double schD = Util.getDoubleValue(sch, 0);
|
||
double skjbcsyD = Util.getDoubleValue(dksc, 0);
|
||
bb.writeLog("schD:"+schD+"skjbcsyD:"+skjbcsyD);
|
||
|
||
if( schD>skjbcsyD){
|
||
jbscEnd = dksc;
|
||
}else {
|
||
jbscEnd = sch;
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
if("1".equals(jbbcfs)){
|
||
tiaoxiuId = "-1";
|
||
paidLeaveEnable = "0";
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}else if ("0".equals(jbbcfs)){
|
||
paidLeaveEnable = "1";
|
||
//假期类型的缓存类
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
//[调休]的假期类型的ID
|
||
String leaveRulesId = "";
|
||
//找到[调休]的假期类型ID
|
||
rulesComInfo.setTofirstRow();
|
||
while (rulesComInfo.next()) {
|
||
if (KQLeaveRulesBiz.isTiaoXiu(rulesComInfo.getId())) {
|
||
if("1".equals(rulesComInfo.getIsEnable())){
|
||
leaveRulesId = rulesComInfo.getId();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//所属年份
|
||
String belongYear = date.substring(0, 4);
|
||
//失效日期
|
||
String expirationDate = "";
|
||
//根据有效期规则获取有效日期
|
||
expirationDate = KQBalanceOfLeaveBiz.getExpirationDate(leaveRulesId, userId, belongYear, date, expirationDate);
|
||
//日折算时长
|
||
// double hoursToDay = 8.00;
|
||
//
|
||
// BigDecimal _hoursToDay = new BigDecimal("" + hoursToDay);
|
||
// BigDecimal _durationOfOvertime = new BigDecimal(Util.null2s(jbscEnd, "0"));
|
||
// //加班时长类型为小时、调休单位为天----将加班时长转换为天
|
||
// _durationOfOvertime = _durationOfOvertime.divide(_hoursToDay, 5, RoundingMode.HALF_UP);
|
||
String _belongYear = date.substring(0, 4);
|
||
String _belongMonth = date.substring(5, 7);
|
||
Timestamp date1 = KQDateUtil.getUpdateTimeStamp();
|
||
bb.writeLog("expirationDate:"+expirationDate+"leaveRulesId:"+leaveRulesId);
|
||
String tiaoxFind = findTiaoXiuAmount(leaveRulesId,userId,date);
|
||
bb.writeLog("tiaoxFind:"+tiaoxFind);
|
||
if(StringUtils.isNotBlank(tiaoxFind)){
|
||
//更新
|
||
String updateSql = "update KQ_BalanceOfLeave set tiaoxiuamount=? where resourceId=? and effectiveDate=? and leaveRulesId=? and isDelete=0";
|
||
rs.executeUpdate(updateSql,divide(jbscEnd,"8"),userId,date,leaveRulesId);
|
||
}else {
|
||
//插入
|
||
String sqlInsert = "insert into kq_balanceOfLeave(leaveRulesId,resourceId,belongYear,belongMonth,baseAmount,tiaoxiuamount,usedAmount,baseAmount2,extraAmount2,usedAmount2,status,expirationDate,effectiveDate,overtimeType,isDelete,create_time,update_time,creator,changetype) " +
|
||
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
rs.executeUpdate(sqlInsert, leaveRulesId, userId, _belongYear, _belongMonth, 0, divide(jbscEnd,"8"), 0, 0, 0, 0, 0, expirationDate, date, "4", 0,date1,date1,Util.getIntValue(userId),changeType);
|
||
}
|
||
|
||
//获取刚才插入的调休明细的ID
|
||
sql = "select max(id) from kq_balanceOfLeave where leaveRulesId=? and resourceId=? and belongYear=?";
|
||
rs.executeQuery(sql, leaveRulesId, userId, belongYear);
|
||
if (rs.next()) {
|
||
tiaoxiuId = rs.getString(1);
|
||
}
|
||
bb.writeLog("tiaoxiuId:"+tiaoxiuId);
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts",jbscEnd);
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(tiaoxiuId)){
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime(lcid,userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}else{
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
return zrjbInfo;
|
||
}
|
||
|
||
/**
|
||
* 白天加班时长比较逻辑(节假日)
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static Map<String,String> updateJbscJjr(String userId,String date,String dksc,boolean ifneedBj,Integer rqlx,RecordSet rs){
|
||
BaseBean bb = new BaseBean();
|
||
bb.writeLog("updateJbscN == >userId:"+userId+" date:"+date);
|
||
Map<String,String> zrjbInfo = new HashMap<>();
|
||
String jbscEnd = "";
|
||
|
||
if(!ifneedBj){
|
||
jbscEnd = dksc;
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "-1";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime("",userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}else{
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}
|
||
}else{
|
||
String sql = "select sch,skjbcsy,jbbcfs,lcid from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (3)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
//加班申请时长
|
||
// String sch = Util.null2String(rs.getString("sch"));
|
||
String sch = geSchJjr(userId,date);
|
||
//加班补偿方式
|
||
String jbbcfs = Util.null2String(rs.getString("jbbcfs"));
|
||
//请求id
|
||
String lcid = Util.null2String(rs.getString("lcid"));
|
||
|
||
double schD = Util.getDoubleValue(sch, 0);
|
||
double skjbcsyD = Util.getDoubleValue(dksc, 0);
|
||
bb.writeLog("schD:"+schD+"skjbcsyD:"+skjbcsyD);
|
||
|
||
if( schD>skjbcsyD){
|
||
jbscEnd = dksc;
|
||
}else {
|
||
jbscEnd = sch;
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(jbscEnd)){
|
||
//先生成调休
|
||
String tiaoxiuId = "";
|
||
String paidLeaveEnable = "0";
|
||
int changeType = KQOvertimeRulesBiz.getChangeType(userId, date);
|
||
if(rqlx == 0){
|
||
changeType = 2;
|
||
}else if(rqlx == 1 || rqlx == 2){
|
||
changeType = 3;
|
||
}else if(rqlx == 3){
|
||
changeType = 1;
|
||
}
|
||
if("1".equals(jbbcfs)){
|
||
tiaoxiuId = "-1";
|
||
paidLeaveEnable = "0";
|
||
zrjbInfo.put("zrjb",jbscEnd);
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}else if ("0".equals(jbbcfs)){
|
||
paidLeaveEnable = "1";
|
||
//假期类型的缓存类
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
//[调休]的假期类型的ID
|
||
String leaveRulesId = "";
|
||
//找到[调休]的假期类型ID
|
||
rulesComInfo.setTofirstRow();
|
||
while (rulesComInfo.next()) {
|
||
if (KQLeaveRulesBiz.isTiaoXiu(rulesComInfo.getId())) {
|
||
if("1".equals(rulesComInfo.getIsEnable())){
|
||
leaveRulesId = rulesComInfo.getId();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//所属年份
|
||
String belongYear = date.substring(0, 4);
|
||
//失效日期
|
||
String expirationDate = "";
|
||
//根据有效期规则获取有效日期
|
||
expirationDate = KQBalanceOfLeaveBiz.getExpirationDate(leaveRulesId, userId, belongYear, date, expirationDate);
|
||
//日折算时长
|
||
// double hoursToDay = 8.00;
|
||
//
|
||
// BigDecimal _hoursToDay = new BigDecimal("" + hoursToDay);
|
||
// BigDecimal _durationOfOvertime = new BigDecimal(Util.null2s(jbscEnd, "0"));
|
||
// //加班时长类型为小时、调休单位为天----将加班时长转换为天
|
||
// _durationOfOvertime = _durationOfOvertime.divide(_hoursToDay, 5, RoundingMode.HALF_UP);
|
||
String _belongYear = date.substring(0, 4);
|
||
String _belongMonth = date.substring(5, 7);
|
||
Timestamp date1 = KQDateUtil.getUpdateTimeStamp();
|
||
bb.writeLog("expirationDate:"+expirationDate+"leaveRulesId:"+leaveRulesId);
|
||
String tiaoxFind = findTiaoXiuAmount(leaveRulesId,userId,date);
|
||
bb.writeLog("tiaoxFind:"+tiaoxFind);
|
||
if(StringUtils.isNotBlank(tiaoxFind)){
|
||
//更新
|
||
String updateSql = "update KQ_BalanceOfLeave set tiaoxiuamount=? where resourceId=? and effectiveDate=? and leaveRulesId=? and isDelete=0";
|
||
rs.executeUpdate(updateSql,divide(jbscEnd,"8"),userId,date,leaveRulesId);
|
||
}else {
|
||
//插入
|
||
String sqlInsert = "insert into kq_balanceOfLeave(leaveRulesId,resourceId,belongYear,belongMonth,baseAmount,tiaoxiuamount,usedAmount,baseAmount2,extraAmount2,usedAmount2,status,expirationDate,effectiveDate,overtimeType,isDelete,create_time,update_time,creator,changetype) " +
|
||
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
rs.executeUpdate(sqlInsert, leaveRulesId, userId, _belongYear, _belongMonth, 0, divide(jbscEnd,"8"), 0, 0, 0, 0, 0, expirationDate, date, "4", 0,date1,date1,Util.getIntValue(userId),changeType);
|
||
}
|
||
|
||
//获取刚才插入的调休明细的ID
|
||
sql = "select max(id) from kq_balanceOfLeave where leaveRulesId=? and resourceId=? and belongYear=?";
|
||
rs.executeQuery(sql, leaveRulesId, userId, belongYear);
|
||
if (rs.next()) {
|
||
tiaoxiuId = rs.getString(1);
|
||
}
|
||
bb.writeLog("tiaoxiuId:"+tiaoxiuId);
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts",jbscEnd);
|
||
}
|
||
|
||
if(StringUtils.isNotBlank(tiaoxiuId)){
|
||
String jbscEndD = String.format("%.2f", Util.getDoubleValue(jbscEnd, 0)*60);
|
||
insertOverTime(lcid,userId,date,jbscEndD,changeType,tiaoxiuId,paidLeaveEnable);
|
||
}
|
||
}else{
|
||
zrjbInfo.put("zrjb","0");
|
||
zrjbInfo.put("zrjbzts","0");
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
return zrjbInfo;
|
||
}
|
||
|
||
/**
|
||
* 获取流程同一天的加班申请时长汇总(夜班)
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSchWs(String userId,String date){
|
||
String sc = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select sum(sch) as sc from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (1,2)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sc = Util.null2String(rs.getString("sc"));
|
||
}
|
||
return sc;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取指定日期调休假已申请时长
|
||
* @param date
|
||
* @param resourceid
|
||
* @return
|
||
*/
|
||
private static String getTxTime(String date,String resourceid,String type,RecordSet rs){
|
||
String sql = "select sum(CAST(d_mins AS INT)) as leaveMins from kq_flow_split_leave where newleavetype = '"+type+"' and belongdate = '"+date+"' and leavebackrequestid is null and resourceid = "+resourceid;
|
||
rs.executeQuery(sql);
|
||
String leaveMins = "";
|
||
if (rs.next()){
|
||
leaveMins = Util.null2String(rs.getString("leaveMins"));
|
||
}
|
||
if (StringUtils.isBlank(leaveMins)){
|
||
leaveMins = "0";
|
||
}
|
||
return leaveMins;
|
||
}
|
||
|
||
/**
|
||
* 判断是否有加班申请
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Boolean checkJbsq(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 判断是否有连班加班申请
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Boolean checkLbJbsq(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from uf_lbjbsq where sqr = "+userId+" and ksrq = '"+date+"'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 获取流程同一天的加班申请时长汇总(白班)
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSch(String userId,String date){
|
||
String sc = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select sum(sch) as sc from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (0)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sc = Util.null2String(rs.getString("sc"));
|
||
}
|
||
return sc;
|
||
}
|
||
|
||
/**
|
||
* 获取流程同一天的加班申请时长汇总(白班)
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSchJjr(String userId,String date){
|
||
String sc = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select sum(sch) as sc from uf_jbsqhz where sqr = "+userId+" and sqrq = '"+date+"' and jblx in (3)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sc = Util.null2String(rs.getString("sc"));
|
||
}
|
||
return sc;
|
||
}
|
||
|
||
/**
|
||
* 半小时转换
|
||
* @param value
|
||
* @return
|
||
*/
|
||
public static Integer changeBxs(Integer value){
|
||
return (value / 30)*30 ;
|
||
}
|
||
|
||
/**
|
||
* 补卡次数计算
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static Integer bkcsCreate(String userId,String date,RecordSet rs){
|
||
Integer bkcs = 0;
|
||
KQFlowCardUtil kqFlowCardUtil = new KQFlowCardUtil();
|
||
try {
|
||
ResourceComInfo resourceComInfo = new ResourceComInfo();
|
||
String subcompanyId = resourceComInfo.getSubCompanyID(userId);
|
||
String sql = "select signDate,signTime,signFrom from HrmScheduleSign where signFrom like 'card%' and userID = "+userId+" and signDate>= DATEADD(day,-1,'"+date+"') and signDate<= DATEADD(day,1,'"+date+"')";
|
||
rs.executeQuery(sql);
|
||
while (rs.next()){
|
||
String signDate = Util.null2String(rs.getString("signDate"));
|
||
String signTime = Util.null2String(rs.getString("signTime"));
|
||
String signFrom = Util.null2String(rs.getString("signFrom"));
|
||
String belongDate = kqFlowCardUtil.getBelongDate(userId, signDate, signTime);
|
||
//补卡流程明细表id
|
||
String detailId = signFrom.split("\\|")[6];
|
||
if("1".equals(subcompanyId)||"3".equals(subcompanyId)){
|
||
//新公司不用判断是否忘打卡
|
||
if(belongDate.equals(date)){
|
||
bkcs++;
|
||
}
|
||
}else{
|
||
//判断是否忘打卡
|
||
boolean checkWdk = checkBklx(detailId);
|
||
if(checkWdk && belongDate.equals(date)){
|
||
bkcs++;
|
||
}
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
|
||
return bkcs;
|
||
}
|
||
|
||
/**
|
||
* 有薪假天数计算
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String getZcgzTs(String userId,String date,BaseBean bb,RecordSet rs){
|
||
//有薪假时长
|
||
String scYxj = getQjts(userId,date,rs);
|
||
//有薪假退假时长
|
||
String scYxjTj = getTjts(userId,date,rs);
|
||
if(StringUtils.isBlank(scYxj)){
|
||
scYxj = "0";
|
||
}
|
||
if(StringUtils.isBlank(scYxjTj)){
|
||
scYxjTj = "0";
|
||
}
|
||
String endDay = divide(sub(scYxj,scYxjTj),"480");
|
||
bb.writeLog("scYxj:"+scYxj+"scYxjTj:"+scYxjTj+"endDay:"+endDay);
|
||
return endDay;
|
||
}
|
||
|
||
/**
|
||
* 获取实际出勤天数
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSjcqts(String userId,String date,RecordSet rs){
|
||
String sjtsDay = "";
|
||
String sql = " select attendancedays from kq_format_total where resourceid ="+userId+" and kqdate = '"+date+"'";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsDay = Util.null2String(rs.getString("attendancedays"));
|
||
}
|
||
return sjtsDay;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取实际出勤时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSjcqsc(String userId,String date,RecordSet rs){
|
||
String sjtsMins = "";
|
||
String sql = " select (attendancemins+belatemins) as attendancemins from kq_format_total where resourceid ="+userId+" and kqdate = '"+date+"'";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsMins = Util.null2String(rs.getString("attendancemins"));
|
||
Integer mins = Integer.valueOf(sjtsMins);
|
||
if(mins>480){
|
||
sjtsMins = "480";
|
||
}
|
||
}
|
||
return sjtsMins;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取周六或周日白天打卡时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSignMinsWeek(String userId,String date,RecordSet rs){
|
||
String sjtsDay = "";
|
||
String sql = "select sum(dksc) as signMins from uf_dksc where xbk <='18:30' and dkrq = '"+date+"' and xm = "+userId;
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsDay = Util.null2String(rs.getString("signMins"));
|
||
}
|
||
return sjtsDay;
|
||
}
|
||
|
||
/**
|
||
* 获取周六或周日白天打卡时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSignMinsWeekNew(String userId,String date,RecordSet rs){
|
||
String sjtsDay = "";
|
||
String sql = "select sum(dksc) as signMins from uf_dksc where xbk <='18:45' and dkrq = '"+date+"' and xm = "+userId;
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsDay = Util.null2String(rs.getString("signMins"));
|
||
}
|
||
return sjtsDay;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取周六或周日夜班打卡时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geSignMinsWeekY(String userId,String date,RecordSet rs){
|
||
String sjtsDay = "";
|
||
String sql = "select sum(dksc) as signMins from uf_dksc where dkrq = '"+date+"' and xm = "+userId;
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsDay = Util.null2String(rs.getString("signMins"));
|
||
}
|
||
return sjtsDay;
|
||
}
|
||
|
||
/**
|
||
* 获取有薪假时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String getQjts(String userId,String date,RecordSet rs){
|
||
String sjtsMins = "";
|
||
String sql = "select sum(CONVERT(INT, D_mins)) sc from kq_flow_split_leave where resourceid = "+userId+" and belongDate = '"+date+"'\n" +
|
||
" and newleavetype in (select jb from uf_yxjpz where sfyxj = 0)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsMins = Util.null2String(rs.getString("sc"));
|
||
}
|
||
return sjtsMins;
|
||
}
|
||
|
||
/**
|
||
* 获取有薪假销假时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String getTjts(String userId,String date,RecordSet rs){
|
||
String sjtsMins = "";
|
||
String sql = "select sum(CONVERT(INT, D_mins)) sc from kq_flow_split_leaveback where resourceid = "+userId+" and belongDate = '"+date+"'\n" +
|
||
" and newleavetype in (select jb from uf_yxjpz where sfyxj = 0)";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
sjtsMins = Util.null2String(rs.getString("sc"));
|
||
}
|
||
return sjtsMins;
|
||
}
|
||
|
||
/**
|
||
* 判断补卡类型是不是忘打卡
|
||
* @param id
|
||
* @return
|
||
*/
|
||
public static Boolean checkBklx(String id){
|
||
Boolean tiaoxiuamount = false;
|
||
BaseBean bb = new BaseBean();
|
||
//补卡流程表名
|
||
String bklc = bb.getPropValue("jgKq_main","bklc");
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select bkyy from "+bklc+"_dt1 where id=? and bkyy=0";
|
||
rs.executeQuery(sql,id);
|
||
if(rs.getCounts()>0){
|
||
tiaoxiuamount = true;
|
||
}
|
||
return tiaoxiuamount;
|
||
}
|
||
|
||
/**
|
||
* 判断是否是夜班
|
||
* @param serialid
|
||
* @return
|
||
*/
|
||
private static Boolean checkYb(String serialid){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from kq_ShiftManagement where id = "+serialid+" and serial like '%夜班%'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 判断是否是公休班
|
||
* @param serialid
|
||
* @return
|
||
*/
|
||
private static Boolean checkGxb(String serialid){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from kq_ShiftManagement where id = "+serialid+" and serial like '%公休班%'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 判断当天是否有打卡
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Boolean checkDk(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from kq_format_detail where resourceid ="+userId+" and kqdate = '"+date+"' and signinid is not null and signoutid is not null\n";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 打卡时长先清空
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static void deleteSignInfoMo(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
bb.writeLog("deleteSignInfoMo == >userId:"+userId+" date:"+date);
|
||
//先删除当天历史生成数据
|
||
String deleteSql = "delete from uf_dksc where xm = "+userId+" and dkrq = '"+date+"'";
|
||
bb.writeLog("deleteSql:"+deleteSql);
|
||
rs.executeUpdate(deleteSql);
|
||
}
|
||
|
||
|
||
/**
|
||
* 判断当天是否有考勤数据
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Boolean checkSignInfoMo(String userId,String date,String sbk,String xbk){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from uf_dksc where xm = "+userId+" and dkrq = '"+date+"' and sbk = '"+sbk+"' and xbk = '"+xbk+"'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 格式化生成打卡时长
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public static void createSignInfoMo(String userId,String date,Integer signMins,String signInTimes,String signOutTimes){
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
String signInTimesNew = StringUtils.isNotBlank(signInTimes)?signInTimes.substring(0,5):"";
|
||
String signOutTimesNew = StringUtils.isNotBlank(signOutTimes)?signOutTimes.substring(0,5):"";
|
||
bb.writeLog("createSignInfoMo == >userId:"+userId+" date:"+date);
|
||
if(StringUtils.isNotBlank(signInTimesNew) && StringUtils.isNotBlank(signOutTimesNew)){
|
||
if(checkSignInfoMo(userId,date,signInTimesNew,signOutTimesNew)){
|
||
String sqlupdate = "update uf_dksc set dksc = ? where xm = ? and dkrq = ? and sbk = ? and xbk = ?";
|
||
rs.executeUpdate(sqlupdate,signMins,userId,date,signInTimesNew,signOutTimesNew);
|
||
}else{
|
||
//插入
|
||
String idNew = "";
|
||
int modeid = getFormModeIdByCubeName("uf_dksc");
|
||
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
|
||
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
|
||
String modedatacreatedate = sdfDate.format(new Date());
|
||
String modedatacreatetime = sdfTime.format(new Date());
|
||
String sqlMode = "insert into uf_dksc (xm,dkrq,sbk,xbk,dksc,FORMMODEID,MODEDATACREATER,MODEDATACREATERTYPE,MODEDATACREATEDATE,MODEDATACREATETIME) \n" +
|
||
"values (?,?,?,?,?,?,?,?,?,?)";
|
||
rs.executeUpdate(sqlMode, userId,date,signInTimesNew,signOutTimesNew,signMins,modeid, userId, "0", modedatacreatedate, modedatacreatetime);
|
||
|
||
RecordSet findNew = new RecordSet();
|
||
String sqlFindnew ="select Id from uf_dksc where xm = "+userId+" and dkrq = '"+date+"' order by" +
|
||
" modedatacreatedate desc,modedatacreatetime desc";
|
||
findNew.execute(sqlFindnew);
|
||
bb.writeLog("findSqlNew:"+sqlFindnew);
|
||
if (findNew.next()){
|
||
idNew = Util.null2String(findNew.getString("id"));
|
||
}
|
||
bb.writeLog("idNew:"+idNew);
|
||
// 权限重构
|
||
int dataId = 0;
|
||
if(StringUtils.isNotBlank(idNew)){
|
||
dataId = Integer.valueOf(idNew);
|
||
}
|
||
|
||
ModeRightInfo modeRightInfo = new ModeRightInfo();
|
||
modeRightInfo.editModeDataShare(Integer.valueOf(userId), modeid, dataId);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断当天是否有考勤数据
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Integer checkKqModeInfo(String userId,String date,RecordSet rs){
|
||
String sql = "select count(*) as cont from uf_gshsj where xm = "+userId+" and rq = '"+date+"'";
|
||
rs.execute(sql);
|
||
Integer check = 0;
|
||
if(rs.next()){
|
||
check = Util.getIntValue(rs.getString("cont"));
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 删除台账数据
|
||
*/
|
||
public synchronized static void deleteKqModeInfo(String userId,String date){
|
||
|
||
RecordSetTrans rst = new RecordSetTrans();
|
||
rst.setAutoCommit(false);
|
||
try {
|
||
String sql = "delete from uf_gshsj where xm = "+userId+" and rq = '"+date+"'";
|
||
boolean isdelete2 = rst.executeUpdate(sql);
|
||
new BaseBean().writeLog("deleteUsr:"+userId+"date:"+date+"isdelete2:"+isdelete2);
|
||
rst.commit();
|
||
} catch (Exception e) {
|
||
rst.rollback();
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 更新台账数据
|
||
*/
|
||
public synchronized static void updateKqModeInfo(BaseBean bb,RecordSet rs,String userId,String date,Integer bkcs,String zcgzts,String yxjts,String jjrts,String ybts,String signWeekZl,
|
||
String overWeekZl,String signWeekZr,String overWeekZr,String overWeekZlWs,String overWeekZrWs,String mealValue,String psjbsc,String gzsc,String overWeekZrZtx,String zlxxb,String signWeekJjr,String overWeekJjr,String zjbsc,String xcqts,String gxbts){
|
||
|
||
RecordSetTrans rst = new RecordSetTrans();
|
||
rst.setAutoCommit(false);
|
||
try {
|
||
String sql = "update uf_gshsj set bkcs=?,zcgzts=?,yxjts=?,jjrts=?,ybts=?,zlbtdksc=?,zlbtjb=?,zrbtdksj=?,zrbtjb=?,zlwsjb=?,zrwsjb=?,cb=?,psjbshic=?,gzsc=?,zrbtjbzdx=?,xxb=?,jjrdksc=?,jjrbtjia=?,zjbxs=?,xchu=?,gxbts=? where xm=? and rq=?";
|
||
boolean isdelete2 = rst.executeUpdate(sql,bkcs,zcgzts,yxjts,jjrts,ybts,signWeekZl,overWeekZl,signWeekZr,overWeekZr,overWeekZlWs,overWeekZrWs,mealValue,psjbsc,gzsc,overWeekZrZtx,zlxxb,signWeekJjr,overWeekJjr,zjbsc,xcqts,gxbts,userId,date);
|
||
bb.writeLog("updateUsr:"+userId+"date:"+date+"isdelete2:"+isdelete2);
|
||
rst.commit();
|
||
} catch (Exception e) {
|
||
rst.rollback();
|
||
e.printStackTrace();
|
||
}
|
||
// if(!isdelete2){
|
||
// rs.executeUpdate(sql,bkcs,zcgzts,yxjts,jjrts,ybts,signWeekZl,overWeekZl,signWeekZr,overWeekZr,overWeekZlWs,overWeekZrWs,mealValue,psjbsc,gzsc,overWeekZrZtx,zlxxb,signWeekJjr,overWeekJjr,zjbsc,xcqts,gxbts,userId,date);
|
||
// }
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* 格式化生成台账数据
|
||
* @param userId
|
||
* @param date
|
||
*/
|
||
public synchronized static void createKqModeInfo(RecordSet rs,String userId,String date,Integer bkcs,String zcgzts,String yxjts,String jjrts,String ybts,String signWeekZl,
|
||
String overWeekZl,String signWeekZr,String overWeekZr,String overWeekZlWs,String overWeekZrWs,String mealValue,String psjbsc,String gzsc,String overWeekZrZtx,String zlxxb,String signWeekJjr,String overWeekJjr,String zjbsc,String xcqts,String gxbts){
|
||
BaseBean bb = new BaseBean();
|
||
RecordSetTrans rst = new RecordSetTrans();
|
||
Integer checkM = checkKqModeInfo(userId,date,rs);
|
||
bb.writeLog("createKqModeInfo == >userId:"+userId+" date:"+date+"checkMN"+checkM);
|
||
if(checkM>0){
|
||
bb.writeLog("不满足新增条件");
|
||
}else{
|
||
//插入
|
||
try {
|
||
String idNew = "";
|
||
int modeid = getFormModeIdByCubeName("uf_gshsj");
|
||
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
|
||
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
|
||
String modedatacreatedate = sdfDate.format(new Date());
|
||
String modedatacreatetime = sdfTime.format(new Date());
|
||
rst.setAutoCommit(false);
|
||
String sqlMode = "insert into uf_gshsj (xm,rq,bkcs,zcgzts,yxjts,jjrts,ybts,zlbtdksc,zlbtjb,zrbtdksj,zrbtjb,zlwsjb,zrwsjb,cb,psjbshic,gzsc,zrbtjbzdx,xxb,jjrdksc,jjrbtjia,zjbxs,xchu,gxbts,FORMMODEID,MODEDATACREATER,MODEDATACREATERTYPE,MODEDATACREATEDATE,MODEDATACREATETIME) \n" +
|
||
"values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
rst.executeUpdate(sqlMode, userId,date,bkcs,zcgzts,yxjts,jjrts,ybts,signWeekZl,overWeekZl,signWeekZr,overWeekZr,overWeekZlWs,overWeekZrWs,mealValue,psjbsc,gzsc,overWeekZrZtx,zlxxb,signWeekJjr,overWeekJjr,zjbsc,xcqts,gxbts,modeid, userId, "0", modedatacreatedate, modedatacreatetime);
|
||
rst.commit();
|
||
|
||
String sqlFindnew ="select Id from uf_gshsj where xm = "+userId+" and rq = '"+date+"' order by" +
|
||
" modedatacreatedate desc,modedatacreatetime desc";
|
||
rs.execute(sqlFindnew);
|
||
bb.writeLog("findSqlNew:"+sqlFindnew);
|
||
if (rs.next()){
|
||
idNew = Util.null2String(rs.getString("id"));
|
||
}
|
||
bb.writeLog("idNew:"+idNew);
|
||
// 权限重构
|
||
int dataId = 0;
|
||
if(StringUtils.isNotBlank(idNew)){
|
||
dataId = Integer.valueOf(idNew);
|
||
}
|
||
|
||
ModeRightInfo modeRightInfo = new ModeRightInfo();
|
||
modeRightInfo.editModeDataShare(Integer.valueOf(userId), modeid, dataId);
|
||
} catch (Exception e) {
|
||
rst.rollback();
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 根据建模表名获取formModeId
|
||
*
|
||
* @param cubeName 建模表明
|
||
* @return int formModeId
|
||
*/
|
||
private static int getFormModeIdByCubeName(String cubeName) {
|
||
RecordSet rs = new RecordSet();
|
||
rs.executeQuery("select t1.id from modeinfo t1\n" +
|
||
" left join workflow_bill t2\n" +
|
||
" on t1.formid=t2.id\n" +
|
||
" where t2.tablename='" + cubeName + "'");
|
||
rs.next();
|
||
return rs.getInt("id");
|
||
}
|
||
|
||
/**
|
||
* 找到同一天已生成的调休时长
|
||
* @param leaveRulesId
|
||
* @param resourceId
|
||
* @param effectiveDate
|
||
* @return
|
||
*/
|
||
public static String findTiaoXiuAmount(String leaveRulesId,String resourceId,String effectiveDate){
|
||
String tiaoxiuamount = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select tiaoxiuamount from kq_balanceOfLeave where leaveRulesId=? and resourceId=? and effectiveDate=? and isDelete=0";
|
||
rs.executeQuery(sql,leaveRulesId,resourceId,effectiveDate);
|
||
if(rs.next()){
|
||
tiaoxiuamount = Util.null2String(rs.getString("tiaoxiuamount"));
|
||
}
|
||
return tiaoxiuamount;
|
||
}
|
||
|
||
/**
|
||
* 插入加班时长
|
||
* @param requestid
|
||
* @param userid
|
||
* @param fromDate
|
||
* @param MaxHours
|
||
* @param changeType
|
||
*/
|
||
private static void insertOverTime(String requestid,String userid,String fromDate,String MaxHours,Integer changeType,String tiaoxiuId,String paidLeaveEnable){
|
||
BaseBean bb = new BaseBean();
|
||
//插入加班时间
|
||
RecordSet rsInsert = new RecordSet();
|
||
//先删后增
|
||
String deleteSql = "delete from kq_flow_overtime where requestid = ? and resourceid = ? and belongdate = ?";
|
||
rsInsert.executeUpdate(deleteSql,requestid,userid,fromDate);
|
||
|
||
String uuid = UUID.randomUUID().toString();
|
||
String sql = "insert into kq_flow_overtime (requestid,resourceid,fromdate,fromtime,todate,totime,duration_min,expiringdate,belongdate,"
|
||
+ "workMins,durationrule,changetype,paidLeaveEnable,computingMode,tiaoxiuId,uuid,fromdatedb,fromtimedb,todatedb,totimedb,flow_mins,card_mins,ori_belongdate,flow_dataid)"+
|
||
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
|
||
rsInsert.executeUpdate(sql, requestid,userid,fromDate,"07:30",fromDate,"18:00",MaxHours,"",fromDate,
|
||
"","1",changeType,paidLeaveEnable,"4",tiaoxiuId,uuid,"","","","","0","0",fromDate,"");
|
||
bb.writeLog("insertSql:"+sql);
|
||
}
|
||
|
||
|
||
/**
|
||
* 提供精确的除法运算。
|
||
* @param v1 被加数
|
||
* @param v2 加数
|
||
* @return 两个参数的和
|
||
*/
|
||
public static String divide(String v1, String v2) {
|
||
BigDecimal b1 = new BigDecimal(v1);
|
||
BigDecimal b2 = new BigDecimal(v2);
|
||
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP).toString();
|
||
}
|
||
|
||
/**
|
||
* 提供精确的除法运算。
|
||
*
|
||
* @param v1 被加数
|
||
* @param v2 加数
|
||
* @return 两个参数的和
|
||
*/
|
||
public static Double divide2(String v1, String v2) {
|
||
BigDecimal b1 = new BigDecimal(v1);
|
||
BigDecimal b2 = new BigDecimal(v2);
|
||
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
||
}
|
||
|
||
/**
|
||
* 提供精确的加法运算。
|
||
* @param v1 被加数
|
||
* @param v2 加数
|
||
* @return 两个参数的和
|
||
*/
|
||
public static String add(String v1, String v2) {
|
||
BigDecimal b1 = new BigDecimal(v1);
|
||
BigDecimal b2 = new BigDecimal(v2);
|
||
return b1.add(b2).toString();
|
||
}
|
||
|
||
/**
|
||
* 提供精确的减法运算。
|
||
* @param v1 被减数
|
||
* @param v2 减数
|
||
* @return 两个参数的差
|
||
*/
|
||
public static String sub(String v1, String v2) {
|
||
BigDecimal b1 = new BigDecimal(v1);
|
||
BigDecimal b2 = new BigDecimal(v2);
|
||
return b1.subtract(b2).toString();
|
||
}
|
||
|
||
|
||
/**
|
||
* 平时加班时长获取
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String findPsjbMins(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select sum(CAST(duration_min AS numeric)) as jbscall from kq_flow_overtime where resourceid = "+userId+" " +
|
||
"and belongdate = '"+date+"' and changetype = 2 and tiaoxiuid = -1 and paidLeaveEnable = 0";
|
||
rs.executeQuery(sql);
|
||
String mins = "";
|
||
if(rs.next()){
|
||
mins = Util.null2String(rs.getString("jbscall"),"0");
|
||
}
|
||
return mins;
|
||
|
||
}
|
||
|
||
/**
|
||
* 直落小时获取
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String findZlxs(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select sum(sch) as zlxs from uf_lbjbsq where sqr = "+userId+" and ksrq>='"+date+"' and ksrq<= '"+date+"'";
|
||
rs.executeQuery(sql);
|
||
String mins = "0";
|
||
if(rs.next()){
|
||
mins = Util.null2String(rs.getString("zlxs"),"0");
|
||
}
|
||
return mins;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
/**
|
||
* 获取工作时长
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String geGzsc(String userId,String date){
|
||
String gzsc = "";
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select attendanceMins,cardOvertime from kq_format_total where resourceid ="+userId+" and kqdate = '"+date+"'";
|
||
rs.executeQuery(sql);
|
||
if(rs.next()){
|
||
String attendanceMins = Util.null2String(rs.getString("attendanceMins"),"0");
|
||
String cardOvertime = Util.null2String(rs.getString("cardOvertime"),"0");
|
||
gzsc = add(attendanceMins,cardOvertime);
|
||
}
|
||
return gzsc;
|
||
}
|
||
|
||
|
||
/**
|
||
* 插入打卡记录
|
||
*/
|
||
public static void insertDk(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
KQWorkTime kqWorkTime = new KQWorkTime();
|
||
kqWorkTime.setIsFormat(true);
|
||
WorkTimeEntity workTime = kqWorkTime.getWorkTime(userId, date);
|
||
String bc = workTime.getSerialId();
|
||
//类似越南白班这种免打卡的班次需要插入打卡记录
|
||
String ynbc = bb.getPropValue("jgKq_main","ynbc");
|
||
bb.writeLog("insertDk:"+bc+"ynbc:"+ynbc);
|
||
if (Arrays.asList(ynbc.split(",")).contains(bc) && checkDkjl(userId,date)){
|
||
bb.writeLog("符合班次类型");
|
||
//符合班次类型
|
||
String sql = "select times from kq_ShiftOnOffWorkSections where serialid = "+bc+" and clockinnot =1";
|
||
rs.executeQuery(sql);
|
||
while (rs.next()){
|
||
String times = Util.null2String(rs.getString("times"));
|
||
String timesNew = times+":00";
|
||
if(checkByInfo(userId,date,timesNew)){
|
||
//暂不进行操作
|
||
}else{
|
||
InsertByInfo(userId,1,date,timesNew,"",1,1,"OutDataSourceSyn","","","","免打卡自动生成");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断当天是否有考勤数据
|
||
* @param userId
|
||
* @return
|
||
*/
|
||
private static Boolean checkByInfo(String userId,String signdate,String signtim){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from hrmschedulesign where userid = "+userId+" and signdate = '"+signdate+"' and signtime = '"+signtim+"'";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/**
|
||
* 删除
|
||
* @param userId
|
||
* @param signdate
|
||
* @param signtime
|
||
*/
|
||
public static Boolean deleteByInfo(String userId,String signdate,String signtime){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "delete from hrmschedulesign where signfrom='OutDataSourceSyn' and userid =? and signdate = ? and signtime = ? ";
|
||
boolean isdelete = rs.executeUpdate(sql,userId,signdate,signtime);
|
||
return isdelete;
|
||
}
|
||
|
||
/**
|
||
* 新增
|
||
* @param userId
|
||
* @param signdate
|
||
* @param signtime
|
||
*/
|
||
public static Boolean InsertByInfo(String userId,Integer usertype,String signdate,String signtime,String clientaddress,Integer isincom,Integer isimport,String signfrom,String longitude,String latitude,String addr,String memo){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = " insert into HrmScheduleSign (userid, usertype, signdate, signtime, clientaddress, isincom, isimport, signfrom, longitude, latitude, addr,memo) "
|
||
+ " values(?,?,?,?,?,?,?,?,?,?,?,?)";
|
||
boolean isok = rs.executeUpdate(sql,userId,usertype,signdate,signtime,clientaddress,isincom,isimport,signfrom,longitude,latitude,addr,memo);
|
||
return isok;
|
||
}
|
||
|
||
|
||
/**
|
||
* 判断当天是否有打卡记录
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
private static Boolean checkDkjl(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select * from HrmScheduleSign where userId = "+userId+" and signDate = '"+date+"' and signTime > '18:00' ";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
|
||
/**
|
||
* 更新刷卡加班
|
||
* @param userId
|
||
* @param signdate
|
||
* @param cardOvertime
|
||
*/
|
||
public static void updateCardOver(String userId,String signdate,String cardOvertime){
|
||
RecordSet rs = new RecordSet();
|
||
Double cardOvertimes = Double.parseDouble(cardOvertime);
|
||
String sql = "update kq_format_detail set cardOvertime=? where resourceid=? and kqdate=?";
|
||
boolean isdelete = rs.executeUpdate(sql,cardOvertimes.intValue(),userId,signdate);
|
||
|
||
sql = "update kq_format_total set cardOvertime=? where resourceid=? and kqdate=?";
|
||
boolean isdelete2 = rs.executeUpdate(sql,cardOvertimes.intValue(),userId,signdate);
|
||
}
|
||
|
||
|
||
/**
|
||
* 更新实际出勤
|
||
* @param userId
|
||
* @param signdate
|
||
*/
|
||
public static void updateSjcq(String userId,String signdate){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "update kq_format_total set attendancedays=?,attendancemins=? where resourceid=? and kqdate=?";
|
||
boolean isdelete2 = rs.executeUpdate(sql,0.5,240,userId,signdate);
|
||
}
|
||
|
||
/**
|
||
* 更新实际出勤+有薪假
|
||
* @param userId
|
||
* @param signdate
|
||
*/
|
||
public static void updateSjcqYxj(String userId,String signdate,String value,RecordSet rs){
|
||
String minsValue = multiply(multiply(value,"8"),"60");
|
||
Double minsD = Double.parseDouble(minsValue);
|
||
String sql = "update kq_format_total set attendancedays=?,attendancemins=? where resourceid=? and kqdate=?";
|
||
boolean isdelete2 = rs.executeUpdate(sql,value,minsD.intValue(),userId,signdate);
|
||
}
|
||
|
||
|
||
/**
|
||
* 自定义日期类型判断
|
||
* @param userId
|
||
* @param date
|
||
* @return
|
||
*/
|
||
public static String findRqlx(String userId,String date){
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "select rqlx from uf_rqzdygs where CONCAT(xm,',') like('%"+userId+",%') and rq = '"+date+"'";
|
||
rs.executeQuery(sql);
|
||
String rqlx = "-1";
|
||
if(rs.next()){
|
||
rqlx = Util.null2String(rs.getString("rqlx"));
|
||
}
|
||
return StringUtils.isBlank(rqlx)?"-1":rqlx;
|
||
|
||
}
|
||
|
||
/**
|
||
* 判断是否是指定分部
|
||
* @param userId
|
||
* @return
|
||
*/
|
||
private static Boolean checkSubcompany(String userId){
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean bb = new BaseBean();
|
||
//分部id字段
|
||
String unShowDkDept = bb.getPropValue("jgKq_main","unShowDkDept");
|
||
String sql = "select id from hrmresource where id = "+userId+" and subcompanyid1 in ("+unShowDkDept+")";
|
||
rs.execute(sql);
|
||
Boolean check = false;
|
||
if (rs.getCounts()>0){
|
||
check = true;
|
||
}
|
||
return check;
|
||
}
|
||
|
||
}
|