优化
This commit is contained in:
@ -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
|
||||
|
@ -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