This commit is contained in:
zt
2025-03-06 16:22:37 +08:00
parent 4570788d5e
commit c286edf99f
18 changed files with 208 additions and 163 deletions

View File

@ -1,5 +1,6 @@
package com.ruoyi.wgz.mapper;
import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO;
import com.ruoyi.wgz.domain.WgzAttendance;
import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
import com.ruoyi.common.core.mybatisplus.cache.MybatisPlusRedisCache;
@ -24,6 +25,9 @@ public interface WgzAttendanceMapper extends BaseMapperPlus<WgzAttendance> {
List<BgtAttendanceCountVO> countByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate
, @Param("endDate")LocalDate endDate);
List<BgtDayAttendanceCountVO> countDayByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate
, @Param("endDate")LocalDate endDate);
Integer dayTotalNum(@Param("taskId") Long taskId, @Param("date")LocalDate date);
Integer monthTotalNum(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate

View File

@ -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,那么表示查询所有天数的考勤情况统计;

View File

@ -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);