java代码实现oa请假逻辑
核心逻辑
1、拆分开始时间和结束时间
2、遍历两个时间点的所有数据并提出周末时间
3、对工作时间进行处理
4、对超过工作时间的时间进行处理
5、处理请假中的第一天和最后一天的数据进行特殊处理
6、汇总这个时间段上的请假时间
补班和法定节假日没有在处理
目前的思路是:法定节假日和补班是每年发布的。这里没做处理。
public RetDataBean compareHolidays(String dataNum5, String dataNum6) {
try{
System.out.println(dataNum5 +" " + dataNum6) ;
String compareData="";
// 1、将假期拆分yyyy-mm-dd 开始时间 r 切割时间
String[] dataNum5List = dataNum5.split(" ");
String num5Time = dataNum5List[1]; // 开始时间对应的时间
String num5Year = dataNum5List[0]; // 开始时间对应的年月日
String[] dataNum6List = dataNum6.split(" ");
String num6Time = dataNum6List[1]; // 结束时间对应的时间
String num6Year = dataNum6List[0]; // 结束时间对应的年月日
// 计算两个假期中间的天数,返回为周一到周五之间的工作日
List<LocalDate> localDates = DateUtils.querySelectSumary(num5Year, num6Year);
//TODO 去掉假期中的法定节假日
//TODO 加上补班的日期,此日期必须是周六或者周日
// 2、开始时间不是9点,手动设置为9点
Integer num5TimeInt = Integer.valueOf(num5Time);
if(num5TimeInt<= WORK_STATE_TIME ){
num5TimeInt = WORK_STATE_TIME;
}
// 3、结束时间 不是17点手动设置为17点
Integer num6TimeInt = Integer.valueOf(num6Time);
if(num6TimeInt >=WORK_END_TIME) {
num6TimeInt = WORK_END_TIME;
}
Integer total =0; // 设置局部变量,便于计算两天的时间差
// Integer diff = 0 ;
if(ObjectUtil.isEmpty(localDates)){ // 这两个日期为周末,没有任何时间差返回
compareData = "0";
}else {
int size = localDates.size();
if(1 == size){// 表示请假天数为当天之内 只需要时间做减法即可
int i = num6TimeInt - num5TimeInt;
// 借宿时间在12点以后, 开始时间在9点到12点之间需要减1
if(num6TimeInt >WORK_REST_TIME &&(num5TimeInt >= WORK_STATE_TIME && num5TimeInt <= WORK_REST_TIME)){
i--;
}
if(i >0){
compareData = i +"";
}else{
compareData="0";
}
}else{ // 多天的假期计算,需要对日期进行多次梳理
if(num5TimeInt>=WORK_STATE_TIME && num5TimeInt <=WORK_REST_TIME){ // 上午区间 -1为中午休息时间
total = WORK_END_TIME-num5TimeInt -1;
}else if(num5TimeInt >= WORK_END_TIME){
total =0;
}else{
total = WORK_END_TIME-num5TimeInt;
}
if(num6TimeInt < WORK_STATE_TIME){
size --;
compareData=((size -1)*DAY_WORK_TIME+total)+"";
} else if(num6TimeInt >=WORK_STATE_TIME && num6TimeInt <=WORK_REST_TIME){
total += num6TimeInt -WORK_STATE_TIME;
compareData=((size -2)*DAY_WORK_TIME+total)+"";
}else{
total += num6TimeInt -WORK_STATE_TIME -1;
compareData=((size -2)*DAY_WORK_TIME+total)+"";
}
System.out.println(total +" : "+ compareData);
}
}
return RetDataTools.Ok(compareData);
} catch (Exception e) {
return RetDataTools.Error();
}
}
对应的工具类
public static List<LocalDate> querySelectSumary(String startTime, String endTime){
List<LocalDate> list = new ArrayList<>(1024);
LocalDate startDate = LocalDate.parse(startTime); // 开始日期
LocalDate endDate = LocalDate.parse(endTime); // 结束日期
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 计算开始日期和结束日期之间的天数
for (int i = 0; i <= daysBetween; i++) {
LocalDate currentDate = startDate.plusDays(i);
String state=currentDate.getDayOfWeek().getValue() > 5 ? "0": "1"; //判断是否是工作日
if("1".equals(state)){ // 获取的工作日
list.add(currentDate);
}
}
return list;
}