|
|
@@ -590,7 +590,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
validateAddTimeNotExceedNextReservation(reservation, normalizedAddTimeStart, newEndTime);
|
|
|
|
|
|
// 校验:不能超过营业时间的结束时间
|
|
|
- validateAddTimeNotExceedBusinessHours(reservation, newEndTime);
|
|
|
+ validateAddTimeNotExceedBusinessHours(reservation, normalizedAddTimeStart, newEndTime);
|
|
|
|
|
|
// 更新预约结束时间
|
|
|
reservation.setEndTime(newEndTime);
|
|
|
@@ -776,9 +776,9 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
|
|
|
if (nextReservation != null) {
|
|
|
if (compareTime(newEndTime, nextReservation.getStartTime()) > 0) {
|
|
|
- throw new RuntimeException(
|
|
|
- String.format("新的结束时间 %s 超过了下一个已确认预约的开始时间 %s(预约号:%s)",
|
|
|
- newEndTime, nextReservation.getStartTime(), nextReservation.getReservationNo()));
|
|
|
+ // 计算最多可加时的分钟数
|
|
|
+ int maxAddTimeMinutes = calculateMaxAddTimeMinutes(queryBaseTime, nextReservation.getStartTime());
|
|
|
+ throw new RuntimeException("最多可加时" + maxAddTimeMinutes + "分钟");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -843,6 +843,44 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 计算两个时间之间的分钟差(最多可加时的分钟数)
|
|
|
+ * @param startTime 开始时间(支持 yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm 格式)
|
|
|
+ * @param endTime 结束时间(支持 yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm 格式)
|
|
|
+ * @return 分钟差,如果结束时间早于开始时间返回0
|
|
|
+ */
|
|
|
+ private int calculateMaxAddTimeMinutes(String startTime, String endTime) {
|
|
|
+ try {
|
|
|
+ // 先标准化时间格式
|
|
|
+ String normalizedStartTime = normalizeDateTime(startTime);
|
|
|
+ String normalizedEndTime = normalizeDateTime(endTime);
|
|
|
+
|
|
|
+ if (normalizedStartTime == null || normalizedEndTime == null) {
|
|
|
+ log.warn("时间格式不正确,无法计算分钟差,startTime={}, endTime={}", startTime, endTime);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ sdf.setLenient(false);
|
|
|
+ Date startDate = sdf.parse(normalizedStartTime);
|
|
|
+ Date endDate = sdf.parse(normalizedEndTime);
|
|
|
+
|
|
|
+ // 如果结束时间早于开始时间,返回0
|
|
|
+ if (endDate.before(startDate)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算分钟差
|
|
|
+ long diffInMillis = endDate.getTime() - startDate.getTime();
|
|
|
+ int minutes = (int) (diffInMillis / (1000 * 60));
|
|
|
+
|
|
|
+ return minutes;
|
|
|
+ } catch (ParseException e) {
|
|
|
+ log.error("计算最多可加时分钟数失败,startTime={}, endTime={}", startTime, endTime, e);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 计算新的结束时间:加时开始时间 + 加时分钟数
|
|
|
* 返回格式:yyyy-MM-dd HH:mm(不含秒)
|
|
|
*/
|
|
|
@@ -893,7 +931,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
* @param reservation 预约信息
|
|
|
* @param newEndTime 新的结束时间(yyyy-MM-dd HH:mm:ss格式)
|
|
|
*/
|
|
|
- private void validateAddTimeNotExceedBusinessHours(UserReservation reservation, String newEndTime) {
|
|
|
+ private void validateAddTimeNotExceedBusinessHours(UserReservation reservation, String addTimeStart, String newEndTime) {
|
|
|
try {
|
|
|
if (reservation == null || reservation.getStoreId() == null || reservation.getReservationDate() == null) {
|
|
|
log.warn("预约信息不完整,跳过营业时间校验");
|
|
|
@@ -1025,7 +1063,16 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
int comparison = compareTime(normalizedNewEndTime, normalizedBusinessEndTime);
|
|
|
if (comparison > 0) {
|
|
|
// 新的结束时间超过了营业时间的结束时间
|
|
|
- throw new RuntimeException("加时后结束时间不能超过营业时间,营业结束时间为:" + businessEndTime);
|
|
|
+ // 计算最多可加时的分钟数
|
|
|
+ // 确定计算基准时间:取当前结束时间和加时开始时间的较大值
|
|
|
+ String normalizedEndTime = normalizeDateTime(reservation.getEndTime());
|
|
|
+ String normalizedAddTimeStart = normalizeDateTime(addTimeStart);
|
|
|
+ String baseTime = normalizedEndTime;
|
|
|
+ if (normalizedAddTimeStart != null && compareTime(normalizedAddTimeStart, normalizedEndTime) > 0) {
|
|
|
+ baseTime = normalizedAddTimeStart;
|
|
|
+ }
|
|
|
+ int maxAddTimeMinutes = calculateMaxAddTimeMinutes(baseTime, normalizedBusinessEndTime);
|
|
|
+ throw new RuntimeException("最多可加时" + maxAddTimeMinutes + "分钟");
|
|
|
}
|
|
|
|
|
|
log.info("加时校验通过,新的结束时间={},营业结束时间={}", normalizedNewEndTime, normalizedBusinessEndTime);
|