预约订单槽点列表 优化

This commit is contained in:
Jack 2025-10-25 17:31:20 +08:00
parent 955fe3a3ff
commit 6b7cc54b01

View File

@ -1128,64 +1128,61 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
Date openTime = DateUtil.parse(dateStr + " " + openingHours + ":00", "yyyy-MM-dd HH:mm:ss");
Date closeTime = DateUtil.parse(dateStr + " " + closeHours + ":00", "yyyy-MM-dd HH:mm:ss");
// 如果结束时间早于开始时间说明跨天了需要调整到第二天
if (closeTime.before(openTime)) {
closeTime = DateUtil.offsetDay(closeTime, 1);
}
// 验证营业时间有效性
if (openTime.after(closeTime)) {
logger.warn("[生成时间槽] 营业时间无效openTime: {}, closeTime: {}", openTime, closeTime);
return items;
}
// 对于今天需要特殊处理从当前时间+5分钟开始生成时间槽
// 时间槽间隔分钟
int slotInterval = 30;
// 对于今天需要特殊处理第二个时间槽从当前时间+50分钟开始
Date startTime = openTime;
if (isToday) {
// 当前时间+5分钟作为第二个时间槽的开始时间
Date nowPlusFive = DateUtil.offsetMinute(new Date(), 5);
// 如果当前时间+5分钟在营业时间范围内则从该时间开始
if (nowPlusFive.after(openTime) && nowPlusFive.before(closeTime)) {
startTime = nowPlusFive;
// 当前时间+50分钟作为第二个时间槽的开始时间
Date nowPlusFifty = DateUtil.offsetMinute(new Date(), 50);
// 如果当前时间+50分钟在营业时间范围内则从该时间开始
if (nowPlusFifty.after(openTime) && nowPlusFifty.before(closeTime)) {
startTime = nowPlusFifty;
}
// 如果当前时间+5分钟已经超过营业结束时间则不生成后续时间槽
else if (nowPlusFive.after(closeTime)) {
logger.debug("[生成时间槽] 当前时间+5分钟已超过营业结束时间,不生成后续时间槽");
// 如果当前时间+50分钟已经超过营业结束时间则不生成后续时间槽
else if (nowPlusFifty.after(closeTime)) {
logger.debug("[生成时间槽] 当前时间+50分钟已超过营业结束时间,不生成后续时间槽");
return items;
}
}
// 生成30分钟间隔的时间段
// 生成时间槽
Date currentTimeSlot = startTime;
int slotCount = 0;
final int MAX_SLOTS = 48; // 最多生成48个时间段防止异常循环
while (currentTimeSlot.before(closeTime) && slotCount < MAX_SLOTS) {
Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, 30);
Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, slotInterval);
// 如果结束时间超过了营业结束时间则使用营业结束时间
if (endTimeSlot.after(closeTime)) {
endTimeSlot = closeTime;
}
// 创建时间段项跳过"立即送出"因为已经添加过了
if (!(isToday && slotCount == 0 && items.size() > 0 && "立即送出".equals(items.get(0).getTime_title()))) {
BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem();
String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm");
String endTimeStr = DateUtil.format(endTimeSlot, "HH:mm");
// 创建时间段项
BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem();
String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm");
String endTimeStr = DateUtil.format(endTimeSlot, "HH:mm");
timeItem.setTime_title(beginTimeStr + "-" + endTimeStr);
timeItem.setTime_title(beginTimeStr + "-" + endTimeStr);
// 修正时间戳计算
long bookingAt = currentTimeSlot.getTime() / 1000;
timeItem.setBooking_at(bookingAt);
// 时间戳计算
long bookingAt = currentTimeSlot.getTime() / 1000;
timeItem.setBooking_at(bookingAt);
timeItem.setBooking_state(2);
timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss"));
timeItem.setBooking_end_time(DateUtil.format(DateUtil.offsetMinute(currentTimeSlot, 40), "yyyy-MM-dd HH:mm:ss"));
timeItem.setBooking_state(2);
timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss"));
timeItem.setBooking_end_time(DateUtil.format(endTimeSlot, "yyyy-MM-dd HH:mm:ss"));
items.add(timeItem);
}
items.add(timeItem);
// 移动到下一个时间段
currentTimeSlot = endTimeSlot;