| | |
| | | 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 |
| | |
| | | */ |
| | | @Service |
| | | public class TSiteServiceImpl extends ServiceImpl<TSiteMapper, TSite> implements ITSiteService { |
| | | @Autowired |
| | | private ISiteLockService siteLockService; |
| | | @Autowired |
| | | private ISiteBookingService iSiteBookingService; |
| | | @Autowired |
| | | private ITSitePriceService itSitePriceService; |
| | | @Override |
| | | public List<QuerySiteTimes> querySiteTimes(Integer id, String day, String halfName, String siteName, Integer targetAudience) throws ParseException { |
| | | |
| | | System.out.println("=======date======" + day); |
| | | List<String> strings = new ArrayList<>(); |
| | | |
| | | List<SiteBooking> siteBookings = iSiteBookingService.list(new QueryWrapper<SiteBooking>().eq("siteId", id).ne("status", 5).eq("nextName", siteName).like("times", day)); |
| | | |
| | | if (StringUtils.isBlank(siteName)) { |
| | | siteBookings = iSiteBookingService.list(new QueryWrapper<SiteBooking>().eq("siteId", id).ne("status", 5).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<QuerySiteTimes> timeRanges = new ArrayList<>(); |
| | | day = day.split(";")[0].split(" ")[0]; |
| | | LocalDate date = LocalDate.parse(day); |
| | | DayOfWeek dayOfWeek = date.getDayOfWeek(); |
| | | // 通过日期 确定周X 查询设置的可以约时间段和金额 封装基础时间段数据 |
| | | LambdaQueryWrapper<TSitePrice> 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<TSitePrice> sitePrice = itSitePriceService.list(tSitePriceLambdaQueryWrapper); |
| | | |
| | | |
| | | 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); |
| | | // 已经预约了 判断是散客模式还是订场模式 |
| | | 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++; |
| | | } |
| | | } |
| | | querySiteTimes.setSelectCount(count); |
| | | if (flag == 0) { |
| | | // 当前时间段还没有预约 |
| | | Integer walkinCapacity = site.getWalkinCapacity(); |
| | | // 计算散客预约人数和最大散客容纳数 |
| | | System.err.println("预约人数" + count); |
| | | System.err.println("最大散客容纳数" + walkinCapacity); |
| | | if (walkinCapacity <= count) { |
| | | // 不可预约 也不能散客 |
| | | System.err.println("不可预约 也不能散客"); |
| | | querySiteTimes.setSelectable(0); |
| | | querySiteTimes.setIsReserve(0); |
| | | }else{ |
| | | if (targetAudience==2){ |
| | | // 散客只能预约当前时间段 |
| | | Date now = new Date(); |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // 查出lock |
| | | List<SiteLock> list = siteLockService.list(new LambdaQueryWrapper<SiteLock>().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; |
| | | } |
| | | } |