Commit c9c3e7ea authored by 赵啸非's avatar 赵啸非

修改固定班次考勤

parent 1795462b
...@@ -9,6 +9,8 @@ import com.mortals.xhx.common.code.*; ...@@ -9,6 +9,8 @@ import com.mortals.xhx.common.code.*;
import com.mortals.xhx.common.utils.BeanUtil; import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.attendance.model.*; import com.mortals.xhx.module.attendance.model.*;
import com.mortals.xhx.module.attendance.service.*; import com.mortals.xhx.module.attendance.service.*;
import com.mortals.xhx.module.attendance.service.work.AttendanceWorkAbstract;
import com.mortals.xhx.module.attendance.service.work.CommonData;
import com.mortals.xhx.module.dept.service.DeptService; import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.staff.model.StaffEntity; import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.model.StaffQuery; import com.mortals.xhx.module.staff.model.StaffQuery;
...@@ -265,6 +267,14 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte ...@@ -265,6 +267,14 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId()); attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId());
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName()); attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName());
//查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制 //查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制
AttendanceWorkAbstract workAbstract = AttendanceWorkAbstract.newType(attendanceGroupEntity.getType());
CommonData commonData = new CommonData();
commonData.setAttendanceGroupEntity(attendanceGroupEntity);
commonData.setAttendanceDate(attendanceDate);
commonData.setDetailEntityList(detailEntityList);
workAbstract.doHandleWork(commonData);
/*
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery() AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery()
.groupId(attendanceGroupEntity.getId())); .groupId(attendanceGroupEntity.getId()));
//判断当前考勤日期为周几 //判断当前考勤日期为周几
...@@ -365,7 +375,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte ...@@ -365,7 +375,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
} }
} }
} }
} }*/
} }
......
package com.mortals.xhx.module.attendance.service.work;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.common.code.TypeEnum;
import com.mortals.xhx.module.attendance.model.AttendanceGroupFixedworkEntity;
import java.util.Date;
/**
* 工作排班抽象类
*
* @author:
* @date: 2023/7/31 15:09
*/
public abstract class AttendanceWorkAbstract {
private int type;
abstract int getType();
abstract void initData();
public abstract void doHandleWork(CommonData commonData);
public static AttendanceWorkAbstract newType(int type) {
if (type == TypeEnum.固定班制.getValue()) {
return new FixWorkAttendance(type);
} else if (type == TypeEnum.自由工时.getValue()) {
return new FreedomWorkAttendance(type);
}
if (type == TypeEnum.排班制.getValue()) {
return new ScheduleWorkAttendance(type);
} else {
throw new AppException(String.format("未知的类型码:%s", type));
}
}
protected String getWeek(Date date) {
// Get the day of the week (1 = Sunday, 2 = Monday, ..., 7 = Saturday)
int dayOfWeek = DateUtil.dayOfWeek(date);
// Map the numeric day of the week to its corresponding Chinese name
String[] dayOfWeekNames = new String[]{
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
};
// Get the Chinese name of the day of the week
String dayOfWeekName = dayOfWeekNames[dayOfWeek - 1];
return dayOfWeekName;
}
/**
* 获取通过星期获取班次id 如果返参为-1 则不在考勤
*
* @return
*/
protected Long getWeekClassId(AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity, String week) {
Long weekClassId = 0L;
switch (week) {
case "星期一":
if (attendanceGroupFixedworkEntity.getMonday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getMondayClassId();
break;
case "星期二":
if (attendanceGroupFixedworkEntity.getTuesday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getTuesdayClassId();
break;
case "星期三":
if (attendanceGroupFixedworkEntity.getWednesday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getWednesdayClassId();
break;
case "星期四":
if (attendanceGroupFixedworkEntity.getThursday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getThursdayClassId();
break;
case "星期五":
if (attendanceGroupFixedworkEntity.getFriday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getFridayClassId();
break;
case "星期六":
if (attendanceGroupFixedworkEntity.getSaturday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getSaturdayClassId();
break;
case "星期日":
if (attendanceGroupFixedworkEntity.getSunday() == 0) {
weekClassId = -1L;
return weekClassId;
}
weekClassId = attendanceGroupFixedworkEntity.getSundayClassId();
break;
}
return weekClassId;
}
public AttendanceWorkAbstract(int type) {
this.type = type;
}
}
package com.mortals.xhx.module.attendance.service.work;
import com.mortals.xhx.module.attendance.model.AttendanceGroupEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordDetailEntity;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 通用参数
*
* @author:
* @date: 2023/7/31 15:27
*/
@Data
public class CommonData {
private AttendanceGroupEntity attendanceGroupEntity;
private List<AttendanceRecordDetailEntity> detailEntityList;
private Date attendanceDate;
}
package com.mortals.xhx.module.attendance.service.work;
import cn.hutool.core.date.DateUtil;
import com.mortals.xhx.common.code.GoWorkResultEnum;
import com.mortals.xhx.common.code.TypeEnum;
import com.mortals.xhx.module.attendance.model.*;
import com.mortals.xhx.module.attendance.service.AttendanceClassService;
import com.mortals.xhx.module.attendance.service.AttendanceGroupFixedworkService;
import com.mortals.xhx.utils.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import java.util.Date;
import java.util.List;
/**
* 固定班
* @author:
* @date: 2023/7/31 15:15
*/
@Slf4j
public class FixWorkAttendance extends AttendanceWorkAbstract {
private AttendanceGroupFixedworkService attendanceGroupFixedworkService;
private AttendanceClassService attendanceClassService;
public FixWorkAttendance(int type) {
super(type);
this.attendanceGroupFixedworkService = SpringUtils.getBean(AttendanceGroupFixedworkService.class);
this.attendanceClassService = SpringUtils.getBean(AttendanceClassService.class);
}
@Override
int getType() {
return TypeEnum.固定班制.getValue();
}
@Override
void initData() {
}
@Override
void doHandleWork(CommonData commonData) {
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery()
.groupId(commonData.getAttendanceGroupEntity().getId()));
//判断当前考勤日期为周几
String week = super.getWeek(commonData.getAttendanceDate());
//log.info("week:{}", week);
//通过考勤日期的星期拿到班次id.
if (ObjectUtils.isEmpty(attendanceGroupFixedworkEntity)) {
log.info("attendanceGroupFixedworkEntity is null ! groupId:{}", commonData.getAttendanceGroupEntity().getId());
return;
}
//获取当前日期的详细班次
Long weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, week);
//log.info("weekClassId:{}", weekClassId);
//weekClassId为-1 则不在考勤
if (weekClassId == -1L) {
//跳过本次循环
return;
}
//获取班次信息
AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(weekClassId);
if (ObjectUtils.isEmpty(attendanceClassEntity)) {
log.info("attendanceClassEntity is null ,weekClassId:{}", weekClassId);
return;
}
//List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassDetailService.find(new AttendanceClassDetailQuery().classId(attendanceClassEntity.getId()));
//获取当前班的多个班次,一个班次为一个上下班时间段
List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassEntity.getAttendanceClassDetailList();
Integer orderNum = 0;
//构造数据
if (ObjectUtils.isEmpty(commonData.getDetailEntityList())) {
//遍历班次 构建详细考勤数据
for (AttendanceClassDetailEntity classDetailEntity : attendanceClassDetailEntities) {
orderNum++;
AttendanceRecordDetailEntity recordDetailEntity = new AttendanceRecordDetailEntity();
recordDetailEntity.setShiftsId(classDetailEntity.getId());
recordDetailEntity.setShiftsName(classDetailEntity.getClassName());
recordDetailEntity.setGoWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOffWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOrderNum(orderNum);
commonData.getDetailEntityList().add(recordDetailEntity);
}
}
for (AttendanceClassDetailEntity classDetail : attendanceClassDetailEntities) {
//计算区间范围
//上班打卡前时间
Date goWorkDateBefore = DateUtil.offsetMinute(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore());
//上班打卡后时间
Date goWorkDateAfter = DateUtil.offsetMinute(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter());
// 下班打卡前时间
Date offWorkDateBefore = DateUtil.offsetMinute(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore());
//下班打卡后时间
Date offWorkDateAfter = DateUtil.offsetMinute(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter());
//判断考勤时间是否在上班打卡区间内 true 在 false 不在 格式化时间
//String currDate = DateUtil.formatTime(attendanceDate);
Date curDateTime = DateUtil.parseTime(DateUtil.formatTime(commonData.getAttendanceDate())).toJdkDate();
boolean goInTime = DateUtil.isIn(curDateTime, goWorkDateBefore, goWorkDateAfter);
//判断考勤时间是否在下班打卡区间内
boolean offInTime = DateUtil.isIn(curDateTime, offWorkDateBefore, offWorkDateAfter);
if (goInTime == false && offInTime == false) {
log.info("考勤时间不在上班区间与下班区间中,不做处理!attendDate:{}", DateUtil.formatDateTime(commonData.getAttendanceDate()));
continue;
}
if (goInTime) {
//如果是上班打卡区间范围,判断是否迟到
boolean inTime = DateUtil.isIn(curDateTime, goWorkDateBefore, classDetail.getGoWorkDate());
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : commonData.getDetailEntityList()) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setGoWorkDate(commonData.getAttendanceDate());
}
}
} else {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : commonData.getDetailEntityList()) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.迟到.getValue());
attendanceRecordDetailEntity.setGoWorkDate(commonData.getAttendanceDate());
}
}
}
}
if (offInTime) {
boolean inTime = DateUtil.isIn(curDateTime, classDetail.getOffWorkDate(), offWorkDateAfter);
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : commonData.getDetailEntityList()) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setOffWorkDate(commonData.getAttendanceDate());
}
}
} else {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : commonData.getDetailEntityList()) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.早退.getValue());
attendanceRecordDetailEntity.setOffWorkDate(commonData.getAttendanceDate());
}
}
}
}
}
}
}
package com.mortals.xhx.module.attendance.service.work;
import com.mortals.xhx.common.code.TypeEnum;
import lombok.extern.slf4j.Slf4j;
/**
* 自由排班
* @author:
* @date: 2023/7/31 15:15
*/
@Slf4j
public class FreedomWorkAttendance extends AttendanceWorkAbstract {
public FreedomWorkAttendance(int type) {
super(type);
}
@Override
int getType() {
return TypeEnum.自由工时.getValue();
}
@Override
void initData() {
}
@Override
void doHandleWork(CommonData commonData) {
}
}
package com.mortals.xhx.module.attendance.service.work;
import com.mortals.xhx.common.code.TypeEnum;
import lombok.extern.slf4j.Slf4j;
/**
* 排班值
*
* @author:
* @date: 2023/7/31 15:15
*/
@Slf4j
public class ScheduleWorkAttendance extends AttendanceWorkAbstract {
public ScheduleWorkAttendance(int type) {
super(type);
}
@Override
int getType() {
return TypeEnum.自由工时.getValue();
}
@Override
void initData() {
}
@Override
void doHandleWork(CommonData commonData) {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment