diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtAttendanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtAttendanceController.java index 2c0b17e..b3ab938 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtAttendanceController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtAttendanceController.java @@ -6,6 +6,7 @@ import com.ruoyi.bgt.domain.dto.BgtAttendanceDayDTO; import com.ruoyi.bgt.domain.dto.BgtAttendanceDetailDTO; import com.ruoyi.bgt.domain.vo.BgtAttendanceDetailVO; import com.ruoyi.bgt.domain.vo.BgtAttendanceVO; +import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO; import com.ruoyi.bgt.domain.vo.BgtProjectRecruitApplyVO; import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService; import com.ruoyi.common.core.domain.AjaxResult; @@ -20,6 +21,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @Api(value = "App包工头考勤控制器", tags = {"App包工头考勤管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @@ -31,22 +34,29 @@ public class AppBgtAttendanceController { private final IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService; - @ApiOperation("App包工头总体考勤情况") + @ApiOperation("App包工头总体考勤情况-统计") @GetMapping("attendance") public AjaxResult attendanceDetail(@Validated BgtAttendanceDTO dto) { return AjaxResult.success(attendanceService.attendanceDetail(dto)); } + @ApiOperation("App包工头总体考勤情况-柱状图") + @GetMapping("attendanceList") + public AjaxResult> attendanceList(@Validated BgtAttendanceDTO dto) { + return AjaxResult.success(attendanceService.attendanceList(dto)); + } + + @ApiOperation("App包工头总体考勤情况-人员出勤情况") + @GetMapping("/todayAttendanceList") + public TableDataInfo todayAttendanceList(@Validated BgtAttendanceDayDTO req) { + return iBgtProjectRecruitApplyService.dayAttendanceList(req); + } + + @ApiOperation("App包工头考勤统计详情") @GetMapping("attendanceDetail") public AjaxResult attendanceDetail(@Validated BgtAttendanceDetailDTO dto) { return AjaxResult.success(attendanceService.bgtAttendanceDetail(dto)); } - @ApiOperation("总体考勤情况-人员出勤情况") - @GetMapping("/todayAttendanceList") - public TableDataInfo todayAttendanceList(@Validated BgtAttendanceDayDTO req) { - return iBgtProjectRecruitApplyService.dayAttendanceList(req); - } - } diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDTO.java index c1ed028..c039092 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDTO.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; import java.time.LocalDate; @Data @@ -17,6 +18,7 @@ import java.time.LocalDate; public class BgtAttendanceDTO { @ApiModelProperty("任务ID") + @NotNull(message = "任务ID不能为空") private Long taskId; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDayDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDayDTO.java index 3764e80..ee33e73 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDayDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtAttendanceDayDTO.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; import java.time.LocalDate; @Data @@ -27,9 +28,10 @@ public class BgtAttendanceDayDTO { @ApiModelProperty("日期") private LocalDate date; - @ApiModelProperty("考勤类型(1出勤 2缺勤 3迟到)") + @ApiModelProperty("考勤类型(1正常 2异常 3请假)") private Integer attendanceType; @ApiModelProperty("任务ID") + @NotNull(message = "任务ID不能为空") private Long taskId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceDetailVO.java index 28d41b3..564a52b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceDetailVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceDetailVO.java @@ -1,5 +1,6 @@ package com.ruoyi.bgt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,6 +17,7 @@ import java.util.List; public class BgtAttendanceDetailVO { @ApiModelProperty("务工者Id") + @JsonFormat(shape = JsonFormat.Shape.STRING) private Long userId; @ApiModelProperty("姓名") diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDailyClockDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDailyClockDetailVO.java index ccba905..a6b170c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDailyClockDetailVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDailyClockDetailVO.java @@ -1,5 +1,6 @@ package com.ruoyi.bgt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -25,6 +26,7 @@ public class BgtDailyClockDetailVO { private String recruitName; /** 人员ID */ @ApiModelProperty("人员ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) private Long userId; @ApiModelProperty("头像地址") diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDayAttendanceCountVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDayAttendanceCountVO.java new file mode 100644 index 0000000..036310e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtDayAttendanceCountVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.bgt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.time.LocalDate; + +/** + * 考勤打卡对象 wgz_attendance + * + * @author ruoyi + * @date 2025-02-20 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@ApiModel("务工者每天考勤打卡统计对象") +public class BgtDayAttendanceCountVO { + + @ApiModelProperty("到岗人数") + private Integer reportToDutyNum; + + @ApiModelProperty("日期") + private LocalDate date; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtMessageVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtMessageVO.java index 7d5619f..e27552c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtMessageVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtMessageVO.java @@ -1,5 +1,6 @@ package com.ruoyi.bgt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -30,6 +31,7 @@ public class BgtMessageVO implements Serializable { private Long tableId; @ApiModelProperty("发送人") + @JsonFormat(shape = JsonFormat.Shape.STRING) private Long senderId; @ApiModelProperty("标题") diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitDetailVO.java index c049827..bef3c75 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitDetailVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitDetailVO.java @@ -90,6 +90,7 @@ public class BgtProjectRecruitDetailVO implements Serializable { private String typeOfWork; @ApiModelProperty("创建者ID") + @JsonFormat(shape = JsonFormat.Shape.STRING) private Long userId; @ApiModelProperty("发布时间") diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/mapper/BgtProjectRecruitApplyMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/mapper/BgtProjectRecruitApplyMapper.java index f9e054b..006a15a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/mapper/BgtProjectRecruitApplyMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/mapper/BgtProjectRecruitApplyMapper.java @@ -28,7 +28,7 @@ public interface BgtProjectRecruitApplyMapper extends BaseMapperPlus appQueryList(@Param("dto") BgtProjectRecruitApplyQueryDTO dto); - Page dayAttendanceList(@Param("page")Page queryDTOPage,@Param("dto") BgtAttendanceDayDTO dto); +// Page dayAttendanceList(@Param("page")Page queryDTOPage,@Param("dto") BgtAttendanceDayDTO dto); Page todayAttendanceList(@Param("page")Page queryDTOPage,@Param("dto") BgtAttendanceDayDTO dto); // 获取指定项目下的所有成员(分页) diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java index 4925097..6dff872 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java @@ -47,7 +47,6 @@ import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.time.LocalDate; -import java.time.LocalTime; import java.time.temporal.TemporalAdjusters; import java.util.*; @@ -326,20 +325,8 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl queryDTOPage = new Page<>(); queryDTOPage.setCurrent(dto.getPageNum()); queryDTOPage.setSize(dto.getPageSize()); - - // 获取当前时间 - LocalTime currentTime = LocalTime.now(); - // 定义目标时间12:10 12点才会录入当天所有人的考勤数据 - LocalTime targetTime = LocalTime.of(12, 10); - // 判断当前时间是否在12:10之后 - Page queryVOPage; - if (currentTime.isAfter(targetTime)) { - queryVOPage = baseMapper.dayAttendanceList(queryDTOPage, dto); - } else { - queryVOPage = baseMapper.todayAttendanceList(queryDTOPage, dto); - } + Page queryVOPage = baseMapper.todayAttendanceList(queryDTOPage, dto); return PageUtils.buildDataInfo(queryVOPage); - } @Override diff --git a/ruoyi-system/src/main/java/com/ruoyi/common/util/DataUtil.java b/ruoyi-system/src/main/java/com/ruoyi/common/util/DataUtil.java index 7632d28..d2e493f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/common/util/DataUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/common/util/DataUtil.java @@ -2,6 +2,7 @@ package com.ruoyi.common.util; import cn.hutool.core.util.StrUtil; import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO; +import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO; import java.math.BigDecimal; import java.math.RoundingMode; @@ -11,29 +12,29 @@ import java.util.*; public class DataUtil { - public static List fillMissingDates(List countVOS, LocalDate startDate, LocalDate endDate) { + public static List fillMissingDates(List countVOS, LocalDate startDate, LocalDate endDate) { // 使用 HashSet 存储已有的日期,方便快速查找 Set existingDates = new HashSet<>(); - for (BgtAttendanceCountVO vo : countVOS) { + for (BgtDayAttendanceCountVO vo : countVOS) { existingDates.add(vo.getDate()); } // 创建一个新的列表,用于存储补充后的结果 - List filledList = new ArrayList<>(countVOS); + List filledList = new ArrayList<>(countVOS); // 遍历日期范围,补充缺失的日期 LocalDate currentDate = startDate; while (!currentDate.isAfter(endDate)) { if (!existingDates.contains(currentDate)) { // 如果当前日期不在已有日期集合中,创建一个新的 BgtAttendanceCountVO 对象并添加到结果列表中 - filledList.add(new BgtAttendanceCountVO(0,0,currentDate,0,0,0)); + filledList.add(new BgtDayAttendanceCountVO(0,currentDate)); } // 日期递增一天 currentDate = currentDate.plusDays(1); } // 对结果列表按日期排序 - filledList.sort(Comparator.comparing(BgtAttendanceCountVO::getDate)); + filledList.sort(Comparator.comparing(BgtDayAttendanceCountVO::getDate)); return filledList; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/fbs/domain/vo/AppTaskDetailAttendanceVO.java b/ruoyi-system/src/main/java/com/ruoyi/fbs/domain/vo/AppTaskDetailAttendanceVO.java index 6c0aee2..a77b178 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/fbs/domain/vo/AppTaskDetailAttendanceVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/fbs/domain/vo/AppTaskDetailAttendanceVO.java @@ -1,6 +1,7 @@ package com.ruoyi.fbs.domain.vo; import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO; +import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -27,7 +28,7 @@ public class AppTaskDetailAttendanceVO { private Integer reportToDutyRate= 0; @ApiModelProperty("考勤列表") - List countVOS; + List countVOS; diff --git a/ruoyi-system/src/main/java/com/ruoyi/fbs/service/impl/FbsProjectTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/fbs/service/impl/FbsProjectTaskServiceImpl.java index 3f4374c..203fdcc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/fbs/service/impl/FbsProjectTaskServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/fbs/service/impl/FbsProjectTaskServiceImpl.java @@ -10,7 +10,7 @@ import com.ruoyi.bgt.bo.BgtProjectRecruitQueryBo; import com.ruoyi.bgt.domain.BgtProjectRecruit; import com.ruoyi.bgt.domain.dto.BgtProjectRecruitApplyQueryDTO; import com.ruoyi.bgt.domain.dto.BgtWageApplicationQueryDTO; -import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO; +import com.ruoyi.bgt.domain.vo.BgtDayAttendanceCountVO; import com.ruoyi.bgt.domain.vo.BgtProjectRecruitApplyVO; import com.ruoyi.bgt.domain.vo.BgtWageApplicationListVO; import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService; @@ -209,19 +209,18 @@ public class FbsProjectTaskServiceImpl extends ServicePlusImpl - countVOS = attendanceService.countByTaskId(id, startTime, date); - if(CollectionUtil.isNotEmpty(countVOS)){ - BgtAttendanceCountVO vo = countVOS.get(0); - appTaskDetailVO.setCountVOS(DataUtil.fillMissingDates(countVOS, startTime, date)); - appTaskDetailVO.setTotalNum(vo.getTotalNum()); - appTaskDetailVO.setReportToDutyNum(vo.getReportToDutyNum()); - if(vo.getTotalNum()!=0){ - int rate = new BigDecimal(vo.getReportToDutyNum()).divide(new BigDecimal(vo.getTotalNum()), 2, RoundingMode.HALF_UP) - .multiply(new BigDecimal(100)).intValue(); - appTaskDetailVO.setReportToDutyRate(rate); - } - + List countVOS = attendanceService.countDayByTaskId(id, startTime, date); + // 补充缺失的天数 + List bgtDayAttendanceCountVOS = DataUtil.fillMissingDates(countVOS, startTime, date); + //查询当天的总人数 + Integer totalNum = attendanceService.dayTotalNum(id, date); + appTaskDetailVO.setTotalNum(totalNum); + //计算到岗率 + if(totalNum!=0){ + BgtDayAttendanceCountVO bgtDayAttendanceCountVO = bgtDayAttendanceCountVOS.get(bgtDayAttendanceCountVOS.size() - 1); + int rate = new BigDecimal(bgtDayAttendanceCountVO.getReportToDutyNum()).divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal(100)).intValue(); + appTaskDetailVO.setReportToDutyRate(rate); } return appTaskDetailVO; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzAttendanceMapper.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzAttendanceMapper.java index 6e85666..b8e1ed4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzAttendanceMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzAttendanceMapper.java @@ -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 { List countByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate , @Param("endDate")LocalDate endDate); + List 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 diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzAttendanceService.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzAttendanceService.java index f400353..d57c353 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzAttendanceService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzAttendanceService.java @@ -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 { */ List countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate); + /** + * 统计任务每天打卡情况 + */ + List countDayByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate); + /** * 统计某天应打卡人数 */ @@ -113,10 +119,12 @@ public interface IWgzAttendanceService extends IServicePlus { Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate); /** - * 总体考勤情况 + * 总体考勤情况-统计 */ BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto); + List attendanceList(BgtAttendanceDTO dto); + /** * 考勤详情,查询指定用户指定项目的指定天数考勤情况统计(如若用户输入20,但实际只有2天出勤); * 如若num为0,那么表示查询所有天数的考勤情况统计; diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzAttendanceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzAttendanceServiceImpl.java index ae6c634..f322ace 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzAttendanceServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzAttendanceServiceImpl.java @@ -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 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 countVOS = countByTaskId(dto.getTaskId(), startData, endData); - List 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 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 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 countVOS = countDayByTaskId(dto.getTaskId(), date, date); + if(CollectionUtil.isNotEmpty(countVOS)){ + bgtAttendanceVO.setReportToDutyNum(countVOS.get(0).getReportToDutyNum()); + } + + //缺勤人数 + bgtAttendanceVO.setAbsenceDutyNum(totalNum-bgtAttendanceVO.getReportToDutyNum()); + + //任务拥有的所有招工 + List bgtProjectRecruits = iBgtProjectRecruitService.getBaseMapper().selectList(Wrappers.lambdaQuery() + .eq(BgtProjectRecruit::getTaskId, dto.getTaskId())); + List recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(recruitIds)) { + //请假人数 + Integer leaveNum = baseMapper.selectCount(Wrappers.lambdaQuery().isNotNull(WgzAttendance::getLeaveMarkId) + .in(WgzAttendance::getRecruitId, recruitIds).eq(WgzAttendance::getDate, date)); + bgtAttendanceVO.setLeaveNum(leaveNum); + + //迟到人数 + Integer lateNum = baseMapper.selectCount(Wrappers.lambdaQuery().eq(WgzAttendance::getLate, 1) + .eq(WgzAttendance::getRecruitId, recruitIds).eq(WgzAttendance::getDate, date)); + bgtAttendanceVO.setLateNum(lateNum); + + //早退人数 + Integer earlyLeaveNum = baseMapper.selectCount(Wrappers.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 bgtProjectRecruits = iBgtProjectRecruitService.getBaseMapper().selectList(Wrappers.lambdaQuery() - .eq(BgtProjectRecruit::getTaskId, vo.getTaskId())); - List recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(recruitIds)) { - Integer late = baseMapper.selectCount(Wrappers.lambdaQuery().eq(WgzAttendance::getLate, 1) - .eq(WgzAttendance::getRecruitId, recruitIds).between(WgzAttendance::getDate, startDate, endDate)); - Integer leave = baseMapper.selectCount(Wrappers.lambdaQuery().isNotNull(WgzAttendance::getLeaveMarkId) - .in(WgzAttendance::getRecruitId, recruitIds).between(WgzAttendance::getDate, startDate, endDate)); - vo.setLateNum(late); - vo.setLeaveNum(leave); + @Override + public List 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 qw = new LambdaQueryWrapper<>(); // qw.eq(WgzAttendance::getRecruitId,recruitId); diff --git a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml index 926c6b4..0edf0e0 100644 --- a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml @@ -98,30 +98,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + +