考勤统计与工种

This commit is contained in:
zt
2025-02-21 09:53:49 +08:00
parent 0fefdd7352
commit a56e12ced2
17 changed files with 273 additions and 25 deletions

View File

@ -0,0 +1,32 @@
package com.ruoyi.web.controller.bgt;
import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wgz.service.IWgzAttendanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(value = "App包工头考勤控制器", tags = {"App包工头考勤管理"})
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/app/bgt/attendance")
public class AppBgtAttendanceController {
private final IWgzAttendanceService attendanceService;
@ApiOperation("App包工头总体考勤情况")
@GetMapping()
public AjaxResult<BgtAttendanceVO> attendanceDetail(@Validated BgtAttendanceDTO dto) {
return AjaxResult.success(attendanceService.attendanceDetail(dto));
}
}

View File

@ -1,10 +1,11 @@
package com.ruoyi.common.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
* 时间工具类

View File

@ -132,6 +132,9 @@ public class BgtProjectRecruit implements Serializable {
@ApiModelProperty("下班时间")
private LocalTime endWorkTime;
@ApiModelProperty("工种")
private String typeOfWork;
@ApiModelProperty("创建者ID")
private Long userId;

View File

@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@ -45,10 +46,10 @@ public class BgtProjectRecruitApply implements Serializable {
private String status;
@ApiModelProperty("进场时间")
private String entryTime;
private LocalDate entryTime;
@ApiModelProperty("离场时间")
private String leaveTime;
private LocalDate leaveTime;
/** 删除标志0代表存在 2代表删除 */
@Excel(name = "删除标志" , readConverterExp = "0=代表存在,2=代表删除")

View File

@ -0,0 +1,23 @@
package com.ruoyi.bgt.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel("App包工头总体考勤查询对象")
public class BgtAttendanceDTO {
@ApiModelProperty("任务ID")
private Long taskId;
@ApiModelProperty("日期")
private String date;
@ApiModelProperty("日期类型1日 2月")
private String dateType;
}

View File

@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
@ -25,7 +26,7 @@ public class BgtProjectRecruitApplyConsentDTO implements Serializable {
private Long id;
@ApiModelProperty("进场时间")
private String entryTime;
private LocalDate entryTime;
@ApiModelProperty("入场材料")
List<AnnexDTO> entryMaterials;

View File

@ -0,0 +1,36 @@
package com.ruoyi.bgt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDate;
/**
* 考勤打卡对象 wgz_attendance
*
* @author ruoyi
* @date 2025-02-20
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel("包工头考勤打卡统计对象")
public class BgtAttendanceCountVO implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("到岗人数")
private Integer reportToDutyNum;
@ApiModelProperty("总人数")
private Integer totalNum;
@ApiModelProperty("日期")
private LocalDate date;
}

View File

@ -0,0 +1,45 @@
package com.ruoyi.bgt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel("App包工头总体考勤视图对象")
public class BgtAttendanceVO {
@ApiModelProperty("任务ID")
private Long taskId;
@ApiModelProperty("任务名")
private String taskName;
@ApiModelProperty("到岗人数")
private Integer reportToDutyNum;
@ApiModelProperty("总人数")
private Integer totalNum;
@ApiModelProperty("缺勤人数")
private Integer absenceDutyNum;
@ApiModelProperty("请假人数")
private Integer leaveNum;
@ApiModelProperty("迟到人数")
private Integer lateNum;
@ApiModelProperty("考勤列表")
List<BgtAttendanceCountVO> countVOS;
//务工者列表
@ApiModelProperty("申请者列表")
List<BgtProjectRecruitApplyVO> applyList;
}

View File

@ -75,6 +75,9 @@ public class BgtProjectRecruitDetailVO implements Serializable {
@ApiModelProperty("招工要求")
private String recruitRequirement;
@ApiModelProperty("工种")
private String typeOfWork;
@ApiModelProperty("创建者ID")
private Long userId;

View File

@ -51,6 +51,9 @@ public class BgtProjectRecruitVO implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime createTime;
@ApiModelProperty("工种")
private String typeOfWork;
@ApiModelProperty("申请者列表")
List<BgtProjectRecruitApplyVO> applylist;

View File

@ -3,6 +3,7 @@ package com.ruoyi.fbs.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.bgt.domain.vo.BgtProjectRecruitApplyVO;
import com.ruoyi.bgt.domain.vo.BgtWageApplicationListVO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -83,6 +84,22 @@ public class AppTaskDetailVO {
@ApiModelProperty("收款申请列表")
private List<BgtWageApplicationListVO> wageApplicationList;
//总体考勤情况
@ApiModelProperty("总人数")
private Integer totalNum = 0;
@ApiModelProperty("今日到岗人数")
private Integer reportToDutyNum= 0;
@ApiModelProperty("今日到岗率")
private Integer reportToDutyRate= 0;
@ApiModelProperty("考勤列表")
List<BgtAttendanceCountVO> countVOS;
//务工者数量列表
@ApiModelProperty("申请者列表")
List<BgtProjectRecruitApplyVO> applyList;

View File

@ -1,6 +1,7 @@
package com.ruoyi.fbs.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -29,12 +30,15 @@ import com.ruoyi.fbs.domain.vo.AppTaskVO;
import com.ruoyi.fbs.mapper.FbsProjectTaskMapper;
import com.ruoyi.fbs.service.IFbsProjectTaskApplyService;
import com.ruoyi.fbs.service.IFbsProjectTaskService;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import com.ruoyi.wgz.service.IWgzAttendanceService;
import com.ruoyi.zbf.domain.ZbfProject;
import com.ruoyi.zbf.service.IZbfProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -62,6 +66,8 @@ public class FbsProjectTaskServiceImpl extends ServicePlusImpl<FbsProjectTaskMap
private IBgtProjectTaskProgressService progressService;
@Autowired
private IBgtWageApplicationService wageApplicationService;
@Autowired
private IWgzAttendanceService attendanceService;
@Override
public FbsProjectTask queryById(Long id){
@ -175,9 +181,17 @@ public class FbsProjectTaskServiceImpl extends ServicePlusImpl<FbsProjectTaskMap
appTaskDetailVO.setTaskReceiveAmount(taskReceiveAmount);
//付款金额
//考勤情况
LocalDate date = LocalDate.now();
LocalDate startOfMonth = date.withDayOfMonth(1);
List<BgtAttendanceCountVO> countVOS = attendanceService.countByTaskId(id, startOfMonth, date);
if(CollectionUtil.isNotEmpty(countVOS)){
BgtAttendanceCountVO vo = countVOS.get(0);
appTaskDetailVO.setCountVOS(countVOS);
appTaskDetailVO.setTotalNum(vo.getTotalNum());
appTaskDetailVO.setReportToDutyNum(vo.getReportToDutyNum());
appTaskDetailVO.setReportToDutyRate(vo.getReportToDutyNum()/vo.getTotalNum()*100);
}
return appTaskDetailVO;
}

View File

@ -3,7 +3,12 @@ package com.ruoyi.wgz.mapper;
import com.ruoyi.wgz.domain.WgzAttendance;
import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
import com.ruoyi.common.core.mybatisplus.cache.MybatisPlusRedisCache;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
/**
* 考勤打卡Mapper接口
@ -15,4 +20,7 @@ import org.apache.ibatis.annotations.CacheNamespace;
@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class)
public interface WgzAttendanceMapper extends BaseMapperPlus<WgzAttendance> {
List<BgtAttendanceCountVO> countByTaskId(@Param("taskId") Long taskId, @Param("beginDate")LocalDate beginDate
, @Param("endDate")LocalDate endDate);
}

View File

@ -1,5 +1,8 @@
package com.ruoyi.wgz.service;
import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wgz.bo.req.WgzAppSubmitTheClockReq;
import com.ruoyi.wgz.bo.res.WgzAppCardReplacementApplicationRes;
@ -9,9 +12,13 @@ import com.ruoyi.wgz.domain.WgzAttendance;
import com.ruoyi.wgz.bo.WgzAttendanceQueryBo;
import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wgz.bo.WgzAttendanceQueryBo;
import com.ruoyi.wgz.bo.req.WgzAppSubmitTheClockReq;
import com.ruoyi.wgz.domain.WgzAttendance;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
@ -91,4 +98,21 @@ public interface IWgzAttendanceService extends IServicePlus<WgzAttendance> {
* 补卡申请列表
*/
WgzAppCardReplacementApplicationRes userCardReplacementApplication();
// /**
// * 查看当前人、当前工地、当前日期的打卡记录
// */
// WgzAttendance findByUserIdWait(Long appUserId, Long recruitId, String date);
/**
* 统计任务打卡情况
*/
List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate);
/**
* 总体考勤情况
*/
BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto);
}

View File

@ -2,16 +2,20 @@ package com.ruoyi.wgz.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.bgt.domain.BgtProjectRecruit;
import com.ruoyi.bgt.domain.BgtProjectRecruitApply;
import com.ruoyi.bgt.domain.dto.BgtAttendanceDTO;
import com.ruoyi.bgt.domain.vo.BgtAttendanceVO;
import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService;
import com.ruoyi.bgt.service.IBgtProjectRecruitService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.wgz.bo.WgzAttendanceQueryBo;
import com.ruoyi.wgz.bo.req.WgzAppSubmitTheClockReq;
import com.ruoyi.wgz.bo.res.WgzAppCardReplacementApplicationRes;
import com.ruoyi.wgz.bo.res.WgzAppPunchTheCalendarRecordRes;
@ -19,26 +23,25 @@ import com.ruoyi.wgz.bo.res.WgzAppUserClockingConditionRes;
import com.ruoyi.wgz.bo.rests.WgzAppCardReplacementApplicationTwo;
import com.ruoyi.wgz.bo.rests.WgzAppPunchTheCalendarRecordThree;
import com.ruoyi.wgz.bo.rests.WgzAppPunchTheCalendarRecordTwo;
import com.ruoyi.wgz.domain.WgzAttendance;
import com.ruoyi.wgz.domain.WgzLeave;
import com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO;
import com.ruoyi.wgz.mapper.WgzAttendanceMapper;
import com.ruoyi.wgz.service.IWgzAttendanceService;
import com.ruoyi.wgz.service.IWgzLeaveService;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.wgz.bo.WgzAttendanceQueryBo;
import com.ruoyi.wgz.domain.WgzAttendance;
import com.ruoyi.wgz.mapper.WgzAttendanceMapper;
import com.ruoyi.wgz.service.IWgzAttendanceService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.reactive.TransactionalOperator;
import java.text.DecimalFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 考勤打卡Service业务层处理
@ -306,6 +309,27 @@ public class WgzAttendanceServiceImpl extends ServicePlusImpl<WgzAttendanceMappe
return null;
}
@Override
public List<BgtAttendanceCountVO> countByTaskId(Long taskId, LocalDate beginDate, LocalDate endDate) {
return baseMapper.countByTaskId(taskId, beginDate, endDate);
}
@Override
public BgtAttendanceVO attendanceDetail(BgtAttendanceDTO dto) {
return null;
}
// @Override
// public WgzAttendance findByUserIdWait(Long appUserId, Long recruitId, String date) {
// LambdaQueryWrapper<WgzAttendance> qw = new LambdaQueryWrapper<>();
// qw.eq(WgzAttendance::getRecruitId,recruitId);
// qw.eq(WgzAttendance::getUserId,appUserId);
// return null;
// }
/**
* 获取指定人、指定工地、指定日期的打卡记录

View File

@ -28,7 +28,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<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,bpr.recruit_requirement,bpr.create_time,fpt.task_name
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
from bgt_project_recruit bpr left join fbs_project_task fpt on bpr.task_id = fpt.id
<where>
<if test="dto.userId != null ">

View File

@ -30,4 +30,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<select id="countByTaskId" resultType="com.ruoyi.bgt.domain.vo.BgtAttendanceCountVO">
select count(1) as reportToDutyNum,
date,
(select count(1) from bgt_project_recruit_apply where entry_time &lt;= 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}
and (missed_in = 0 or missed_out = 0)
and recruit_id in (select id from bgt_project_recruit where task_id = #{taskId} ))
group by date
</select>
</mapper>