package com.dsh.guns.modular.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.entity.SiteLock; import com.dsh.course.mapper.TSiteMapper; import com.dsh.guns.modular.system.model.QuerySiteTimes; import com.dsh.guns.modular.system.model.SiteBooking; import com.dsh.guns.modular.system.model.TSite; import com.dsh.guns.modular.system.model.TSitePrice; import com.dsh.guns.modular.system.service.ISiteBookingService; import com.dsh.guns.modular.system.service.ISiteLockService; import com.dsh.guns.modular.system.service.ITSitePriceService; import com.dsh.guns.modular.system.service.ITSiteService; import com.dsh.guns.modular.system.util.DateComparisonExample; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author zhibing.pu * @Date 2023/8/1 17:50 */ @Service public class TSiteServiceImpl extends ServiceImpl implements ITSiteService { @Autowired private ISiteLockService siteLockService; @Autowired private ISiteBookingService iSiteBookingService; @Autowired private ITSitePriceService itSitePriceService; @Override public List querySiteTimes(Integer id, String day, String halfName, String siteName, Integer targetAudience) throws ParseException { System.out.println("=======date======" + day); List strings = new ArrayList<>(); List siteBookings = iSiteBookingService.list(new QueryWrapper().eq("siteId", id).ne("status", 5).eq("nextName", siteName).like("times", day)); if (StringUtils.isBlank(siteName)) { siteBookings = iSiteBookingService.list(new QueryWrapper().eq("siteId", id).ne("status", 5).like("times", day)); }else{ siteBookings = iSiteBookingService.list(new QueryWrapper().eq("siteId", id).ne("status", 5).eq("nextName", siteName).like("times", day)); } System.out.println("=======已预约列表======" + siteBookings); for (SiteBooking siteBooking : siteBookings) { String[] split = siteBooking.getTimes().split(";"); if (siteBooking.getIsHalf() == 2) { for (String s : split) { String convertedValue = s.substring(11); strings.add(convertedValue + (siteBooking.getTargetAudience() != null ? "," + siteBooking.getTargetAudience() : ",1")); } } else { if (halfName == null) { for (String s : split) { String convertedValue = s.substring(11); strings.add(convertedValue + (siteBooking.getTargetAudience() != null ? "," + siteBooking.getTargetAudience() : ",1")); } } if (siteBooking.getHalfName().equals(halfName)) { for (String s : split) { String convertedValue = s.substring(11); strings.add(convertedValue + (siteBooking.getTargetAudience() != null ? "," + siteBooking.getTargetAudience() : ",1")); } } } } System.out.println("======已经预约时间段=======" + strings); TSite site = this.getById(id); List timeRanges = new ArrayList<>(); day = day.split(";")[0].split(" ")[0]; LocalDate date = LocalDate.parse(day); DayOfWeek dayOfWeek = date.getDayOfWeek(); // 通过日期 确定周X 查询设置的可以约时间段和金额 封装基础时间段数据 LambdaQueryWrapper tSitePriceLambdaQueryWrapper = new LambdaQueryWrapper<>(); tSitePriceLambdaQueryWrapper.eq(TSitePrice::getSiteId, id); tSitePriceLambdaQueryWrapper.orderByAsc(TSitePrice::getStartTime); tSitePriceLambdaQueryWrapper.eq(TSitePrice::getTargetAudience, targetAudience); tSitePriceLambdaQueryWrapper.eq(TSitePrice::getDayOfWeek, dayOfWeek.getValue()); if (StringUtils.isNotBlank(halfName)) { tSitePriceLambdaQueryWrapper.eq(TSitePrice::getFieldType, 2); } else { tSitePriceLambdaQueryWrapper.eq(TSitePrice::getFieldType, 1); } List sitePrice = itSitePriceService.list(tSitePriceLambdaQueryWrapper); SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); for (TSitePrice tSitePrice : sitePrice) { QuerySiteTimes querySiteTimes = new QuerySiteTimes(); querySiteTimes.setTime(tSitePrice.getStartTime().substring(0, tSitePrice.getStartTime().length() - 3) + "-" + tSitePrice.getEndTime().substring(0, tSitePrice.getEndTime().length() - 3)); querySiteTimes.setSelectable(1); querySiteTimes.setSelectCount(0); querySiteTimes.setSelectMaxCount(site.getWalkinCapacity()); querySiteTimes.setIsReserve(0); querySiteTimes.setCashPrice(tSitePrice.getCashPrice()); querySiteTimes.setCoinPrice(tSitePrice.getCoinPrice()); String temp = tSitePrice.getStartTime().substring(0, tSitePrice.getStartTime().length() - 3) + "-" + tSitePrice.getEndTime().substring(0, tSitePrice.getEndTime().length() - 3); String timePriceStart = day + " " + tSitePrice.getStartTime().substring(0, tSitePrice.getStartTime().length() - 3); String timePriceEnd = day + " " + tSitePrice.getEndTime().substring(0, tSitePrice.getEndTime().length() - 3); Date now = new Date(); Date start = simpleDateFormat1.parse(timePriceStart); Date end = simpleDateFormat1.parse(timePriceEnd); // 已经预约了 判断是散客模式还是订场模式 Integer flag = 0; // 散客预约人数 Integer count = 0; for (String time : strings) { // 先判断时间是否和预约时间有交集 String s = time.split(",")[1]; String timeRange = time.split(",")[0]; String[] split = timeRange.split("-"); String bookingStart = day + " " + split[0]; String bookingEnd = day + " " + split[1]; if (!isTimePeriodsIntersect(timePriceStart, timePriceEnd, bookingStart, bookingEnd)) { // 不相交 } else { if (s.equals("1")) { // 订场 不可再预约了 querySiteTimes.setIsReserve(1); querySiteTimes.setSelectable(0); flag = 1; break; } count++; } } if (querySiteTimes.getSelectable() == 1&&end.before(now)){ querySiteTimes.setSelectable(0); } querySiteTimes.setSelectCount(count); if (flag == 0 && querySiteTimes.getSelectable() == 1) { // 当前时间段还没有预约 Integer walkinCapacity = site.getWalkinCapacity(); // 计算散客预约人数和最大散客容纳数 System.err.println("预约人数" + count); System.err.println("最大散客容纳数" + walkinCapacity); if (walkinCapacity <= count) { if (targetAudience==1 && walkinCapacity!=0){ // 不可预约 System.err.println("不可预约 也不能散客"); querySiteTimes.setSelectable(0); querySiteTimes.setIsReserve(0); }else if (targetAudience==2){ // 不能散客 System.err.println("不可预约 也不能散客"); querySiteTimes.setSelectable(0); querySiteTimes.setIsReserve(0); }else{ querySiteTimes.setSelectable(1); } }else{ if (targetAudience==2){ // 散客只能预约当前时间段 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String nowStr = simpleDateFormat.format(now); // 判断当前时间有没有在timePriceStart和timePriceEnd之间 if (DateComparisonExample.isStringWithinTimeRange(nowStr, simpleDateFormat.parse(timePriceStart), simpleDateFormat.parse(timePriceEnd))) { querySiteTimes.setSelectable(1); }else{ querySiteTimes.setSelectable(0); } }else{ querySiteTimes.setSelectable(1); } } } // 查出lock List list = siteLockService.list(new LambdaQueryWrapper().eq(SiteLock::getSiteId, id)); for (SiteLock siteLock : list) { String stime = day + " " + tSitePrice.getStartTime().substring(0, tSitePrice.getStartTime().length() - 3); String etime = day + " " + tSitePrice.getEndTime().substring(0, tSitePrice.getEndTime().length() - 3); boolean stringDateBetween = DateComparisonExample.isStringDateBetween(stime + " - " + etime, siteLock.getStartTime(), siteLock.getEndTime()); if (stringDateBetween) { System.err.println("11111预约开始" + stime + "预约结束" + etime); querySiteTimes.setSelectable(0); querySiteTimes.setIsReserve(1); } if (DateComparisonExample.isStringWithinTimeRange(stime, siteLock.getStartTime(), siteLock.getEndTime())) { System.err.println("22222预约开始" + stime + "预约结束" + etime); querySiteTimes.setSelectable(0); querySiteTimes.setIsReserve(1); } if (DateComparisonExample.isStringWithinTimeRange(etime, siteLock.getStartTime(), siteLock.getEndTime())) { System.err.println("33333预约开始" + stime + "预约结束" + etime); querySiteTimes.setSelectable(0); querySiteTimes.setIsReserve(1); } } timeRanges.add(querySiteTimes); } System.out.println("封装后的基础时间段和价格" + site); System.out.println("----最后封装的时间段数据------" + timeRanges); return timeRanges; } /** * 判断两个时间段是否有交集 * @param start1 第一个时间段开始时间 * @param end1 第一个时间段结束时间 * @param start2 第二个时间段开始时间 * @param end2 第二个时间段结束时间 * @return 如果有交集返回true,否则返回false */ private boolean isTimePeriodsIntersect(String start1, String end1, String start2, String end2) { // 首先判断是否有任何形式的重叠(包括端点) boolean hasOverlap = start1.compareTo(end2) <= 0 && end1.compareTo(start2) >= 0; // 判断是否仅仅是端点相接 boolean onlyTouching = start1.compareTo(end2) == 0 || end1.compareTo(start2) == 0; // 有重叠且不是仅仅端点相接才算真正的交集 return hasOverlap && !onlyTouching; } }