新增每天考勤的时间线展示

考勤, 补卡调整
This commit is contained in:
andy 2025-07-21 08:54:51 +08:00
parent e2cf37df5d
commit 6aa772715a
8 changed files with 227 additions and 119 deletions

View File

@ -1,6 +1,8 @@
package com.evo.attendance.controller; package com.evo.attendance.controller;
import com.evo.attendance.domain.RzAttendanceDetail;
import com.evo.attendance.domain.vo.RzAttendanceDetailVO; import com.evo.attendance.domain.vo.RzAttendanceDetailVO;
import com.evo.attendance.service.RzAttendanceDetailService;
import com.evo.common.annotation.Log; import com.evo.common.annotation.Log;
import com.evo.common.core.controller.BaseController; import com.evo.common.core.controller.BaseController;
import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.AjaxResult;
@ -30,7 +32,8 @@ public class RzAttendanceController extends BaseController
{ {
@Resource @Resource
private IRzAttendanceService rzAttendanceService; private IRzAttendanceService rzAttendanceService;
@Resource
private RzAttendanceDetailService rzAttendanceDetailService;
/** /**
* 查询考勤记录列表 * 查询考勤记录列表
*/ */
@ -115,4 +118,11 @@ public class RzAttendanceController extends BaseController
return rzAttendanceService.importAttendance(attendanceList); return rzAttendanceService.importAttendance(attendanceList);
} }
@GetMapping(value = "/detail/list/{id}")
public AjaxResult findDetailList(@PathVariable("id") Long id)
{
return success(rzAttendanceDetailService.selectListByAttendanceId(id));
}
} }

View File

@ -0,0 +1,68 @@
package com.evo.attendance.domain.vo;
import com.evo.common.constant.Constants;
import lombok.Data;
/**
* 打卡详情时间线
*
* @ClassName:RzAttendanceDetailTimeLineVO
* @date: 2025年07月17日 10:35
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class RzAttendanceDetailTimeLineVO {
String content;
String timestamp;
String type;
String icon;
String size = "large";
public RzAttendanceDetailTimeLineVO(String content, String timestamp, String delFlag) {
this.content = content;
this.timestamp = timestamp;
TimeLineEnum timeLine = TimeLineEnum.get(content, delFlag);
this.type = timeLine.type;
this.icon = timeLine.icon;
}
enum TimeLineEnum{
UP("上班", "primary","el-icon-caret-top"),
OVERTIME("加班", "success","el-icon-plus"),
DOWN("下班", "warning","el-icon-caret-bottom"),
REVOKE("撤销", "danger","el-icon-close"),
DEFAULT("", "",""),
;
String typeWork;
String type;
String icon;
TimeLineEnum(String typeWork, String type, String icon) {
this.typeWork = typeWork;
this.type = type;
this.icon = icon;
}
public static TimeLineEnum get(String typeWork, String delFlag){
if(Constants.DELETE_FLAG_1.equals(delFlag)){
return REVOKE;
}
for (TimeLineEnum timeLine : TimeLineEnum.values()){
if(typeWork.contains(timeLine.typeWork)){
return timeLine;
}
}
return DEFAULT;
}
}
}

View File

@ -3,9 +3,11 @@ package com.evo.attendance.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.evo.attendance.domain.RzAttendance; import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceDetail; import com.evo.attendance.domain.RzAttendanceDetail;
import com.evo.attendance.domain.vo.RzAttendanceDetailTimeLineVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 接口 * 接口
@ -20,9 +22,13 @@ public interface RzAttendanceDetailService extends IService<RzAttendanceDetail>
public RzAttendanceDetail addDetail(RzAttendance attendance, String rules, String sn, Date date, String remark); public RzAttendanceDetail addDetail(RzAttendance attendance, String rules, String sn, Date date, String remark);
public RzAttendanceDetail addOrUpdateDetail(String source, RzAttendance attendance, String rules, String sn, Date date, String remark);
public RzAttendanceDetail selectLastRzAttendanceDetail(Long staffId); public RzAttendanceDetail selectLastRzAttendanceDetail(Long staffId);
public RzAttendanceDetail selectRzAttendanceDetailByStaffId(Long staffId); public RzAttendanceDetail selectRzAttendanceDetailByStaffId(Long staffId);
public RzAttendanceDetail selectLastWorkCardByStaffId(@Param("staffId") Long staffId); public RzAttendanceDetail selectLastWorkCardByStaffId(@Param("staffId") Long staffId);
public List<RzAttendanceDetailTimeLineVO> selectListByAttendanceId(Long attId);
} }

View File

@ -4,13 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.attendance.domain.RzAttendance; import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceDetail; import com.evo.attendance.domain.RzAttendanceDetail;
import com.evo.attendance.domain.vo.RzAttendanceDetailTimeLineVO;
import com.evo.attendance.mapper.RzAttendanceDetailMapper; import com.evo.attendance.mapper.RzAttendanceDetailMapper;
import com.evo.attendance.service.RzAttendanceDetailService; import com.evo.attendance.service.RzAttendanceDetailService;
import com.evo.common.constant.Constants; import com.evo.common.constant.Constants;
import com.evo.common.utils.DateUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* *
@ -26,8 +30,27 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl<RzAttendanceDetai
@Override @Override
public RzAttendanceDetail addDetail(RzAttendance attendance, String rules, String sn, Date date, String remark) { public RzAttendanceDetail addDetail(RzAttendance attendance, String rules, String sn, Date date, String remark) {
//获取员工的工作时长 return addOrUpdateDetail("clock_in", attendance,rules,sn,date,remark);
RzAttendanceDetail attendanceDetail = getOne(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getButtonType, rules).eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getStaffId, attendance.getStaffId()).apply( " DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d')", date)); }
@Override
public RzAttendanceDetail addOrUpdateDetail(String source, RzAttendance attendance, String rules, String sn, Date date, String remark) {
RzAttendanceDetail attendanceDetail = null;
//clock_in为考勤机打卡, 不需要查询
if(!"clock_in".equals(source)){
//获取员工的工作时长
attendanceDetail = getOne(new LambdaQueryWrapper<RzAttendanceDetail>()
.eq(RzAttendanceDetail::getButtonType, rules)
.eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0)
.eq(RzAttendanceDetail::getStaffId, attendance.getStaffId())
.eq(RzAttendanceDetail::getAttendanceId, attendance.getId())
//.apply( " DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d')", date)
//以下为特殊规则, 只针对下班卡起作用
.orderByAsc("下班卡".equals(rules), RzAttendanceDetail::getDateTime)
.last("下班卡".equals(rules)," limit 1 ")
);
}
if(ObjectUtils.isEmpty(attendanceDetail)){ if(ObjectUtils.isEmpty(attendanceDetail)){
attendanceDetail = new RzAttendanceDetail(); attendanceDetail = new RzAttendanceDetail();
attendanceDetail.setStaffId(attendance.getStaffId()); attendanceDetail.setStaffId(attendance.getStaffId());
@ -64,4 +87,11 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl<RzAttendanceDetai
public RzAttendanceDetail selectLastWorkCardByStaffId(Long staffId) { public RzAttendanceDetail selectLastWorkCardByStaffId(Long staffId) {
return getBaseMapper().selectLastWorkCardByStaffId(staffId); return getBaseMapper().selectLastWorkCardByStaffId(staffId);
} }
@Override
public List<RzAttendanceDetailTimeLineVO> selectListByAttendanceId(Long attId) {
return list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getAttendanceId, attId)).stream().map(data ->{
return new RzAttendanceDetailTimeLineVO(data.getButtonType(), DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",data.getDateTime()), data.getDelFlag());
}).collect(Collectors.toList());
}
} }

View File

@ -97,13 +97,14 @@ public class RzAttendanceServiceImpl extends ServiceImpl<RzAttendanceMapper, RzA
if(rzAttendance.getWorkEndTime() == null){ if(rzAttendance.getWorkEndTime() == null){
//跟新成功, 插入上班卡信息 //跟新成功, 插入上班卡信息
if(getBaseMapper().updateRzAttendance(rzAttendance) > 0){ if(getBaseMapper().updateRzAttendance(rzAttendance) > 0){
rzAttendanceDetailService.addDetail(rzAttendance, rzAttendance.getRules(), sysUser.getTimeClock(), rzAttendance.getWorkStartTime(),rzAttendance.getRemark()); rzAttendanceDetailService.addOrUpdateDetail("fill_in", rzAttendance, rzAttendance.getRules(), sysUser.getTimeClock(), rzAttendance.getWorkStartTime(),rzAttendance.getRemark());
} }
return 1; return 1;
}else if(rzAttendance.getWorkStartTime() != null && rzAttendance.getWorkEndTime() != null){ }else if(rzAttendance.getWorkStartTime() != null && rzAttendance.getWorkEndTime() != null){
rzAttendanceDetailService.addOrUpdateDetail("fill_in",rzAttendance, rzAttendance.getRules(), sysUser.getTimeClock(), rzAttendance.getWorkStartTime(),rzAttendance.getRemark());
if(KqUtils.workOffDutyCard(rzAttendance.getWorkEndTime(), rzAttendance.getRules(), rzAttendance)){ if(KqUtils.workOffDutyCard(rzAttendance.getWorkEndTime(), rzAttendance.getRules(), rzAttendance)){
//此处特殊, 使用rules 记录下班卡规则, 但是不持久化 //此处特殊, 使用rules 记录下班卡规则, 但是不持久化
rzAttendanceDetailService.addDetail(rzAttendance, "下班卡", sysUser.getTimeClock(), rzAttendance.getWorkEndTime(),rzAttendance.getRemark()); rzAttendanceDetailService.addOrUpdateDetail("fill_in",rzAttendance, "下班卡", sysUser.getTimeClock(), rzAttendance.getWorkEndTime(),rzAttendance.getRemark());
} }
return 1; return 1;
} }

View File

@ -5,6 +5,7 @@ import java.util.List;
import com.evo.attendance.domain.RzSpecialOverTime; import com.evo.attendance.domain.RzSpecialOverTime;
import com.evo.attendance.mapper.RzSpecialOverTimeMapper; import com.evo.attendance.mapper.RzSpecialOverTimeMapper;
import com.evo.attendance.service.IRzSpecialOverTimeService; import com.evo.attendance.service.IRzSpecialOverTimeService;
import com.evo.common.annotation.DataScope;
import com.evo.common.utils.DateUtils; import com.evo.common.utils.DateUtils;
import com.evo.common.utils.SecurityUtils; import com.evo.common.utils.SecurityUtils;
import com.evo.system.mapper.SysDeptMapper; import com.evo.system.mapper.SysDeptMapper;
@ -44,6 +45,7 @@ public class RzSpecialOverTimeServiceImpl implements IRzSpecialOverTimeService
* @return 特殊加班管理 * @return 特殊加班管理
*/ */
@Override @Override
@DataScope(deptAlias = "r")
public List<RzSpecialOverTime> selectRzSpecialOverTimeList(RzSpecialOverTime rzSpecialOverTime) public List<RzSpecialOverTime> selectRzSpecialOverTimeList(RzSpecialOverTime rzSpecialOverTime)
{ {
List<RzSpecialOverTime> reslut = rzSpecialOverTimeMapper.selectRzSpecialOverTimeList(rzSpecialOverTime); List<RzSpecialOverTime> reslut = rzSpecialOverTimeMapper.selectRzSpecialOverTimeList(rzSpecialOverTime);

View File

@ -1,25 +1,17 @@
package com.evo.common.controller; package com.evo.common.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evo.attendance.domain.RzAttendance;
import com.evo.attendance.domain.RzAttendanceDetail;
import com.evo.attendance.processor.KqUtils;
import com.evo.attendance.service.IRzAttendanceService; import com.evo.attendance.service.IRzAttendanceService;
import com.evo.attendance.service.IRzAttendanceStatisticalService; import com.evo.attendance.service.IRzAttendanceStatisticalService;
import com.evo.attendance.service.RzAttendanceDetailService; import com.evo.attendance.service.RzAttendanceDetailService;
import com.evo.common.constant.Constants; import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.AjaxResult;
import com.evo.common.utils.Collections; import com.evo.common.utils.Collections;
import com.evo.common.utils.StringUtils;
import com.evo.personnelMatters.domain.RzOverTime;
import com.evo.personnelMatters.domain.RzOverTimeDetail;
import com.evo.personnelMatters.mapper.RzOverTimeDetailMapper; import com.evo.personnelMatters.mapper.RzOverTimeDetailMapper;
import com.evo.personnelMatters.mapper.RzOverTimeMapper; import com.evo.personnelMatters.mapper.RzOverTimeMapper;
import com.evo.restaurant.service.IRzRestaurantStatisticsService; import com.evo.restaurant.service.IRzRestaurantStatisticsService;
import com.evo.system.domain.SysStaff; import com.evo.system.domain.SysStaff;
import com.evo.system.service.ISysStaffService; import com.evo.system.service.ISysStaffService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -29,12 +21,10 @@ import javax.annotation.Resource;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.math.BigDecimal;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -108,62 +98,62 @@ public class TestController {
@PostMapping("/qxdk") @PostMapping("/qxdk")
public AjaxResult qxdk() throws ParseException { public AjaxResult qxdk() throws ParseException {
Map<Long, String> snMap = sysStaffService.list(new LambdaQueryWrapper<SysStaff>().eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0)).stream().filter(data->{ return (data.getUserId() != null && StringUtils.isNotEmpty(data.getTimeClock())); // Map<Long, String> snMap = sysStaffService.list(new LambdaQueryWrapper<SysStaff>().eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0)).stream().filter(data->{ return (data.getUserId() != null && StringUtils.isNotEmpty(data.getTimeClock()));
}).collect(Collectors.toMap(SysStaff::getUserId, SysStaff::getTimeClock)); // }).collect(Collectors.toMap(SysStaff::getUserId, SysStaff::getTimeClock));
//
//
Date d = new SimpleDateFormat("yyyy-MM-dd").parse("2025-07-08"); // Date d = new SimpleDateFormat("yyyy-MM-dd").parse("2025-07-08");
Map<String, Integer> timeMap = Collections.asMap("上班卡倒班12时制",12,"上班卡(单班制)",9,"上班卡倒班8时制",9); // Map<String, Integer> timeMap = Collections.asMap("上班卡倒班12时制",12,"上班卡(单班制)",9,"上班卡倒班8时制",9);
List<RzAttendance> list = rzAttendanceService.list(new LambdaQueryWrapper<RzAttendance>() // List<RzAttendance> list = rzAttendanceService.list(new LambdaQueryWrapper<RzAttendance>()
.eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0) // .eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0)
.apply(" date_format(`attendance_date`,'%Y%m%d')=date_format({0},'%Y%m%d') ",d) // .apply(" date_format(`attendance_date`,'%Y%m%d')=date_format({0},'%Y%m%d') ",d)
.apply(" work_start_time is not null ") // .apply(" work_start_time is not null ")
).stream().map(data ->{ // ).stream().map(data ->{
data.setWorkEndTime(DateUtils.addHours(data.getWorkStartTime(), timeMap.get(data.getRules()))); // data.setWorkEndTime(DateUtils.addHours(data.getWorkStartTime(), timeMap.get(data.getRules())));
return data; // return data;
}).collect(Collectors.toList()); // }).collect(Collectors.toList());
//
if(Collections.isNotEmpty(list)){ // if(Collections.isNotEmpty(list)){
//更新所有的卡时间 // //更新所有的卡时间
rzAttendanceService.updateBatchById(list); // rzAttendanceService.updateBatchById(list);
for (RzAttendance rzAttendance : list){ // for (RzAttendance rzAttendance : list){
List<RzAttendanceDetail> sbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%上班%")); // List<RzAttendanceDetail> sbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%上班%"));
if(Collections.isEmpty(sbList)){ // if(Collections.isEmpty(sbList)){
rzAttendanceDetailService.addDetail(rzAttendance, rzAttendance.getRules(), snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkStartTime(), "系统清洗"); // rzAttendanceDetailService.addOrUpdateDetail(rzAttendance, rzAttendance.getRules(), snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkStartTime(), "系统清洗");
}else if(sbList.size() > 1){ // }else if(sbList.size() > 1){
sbList.remove(0); // sbList.remove(0);
rzAttendanceDetailService.removeByIds(sbList); // rzAttendanceDetailService.removeByIds(sbList);
} // }
List<RzAttendanceDetail> xbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%下班%")); // List<RzAttendanceDetail> xbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%下班%"));
if(ObjectUtils.isEmpty(xbList)){ // if(ObjectUtils.isEmpty(xbList)){
rzAttendanceDetailService.addDetail(rzAttendance, "下班卡", snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkEndTime(), "系统清洗"); // rzAttendanceDetailService.addOrUpdateDetail(rzAttendance, "下班卡", snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkEndTime(), "系统清洗");
}else if(xbList.size() > 1){ // }else if(xbList.size() > 1){
xbList.remove(0); // xbList.remove(0);
rzAttendanceDetailService.removeByIds(xbList); // rzAttendanceDetailService.removeByIds(xbList);
} // }
} // }
} // }
//
//
//
list = rzAttendanceService.list(new LambdaQueryWrapper<RzAttendance>() // list = rzAttendanceService.list(new LambdaQueryWrapper<RzAttendance>()
.eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0) // .eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0)
.apply(" date_format(`attendance_date`,'%Y%m%d')=date_format({0},'%Y%m%d') ",new SimpleDateFormat("yyyy-MM-dd").parse("2025-07-09")) // .apply(" date_format(`attendance_date`,'%Y%m%d')=date_format({0},'%Y%m%d') ",new SimpleDateFormat("yyyy-MM-dd").parse("2025-07-09"))
.apply(" work_start_time is not null ") // .apply(" work_start_time is not null ")
); // );
//
if(Collections.isNotEmpty(list)){ // if(Collections.isNotEmpty(list)){
//更新所有的卡时间 // //更新所有的卡时间
for (RzAttendance rzAttendance : list){ // for (RzAttendance rzAttendance : list){
List<RzAttendanceDetail> sbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%上班%")); // List<RzAttendanceDetail> sbList = rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>().eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendanceDetail::getAttendanceId, rzAttendance.getId()).like(RzAttendanceDetail::getButtonType,"%上班%"));
if(Collections.isEmpty(sbList)){ // if(Collections.isEmpty(sbList)){
rzAttendanceDetailService.addDetail(rzAttendance, rzAttendance.getRules(), snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkStartTime(), "系统清洗"); // rzAttendanceDetailService.addOrUpdateDetail(rzAttendance, rzAttendance.getRules(), snMap.get(rzAttendance.getStaffId()), rzAttendance.getWorkStartTime(), "系统清洗");
}else if(sbList.size() > 1){ // }else if(sbList.size() > 1){
sbList.remove(0); // sbList.remove(0);
rzAttendanceDetailService.removeByIds(sbList); // rzAttendanceDetailService.removeByIds(sbList);
} // }
} // }
} // }
return AjaxResult.success(); return AjaxResult.success();
} }
@ -201,53 +191,53 @@ public class TestController {
@PostMapping("/jb") @PostMapping("/jb")
public AjaxResult jb() throws Exception{ public AjaxResult jb() throws Exception{
BufferedReader reader = new BufferedReader(new FileReader(new File("D:\\andy\\文档\\考勤\\7月8号加班数据清洗.txt"))); // BufferedReader reader = new BufferedReader(new FileReader(new File("D:\\andy\\文档\\考勤\\7月8号加班数据清洗.txt")));
String line = reader.readLine(); // String line = reader.readLine();
while (line != null) { // while (line != null) {
String[] info = line.split("-"); // String[] info = line.split("-");
RzAttendanceDetail detail = rzAttendanceDetailService.getOne(new LambdaQueryWrapper<RzAttendanceDetail>() // RzAttendanceDetail detail = rzAttendanceDetailService.getOne(new LambdaQueryWrapper<RzAttendanceDetail>()
.eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0) // .eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0)
.eq(RzAttendanceDetail::getName, info[0]) // .eq(RzAttendanceDetail::getName, info[0])
.eq(RzAttendanceDetail::getButtonType,"下班卡") // .eq(RzAttendanceDetail::getButtonType,"下班卡")
.apply(" DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d') ", "2025-07-08")); // .apply(" DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d') ", "2025-07-08"));
//
RzAttendance attendance= rzAttendanceService.getOne(new LambdaQueryWrapper<RzAttendance>() // RzAttendance attendance= rzAttendanceService.getOne(new LambdaQueryWrapper<RzAttendance>()
.eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0) // .eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0)
.eq(RzAttendance::getName, info[0]) // .eq(RzAttendance::getName, info[0])
.eq(RzAttendance::getAttendanceDate, "2025-07-08") // .eq(RzAttendance::getAttendanceDate, "2025-07-08")
); // );
System.out.println(info[0]); // System.out.println(info[0]);
SysStaff sysStaff = sysStaffService.getById(detail.getStaffId()); // SysStaff sysStaff = sysStaffService.getById(detail.getStaffId());
RzOverTime rzOverTime = rzOverTimeMapper.selectRzOverTimeByNameAndMonth(sysStaff.getUserId(),detail.getDateTime()); // RzOverTime rzOverTime = rzOverTimeMapper.selectRzOverTimeByNameAndMonth(sysStaff.getUserId(),detail.getDateTime());
if(rzOverTime == null){ // if(rzOverTime == null){
rzOverTime = new RzOverTime(); // rzOverTime = new RzOverTime();
rzOverTime.setUserId(sysStaff.getUserId()); // rzOverTime.setUserId(sysStaff.getUserId());
rzOverTime.setOverHours(new BigDecimal("0.0")); // rzOverTime.setOverHours(new BigDecimal("0.0"));
rzOverTime.setDeptId(sysStaff.getDeptId()); // rzOverTime.setDeptId(sysStaff.getDeptId());
rzOverTime.setName(sysStaff.getName()); // rzOverTime.setName(sysStaff.getName());
rzOverTime.setOverTimeMonth(detail.getDateTime()); // rzOverTime.setOverTimeMonth(detail.getDateTime());
rzOverTimeMapper.insert(rzOverTime); // rzOverTimeMapper.insert(rzOverTime);
} // }
//
detail = rzAttendanceDetailService.addDetail(attendance, "加班卡", detail.getEquipmentCode(), com.evo.common.utils.DateUtils.addSeconds(detail.getDateTime(), 10), "数据清洗"); // detail = rzAttendanceDetailService.addOrUpdateDetail(attendance, "加班卡", detail.getEquipmentCode(), com.evo.common.utils.DateUtils.addSeconds(detail.getDateTime(), 10), "数据清洗");
RzOverTimeDetail rzOverTimeDetail = new RzOverTimeDetail(); // RzOverTimeDetail rzOverTimeDetail = new RzOverTimeDetail();
rzOverTimeDetail.setOverTimeId(rzOverTime.getId()); // rzOverTimeDetail.setOverTimeId(rzOverTime.getId());
rzOverTimeDetail.setOverTimeStart(detail.getDateTime()); // rzOverTimeDetail.setOverTimeStart(detail.getDateTime());
rzOverTimeDetail.setName(sysStaff.getName()); // rzOverTimeDetail.setName(sysStaff.getName());
rzOverTimeDetail.setDelFlag(Constants.DELETE_FLAG_0); // rzOverTimeDetail.setDelFlag(Constants.DELETE_FLAG_0);
rzOverTimeDetail.setCreateBy("admin"); // rzOverTimeDetail.setCreateBy("admin");
rzOverTimeDetail.setCreateTime(com.evo.common.utils.DateUtils.getNowDate()); // rzOverTimeDetail.setCreateTime(com.evo.common.utils.DateUtils.getNowDate());
//
detail = rzAttendanceDetailService.addDetail(attendance, "下班卡", detail.getEquipmentCode(), com.evo.common.utils.DateUtils.addMinutes(detail.getDateTime(), new BigDecimal(info[1]).multiply(new BigDecimal(60)).add(new BigDecimal(30)).intValue()), "数据清洗"); // detail = rzAttendanceDetailService.addOrUpdateDetail(attendance, "下班卡", detail.getEquipmentCode(), com.evo.common.utils.DateUtils.addMinutes(detail.getDateTime(), new BigDecimal(info[1]).multiply(new BigDecimal(60)).add(new BigDecimal(30)).intValue()), "数据清洗");
rzOverTimeDetail.setOverTimeEnd(detail.getDateTime()); // rzOverTimeDetail.setOverTimeEnd(detail.getDateTime());
rzOverTimeDetailMapper.insert(rzOverTimeDetail); // rzOverTimeDetailMapper.insert(rzOverTimeDetail);
KqUtils.calculateOverTimeHours(rzOverTimeDetail, sysStaff.getUserId(), sysStaff.getTimeClock()); // KqUtils.calculateOverTimeHours(rzOverTimeDetail, sysStaff.getUserId(), sysStaff.getTimeClock());
rzOverTimeDetailMapper.updateRzOverTimeDetail(rzOverTimeDetail); // rzOverTimeDetailMapper.updateRzOverTimeDetail(rzOverTimeDetail);
//加班修改统计 // //加班修改统计
rzOverTime.setOverHours(rzOverTime.getOverHours().add(rzOverTimeDetail.getOverTimeHours())); // rzOverTime.setOverHours(rzOverTime.getOverHours().add(rzOverTimeDetail.getOverTimeHours()));
rzOverTimeMapper.updateRzOverTime(rzOverTime); // rzOverTimeMapper.updateRzOverTime(rzOverTime);
line = reader.readLine(); // line = reader.readLine();
} // }

View File

@ -19,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectRzSpecialOverTimeVo"> <sql id="selectRzSpecialOverTimeVo">
select id, user_id, dept_id, name, over_date, sick_hours, del_flag, create_by, create_time, update_by, update_time from rz_special_over_time select id, user_id, dept_id, name, over_date, sick_hours, del_flag, create_by, create_time, update_by, update_time from rz_special_over_time r
</sql> </sql>
<select id="selectRzSpecialOverTimeList" parameterType="RzSpecialOverTime" resultMap="RzSpecialOverTimeResult"> <select id="selectRzSpecialOverTimeList" parameterType="RzSpecialOverTime" resultMap="RzSpecialOverTimeResult">
@ -30,6 +30,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deptId != null "> and dept_id = #{deptId}</if> <if test="deptId != null "> and dept_id = #{deptId}</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if> <if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
<if test="overDate != null "> and date_format(over_date,'%y%m') = date_format(#{overDate},'%y%m')</if> <if test="overDate != null "> and date_format(over_date,'%y%m') = date_format(#{overDate},'%y%m')</if>
${params.dataScope}
</where> </where>
</select> </select>