无关风月
2025-11-05 c52b1c1cbe3c000e4f2b6f9347440914aae1d528
cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
@@ -90,6 +90,8 @@
    private ISiteService siteService;
    /**
     * 获取场地列表
     *
@@ -100,11 +102,28 @@
    @Override
    public List<QuerySiteListVo> querySiteList(QuerySiteList querySiteList) throws Exception {
        querySiteList.setPageNum((querySiteList.getPageNum() - 1) * querySiteList.getPageSize());
        DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
        Map<Integer, List<TSitePrice>> priceMap = sitePriceService.lambdaQuery().eq(TSitePrice::getDayOfWeek, dayOfWeek.getValue())
                .eq(TSitePrice::getTargetAudience,1).list()
                .stream().collect(Collectors.groupingBy(TSitePrice::getSiteId));
        List<QuerySiteListVo> querySiteListVos = this.baseMapper.querySiteList(querySiteList);
        for (QuerySiteListVo querySiteListVo : querySiteListVos) {
            querySiteListVo.setPrice(0.0);
            if (ToolUtil.isEmpty(querySiteList.getLon())) {
                querySiteListVo.setDistance(0D);
                continue;
            }
            List<TSitePrice> tSitePrices = priceMap.get(querySiteListVo.getId());
            if (tSitePrices!=null&& !tSitePrices.isEmpty()){
                BigDecimal bigDecimal = tSitePrices.get(0).getCashPrice();
                // 遍历 查询最小的价格
                for (TSitePrice tSitePrice : tSitePrices) {
                    if (bigDecimal.compareTo(tSitePrice.getCashPrice()) > 0) {
                        bigDecimal = tSitePrice.getCashPrice();
                    }
                }
                querySiteListVo.setPrice(bigDecimal.doubleValue());
                querySiteListVo.setTimes(tSitePrices.get(0).getStartTime() + "-" + tSitePrices.get(tSitePrices.size()-1).getEndTime());
            }
            Map<String, Double> distance = GeodesyUtil.getDistance(querySiteList.getLon() + "," + querySiteList.getLat(), querySiteListVo.getStoreLon() + "," + querySiteListVo.getStoreLat());
            double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
@@ -137,7 +156,6 @@
            querySiteInfoVo.setTargetAudience(3);
        }
        querySiteInfoVo.setTargetAudience(3);
        querySiteInfoVo.setId(site.getId());
        querySiteInfoVo.setTypeName(site.getTypeName());
        querySiteInfoVo.setName(site.getName());
@@ -255,6 +273,7 @@
        }
        List<TSitePrice> sitePrice = sitePriceService.list(tSitePriceLambdaQueryWrapper);
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        for (TSitePrice tSitePrice : sitePrice) {
            QuerySiteTimes querySiteTimes = new QuerySiteTimes();
@@ -263,11 +282,15 @@
            querySiteTimes.setSelectCount(0);
            querySiteTimes.setSelectMaxCount(site.getWalkinCapacity());
            querySiteTimes.setIsReserve(0);
            querySiteTimes.setTimeAfter(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;
            // 散客预约人数
@@ -292,22 +315,38 @@
                    count++;
                }
            }
            if (querySiteTimes.getSelectable() == 1&&end.before(now)){
                querySiteTimes.setSelectable(0);
                querySiteTimes.setTimeAfter(1);
            }
            if (end.before(now)){
                querySiteTimes.setSelectable(0);
                querySiteTimes.setTimeAfter(1);
            }
            querySiteTimes.setSelectCount(count);
            if (flag == 0) {
            if (flag == 0 &&  querySiteTimes.getSelectable() == 1) {
                // 当前时间段还没有预约
                Integer walkinCapacity = site.getWalkinCapacity();
                // 计算散客预约人数和最大散客容纳数
                System.err.println("预约人数" + count);
                System.err.println("最大散客容纳数" + walkinCapacity);
                if (walkinCapacity <= count) {
                    // 不可预约 也不能散客
                    System.err.println("不可预约 也不能散客");
                    querySiteTimes.setSelectable(0);
                    querySiteTimes.setIsReserve(0);
                    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){
                        // 散客只能预约当前时间段
                        Date now = new Date();
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                        String nowStr = simpleDateFormat.format(now);
                        // 判断当前时间有没有在timePriceStart和timePriceEnd之间
@@ -585,13 +624,17 @@
        siteBooking.setBooker(reservationSite.getBooker());
        siteBooking.setPhone(reservationSite.getPhone());
        siteBooking.setPayType(reservationSite.getPayType());
        siteBooking.setPayMoney(money.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
        if (reservationSite.getPayType()==3){
            siteBooking.setPayMoney(playCoin.doubleValue());
        }else{
            siteBooking.setPayMoney(money.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
        }
        siteBooking.setUserCouponId(reservationSite.getCouponId());
        siteBooking.setStatus(0);
        siteBooking.setState(1);
        siteBooking.setTargetAudience(reservationSite.getTargetAudience());
        siteBooking.setInsertTime(new Date());
        siteBooking.setMoney(money+","+playCoin);
        siteBooking.setNextName(reservationSite.getNextName());
        siteBooking.setIsHalf(reservationSite.getIsHalf());
        siteBooking.setHalfName(reservationSite.getHalfName());
@@ -817,17 +860,39 @@
        List<QueryMySiteVo> queryMySiteVos = this.baseMapper.queryMySite(uid, status, pageNo, pageSize);
        for (QueryMySiteVo queryMySiteVo : queryMySiteVos) {
            SiteBooking siteBooking = siteBookingService.getById(queryMySiteVo.getId());
            Site site = this.getById(siteBooking.getSiteId());
            String[] split = siteBooking.getTimes().split(";");
            if (site != null) {
                if (queryMySiteVo.getIsHalf() == 1) {
                    queryMySiteVo.setPlayPaiCoin((int) (site.getPlayPaiCoinOne() * split.length));
            // 所选时间段 所需总计金额
            BigDecimal money = BigDecimal.ZERO;
            BigDecimal playCoin = BigDecimal.ZERO;
            for (String s : split) {
                } else {
                    queryMySiteVo.setPlayPaiCoin(site.getPlayPaiCoin() * split.length);
                String day = s.split(" ")[0];
                String time = s.split(" ")[1];
                String bookingStart = day + " " + time.split("-")[0];
                String bookingEnd = day + " " + time.split("-")[1];
                List<QuerySiteTimes> querySiteTimes = querySiteTimes(siteBooking.getId(), day, siteBooking.getHalfName(), siteBooking.getNextName(), siteBooking.getTargetAudience());
                for (QuerySiteTimes querySiteTime : querySiteTimes) {
                    String timePriceStart = day + " " + querySiteTime.getTime().split("-")[0];
                    String timePriceEnd = day + " " + querySiteTime.getTime().split("-")[1];
//                    if (!isTimePeriodsIntersect(timePriceStart, timePriceEnd, bookingStart, bookingEnd)) {
//                        // 时间不相交
//                    } else if (querySiteTime.getSelectable() == 0) {
//                        if (querySiteTime.getIsReserve() == 1) {
//                            return ResultUtil.error("【" + s + "】" +
//                                    "时间段已被使用");
//                        } else {
//                            return ResultUtil.error("【" + s + "】" +
//                                    "时间段散客人数已满");
//                        }
//                    }
                    if (querySiteTime.getTime().equals(time)) {
                        money = money.add(querySiteTime.getCashPrice());
                        playCoin = playCoin.add(querySiteTime.getCoinPrice());
                        break;
                    }
                }
            }
            queryMySiteVo.setPlayPaiCoin(playCoin.setScale(0, RoundingMode.DOWN).intValue());
        }
        return queryMySiteVos;
    }
@@ -967,23 +1032,34 @@
        Site site = this.getById(siteBooking.getSiteId());
        AppUser appUser = appUserClient.queryAppUser(uid);
        String[] split = siteBooking.getTimes().split(";");
        Double payMoney = 0D;
        if (payType == 3) {
//            payMoney = new BigDecimal(site.getPlayPaiCoin()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
            if (appUser.getPlayPaiCoins().compareTo(payMoney.intValue()) < 0) {
                return ResultUtil.error("玩湃币不足");
            }
            if (siteBooking.getIsHalf() == 2) {
                payMoney = new BigDecimal(site.getPlayPaiCoin()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
            } else {
                payMoney = new BigDecimal(site.getPlayPaiCoinOne()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
            }
        } else {
            if (siteBooking.getIsHalf() == 2) {
                payMoney = new BigDecimal(site.getCashPrice()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
            } else {
                payMoney = new BigDecimal(site.getCashPriceOne()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        // 所选时间段 所需总计金额
        BigDecimal money = BigDecimal.ZERO;
        BigDecimal playCoin = BigDecimal.ZERO;
        for (String s : split) {
            String day = s.split(" ")[0];
            String time = s.split(" ")[1];
            String bookingStart = day + " " + time.split("-")[0];
            String bookingEnd = day + " " + time.split("-")[1];
            List<QuerySiteTimes> querySiteTimes = querySiteTimes(siteBooking.getId(), day, siteBooking.getHalfName(), siteBooking.getNextName(), siteBooking.getTargetAudience());
            for (QuerySiteTimes querySiteTime : querySiteTimes) {
                String timePriceStart = day + " " + querySiteTime.getTime().split("-")[0];
                String timePriceEnd = day + " " + querySiteTime.getTime().split("-")[1];
                if (!isTimePeriodsIntersect(timePriceStart, timePriceEnd, bookingStart, bookingEnd)) {
                    // 时间不相交
                } else if (querySiteTime.getSelectable() == 0) {
                    if (querySiteTime.getIsReserve() == 1) {
                        return ResultUtil.error("【" + s + "】" +
                                "时间段已被使用");
                    } else {
                        return ResultUtil.error("【" + s + "】" +
                                "时间段散客人数已满");
                    }
                }
                if (querySiteTime.getTime().equals(time)) {
                    money = money.add(querySiteTime.getCashPrice());
                    playCoin = playCoin.add(querySiteTime.getCoinPrice());
                    break;
                }
            }
        }
@@ -997,12 +1073,12 @@
                JSONObject jsonObject = JSON.parseObject(coupon.getContent());
                Double num1 = jsonObject.getDouble("conditionalAmount");
                Double num2 = jsonObject.getDouble("deductionAmount");
                payMoney = new BigDecimal(payMoney).subtract(new BigDecimal(num2)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                money = money.subtract(new BigDecimal(num2)).setScale(2, RoundingMode.HALF_EVEN);
            }
            if (coupon.getType() == 2) {//代金券
                JSONObject jsonObject = JSON.parseObject(coupon.getContent());
                Double num1 = jsonObject.getDouble("conditionalAmount");
                payMoney = new BigDecimal(payMoney).subtract(new BigDecimal(num1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                money = money.subtract(new BigDecimal(num1)).setScale(2, RoundingMode.HALF_EVEN);
            }
            userCoupon.setStatus(2);
            userCouponClient.updateUserCoupon(userCoupon);
@@ -1016,19 +1092,19 @@
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        siteBooking.setOrderNo(sdf.format(new Date()) + UUIDUtil.getNumberRandom(3));
        siteBooking.setPayType(payType);
        siteBooking.setPayMoney(payMoney);
        siteBooking.setPayMoney(money.doubleValue());
        if (payType == 3) {
            siteBooking.setUserCouponId(null);
        }
        siteBookingService.updateById(siteBooking);
        if (payType == 1) {//微信支付
            return weChatPaymentSite(payMoney, siteBooking);
            return weChatPaymentSite(money.doubleValue(), siteBooking);
        }
        if (payType == 2) {//支付宝支付
            return aliPaymentSite(payMoney, siteBooking);
            return aliPaymentSite(money.doubleValue(), siteBooking);
        }
        if (payType == 3) {//玩湃币支付
            return playPaiCoinPaymentSite(appUser, payMoney, siteBooking);
            return playPaiCoinPaymentSite(appUser, playCoin.doubleValue(), siteBooking);
        }
        return ResultUtil.success();
    }
@@ -1050,22 +1126,35 @@
        Site site = this.getById(siteBooking.getSiteId());
        String[] split = siteBooking.getTimes().split(";");
        Map<String, Double> map = new HashMap<>();
        Double payMoney = new BigDecimal(site.getPlayPaiCoin()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        if (siteBooking.getIsHalf() == 2) {
            payMoney = new BigDecimal(site.getPlayPaiCoin()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        } else {
            payMoney = new BigDecimal(site.getPlayPaiCoinOne()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        }
        map.put("playPaiCoin", payMoney);
        payMoney = new BigDecimal(site.getCashPrice()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        if (siteBooking.getIsHalf() == 2) {
            payMoney = new BigDecimal(site.getCashPrice()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        } else {
            payMoney = new BigDecimal(site.getCashPriceOne()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
        // 所选时间段 所需总计金额
        BigDecimal money = BigDecimal.ZERO;
        BigDecimal playCoin = BigDecimal.ZERO;
        for (String s : split) {
            String day = s.split(" ")[0];
            String time = s.split(" ")[1];
            String bookingStart = day + " " + time.split("-")[0];
            String bookingEnd = day + " " + time.split("-")[1];
            List<QuerySiteTimes> querySiteTimes = querySiteTimes(siteBooking.getId(), day, siteBooking.getHalfName(), siteBooking.getNextName(), siteBooking.getTargetAudience());
            for (QuerySiteTimes querySiteTime : querySiteTimes) {
                String timePriceStart = day + " " + querySiteTime.getTime().split("-")[0];
                String timePriceEnd = day + " " + querySiteTime.getTime().split("-")[1];
                if (!isTimePeriodsIntersect(timePriceStart, timePriceEnd, bookingStart, bookingEnd)) {
                    // 时间不相交
                } else if (querySiteTime.getSelectable() == 0) {
                    if (querySiteTime.getIsReserve() == 1) {
                        return ResultUtil.error("【" + s + "】" +
                                "时间段已被使用");
                    } else {
                        return ResultUtil.error("【" + s + "】" +
                                "时间段散客人数已满");
                    }
                }
                if (querySiteTime.getTime().equals(time)) {
                    money = money.add(querySiteTime.getCashPrice());
                    playCoin = playCoin.add(querySiteTime.getCoinPrice());
                    break;
                }
            }
        }
        //校验优惠券
@@ -1078,15 +1167,24 @@
                JSONObject jsonObject = JSON.parseObject(coupon.getContent());
                Double num1 = jsonObject.getDouble("conditionalAmount");
                Double num2 = jsonObject.getDouble("deductionAmount");
                payMoney = new BigDecimal(payMoney).subtract(new BigDecimal(num2)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                money = money.subtract(new BigDecimal(num2)).setScale(2, RoundingMode.HALF_EVEN);
            }
            if (coupon.getType() == 2) {//代金券
                JSONObject jsonObject = JSON.parseObject(coupon.getContent());
                Double num1 = jsonObject.getDouble("conditionalAmount");
                payMoney = new BigDecimal(payMoney).subtract(new BigDecimal(num1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                money = money.subtract(new BigDecimal(num1)).setScale(2, RoundingMode.HALF_EVEN);
            }
        }
        map.put("cash", payMoney);
        switch (siteBooking.getPayType()){
            case 1:
                map.put("cash", money.doubleValue());
                break;
            case 2:
                map.put("cash", money.doubleValue());
                break;
            case 3:
                map.put("cash", playCoin.doubleValue());
        }
        return ResultUtil.success(map);
    }