@ -45,7 +45,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.text.DecimalFormat ;
import java.text.SimpleDateFormat ;
import java.time.* ;
import java.time.format.DateTimeFormatter ;
import java.time.temporal.TemporalAdjusters ;
@ -63,7 +62,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//上班打卡状态 0上 1下
public static final String Clocking = " 0 " ;
public static final String OffDuty = " 1 " ;
public static final String OffDuty = " 1 " ;
@Autowired
private IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService ;
@ -72,7 +71,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
private IBgtProjectRecruitService iBgtProjectRecruitService ;
@Autowired
private IWgzLeaveService iWgzLeaveService ;
private IWgzLeaveService iWgzLeaveService ;
@Autowired
private IFbsProjectTaskService taskService ;
@ -82,72 +81,72 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
@Override
public WgzAttendance queryById ( Long id ) {
return getById ( id ) ;
}
public WgzAttendance queryById ( Long id ) {
return getById ( id ) ;
}
@Override
public TableDataInfo < WgzAttendance > queryPageList ( WgzAttendanceQueryBo bo ) {
Page < WgzAttendance > result = page ( PageUtils . buildPage ( ) , buildQueryWrapper ( bo ) ) ;
return PageUtils . buildDataInfo ( result ) ;
}
@Override
public TableDataInfo < WgzAttendance > queryPageList ( WgzAttendanceQueryBo bo ) {
Page < WgzAttendance > result = page ( PageUtils . buildPage ( ) , buildQueryWrapper ( bo ) ) ;
return PageUtils . buildDataInfo ( result ) ;
}
@Override
public List < WgzAttendance > queryList ( WgzAttendanceQueryBo bo ) {
return list ( buildQueryWrapper ( bo ) ) ;
}
@Override
public List < WgzAttendance > queryList ( WgzAttendanceQueryBo bo ) {
return list ( buildQueryWrapper ( bo ) ) ;
}
private LambdaQueryWrapper < WgzAttendance > buildQueryWrapper ( WgzAttendanceQueryBo bo ) {
Map < String , Object > params = bo . getParams ( ) ;
LambdaQueryWrapper < WgzAttendance > lqw = Wrappers . lambdaQuery ( ) ;
lqw . eq ( bo . getRecruitId ( ) ! = null , WgzAttendance : : getRecruitId , bo . getRecruitId ( ) ) ;
lqw . eq ( bo . getUserId ( ) ! = null , WgzAttendance : : getUserId , bo . getUserId ( ) ) ;
lqw . eq ( bo . getLeaveMarkId ( ) ! = null , WgzAttendance : : getLeaveMarkId , bo . getLeaveMarkId ( ) ) ;
lqw . eq ( bo . getDailyWage ( ) ! = null , WgzAttendance : : getDailyWage , bo . getDailyWage ( ) ) ;
lqw . eq ( bo . getDate ( ) ! = null , WgzAttendance : : getDate , bo . getDate ( ) ) ;
lqw . eq ( StrUtil . isNotBlank ( bo . getPnchOsition ( ) ) , WgzAttendance : : getPnchOsition , bo . getPnchOsition ( ) ) ;
lqw . eq ( bo . getClockInTime ( ) ! = null , WgzAttendance : : getClockInTime , bo . getClockInTime ( ) ) ;
lqw . eq ( bo . getClockOutTime ( ) ! = null , WgzAttendance : : getClockOutTime , bo . getClockOutTime ( ) ) ;
lqw . eq ( bo . getLate ( ) ! = null , WgzAttendance : : getLate , bo . getLate ( ) ) ;
lqw . eq ( bo . getLateTime ( ) ! = null , WgzAttendance : : getLateTime , bo . getLateTime ( ) ) ;
lqw . eq ( bo . getEarlyLeave ( ) ! = null , WgzAttendance : : getEarlyLeave , bo . getEarlyLeave ( ) ) ;
lqw . eq ( bo . getEarlyLeaveTime ( ) ! = null , WgzAttendance : : getEarlyLeaveTime , bo . getEarlyLeaveTime ( ) ) ;
lqw . eq ( bo . getMissedIn ( ) ! = null , WgzAttendance : : getMissedIn , bo . getMissedIn ( ) ) ;
lqw . eq ( bo . getMissedOut ( ) ! = null , WgzAttendance : : getMissedOut , bo . getMissedOut ( ) ) ;
lqw . eq ( StrUtil . isNotBlank ( bo . getExceptionType ( ) ) , WgzAttendance : : getExceptionType , bo . getExceptionType ( ) ) ;
return lqw ;
}
private LambdaQueryWrapper < WgzAttendance > buildQueryWrapper ( WgzAttendanceQueryBo bo ) {
Map < String , Object > params = bo . getParams ( ) ;
LambdaQueryWrapper < WgzAttendance > lqw = Wrappers . lambdaQuery ( ) ;
lqw . eq ( bo . getRecruitId ( ) ! = null , WgzAttendance : : getRecruitId , bo . getRecruitId ( ) ) ;
lqw . eq ( bo . getUserId ( ) ! = null , WgzAttendance : : getUserId , bo . getUserId ( ) ) ;
lqw . eq ( bo . getLeaveMarkId ( ) ! = null , WgzAttendance : : getLeaveMarkId , bo . getLeaveMarkId ( ) ) ;
lqw . eq ( bo . getDailyWage ( ) ! = null , WgzAttendance : : getDailyWage , bo . getDailyWage ( ) ) ;
lqw . eq ( bo . getDate ( ) ! = null , WgzAttendance : : getDate , bo . getDate ( ) ) ;
lqw . eq ( StrUtil . isNotBlank ( bo . getPnchOsition ( ) ) , WgzAttendance : : getPnchOsition , bo . getPnchOsition ( ) ) ;
lqw . eq ( bo . getClockInTime ( ) ! = null , WgzAttendance : : getClockInTime , bo . getClockInTime ( ) ) ;
lqw . eq ( bo . getClockOutTime ( ) ! = null , WgzAttendance : : getClockOutTime , bo . getClockOutTime ( ) ) ;
lqw . eq ( bo . getLate ( ) ! = null , WgzAttendance : : getLate , bo . getLate ( ) ) ;
lqw . eq ( bo . getLateTime ( ) ! = null , WgzAttendance : : getLateTime , bo . getLateTime ( ) ) ;
lqw . eq ( bo . getEarlyLeave ( ) ! = null , WgzAttendance : : getEarlyLeave , bo . getEarlyLeave ( ) ) ;
lqw . eq ( bo . getEarlyLeaveTime ( ) ! = null , WgzAttendance : : getEarlyLeaveTime , bo . getEarlyLeaveTime ( ) ) ;
lqw . eq ( bo . getMissedIn ( ) ! = null , WgzAttendance : : getMissedIn , bo . getMissedIn ( ) ) ;
lqw . eq ( bo . getMissedOut ( ) ! = null , WgzAttendance : : getMissedOut , bo . getMissedOut ( ) ) ;
lqw . eq ( StrUtil . isNotBlank ( bo . getExceptionType ( ) ) , WgzAttendance : : getExceptionType , bo . getExceptionType ( ) ) ;
return lqw ;
}
@Override
public Boolean insert ( WgzAttendance bo ) {
WgzAttendance add = BeanUtil . toBean ( bo , WgzAttendance . class ) ;
validEntityBeforeSave ( add ) ;
return save ( add ) ;
}
@Override
public Boolean insert ( WgzAttendance bo ) {
WgzAttendance add = BeanUtil . toBean ( bo , WgzAttendance . class ) ;
validEntityBeforeSave ( add ) ;
return save ( add ) ;
}
@Override
public Boolean update ( WgzAttendance bo ) {
WgzAttendance update = BeanUtil . toBean ( bo , WgzAttendance . class ) ;
validEntityBeforeSave ( update ) ;
return updateById ( update ) ;
}
@Override
public Boolean update ( WgzAttendance bo ) {
WgzAttendance update = BeanUtil . toBean ( bo , WgzAttendance . class ) ;
validEntityBeforeSave ( update ) ;
return updateById ( update ) ;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave ( WgzAttendance entity ) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave ( WgzAttendance entity ) {
//TODO 做一些数据校验,如唯一约束
}
@Override
public Boolean deleteWithValidByIds ( Collection < Long > ids , Boolean isValid ) {
if ( isValid ) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return removeByIds ( ids ) ;
}
@Override
public Boolean deleteWithValidByIds ( Collection < Long > ids , Boolean isValid ) {
if ( isValid ) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return removeByIds ( ids ) ;
}
/**
@ -177,8 +176,8 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//5、查看当前人、当前工地、当天的打卡记录
String formattedDate = LocalDate . now ( ) . format ( DateTimeFormatter . ofPattern ( " yyyy-MM-dd " ) ) ;
WgzAttendance we = publicFindByUserIdWait ( appUserId , by . getRecruitId ( ) , formattedDate ) ;
if ( we ! = null & & we . getLeaveMarkId ( ) ! = null & & we . getLeaveMarkId ( ) ! = 0 ) {
throw new RuntimeException ( " 您有已通过的请假申请,请假时间为: " + formattedDate ) ;
if ( we ! = null & & we . getLeaveMarkId ( ) ! = null & & we . getLeaveMarkId ( ) ! = 0 ) {
throw new RuntimeException ( " 您有已通过的请假申请,请假时间为: " + formattedDate ) ;
}
//6、组装完整的打卡信息
WgzAttendance wgzAttendance = new WgzAttendance ( ) .
@ -188,10 +187,10 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
setDate ( LocalDate . now ( ) ) ;
LocalDateTime now = LocalDateTime . now ( ) ; //当前完整年月日时分秒
LocalTime localTime = now . toLocalTime ( ) ; //获取时分秒
if ( we ! = null ) {
if ( we ! = null ) {
//获取上次打卡时间与这次打卡时间的间隔是否超过3分钟
boolean flag = isMinutesDifferenceGreaterThanThree ( we . getClockInTime ( ) , now ) ;
if ( ! flag ) {
if ( ! flag ) {
throw new RuntimeException ( " 打卡时间间隔不能少于3分钟 " ) ;
}
wgzAttendance . setClockOutTime ( now ) ;
@ -201,11 +200,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
wgzAttendance . setId ( we . getId ( ) ) ;
wgzAttendance . setEarlyLeave ( 1 ) ; //早退
wgzAttendance . setEarlyLeaveTime ( now ) ;
wgzAttendance . setExceptionType ( exceptionType + " 2, " ) ;
wgzAttendance . setExceptionType ( exceptionType + " 2, " ) ;
wgzAttendance . setPnchOsitionX ( req . getPnchOsition ( ) ) ;
}
return baseMapper . updateById ( wgzAttendance ) > 0 ;
} else {
} else {
wgzAttendance . setClockInTime ( now ) ;
LocalTime beginWorkTime = appById . getBeginWorkTime ( ) ; //上班
if ( ! localTime . isBefore ( beginWorkTime ) ) {
@ -220,8 +219,9 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/**
* 判断两个 LocalDateTime 之间的差值分钟数是否超过 3
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param endTime 结束时间
* @return 如果差值分钟数超过 3 返回 true, 否则返回 false
*/
public static boolean isMinutesDifferenceGreaterThanThree ( LocalDateTime startTime , LocalDateTime endTime ) {
@ -244,17 +244,17 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//2、获取今日用户打卡状态
if ( wgzAttendance = = null ) {
res . setClockingCondition ( 0 ) ; //上班
} else {
} else {
res . setClockingCondition ( 1 ) ; //下班
if ( wgzAttendance . getLeaveMarkId ( ) = = null & & wgzAttendance . getClockInTime ( ) ! = null & & wgzAttendance . getClockOutTime ( ) ! = null ) {
if ( wgzAttendance . getLeaveMarkId ( ) = = null & & wgzAttendance . getClockInTime ( ) ! = null & & wgzAttendance . getClockOutTime ( ) ! = null ) {
res . setClockingCondition ( 3 ) ; //已完成
}
if ( wgzAttendance . getLeaveMarkId ( ) ! = null & & wgzAttendance . getLeaveMarkId ( ) ! = 0 ) {
if ( wgzAttendance . getLeaveMarkId ( ) ! = null & & wgzAttendance . getLeaveMarkId ( ) ! = 0 ) {
res . setClockingCondition ( 2 ) ; //请假
}
}
//3、获取上下班状态
if ( wgzAttendance ! = null ) {
if ( wgzAttendance ! = null ) {
String exceptionType = wgzAttendance . getExceptionType ( ) ;
if ( exceptionType . contains ( " 0 " ) ) {
res . setIn ( 0 ) ;
@ -329,7 +329,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
mp . put ( date , two ) ;
}
}
return new WgzAppPunchTheCalendarRecordRes ( ) . setMp ( mp ) ;
return new WgzAppPunchTheCalendarRecordRes ( ) . setMp ( mp ) ;
}
@Override
@ -381,7 +381,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
}
@Override
public Integer attendanceDetail ( Long userId , Long recruitId , Integer num ) {
public Integer attendanceDetail ( Long userId , Long recruitId , Integer num ) {
LambdaQueryWrapper < WgzAttendance > apply = new LambdaQueryWrapper < WgzAttendance > ( ) .
eq ( WgzAttendance : : getUserId , userId ) .
eq ( WgzAttendance : : getRecruitId , recruitId ) . and ( wrapper - > wrapper
@ -390,7 +390,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
. isNotNull ( WgzAttendance : : getClockOutTime )
) ;
apply . orderByAsc ( WgzAttendance : : getDate ) ;
if ( num ! = null & & num > 0 ) { //表示查询指定天数的打卡记录,否则查询所有
if ( num ! = null & & num > 0 ) { //表示查询指定天数的打卡记录,否则查询所有
apply . last ( " LIMIT " + num ) ;
}
return baseMapper . selectCount ( apply ) ;
@ -402,6 +402,16 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
return baseMapper . countByTaskId ( taskId , beginDate , endDate ) ;
}
@Override
public Integer dayTotalNum ( Long taskId , LocalDate date ) {
return baseMapper . dayTotalNum ( taskId , date ) ;
}
@Override
public Integer monthTotalNum ( Long taskId , LocalDate beginDate , LocalDate endDate ) {
return baseMapper . monthTotalNum ( taskId , beginDate , endDate ) ;
}
@Override
public BgtAttendanceVO attendanceDetail ( BgtAttendanceDTO dto ) {
BgtAttendanceVO bgtAttendanceVO = new BgtAttendanceVO ( ) ;
@ -412,57 +422,94 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
LocalDate startData = null ;
LocalDate endData = null ;
LocalDate now = LocalDate . now ( ) ;
if ( dto . getDateType ( ) . equals ( DateUtils . DAY ) ) {
if ( dto . getDateType ( ) . equals ( DateUtils . DAY ) ) {
// 获取本月开始日期
startData = date . with ( TemporalAdjusters . firstDayOfMonth ( ) ) ;
endData = date ;
List < BgtAttendanceCountVO > countVOS = countByTaskId ( dto . getTaskId ( ) , startData , endData ) ;
b gtAttendanceVO . setCountVOs ( DataUtil . fillMissingDates ( countVOS , startData , endData ) ) ;
if ( CollectionUtil . isNotEmpty ( countVOS ) ) {
BgtAttendanceCountVO countVO = countVOS . stream ( )
. filter ( vo - > vo . getDate ( ) . isEqual ( date ) )
. findFirst ( ) . orElse ( null ) ;
if ( countVO ! = null ) {
bgtAttendanceVO . setReportToDutyNum ( countVO . getReportToDutyNum ( ) ) ;
bgtAttendanceVO . setTotalNum ( countVO . getTotalNum ( ) ) ;
bgtAttendanceVO . setAbsenceDutyNum ( countVO . getTotalNum ( ) - countVO . getReportToDutyNum ( ) ) ;
if ( bgtAttendanceVO . getTotalNum ( ) ! = 0 ) {
int rate = new BigDecimal ( bgtAttendanceVO . getReportToDutyNum ( ) ) . divide ( new BigDecimal ( bgtAttendanceVO . getTotalNum ( ) ) , 2 , RoundingMode . HALF_UP )
. multiply ( new BigDecimal ( 100 ) ) . intValue ( ) ;
bgtAttendanceVO . setReportToDutyRate ( rate ) ;
}
}
List < B gtAttendanceCountVO > bgtAttendanceCountVOS = DataUtil . fillMissingDates ( countVOS , startData , endData ) ;
// 因为当天可能还没有生成所有人的考勤数据,所以应到的总人数需要单独查询
// 判断当天是否在开始日期和结束日期之间(包含开始和结束日期)
boolean isBetween = ( now . isAfter ( startData ) | | now . isEqual ( startData ) )
& & ( now . isBefore ( endData ) | | now . isEqual ( endData ) ) ;
if ( isBetween ) {
Integer i = dayTotalNum ( task . getId ( ) , now ) ;
BgtAttendanceCountVO countVO = bgtAttendanceCountVOS . stream ( )
. filter ( vo - > vo . getDate ( ) . isEqual ( now ) )
. findFirst ( ) . orElse ( null ) ;
countVO . setTotalNum ( i ) ;
}
} else if ( dto . getDateType ( ) . equals ( DateUtils . MONTH ) ) {
bgtAttendanceVO . setCountVOs ( bgtAttendanceCountVOS ) ;
// 找出查询日期的考勤数据
BgtAttendanceCountVO countVO = bgtAttendanceCountVOS . stream ( )
. filter ( vo - > vo . getDate ( ) . isEqual ( date ) )
. findFirst ( ) . orElse ( null ) ;
if ( countVO ! = null ) {
bgtAttendanceVO . setReportToDutyNum ( countVO . getReportToDutyNum ( ) ) ;
bgtAttendanceVO . setTotalNum ( countVO . getTotalNum ( ) ) ;
bgtAttendanceVO . setAbsenceDutyNum ( countVO . getTotalNum ( ) - countVO . getReportToDutyNum ( ) ) ;
if ( bgtAttendanceVO . getTotalNum ( ) ! = 0 ) {
int rate = new BigDecimal ( bgtAttendanceVO . getReportToDutyNum ( ) ) . divide ( new BigDecimal ( bgtAttendanceVO . getTotalNum ( ) ) , 2 , RoundingMode . HALF_UP )
. multiply ( new BigDecimal ( 100 ) ) . intValue ( ) ;
bgtAttendanceVO . setReportToDutyRate ( rate ) ;
}
}
} else if ( dto . getDateType ( ) . equals ( DateUtils . MONTH ) ) {
// 获取本年开始日期
startData = date . with ( TemporalAdjusters . firstDayOfYear ( ) ) ;
endData = date . with ( TemporalAdjusters . lastDayOfMonth ( ) ) ;
if ( endData . isAfter ( now ) ) {
endData = now ;
}
List < BgtAttendanceCountVO > countVOS = countByTaskId ( dto . getTaskId ( ) , startData , endData ) ;
bgtAttendanceVO . setCountVOs ( DataUtil . statisticsByMonth ( countVOS , startData , endData ) ) ;
BgtAttendanceCountVO countVO = countVOS . stream ( )
// 因为当天可能还没有生成所有人的考勤数据,所以应到的总人数需要单独查询
// 判断当天是否在开始日期和结束日期之间(包含开始和结束日期)
boolean isBetween = ( now . isAfter ( startData ) | | now . isEqual ( startData ) )
& & ( now . isBefore ( endData ) | | now . isEqual ( endData ) ) ;
if ( isBetween ) {
Integer i = dayTotalNum ( task . getId ( ) , now ) ;
BgtAttendanceCountVO countVO = countVOS . stream ( )
. filter ( vo - > vo . getDate ( ) . isEqual ( now ) )
. findFirst ( ) . orElse ( null ) ;
if ( countVO ! = null ) {
countVO . setTotalNum ( i ) ;
} else {
BgtAttendanceCountVO bgtAttendanceCountVO = new BgtAttendanceCountVO ( 0 , i , now , 0 , 0 , 0 ) ;
countVOS . add ( bgtAttendanceCountVO ) ;
}
}
List < BgtAttendanceCountVO > bgtAttendanceCountVOS = DataUtil . statisticsByMonth ( countVOS , startData , endData ) ;
bgtAttendanceVO . setCountVOs ( bgtAttendanceCountVOS ) ;
BgtAttendanceCountVO countVO = bgtAttendanceCountVOS . stream ( )
. filter ( vo - > YearMonth . from ( vo . getDate ( ) ) . equals ( YearMonth . from ( date ) ) )
. findFirst ( ) . orElse ( null ) ;
if ( countVO ! = null ) {
bgtAttendanceVO . setReportToDutyNum ( countVO . getReportToDutyNum ( ) ) ;
bgtAttendanceVO . setTotalNum ( countVO . getTotalNum ( ) ) ;
bgtAttendanceVO . setAbsenceDutyNum ( countVO . getAbsenceDutyNum ( ) ) ;
int rate = new BigDecimal ( countVO . getRateSum ( ) ) . divide ( new BigDecimal ( countVO . getRateDay ( ) ) , 2 , RoundingMode . HALF_UP ) . intValue ( ) ;
bgtAttendanceVO . setReportToDutyRate ( rate ) ;
}
//设置本月的总人数
bgtAttendanceVO . setTotalNum ( monthTotalNum ( task . getId ( ) , date . with ( TemporalAdjusters . firstDayOfMonth ( ) ) , endData ) ) ;
}
getLateAndLeave ( bgtAttendanceVO , startData , endData ) ;
return bgtAttendanceVO ;
}
public void getLateAndLeave ( BgtAttendanceVO vo , LocalDate startDate , LocalDate endDate ) {
public void getLateAndLeave ( BgtAttendanceVO vo , LocalDate startDate , LocalDate endDate ) {
List < BgtProjectRecruit > bgtProjectRecruits = iBgtProjectRecruitService . getBaseMapper ( ) . selectList ( Wrappers . < BgtProjectRecruit > lambdaQuery ( )
. eq ( BgtProjectRecruit : : getTaskId , vo . getTaskId ( ) ) ) ;
List < Long > recruitIds = bgtProjectRecruits . stream ( ) . map ( BgtProjectRecruit : : getId ) . collect ( Collectors . toList ( ) ) ;
if ( CollectionUtil . isNotEmpty ( recruitIds ) ) {
if ( CollectionUtil . isNotEmpty ( recruitIds ) ) {
Integer late = baseMapper . selectCount ( Wrappers . < WgzAttendance > lambdaQuery ( ) . eq ( WgzAttendance : : getLate , 1 )
. in ( WgzAttendance : : getRecruitId , recruitIds ) . between ( WgzAttendance : : getDate , startDate , endDate ) ) ;
. eq ( WgzAttendance : : getRecruitId , recruitIds ) . between ( WgzAttendance : : getDate , startDate , endDate ) ) ;
Integer leave = baseMapper . selectCount ( Wrappers . < WgzAttendance > lambdaQuery ( ) . isNotNull ( WgzAttendance : : getLeaveMarkId )
. in ( WgzAttendance : : getRecruitId , recruitIds ) . between ( WgzAttendance : : getDate , startDate , endDate ) ) ;
vo . setLateNum ( late ) ;
@ -480,16 +527,17 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/**
* 获取指定人、指定工地、指定日期的打卡记录
*
* @param appUserId 务工者用户id
* @param recruitId 工地id
* @param date 具体日期
* @param date 具体日期
* @return WgzAttendance
*/
public WgzAttendance publicFindByUserIdWait ( Long appUserId , Long recruitId , String date ) {
LambdaQueryWrapper < WgzAttendance > qw = new LambdaQueryWrapper < > ( ) ;
qw . eq ( WgzAttendance : : getRecruitId , recruitId ) ;
qw . eq ( WgzAttendance : : getUserId , appUserId ) ;
qw . eq ( WgzAttendance : : getDate , date ) ;
qw . eq ( WgzAttendance : : getRecruitId , recruitId ) ;
qw . eq ( WgzAttendance : : getUserId , appUserId ) ;
qw . eq ( WgzAttendance : : getDate , date ) ;
return baseMapper . selectOne ( qw ) ;
}
@ -520,21 +568,22 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/**
* 组装上班、下班打卡记录
* @param wa 打卡记录
*
* @param wa 打卡记录
* @param num 1上班 2下班
* @return WgzAppPunchTheCalendarRecordThree
*/
public WgzAppPunchTheCalendarRecordThree sbOrXb ( WgzAttendance wa , int num ) {
public WgzAppPunchTheCalendarRecordThree sbOrXb ( WgzAttendance wa , int num ) {
WgzAppPunchTheCalendarRecordThree sbb = new WgzAppPunchTheCalendarRecordThree ( ) .
setClockingTime ( wa . getClockInTime ( ) ) .
setPnchOsition ( wa . getPnchOsition ( ) ) .
setPnchOsitionX ( wa . getPnchOsitionX ( ) ) .
setClockingCondition ( 0 ) ; //正常
//判断是否请假
if ( wa . getLeaveMarkId ( ) ! = null & & wa . getLeaveMarkId ( ) ! = 0 ) {
if ( wa . getLeaveMarkId ( ) ! = null & & wa . getLeaveMarkId ( ) ! = 0 ) {
sbb . setClockingCondition ( 7 ) ;
}
if ( num = = 1 ) {
if ( num = = 1 ) {
//判断上班迟到
if ( wa . getLate ( ) = = 1 ) {
sbb . setClockingCondition ( 1 ) ;
@ -544,7 +593,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
sbb . setClockingCondition ( 5 ) ;
}
}
if ( num = = 2 ) {
if ( num = = 2 ) {
//判断下班早退
if ( wa . getEarlyLeave ( ) = = 1 ) {
sbb . setClockingCondition ( 2 ) ;
@ -559,10 +608,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/**
* 补卡
* @param wgzAttendance 打卡记录
* @param type 1上班 2下班
*
* @param wgzAttendance 打卡记录
* @param type 1上班 2下班
* @param fillingDataTime 补卡时间
* @param list 补卡记录
* @param list 补卡记录
*/
private void addRecord ( WgzAttendance wgzAttendance , int type , LocalDateTime fillingDataTime , List < WgzAppCardReplacementApplicationTwo > list ) {
LocalDate date = wgzAttendance . getDate ( ) ;
@ -581,7 +631,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
public BgtAttendanceDetailVO bgtAttendanceDetail ( BgtAttendanceDetailDTO dto ) {
BgtAttendanceDetailVO bgtAttendanceDetailVO = new BgtAttendanceDetailVO ( ) ;
WgzUser wgzUser = wgzUserService . getBy Id( dto . getUserId ( ) ) ;
WgzUser wgzUser = wgzUserService . findByUser Id( dto . getUserId ( ) ) ;
bgtAttendanceDetailVO . setUserId ( wgzUser . getUserId ( ) ) ;
bgtAttendanceDetailVO . setUsername ( wgzUser . getUsername ( ) ) ;
bgtAttendanceDetailVO . setAvatarName ( wgzUser . getAvatarName ( ) ) ;
@ -590,43 +640,43 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
. eq ( BgtProjectRecruit : : getTaskId , dto . getTaskId ( ) ) ) ;
List < Long > recruitIds = bgtProjectRecruits . stream ( ) . map ( BgtProjectRecruit : : getId ) . collect ( Collectors . toList ( ) ) ;
BgtProjectRecruitApply recruitApply = iBgtProjectRecruitApplyService . getById ( recruitIds . get ( 0 ) ) ;
BgtProjectRecruitApply recruitApply = iBgtProjectRecruitApplyService . getOne ( recruitIds . get ( 0 ) , wgzUser . getUserId ( ) );
bgtAttendanceDetailVO . setEntryTime ( recruitApply . getEntryTime ( ) ) ;
bgtAttendanceDetailVO . setStatus ( recruitApply . getStatus ( ) ) ;
LambdaQueryWrapper < WgzAttendance > wrapper = new LambdaQueryWrapper < > ( ) ;
wrapper . eq ( WgzAttendance : : getUserId , dto . getUserId ( ) ) ;
wrapper . eq ( WgzAttendance : : getUserId , dto . getUserId ( ) ) ;
wrapper . in ( WgzAttendance : : getRecruitId , recruitIds ) ;
wrapper . in ( WgzAttendance : : getRecruitId , recruitIds ) ;
LocalDate date = dto . getDate ( ) ;
LocalDate startDate = date . with ( TemporalAdjusters . firstDayOfMonth ( ) ) ;
LocalDate endData = date . with ( TemporalAdjusters . lastDayOfMonth ( ) ) ;
wrapper . between ( WgzAttendance : : getDate , startDate , endData ) ;
wrapper . between ( WgzAttendance : : getDate , startDate , endData ) ;
List < WgzAttendance > wgzAttendances = baseMapper . selectList ( wrapper ) ;
// 创建SimpleDateFormat对象, 格式化日期为中文星期
SimpleDat eFormat sdf = new SimpleDateFormat ( " EEEE " , java . util . Locale. CHINESE ) ;
DateTim eFormatter formatter = DateTimeFormatter . ofPattern ( " EEEE " , Locale . CHINA ) ;
//获取招工打卡时间
List < BgtProjectRecruit > list = iBgtProjectRecruitService . list ( Wrappers . < BgtProjectRecruit > lambdaQuery ( ) . in ( BgtProjectRecruit : : getId ) ) ;
List < BgtProjectRecruit > list = iBgtProjectRecruitService . list ( Wrappers . < BgtProjectRecruit > lambdaQuery ( ) . in ( BgtProjectRecruit : : getId , recruitIds )) ;
Map < Long , BgtProjectRecruit > recruitMap = list . stream ( ) . collect ( Collectors . toMap ( BgtProjectRecruit : : getId , recruit - > recruit ) ) ;
List < WgzAttendanceRecordVO > lateRecords = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > earlyLeaveRecords = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > missRecords = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > records = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > earlyLeaveRecords = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > missRecords = new ArrayList < > ( ) ;
List < WgzAttendanceRecordVO > records = new ArrayList < > ( ) ;
for ( WgzAttendance wgzAttendance : wgzAttendances ) {
for ( WgzAttendance wgzAttendance : wgzAttendances ) {
WgzAttendanceRecordVO recordVO = new WgzAttendanceRecordVO ( ) ;
recordVO . setDate ( wgzAttendance . getDate ( ) ) ;
recordVO . setWeek ( sdf . format ( da te) ) ;
if ( wgzAttendance . getMissedIn ( ) = = 0 & & wgzAttendance . getMissedOut ( ) = = 0 ) {
recordVO . setWeek ( wgzAttendance . getDate ( ) . format ( format ter ) ) ;
if ( wgzAttendance . getMissedIn ( ) = = 0 & & wgzAttendance . getMissedOut ( ) = = 0 ) {
recordVO . setDay ( 1D ) ;
records . add ( recordVO ) ;
} else if ( wgzAttendance . getMissedIn ( ) = = 1 & & wgzAttendance . getMissedOut ( ) = = 1 ) {
} else if ( wgzAttendance . getMissedIn ( ) = = 1 & & wgzAttendance . getMissedOut ( ) = = 1 ) {
recordVO . setDay ( 0D ) ;
} else {
} else {
recordVO . setDay ( 0 . 5D ) ;
records . add ( recordVO ) ;
}
@ -638,13 +688,13 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
if ( wgzAttendance . getLate ( ) = = 1 ) {
WgzAttendanceRecordVO LateRecordVO = BeanUtil . copyProperties ( recordVO , WgzAttendanceRecordVO . class ) ;
LateRecordVO . setTime ( clockInTime . toLocalTime ( ) ) ;
LateRecordVO . setMinutes ( DataUtil . getMinutes ( clockInTime , beginWorkTime ) ) ;
LateRecordVO . setMinutes ( DataUtil . getMinutes ( clockInTime , beginWorkTime ) ) ;
lateRecords . add ( LateRecordVO ) ;
}
if ( wgzAttendance . getEarlyLeave ( ) = = 1 ) {
WgzAttendanceRecordVO earlyLeaveRecordVO = BeanUtil . copyProperties ( recordVO , WgzAttendanceRecordVO . class ) ;
earlyLeaveRecordVO . setTime ( clockOutTime . toLocalTime ( ) ) ;
earlyLeaveRecordVO . setMinutes ( DataUtil . getMinutes ( clockOutTime , endWorkTime ) ) ;
earlyLeaveRecordVO . setMinutes ( DataUtil . getMinutes ( clockOutTime , endWorkTime ) ) ;
earlyLeaveRecords . add ( earlyLeaveRecordVO ) ;
}
@ -670,12 +720,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
bgtAttendanceDetailVO . setEarlyLeaveMinute ( earlyLeaveRecords . stream ( ) . mapToInt ( WgzAttendanceRecordVO : : getMinutes ) . sum ( ) ) ;
bgtAttendanceDetailVO . setEarlyLeaveRecords ( earlyLeaveRecords ) ;
bgtAttendanceDetailVO . setMissNum ( earlyLeave Records. size ( ) ) ;
bgtAttendanceDetailVO . setMissRecords ( earlyLeave Records) ;
bgtAttendanceDetailVO . setMissNum ( miss Records. size ( ) ) ;
bgtAttendanceDetailVO . setMissRecords ( miss Records) ;
return bgtAttendanceDetailVO ;
}
@ -686,12 +735,13 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/**
* 获取对应用户指定天数的工资结算日期
*
* @param userId
* @param recruitId
* @param num 结算天数
* @param num 结算天数
* @return
*/
public LocalDate findByNumGetDate ( Long userId , Long recruitId , Integer num ) {
public LocalDate findByNumGetDate ( Long userId , Long recruitId , Integer num ) {
LambdaQueryWrapper < WgzAttendance > wra = new LambdaQueryWrapper < > ( ) ;
wra . eq ( WgzAttendance : : getRecruitId , recruitId ) ;
wra . eq ( WgzAttendance : : getUserId , userId ) ;