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<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);
|
|
|
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{
|
// 不能散客
|
System.err.println("不可预约 也不能散客");
|
querySiteTimes.setSelectable(0);
|
querySiteTimes.setIsReserve(0);
|
}
|
|
}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);
|
}
|
}
|
}
|
}
|
// 查出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;
|
}
|
}
|