This commit is contained in:
zt
2025-03-06 14:30:45 +08:00
parent d3add5b113
commit 4570788d5e
24 changed files with 359 additions and 154 deletions

View File

@ -2,10 +2,14 @@ package com.ruoyi.web.controller.bgt;
import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO; 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.dto.BgtAttendanceDetailDTO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceDetailVO; import com.ruoyi.bgt.domain.vo.BgtAttendanceDetailVO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO; 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.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wgz.service.IWgzAttendanceService; import com.ruoyi.wgz.service.IWgzAttendanceService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -24,6 +28,9 @@ public class AppBgtAttendanceController {
private final IWgzAttendanceService attendanceService; private final IWgzAttendanceService attendanceService;
private final IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService;
@ApiOperation("App包工头总体考勤情况") @ApiOperation("App包工头总体考勤情况")
@GetMapping("attendance") @GetMapping("attendance")
public AjaxResult<BgtAttendanceVO> attendanceDetail(@Validated BgtAttendanceDTO dto) { public AjaxResult<BgtAttendanceVO> attendanceDetail(@Validated BgtAttendanceDTO dto) {
@ -36,5 +43,10 @@ public class AppBgtAttendanceController {
return AjaxResult.success(attendanceService.bgtAttendanceDetail(dto)); return AjaxResult.success(attendanceService.bgtAttendanceDetail(dto));
} }
@ApiOperation("总体考勤情况-人员出勤情况")
@GetMapping("/todayAttendanceList")
public TableDataInfo<BgtProjectRecruitApplyVO> todayAttendanceList(@Validated BgtAttendanceDayDTO req) {
return iBgtProjectRecruitApplyService.dayAttendanceList(req);
}
} }

View File

@ -1,7 +1,7 @@
package com.ruoyi.web.controller.bgt; package com.ruoyi.web.controller.bgt;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.bgt.domain.BgtProjectRecruitApply; 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.BgtProjectRecruitApplyConsentDTO;
import com.ruoyi.bgt.domain.dto.BgtProjectRecruitApplyQueryDTO; import com.ruoyi.bgt.domain.dto.BgtProjectRecruitApplyQueryDTO;
import com.ruoyi.bgt.domain.dto.BgtScoreDTO; 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.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.RecruitApplyStatus;
import com.ruoyi.wgz.bo.req.WgzAppPersonalBasicInformationReq; import com.ruoyi.wgz.bo.req.WgzAppPersonalBasicInformationReq;
import com.ruoyi.wgz.bo.res.WgzAppPersonalBasicInformationRes; import com.ruoyi.wgz.bo.res.WgzAppPersonalBasicInformationRes;
import com.ruoyi.wgz.service.IWgzUserService; import com.ruoyi.wgz.service.IWgzUserService;
@ -67,6 +68,19 @@ public class AppBgtProjectRecruitApplyController extends BaseController {
return AjaxResult.success(wgzUserService.userPersonalBasicInformation(req)); return AjaxResult.success(wgzUserService.userPersonalBasicInformation(req));
} }
@ApiOperation("App务工者消息个人详情")
@GetMapping("/userMessageInfo")
public AjaxResult<WgzAppPersonalBasicInformationRes> wgzMessageInformation(Long userId,Long recruitId) {
WgzAppPersonalBasicInformationReq req = new WgzAppPersonalBasicInformationReq();
req.setUserId(userId);
WgzAppPersonalBasicInformationRes res = wgzUserService.userPersonalBasicInformation(req);
BgtProjectRecruitApply one = iBgtProjectRecruitApplyService.getOne(Wrappers.<BgtProjectRecruitApply>lambdaQuery()
.eq(BgtProjectRecruitApply::getUserId, userId)
.eq(BgtProjectRecruitApply::getRecruitId, recruitId));
res.setIsChoose(!one.getStatus().equals(RecruitApplyStatus.SIGN_UP.getCode()));
return AjaxResult.success(res);
}
@ApiOperation("App务工者招工报名") @ApiOperation("App务工者招工报名")
@Log(title = "App务工者招工报名", businessType = BusinessType.INSERT) @Log(title = "App务工者招工报名", businessType = BusinessType.INSERT)
@RepeatSubmit @RepeatSubmit
@ -84,12 +98,6 @@ public class AppBgtProjectRecruitApplyController extends BaseController {
} }
@ApiOperation("总体考勤情况-人员出勤情况")
@GetMapping("/todayAttendanceList")
public TableDataInfo<BgtProjectRecruitApplyVO> todayAttendanceList(@Validated BgtAttendanceDayDTO req) {
return iBgtProjectRecruitApplyService.dayAttendanceList(req);
}
@ApiOperation("App务工者退场") @ApiOperation("App务工者退场")
@Log(title = "App务工者退场", businessType = BusinessType.UPDATE) @Log(title = "App务工者退场", businessType = BusinessType.UPDATE)

View File

@ -28,7 +28,7 @@ captcha:
# 开发环境配置 # 开发环境配置
server: server:
# 服务器的HTTP端口默认为8080 # 服务器的HTTP端口默认为8080
port: 9098 port: 9099
servlet: servlet:
# 应用的访问路径 # 应用的访问路径
context-path: /ruoyi context-path: /ruoyi

View File

@ -1,7 +1,7 @@
package com.ruoyi.common.enums; package com.ruoyi.common.enums;
/** /**
* 用户状态 * 招工申请状态
* *
* @author ruoyi * @author ruoyi
*/ */

View File

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

View File

@ -1,11 +1,14 @@
package com.ruoyi.bgt.domain.dto; package com.ruoyi.bgt.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List; import java.util.List;
@Data @Data
@ -32,4 +35,15 @@ public class BgtProjectRecruitApplyQueryDTO extends BaseEntity {
@ApiModelProperty("务工者名字") @ApiModelProperty("务工者名字")
private String username; 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;
} }

View File

@ -37,5 +37,11 @@ public class BgtAttendanceCountVO implements Serializable {
@ApiModelProperty("缺勤人数") @ApiModelProperty("缺勤人数")
private Integer absenceDutyNum; private Integer absenceDutyNum;
@ApiModelProperty("到岗率总和")
private Integer rateSum;
@ApiModelProperty("到岗率天数")
private Integer rateDay;
} }

View File

@ -29,6 +29,9 @@ public class BgtMessageVO implements Serializable {
@ApiModelProperty("表ID") @ApiModelProperty("表ID")
private Long tableId; private Long tableId;
@ApiModelProperty("发送人")
private Long senderId;
@ApiModelProperty("标题") @ApiModelProperty("标题")
private String headline; private String headline;

View File

@ -60,6 +60,9 @@ public class BgtProjectRecruitApplyVO implements Serializable {
@ApiModelProperty("招工主题") @ApiModelProperty("招工主题")
private String recruitName; private String recruitName;
@ApiModelProperty("任务Id")
private Long taskId;
@ApiModelProperty("任务名") @ApiModelProperty("任务名")
private String taskName; private String taskName;

View File

@ -115,4 +115,7 @@ public class BgtProjectRecruitDetailVO implements Serializable {
@ApiModelProperty("同意人数") @ApiModelProperty("同意人数")
private Integer passNum; private Integer passNum;
@ApiModelProperty("招工状态(1-进行中2-已招满3-已过期)")
private String status;
} }

View File

@ -55,6 +55,9 @@ public class BgtProjectRecruitVO implements Serializable {
@ApiModelProperty("工种") @ApiModelProperty("工种")
private String typeOfWork; private String typeOfWork;
@ApiModelProperty("招工状态(1-进行中2-已招满3-已过期)")
private String status;
@ApiModelProperty("申请者列表") @ApiModelProperty("申请者列表")
List<BgtProjectRecruitApplyVO> applyList; List<BgtProjectRecruitApplyVO> applyList;

View File

@ -129,4 +129,7 @@ public interface IBgtProjectRecruitApplyService extends IServicePlus<BgtProjectR
* 项目详情·确认|拒绝报名 * 项目详情·确认|拒绝报名
*/ */
Boolean userConfirmRegistration(@Validated WgzAppConfirmRegistrationReq req); Boolean userConfirmRegistration(@Validated WgzAppConfirmRegistrationReq req);
BgtProjectRecruitApply getOne(Long recruitId,Long userId);
} }

View File

@ -170,6 +170,7 @@ public class BgtMessageServiceImpl extends ServicePlusImpl<BgtMessageMapper, Bgt
public TableDataInfo<BgtMessageVO> queryMyPageList(BgtMessageMyListDTO dto) { public TableDataInfo<BgtMessageVO> queryMyPageList(BgtMessageMyListDTO dto) {
LambdaQueryWrapper<BgtMessage> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<BgtMessage> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BgtMessage::getRecipientId, SecurityUtils.getAppUserId()); wrapper.eq(BgtMessage::getRecipientId, SecurityUtils.getAppUserId());
wrapper.orderByDesc(BgtMessage::getCreateTime);
Page<BgtMessage> result = page(PageUtils.buildPage(), wrapper); Page<BgtMessage> result = page(PageUtils.buildPage(), wrapper);
Page<BgtMessageVO> bgtMessageVOPage = new Page<>(); Page<BgtMessageVO> bgtMessageVOPage = new Page<>();
bgtMessageVOPage.setTotal(result.getTotal()); bgtMessageVOPage.setTotal(result.getTotal());

View File

@ -48,6 +48,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import static com.ruoyi.common.constants.BgtMessageConstant.*; import static com.ruoyi.common.constants.BgtMessageConstant.*;
@ -145,7 +146,11 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl<BgtProjec
dto.getRecruitIds().addAll(recruitIdsByTaskId); dto.getRecruitIds().addAll(recruitIdsByTaskId);
} }
} }
if(dto.getDate()!=null){
LocalDate date = dto.getDate();
dto.setBeginDate(date.with(TemporalAdjusters.firstDayOfMonth()));
dto.setEndDate(date.with(TemporalAdjusters.lastDayOfMonth()));
}
Page<BgtProjectRecruitApplyQueryDTO> queryDTOPage = new Page<>(); Page<BgtProjectRecruitApplyQueryDTO> queryDTOPage = new Page<>();
queryDTOPage.setCurrent(dto.getPageNum()); queryDTOPage.setCurrent(dto.getPageNum());
queryDTOPage.setSize(dto.getPageSize()); queryDTOPage.setSize(dto.getPageSize());
@ -179,6 +184,12 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl<BgtProjec
if (CollectionUtil.isNotEmpty(list)) { if (CollectionUtil.isNotEmpty(list)) {
throw new BaseException("该务工者已进入其他工地"); throw new BaseException("该务工者已进入其他工地");
} }
BgtProjectRecruit recruit = iBgtProjectRecruitService.getById(recruitApply.getRecruitId());
if(LocalDate.now().isAfter(recruit.getRecruitEndTime())){
throw new BaseException("该岗位已过期");
}
recruitApply.setEntryTime(dto.getEntryTime()); recruitApply.setEntryTime(dto.getEntryTime());
recruitApply.setStatus(RecruitApplyStatus.BGT_PASS.getCode()); recruitApply.setStatus(RecruitApplyStatus.BGT_PASS.getCode());
dto.getEntryMaterials().addAll(dto.getInsurances()); dto.getEntryMaterials().addAll(dto.getInsurances());
@ -411,6 +422,9 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl<BgtProjec
double rawNewScore = wgzScoreRecords.stream() double rawNewScore = wgzScoreRecords.stream()
.mapToDouble(WgzScoreRecord::getScore) .mapToDouble(WgzScoreRecord::getScore)
.sum(); .sum();
if(!wgzScoreRecords.isEmpty()){
rawNewScore = rawNewScore/wgzScoreRecords.size();
}
// 使用 DecimalFormat 格式化结果 // 使用 DecimalFormat 格式化结果
DecimalFormat df = new DecimalFormat("#.0"); DecimalFormat df = new DecimalFormat("#.0");
String formatted = df.format(rawNewScore); String formatted = df.format(rawNewScore);
@ -545,4 +559,11 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl<BgtProjec
return false; return false;
} }
@Override
public BgtProjectRecruitApply getOne(Long recruitId, Long userId) {
List<BgtProjectRecruitApply> list = baseMapper.selectList(Wrappers.<BgtProjectRecruitApply>lambdaQuery().eq(BgtProjectRecruitApply::getRecruitId, recruitId)
.eq(BgtProjectRecruitApply::getUserId, userId));
return list.get(0);
}
} }

View File

@ -103,9 +103,8 @@ public class BgtWageApplicationServiceImpl extends ServicePlusImpl<BgtWageApplic
.setSubheading(map.get(SUBHEADING)) .setSubheading(map.get(SUBHEADING))
.setTableId(task.getId()) .setTableId(task.getId())
.setTableName(SqlHelper.table(FbsProjectTask.class).getTableName()) .setTableName(SqlHelper.table(FbsProjectTask.class).getTableName())
.setMessageLargeType(BGT_LARGE_TASK); .setMessageLargeType(BGT_LARGE_SETTLEMENT);
bgtMessageService.sendAMessage(bgtMessage); bgtMessageService.sendAMessage(bgtMessage);
return save; return save;
} }

View File

@ -3,6 +3,8 @@ package com.ruoyi.common.util;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO; import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
@ -24,7 +26,7 @@ public class DataUtil {
while (!currentDate.isAfter(endDate)) { while (!currentDate.isAfter(endDate)) {
if (!existingDates.contains(currentDate)) { if (!existingDates.contains(currentDate)) {
// 如果当前日期不在已有日期集合中,创建一个新的 BgtAttendanceCountVO 对象并添加到结果列表中 // 如果当前日期不在已有日期集合中,创建一个新的 BgtAttendanceCountVO 对象并添加到结果列表中
filledList.add(new BgtAttendanceCountVO(0,0,currentDate,0)); filledList.add(new BgtAttendanceCountVO(0,0,currentDate,0,0,0));
} }
// 日期递增一天 // 日期递增一天
currentDate = currentDate.plusDays(1); currentDate = currentDate.plusDays(1);
@ -50,11 +52,21 @@ public class DataUtil {
if (monthMap.containsKey(yearMonth)) { if (monthMap.containsKey(yearMonth)) {
BgtAttendanceCountVO existingVO = monthMap.get(yearMonth); BgtAttendanceCountVO existingVO = monthMap.get(yearMonth);
existingVO.setReportToDutyNum(existingVO.getReportToDutyNum() + countVO.getReportToDutyNum()); existingVO.setReportToDutyNum(existingVO.getReportToDutyNum() + countVO.getReportToDutyNum());
existingVO.setTotalNum(existingVO.getTotalNum()>countVO.getTotalNum()?existingVO.getTotalNum():countVO.getTotalNum());
existingVO.setAbsenceDutyNum(existingVO.getAbsenceDutyNum() + countVO.getTotalNum()-countVO.getReportToDutyNum()); 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 { } else {
// 如果该月份不在 map 中,则创建一个新的 BgtAttendanceCountVO 对象 // 如果该月份不在 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); monthMap.put(yearMonth, newVO);
} }
} }
@ -73,7 +85,7 @@ public class DataUtil {
result.add(monthMap.get(currentMonth)); result.add(monthMap.get(currentMonth));
} else { } else {
// 如果该月份没有统计数据,则创建一个新的 BgtAttendanceCountVO 对象,将到岗人数和总人数都设置为 0 // 如果该月份没有统计数据,则创建一个新的 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); result.add(emptyVO);
} }
} }

View File

@ -9,6 +9,7 @@ import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService;
import com.ruoyi.bgt.service.IBgtProjectRecruitService; import com.ruoyi.bgt.service.IBgtProjectRecruitService;
import com.ruoyi.common.constants.WgzAndBgtMessageConstant; import com.ruoyi.common.constants.WgzAndBgtMessageConstant;
import com.ruoyi.common.enums.RecruitApplyStatus; import com.ruoyi.common.enums.RecruitApplyStatus;
import com.ruoyi.common.enums.RecruitStatus;
import com.ruoyi.fbs.domain.FbsProjectTask; import com.ruoyi.fbs.domain.FbsProjectTask;
import com.ruoyi.fbs.service.IFbsProjectTaskService; import com.ruoyi.fbs.service.IFbsProjectTaskService;
import com.ruoyi.wgz.domain.WgzAttendance; import com.ruoyi.wgz.domain.WgzAttendance;
@ -77,11 +78,13 @@ public class BusinessTask
.lt(BgtProjectRecruit::getRecruitEndTime, LocalDate.now())); .lt(BgtProjectRecruit::getRecruitEndTime, LocalDate.now()));
if(CollectionUtil.isNotEmpty(recruitList)){ if(CollectionUtil.isNotEmpty(recruitList)){
List<Long> recruitIds = recruitList.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); List<Long> recruitIds = recruitList.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList());
recruitApplyService.<BgtProjectRecruitApply>lambdaUpdate() recruitApplyService.lambdaUpdate()
.in(BgtProjectRecruitApply::getRecruitId, recruitIds) .in(BgtProjectRecruitApply::getRecruitId, recruitIds)
.in(BgtProjectRecruitApply::getStatus,status) .in(BgtProjectRecruitApply::getStatus,status)
.set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode()) .set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode())
.update(); .update();
recruitService.lambdaUpdate().in(BgtProjectRecruit::getId, recruitIds)
.set(BgtProjectRecruit::getStatus,RecruitStatus.OVERDUE.getCode()).update();
} }
Console.log("招工拒绝任务结束,此次拒绝任务个数:"+recruitList.size()); Console.log("招工拒绝任务结束,此次拒绝任务个数:"+recruitList.size());
} }
@ -92,7 +95,7 @@ public class BusinessTask
public void entry() public void entry()
{ {
Console.log("开始招工进场任务"); Console.log("开始招工进场任务");
recruitApplyService.<BgtProjectRecruitApply>lambdaUpdate() recruitApplyService.lambdaUpdate()
.eq(BgtProjectRecruitApply::getEntryTime, LocalDate.now()) .eq(BgtProjectRecruitApply::getEntryTime, LocalDate.now())
.eq(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.WGZ_PASS.getCode()) .eq(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.WGZ_PASS.getCode())
.set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode()) .set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode())

View File

@ -75,4 +75,7 @@ public class WgzAppPersonalBasicInformationRes implements Serializable {
@ApiModelProperty("工种名") @ApiModelProperty("工种名")
private String typeOfWorkName; private String typeOfWorkName;
@ApiModelProperty("是否被选择")
private Boolean isChoose;
} }

View File

@ -23,4 +23,9 @@ public interface WgzAttendanceMapper extends BaseMapperPlus<WgzAttendance> {
List<BgtAttendanceCountVO> countByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate List<BgtAttendanceCountVO> countByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate
, @Param("endDate")LocalDate endDate); , @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);
} }

View File

@ -106,7 +106,12 @@ public interface IWgzAttendanceService extends IServicePlus<WgzAttendance> {
*/ */
List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate); List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate);
/**
* 统计某天应打卡人数
*/
Integer dayTotalNum(Long taskId,LocalDate date);
Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate);
/** /**
* 总体考勤情况 * 总体考勤情况
*/ */

View File

@ -45,7 +45,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
@ -63,7 +62,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//上班打卡状态 0上 1下 //上班打卡状态 0上 1下
public static final String Clocking = "0"; public static final String Clocking = "0";
public static final String OffDuty= "1"; public static final String OffDuty = "1";
@Autowired @Autowired
private IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService; private IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService;
@ -82,7 +81,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
@Override @Override
public WgzAttendance queryById(Long id){ public WgzAttendance queryById(Long id) {
return getById(id); return getById(id);
} }
@ -137,13 +136,13 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
* *
* @param entity 实体类数据 * @param entity 实体类数据
*/ */
private void validEntityBeforeSave(WgzAttendance entity){ private void validEntityBeforeSave(WgzAttendance entity) {
//TODO 做一些数据校验,如唯一约束 //TODO 做一些数据校验,如唯一约束
} }
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
return removeByIds(ids); return removeByIds(ids);
@ -177,8 +176,8 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//5、查看当前人、当前工地、当天的打卡记录 //5、查看当前人、当前工地、当天的打卡记录
String formattedDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String formattedDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
WgzAttendance we = publicFindByUserIdWait(appUserId, by.getRecruitId(), formattedDate); WgzAttendance we = publicFindByUserIdWait(appUserId, by.getRecruitId(), formattedDate);
if (we !=null && we.getLeaveMarkId() != null && we.getLeaveMarkId()!= 0) { if (we != null && we.getLeaveMarkId() != null && we.getLeaveMarkId() != 0) {
throw new RuntimeException("您有已通过的请假申请,请假时间为:"+formattedDate); throw new RuntimeException("您有已通过的请假申请,请假时间为:" + formattedDate);
} }
//6、组装完整的打卡信息 //6、组装完整的打卡信息
WgzAttendance wgzAttendance = new WgzAttendance(). WgzAttendance wgzAttendance = new WgzAttendance().
@ -188,10 +187,10 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
setDate(LocalDate.now()); setDate(LocalDate.now());
LocalDateTime now = LocalDateTime.now(); //当前完整年月日时分秒 LocalDateTime now = LocalDateTime.now(); //当前完整年月日时分秒
LocalTime localTime = now.toLocalTime(); //获取时分秒 LocalTime localTime = now.toLocalTime(); //获取时分秒
if (we !=null) { if (we != null) {
//获取上次打卡时间与这次打卡时间的间隔是否超过3分钟 //获取上次打卡时间与这次打卡时间的间隔是否超过3分钟
boolean flag = isMinutesDifferenceGreaterThanThree(we.getClockInTime(), now); boolean flag = isMinutesDifferenceGreaterThanThree(we.getClockInTime(), now);
if (!flag){ if (!flag) {
throw new RuntimeException("打卡时间间隔不能少于3分钟"); throw new RuntimeException("打卡时间间隔不能少于3分钟");
} }
wgzAttendance.setClockOutTime(now); wgzAttendance.setClockOutTime(now);
@ -201,11 +200,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
wgzAttendance.setId(we.getId()); wgzAttendance.setId(we.getId());
wgzAttendance.setEarlyLeave(1); //早退 wgzAttendance.setEarlyLeave(1); //早退
wgzAttendance.setEarlyLeaveTime(now); wgzAttendance.setEarlyLeaveTime(now);
wgzAttendance.setExceptionType(exceptionType+"2,"); wgzAttendance.setExceptionType(exceptionType + "2,");
wgzAttendance.setPnchOsitionX(req.getPnchOsition()); wgzAttendance.setPnchOsitionX(req.getPnchOsition());
} }
return baseMapper.updateById(wgzAttendance) > 0; return baseMapper.updateById(wgzAttendance) > 0;
}else{ } else {
wgzAttendance.setClockInTime(now); wgzAttendance.setClockInTime(now);
LocalTime beginWorkTime = appById.getBeginWorkTime(); //上班 LocalTime beginWorkTime = appById.getBeginWorkTime(); //上班
if (!localTime.isBefore(beginWorkTime)) { if (!localTime.isBefore(beginWorkTime)) {
@ -220,6 +219,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/** /**
* 判断两个 LocalDateTime 之间的差值分钟数是否超过 3 * 判断两个 LocalDateTime 之间的差值分钟数是否超过 3
*
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @return 如果差值分钟数超过 3 返回 true否则返回 false * @return 如果差值分钟数超过 3 返回 true否则返回 false
@ -244,17 +244,17 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
//2、获取今日用户打卡状态 //2、获取今日用户打卡状态
if (wgzAttendance == null) { if (wgzAttendance == null) {
res.setClockingCondition(0); //上班 res.setClockingCondition(0); //上班
}else{ } else {
res.setClockingCondition(1); //下班 res.setClockingCondition(1); //下班
if (wgzAttendance.getLeaveMarkId() == null && wgzAttendance.getClockInTime()!=null && wgzAttendance.getClockOutTime()!=null){ if (wgzAttendance.getLeaveMarkId() == null && wgzAttendance.getClockInTime() != null && wgzAttendance.getClockOutTime() != null) {
res.setClockingCondition(3); //已完成 res.setClockingCondition(3); //已完成
} }
if (wgzAttendance.getLeaveMarkId() != null && wgzAttendance.getLeaveMarkId()!= 0) { if (wgzAttendance.getLeaveMarkId() != null && wgzAttendance.getLeaveMarkId() != 0) {
res.setClockingCondition(2); //请假 res.setClockingCondition(2); //请假
} }
} }
//3、获取上下班状态 //3、获取上下班状态
if (wgzAttendance!= null) { if (wgzAttendance != null) {
String exceptionType = wgzAttendance.getExceptionType(); String exceptionType = wgzAttendance.getExceptionType();
if (exceptionType.contains("0")) { if (exceptionType.contains("0")) {
res.setIn(0); res.setIn(0);
@ -381,7 +381,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
} }
@Override @Override
public Integer attendanceDetail(Long userId,Long recruitId, Integer num){ public Integer attendanceDetail(Long userId, Long recruitId, Integer num) {
LambdaQueryWrapper<WgzAttendance> apply = new LambdaQueryWrapper<WgzAttendance>(). LambdaQueryWrapper<WgzAttendance> apply = new LambdaQueryWrapper<WgzAttendance>().
eq(WgzAttendance::getUserId, userId). eq(WgzAttendance::getUserId, userId).
eq(WgzAttendance::getRecruitId, recruitId).and(wrapper -> wrapper eq(WgzAttendance::getRecruitId, recruitId).and(wrapper -> wrapper
@ -390,7 +390,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
.isNotNull(WgzAttendance::getClockOutTime) .isNotNull(WgzAttendance::getClockOutTime)
); );
apply.orderByAsc(WgzAttendance::getDate); apply.orderByAsc(WgzAttendance::getDate);
if (num!=null && num>0) { //表示查询指定天数的打卡记录,否则查询所有 if (num != null && num > 0) { //表示查询指定天数的打卡记录,否则查询所有
apply.last("LIMIT " + num); apply.last("LIMIT " + num);
} }
return baseMapper.selectCount(apply); return baseMapper.selectCount(apply);
@ -402,6 +402,16 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
return baseMapper.countByTaskId(taskId, beginDate, endDate); return baseMapper.countByTaskId(taskId, beginDate, endDate);
} }
@Override
public Integer dayTotalNum(Long taskId,LocalDate date){
return baseMapper.dayTotalNum(taskId,date);
}
@Override
public Integer monthTotalNum(Long taskId,LocalDate beginDate, LocalDate endDate){
return baseMapper.monthTotalNum(taskId,beginDate,endDate);
}
@Override @Override
public BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto) { public BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto) {
BgtAttendanceVO bgtAttendanceVO = new BgtAttendanceVO(); BgtAttendanceVO bgtAttendanceVO = new BgtAttendanceVO();
@ -412,57 +422,94 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
LocalDate startData = null; LocalDate startData = null;
LocalDate endData = null; LocalDate endData = null;
LocalDate now = LocalDate.now();
if(dto.getDateType().equals(DateUtils.DAY)){ if (dto.getDateType().equals(DateUtils.DAY)) {
// 获取本月开始日期 // 获取本月开始日期
startData = date.with(TemporalAdjusters.firstDayOfMonth()); startData = date.with(TemporalAdjusters.firstDayOfMonth());
endData = date; endData = date;
List<BgtAttendanceCountVO> countVOS = countByTaskId(dto.getTaskId(), startData, endData); List<BgtAttendanceCountVO> countVOS = countByTaskId(dto.getTaskId(), startData, endData);
bgtAttendanceVO.setCountVOs(DataUtil.fillMissingDates(countVOS, startData, endData)); List<BgtAttendanceCountVO> bgtAttendanceCountVOS = DataUtil.fillMissingDates(countVOS, startData, endData);
if(CollectionUtil.isNotEmpty(countVOS)){
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 = 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)) .filter(vo -> vo.getDate().isEqual(date))
.findFirst().orElse(null); .findFirst().orElse(null);
if (countVO != null) { if (countVO != null) {
bgtAttendanceVO.setReportToDutyNum(countVO.getReportToDutyNum()); bgtAttendanceVO.setReportToDutyNum(countVO.getReportToDutyNum());
bgtAttendanceVO.setTotalNum(countVO.getTotalNum()); bgtAttendanceVO.setTotalNum(countVO.getTotalNum());
bgtAttendanceVO.setAbsenceDutyNum(countVO.getTotalNum()-countVO.getReportToDutyNum()); bgtAttendanceVO.setAbsenceDutyNum(countVO.getTotalNum() - countVO.getReportToDutyNum());
if(bgtAttendanceVO.getTotalNum()!=0){ if (bgtAttendanceVO.getTotalNum() != 0) {
int rate = new BigDecimal(bgtAttendanceVO.getReportToDutyNum()).divide(new BigDecimal(bgtAttendanceVO.getTotalNum()), 2, RoundingMode.HALF_UP) int rate = new BigDecimal(bgtAttendanceVO.getReportToDutyNum()).divide(new BigDecimal(bgtAttendanceVO.getTotalNum()), 2, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100)).intValue(); .multiply(new BigDecimal(100)).intValue();
bgtAttendanceVO.setReportToDutyRate(rate); bgtAttendanceVO.setReportToDutyRate(rate);
} }
} }
} else if (dto.getDateType().equals(DateUtils.MONTH)) {
}
}else if(dto.getDateType().equals(DateUtils.MONTH)){
// 获取本年开始日期 // 获取本年开始日期
startData = date.with(TemporalAdjusters.firstDayOfYear()); startData = date.with(TemporalAdjusters.firstDayOfYear());
endData = date.with(TemporalAdjusters.lastDayOfMonth()); endData = date.with(TemporalAdjusters.lastDayOfMonth());
if(endData.isAfter(now)){
endData= now;
}
List<BgtAttendanceCountVO> countVOS = countByTaskId(dto.getTaskId(), startData, endData); List<BgtAttendanceCountVO> countVOS = countByTaskId(dto.getTaskId(), startData, endData);
bgtAttendanceVO.setCountVOs(DataUtil.statisticsByMonth(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 = countVOS.stream() 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))) .filter(vo -> YearMonth.from(vo.getDate()).equals(YearMonth.from(date)))
.findFirst().orElse(null); .findFirst().orElse(null);
if (countVO != null) { if (countVO != null) {
bgtAttendanceVO.setReportToDutyNum(countVO.getReportToDutyNum()); bgtAttendanceVO.setReportToDutyNum(countVO.getReportToDutyNum());
bgtAttendanceVO.setTotalNum(countVO.getTotalNum()); bgtAttendanceVO.setTotalNum(countVO.getTotalNum());
bgtAttendanceVO.setAbsenceDutyNum(countVO.getAbsenceDutyNum()); 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); getLateAndLeave(bgtAttendanceVO, startData, endData);
return bgtAttendanceVO; return bgtAttendanceVO;
} }
public void getLateAndLeave(BgtAttendanceVO vo,LocalDate startDate, LocalDate endDate){ public void getLateAndLeave(BgtAttendanceVO vo, LocalDate startDate, LocalDate endDate) {
List<BgtProjectRecruit> bgtProjectRecruits = iBgtProjectRecruitService.getBaseMapper().selectList(Wrappers.<BgtProjectRecruit>lambdaQuery() List<BgtProjectRecruit> bgtProjectRecruits = iBgtProjectRecruitService.getBaseMapper().selectList(Wrappers.<BgtProjectRecruit>lambdaQuery()
.eq(BgtProjectRecruit::getTaskId, vo.getTaskId())); .eq(BgtProjectRecruit::getTaskId, vo.getTaskId()));
List<Long> recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); List<Long> recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList());
if(CollectionUtil.isNotEmpty(recruitIds)){ if (CollectionUtil.isNotEmpty(recruitIds)) {
Integer late = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().eq(WgzAttendance::getLate, 1) Integer late = baseMapper.selectCount(Wrappers.<WgzAttendance>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.<WgzAttendance>lambdaQuery().isNotNull(WgzAttendance::getLeaveMarkId) Integer leave = baseMapper.selectCount(Wrappers.<WgzAttendance>lambdaQuery().isNotNull(WgzAttendance::getLeaveMarkId)
.in(WgzAttendance::getRecruitId, recruitIds).between(WgzAttendance::getDate, startDate, endDate)); .in(WgzAttendance::getRecruitId, recruitIds).between(WgzAttendance::getDate, startDate, endDate));
vo.setLateNum(late); vo.setLateNum(late);
@ -480,6 +527,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/** /**
* 获取指定人、指定工地、指定日期的打卡记录 * 获取指定人、指定工地、指定日期的打卡记录
*
* @param appUserId 务工者用户id * @param appUserId 务工者用户id
* @param recruitId 工地id * @param recruitId 工地id
* @param date 具体日期 * @param date 具体日期
@ -487,9 +535,9 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
*/ */
public WgzAttendance publicFindByUserIdWait(Long appUserId, Long recruitId, String date) { public WgzAttendance publicFindByUserIdWait(Long appUserId, Long recruitId, String date) {
LambdaQueryWrapper<WgzAttendance> qw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WgzAttendance> qw = new LambdaQueryWrapper<>();
qw.eq(WgzAttendance::getRecruitId,recruitId); qw.eq(WgzAttendance::getRecruitId, recruitId);
qw.eq(WgzAttendance::getUserId,appUserId); qw.eq(WgzAttendance::getUserId, appUserId);
qw.eq(WgzAttendance::getDate,date); qw.eq(WgzAttendance::getDate, date);
return baseMapper.selectOne(qw); return baseMapper.selectOne(qw);
} }
@ -520,21 +568,22 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/** /**
* 组装上班、下班打卡记录 * 组装上班、下班打卡记录
*
* @param wa 打卡记录 * @param wa 打卡记录
* @param num 1上班 2下班 * @param num 1上班 2下班
* @return WgzAppPunchTheCalendarRecordThree * @return WgzAppPunchTheCalendarRecordThree
*/ */
public WgzAppPunchTheCalendarRecordThree sbOrXb( WgzAttendance wa,int num) { public WgzAppPunchTheCalendarRecordThree sbOrXb(WgzAttendance wa, int num) {
WgzAppPunchTheCalendarRecordThree sbb = new WgzAppPunchTheCalendarRecordThree(). WgzAppPunchTheCalendarRecordThree sbb = new WgzAppPunchTheCalendarRecordThree().
setClockingTime(wa.getClockInTime()). setClockingTime(wa.getClockInTime()).
setPnchOsition(wa.getPnchOsition()). setPnchOsition(wa.getPnchOsition()).
setPnchOsitionX(wa.getPnchOsitionX()). setPnchOsitionX(wa.getPnchOsitionX()).
setClockingCondition(0); //正常 setClockingCondition(0); //正常
//判断是否请假 //判断是否请假
if (wa.getLeaveMarkId()!=null && wa.getLeaveMarkId()!=0) { if (wa.getLeaveMarkId() != null && wa.getLeaveMarkId() != 0) {
sbb.setClockingCondition(7); sbb.setClockingCondition(7);
} }
if (num == 1){ if (num == 1) {
//判断上班迟到 //判断上班迟到
if (wa.getLate() == 1) { if (wa.getLate() == 1) {
sbb.setClockingCondition(1); sbb.setClockingCondition(1);
@ -544,7 +593,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
sbb.setClockingCondition(5); sbb.setClockingCondition(5);
} }
} }
if (num == 2){ if (num == 2) {
//判断下班早退 //判断下班早退
if (wa.getEarlyLeave() == 1) { if (wa.getEarlyLeave() == 1) {
sbb.setClockingCondition(2); sbb.setClockingCondition(2);
@ -559,6 +608,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/** /**
* 补卡 * 补卡
*
* @param wgzAttendance 打卡记录 * @param wgzAttendance 打卡记录
* @param type 1上班 2下班 * @param type 1上班 2下班
* @param fillingDataTime 补卡时间 * @param fillingDataTime 补卡时间
@ -581,7 +631,7 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
public BgtAttendanceDetailVO bgtAttendanceDetail(BgtAttendanceDetailDTO dto) { public BgtAttendanceDetailVO bgtAttendanceDetail(BgtAttendanceDetailDTO dto) {
BgtAttendanceDetailVO bgtAttendanceDetailVO = new BgtAttendanceDetailVO(); BgtAttendanceDetailVO bgtAttendanceDetailVO = new BgtAttendanceDetailVO();
WgzUser wgzUser = wgzUserService.getById(dto.getUserId()); WgzUser wgzUser = wgzUserService.findByUserId(dto.getUserId());
bgtAttendanceDetailVO.setUserId(wgzUser.getUserId()); bgtAttendanceDetailVO.setUserId(wgzUser.getUserId());
bgtAttendanceDetailVO.setUsername(wgzUser.getUsername()); bgtAttendanceDetailVO.setUsername(wgzUser.getUsername());
bgtAttendanceDetailVO.setAvatarName(wgzUser.getAvatarName()); bgtAttendanceDetailVO.setAvatarName(wgzUser.getAvatarName());
@ -590,43 +640,43 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
.eq(BgtProjectRecruit::getTaskId, dto.getTaskId())); .eq(BgtProjectRecruit::getTaskId, dto.getTaskId()));
List<Long> recruitIds = bgtProjectRecruits.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList()); List<Long> 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.setEntryTime(recruitApply.getEntryTime());
bgtAttendanceDetailVO.setStatus(recruitApply.getStatus()); bgtAttendanceDetailVO.setStatus(recruitApply.getStatus());
LambdaQueryWrapper<WgzAttendance> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WgzAttendance> 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 date = dto.getDate();
LocalDate startDate = date.with(TemporalAdjusters.firstDayOfMonth()); LocalDate startDate = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate endData = date.with(TemporalAdjusters.lastDayOfMonth()); LocalDate endData = date.with(TemporalAdjusters.lastDayOfMonth());
wrapper.between(WgzAttendance::getDate,startDate,endData); wrapper.between(WgzAttendance::getDate, startDate, endData);
List<WgzAttendance> wgzAttendances = baseMapper.selectList(wrapper); List<WgzAttendance> wgzAttendances = baseMapper.selectList(wrapper);
// 创建SimpleDateFormat对象格式化日期为中文星期 // 创建SimpleDateFormat对象格式化日期为中文星期
SimpleDateFormat sdf = new SimpleDateFormat("EEEE", java.util.Locale.CHINESE); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE", Locale.CHINA);
//获取招工打卡时间 //获取招工打卡时间
List<BgtProjectRecruit> list = iBgtProjectRecruitService.list(Wrappers.<BgtProjectRecruit>lambdaQuery().in(BgtProjectRecruit::getId)); List<BgtProjectRecruit> list = iBgtProjectRecruitService.list(Wrappers.<BgtProjectRecruit>lambdaQuery().in(BgtProjectRecruit::getId,recruitIds));
Map<Long, BgtProjectRecruit> recruitMap = list.stream().collect(Collectors.toMap(BgtProjectRecruit::getId, recruit -> recruit)); Map<Long, BgtProjectRecruit> recruitMap = list.stream().collect(Collectors.toMap(BgtProjectRecruit::getId, recruit -> recruit));
List<WgzAttendanceRecordVO> lateRecords = new ArrayList<>(); List<WgzAttendanceRecordVO> lateRecords = new ArrayList<>();
List<WgzAttendanceRecordVO> earlyLeaveRecords= new ArrayList<>(); List<WgzAttendanceRecordVO> earlyLeaveRecords = new ArrayList<>();
List<WgzAttendanceRecordVO> missRecords= new ArrayList<>(); List<WgzAttendanceRecordVO> missRecords = new ArrayList<>();
List<WgzAttendanceRecordVO> records= new ArrayList<>(); List<WgzAttendanceRecordVO> records = new ArrayList<>();
for (WgzAttendance wgzAttendance:wgzAttendances){ for (WgzAttendance wgzAttendance : wgzAttendances) {
WgzAttendanceRecordVO recordVO = new WgzAttendanceRecordVO(); WgzAttendanceRecordVO recordVO = new WgzAttendanceRecordVO();
recordVO.setDate(wgzAttendance.getDate()); recordVO.setDate(wgzAttendance.getDate());
recordVO.setWeek(sdf.format(date)); recordVO.setWeek(wgzAttendance.getDate().format(formatter));
if(wgzAttendance.getMissedIn()==0 && wgzAttendance.getMissedOut()==0){ if (wgzAttendance.getMissedIn() == 0 && wgzAttendance.getMissedOut() == 0) {
recordVO.setDay(1D); recordVO.setDay(1D);
records.add(recordVO); records.add(recordVO);
}else if(wgzAttendance.getMissedIn()==1 && wgzAttendance.getMissedOut()==1){ } else if (wgzAttendance.getMissedIn() == 1 && wgzAttendance.getMissedOut() == 1) {
recordVO.setDay(0D); recordVO.setDay(0D);
}else { } else {
recordVO.setDay(0.5D); recordVO.setDay(0.5D);
records.add(recordVO); records.add(recordVO);
} }
@ -638,13 +688,13 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
if (wgzAttendance.getLate() == 1) { if (wgzAttendance.getLate() == 1) {
WgzAttendanceRecordVO LateRecordVO = BeanUtil.copyProperties(recordVO, WgzAttendanceRecordVO.class); WgzAttendanceRecordVO LateRecordVO = BeanUtil.copyProperties(recordVO, WgzAttendanceRecordVO.class);
LateRecordVO.setTime(clockInTime.toLocalTime()); LateRecordVO.setTime(clockInTime.toLocalTime());
LateRecordVO.setMinutes(DataUtil.getMinutes(clockInTime,beginWorkTime)); LateRecordVO.setMinutes(DataUtil.getMinutes(clockInTime, beginWorkTime));
lateRecords.add(LateRecordVO); lateRecords.add(LateRecordVO);
} }
if (wgzAttendance.getEarlyLeave() == 1) { if (wgzAttendance.getEarlyLeave() == 1) {
WgzAttendanceRecordVO earlyLeaveRecordVO = BeanUtil.copyProperties(recordVO, WgzAttendanceRecordVO.class); WgzAttendanceRecordVO earlyLeaveRecordVO = BeanUtil.copyProperties(recordVO, WgzAttendanceRecordVO.class);
earlyLeaveRecordVO.setTime(clockOutTime.toLocalTime()); earlyLeaveRecordVO.setTime(clockOutTime.toLocalTime());
earlyLeaveRecordVO.setMinutes(DataUtil.getMinutes(clockOutTime,endWorkTime)); earlyLeaveRecordVO.setMinutes(DataUtil.getMinutes(clockOutTime, endWorkTime));
earlyLeaveRecords.add(earlyLeaveRecordVO); earlyLeaveRecords.add(earlyLeaveRecordVO);
} }
@ -670,12 +720,11 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
bgtAttendanceDetailVO.setEarlyLeaveMinute(earlyLeaveRecords.stream().mapToInt(WgzAttendanceRecordVO::getMinutes).sum()); bgtAttendanceDetailVO.setEarlyLeaveMinute(earlyLeaveRecords.stream().mapToInt(WgzAttendanceRecordVO::getMinutes).sum());
bgtAttendanceDetailVO.setEarlyLeaveRecords(earlyLeaveRecords); bgtAttendanceDetailVO.setEarlyLeaveRecords(earlyLeaveRecords);
bgtAttendanceDetailVO.setMissNum(earlyLeaveRecords.size()); bgtAttendanceDetailVO.setMissNum(missRecords.size());
bgtAttendanceDetailVO.setMissRecords(earlyLeaveRecords); bgtAttendanceDetailVO.setMissRecords(missRecords);
return bgtAttendanceDetailVO; return bgtAttendanceDetailVO;
} }
@ -686,12 +735,13 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
/** /**
* 获取对应用户指定天数的工资结算日期 * 获取对应用户指定天数的工资结算日期
*
* @param userId * @param userId
* @param recruitId * @param recruitId
* @param num 结算天数 * @param num 结算天数
* @return * @return
*/ */
public LocalDate findByNumGetDate(Long userId, Long recruitId,Integer num) { public LocalDate findByNumGetDate(Long userId, Long recruitId, Integer num) {
LambdaQueryWrapper<WgzAttendance> wra = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WgzAttendance> wra = new LambdaQueryWrapper<>();
wra.eq(WgzAttendance::getRecruitId, recruitId); wra.eq(WgzAttendance::getRecruitId, recruitId);
wra.eq(WgzAttendance::getUserId, userId); wra.eq(WgzAttendance::getUserId, userId);

View File

@ -30,12 +30,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
wu.type_of_work, wu.type_of_work,
bpr.recruit_name, bpr.recruit_name,
fpt.task_name, fpt.task_name,
bpr.task_id,
wsr.score as hasScore wsr.score as hasScore
from bgt_project_recruit_apply bpra from bgt_project_recruit_apply bpra
left join wgz_user wu on bpra.user_id = wu.user_id 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 bgt_project_recruit bpr on bpr.id = bpra.recruit_id
left join fbs_project_task fpt on fpt.id = bpr.task_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
<where> <where>
<if test="dto.username !=null and dto.username !='' "> <if test="dto.username !=null and dto.username !='' ">
and wu.username like concat('%', #{dto.username}, '%') and wu.username like concat('%', #{dto.username}, '%')
@ -52,6 +53,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{item} #{item}
</foreach> </foreach>
</if> </if>
<if test="dto.date != null">
AND (entry_time between #{dto.beginDate} and #{dto.endDate}) or (leave_time between #{dto.beginDate} and #{dto.endDate})
</if>
</where> </where>
order by bpra.create_time desc,bpra.status asc order by bpra.create_time desc,bpra.status asc
</select> </select>

View File

@ -29,7 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="appQueryPageList" resultType="com.ruoyi.bgt.domain.vo.BgtProjectRecruitVO"> <select id="appQueryPageList" resultType="com.ruoyi.bgt.domain.vo.BgtProjectRecruitVO">
select bpr.id,bpr.recruit_name,bpr.recruit_address,bpr.recruit_amount,bpr.recruit_staff_num, select bpr.id,bpr.recruit_name,bpr.recruit_address,bpr.recruit_amount,bpr.recruit_staff_num,
bpr.recruit_requirement,bpr.create_time,fpt.task_name,bpr.type_of_work bpr.recruit_requirement,bpr.create_time,fpt.task_name,bpr.type_of_work,bpr.status
from bgt_project_recruit bpr left join fbs_project_task fpt on bpr.task_id = fpt.id from bgt_project_recruit bpr left join fbs_project_task fpt on bpr.task_id = fpt.id
<where> <where>
<if test="dto.userId != null "> <if test="dto.userId != null ">

View File

@ -33,7 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="countByTaskId" resultType="com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO"> <select id="countByTaskId" resultType="com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO">
select count(1) as reportToDutyNum, select count(1) as reportToDutyNum,
date, date,
(select count(1) from bgt_project_recruit_apply where entry_time &lt;= date and (leave_time is null or leave_time>date) (select count(1) from bgt_project_recruit_apply where entry_time &lt;= 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 and recruit_id in (select id from bgt_project_recruit where task_id = #{taskId} )) as totalNum
from wgz_attendance from wgz_attendance
where date between #{beginDate} and #{endDate} where date between #{beginDate} and #{endDate}
@ -42,4 +42,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
group by date order by date group by date order by date
</select> </select>
<select id="dayTotalNum" resultType="Integer">
select count(1) from bgt_project_recruit_apply where entry_time &lt;= #{date} and ((leave_time is null and status = '5')or leave_time>=#{date})
and recruit_id in (select id from bgt_project_recruit where task_id = #{taskId} )
</select>
<select id="monthTotalNum" resultType="Integer">
select count(1)
from bgt_project_recruit_apply
where ((entry_time between #{beginDate} and #{endDate}) or (leave_time between #{beginDate} and #{endDate}))
and status in (5, 6)
and recruit_id in (select id from bgt_project_recruit where task_id = #{taskId})
</select>
</mapper> </mapper>