From 317392255ab65aa80ef841898cf8767e4700119d Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 31 十月 2025 19:19:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0' into 2.0

---
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TSiteServiceImpl.java |  201 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 201 insertions(+), 0 deletions(-)

diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TSiteServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TSiteServiceImpl.java
index 9e7fed5..84e2622 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TSiteServiceImpl.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TSiteServiceImpl.java
@@ -1,10 +1,30 @@
 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
@@ -12,4 +32,185 @@
  */
 @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;
+    }
 }

--
Gitblit v1.7.1