调整考勤

This commit is contained in:
andy 2025-06-26 10:41:21 +08:00
parent 41313ef7d3
commit 9f3c939abd
7 changed files with 137 additions and 35 deletions

View File

@ -1,7 +1,6 @@
package com.evo.attendance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceDetail;
import org.apache.ibatis.annotations.Param;
@ -66,4 +65,12 @@ public interface RzAttendanceDetailMapper extends BaseMapper<RzAttendanceDetail>
* @return
*/
Long checkOverTimeCard(@Param("userId") Long userId, @Param("date") Date date);
/**
* 查询员工最后一次上班卡. 只要上班卡, 其他地方可不使用
*
* @param staffId
* @return 考勤明细集合
*/
public RzAttendanceDetail selectLastRzAttendanceDetailByBk(@Param("staffId") Long staffId, @Param("buttonType") String buttonType, @Param("startDateTime") Date startDateTime, @Param("endDateTime") Date endDateTime);
}

View File

@ -148,12 +148,9 @@ public class TSDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP
Integer minHour = ruleJson.getInteger("minHour");
//根据公司规定, 如果加班卡打卡时间早于19点,则按照19点计算
Date endMealDate = DateUtils.dateTime("yyyy-MM-dd HH:mm", sdfd.format(date)+" "+endMealTime);
if(rzSpecialAttendance.getWorkStartTime().compareTo(endMealDate) > 0){
endMealDate = rzSpecialAttendance.getWorkStartTime();
}
Long overMinutes = DateUtils.getBetweenMinutes(endMealDate, rzSpecialAttendance.getWorkEndTime());
Long overMinutes = DateUtils.getBetweenMinutes(rzSpecialAttendance.getWorkStartTime(), rzSpecialAttendance.getWorkEndTime());
//核查当前人员, 当天是否吃完饭 //如果吃晚饭, 扣减30分钟
if(rzRestaurantDetailMapper.checkDinnerByStaffIdAndDateAndSign(sysStaff.getUserId(), date, "晚餐").compareTo(0l) > 0){
if((rzSpecialAttendance.getWorkStartTime().compareTo(endMealDate) <= 0) && (rzRestaurantDetailMapper.checkDinnerByStaffIdAndDateAndSign(sysStaff.getUserId(), date, "晚餐").compareTo(0l) > 0)){
overMinutes = new BigDecimal(overMinutes).subtract(new BigDecimal(ParamUtils.getShortBreakDeductionMinutes())).longValue();
}
BigDecimal workHours = new BigDecimal(0);

View File

@ -1,6 +1,9 @@
package com.evo.personnelMatters.service.impl;
import com.evo.attendance.domain.RzAttendanceStatistical;
import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceDetail;
import com.evo.attendance.mapper.RzAttendanceDetailMapper;
import com.evo.attendance.mapper.RzAttendanceMapper;
import com.evo.attendance.mapper.RzAttendanceStatisticalMapper;
import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult;
@ -11,10 +14,15 @@ import com.evo.personnelMatters.domain.RzOverTimeDetail;
import com.evo.personnelMatters.mapper.RzOverTimeDetailMapper;
import com.evo.personnelMatters.mapper.RzOverTimeMapper;
import com.evo.personnelMatters.service.IRzOverTimeDetailService;
import com.evo.system.domain.SysStaff;
import com.evo.system.mapper.SysStaffMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
@ -32,6 +40,12 @@ public class RzOverTimeDetailServiceImpl implements IRzOverTimeDetailService
private RzOverTimeMapper rzOverTimeMapper;
@Resource
private RzAttendanceStatisticalMapper rzAttendanceStatisticalMapper; //打卡统计
@Resource
private RzAttendanceDetailMapper rzAttendanceDetailMapper;
@Resource
private RzAttendanceMapper rzAttendanceMapper;
@Resource
private SysStaffMapper sysStaffMapper;
/**
* 查询加班详情
*
@ -44,6 +58,52 @@ public class RzOverTimeDetailServiceImpl implements IRzOverTimeDetailService
return rzOverTimeDetailMapper.selectRzOverTimeDetailById(id);
}
private void createAttendanceDetail(RzOverTime rzOverTime, RzOverTimeDetail rzOverTimeDetail){
//加班卡
RzAttendanceDetail jbk = rzAttendanceDetailMapper.selectLastRzAttendanceDetailByBk(rzOverTime.getUserId(), "加班卡", rzOverTimeDetail.getOverTimeStart(), null);
SysStaff sysStaff = sysStaffMapper.selectSysStaffByUserId(rzOverTime.getUserId());
RzAttendance attendance = null;
if(ObjectUtils.isEmpty(jbk)){
attendance = rzAttendanceMapper.queryNowDayAttendanceByStatisticalIdAndDate(sysStaff.getUserId(), rzOverTimeDetail.getOverTimeStart());
//获取员工的工作时长
jbk = new RzAttendanceDetail();
//打卡明细表中插入数据
jbk.setButtonType("加班卡");
jbk.setName(rzOverTimeDetail.getName());
jbk.setAttendanceId(attendance.getId());
jbk.setDateTime(rzOverTimeDetail.getOverTimeStart());
jbk.setDelFlag(Constants.DELETE_FLAG_0);
jbk.setStaffId(rzOverTime.getUserId());
jbk.setEquipmentCode(sysStaff.getTimeClock());
jbk.setCreateTime(new Date());
jbk.setRemark("加班补卡生成");
rzAttendanceDetailMapper.insert(jbk);
}
//下班卡
RzAttendanceDetail xbk = rzAttendanceDetailMapper.selectLastRzAttendanceDetailByBk(rzOverTime.getUserId(), "下班卡", rzOverTimeDetail.getOverTimeStart(),rzOverTimeDetail.getOverTimeEnd());
if(ObjectUtils.isEmpty(xbk)){
if(ObjectUtils.isEmpty(attendance)){
attendance = rzAttendanceMapper.queryNowDayAttendanceByStatisticalIdAndDate(sysStaff.getUserId(), rzOverTimeDetail.getOverTimeStart());
}
//获取员工的工作时长
jbk = new RzAttendanceDetail();
//打卡明细表中插入数据
jbk.setButtonType("下班卡");
jbk.setName(rzOverTimeDetail.getName());
jbk.setAttendanceId(attendance.getId());
jbk.setDateTime(rzOverTimeDetail.getOverTimeEnd());
jbk.setDelFlag(Constants.DELETE_FLAG_0);
jbk.setStaffId(rzOverTime.getUserId());
jbk.setEquipmentCode(sysStaff.getTimeClock());
jbk.setCreateTime(new Date());
jbk.setRemark("加班补卡生成");
rzAttendanceDetailMapper.insert(jbk);
}
}
/**
* 查询加班详情列表
*
@ -86,13 +146,15 @@ public class RzOverTimeDetailServiceImpl implements IRzOverTimeDetailService
if(i < 1){
return AjaxResult.error();
}
//反写考勤汇总
RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
if(i < 1){
return AjaxResult.error();
}
createAttendanceDetail(rzOverTime, rzOverTimeDetail);
// //反写考勤汇总
// RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
// rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
// i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
// if(i < 1){
// return AjaxResult.error();
// }
return AjaxResult.success();
}
@ -123,16 +185,20 @@ public class RzOverTimeDetailServiceImpl implements IRzOverTimeDetailService
if(i < 1){
return AjaxResult.error();
}
createAttendanceDetail(rzOverTime, rzOverTimeDetail);
//反写考勤汇总
RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
if(i < 1){
return AjaxResult.error();
}
// RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
// rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
// i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
// if(i < 1){
// return AjaxResult.error();
// }
return AjaxResult.success();
}
/**
* 删除加班详情信息
*
@ -156,13 +222,13 @@ public class RzOverTimeDetailServiceImpl implements IRzOverTimeDetailService
if(i < 1){
return AjaxResult.error();
}
//反写考勤汇总
RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
if(i < 1){
return AjaxResult.error();
}
// //反写考勤汇总
// RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(rzOverTime.getUserId(),rzOverTime.getOverTimeMonth());
// rzAttendanceStatistical.setWorkOvertimeNumber(rzOverTime.getOverHours());
// i = rzAttendanceStatisticalMapper.updateRzAttendanceStatistical(rzAttendanceStatistical);
// if(i < 1){
// return AjaxResult.error();
// }
return AjaxResult.success();
}
}

View File

@ -21,6 +21,13 @@ public interface RzUploadService
*/
public RzUpload selectById(Long id);
/**
* 查询文件信息
*
* @return 结果
*/
public RzUpload selectByBusinessId(Long businessId, String type);
/**
* 新增文件信息
*
@ -43,4 +50,6 @@ public interface RzUploadService
*/
public List<RzUpload> selectListByBusinessIdAndyType(List<Long> businessIds, String type);
}

View File

@ -41,6 +41,11 @@ public class RzUploadServiceImpl extends ServiceImpl<RzUploadMapper, RzUpload> i
return getById(id);
}
@Override
public RzUpload selectByBusinessId(Long businessId, String type) {
return getBaseMapper().selectOne(new LambdaQueryWrapper<RzUpload>().eq(RzUpload::getBusinessId, businessId).eq(RzUpload::getType,type).eq(RzUpload::getValid,"valid"));
}
/**
* 新增保存上传信息
*

View File

@ -1,12 +1,10 @@
package com.evo.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.attendance.service.IRzAttendanceStatisticalService;
import com.evo.attendance.domain.vo.RzSalaryVo;
import com.evo.attendance.service.IRzAttendanceStatisticalService;
import com.evo.common.annotation.DataScope;
import com.evo.common.annotation.Excel;
import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult;
import com.evo.common.core.domain.entity.RzUpload;
@ -15,8 +13,6 @@ import com.evo.common.core.domain.entity.SysDictData;
import com.evo.common.utils.*;
import com.evo.common.utils.bean.BeanUtils;
import com.evo.equipment.service.IEqSnDetailService;
import com.evo.restaurant.domain.RzRestaurantStatistics;
import com.evo.restaurant.mapper.RzRestaurantStatisticsMapper;
import com.evo.restaurant.service.IRzRestaurantStatisticsService;
import com.evo.system.domain.SysStaff;
import com.evo.system.domain.SysStaffDetail;
@ -39,7 +35,9 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -164,8 +162,8 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
private void initCheckDevice(SysStaff sysStaff){
//如果文件Id不为空, 则需要更新打卡设备信息, 完成后, 同步更新图片的业务Id数据
if(ObjectUtils.isNotEmpty(sysStaff.getFileId())){
RzUpload upload = null;
if(ObjectUtils.isNotEmpty(sysStaff.getFileId())){
try {
upload = rzUploadService.selectById(sysStaff.getFileId());
upload.setBusinessId(sysStaff.getUserId());
@ -173,6 +171,13 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
} catch (Exception e) {
log.error("处理上传照片信息出现错误", e);
}
}
if(upload == null){
upload = rzUploadService.selectByBusinessId(sysStaff.getUserId(), "avatar");
}
//不为空, 准备下发
if(upload != null){
List<String> dkj_list = new ArrayList<String>();
dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); //食堂
dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共

View File

@ -97,6 +97,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where del_flag = '0' and DATE_FORMAT( date_time, '%Y%m%d' ) = DATE_FORMAT(#{date} , '%Y%m%d' ) and staff_id = #{userId} and button_type = '加班卡'
</select>
<select id="selectLastRzAttendanceDetailByBk" resultMap="RzAttendanceDetailResult">
<include refid="selectRzAttendanceDetailVo"/>
where del_flag = '0' and staff_id = #{staffId} and button_type = #{buttonType}
<if test="buttonType == '加班卡'"> and DATE_FORMAT( date_time, '%Y%m%d' ) = DATE_FORMAT(#{startDateTime} , '%Y%m%d' ) </if>
<if test="buttonType == '下班卡'"> and (
(DATE_FORMAT( date_time, '%Y%m%d' ) = DATE_FORMAT(#{startDateTime} , '%Y%m%d' ) and date_time > #{startDateTime})
or (DATE_FORMAT( date_time, '%Y%m%d %H:%i' ) = DATE_FORMAT(#{endDateTime} , '%Y%m%d %H:%i' ))
)</if>
order by date_time desc limit 1
</select>
</mapper>