实体类 TtbWorkResultTable只需要设置俩个字段 descr,workDate.
/**
* @param workResultTables workDateStr以及他前一天的日期的班表
* @param workDateStr 申请的日期
* @param beginTime
* @param endTime
* @return
*/
public static List<Map<String, String>> theDaysKuaTian(List<TtbWorkResultTable> workResultTables, String workDateStr, String beginTime, String endTime) {
try {
List<Map<String, String>> valueResult = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
List<String> kuatianduan = new ArrayList<>();
List<String> buKuatianduan = new ArrayList<>();
TtbWorkResultTable nowWorkTable = null;
TtbWorkResultTable yestDateTable = null;
for (TtbWorkResultTable workResultTable : workResultTables) {
if (DateUtils.getYesterday(workDateStr).equals(workResultTable.getWorkDate())) {
yestDateTable = workResultTable;
/*判断当前日期的前一天日期的跨天工作时间是否和当前的开始结束时间有重叠*/
if (StringUtils.isNotEmpty(workResultTable.getDescr())) {
String[] timeStrS = workResultTable.getDescr().split(" ");
for (String timeStr : timeStrS) {
String[] time = timeStr.split("-");
kuatianduan.add(time[0]);
kuatianduan.add(time[1]);
}
}
}
if (workDateStr.equals(workResultTable.getWorkDate())) {
if (StringUtils.isNotEmpty(workResultTable.getDescr())) {
nowWorkTable = workResultTable;
String[] timeStrS = workResultTable.getDescr().split(" ");
for (String timeStr : timeStrS) {
String[] time = timeStr.split("-");
buKuatianduan.add(time[0]);
buKuatianduan.add(time[1]);
}
}
}
}
String timeKuaYeDuan = whetherAcrossDay(kuatianduan, yestDateTable);
/*判断前一天是否是跨天*/
if (timeKuaYeDuan != null) {/*表示有跨天数据*/
/*先求跨天下半夜和时长的交集数据*/
Long timeValue = 0L;
String[] timeStrS = timeKuaYeDuan.split(" ");/*取出上班时间段*/
timeValue = getaLong(beginTime, endTime, sdf, timeValue, timeStrS);
if (timeValue != 0L) {
Map<String, String> value = new HashMap<>();
value.put("workDate", yestDateTable.getWorkDate());
value.put("timeLong", timeValue.toString());
value.put("timeDescr", timeKuaYeDuan);
valueResult.add(value);
}
}
/*判断当天数据是否有交集数据*/
if (nowWorkTable != null) {
/*获取不跨天的班表*/
String timeJinTianDuan = whetherAcrossDayBu(buKuatianduan, nowWorkTable);
if (StringUtils.isNotEmpty(timeJinTianDuan)) {
Long timeValue = 0L;
String[] timeStrS = timeJinTianDuan.split(" ");/*取出上班时间段*/
timeValue = getaLong(beginTime, endTime, sdf, timeValue, timeStrS);
if (timeValue != 0L) {
Map<String, String> value = new HashMap<>();
value.put("workDate", nowWorkTable.getWorkDate());
value.put("timeLong", timeValue.toString());
value.put("timeDescr", timeJinTianDuan);
valueResult.add(value);
}
}
}
return valueResult;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
private static String whetherAcrossDayBu(List<String> descrs, TtbWorkResultTable nowWorkTable) {
String time = null;
for (int i = 0; i < descrs.size() - 1; i++) {
String time1 = descrs.get(i);
String time2 = descrs.get(i + 1);
if (time1.compareTo(time2) > 0) {
time = time1;
}
}
if (time != null && nowWorkTable != null) {
StringBuilder times = new StringBuilder();
/*表示这段班表有跨天,取出没有跨天的数据*/
Integer m = null;
String timeKuaTian = null;
String descr = nowWorkTable.getDescr();
String[] timeStrS = descr.split(" ");
for (int i = 0; i < timeStrS.length; i++) {
String timeStr = timeStrS[i];
if (timeStr.contains(time)) {
m = i;
timeKuaTian = timeStr;
}
}
if (m != null) {
for (int i = 0; i < m; i++) {
if (!timeStrS[m].equals(timeKuaTian)) {
times.append(timeStrS[m]).append(" ");
}
}
/*对于跨天时段的分析*/
String[] timeDian = timeKuaTian.split("-");
if (timeDian[0].equals(time)) { /*根跟23:59切割*/
times.append(time).append("-23:59");
} else {/*表示跨天时间段和00:00点没有关系*/
times.append(timeKuaTian);
}
return times.toString();
} else {
return nowWorkTable.getDescr();
}
}
return nowWorkTable.getDescr();
}
private static Long getaLong(String beginTime, String endTime, SimpleDateFormat sdf, Long timeValue, String[] timeStrS) throws ParseException {
for (String timeStr : timeStrS) {
String[] time = timeStr.split("-");
if (beginTime.compareTo(time[0]) >= 0 && endTime.compareTo(time[1]) <= 0) {/*开始时间大于时间段的开始时间 且 结束时间小于当前时段的结尾时间 表示开始时间在此时刻内*/
return DateUtils.getDatesHour(sdf.parse(endTime), sdf.parse(beginTime));
}
if (beginTime.compareTo(time[0]) >= 0 && endTime.compareTo(time[1]) >= 0 && beginTime.compareTo(time[1]) < 0) {
Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(time[1]), sdf.parse(beginTime));
timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
}
if (beginTime.compareTo(time[0]) <= 0 && endTime.compareTo(time[1]) <= 0 && endTime.compareTo(time[0]) > 0) {
Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(endTime), sdf.parse(time[0]));
timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
}
if (beginTime.compareTo(time[0]) < 0 && endTime.compareTo(time[1]) > 0) {
Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(time[1]), sdf.parse(time[0]));
timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
}
}
return timeValue;
}
private static String whetherAcrossDay(List<String> kautianduan, TtbWorkResultTable yestDateTable) {
String time = null;
for (int i = 0; i < kautianduan.size() - 1; i++) {
String time1 = kautianduan.get(i);
String time2 = kautianduan.get(i + 1);
if (time1.compareTo(time2) > 0) {
time = time2;
}
}
if (time != null && yestDateTable != null) {
StringBuilder times = new StringBuilder();
/*表示这段班表有跨天*/
Integer m = null;
String timeKuaTian = null;
String descr = yestDateTable.getDescr();
String[] timeStrS = descr.split(" ");
for (int i = 0; i < timeStrS.length; i++) {
String timeStr = timeStrS[i];
if (timeStr.contains(time)) {
m = i;
timeKuaTian = timeStr;
}
}
if (m != null) {
/*对于跨天时段的分析*/
String[] timeDian = timeKuaTian.split("-");
if (timeDian[0].equals(time)) {/*表示跨天时间段和00:00点没有关系*/
times.append(timeKuaTian).append(" ");
} else {/*根跟00:00切割*/
times.append("00:00-").append(time).append(" ");
}
for (int i = m; i < timeStrS.length; i++) {
if (!timeStrS[m].equals(timeKuaTian)) {
times.append(timeStrS[m]).append(" ");
}
}
return times.deleteCharAt(times.length() - 1).toString();
}
}
return null;
}
出参为一个list