优化
This commit is contained in:
@ -106,7 +106,12 @@ public interface IWgzAttendanceService extends IServicePlus<WgzAttendance> {
|
||||
*/
|
||||
List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate);
|
||||
|
||||
/**
|
||||
* 统计某天应打卡人数
|
||||
*/
|
||||
Integer dayTotalNum(Long taskId,LocalDate date);
|
||||
|
||||
Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate);
|
||||
/**
|
||||
* 总体考勤情况
|
||||
*/
|
||||
|
||||
@ -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);
|
||||
bgtAttendanceVO.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<BgtAttendanceCountVO> 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.getById(dto.getUserId());
|
||||
WgzUser wgzUser = wgzUserService.findByUserId(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对象,格式化日期为中文星期
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("EEEE", java.util.Locale.CHINESE);
|
||||
DateTimeFormatter 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(date));
|
||||
if(wgzAttendance.getMissedIn()==0 && wgzAttendance.getMissedOut()==0){
|
||||
recordVO.setWeek(wgzAttendance.getDate().format(formatter));
|
||||
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(earlyLeaveRecords.size());
|
||||
bgtAttendanceDetailVO.setMissRecords(earlyLeaveRecords);
|
||||
bgtAttendanceDetailVO.setMissNum(missRecords.size());
|
||||
bgtAttendanceDetailVO.setMissRecords(missRecords);
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user