优化
This commit is contained in:
		@ -5,6 +5,7 @@ import com.ruoyi.bgt.domain.dto.BgtAttendanceDetailDTO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceDetailVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO;
 | 
			
		||||
import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
 | 
			
		||||
import com.ruoyi.common.core.page.TableDataInfo;
 | 
			
		||||
import com.ruoyi.wgz.bo.WgzAttendanceQueryBo;
 | 
			
		||||
@ -106,6 +107,11 @@ public interface IWgzAttendanceService extends IServicePlus<WgzAttendance> {
 | 
			
		||||
	 */
 | 
			
		||||
	List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 统计任务每天打卡情况
 | 
			
		||||
	 */
 | 
			
		||||
	List<BgtDayAttendanceCountVO> countDayByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 统计某天应打卡人数
 | 
			
		||||
	 */
 | 
			
		||||
@ -113,10 +119,12 @@ public interface IWgzAttendanceService extends IServicePlus<WgzAttendance> {
 | 
			
		||||
 | 
			
		||||
	Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate);
 | 
			
		||||
	/**
 | 
			
		||||
	 * 总体考勤情况
 | 
			
		||||
	 * 总体考勤情况-统计
 | 
			
		||||
	 */
 | 
			
		||||
	BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto);
 | 
			
		||||
 | 
			
		||||
	List<BgtDayAttendanceCountVO> attendanceList(BgtAttendanceDTO dto);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 考勤详情,查询指定用户指定项目的指定天数考勤情况统计(如若用户输入20,但实际只有2天出勤);
 | 
			
		||||
	 * 如若num为0,那么表示查询所有天数的考勤情况统计;
 | 
			
		||||
 | 
			
		||||
@ -10,14 +10,12 @@ import com.ruoyi.bgt.domain.BgtProjectRecruit;
 | 
			
		||||
import com.ruoyi.bgt.domain.BgtProjectRecruitApply;
 | 
			
		||||
import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO;
 | 
			
		||||
import com.ruoyi.bgt.domain.dto.BgtAttendanceDetailDTO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceDetailVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.WgzAttendanceRecordVO;
 | 
			
		||||
import com.ruoyi.bgt.domain.vo.*;
 | 
			
		||||
import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService;
 | 
			
		||||
import com.ruoyi.bgt.service.IBgtProjectRecruitService;
 | 
			
		||||
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
 | 
			
		||||
import com.ruoyi.common.core.page.TableDataInfo;
 | 
			
		||||
import com.ruoyi.common.exception.BaseException;
 | 
			
		||||
import com.ruoyi.common.util.DataUtil;
 | 
			
		||||
import com.ruoyi.common.utils.DateUtils;
 | 
			
		||||
import com.ruoyi.common.utils.PageUtils;
 | 
			
		||||
@ -42,8 +40,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.math.RoundingMode;
 | 
			
		||||
import java.text.DecimalFormat;
 | 
			
		||||
import java.time.*;
 | 
			
		||||
import java.time.format.DateTimeFormatter;
 | 
			
		||||
@ -402,6 +398,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
 | 
			
		||||
		return baseMapper.countByTaskId(taskId, beginDate, endDate);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public List<BgtDayAttendanceCountVO> countDayByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate){
 | 
			
		||||
		return baseMapper.countDayByTaskId(taskId, beginDate, endDate);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Integer dayTotalNum(Long taskId,LocalDate date){
 | 
			
		||||
		return baseMapper.dayTotalNum(taskId,date);
 | 
			
		||||
@ -414,110 +415,83 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		BgtAttendanceVO bgtAttendanceVO = new BgtAttendanceVO();
 | 
			
		||||
		FbsProjectTask task = taskService.getById(dto.getTaskId());
 | 
			
		||||
 | 
			
		||||
		validTaskTime(task, dto.getDate());
 | 
			
		||||
 | 
			
		||||
		bgtAttendanceVO.setTaskId(task.getId());
 | 
			
		||||
		bgtAttendanceVO.setTaskName(task.getTaskName());
 | 
			
		||||
 | 
			
		||||
		LocalDate date = dto.getDate();
 | 
			
		||||
 | 
			
		||||
		LocalDate startData = null;
 | 
			
		||||
		LocalDate endData = null;
 | 
			
		||||
		LocalDate now = LocalDate.now();
 | 
			
		||||
		//当天总人数
 | 
			
		||||
		Integer totalNum = dayTotalNum(task.getId(), date);
 | 
			
		||||
		bgtAttendanceVO.setTotalNum(totalNum);
 | 
			
		||||
 | 
			
		||||
		if (dto.getDateType().equals(DateUtils.DAY)) {
 | 
			
		||||
			// 获取本月开始日期
 | 
			
		||||
			startData = date.with(TemporalAdjusters.firstDayOfMonth());
 | 
			
		||||
			endData = date;
 | 
			
		||||
 | 
			
		||||
			List<BgtAttendanceCountVO> countVOS = countByTaskId(dto.getTaskId(), startData, endData);
 | 
			
		||||
			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);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			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);
 | 
			
		||||
 | 
			
		||||
			// 因为当天可能还没有生成所有人的考勤数据,所以应到的总人数需要单独查询
 | 
			
		||||
			// 判断当天是否在开始日期和结束日期之间(包含开始和结束日期)
 | 
			
		||||
			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));
 | 
			
		||||
		//今日到岗人数
 | 
			
		||||
		List<BgtDayAttendanceCountVO> countVOS = countDayByTaskId(dto.getTaskId(), date, date);
 | 
			
		||||
		if(CollectionUtil.isNotEmpty(countVOS)){
 | 
			
		||||
			bgtAttendanceVO.setReportToDutyNum(countVOS.get(0).getReportToDutyNum());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//缺勤人数
 | 
			
		||||
		bgtAttendanceVO.setAbsenceDutyNum(totalNum-bgtAttendanceVO.getReportToDutyNum());
 | 
			
		||||
 | 
			
		||||
		//任务拥有的所有招工
 | 
			
		||||
		List<BgtProjectRecruit> bgtProjectRecruits = iBgtProjectRecruitService.getBaseMapper().selectList(Wrappers.<BgtProjectRecruit>lambdaQuery()
 | 
			
		||||
			.eq(BgtProjectRecruit::getTaskId, dto.getTaskId()));
 | 
			
		||||
		List<Long> recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList());
 | 
			
		||||
		if (CollectionUtil.isNotEmpty(recruitIds)) {
 | 
			
		||||
			//请假人数
 | 
			
		||||
			Integer leaveNum = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().isNotNull(WgzAttendance::getLeaveMarkId)
 | 
			
		||||
				.in(WgzAttendance::getRecruitId, recruitIds).eq(WgzAttendance::getDate, date));
 | 
			
		||||
			bgtAttendanceVO.setLeaveNum(leaveNum);
 | 
			
		||||
 | 
			
		||||
			//迟到人数
 | 
			
		||||
			Integer lateNum = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().eq(WgzAttendance::getLate, 1)
 | 
			
		||||
				.eq(WgzAttendance::getRecruitId, recruitIds).eq(WgzAttendance::getDate, date));
 | 
			
		||||
			bgtAttendanceVO.setLateNum(lateNum);
 | 
			
		||||
 | 
			
		||||
			//早退人数
 | 
			
		||||
			Integer earlyLeaveNum = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().eq(WgzAttendance::getEarlyLeave, 1)
 | 
			
		||||
				.in(WgzAttendance::getRecruitId, recruitIds).eq(WgzAttendance::getDate, date));
 | 
			
		||||
			bgtAttendanceVO.setEarlyLeaveNum(earlyLeaveNum);
 | 
			
		||||
		}
 | 
			
		||||
		getLateAndLeave(bgtAttendanceVO, startData, endData);
 | 
			
		||||
		return bgtAttendanceVO;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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)) {
 | 
			
		||||
			Integer late = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().eq(WgzAttendance::getLate, 1)
 | 
			
		||||
				.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);
 | 
			
		||||
			vo.setLeaveNum(leave);
 | 
			
		||||
	@Override
 | 
			
		||||
	public List<BgtDayAttendanceCountVO> attendanceList(BgtAttendanceDTO dto) {
 | 
			
		||||
		FbsProjectTask task = taskService.getById(dto.getTaskId());
 | 
			
		||||
		validTaskTime(task, dto.getDate());
 | 
			
		||||
 | 
			
		||||
		LocalDate taskBeginTime = DateUtils.str2Localdate(task.getTaskBeginTime(), DateUtils.YYYY_MM_DD);
 | 
			
		||||
		LocalDate date = dto.getDate();
 | 
			
		||||
 | 
			
		||||
		LocalDate startTime = date.minusDays(7);
 | 
			
		||||
		if (taskBeginTime!=null &&taskBeginTime.isAfter(startTime)){
 | 
			
		||||
			startTime = taskBeginTime;
 | 
			
		||||
		}
 | 
			
		||||
		return countDayByTaskId(dto.getTaskId(), startTime, date);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	public void validTaskTime(FbsProjectTask task,LocalDate date){
 | 
			
		||||
		LocalDate taskBeginTime = DateUtils.str2Localdate(task.getTaskBeginTime(), DateUtils.YYYY_MM_DD);
 | 
			
		||||
		LocalDate taskEndTime = DateUtils.str2Localdate(task.getTaskEndTime(), DateUtils.YYYY_MM_DD);
 | 
			
		||||
		if(taskEndTime == null){
 | 
			
		||||
			taskEndTime = LocalDate.now();
 | 
			
		||||
		}
 | 
			
		||||
		if(date.isBefore(taskBeginTime) || date.isAfter(taskEndTime)){
 | 
			
		||||
			throw new BaseException("当前日期不在任务时间范围内");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
//	@Override
 | 
			
		||||
	//	@Override
 | 
			
		||||
//	public WgzAttendance findByUserIdWait(Long appUserId, Long recruitId, String date) {
 | 
			
		||||
//		LambdaQueryWrapper<WgzAttendance> qw = new LambdaQueryWrapper<>();
 | 
			
		||||
//		qw.eq(WgzAttendance::getRecruitId,recruitId);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user