HistoryDevByCx/二开源码/京福/jg/.svn/pristine/5f/5f28b132ddccdf29b9b3bf74404...

3510 lines
149 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.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 插入空记录");
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"));
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";
}
}
//考勤组大小周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);
//周日白天打卡时长-二开
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;
}
//节假日白天打卡时长-二开
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";
}
updateSjcqYxj(userId,kqDate,sjcqtsn,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);//下班漏签时段标识 6666呼应前面的漏签的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)){
//特殊班次需要用下班卡-1600计刷卡加班
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){
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(forgotCheckMins);//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(forgotBeginWorkCheckMins);//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=?";
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);
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);
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=?";
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=?";
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=?";
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
*/
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
*/
public static Boolean deleteKqModeInfo(String userId,String date,RecordSet rs){
BaseBean bb = new BaseBean();
String sql = "delete from uf_gshsj where xm = "+userId+" and rq = '"+date+"'";
boolean isdelete = rs.executeUpdate(sql);
bb.writeLog("deleteKqModeInfo"+userId+"date:"+date+"back:"+isdelete);
return isdelete;
}
/**
* 判断当天是否有考勤数据
* @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 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){
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 = 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);
bb.writeLog("updateUsr:"+userId+"date:"+date+"isdelete2:"+isdelete2);
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 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();
Integer checkM = checkKqModeInfo(userId,date,rs);
bb.writeLog("createKqModeInfo == >userId:"+userId+" date:"+date+"checkMN"+checkM);
if(checkM>0){
bb.writeLog("不满足新增条件");
}else{
//插入
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());
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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
rs.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);
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);
}
}
/**
* 根据建模表名获取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=?";
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;
}
}