@ -1,6 +1,8 @@
package com.engine.attendance.attendanceanalysis.service.impl ;
import com.engine.attendance.attendanceanalysis.cmd.workovertime.GetOvertimeDurationCmd ;
import com.engine.attendance.attendanceanalysis.cmd.item.WorkOvertimeItemCmd ;
import com.engine.attendance.attendanceanalysis.cmd.workovertime.SaveWorkOverTimeCmd ;
import com.engine.attendance.attendanceanalysis.dto.ClockPointDTO ;
import com.engine.attendance.attendanceanalysis.service.WorkOverTimeService ;
import com.engine.attendance.enums.* ;
@ -14,8 +16,9 @@ import lombok.extern.slf4j.Slf4j;
import weaver.general.TimeUtil ;
import weaver.general.Util ;
import java. math.BigDecimal ;
import java. time.ZoneOffset ;
import java.util.Calendar ;
import java.util.Comparator ;
import java.util.List ;
import java.util.Map ;
import java.util.stream.Collectors ;
@ -30,43 +33,16 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
List < Map < String , Object > > scheduleResult = ( List < Map < String , Object > > ) params . get ( "scheduleResult" ) ;
//分析日期
String analysisDate = Util . null2String ( params . get ( "analysisDate" ) ) ;
//请假记录
List < Map < String , Object > > askForLeaveList = ( List < Map < String , Object > > ) params . get ( "askForLeaveList" ) ;
//请假项目
Map < String , Map < String , Object > > askForLeaveItems = ( Map < String , Map < String , Object > > ) params . get ( "askForLeaveItems" ) ;
//外出记录
List < Map < String , Object > > evectionList = ( List < Map < String , Object > > ) params . get ( "evectionList" ) ;
//外出项目
Map < String , Map < String , Object > > evectionItems = ( Map < String , Map < String , Object > > ) params . get ( "evectionItems" ) ;
//打卡卡点
List < ClockPointDTO > clcokInTimeDataList = ( List < ClockPointDTO > ) params . get ( "clcokInTimeData" ) ;
//请假后消除的异常
List < Map < String , Object > > offsetAskForLeaveAnomaly = ( List < Map < String , Object > > ) params . get ( "offsetAskForLeaveAnomaly" ) ;
//出差外出后消除的异常
List < Map < String , Object > > offsetEvectionAnomaly = ( List < Map < String , Object > > ) params . get ( "offsetEvectionAnomaly" ) ;
//经过请假外出处理过的异常项目
List < Map < String , Object > > abnormalClockInList = ( List < Map < String , Object > > ) params . get ( "abnormalClockInList" ) ;
//不需要记录的异常项目
List < Map < String , Object > > notRecordAbnormalClockInList = ( List < Map < String , Object > > ) params . get ( "notRecordAbnormalClockInList" ) ;
abnormalClockInList . addAll ( notRecordAbnormalClockInList ) ;
//总抵消异常
List < Map < String , Object > > anomalyList = Lists . newArrayList ( ) ;
anomalyList . addAll ( offsetEvectionAnomaly ) ;
anomalyList . addAll ( offsetAskForLeaveAnomaly ) ;
Map < String , Map < String , Object > > clcokInTimeMap = Maps . newHashMap ( ) ;
List < Map < String , Object > > workOverTimeResults = null ;
Calendar calendar = Calendar . getInstance ( ) ;
calendar . set ( Integer . valueOf ( analysisDate . split ( "-" ) [ 0 ] ) , Integer . valueOf ( analysisDate . split ( "-" ) [ 1 ] ) - 1 , 1 ) ;
long diffdays = calendar . getActualMaximum ( Calendar . DAY_OF_MONTH ) ;
params . put ( "diffdays" , diffdays ) ;
for ( ClockPointDTO clockPointDTO : clcokInTimeDataList ) {
//当天打卡数据
@ -75,526 +51,86 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
String pointTime = clockPointDTO . getClassTime ( ) ;
clcokInTimeMap . put ( pointTime , clcokInTime ) ;
}
//人员
String userId = Util . null2String ( params . get ( "userId" ) ) ;
List < Map < String , Object > > resultLists = Lists . newArrayList ( ) ;
for ( Map < String , Object > scheduleMap : scheduleResult ) {
String bdlx = Util . null2String ( scheduleMap . get ( "bdlx" ) ) ;
String rqlx = Util . null2String ( scheduleMap . get ( "rqlx" ) ) ;
Map < String , Object > getWorkOverTimeParam = Maps . newHashMap ( ) ;
Map < String , Object > workOverTimeItems = Maps . newHashMap ( ) ;
//加班开始时间
String kssj = Utils . getkssjTime ( scheduleMap , analysisDate ) ;
//加班结束时间
String jssj = Utils . getjssjTime ( scheduleMap , analysisDate ) ;
//加班实际开始时间
String realityStartTime = "" ;
//加班实际结束时间
String realityEndime = "" ;
params . put ( "clcokInTimeMap" , clcokInTimeMap ) ;
getWorkOverTimeParam . put ( "attendanceItems" , attendanceItems ) ;
getWorkOverTimeParam . put ( "rqlx" , scheduleMap . get ( "rqlx" ) ) ;
List < Map < String , Object > > restOverTimeList = scheduleResult . stream ( ) . filter ( e - > e . get ( "bdlx" ) . equals ( ClassSegmentTypeEnum . OVERTIME_PLAN . getKey ( ) )
& & ClassSegmentTypeEnum . WORK_TIME . getKey ( ) . equals ( e . get ( "beforeClassSegment" ) ) ) . collect ( Collectors . toList ( ) ) ;
List < Map < String , Object > > workTimeBeLateItems = Lists . newArrayList ( ) ;
//开始必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String ksjbbxydk = scheduleMap . get ( "ksdk" ) . toString ( ) ;
//结束必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String jsjbbxydk = scheduleMap . get ( "jsdk" ) . toString ( ) ;
if ( ClassSegmentTypeEnum . EXTENDED_OVERTIME . getKey ( ) . equals ( bdlx ) ) {
getWorkOverTimeParam . put ( "workfor" , WorkForTimeEnum . DELAY_TO_WORK_OVERTIME . getKey ( ) ) ;
Map < String , Object > result = commandExecutor . execute ( new WorkOvertimeItemCmd ( getWorkOverTimeParam ) ) ;
//加班项目
workTimeBeLateItems = ( List < Map < String , Object > > ) result . get ( "attendanceItems" ) ;
} else if ( ClassSegmentTypeEnum . EARLY_OVERTIME . getKey ( ) . equals ( bdlx ) ) {
getWorkOverTimeParam . put ( "workfor" , WorkForTimeEnum . EARLY_TO_WORK_OVERTIME . getKey ( ) ) ;
Map < String , Object > result = commandExecutor . execute ( new WorkOvertimeItemCmd ( getWorkOverTimeParam ) ) ;
workTimeBeLateItems = ( List < Map < String , Object > > ) result . get ( "attendanceItems" ) ;
} else if ( ClassSegmentTypeEnum . OVERTIME_PLAN . getKey ( ) . equals ( bdlx ) ) {
getWorkOverTimeParam . put ( "workfor" , WorkForTimeEnum . PLAN_WORK_OVERTIME . getKey ( ) ) ;
workTimeBeLateItems = ( List < Map < String , Object > > ) scheduleMap . get ( "jblx" ) ;
} else if ( ClassSegmentTypeEnum . OVERTIME_IN_CLASS . getKey ( ) . equals ( bdlx ) ) {
getWorkOverTimeParam . put ( "workfor" , WorkForTimeEnum . OVERTIME_IN_CLASS . getKey ( ) ) ;
Map < String , Object > result = commandExecutor . execute ( new WorkOvertimeItemCmd ( getWorkOverTimeParam ) ) ;
workTimeBeLateItems = ( List < Map < String , Object > > ) result . get ( "attendanceItems" ) ;
} else {
continue ;
}
if ( workTimeBeLateItems . size ( ) = = 0 ) {
/ * *
* 非 休 息 班 次 , 加 班 项 目 结 果 集
* /
List < Map < String , Object > > resultLists = Lists . newArrayList ( ) ;
for ( Map < String , Object > scheduleMap : scheduleResult ) {
List < Map < String , Object > > workTimeBeLateItems = getWorkTimeBeLateItems ( scheduleMap , attendanceItems ) ;
if ( workTimeBeLateItems . size ( ) = = 0 | | ClassSegmentTypeEnum . WORK_TIME . getKey ( ) . equals ( scheduleMap . get ( "beforeClassSegment" ) ) ) {
continue ;
}
double jbsc = Double . valueOf ( Util . null2String ( scheduleMap . get ( "edxss" ) ) ) ;
//提前打卡开始的时长计入加班
String tqdkjrjb = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "tqdkjrjb" ) ) ;
//推后打卡结束的时长计入加班
String thdkjrjb = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "thdkjrjb" ) ) ;
//结算加班时长不得超过申请的时长
String jbscbdccsqsc = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbscbdccsqsc" ) ) ;
//是否扣除时间区间内的就餐休息时长
String zdkcjcxxsc = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "zdkcjcxxsc" ) ) ;
//超出限制时长的处理方式
String ccclfs = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "ccclfs" ) ) ;
//工作日加班最大小时数
String rzdjbxss = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "rzdjbxss" ) ) ;
//每周最大加班小时数
String yzdjbxss = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "yzdjbxss" ) ) ;
//每月最大加班小时数
String zzdjbxss = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "zzdjbxss" ) ) ;
//加班时长自动转入假期余额
String jbzdzjqye = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbzdzjqye" ) ) ;
//最小加班分钟数
String jbqsfzs = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbqsfzs" ) ) ;
//超出最小时长后的单次累加分钟数
String ccqszhdhsfzs = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "ccqszhdhsfzs" ) ) ;
//核算量
double workOverTimeHsl = Double . valueOf ( Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "hsl" ) ) ) ;
//核算单位
String workOverTimeHsdw = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "hsdw" ) ) ;
//晚于开始时间忽略分钟数
String jbwdhlfzs = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbwdhlfzs" ) ) . equals ( "" ) ? "0" : Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbwdhlfzs" ) ) ;
//早于结束时间忽略分钟数
String jbzzhlfzs = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbzzhlfzs" ) ) . equals ( "" ) ? "0" : Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "jbzzhlfzs" ) ) ;
/ * *
* 获 得 实 际 加 班 时 间
* /
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( ksjbbxydk ) ) {
Map < String , Object > clcokInTimeData = clcokInTimeMap . get ( kssj ) ;
if ( clcokInTimeData = = null ) {
log . info ( "加班开始时间漏卡: {},clcokInTimeData:{}" , kssj , clcokInTimeMap ) ;
workOverTimeItems . put ( "item" , workTimeBeLateItems . get ( 0 ) . get ( "key" ) ) ;
workOverTimeItems . put ( "itemduration" , "0" ) ;
resultLists . add ( workOverTimeItems ) ;
continue ;
}
String hourTime = clcokInTimeData . get ( "signtime" ) . toString ( ) ;
if ( hourTime . length ( ) > 5 ) {
hourTime = hourTime . substring ( 0 , 5 ) ;
}
String signTime = clcokInTimeData . get ( "signdate" ) + " " + hourTime ;
realityStartTime = signTime ;
} else {
realityStartTime = kssj ;
}
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( jsjbbxydk ) ) {
Map < String , Object > clcokInTimeData = clcokInTimeMap . get ( jssj ) ;
if ( clcokInTimeData = = null ) {
log . info ( "加班结束时间漏卡: {},clcokInTimeData:{}" , jssj , clcokInTimeData ) ;
workOverTimeItems . put ( "item" , workTimeBeLateItems . get ( 0 ) . get ( "key" ) ) ;
workOverTimeItems . put ( "itemduration" , "0" ) ;
resultLists . add ( workOverTimeItems ) ;
continue ;
}
String hourTime = clcokInTimeData . get ( "signtime" ) . toString ( ) ;
if ( hourTime . length ( ) > 5 ) {
hourTime = hourTime . substring ( 0 , 5 ) ;
}
String signTime = clcokInTimeData . get ( "signdate" ) + " " + hourTime ;
realityEndime = signTime ;
} else {
realityEndime = jssj ;
}
jbsc = jbsc * 60 ;
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( tqdkjrjb ) ) {
//提前打卡开始的时长计入加班
if ( DateUtil . getTime ( realityStartTime ) . compareTo ( DateUtil . getTime ( kssj ) ) < 0 ) {
jbsc + = DateUtil . getBetWeenMinutes ( realityStartTime , kssj ) ;
}
}
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( thdkjrjb ) ) {
// 推后打卡结束的时长计入加班
if ( DateUtil . getTime ( realityEndime ) . compareTo ( DateUtil . getTime ( jssj ) ) > 0 ) {
jbsc + = DateUtil . getBetWeenMinutes ( jssj , realityEndime ) ;
}
}
/ * *
* 当 存 在 迟 到 项 目 时 扣 除 异 常 时 长 , 不 存 在 时 扣 除 实 际 迟 到 时 间
* /
List < Map < String , Object > > beLateAbnormal = abnormalClockInList . stream ( ) . filter ( e - > e . get ( "pointTime" ) . equals ( kssj ) ) . collect ( Collectors . toList ( ) ) ;
double beLateTime = 0 ;
if ( beLateAbnormal . size ( ) > 0 ) {
String hsdw = Util . null2String ( beLateAbnormal . get ( 0 ) . get ( "hsdw" ) ) ;
String itemduration = Util . null2String ( beLateAbnormal . get ( 0 ) . get ( "itemduration" ) ) ;
AttendanceItemTypeEnum itemType = ( AttendanceItemTypeEnum ) beLateAbnormal . get ( 0 ) . get ( "itemType" ) ;
if ( itemType = = AttendanceItemTypeEnum . MISSE_CARD ) {
//早上漏卡
beLateTime = jbsc ;
} else {
if ( AccountingUnitEnum . DAY . getKey ( ) . equals ( hsdw ) ) {
beLateTime = Integer . valueOf ( scheduleMap . get ( "edsc" ) . toString ( ) ) * Double . valueOf ( itemduration ) ;
} else if ( AccountingUnitEnum . HOUR . getKey ( ) . equals ( hsdw ) ) {
beLateTime = Double . valueOf ( itemduration ) * 60 ;
} else if ( AccountingUnitEnum . MINUTES . getKey ( ) . equals ( hsdw ) ) {
beLateTime = Double . valueOf ( itemduration ) ;
} else if ( AccountingUnitEnum . ONCE . getKey ( ) . equals ( hsdw ) ) {
beLateTime = jbsc ;
}
}
} else {
if ( DateUtil . getTime ( realityStartTime ) . compareTo ( DateUtil . getTime ( kssj ) ) > 0 ) {
beLateTime = DateUtil . getBetWeenMinutes ( kssj , realityStartTime ) ;
List < Map < String , Object > > collect1 = anomalyList . stream ( ) . filter ( e - > e . get ( "pointTime" ) . equals ( kssj ) ) . collect ( Collectors . toList ( ) ) ;
if ( ! "" . equals ( jbwdhlfzs ) & & beLateTime < Integer . valueOf ( jbwdhlfzs ) ) {
beLateTime = 0 ;
}
//当存在迟到异常被抵消的情况
if ( collect1 . size ( ) > 0 ) {
beLateTime = 0 ;
}
}
}
/ * *
* 当 存 在 早 退 项 目 时 扣 除 异 常 时 长 , 不 存 在 时 扣 除 实 际 早 退 时 间
* /
List < Map < String , Object > > leaveEarlyAbnormal = abnormalClockInList . stream ( ) . filter ( e - > e . get ( "pointTime" ) . equals ( jssj ) ) . collect ( Collectors . toList ( ) ) ;
double leaveElaryTime = 0 ;
if ( leaveEarlyAbnormal . size ( ) > 0 ) {
String hsdw = Util . null2String ( leaveEarlyAbnormal . get ( 0 ) . get ( "hsdw" ) ) ;
String itemduration = Util . null2String ( leaveEarlyAbnormal . get ( 0 ) . get ( "itemduration" ) ) ;
AttendanceItemTypeEnum itemType = ( AttendanceItemTypeEnum ) leaveEarlyAbnormal . get ( 0 ) . get ( "itemType" ) ;
if ( itemType = = AttendanceItemTypeEnum . MISSE_CARD ) {
//下午漏卡
leaveElaryTime = jbsc ;
} else {
if ( AccountingUnitEnum . DAY . getKey ( ) . equals ( hsdw ) ) {
leaveElaryTime = Integer . valueOf ( scheduleMap . get ( "edsc" ) . toString ( ) ) * Double . valueOf ( itemduration ) ;
} else if ( AccountingUnitEnum . HOUR . getKey ( ) . equals ( hsdw ) ) {
leaveElaryTime = Double . valueOf ( itemduration ) * 60 ;
} else if ( AccountingUnitEnum . MINUTES . getKey ( ) . equals ( hsdw ) ) {
leaveElaryTime = Double . valueOf ( itemduration ) ;
} else if ( AccountingUnitEnum . ONCE . getKey ( ) . equals ( hsdw ) ) {
leaveElaryTime = jbsc ;
}
}
} else {
if ( DateUtil . getTime ( realityEndime ) . compareTo ( DateUtil . getTime ( jssj ) ) < 0 ) {
leaveElaryTime = DateUtil . getBetWeenMinutes ( realityEndime , jssj ) ;
List < Map < String , Object > > collect2 = anomalyList . stream ( ) . filter ( e - > e . get ( "pointTime" ) . equals ( jssj ) ) . collect ( Collectors . toList ( ) ) ;
if ( ! "" . equals ( jbzzhlfzs ) & & leaveElaryTime < Integer . valueOf ( jbzzhlfzs ) ) {
leaveElaryTime = 0 ;
}
//当存在早退异常被抵消的情况
if ( collect2 . size ( ) > 0 ) {
leaveElaryTime = 0 ;
}
}
}
/ * *
* 当 存 在 请 假 时 , 考 虑 扣 除 请 假 时 长
* /
int askForLeaveTime = removeAskForLeave ( realityStartTime , realityEndime , Util . null2String ( getWorkOverTimeParam . get ( "workfor" ) )
, bdlx , askForLeaveList , askForLeaveItems , offsetAskForLeaveAnomaly ) ;
/ * *
* 当 存 在 外 出 时 , 考 虑 扣 除 外 出 时 长
* /
int evectionTime = removeEvection ( realityStartTime , realityEndime , Util . null2String ( getWorkOverTimeParam . get ( "workfor" ) )
, bdlx , evectionList , evectionItems , offsetEvectionAnomaly ) ;
/ * *
* 加 班 时 段 所 包 含 的 就 餐 时 段
* /
int dinnerTime = Utils . dinnerTime ( realityStartTime , realityEndime , scheduleResult , analysisDate ) ;
log . info ( "未扣减过的加班时长: {}" , jbsc ) ;
log . info ( "beLateTime :[{}],leaveElaryTime :[{}],askForLeaveTime:[{}],evectionTime:[{}],dinnerTime:[{}]" , beLateTime , leaveElaryTime , askForLeaveTime , evectionTime , dinnerTime ) ;
BigDecimal jbscbig = new BigDecimal ( jbsc ) ;
jbsc = jbscbig . subtract ( new BigDecimal ( beLateTime ) ) . subtract ( new BigDecimal ( leaveElaryTime ) ) . subtract ( new BigDecimal ( askForLeaveTime ) ) . subtract ( new BigDecimal ( evectionTime ) ) . subtract ( new BigDecimal ( dinnerTime ) ) . intValue ( ) ;
log . info ( "最终加班时长 :[{}]" , jbsc ) ;
if ( ! "" . equals ( jbqsfzs ) ) {
if ( jbsc < Integer . valueOf ( jbqsfzs ) ) {
//小于最小加班分钟数不算加班
workOverTimeItems . put ( "item" , workTimeBeLateItems . get ( 0 ) . get ( "key" ) ) ;
workOverTimeItems . put ( "itemduration" , "0" ) ;
resultLists . add ( workOverTimeItems ) ;
continue ;
} else if ( jbsc > = Integer . valueOf ( jbqsfzs ) & & ! "" . equals ( ccqszhdhsfzs ) ) {
params . put ( "workTimeBeLateItems" , workTimeBeLateItems ) ;
params . put ( "scheduleMap" , scheduleMap ) ;
//获得加班时长以及加班开始时间和结束时间
Map < String , Object > overTimeDuraionMap = commandExecutor . execute ( new GetOvertimeDurationCmd ( params ) ) ;
double jbsc = Double . valueOf ( overTimeDuraionMap . get ( "jbsc" ) . toString ( ) ) ;
String realityStartTime = overTimeDuraionMap . get ( "realityStartTime" ) . toString ( ) ;
String realityEndime = overTimeDuraionMap . get ( "realityEndime" ) . toString ( ) ;
params . putAll ( overTimeDuraionMap ) ;
//获得加班项目
Map < String , Object > itemMap = commandExecutor . execute ( new SaveWorkOverTimeCmd ( params ) ) ;
resultLists . add ( itemMap ) ;
}
jbsc = Double . valueOf ( Utils . getItemdurationDown ( Integer . valueOf ( ccqszhdhsfzs ) , AccountingUnitEnum . MINUTES . getKey ( ) , Double . valueOf ( jbsc ) . intValue ( ) - Integer . valueOf ( jbqsfzs ) , AccountingUnitEnum . MINUTES ) ) . intValue ( ) + Integer . valueOf ( jbqsfzs ) ;
}
}
if ( jbsc < 0 ) {
//加班时长为0
workOverTimeItems . put ( "item" , workTimeBeLateItems . get ( 0 ) . get ( "key" ) ) ;
workOverTimeItems . put ( "itemduration" , "0" ) ;
resultLists . add ( workOverTimeItems ) ;
/ * *
* 休 息 班 次 , 工 作 时 段 转 加 班 计 划 项 目 结 果 集
* /
List < Map < String , Object > > restOverTimeDuraion = Lists . newArrayList ( ) ;
double jbsc = 0 ;
for ( Map < String , Object > restOverTimeMap : restOverTimeList ) {
List < Map < String , Object > > workTimeBeLateItems = getWorkTimeBeLateItems ( restOverTimeMap , attendanceItems ) ;
if ( workTimeBeLateItems . size ( ) = = 0 ) {
continue ;
}
params . put ( "workTimeBeLateItems" , workTimeBeLateItems ) ;
params . put ( "scheduleMap" , restOverTimeMap ) ;
//获得加班时长以及加班开始时间和结束时间
Map < String , Object > overTimeDuraionMap = commandExecutor . execute ( new GetOvertimeDurationCmd ( params ) ) ;
jbsc + = Double . valueOf ( overTimeDuraionMap . get ( "jbsc" ) . toString ( ) ) ;
//自动扣除
if ( "2" . equals ( ccclfs ) & & workOverTimeResults = = null ) {
String startDate = analysisDate . split ( "-" ) [ 0 ] + "-" + analysisDate . split ( "-" ) [ 1 ] + "-01" ;
String endDate = analysisDate . split ( "-" ) [ 0 ] + "-" + analysisDate . split ( "-" ) [ 1 ] + "-" + diffdays ;
workOverTimeResults = getWorkOverTimeResults ( startDate , endDate , userId ) ;
}
if ( "2" . equals ( ccclfs ) & & ! "" . equals ( rzdjbxss ) & & DateTypeEnum . WORK_DAY . getKey ( ) . equals ( rqlx ) ) {
//工作日加班最大数
double dayTime = getWorkDayTime ( workOverTimeResults , analysisDate ) * 60 ;
double maxDayTime = Double . valueOf ( rzdjbxss ) * 60 ;
double time = jbsc + dayTime ;
if ( time > maxDayTime ) {
jbsc = maxDayTime - dayTime ;
}
}
if ( "2" . equals ( ccclfs ) & & ! "" . equals ( zzdjbxss ) ) {
//每周最大加班小时数
double weekTime = getWeekTime ( workOverTimeResults , analysisDate ) ;
double maxWeekTime = Double . valueOf ( zzdjbxss ) * 60 ;
double time = jbsc + weekTime ;
if ( time > maxWeekTime ) {
jbsc = maxWeekTime - weekTime ;
}
}
if ( "2" . equals ( ccclfs ) & & ! "" . equals ( yzdjbxss ) ) {
//每月最大加班数
double monthTime = getMonthTime ( workOverTimeResults ) ;
double maxMonthTime = Double . valueOf ( yzdjbxss ) * 60 ;
double time = jbsc + monthTime ;
if ( time > maxMonthTime ) {
jbsc = maxMonthTime - monthTime ;
}
}
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( jbscbdccsqsc ) ) {
if ( jbsc > Double . valueOf ( Util . null2String ( scheduleMap . get ( "edxss" ) ) ) * 60 ) {
jbsc = Double . valueOf ( Util . null2String ( scheduleMap . get ( "edxss" ) ) ) * 60 ;
}
}
log . info ( "最终加班时长: {}" , jbsc ) ;
workOverTimeItems . put ( "item" , workTimeBeLateItems . get ( 0 ) . get ( "key" ) ) ;
double itemduration = Utils . getItemdurationDown ( workOverTimeHsl , workOverTimeHsdw , Long . valueOf ( Math . round ( jbsc ) ) . intValue ( ) , AccountingUnitEnum . MINUTES ) ;
workOverTimeItems . put ( "itemduration" , itemduration ) ;
/ * *
* 入 加 班 结 果 表
* /
Map < String , Object > insertParam = Maps . newHashMap ( ) ;
insertParam . put ( "jbry" , userId ) ;
insertParam . put ( "sjksrq" , realityStartTime . split ( " " ) [ 0 ] ) ;
insertParam . put ( "sjkssj" , realityStartTime . split ( " " ) [ 1 ] ) ;
insertParam . put ( "sjjsrq" , realityEndime . split ( " " ) [ 0 ] ) ;
insertParam . put ( "sjjssj" , realityEndime . split ( " " ) [ 1 ] ) ;
insertParam . put ( "sjjbsc" , itemduration ) ;
insertParam . put ( "jbjgly" , "4" ) ;
insertParam . put ( "jblx" , workTimeBeLateItems . get ( 0 ) . get ( "id" ) ) ;
insertParam . put ( "lyid" , userId + "-" + DateUtil . getCurrentDate ( ) ) ;
insertParam . put ( "zt" , "1" ) ;
Utils . InsertFormTable ( "uf_jcl_kq_jbjg" , insertParam , ( Map < String , String > ) params . get ( "formmodeIdMap" ) ) ;
/ * *
* 入 假 期 余 额
* /
//加班时长自动转入假期余额
if ( CheckBoxEnum . CHECKED . getKey ( ) . equals ( jbzdzjqye ) ) {
Map < String , Object > insertHoliDayParam = Maps . newHashMap ( ) ;
insertHoliDayParam . put ( "ygid" , userId ) ;
insertHoliDayParam . put ( "jqid" , workTimeBeLateItems . get ( 0 ) . get ( "zrdjb" ) ) ;
insertHoliDayParam . put ( "lyid" , userId + "-" + DateUtil . getCurrentDate ( ) ) ;
//转入的假期额度生效日期
String yesxrq = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "yesxrq" ) ) ;
if ( "0" . equals ( yesxrq ) ) {
//一月后
insertHoliDayParam . put ( "sxrq" , DateUtil . lastMonth ( analysisDate , DateUtil . yyyyMMdd ) ) ;
} else if ( "1" . equals ( yesxrq ) ) {
//次月
insertHoliDayParam . put ( "sxrq" , DateUtil . lastMonth ( analysisDate ) + "-01" ) ;
} else if ( "2" . equals ( yesxrq ) ) {
//次日
insertHoliDayParam . put ( "sxrq" , DateUtil . AfterDay ( analysisDate , 1 ) ) ;
}
//额度可用的周期
String yekyzq = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "yekyzq" ) ) ;
if ( "0" . equals ( yekyzq ) ) {
//一个月
insertHoliDayParam . put ( "jzrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) , 1 , DateUtil . yyyyMMdd ) ) ;
} else if ( "1" . equals ( yekyzq ) ) {
//两个月
insertHoliDayParam . put ( "jzrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) , 2 , DateUtil . yyyyMMdd ) ) ;
} else if ( "2" . equals ( yekyzq ) ) {
//三个月
insertHoliDayParam . put ( "jzrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) , 3 , DateUtil . yyyyMMdd ) ) ;
} else if ( "3" . equals ( yekyzq ) ) {
//六个月
insertHoliDayParam . put ( "jzrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) , 6 , DateUtil . yyyyMMdd ) ) ;
} else if ( "4" . equals ( yekyzq ) ) {
//十二个月
insertHoliDayParam . put ( "jzrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) , 12 , DateUtil . yyyyMMdd ) ) ;
} else if ( "5" . equals ( yekyzq ) ) {
//当前季度
insertHoliDayParam . put ( "jzrq" , DateUtil . getCurrentQuarter ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) ) ) ;
} else if ( "6" . equals ( yekyzq ) ) {
//当前半年
insertHoliDayParam . put ( "jzrq" , DateUtil . getCurrentHalfYear ( insertHoliDayParam . get ( "sxrq" ) . toString ( ) ) ) ;
} else if ( "7" . equals ( yekyzq ) ) {
//当前一年
insertHoliDayParam . put ( "jzrq" , insertHoliDayParam . get ( "sxrq" ) . toString ( ) . split ( "-" ) [ 0 ] + "-12-31" ) ;
}
insertHoliDayParam . put ( "ktsc" , itemduration ) ;
String zdyqsc = Util . null2String ( workTimeBeLateItems . get ( 0 ) . get ( "zdyqsc" ) ) ;
if ( DelayTypeEnum . ONE_MONTH . getKey ( ) . equals ( zdyqsc ) ) {
//一个月
insertHoliDayParam . put ( "yqsxrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "jzrq" ) . toString ( ) , 1 , DateUtil . yyyyMMdd ) ) ;
} else if ( DelayTypeEnum . TWO_MONTH . getKey ( ) . equals ( zdyqsc ) ) {
//两个月
insertHoliDayParam . put ( "yqsxrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "jzrq" ) . toString ( ) , 2 , DateUtil . yyyyMMdd ) ) ;
} else if ( DelayTypeEnum . THREE_MONTH . getKey ( ) . equals ( zdyqsc ) ) {
//三个月
insertHoliDayParam . put ( "yqsxrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "jzrq" ) . toString ( ) , 3 , DateUtil . yyyyMMdd ) ) ;
} else if ( DelayTypeEnum . HALF_YEAR . getKey ( ) . equals ( zdyqsc ) ) {
//半年
insertHoliDayParam . put ( "yqsxrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "jzrq" ) . toString ( ) , 6 , DateUtil . yyyyMMdd ) ) ;
} else if ( DelayTypeEnum . ONE_YEAR . getKey ( ) . equals ( zdyqsc ) ) {
//一年
insertHoliDayParam . put ( "yqsxrq" , DateUtil . nextMonth ( insertHoliDayParam . get ( "jzrq" ) . toString ( ) , 12 , DateUtil . yyyyMMdd ) ) ;
}
Utils . InsertFormTable ( "uf_jcl_kq_jqye" , insertHoliDayParam , ( Map < String , String > ) params . get ( "formmodeIdMap" ) ) ;
}
resultLists . add ( workOverTimeItems ) ;
restOverTimeDuraion . add ( overTimeDuraionMap ) ;
}
return resultLists ;
}
public List < Map < String , Object > > getWorkOverTimeResults ( String startDate , String endDate , String userId ) {
String sql = "select sjjbsc,sjksrq,sjjsrq from uf_jcl_kq_jbjg where jbry=? and sjksrq>? and sjjsrq<?" ;
List < Map < String , Object > > dataList = DbTools . getSqlToList ( sql , userId , startDate , endDate ) ;
return dataList ;
}
/ * *
* 获 得 工 作 日 加 班 数
* @param dataList
* @return
* /
public int getWorkDayTime ( List < Map < String , Object > > dataList , String date ) {
List < Map < String , Object > > list = dataList . stream ( ) . filter ( e - > date . equals ( e . get ( "sjksrq" ) ) ) . collect ( Collectors . toList ( ) ) ;
int totalHour = list . stream ( ) . mapToInt ( e - > Integer . valueOf ( e . get ( "sjjbsc" ) . toString ( ) ) ) . sum ( ) ;
return totalHour ;
}
/ * *
* 获 得 一 周 加 班 数
* @param dataList
* @return
* /
public int getWeekTime ( List < Map < String , Object > > dataList , String date ) {
int day = TimeUtil . getDayOfWeek ( date ) ;
if ( day = = 0 ) {
day = 7 ;
if ( restOverTimeDuraion . size ( ) > 0 ) {
params . put ( "jbsc" , jbsc ) ;
String realityStartTime = restOverTimeDuraion . stream ( ) . min ( Comparator . comparing ( e - > DateUtil . getTime ( e . get ( "realityStartTime" ) . toString ( ) ) . toInstant ( ZoneOffset . of ( "+8" ) ) . toEpochMilli ( ) ) ) . get ( ) . get ( "realityStartTime" ) . toString ( ) ;
String realityEndime = restOverTimeDuraion . stream ( ) . max ( Comparator . comparing ( e - > DateUtil . getTime ( e . get ( "realityEndime" ) . toString ( ) ) . toInstant ( ZoneOffset . of ( "+8" ) ) . toEpochMilli ( ) ) ) . get ( ) . get ( "realityEndime" ) . toString ( ) ;
params . put ( "realityStartTime" , realityStartTime ) ;
params . put ( "realityEndime" , realityEndime ) ;
Map < String , Object > itemMap = commandExecutor . execute ( new SaveWorkOverTimeCmd ( params ) ) ;
resultLists . add ( itemMap ) ;
}
String startDate = DateUtil . beforeDay ( date , day - 1 ) ;
String endDate = DateUtil . AfterDay ( date , 7 - day ) ;
List < Map < String , Object > > list = dataList . stream ( ) . filter ( e - > {
String sjksrq = Util . null2String ( e . get ( "sjksrq" ) ) ;
if ( DateUtil . getTime ( sjksrq ) . compareTo ( DateUtil . getTime ( startDate ) ) > = 0 & &
DateUtil . getTime ( sjksrq ) . compareTo ( DateUtil . getTime ( endDate ) ) > = 0 ) {
return true ;
} else {
return false ;
}
} ) . collect ( Collectors . toList ( ) ) ;
int totalHour = list . stream ( ) . mapToInt ( e - > Integer . valueOf ( e . get ( "sjjbsc" ) . toString ( ) ) ) . sum ( ) ;
return totalHour ;
}
/ * *
* 获 得 一 个 月 加 班 数
* @param dataList
* @return
* /
public int getMonthTime ( List < Map < String , Object > > dataList ) {
int totalHour = dataList . stream ( ) . mapToInt ( e - > Integer . valueOf ( e . get ( "sjjbsc" ) . toString ( ) ) ) . sum ( ) ;
return totalHour ;
}
/ * *
* 请 假 影 响 加 班 时 长
* @param kssj 加 班 开 始 时 间
* @param jssj 加 班 结 束 时 间
* @param workFor 作 用 时 段
* @param askForLeaveList 请 假 集 合
* @param askForLeaveItems 请 假 项 目
* @return 请 假 在 加 班 中 所 占 时 间
* /
public int removeAskForLeave ( String kssj , String jssj , String workFor , String bdlx , List < Map < String , Object > > askForLeaveList ,
Map < String , Map < String , Object > > askForLeaveItems , List < Map < String , Object > > offsetAskForLeaveAnomaly ) {
int employTime = 0 ;
for ( int i = 0 ; i < askForLeaveList . size ( ) ; i + + ) {
//请假时长
String qjsc = Util . null2String ( askForLeaveList . get ( i ) . get ( "qjsc" ) ) ;
//请假项目
Map < String , Object > askForLeaveItem = askForLeaveItems . get ( askForLeaveList . get ( i ) . get ( "jqlx" ) ) ;
//作用时段
String zysd = Util . null2String ( askForLeaveItem . get ( "zysd" ) ) ;
// if (!zysd.contains(workFor) && !zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())){
// continue;
// }
if ( "" . equals ( Util . null2String ( askForLeaveList . get ( i ) . get ( "kssj" ) ) ) | | "" . equals ( Util . null2String ( askForLeaveList . get ( i ) . get ( "jssj" ) ) ) ) {
if ( ! "" . equals ( qjsc ) ) {
//时长请假
if ( offsetAskForLeaveAnomaly . size ( ) > 0 ) {
List < Map < String , Object > > list = offsetAskForLeaveAnomaly . stream ( ) . filter ( e - > bdlx . equals ( e . get ( "bdlx" ) ) ) . collect ( Collectors . toList ( ) ) ;
employTime + = Math . round ( list . size ( ) / Double . valueOf ( offsetAskForLeaveAnomaly . size ( ) ) * Double . valueOf ( qjsc ) * 60 ) ;
}
}
} else {
//按照开始时间,结束时间请假
employTime + = Utils . getStartAndEndTime ( kssj , jssj , askForLeaveList . get ( i ) ) ;
}
}
return employTime ;
return resultLists ;
}
/ * *
* 外 出 影 响 加 班 时 长
* @param kssj 加 班 开 始 时 间
* @param jssj 加 班 结 束 时 间
* @param evectionList 外 出 、 请 假 集 合
* @return
* /
public int removeEvection ( String kssj , String jssj , String workFor , String bdlx , List < Map < String , Object > > evectionList , Map < String ,
Map < String , Object > > evectionItems , List < Map < String , Object > > offsetEvectionAnomaly ) {
int askForLeaveTime = 0 ;
for ( int i = 0 ; i < evectionList . size ( ) ; i + + ) {
//出差时长
String qjsc = Util . null2String ( evectionList . get ( i ) . get ( "ccsc" ) ) ;
//出差项目
Map < String , Object > evectionItem = evectionItems . get ( evectionList . get ( i ) . get ( "cclx" ) ) ;
//作用时段
String zysd = Util . null2String ( evectionItem . get ( "zysd" ) ) ;
// if (!zysd.contains(workFor) && !WorkForTimeEnum.ALL_TIME.getKey().equals(zysd)){
// continue;
// }
public List < Map < String , Object > > getWorkTimeBeLateItems ( Map < String , Object > scheduleMap , List < Map < String , Object > > attendanceItems ) {
String bdlx = Util . null2String ( scheduleMap . get ( "bdlx" ) ) ;
Map < String , Object > getWorkOverTimeParam = Maps . newHashMap ( ) ;
if ( "" . equals ( Util . null2String ( evectionList . get ( i ) . get ( "kssj" ) ) ) | | "" . equals ( Util . null2String ( evectionList . get ( i ) . get ( "jssj" ) ) ) ) {
if ( ! "" . equals ( qjsc ) ) {
if ( offsetEvectionAnomaly . size ( ) > 0 ) {
List < Map < String , Object > > list = offsetEvectionAnomaly . stream ( ) . filter ( e - > bdlx . equals ( e . get ( "bdlx" ) ) ) . collect ( Collectors . toList ( ) ) ;
askForLeaveTime + = Math . round ( list . size ( ) / Double . valueOf ( offsetEvectionAnomaly . size ( ) ) * Double . valueOf ( qjsc ) * 60 ) ;
}
}
getWorkOverTimeParam . put ( "attendanceItems" , attendanceItems ) ;
getWorkOverTimeParam . put ( "rqlx" , scheduleMap . get ( "rqlx" ) ) ;
getWorkOverTimeParam . put ( "workfor" , Utils . getWorkFor ( bdlx ) ) ;
List < Map < String , Object > > workTimeBeLateItems = Lists . newArrayList ( ) ;
if ( Utils . ifOverTimeClassSegment ( bdlx ) ) {
if ( ClassSegmentTypeEnum . OVERTIME_PLAN . getKey ( ) . equals ( bdlx ) ) {
getWorkOverTimeParam . put ( "workfor" , WorkForTimeEnum . PLAN_WORK_OVERTIME . getKey ( ) ) ;
workTimeBeLateItems = ( List < Map < String , Object > > ) scheduleMap . get ( "jblx" ) ;
} else {
//按照开始时间,结束时间请假
askForLeaveTime + = Utils . getStartAndEndTime ( kssj , jssj , evectionList . get ( i ) ) ;
Map < String , Object > result = commandExecutor . execute ( new WorkOvertimeItemCmd ( getWorkOverTimeParam ) ) ;
//加班项目
workTimeBeLateItems = ( List < Map < String , Object > > ) result . get ( "attendanceItems" ) ;
}
}
return askForLeaveTime ;
return workTimeBeLateItems ;
}
}