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 009bab0..2c0b17e 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 @@ -2,10 +2,14 @@ package com.ruoyi.web.controller.bgt; import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO; +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.BgtProjectRecruitApplyVO; +import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.wgz.service.IWgzAttendanceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -24,6 +28,9 @@ public class AppBgtAttendanceController { private final IWgzAttendanceService attendanceService; + private final IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService; + + @ApiOperation("App包工头总体考勤情况") @GetMapping("attendance") public AjaxResult attendanceDetail(@Validated BgtAttendanceDTO dto) { @@ -36,5 +43,10 @@ public class AppBgtAttendanceController { return AjaxResult.success(attendanceService.bgtAttendanceDetail(dto)); } + @ApiOperation("总体考勤情况-人员出勤情况") + @GetMapping("/todayAttendanceList") + public TableDataInfo todayAttendanceList(@Validated BgtAttendanceDayDTO req) { + return iBgtProjectRecruitApplyService.dayAttendanceList(req); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtProjectRecruitApplyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtProjectRecruitApplyController.java index 630cfb7..ce76540 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtProjectRecruitApplyController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bgt/AppBgtProjectRecruitApplyController.java @@ -1,7 +1,7 @@ package com.ruoyi.web.controller.bgt; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.bgt.domain.BgtProjectRecruitApply; -import com.ruoyi.bgt.domain.dto.BgtAttendanceDayDTO; import com.ruoyi.bgt.domain.dto.BgtProjectRecruitApplyConsentDTO; import com.ruoyi.bgt.domain.dto.BgtProjectRecruitApplyQueryDTO; import com.ruoyi.bgt.domain.dto.BgtScoreDTO; @@ -13,6 +13,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.RecruitApplyStatus; import com.ruoyi.wgz.bo.req.WgzAppPersonalBasicInformationReq; import com.ruoyi.wgz.bo.res.WgzAppPersonalBasicInformationRes; import com.ruoyi.wgz.service.IWgzUserService; @@ -67,6 +68,19 @@ public class AppBgtProjectRecruitApplyController extends BaseController { return AjaxResult.success(wgzUserService.userPersonalBasicInformation(req)); } + @ApiOperation("App务工者消息个人详情") + @GetMapping("/userMessageInfo") + public AjaxResult wgzMessageInformation(Long userId,Long recruitId) { + WgzAppPersonalBasicInformationReq req = new WgzAppPersonalBasicInformationReq(); + req.setUserId(userId); + WgzAppPersonalBasicInformationRes res = wgzUserService.userPersonalBasicInformation(req); + BgtProjectRecruitApply one = iBgtProjectRecruitApplyService.getOne(Wrappers.lambdaQuery() + .eq(BgtProjectRecruitApply::getUserId, userId) + .eq(BgtProjectRecruitApply::getRecruitId, recruitId)); + res.setIsChoose(!one.getStatus().equals(RecruitApplyStatus.SIGN_UP.getCode())); + return AjaxResult.success(res); + } + @ApiOperation("App务工者招工报名") @Log(title = "App务工者招工报名", businessType = BusinessType.INSERT) @RepeatSubmit @@ -84,12 +98,6 @@ public class AppBgtProjectRecruitApplyController extends BaseController { } - @ApiOperation("总体考勤情况-人员出勤情况") - @GetMapping("/todayAttendanceList") - public TableDataInfo todayAttendanceList(@Validated BgtAttendanceDayDTO req) { - return iBgtProjectRecruitApplyService.dayAttendanceList(req); - } - @ApiOperation("App务工者退场") @Log(title = "App务工者退场", businessType = BusinessType.UPDATE) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index dc58a40..acc6bdc 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -28,7 +28,7 @@ captcha: # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 9098 + port: 9099 servlet: # 应用的访问路径 context-path: /ruoyi diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitApplyStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitApplyStatus.java index 3890ed1..7a0615f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitApplyStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitApplyStatus.java @@ -1,7 +1,7 @@ package com.ruoyi.common.enums; /** - * 用户状态 + * 招工申请状态 * * @author ruoyi */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitStatus.java new file mode 100644 index 0000000..8e6e157 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecruitStatus.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.enums; + +/** + * 招工状态 + * + * @author ruoyi + */ +public enum RecruitStatus +{ + PROGRESS("1", "进行中"), + FULL("2", "已招满"), + OVERDUE("3", "已过期"), + ; + + private final String code; + private final String info; + + RecruitStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtProjectRecruitApplyQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtProjectRecruitApplyQueryDTO.java index b32ae0a..4ef62b7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtProjectRecruitApplyQueryDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/dto/BgtProjectRecruitApplyQueryDTO.java @@ -1,11 +1,14 @@ package com.ruoyi.bgt.domain.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDate; import java.util.List; @Data @@ -32,4 +35,15 @@ public class BgtProjectRecruitApplyQueryDTO extends BaseEntity { @ApiModelProperty("务工者名字") private String username; + @ApiModelProperty("日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate date; + + @ApiModelProperty(value = "开始日期",hidden = true) + private LocalDate beginDate; + + @ApiModelProperty(value = "开始日期",hidden = true) + private LocalDate endDate; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceCountVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceCountVO.java index e910c7b..29bdaac 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceCountVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtAttendanceCountVO.java @@ -37,5 +37,11 @@ public class BgtAttendanceCountVO implements Serializable { @ApiModelProperty("缺勤人数") private Integer absenceDutyNum; + @ApiModelProperty("到岗率总和") + private Integer rateSum; + + @ApiModelProperty("到岗率天数") + private Integer rateDay; + } 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 92874d1..7d5619f 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 @@ -29,6 +29,9 @@ public class BgtMessageVO implements Serializable { @ApiModelProperty("表ID") private Long tableId; + @ApiModelProperty("发送人") + private Long senderId; + @ApiModelProperty("标题") private String headline; diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitApplyVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitApplyVO.java index 8b34a56..4a93127 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitApplyVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitApplyVO.java @@ -60,6 +60,9 @@ public class BgtProjectRecruitApplyVO implements Serializable { @ApiModelProperty("招工主题") private String recruitName; + @ApiModelProperty("任务Id") + private Long taskId; + @ApiModelProperty("任务名") private String taskName; 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 06ce2ed..c049827 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 @@ -115,4 +115,7 @@ public class BgtProjectRecruitDetailVO implements Serializable { @ApiModelProperty("同意人数") private Integer passNum; + + @ApiModelProperty("招工状态(1-进行中,2-已招满,3-已过期)") + private String status; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitVO.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitVO.java index 3a2d6be..f7409ee 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/domain/vo/BgtProjectRecruitVO.java @@ -55,6 +55,9 @@ public class BgtProjectRecruitVO implements Serializable { @ApiModelProperty("工种") private String typeOfWork; + @ApiModelProperty("招工状态(1-进行中,2-已招满,3-已过期)") + private String status; + @ApiModelProperty("申请者列表") List applyList; diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/IBgtProjectRecruitApplyService.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/IBgtProjectRecruitApplyService.java index ce4859b..fb287d8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/IBgtProjectRecruitApplyService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/IBgtProjectRecruitApplyService.java @@ -129,4 +129,7 @@ public interface IBgtProjectRecruitApplyService extends IServicePlus queryMyPageList(BgtMessageMyListDTO dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BgtMessage::getRecipientId, SecurityUtils.getAppUserId()); + wrapper.orderByDesc(BgtMessage::getCreateTime); Page result = page(PageUtils.buildPage(), wrapper); Page bgtMessageVOPage = new Page<>(); bgtMessageVOPage.setTotal(result.getTotal()); 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 b39c1ea..4925097 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 @@ -48,6 +48,7 @@ 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.*; import static com.ruoyi.common.constants.BgtMessageConstant.*; @@ -145,7 +146,11 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl queryDTOPage = new Page<>(); queryDTOPage.setCurrent(dto.getPageNum()); queryDTOPage.setSize(dto.getPageSize()); @@ -179,6 +184,12 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl list = baseMapper.selectList(Wrappers.lambdaQuery().eq(BgtProjectRecruitApply::getRecruitId, recruitId) + .eq(BgtProjectRecruitApply::getUserId, userId)); + return list.get(0); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtWageApplicationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtWageApplicationServiceImpl.java index c3f88a5..30ccb8f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtWageApplicationServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtWageApplicationServiceImpl.java @@ -103,9 +103,8 @@ public class BgtWageApplicationServiceImpl extends ServicePlusImplcountVO.getTotalNum()?existingVO.getTotalNum():countVO.getTotalNum()); existingVO.setAbsenceDutyNum(existingVO.getAbsenceDutyNum() + countVO.getTotalNum()-countVO.getReportToDutyNum()); + int rate = new BigDecimal(countVO.getReportToDutyNum()).divide(new BigDecimal(countVO.getTotalNum()), 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal(100)).intValue(); + existingVO.setRateSum(existingVO.getRateSum()+rate); + existingVO.setRateDay(existingVO.getRateDay()+1); } else { // 如果该月份不在 map 中,则创建一个新的 BgtAttendanceCountVO 对象 - BgtAttendanceCountVO newVO = new BgtAttendanceCountVO(countVO.getReportToDutyNum(), countVO.getTotalNum(), date.withDayOfMonth(1),0); + BgtAttendanceCountVO newVO = new BgtAttendanceCountVO(countVO.getReportToDutyNum(), countVO.getTotalNum(), date.withDayOfMonth(1),0,0,0); + if(countVO.getTotalNum()>0){ + newVO.setAbsenceDutyNum(countVO.getTotalNum()-countVO.getReportToDutyNum()); + int rate = new BigDecimal(countVO.getReportToDutyNum()).divide(new BigDecimal(countVO.getTotalNum()), 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal(100)).intValue(); + newVO.setRateSum(rate); + newVO.setRateDay(1); + } monthMap.put(yearMonth, newVO); } } @@ -73,7 +85,7 @@ public class DataUtil { result.add(monthMap.get(currentMonth)); } else { // 如果该月份没有统计数据,则创建一个新的 BgtAttendanceCountVO 对象,将到岗人数和总人数都设置为 0 - BgtAttendanceCountVO emptyVO = new BgtAttendanceCountVO(0, 0, currentMonth.atDay(1),0); + BgtAttendanceCountVO emptyVO = new BgtAttendanceCountVO(0, 0, currentMonth.atDay(1),0,0,0); result.add(emptyVO); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java b/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java index e30d357..88147d3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java +++ b/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java @@ -9,6 +9,7 @@ import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService; import com.ruoyi.bgt.service.IBgtProjectRecruitService; import com.ruoyi.common.constants.WgzAndBgtMessageConstant; import com.ruoyi.common.enums.RecruitApplyStatus; +import com.ruoyi.common.enums.RecruitStatus; import com.ruoyi.fbs.domain.FbsProjectTask; import com.ruoyi.fbs.service.IFbsProjectTaskService; import com.ruoyi.wgz.domain.WgzAttendance; @@ -77,11 +78,13 @@ public class BusinessTask .lt(BgtProjectRecruit::getRecruitEndTime, LocalDate.now())); if(CollectionUtil.isNotEmpty(recruitList)){ List recruitIds = recruitList.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); - recruitApplyService.lambdaUpdate() + recruitApplyService.lambdaUpdate() .in(BgtProjectRecruitApply::getRecruitId, recruitIds) .in(BgtProjectRecruitApply::getStatus,status) .set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode()) .update(); + recruitService.lambdaUpdate().in(BgtProjectRecruit::getId, recruitIds) + .set(BgtProjectRecruit::getStatus,RecruitStatus.OVERDUE.getCode()).update(); } Console.log("招工拒绝任务结束,此次拒绝任务个数:"+recruitList.size()); } @@ -92,7 +95,7 @@ public class BusinessTask public void entry() { Console.log("开始招工进场任务"); - recruitApplyService.lambdaUpdate() + recruitApplyService.lambdaUpdate() .eq(BgtProjectRecruitApply::getEntryTime, LocalDate.now()) .eq(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.WGZ_PASS.getCode()) .set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode()) diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppPersonalBasicInformationRes.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppPersonalBasicInformationRes.java index 1fb9692..b9b759f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppPersonalBasicInformationRes.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppPersonalBasicInformationRes.java @@ -75,4 +75,7 @@ public class WgzAppPersonalBasicInformationRes implements Serializable { @ApiModelProperty("工种名") private String typeOfWorkName; + + @ApiModelProperty("是否被选择") + private Boolean isChoose; } 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 11afb11..6e85666 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 @@ -23,4 +23,9 @@ public interface WgzAttendanceMapper extends BaseMapperPlus { List countByTaskId(@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 + , @Param("endDate")LocalDate endDate); } 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 e105476..f400353 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 @@ -106,7 +106,12 @@ public interface IWgzAttendanceService extends IServicePlus { */ List countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate); + /** + * 统计某天应打卡人数 + */ + Integer dayTotalNum(Long taskId,LocalDate date); + Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate); /** * 总体考勤情况 */ 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 f5b5ac3..ae6c634 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 @@ -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 queryPageList(WgzAttendanceQueryBo bo) { - Page result = page(PageUtils.buildPage(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); - } + @Override + public TableDataInfo queryPageList(WgzAttendanceQueryBo bo) { + Page result = page(PageUtils.buildPage(), buildQueryWrapper(bo)); + return PageUtils.buildDataInfo(result); + } - @Override - public List queryList(WgzAttendanceQueryBo bo) { - return list(buildQueryWrapper(bo)); - } + @Override + public List queryList(WgzAttendanceQueryBo bo) { + return list(buildQueryWrapper(bo)); + } - private LambdaQueryWrapper buildQueryWrapper(WgzAttendanceQueryBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper 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 buildQueryWrapper(WgzAttendanceQueryBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return removeByIds(ids); - } + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return removeByIds(ids); + } /** @@ -177,8 +176,8 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl 0; - }else{ + } else { wgzAttendance.setClockInTime(now); LocalTime beginWorkTime = appById.getBeginWorkTime(); //上班 if (!localTime.isBefore(beginWorkTime)) { @@ -220,8 +219,9 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl apply = new LambdaQueryWrapper(). eq(WgzAttendance::getUserId, userId). eq(WgzAttendance::getRecruitId, recruitId).and(wrapper -> wrapper @@ -390,7 +390,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl0) { //表示查询指定天数的打卡记录,否则查询所有 + if (num != null && num > 0) { //表示查询指定天数的打卡记录,否则查询所有 apply.last("LIMIT " + num); } return baseMapper.selectCount(apply); @@ -402,6 +402,16 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl 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 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 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 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 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)){ + if (CollectionUtil.isNotEmpty(recruitIds)) { Integer late = baseMapper.selectCount(Wrappers.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.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 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 list) { LocalDate date = wgzAttendance.getDate(); @@ -581,7 +631,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl 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 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 wgzAttendances = baseMapper.selectList(wrapper); // 创建SimpleDateFormat对象,格式化日期为中文星期 - SimpleDateFormat sdf = new SimpleDateFormat("EEEE", java.util.Locale.CHINESE); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE", Locale.CHINA); //获取招工打卡时间 - List list = iBgtProjectRecruitService.list(Wrappers.lambdaQuery().in(BgtProjectRecruit::getId)); + List list = iBgtProjectRecruitService.list(Wrappers.lambdaQuery().in(BgtProjectRecruit::getId,recruitIds)); Map recruitMap = list.stream().collect(Collectors.toMap(BgtProjectRecruit::getId, recruit -> recruit)); List lateRecords = new ArrayList<>(); - List earlyLeaveRecords= new ArrayList<>(); - List missRecords= new ArrayList<>(); - List records= new ArrayList<>(); + List earlyLeaveRecords = new ArrayList<>(); + List missRecords = new ArrayList<>(); + List 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 wra = new LambdaQueryWrapper<>(); wra.eq(WgzAttendance::getRecruitId, recruitId); wra.eq(WgzAttendance::getUserId, userId); diff --git a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml index e7963ce..926c6b4 100644 --- a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitApplyMapper.xml @@ -30,12 +30,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" wu.type_of_work, bpr.recruit_name, fpt.task_name, + bpr.task_id, wsr.score as hasScore from bgt_project_recruit_apply bpra left join wgz_user wu on bpra.user_id = wu.user_id left join bgt_project_recruit bpr on bpr.id = bpra.recruit_id left join fbs_project_task fpt on fpt.id = bpr.task_id - left join wgz_score_record wsr on bpra.user_id = wsr.user_id and bpra.id = wsr.recruit_id + left join wgz_score_record wsr on bpra.user_id = wsr.user_id and bpra.recruit_id = wsr.recruit_id and wu.username like concat('%', #{dto.username}, '%') @@ -52,6 +53,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item} + + AND (entry_time between #{dto.beginDate} and #{dto.endDate}) or (leave_time between #{dto.beginDate} and #{dto.endDate}) + order by bpra.create_time desc,bpra.status asc diff --git a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml index 34a250e..587e7f6 100644 --- a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml @@ -29,7 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select count(1) as reportToDutyNum, date, - (select count(1) from bgt_project_recruit_apply where entry_time <= date and (leave_time is null or leave_time>date) + (select count(1) from bgt_project_recruit_apply where entry_time <= date and (leave_time is null or leave_time>=date) and recruit_id in (select id from bgt_project_recruit where task_id = #{taskId} )) as totalNum from wgz_attendance where date between #{beginDate} and #{endDate} @@ -42,4 +42,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by date order by date + + + + +