diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TimeBucket.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TimeBucket.java new file mode 100644 index 0000000..ce38de0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TimeBucket.java @@ -0,0 +1,96 @@ +package org.dromara.common.core.utils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @Description TODO + * @Auther caojiawei + * @Date 2019/7/5 10:44 + * @Version 1.0 + **/ +public class TimeBucket { + private static final ThreadLocal FORMATS = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + + private final Date start; + + private final Date end; + + public TimeBucket(Date start, Date end) { + if (start.after(end)) { + throw new IllegalArgumentException("时间段无效(开始日期需要小于结束日期)"); + } + this.start = start; + this.end = end; + } + + public TimeBucket(String start, String end) throws ParseException { + this(parse(start), parse(end)); + } + + public TimeBucket(long startTime, long endTime) { + this(new Date(startTime), new Date(endTime)); + } + + /** + * TimeBucket会返回重叠的时间段 + * 若返回null说明没有重叠的时间段 + * + * @param buckets 时间段 + * @return + */ + public static TimeBucket union(TimeBucket... buckets) { + //长度为1无需判断 + if (buckets == null || buckets.length <= 1) { + return null; + } + for (int i = 0; i < buckets.length - 1; i++) { + long start = buckets[i].getStartTime(); + long end = buckets[i].getEndTime(); + for (int j = i + 1; j < buckets.length; j++) { + if (buckets[j].getStartTime() > start) { + start = buckets[j].getStartTime(); + } + if (buckets[j].getEndTime() < end) { + end = buckets[j].getEndTime(); + } + if (start < end) { + return new TimeBucket(start, end); + } + } + } + return null; + } + + public Date getStart() { + return start; + } + + public Date getEnd() { + return end; + } + + public long getStartTime() { + return start.getTime(); + } + + public long getEndTime() { + return end.getTime(); + } + + private static Date parse(String str) throws ParseException { + return FORMATS.get().parse(str); + } + + private static String format(Date str) { + return FORMATS.get().format(str); + } + + @Override + public String toString() { + return "TimeBucket{start=" + format(start) + ";end=" + format(end) + "}"; + } + +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/ReservationServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/ReservationServiceImpl.java index 58bb56b..7178033 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/ReservationServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/ReservationServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.TimeBucket; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.scale.domain.ReservationDay; import org.dromara.scale.domain.ReservationTime; @@ -47,9 +48,20 @@ public class ReservationServiceImpl implements IReservationService { Long id = add.getId(); if (flag) { List timeList = bo.getTimeList(); - for (ReservationTime one : timeList) { + int size = timeList.size(); + if (size == 0) { + throw new ServiceException("请选择可预约时间"); + } + TimeBucket[] buckets = new TimeBucket[size]; + for (int i = 0; i < size; i++) { + ReservationTime one = timeList.get(i); one.setCounselorId(userId); one.setDayId(id); + buckets[i] = new TimeBucket(one.getStartTime(), one.getEndTime()); + } + TimeBucket union = TimeBucket.union(buckets); + if (union != null) { + throw new ServiceException("可预约时间有重复"); } timeMapper.insert(timeList); }