最近开发遇到这样一个需求:开始日期与结束日期不能重复添加,也不能添加数据库中,已存在数据的开始日期与结束日期之间的数据;如果数据库内的结束日期为null,则表示无限大,不允许在进行添加
先梳理下逻辑:
1、添加的开始日期 >= 数据库的开始日期 && 添加的开始日期 <= 数据结束日期 【false】
2、添加的结束日期 >= 数据库的开始日期 && 添加的结束日期 <= 数据库的结束日期 【false】
3、添加的开始日期 <= 数据库的开始日期 && 添加的开始日期 >= 数据库的结束日期 【false】
4、如果数据库内的结束日期为null 【false】
Java 代码 codes
package com.shenqi.mom.commons.utils;
import javafx.util.Pair;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName OverlappingPeriod
* @Description TODO
* @Autgor huang
* @Date 2020-03-11 14:38
*/
@Data
public class OverlappingPeriod implements Serializable {
private static final long serialVersionUID = 2597443893772941283L;
/**
* 判断给定时间段[formDate,toDate]是否与已知时间段存在交集,不存在返回true
*
* @param formDate 例:20200218
* @param toDate 例:20200418
* @param objectList 正序存储的时间段集合[{start:A0,end:A1},{start:B0,end:B1}]
* @return
*/
public static boolean isNormal(String formDate, String toDate, List<Pair<String, String>> objectList) {
if (!objectList.isEmpty()) {
for (int i = 0; i < objectList.size(); i++) {
if (StringUtils.isBlank(objectList.get(i).getValue())) {
if (StringUtils.isBlank(toDate)) {
return false;
}
if (toDate.compareTo(objectList.get(i).getKey()) >= 0) {
return false;
}
continue;
}
if (StringUtils.isBlank(toDate)) {
if (formDate.compareTo(objectList.get(i).getValue()) >= 0) {
continue;
}
if (formDate.compareTo(objectList.get(i).getValue()) <= 0) {
return false;
}
return true;
}
if ((formDate.compareTo(objectList.get(i).getKey()) >= 0
&& formDate.compareTo(objectList.get(i).getValue()) <= 0)
|| (toDate.compareTo(objectList.get(i).getKey()) >= 0
&& toDate.compareTo(objectList.get(i).getValue()) <= 0)
|| (formDate.compareTo(objectList.get(i).getKey()) <= 0
&& toDate.compareTo(objectList.get(i).getValue()) >= 0)) {
return false;
}
}
}
return true;
}
public static void main(String[] args) {
List<Pair<String, String>> originList = new ArrayList<>();
originList.add(new Pair<>("20190310", "20190318"));
originList.add(new Pair<>("20190310", "20190318"));
String startX = "20190318";
String endX = "20190330";
System.err.println("最小值之前[" + startX + "," + endX + "]:" + isNormal(startX, endX, originList));
String startX2 = "20200301";
String endX2 = "20200315";
System.err.println("最大值之后[" + startX2 + "," + endX2 + "]:" + isNormal(startX2, endX2, originList));
String startX3 = "20200101";
String endX3 = "20200131";
System.err.println("中间段[" + startX3 + "," + endX3 + "]:" + isNormal(startX3, endX3, originList));
String startX4 = "20200311";
String endX4 = "20200319";
System.err.println("交叉段[" + startX4 + "," + endX4 + "]:" + isNormal(startX4, endX4, originList));
}
}
Pair<String, String>是一个键值元素,和Map还是有很大区别的,K值村放的开始日期,V值存放的结束日期
当我们在进行调用的时候:
record.getFromDate(): 开始日期
record.getToDate(): 结束日期
dataList: 数据库查询处理的数据集合
结果返回true 或 false
List<Pair<String, String>> mapList = dataList.stream()
.map(entity -> new Pair<>(entity.getFromDate(), entity.getToDate())).collect(Collectors.toList());
boolean flag = OverlappingPeriod.isNormal(record.getFromDate(), record.getToDate(), mapList);
if (!flag) {
throw new BaseException(ResponseCode.FAIL.getCode(), "生效或失效时间重叠,请更换时间再进行添加!");
}
这样就可以进行日期校验了,小弟技术有限,欢迎大神纠错指正,谢谢!
网友评论