优化
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