package com.engine.kq.biz ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONObject ;
import com.cloudstore.dev.api.util.Util_DataMap ;
import com.engine.hostar.util.HostarUtil ;
import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean ;
import com.engine.kq.cmd.attendanceButton.ButtonStatusEnum ;
import com.engine.kq.entity.KQShiftRuleEntity ;
import com.engine.kq.entity.TimeScopeEntity ;
import com.engine.kq.entity.TimeSignScopeEntity ;
import com.engine.kq.entity.WorkTimeEntity ;
import com.engine.kq.enums.FlowReportTypeEnum ;
import com.engine.kq.log.KQLog ;
import com.engine.kq.util.KQDurationCalculatorUtil ;
import com.engine.kq.util.UtilKQ ;
import com.google.common.collect.Lists ;
import com.google.common.collect.Maps ;
import com.googlecode.aviator.AviatorEvaluator ;
import com.googlecode.aviator.Expression ;
import java.text.DecimalFormat ;
import java.text.DecimalFormatSymbols ;
import java.text.SimpleDateFormat ;
import java.time.LocalDate ;
import java.time.format.DateTimeFormatter ;
import java.util.concurrent.ConcurrentHashMap ;
import org.apache.commons.lang3.StringUtils ;
import org.springframework.util.CollectionUtils ;
import weaver.common.DateUtil ;
import weaver.conn.BatchRecordSet ;
import weaver.conn.RecordSet ;
import weaver.file.Prop ;
import weaver.formmode.setup.ModeRightInfo ;
import weaver.general.BaseBean ;
import weaver.general.InitServer ;
import weaver.general.TimeUtil ;
import weaver.general.Util ;
import weaver.hrm.User ;
import java.util.* ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
/ * *
* 考 勤 数 据 格 式 化
* /
public class KQFormatData extends BaseBean {
BaseBean bb = new BaseBean ( ) ;
private String today = DateUtil . getCurrentDate ( ) ;
private KQLog kqLog = new KQLog ( ) ;
private boolean writeLog = false ;
private LinkedHashMap < String , Object > logInfo = new LinkedHashMap < > ( ) ;
private final List < String > LIST = Arrays . asList ( "1" , "8" , "14" , "15" ) ;
private final static double PI = 3.14159265358979323 ; // 圆周率
private final static double R = 6371229 ; // 地球的半径
private static DecimalFormat df = new DecimalFormat ( "0.00" ) ;
private DecimalFormatSymbols symbols = new DecimalFormatSymbols ( ) ;
/ * * *
* 该 方 法 不 允 许 直 接 调 用
* @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 ( ) ;
String sql = "" ;
try {
bb . writeLog ( "start to formatKqDate" ) ;
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 ) ;
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 . getWorkMins ( ) = = 0 & & workTime . getRestShift ( ) ! = 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)values(?,?,?,?,?,?,?,?,?,?,?,?,?,?) " ;
rs . executeUpdate ( sql , nonlsParam ) ;
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)" +
" 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" +
" 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 if ( workTime . getWorkMins ( ) = = 0 & & workTime . getRestShift ( ) = = 1 ) {
Map < String , Object > definedFieldInfo = new KQFormatBiz ( ) . getDefinedField ( ) ;
String definedField = "" ;
String definedParam = "" ;
String definedParamSum = "" ;
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 ) {
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,otherinfo,zeropoint" + ( definedField . length ( ) > 0 ? "," + definedField + "" : "" ) + ") " +
" 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 ) ;
}
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,forgotbeginworkcheck,forgotbeginworkcheckmins,zeropoint" + ( definedField . length ( ) > 0 ? "," + definedField + "" : "" ) + ") " +
" 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, " +
" sum(case when forgotbeginworkcheckmins> 0 then 1 else 0 end) as forgotbeginworkcheck,sum(forgotbeginworkcheckmins) as forgotbeginworkcheckmins,sum(zeropoint) as zeropoint " +
( definedField . length ( ) > 0 ? "," + definedParamSum + "" : "" ) +
" 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" ;
boolean isok2 = rs . executeUpdate ( sql , userId , kqDate ) ;
kqLog . info ( "插入记录2新:userId:" + userId + ":kqDate:" + kqDate + ":isok:" + isok2 ) ;
kqLog . info ( "sqlTotal:" + sql ) ;
}
} else {
Map < String , Object > definedFieldInfo = new KQFormatBiz ( ) . getDefinedField ( ) ;
String definedField = "" ;
String definedParam = "" ;
String definedParamSum = "" ;
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 ) ) ;
}
// bb.writeLog("lsParam: " + lsParam);
if ( lsParam . size ( ) > 0 ) {
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,otherinfo,zeropoint" + ( definedField . length ( ) > 0 ? "," + definedField + "" : "" ) + ") " +
" 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 ) ;
}
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,forgotbeginworkcheck,forgotbeginworkcheckmins,zeropoint" + ( definedField . length ( ) > 0 ? "," + definedField + "" : "" ) + ") " +
" 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," +
" cast(sum(attendanceMins)AS decimal(10, 2))/sum(workmins) as attendancedays, sum(attendanceMins) as attendanceMins," +
" cast(sum(signmins)AS decimal(10, 2))/sum(workmins) 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, " +
" sum(case when forgotbeginworkcheckmins> 0 then 1 else 0 end) as forgotbeginworkcheck,sum(forgotbeginworkcheckmins) as forgotbeginworkcheckmins,sum(zeropoint) as zeropoint " +
( definedField . length ( ) > 0 ? "," + definedParamSum + "" : "" ) +
" 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 ) ;
}
}
long startTime = System . currentTimeMillis ( ) ;
// 获取考勤二开--夜班补助
String nightShiftSubsidy = getNightShiftSubsidy ( userId , kqDate ) ;
bb . writeLog ( "nightShiftSubsidy:" + nightShiftSubsidy ) ;
if ( StringUtils . isEmpty ( nightShiftSubsidy ) ) {
nightShiftSubsidy = "0" ;
}
// 获取考勤二开--鸿仁驻点餐补
String otherStatAllowance = getOtherStatAllowance ( userId , kqDate ) ;
bb . writeLog ( "otherStatAllowance:" + otherStatAllowance ) ;
if ( StringUtils . isEmpty ( otherStatAllowance ) ) {
otherStatAllowance = "0" ;
}
// 考勤二开--精密夜班餐补
String nightAllowance = getNightAllowance ( userId , kqDate ) ;
bb . writeLog ( "nightAllowance:" + nightAllowance ) ;
if ( StringUtils . isEmpty ( nightAllowance ) ) {
nightAllowance = "0" ;
}
// 考勤二开--驻点餐补
String statAllowance = getStatAllowance ( userId , kqDate ) ;
bb . writeLog ( "statAllowance:" + statAllowance ) ;
if ( StringUtils . isEmpty ( statAllowance ) ) {
statAllowance = "0" ;
}
// 考勤二开--出差餐补
String mealAllowance = getMealAllowance ( userId , kqDate ) ;
if ( ! ( StringUtils . equals ( statAllowance , "0" ) & & StringUtils . equals ( otherStatAllowance , "0" ) ) ) {
mealAllowance = "0" ;
}
bb . writeLog ( "mealAllowance:" + mealAllowance ) ;
if ( StringUtils . isEmpty ( mealAllowance ) ) {
mealAllowance = "0" ;
}
// 考勤二开--零点补助
String zeropoint = getZeroBt ( userId , kqDate ) ;
bb . writeLog ( "zeropoint:" + zeropoint ) ;
if ( StringUtils . isEmpty ( zeropoint ) ) {
zeropoint = "0" ;
}
rs . executeQuery ( "select id from uf_cbxxjlb where xm = ? and rq = ?" , userId , kqDate ) ;
RecordSet rs1 = new RecordSet ( ) ;
String cbxxjlModeId = rs1 . getPropValue ( "hostar_zm_prop" , "cbxxjl_modeid" ) ;
if ( rs . next ( ) ) {
int cbxxjlId = rs . getInt ( "id" ) ;
rs1 . executeUpdate ( "update uf_cbxxjlb set hrzdcb = ?, jmybcb = ?, zdcb = ?, ybbz = ?, cccb = ?, ldbz = ? where id = ?" ,
otherStatAllowance , nightAllowance , statAllowance , nightShiftSubsidy , mealAllowance , zeropoint , cbxxjlId ) ;
//权限重构
ModeRightInfo ModeRightInfo = new ModeRightInfo ( ) ;
ModeRightInfo . setNewRight ( true ) ;
ModeRightInfo . editModeDataShare ( 1 , Integer . parseInt ( cbxxjlModeId ) , cbxxjlId ) ;
} else {
String uuidT = UUID . randomUUID ( ) . toString ( ) ;
SimpleDateFormat sdfDate = new SimpleDateFormat ( "yyyy-MM-dd" ) ; //设置日期格式
SimpleDateFormat sdfTime = new SimpleDateFormat ( "HH:mm:ss" ) ; //设置日期格式
String nowDate = sdfDate . format ( new Date ( ) ) ;
String nowTime = sdfTime . format ( new Date ( ) ) ;
String gh = null ;
String bm = null ;
rs1 . executeQuery ( "SELECT workcode, departmentid from hrmresource where id = ?" , userId ) ;
if ( rs1 . next ( ) ) {
gh = rs1 . getString ( "workcode" ) ;
bm = rs1 . getString ( "departmentid" ) ;
}
rs1 . executeUpdate ( "insert into uf_cbxxjlb (xm, rq, gh, bm, hrzdcb, jmybcb, zdcb, ybbz, cccb, ldbz, formmodeid, MODEUUID, " +
"modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,?)" ,
userId , kqDate , gh , bm , otherStatAllowance , nightAllowance , statAllowance , nightShiftSubsidy , mealAllowance , zeropoint , cbxxjlModeId , uuidT , "1" , "0" , nowDate , nowTime ) ;
RecordSet qxcgRs = new RecordSet ( ) ;
qxcgRs . execute ( "select id from uf_cbxxjlb where MODEUUID = '" + uuidT + "'" ) ;
Integer idT = 0 ;
while ( qxcgRs . next ( ) ) {
idT = qxcgRs . getInt ( "id" ) ;
}
//权限重构
ModeRightInfo ModeRightInfo = new ModeRightInfo ( ) ;
ModeRightInfo . setNewRight ( true ) ;
ModeRightInfo . editModeDataShare ( 1 , Integer . parseInt ( cbxxjlModeId ) , idT ) ;
}
long endTime = System . currentTimeMillis ( ) ;
long elapsedTime = endTime - startTime ; // 执行时间
bb . writeLog ( "getDailyMealAllowanceData执行时间: " + elapsedTime / 1000 + "秒" ) ;
} catch ( Exception e ) {
writeLog ( e ) ;
kqLog . info ( e ) ;
}
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 ;
RecordSet rt = new RecordSet ( ) ;
try {
bb . writeLog ( "start to format" ) ;
KQSettingsComInfo kqSettingsComInfo = new KQSettingsComInfo ( ) ;
String nosign_is_absent = Util . null2String ( kqSettingsComInfo . getMain_val ( "nosign_is_absent" ) , "1" ) ;
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 ( ) ;
kqLog . info ( "format in >>>>>userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid ) ;
boolean oneSign = false ;
List < TimeScopeEntity > lsSignTime = new ArrayList < > ( ) ;
List < TimeScopeEntity > lsWorkTime = new ArrayList < > ( ) ;
List < TimeScopeEntity > lsRestTime = new ArrayList < > ( ) ;
List < Object > workFlow = null ;
bb . writeLog ( "format.groupId:" + workTime . getGroupId ( ) + "format.serialId:" + workTime . getSerialId ( ) ) ;
int workminsNew = 0 ;
if ( workTime ! = null ) {
lsSignTime = workTime . getSignTime ( ) ; //允许打卡时间
lsWorkTime = workTime . getWorkTime ( ) ; //工作时间
lsRestTime = workTime . getRestTime ( ) ; //休息时段时间
oneSign = lsWorkTime ! = null & & lsWorkTime . size ( ) = = 1 ;
workminsNew = workTime . getWorkMins ( ) ;
}
int [ ] dayMins = new int [ 2880 ] ; //一天所有分钟数
Arrays . fill ( dayMins , - 1 ) ;
// 一天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 ;
}
}
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 signMins = 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 ;
if ( workTimeScope ! = null & & workTimeScope . getEndTimeAcross ( ) & & signTimeScope . getEndTimeAcross ( ) ) {
if ( workTimeScope . getEndTime ( ) . compareTo ( signTimeScope . getEndTime ( ) ) > = 0 ) {
signEndDateTime = DateUtil . addDate ( kqDate , 2 ) ; //下下一天日期;
}
}
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 ( 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 ) ;
// bb.writeLog("kqformatdata lscheckinfo: " + lsCheckInfo);
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 ) ;
// bb.writeLog("kqformatdata checkInfo: " + checkInfo);
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 ;
}
}
} 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 ( 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 {
bb . writeLog ( "1111-----" ) ;
bb . writeLog ( "dayMins: " + dayMins + ", beginIdx: " + beginIdx + ", workEndIdx: " + workEndIdx ) ;
Arrays . fill ( dayMins , beginIdx , workEndIdx , 3 ) ; //早退时段标识 3
}
}
}
}
}
//打卡时长=签退时间-签到时间(有签到签退才计算)
if ( checkIn = = 1 & & checkOut = = 1 ) {
if ( signInTimeIndx4Sign > - 1 & & signInTimeOutdx4Sign > - 1 ) {
if ( DateUtil . dayDiff ( signInDate , signOutDate ) = = 0 ) { //同一天签到和签退
signMins = signInTimeOutdx4Sign - signInTimeIndx4Sign ;
} else if ( DateUtil . dayDiff ( signInDate , signOutDate ) = = 1 ) { //第一天签到,第二天签退
if ( signInTimeOutdx4Sign < signInTimeIndx4Sign ) {
signMins = 1440 + signInTimeOutdx4Sign - signInTimeIndx4Sign ;
} else {
signMins = 1440 + signInTimeOutdx4Sign - signInTimeIndx4Sign ;
}
}
} else {
signMins = 0 ;
}
if ( signMins < 0 ) {
signMins = 0 ;
}
}
if ( checkIn = = 0 & & checkOut = = 0 ) { //旷工(无签到无签退)
if ( workEndIdx > workBeginIdx ) {
Arrays . fill ( dayMins , workBeginIdx , workEndIdx , 4 ) ; //旷工时段标识 4
}
}
if ( checkOut = = 0 & & checkIn > 0 ) { //漏签(有签到无签退)
if ( signInTimeIndx > - 1 ) {
if ( workEndIdx > signInTimeIndx ) {
//漏签就是从本次时段内的打卡到下班点
//上班漏签应该是从签到到签到结束时间,不过这里可以不用管,只是一个次数
Arrays . fill ( dayMins , signInTimeIndx , workEndIdx , 6 ) ; //上班漏签时段标识 6
} else {
//签到晚于本次时段结束时间,也算漏签
forgotCheckMins + + ;
}
} else if ( flowSignInTimeIndx > - 1 ) {
if ( workEndIdx > flowSignInTimeIndx ) {
//漏签就是从本次时段内的打卡到下班点
//上班漏签应该是从签到到签到结束时间,不过这里可以不用管,只是一个次数
Arrays . fill ( dayMins , flowSignInTimeIndx , workEndIdx , 6 ) ; //上班漏签时段标识 6
} else {
//签到晚于本次时段结束时间,也算漏签
forgotCheckMins + + ;
}
}
}
if ( checkIn = = 0 & & checkOut > 0 ) { //漏签(有签退无签到)
if ( signInTimeOutdx > 0 ) {
if ( workBeginIdx < signInTimeOutdx ) {
//下班漏签应该是从签退到签退开始时间,不过这里可以不用管,只是一个次数
Arrays . fill ( dayMins , workBeginIdx , signInTimeOutdx , 66 ) ; //下班漏签时段标识 66, 66呼应前面的漏签的6
} else {
//这种数据理论上不会存在,也记下吧
forgotBeginWorkCheckMins + + ;
}
}
}
if ( workFlowInfo . get ( dateKey ) ! = null ) {
workFlow = ( List < Object > ) workFlowInfo . get ( dateKey ) ;
}
// bb.writeLog("kqformatdata workFlow: " + workFlow);
for ( int j = 0 ; workFlow ! = null & & j < workFlow . size ( ) ; j + + ) {
Map < String , Object > data = ( Map < String , Object > ) workFlow . get ( j ) ;
// bb.writeLog("kqformatdata workFlow data: " + workFlow);
String flowType = Util . null2String ( data . get ( "flowtype" ) ) ;
String newLeaveType = Util . null2String ( data . get ( "newleavetype" ) ) ;
String signtype = Util . null2String ( data . get ( "signtype" ) ) ;
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 ;
}
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 ( 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 ) ) ;
bb . writeLog ( "人性化规则处理前数据: " + 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 ) ) ;
bb . writeLog ( "人性化规则处理后数据: " + 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 ( workminsNew = = 0 | | workTime . getIsExclude ( ) ) { //无需考勤人员没有异常状态
beLateMins = 0 ;
graveBeLateMins = 0 ;
leaveEarlyMins = 0 ;
graveLeaveEarlyMins = 0 ;
absenteeismMins = 0 ;
forgotCheckMins = 0 ;
forgotBeginWorkCheckMins = 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 ;
// 如果没有开启"漏签是否算实际出勤"开关,则漏签不算实际出勤时长
if ( "0" . equals ( nosign_is_absent ) ) {
attendanceMins = attendanceMins - forgotCheckMins - forgotBeginWorkCheckMins ;
}
if ( workminsNew = = 0 ) {
attendanceMins = 0 ;
workMins = 0 ;
}
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 ) ;
bb . writeLog ( "实际出勤计算结果" + attendanceMins + "=" + workMins + "- " + absenteeismMins + "-" + leaveMins + "-" + ( beLateMins + graveBeLateMins ) + "-" + ( leaveEarlyMins - graveLeaveEarlyMins ) + " userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps ) ;
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();
// }
String groupid = Util . null2String ( workTime . getGroupId ( ) ) ;
String serialid = Util . null2String ( workTime . getSerialId ( ) ) ;
/*考勤二开--零点补助start*/
int zeroPointSub = 0 ;
RecordSet rs = new RecordSet ( ) ;
Map < String , Object > groupMap = new HashMap < > ( ) ;
String acqSql = "select kqgroup, grouptype from uf_ZeroPointSubSft" ;
rs . executeQuery ( acqSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
String grouptype = Util . null2String ( rs . getString ( "grouptype" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . isNotBlank ( grouptype ) ) {
groupMap . put ( grouptype , kqgroup ) ;
}
}
// bb.writeLog("groupMap: " + groupMap);
bb . writeLog ( "groupid: " + groupid ) ;
//获取夜班班次
List < String > nightShiftList = new ArrayList < > ( ) ;
String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0" ;
rs . executeQuery ( acqNightShiftSql ) ;
while ( rs . next ( ) ) {
String shift = Util . null2String ( rs . getString ( "shift" ) ) ;
if ( StringUtils . isNotBlank ( shift ) ) {
nightShiftList . add ( shift ) ;
}
}
boolean offGood = false ;
boolean inGood = false ;
if ( StringUtils . isEmpty ( serialid ) ) {
serialid = "0" ;
}
if ( CollectionUtils . isEmpty ( nightShiftList ) | | ! nightShiftList . contains ( serialid ) ) {
for ( int j = 0 ; lsCheckInfo ! = null & & j < lsCheckInfo . size ( ) ; j + + ) {
bb . writeLog ( "lsCheckInfo is:" + JSONObject . toJSONString ( lsCheckInfo ) ) ;
Map < String , Object > checkInfo = ( Map < String , Object > ) lsCheckInfo . get ( j ) ;
if ( "2" . equals ( checkInfo . get ( "signType" ) ) & & ! offGood ) { //签退
String signStatus = Util . null2String ( checkInfo . get ( "signStatus" ) ) ;
if ( StringUtils . isEmpty ( signStatus ) | | ! signStatus . equalsIgnoreCase ( ButtonStatusEnum . NORMAL . getStatusCode ( ) ) ) {
continue ;
}
String signDate = Util . null2String ( checkInfo . get ( "signDate" ) ) ;
String signTime = Util . null2String ( checkInfo . get ( "signTime" ) ) ;
// bb.writeLog("signDate: " + signDate);
// bb.writeLog("signTime: " + signTime);
if ( groupMap ! = null & & groupMap . size ( ) > 0 ) {
for ( String grouptype : groupMap . keySet ( ) ) {
// bb.writeLog("grouptype: " + grouptype);
// if ("0".equals(grouptype)) {//责任制--23点
// String kqgroups = Util.null2String(groupMap.get(grouptype));
// bb.writeLog("kqgroups: " + kqgroups);
// List<String> groupList = Arrays.asList(kqgroups.split(","));
// bb.writeLog("groupList: " + groupList);
// if(groupList.contains(groupid)) {
// //23:00
// if (signTime.length() == 5) {
// signTime = signTime + ":00";
// }
// String subsidyTime = kqDate + " 23:00:00";
// bb.writeLog("subsidyTime: " + subsidyTime);
// String outTime = signDate + " " + signTime;
// bb.writeLog("outTime: " + outTime);
// if (outTime.compareTo(subsidyTime) > 0 ) {
// zeroPointSub = 1;
// }
// }
// }
if ( "0" . equals ( grouptype ) ) { //责任制--00点
String kqgroups = Util . null2String ( groupMap . get ( grouptype ) ) ;
// bb.writeLog("kqgroups: " + kqgroups);
List < String > groupList = Arrays . asList ( kqgroups . split ( "," ) ) ;
// bb.writeLog("groupList: " + groupList);
if ( groupList . contains ( groupid ) ) {
//00:00
if ( signTime . length ( ) = = 5 ) {
signTime = signTime + ":00" ;
}
// LocalDate date = LocalDate.parse(kqDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// LocalDate localDate = date.plusDays(1);
// String kqDateNew = localDate.toString();
String subsidyTime = kqDate + " 23:00:00" ;
bb . writeLog ( "subsidyTime: " + subsidyTime ) ;
String outTime = signDate + " " + signTime ;
bb . writeLog ( "outTime: " + outTime ) ;
if ( outTime . compareTo ( subsidyTime ) > 0 ) {
offGood = true ;
}
}
}
}
}
}
if ( "1" . equals ( checkInfo . get ( "signType" ) ) & & ! inGood ) { //签到
String signStatus = Util . null2String ( checkInfo . get ( "signStatus" ) ) ;
if ( StringUtils . isEmpty ( signStatus ) | | ! signStatus . equalsIgnoreCase ( ButtonStatusEnum . NORMAL . getStatusCode ( ) ) ) {
continue ;
}
String signDate = Util . null2String ( checkInfo . get ( "signDate" ) ) ;
String signTime = Util . null2String ( checkInfo . get ( "signTime" ) ) ;
bb . writeLog ( "signDate: " + signDate ) ;
bb . writeLog ( "signTime: " + signTime ) ;
if ( groupMap ! = null & & groupMap . size ( ) > 0 ) {
for ( String grouptype : groupMap . keySet ( ) ) {
bb . writeLog ( "grouptype: " + grouptype ) ;
if ( "0" . equals ( grouptype ) ) { //责任制--23点
String kqgroups = Util . null2String ( groupMap . get ( grouptype ) ) ;
bb . writeLog ( "kqgroups: " + kqgroups ) ;
List < String > groupList = Arrays . asList ( kqgroups . split ( "," ) ) ;
bb . writeLog ( "groupList: " + groupList ) ;
if ( groupList . contains ( groupid ) ) {
//23:00
if ( signTime . length ( ) = = 5 ) {
signTime = signTime + ":00" ;
}
String subsidyTime = kqDate + " 08:30:00" ;
bb . writeLog ( "subsidyTime: " + subsidyTime ) ;
String inTime = signDate + " " + signTime ;
bb . writeLog ( "inTime: " + inTime ) ;
if ( subsidyTime . compareTo ( inTime ) > 0 ) {
inGood = true ;
}
}
}
// if ("1".equals(grouptype)) {//排班制--00点
// String kqgroups = Util.null2String(groupMap.get(grouptype));
// bb.writeLog("kqgroups: " + kqgroups);
// List<String> groupList = Arrays.asList(kqgroups.split(","));
// bb.writeLog("groupList: " + groupList);
// if(groupList.contains(groupid)) {
// //00:00
// if (signTime.length() == 5) {
// signTime = signTime + ":00";
// }
// LocalDate date = LocalDate.parse(kqDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// LocalDate localDate = date.plusDays(1);
// String kqDateNew = localDate.toString();
// String subsidyTime = kqDateNew + " 00:00:00";
// bb.writeLog("subsidyTime: " + subsidyTime);
// String outTime = signDate + " " + signTime;
// bb.writeLog("outTime: " + outTime);
// if (outTime.compareTo(subsidyTime) > 0 ) {
// zeroPointSub = 1;
// }
// }
// }
}
}
}
}
}
if ( offGood & & inGood ) {
zeroPointSub = 1 ;
}
bb . writeLog ( "zeroPointSub: " + zeroPointSub ) ;
/*考勤二开--零点补助end*/
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 ) ;
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 ) ;
params . add ( JSONObject . toJSONString ( otherinfo ) ) ;
/*考勤二开--零点补助start*/
params . add ( zeroPointSub ) ;
/*考勤二开--零点补助end*/
bb . writeLog ( "params end. " ) ;
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 ) ) ;
lsParam . add ( params ) ;
}
} catch ( Exception e ) {
writeLog ( e ) ;
kqLog . info ( e ) ;
}
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 ) ;
}
public static double getDistance ( double lng1 , double lat1 , double lng2 , double lat2 ) {
double x , y , distance ;
x = ( lng2 - lng1 ) * PI * R
* Math . cos ( ( ( lat1 + lat2 ) / 2 ) * PI / 180 ) / 180 ;
y = ( lat2 - lat1 ) * PI * R / 180 ;
distance = Math . hypot ( x , y ) ;
return distance ;
}
public String getNightShiftSubsidy ( String userId , String kqDate ) {
RecordSet rs = new RecordSet ( ) ;
String value = "" ;
try {
//获取夜班班次
List < String > nightShiftList = new ArrayList < > ( ) ;
String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0" ;
rs . executeQuery ( acqNightShiftSql ) ;
while ( rs . next ( ) ) {
String shift = Util . null2String ( rs . getString ( "shift" ) ) ;
if ( StringUtils . isNotBlank ( shift ) ) {
nightShiftList . add ( shift ) ;
}
}
//获取加班时长
Map < String , Object > dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance ( userId , kqDate ) ;
// 获取责任制、排班次班次
Set < String > zrzbcSet = new HashSet < > ( ) ;
Set < String > pbzbcSet = new HashSet < > ( ) ;
String acqSql = "select kqgroup, grouptype from uf_ZeroPointSubSft" ;
rs . executeQuery ( acqSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
String grouptype = Util . null2String ( rs . getString ( "grouptype" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "0" ) ) {
zrzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "1" ) ) {
pbzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
}
if ( nightShiftList ! = null & nightShiftList . size ( ) > 0 ) {
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo ( ) ;
HostarUtil houtil = new HostarUtil ( ) ;
//先获取到出勤时长
Map < String , Double > signminsMap = new HashMap < > ( ) ;
Map < String , Double > attendanceMinsMap = new HashMap < > ( ) ;
String acqAttenSql = " select resourceid, attendancemins, kqdate,signmins from kq_format_total where resourceid in (" + userId + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'" ;
rs . executeQuery ( acqAttenSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
Double attendancemins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "attendancemins" ) ) ) ;
Double signmins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "signmins" ) ) ) ;
String kqdate = Util . null2String ( rs . getString ( "kqdate" ) ) ;
if ( signmins > = 0.00 ) {
signminsMap . put ( resourceid + "|" + kqdate , signmins ) ;
}
if ( attendancemins > = 0.00 ) {
attendanceMinsMap . put ( resourceid + "|" + kqdate , attendancemins ) ;
}
}
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
//获取当天班次
Map < String , Object > serialInfo = kqWorkTime . getSerialInfo ( userId , kqDate , false ) ;
if ( serialInfo ! = null & & serialInfo . size ( ) > 0 ) {
int serialid = Util . getIntValue ( Util . null2String ( serialInfo . get ( kqDate ) ) , 0 ) ;
if ( serialid > 0 ) {
if ( ! nightShiftList . contains ( String . valueOf ( serialid ) ) ) {
return "0" ;
}
} else {
return "0" ;
}
}
String groupId = kqGroupMemberComInfo . getKQGroupId ( userId , kqDate ) ;
if ( ( ! CollectionUtils . isEmpty ( pbzbcSet ) ) & & pbzbcSet . contains ( groupId ) ) {
double workingDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|workingDayOvertime_4leave" ) ) ) ;
workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave ;
double restDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|restDayOvertime_4leave" ) ) ) ;
restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave ;
double holidayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|holidayOvertime_4leave" ) ) ) ;
holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave ;
double workingDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|workingDayOvertime_nonleave" ) ) ) ;
workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave ;
double restDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|restDayOvertime_nonleave" ) ) ) ;
restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave ;
double holidayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( userId + "|" + kqDate + "|holidayOvertime_nonleave" ) ) ) ;
holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave ;
double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave +
workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave ;
Double attendanceMins = Util . getDoubleValue ( Util . null2String ( attendanceMinsMap . get ( userId + "|" + kqDate ) ) ) ;
value = ( Math . floor ( ( ( attendanceMins < 0.00 ? 0.00 : attendanceMins ) + temp ) / 60 ) > = 8.00 ) ? "1" : "0" ;
}
if ( ( ! CollectionUtils . isEmpty ( zrzbcSet ) ) & & zrzbcSet . contains ( groupId ) ) {
Double signmins = Util . getDoubleValue ( Util . null2String ( signminsMap . get ( userId + "|" + kqDate ) ) ) ;
value = ( ( signmins / 60 ) > = 9.00 ) ? "1" : "0" ;
}
}
} catch ( Exception e ) {
bb . writeLog ( "get NightShiftSubsidy error:" + e . getMessage ( ) ) ;
}
return value ;
}
public String getOtherStatAllowance ( String userId , String kqDate ) {
RecordSet rs = new RecordSet ( ) ;
String value = "" ;
String sqlWhere = " " ;
try {
KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo ( ) ;
if ( userId . length ( ) > 0 ) {
sqlWhere + = " and a.id in(" + userId + ") " ;
}
//获取加班时长
Map < String , Object > dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance ( userId , kqDate ) ;
// 获取责任制、排班次班次
Set < String > zrzbcSet = new HashSet < > ( ) ;
Set < String > pbzbcSet = new HashSet < > ( ) ;
String acqSql = "select kqgroup, grouptype from uf_ZeroPointSubSft" ;
rs . executeQuery ( acqSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
String grouptype = Util . null2String ( rs . getString ( "grouptype" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "0" ) ) {
zrzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "1" ) ) {
pbzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
}
String otherstatsub = Util . null2String ( bb . getPropValue ( "project_hostar" , "otherstatsubcompany" ) ) ;
if ( StringUtils . isNotBlank ( otherstatsub ) ) {
//查询该分部下的人员
List < String > resIds = new ArrayList < > ( ) ;
sqlWhere + = " and a.subcompanyid1 in (" + otherstatsub + ") " ;
String acqResSql = "select a.id from hrmresource a where 1=1 " + sqlWhere ;
bb . writeLog ( "acqResSql: " + acqResSql ) ;
rs . executeQuery ( acqResSql ) ;
while ( rs . next ( ) ) {
String id = Util . null2String ( rs . getString ( "id" ) ) ;
if ( StringUtils . isNotBlank ( id ) ) {
resIds . add ( id ) ;
}
}
// bb.writeLog("resIds: " + resIds);
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo ( ) ;
if ( resIds ! = null & & resIds . size ( ) > 0 & & StringUtils . isNotBlank ( kqDate ) ) {
HostarUtil houtil = new HostarUtil ( ) ;
//先获取到实际打卡时长
Map < String , Double > signminsMap = new HashMap < > ( ) ;
Map < String , Double > attendanceMinsMap = new HashMap < > ( ) ;
String acqAttenSql = " select resourceid, attendancemins, kqdate,signmins from kq_format_total where resourceid in (" + String . join ( "," , resIds ) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'" ;
rs . executeQuery ( acqAttenSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
Double attendancemins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "attendancemins" ) ) ) ;
Double signmins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "signmins" ) ) ) ;
String kqdate = Util . null2String ( rs . getString ( "kqdate" ) ) ;
if ( signmins > = 0.00 ) {
// double signTemp = signmins / 60;
// int quotient = (int) (signTemp / 6);
signminsMap . put ( resourceid + "|" + kqdate , signmins ) ;
}
if ( attendancemins > = 0.00 ) {
attendanceMinsMap . put ( resourceid + "|" + kqdate , attendancemins ) ;
}
}
List < String > removeRes = new ArrayList < > ( ) ;
String acqNoOtherStatAllResSql = "select resourceid from uf_NoOtherStatAllRe where isdelete is null or isdelete = 0 " ;
rs . executeQuery ( acqNoOtherStatAllResSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
if ( StringUtils . isNotBlank ( resourceid ) ) {
removeRes . add ( resourceid ) ;
}
}
if ( removeRes ! = null & & removeRes . size ( ) > 0 ) {
resIds . removeIf ( removeRes : : contains ) ;
}
for ( String res : resIds ) {
//获取考勤打卡
Map < String , Object > otherinfo = new HashMap < > ( ) ; //存一些用得到的信息
String uuid = UUID . randomUUID ( ) . toString ( ) ;
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo ( ) ;
ArrayList < String > hostIps = InitServer . getRealIp ( ) ; //获取IP
boolean oneSign = false ; //一天一段出勤时间段
List < TimeScopeEntity > lsSignTime = new ArrayList < > ( ) ;
List < TimeScopeEntity > lsWorkTime = new ArrayList < > ( ) ;
// List<TimeScopeEntity> lsRestTime = new ArrayList<>();
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
kqWorkTime . setIsFormat ( true ) ;
WorkTimeEntity workTime = kqWorkTime . getWorkTime ( res , kqDate ) ;
String preDate = DateUtil . addDate ( kqDate , - 1 ) ; //上一天日期
String nextDate = DateUtil . addDate ( kqDate , 1 ) ; //下一天日期
if ( workTime ! = null ) {
lsSignTime = workTime . getSignTime ( ) ; //允许打卡时间
lsWorkTime = workTime . getWorkTime ( ) ; //工作时间
// lsRestTime = workTime.getRestTime();//休息时段时间
oneSign = lsWorkTime ! = null & & lsWorkTime . size ( ) = = 1 ;
}
int shiftCount = lsWorkTime = = null ? 0 : lsWorkTime . size ( ) ;
int shiftI = 0 ;
List < Object > lsCheckInfo = new ArrayList < > ( ) ;
for ( int i = 0 ; lsWorkTime ! = null & & i < lsWorkTime . size ( ) ; i + + ) {
shiftI = i ;
TimeScopeEntity signTimeScope = lsSignTime . get ( i ) ;
TimeScopeEntity workTimeScope = lsWorkTime . get ( i ) ;
Map < String , String > shifRuleMap = Maps . newHashMap ( ) ;
String workBeginTime = Util . null2String ( workTimeScope . getBeginTime ( ) ) ;
int workBeginIdx = kqTimesArrayComInfo . getArrayindexByTimes ( workBeginTime ) ;
String workEndTime = Util . null2String ( workTimeScope . getEndTime ( ) ) ;
int workEndIdx = kqTimesArrayComInfo . getArrayindexByTimes ( workEndTime ) ;
boolean workEndTimeAcross = workTimeScope . getEndTimeAcross ( ) ;
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 , res , 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 ) ;
}
}
}
}
lsCheckInfo = new KQFormatSignData ( ) . getSignInfo ( res , signTimeScope , workTimeScope , kqDate , preDate , nextDate , kqTimesArrayComInfo , hostIps , uuid , shiftCount , shiftI ) ;
}
List < String > signIdList = new ArrayList < > ( ) ;
for ( int i = 0 ; i < lsCheckInfo . size ( ) ; i + + ) {
Object o = lsCheckInfo . get ( i ) ;
if ( o ! = null & & o ! = "" ) {
Map < String , Object > temp = ( Map < String , Object > ) o ;
String signId = Util . null2String ( temp . get ( "signId" ) ) ;
if ( StringUtils . isNotBlank ( signId ) ) {
signIdList . add ( signId ) ;
}
}
}
Integer signNumber = 0 ;
if ( signIdList ! = null & & signIdList . size ( ) > 0 ) {
String acqShowAddress = "select showaddress,addr,signfrom from hrmschedulesign where id in (" + String . join ( "," , signIdList ) + ") " ;
// bb.writeLog("acqShowAddress: " + acqShowAddress);
rs . executeQuery ( acqShowAddress ) ;
while ( rs . next ( ) ) {
String showaddress = Util . null2String ( rs . getString ( "showaddress" ) ) ;
String signfrom = Util . null2String ( rs . getString ( "signfrom" ) ) ;
if ( StringUtils . isEmpty ( signfrom ) | | ! StringUtils . equals ( signfrom , "e9mobile" ) ) {
signNumber = signNumber + 1 ;
}
String addr = Util . null2String ( rs . getString ( "addr" ) ) ;
if ( "鸿仕达" . equals ( showaddress ) | | "hostar" . equalsIgnoreCase ( showaddress ) | | "鸿仕达" . equals ( addr ) | | "hostar" . equalsIgnoreCase ( addr ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( showaddress ) & & ( showaddress . contains ( "鸿仕达" ) | | showaddress . toLowerCase ( ) . contains ( "hostar" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( addr ) & & ( addr . contains ( "鸿仕达" ) | | addr . toLowerCase ( ) . contains ( "hostar" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( showaddress ) & & ( showaddress . contains ( "台湾" ) | | showaddress . contains ( "越南" )
| | showaddress . toLowerCase ( ) . contains ( "hostar" ) | | showaddress . toLowerCase ( ) . contains ( "vinh" ) | | showaddress . toLowerCase ( ) . contains ( "ha noi" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( addr ) & & ( addr . contains ( "台湾" ) | | addr . contains ( "越南" )
| | addr . toLowerCase ( ) . contains ( "hostar" ) | | addr . toLowerCase ( ) . contains ( "vinh" ) | | addr . toLowerCase ( ) . contains ( "ha noi" ) ) ) {
signNumber = signNumber + 1 ;
}
}
}
String groupId = kqGroupMemberComInfo . getKQGroupId ( res , kqDate ) ;
if ( signNumber = = 0 ) {
double minValue = 0.00 ;
if ( ( ! CollectionUtils . isEmpty ( pbzbcSet ) ) & & pbzbcSet . contains ( groupId ) ) {
double workingDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_4leave" ) ) ) ;
workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave ;
double restDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_4leave" ) ) ) ;
restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave ;
double holidayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_4leave" ) ) ) ;
holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave ;
double workingDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_nonleave" ) ) ) ;
workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave ;
double restDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_nonleave" ) ) ) ;
restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave ;
double holidayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_nonleave" ) ) ) ;
holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave ;
double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave +
workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave ;
Double attendanceMins = Util . getDoubleValue ( Util . null2String ( attendanceMinsMap . get ( res + "|" + kqDate ) ) ) ;
if ( attendanceMins < 0.00 ) {
attendanceMins = 0.00 ;
}
minValue = attendanceMins + temp ;
double v = Math . round ( Math . max ( minValue , 0.00 ) ) / 60.00 ;
value = "0" ;
if ( v > = 4.00 & & v < 9.00 ) {
value = "1" ;
} else if ( v > = 9.00 ) {
value = "2" ;
}
}
if ( ( ! CollectionUtils . isEmpty ( zrzbcSet ) ) & & zrzbcSet . contains ( groupId ) ) {
minValue = Util . getDoubleValue ( Util . null2String ( signminsMap . get ( res + "|" + kqDate ) ) ) ;
value = String . valueOf ( Math . floor ( ( Math . max ( minValue , 0.00 ) ) / 360 ) ) ;
}
}
}
}
}
} catch ( Exception e ) {
bb . writeLog ( "get OtherStatAllowance error:" + e . getMessage ( ) ) ;
}
return value ;
}
public Map < String , Object > getDailyFlowOverTimeDataAllowance ( String userId , String kqDate ) {
Map < String , Object > datas = new HashMap < > ( ) ; ;
RecordSet rs = new RecordSet ( ) ;
String sql = "" ;
String sqlWhere = " " ;
String valueRes = "" ;
try {
if ( userId . length ( ) > 0 ) {
sqlWhere + = " and a.id in(" + userId + ") " ;
}
KQOvertimeRulesBiz kqOvertimeRulesBiz = new KQOvertimeRulesBiz ( ) ;
int uintType = kqOvertimeRulesBiz . getMinimumUnit ( ) ; //当前加班单位
double hoursToDay = kqOvertimeRulesBiz . getHoursToDay ( ) ; //当前天跟小时计算关系
String valueField = "" ;
if ( uintType = = 3 | | uintType = = 5 | | uintType = = 6 ) { //按小时计算
valueField = "sum( case when durationrule='3' then duration else duration*" + hoursToDay + " end) as val" ;
} else { //按天计算
valueField = "sum( case when durationrule='3' then duration/" + hoursToDay + " else duration end) as val" ;
}
sql = " select resourceid,changeType,belongdate,paidLeaveEnable, sum(cast(duration_min as decimal(18,4))) as val " +
" from hrmresource a, kq_flow_overtime b " +
" where a.id = b.resourceid and belongdate >='" + kqDate + "' and belongdate <='" + kqDate + "' " + sqlWhere +
" group by resourceid,changeType,paidLeaveEnable,belongdate " ;
rs . execute ( sql ) ;
while ( rs . next ( ) ) {
String resourceid = rs . getString ( "resourceid" ) ;
String belongdate = rs . getString ( "belongdate" ) ;
String paidLeaveEnable = rs . getString ( "paidLeaveEnable" ) ;
int changeType = rs . getInt ( "changeType" ) ; //1-节假日、2-工作日、3-休息日
double value = rs . getDouble ( "val" ) < 0 ? 0 : rs . getDouble ( "val" ) ;
if ( uintType = = 3 | | uintType = = 5 | | uintType = = 6 ) { //按小时计算
value = Util . getDoubleValue ( KQDurationCalculatorUtil . getDurationRound ( value + "" ) ) ;
} else { //按天计算
value = Util . getDoubleValue ( KQDurationCalculatorUtil . getDurationRound ( value + "" ) ) ;
}
String flowType = "" ;
if ( changeType = = 1 ) {
flowType = "holidayOvertime" ;
} else if ( changeType = = 2 ) {
flowType = "workingDayOvertime" ;
} else if ( changeType = = 3 ) {
flowType = "restDayOvertime" ;
}
if ( "1" . equalsIgnoreCase ( paidLeaveEnable ) ) {
//1表示关联调休
flowType + = "_4leave" ;
} else {
//0表示不关联调休
flowType + = "_nonleave" ;
}
//df.format 默认是不四舍五入的 0.125这样的就会直接变成0.12了
symbols . setDecimalSeparator ( '.' ) ;
df . setMaximumFractionDigits ( 5 ) ;
df . setDecimalFormatSymbols ( symbols ) ;
datas . put ( resourceid + "|" + belongdate + "|" + flowType , df . format ( value ) ) ;
}
} catch ( Exception e ) {
bb . writeLog ( "getDailyFlowOverTimeDataAllowance error:" + e . getMessage ( ) ) ;
}
return datas ;
}
public String getNightAllowance ( String userId , String kqDate ) {
String value = "" ;
RecordSet rs = new RecordSet ( ) ;
String sql = "" ;
String sqlWhere = " " ;
try {
KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo ( ) ;
if ( userId . length ( ) > 0 ) {
sqlWhere + = " and a.id in(" + userId + ") " ;
}
//获取加班时长
Map < String , Object > dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance ( userId , kqDate ) ;
// 获取责任制、排班次班次
Set < String > zrzbcSet = new HashSet < > ( ) ;
Set < String > pbzbcSet = new HashSet < > ( ) ;
String acqSql = "select kqgroup, grouptype from uf_ZeroPointSubSft" ;
rs . executeQuery ( acqSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
String grouptype = Util . null2String ( rs . getString ( "grouptype" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "0" ) ) {
zrzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "1" ) ) {
pbzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
}
//获取夜班班次
List < String > nightShiftList = new ArrayList < > ( ) ;
String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0" ;
rs . executeQuery ( acqNightShiftSql ) ;
while ( rs . next ( ) ) {
String shift = Util . null2String ( rs . getString ( "shift" ) ) ;
if ( StringUtils . isNotBlank ( shift ) ) {
nightShiftList . add ( shift ) ;
}
}
if ( nightShiftList ! = null & nightShiftList . size ( ) > 0 ) {
String nightshiftsub = Util . null2String ( bb . getPropValue ( "project_hostar" , "nightshiftsubcompany" ) ) ;
if ( StringUtils . isNotBlank ( nightshiftsub ) ) {
//查询该分部下的人员
List < String > resIds = new ArrayList < > ( ) ;
sqlWhere + = " and a.subcompanyid1 in (" + nightshiftsub + ") " ;
String acqResSql = "select a.id from hrmresource a where 1=1 " + sqlWhere ;
bb . writeLog ( "acqResSql: " + acqResSql ) ;
rs . executeQuery ( acqResSql ) ;
while ( rs . next ( ) ) {
String id = Util . null2String ( rs . getString ( "id" ) ) ;
if ( StringUtils . isNotBlank ( id ) ) {
resIds . add ( id ) ;
}
}
// bb.writeLog("resIds: " + resIds);
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo ( ) ;
if ( resIds ! = null & & resIds . size ( ) > 0 ) {
HostarUtil houtil = new HostarUtil ( ) ;
//先获取到出勤时长
Map < String , Double > signminsMap = new HashMap < > ( ) ;
Map < String , Double > attendanceMinsMap = new HashMap < > ( ) ;
String acqAttenSql = " select resourceid, attendancemins, kqdate,signmins from kq_format_total where resourceid in (" + String . join ( "," , resIds ) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'" ;
rs . executeQuery ( acqAttenSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
Double attendancemins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "attendancemins" ) ) ) ;
Double signmins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "signmins" ) ) ) ;
String kqdate = Util . null2String ( rs . getString ( "kqdate" ) ) ;
if ( signmins > = 0.00 ) {
// double signTemp = signmins / 60;
// int quotient = (int) (signTemp / 6);
signminsMap . put ( resourceid + "|" + kqdate , signmins ) ;
}
if ( attendancemins > = 0.00 ) {
attendanceMinsMap . put ( resourceid + "|" + kqdate , attendancemins ) ;
}
}
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
for ( String res : resIds ) {
//获取当天班次
Map < String , Object > serialInfo = kqWorkTime . getSerialInfo ( res , kqDate , false ) ;
if ( serialInfo ! = null & & serialInfo . size ( ) > 0 ) {
int serialid = Util . getIntValue ( Util . null2String ( serialInfo . get ( kqDate ) ) , 0 ) ;
if ( serialid > 0 ) {
if ( ! nightShiftList . contains ( String . valueOf ( serialid ) ) ) {
continue ;
}
} else {
continue ;
}
}
Object groupIdObj = serialInfo . get ( "groupId" ) ;
String groupId = null ;
if ( Objects . isNull ( groupIdObj ) ) {
groupId = kqGroupMemberComInfo . getKQGroupId ( res , kqDate ) ;
} else {
groupId = groupIdObj . toString ( ) ;
}
if ( ( ! CollectionUtils . isEmpty ( pbzbcSet ) ) & & pbzbcSet . contains ( groupId ) ) {
double workingDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_4leave" ) ) ) ;
workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave ;
double restDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_4leave" ) ) ) ;
restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave ;
double holidayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_4leave" ) ) ) ;
holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave ;
double workingDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_nonleave" ) ) ) ;
workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave ;
double restDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_nonleave" ) ) ) ;
restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave ;
double holidayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_nonleave" ) ) ) ;
holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave ;
double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave +
workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave ;
Double attendanceMins = Util . getDoubleValue ( Util . null2String ( attendanceMinsMap . get ( res + "|" + kqDate ) ) ) ;
value = String . valueOf ( Math . floor ( ( ( attendanceMins < 0.00 ? 0.00 : attendanceMins ) + temp ) / 300 ) ) ;
}
if ( ( ! CollectionUtils . isEmpty ( zrzbcSet ) ) & & zrzbcSet . contains ( groupId ) ) {
Double signmins = Util . getDoubleValue ( Util . null2String ( signminsMap . get ( res + "|" + kqDate ) ) ) ;
value = String . valueOf ( Math . floor ( ( signmins < 0.00 ? 0.00 : signmins ) / 360 ) ) ;
}
}
}
}
}
} catch ( Exception e ) {
bb . writeLog ( "get NightAllowance error:" + e . getMessage ( ) ) ;
}
return value ;
}
public String getStatAllowance ( String userId , String kqDate ) {
String value = "0" ;
RecordSet rs = new RecordSet ( ) ;
String sql = "" ;
String sqlWhere = " " ;
try {
KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo ( ) ;
if ( userId . length ( ) > 0 ) {
sqlWhere + = " and a.id in(" + userId + ") " ;
}
//获取加班时长
Map < String , Object > dailyFlowOverTimeData = getDailyFlowOverTimeDataAllowance ( userId , kqDate ) ;
//首先去除指定不享有的分部
List < String > subComoanyList = new ArrayList < > ( ) ;
String acqNoStatAllSql = "select subcompany from uf_NoStatAllSubCom where isdelete = 0 or isdelete is null" ;
rs . executeQuery ( acqNoStatAllSql ) ;
while ( rs . next ( ) ) {
String subcompany = Util . null2String ( rs . getString ( "subcompany" ) ) ;
if ( StringUtils . isNotBlank ( subcompany ) ) {
subComoanyList . add ( subcompany ) ;
}
}
String subComoanys = "" ;
if ( subComoanyList ! = null & & subComoanyList . size ( ) > 0 ) {
subComoanys = String . join ( "," , subComoanyList ) ;
}
if ( StringUtils . isNotBlank ( subComoanys ) ) {
sqlWhere + = " and a.subcompanyid1 not in (" + subComoanys + ") " ;
}
// 获取责任制、排班次班次
Set < String > zrzbcSet = new HashSet < > ( ) ;
Set < String > pbzbcSet = new HashSet < > ( ) ;
String acqSql = "select kqgroup, grouptype from uf_ZeroPointSubSft" ;
rs . executeQuery ( acqSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
String grouptype = Util . null2String ( rs . getString ( "grouptype" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "0" ) ) {
zrzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
if ( StringUtils . isNotBlank ( kqgroup ) & & StringUtils . equals ( grouptype , "1" ) ) {
pbzbcSet . addAll ( Arrays . asList ( kqgroup . split ( "," ) ) ) ;
}
}
//指定人员不享受
List < String > noRes = new ArrayList < > ( ) ;
String acqNoResSql = "select resourceid from uf_NoStatAllRes where isdelete = 0 or isdelete is null" ;
rs . executeQuery ( acqNoResSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
if ( StringUtils . isNotBlank ( resourceid ) ) {
noRes . add ( resourceid ) ;
}
}
if ( noRes ! = null & & noRes . size ( ) > 0 ) {
sqlWhere + = " and a.id not in (" + String . join ( "," , noRes ) + ") " ;
}
List < String > resIds = new ArrayList < > ( ) ;
String acqResSql = "select a.id from hrmresource a where 1=1 " + sqlWhere ;
bb . writeLog ( "acqResSql: " + acqResSql ) ;
rs . executeQuery ( acqResSql ) ;
while ( rs . next ( ) ) {
String id = Util . null2String ( rs . getString ( "id" ) ) ;
if ( StringUtils . isNotBlank ( id ) ) {
resIds . add ( id ) ;
}
}
// bb.writeLog("resIds: " + resIds);
if ( resIds ! = null & & resIds . size ( ) > 0 & & StringUtils . isNotBlank ( kqDate ) ) {
HostarUtil houtil = new HostarUtil ( ) ;
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo ( ) ;
//先获取到实际打卡时长
Map < String , Double > signminsMap = new HashMap < > ( ) ;
Map < String , Double > attendanceMinsMap = new HashMap < > ( ) ;
String acqAttenSql = " select resourceid, attendancemins, kqdate,signmins from kq_format_total where resourceid in (" + String . join ( "," , resIds ) + ") and kqdate >='" + kqDate + "' and kqdate <='" + kqDate + "'" ;
rs . executeQuery ( acqAttenSql ) ;
while ( rs . next ( ) ) {
String resourceid = Util . null2String ( rs . getString ( "resourceid" ) ) ;
Double attendancemins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "attendancemins" ) ) ) ;
Double signmins = Util . getDoubleValue ( Util . null2String ( rs . getString ( "signmins" ) ) ) ;
String kqdate = Util . null2String ( rs . getString ( "kqdate" ) ) ;
if ( signmins > = 0.00 ) {
// double signTemp = signmins / 60;
// int quotient = (int) (signTemp / 6);
signminsMap . put ( resourceid + "|" + kqdate , signmins ) ;
}
if ( attendancemins > = 0.00 ) {
attendanceMinsMap . put ( resourceid + "|" + kqdate , attendancemins ) ;
}
}
// 获取享受的考勤组
List < String > grouplist = new ArrayList < String > ( ) ;
String acqGroupSql = "select kqgroup from uf_StatAlloKqGroup where isdelete is null or isdelete = 0 " ;
rs . executeQuery ( acqGroupSql ) ;
while ( rs . next ( ) ) {
String kqgroup = Util . null2String ( rs . getString ( "kqgroup" ) ) ;
if ( StringUtils . isNotBlank ( kqgroup ) ) {
grouplist . add ( kqgroup ) ;
}
}
if ( grouplist ! = null & & grouplist . size ( ) = = 0 ) {
return "0" ;
}
for ( String res : resIds ) {
//判断考勤组
/*获取考勤组的ID, 因为考勤组有有效期, 所以需要传入日期*/
String groupId = kqGroupMemberComInfo . getKQGroupId ( userId , kqDate ) ;
if ( ! grouplist . contains ( groupId ) ) {
continue ;
}
//获取考勤打卡
Map < String , Object > otherinfo = new HashMap < > ( ) ; //存一些用得到的信息
String uuid = UUID . randomUUID ( ) . toString ( ) ;
KQTimesArrayComInfo kqTimesArrayComInfo = new KQTimesArrayComInfo ( ) ;
ArrayList < String > hostIps = InitServer . getRealIp ( ) ; //获取IP
boolean oneSign = false ; //一天一段出勤时间段
List < TimeScopeEntity > lsSignTime = new ArrayList < > ( ) ;
List < TimeScopeEntity > lsWorkTime = new ArrayList < > ( ) ;
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
kqWorkTime . setIsFormat ( true ) ;
WorkTimeEntity workTime = kqWorkTime . getWorkTime ( res , kqDate ) ;
String preDate = DateUtil . addDate ( kqDate , - 1 ) ; //上一天日期
String nextDate = DateUtil . addDate ( kqDate , 1 ) ; //下一天日期
if ( workTime ! = null ) {
lsSignTime = workTime . getSignTime ( ) ; //允许打卡时间
lsWorkTime = workTime . getWorkTime ( ) ; //工作时间
oneSign = lsWorkTime ! = null & & lsWorkTime . size ( ) = = 1 ;
}
int shiftCount = lsWorkTime = = null ? 0 : lsWorkTime . size ( ) ;
int shiftI = 0 ;
List < Object > lsCheckInfo = new ArrayList < > ( ) ;
for ( int i = 0 ; lsWorkTime ! = null & & i < lsWorkTime . size ( ) ; i + + ) {
shiftI = i ;
TimeScopeEntity signTimeScope = lsSignTime . get ( i ) ;
TimeScopeEntity workTimeScope = lsWorkTime . get ( i ) ;
Map < String , String > shifRuleMap = Maps . newHashMap ( ) ;
String workBeginTime = Util . null2String ( workTimeScope . getBeginTime ( ) ) ;
int workBeginIdx = kqTimesArrayComInfo . getArrayindexByTimes ( workBeginTime ) ;
String workEndTime = Util . null2String ( workTimeScope . getEndTime ( ) ) ;
int workEndIdx = kqTimesArrayComInfo . getArrayindexByTimes ( workEndTime ) ;
boolean workEndTimeAcross = workTimeScope . getEndTimeAcross ( ) ;
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 , res , 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 ) ;
}
}
}
}
lsCheckInfo = new KQFormatSignData ( ) . getSignInfo ( res , signTimeScope , workTimeScope , kqDate , preDate , nextDate , kqTimesArrayComInfo , hostIps , uuid , shiftCount , shiftI ) ;
}
List < String > signIdList = new ArrayList < > ( ) ;
for ( int i = 0 ; i < lsCheckInfo . size ( ) ; i + + ) {
Object o = lsCheckInfo . get ( i ) ;
if ( o ! = null & & o ! = "" ) {
Map < String , Object > temp = ( Map < String , Object > ) o ;
String signId = Util . null2String ( temp . get ( "signId" ) ) ;
if ( StringUtils . isNotBlank ( signId ) ) {
signIdList . add ( signId ) ;
}
}
}
// bb.writeLog("signIdList: " + signIdList);
Integer signNumber = 0 ;
if ( signIdList ! = null & & signIdList . size ( ) > 0 ) {
String acqShowAddress = "select showaddress,addr,signfrom from hrmschedulesign where id in (" + String . join ( "," , signIdList ) + ") " ;
// bb.writeLog("acqShowAddress: " + acqShowAddress);
rs . executeQuery ( acqShowAddress ) ;
while ( rs . next ( ) ) {
String showaddress = Util . null2String ( rs . getString ( "showaddress" ) ) ;
String signfrom = Util . null2String ( rs . getString ( "signfrom" ) ) ;
if ( StringUtils . isEmpty ( signfrom ) | | ! StringUtils . equals ( signfrom , "e9mobile" ) ) {
signNumber = signNumber + 1 ;
}
String addr = Util . null2String ( rs . getString ( "addr" ) ) ;
if ( "鸿仕达" . equals ( showaddress ) | | "hostar" . equalsIgnoreCase ( showaddress ) | | "鸿仕达" . equals ( addr ) | | "hostar" . equalsIgnoreCase ( addr ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( showaddress ) & & ( showaddress . contains ( "鸿仕达" ) | | showaddress . toLowerCase ( ) . contains ( "hostar" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( addr ) & & ( addr . contains ( "鸿仕达" ) | | addr . toLowerCase ( ) . contains ( "hostar" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( showaddress ) & & ( showaddress . contains ( "台湾" ) | | showaddress . contains ( "越南" )
| | showaddress . toLowerCase ( ) . contains ( "hostar" ) | | showaddress . toLowerCase ( ) . contains ( "vinh" ) | | showaddress . toLowerCase ( ) . contains ( "ha noi" ) ) ) {
signNumber = signNumber + 1 ;
}
if ( StringUtils . isNotEmpty ( addr ) & & ( addr . contains ( "台湾" ) | | addr . contains ( "越南" )
| | addr . toLowerCase ( ) . contains ( "hostar" ) | | addr . toLowerCase ( ) . contains ( "vinh" ) | | addr . toLowerCase ( ) . contains ( "ha noi" ) ) ) {
signNumber = signNumber + 1 ;
}
}
}
if ( signNumber = = 0 ) {
if ( ( ! CollectionUtils . isEmpty ( pbzbcSet ) ) & & pbzbcSet . contains ( groupId ) ) {
double workingDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_4leave" ) ) ) ;
workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave ;
double restDayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_4leave" ) ) ) ;
restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave ;
double holidayOvertime_4leave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_4leave" ) ) ) ;
holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave ;
double workingDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|workingDayOvertime_nonleave" ) ) ) ;
workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave ;
double restDayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|restDayOvertime_nonleave" ) ) ) ;
restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave ;
double holidayOvertime_nonleave = Util . getDoubleValue ( Util . null2String ( dailyFlowOverTimeData . get ( res + "|" + kqDate + "|holidayOvertime_nonleave" ) ) ) ;
holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave ;
double temp = workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave +
workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave ;
Double attendanceMins = Util . getDoubleValue ( Util . null2String ( attendanceMinsMap . get ( res + "|" + kqDate ) ) ) ;
value = String . valueOf ( Math . floor ( ( ( attendanceMins < 0.00 ? 0.00 : attendanceMins ) + temp ) / 300 ) ) ;
}
if ( ( ! CollectionUtils . isEmpty ( zrzbcSet ) ) & & zrzbcSet . contains ( groupId ) ) {
Double signmins = Util . getDoubleValue ( Util . null2String ( signminsMap . get ( res + "|" + kqDate ) ) ) ;
value = String . valueOf ( Math . floor ( ( signmins < 0.00 ? 0.00 : signmins ) / 360 ) ) ;
}
}
}
}
} catch ( Exception e ) {
bb . writeLog ( "get StatAllowance error:" + e . getMessage ( ) ) ;
}
return value ;
}
public String getMealAllowance ( String id , String kqDateA ) {
String value = "0" ;
RecordSet rs = new RecordSet ( ) ;
String sql = "" ;
try {
// KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo();
// 首先获取出差公出流程信息
// Map<String, Object> evectionMap = new HashMap<>();
String evectionTableName = Util . null2String ( bb . getPropValue ( "project_hostar" , "evectionTableName" ) ) ;
sql = " select a.* from (" +
"select id, requestid, jd as longitude, wd as latitude from " + evectionTableName +
" WHERE (sjccr = '" + id + "' or ','+CAST(nbtxr AS varchar(max))+',' like '%,'+CAST(" + id + " AS varchar(10))+',%') " +
" and ksrq <='" + kqDateA + "' and (((sjjsrq is null or sjjsrq = '') and yjjsrq >= '" + kqDateA + "') or (sjjsrq is not null and sjjsrq != '' and sjjsrq >= '" + kqDateA + "'))" +
") a, workflow_requestbase b WHERE a.requestId = b.requestId and b.currentnodetype != 0" ;
bb . writeLog ( "sql: " + sql ) ;
boolean isGoing = false ;
rs . execute ( sql ) ;
while ( rs . next ( ) ) {
isGoing = true ;
}
Map < String , Map < String , Object > > lsCheckInfo = new HashMap < > ( ) ;
List < Map < String , Object > > legWorkInfos = new ArrayList < > ( ) ;
if ( isGoing ) {
String acqLegWorkSignSql = "select operate_time, longitude, latitude,address from mobile_sign where operater = ? and operate_date = '" + kqDateA + "' order by operate_time asc " ;
rs . executeQuery ( acqLegWorkSignSql , id ) ;
while ( rs . next ( ) ) {
String operateTime = Util . null2String ( rs . getString ( "operate_time" ) ) ;
String longitude = Util . null2String ( rs . getString ( "longitude" ) ) ;
String latitude = Util . null2String ( rs . getString ( "latitude" ) ) ;
String address = Util . null2String ( rs . getString ( "address" ) ) ;
if ( "hostar" . equalsIgnoreCase ( address ) | | "鸿仕达" . equals ( address ) | | "增善路" . equals ( address )
| | "星圃路" . equals ( address ) | | "智慧新城" . equals ( address ) ) {
continue ;
}
if ( StringUtils . isNotEmpty ( address ) & & ( address . contains ( "鸿仕达" ) | | address . contains ( "增善路" )
| | address . contains ( "星圃路" ) | | address . contains ( "智慧新城" ) | | address . toLowerCase ( ) . contains ( "hostar" ) ) ) {
continue ;
}
if ( StringUtils . isNotEmpty ( address ) & & ( address . contains ( "台湾" ) | | address . contains ( "越南" )
| | address . toLowerCase ( ) . contains ( "hostar" ) | | address . toLowerCase ( ) . contains ( "vinh" ) | | address . toLowerCase ( ) . contains ( "ha noi" ) ) ) {
continue ;
}
if ( StringUtils . isNotBlank ( operateTime ) & & StringUtils . isNotBlank ( longitude ) & & StringUtils . isNotBlank ( latitude ) ) {
Map < String , Object > temp = new HashMap < > ( ) ;
temp . put ( "operateTime" , operateTime ) ;
temp . put ( "longitude" , longitude ) ;
temp . put ( "latitude" , latitude ) ;
legWorkInfos . add ( temp ) ;
}
}
if ( legWorkInfos ! = null & & legWorkInfos . size ( ) > 1 ) {
String tempSignIn = "" ;
String tempSignInLatitude = "" ;
String tempSignInLongitude = "" ;
String tempSignOutLatitude = "" ;
String tempSignOutLongitude = "" ;
String tempSignOut = "" ;
Map < String , Object > checkInfo = new HashMap < > ( ) ;
for ( Map < String , Object > temp : legWorkInfos ) {
String operateTime = Util . null2String ( temp . get ( "operateTime" ) ) ;
String longitude = Util . null2String ( temp . get ( "longitude" ) ) ;
String latitude = Util . null2String ( temp . get ( "latitude" ) ) ;
if ( StringUtils . isBlank ( tempSignIn ) ) {
tempSignIn = operateTime ;
tempSignInLatitude = latitude ;
tempSignInLongitude = longitude ;
} else {
if ( operateTime . compareTo ( tempSignIn ) < 0 ) {
tempSignIn = operateTime ;
tempSignInLatitude = latitude ;
tempSignInLongitude = longitude ;
}
}
if ( StringUtils . isBlank ( tempSignOut ) ) {
tempSignOut = operateTime ;
tempSignOutLatitude = latitude ;
tempSignOutLongitude = longitude ;
} else {
if ( operateTime . compareTo ( tempSignOut ) > 0 ) {
tempSignOut = operateTime ;
tempSignOutLatitude = latitude ;
tempSignOutLongitude = longitude ;
}
}
}
// }
checkInfo . put ( "signDate" , kqDateA ) ; //签到签退日期
checkInfo . put ( "signInTime" , tempSignIn ) ; //签到时间
checkInfo . put ( "signInLatitude" , tempSignInLatitude ) ; //签到纬度
checkInfo . put ( "signInLongitude" , tempSignInLongitude ) ; //签到经度
checkInfo . put ( "signOutTime" , tempSignOut ) ; //签退时间
checkInfo . put ( "signOutLatitude" , tempSignOutLatitude ) ; //签退纬度
checkInfo . put ( "signOutLongitude" , tempSignOutLongitude ) ; //签退经度
lsCheckInfo . put ( id + "|" + kqDateA , checkInfo ) ;
}
}
HostarUtil hostarUtil = new HostarUtil ( ) ;
String MealAlloTableName = Util . null2String ( bb . getPropValue ( "project_hostar" , "MealAllowanceTableName" ) ) ;
if ( StringUtils . isNotBlank ( MealAlloTableName ) ) {
//获取餐补判断时间
List < Map < String , String > > MealMap = new ArrayList < > ( ) ;
String acqTimeSql = "select startTime, endTime from " + MealAlloTableName + " where (isDelete is null or isDelete = 0)" ;
// bb.writeLog("acqTimeSql: " + acqTimeSql);
rs . executeQuery ( acqTimeSql ) ;
while ( rs . next ( ) ) {
String startTime = Util . null2String ( rs . getString ( "startTime" ) ) ;
String endTime = Util . null2String ( rs . getString ( "endTime" ) ) ;
Map < String , String > temp = new HashMap < > ( ) ;
temp . put ( "startTime" , startTime ) ;
temp . put ( "endTime" , endTime ) ;
MealMap . add ( temp ) ;
}
// bb.writeLog("MealMap: " + MealMap);
//根据外勤打卡数据计算餐补数据
for ( String key : lsCheckInfo . keySet ( ) ) {
// String[] split = key.split("\\|");
// String userId = split[0];
// String kqDate = split[1];
Map < String , Object > temp = lsCheckInfo . get ( key ) ;
String signInTime = Util . null2String ( temp . get ( "signInTime" ) ) ;
String signOutTime = Util . null2String ( temp . get ( "signOutTime" ) ) ;
if ( StringUtils . isNotBlank ( signInTime ) & & StringUtils . isNotBlank ( signOutTime ) ) {
for ( Map < String , String > me : MealMap ) {
String startTime = me . get ( "startTime" ) ;
String endTime = me . get ( "endTime" ) ;
if ( StringUtils . isNotBlank ( startTime ) & & StringUtils . isNotBlank ( endTime ) ) {
startTime = startTime + ":00" ;
endTime = endTime + ":00" ;
}
if ( ( signInTime . compareTo ( startTime ) < = 0 ) & & ( signOutTime . compareTo ( endTime ) > = 0 ) ) {
if ( StringUtils . isEmpty ( value ) | | StringUtils . equals ( value , "0" ) ) {
value = "1" ;
} else {
int valueT = Integer . parseInt ( value ) + 1 ;
value = String . valueOf ( valueT ) ;
}
}
}
}
}
}
} catch ( Exception e ) {
bb . writeLog ( "get MealAllowance error:" + e . getMessage ( ) ) ;
}
return value ;
}
public String getZeroBt ( String userId , String kqDate ) {
BaseBean bb = new BaseBean ( ) ;
RecordSet rs = new RecordSet ( ) ;
String value = "0" ;
try {
//获取夜班班次
List < String > nightShiftList = new ArrayList < > ( ) ;
String acqNightShiftSql = "select shift from uf_nightshiftmanage where isdelete is null or isdelete = 0" ;
rs . executeQuery ( acqNightShiftSql ) ;
while ( rs . next ( ) ) {
String shift = Util . null2String ( rs . getString ( "shift" ) ) ;
if ( StringUtils . isNotBlank ( shift ) ) {
nightShiftList . add ( shift ) ;
}
}
//获取当天班次
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
Map < String , Object > serialInfo = kqWorkTime . getSerialInfo ( userId , kqDate , false ) ;
if ( serialInfo ! = null & & serialInfo . size ( ) > 0 ) {
int serialid = Util . getIntValue ( Util . null2String ( serialInfo . get ( kqDate ) ) , 0 ) ;
if ( serialid > 0 ) {
if ( ( ! CollectionUtils . isEmpty ( nightShiftList ) ) & & nightShiftList . contains ( String . valueOf ( serialid ) ) ) {
value = "0" ;
} else {
rs . executeQuery ( "select zeropoint from kq_format_total where resourceid = ? and kqdate = ?" , userId , kqDate ) ;
if ( rs . next ( ) ) {
value = rs . getString ( "zeropoint" ) ;
}
}
} else {
value = "0" ;
}
}
} catch ( Exception e ) {
bb . writeLog ( "get ZeroBt error:" + e . getMessage ( ) ) ;
}
return value ;
}
}