预约时隙,带设备库存查询,在laravel中

dpiehjr4  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(294)

给你们大家一个有趣的例子。我发现自己陷入了一个实施难题。
我正在laravel开发一个预订应用程序,允许人们在特定时间预订房间和设备。可用设备的数量是有限的,因此库存量必须与预订相关的时间段同时查询。
我想我已经解决了这个问题,通过遍历同时发生的“其他预订”并计算当前正在使用的商品->然后对照库存检查。
对于我90%的测试,这是工作良好,但刚刚设法找到一个错误,将不允许我这样做。

$guitarheadcount = 0;
    $guitarcabcount = 0;
    $guitarcombocount = 0;
    $bassheadcount = 0;
    $basscabcount = 0;
    $basscombocount = 0;
    $drumkitcount = 0;
    $cymbalscount = 0;

    $otherbookings = Booking::where('Room_id', '!=', $bookinginfo->Room_id)
        ->where(function ($query) use ($begin, $end) {
            $query->where(function ($q) use ($begin, $end) {
                $q->where('Booking_start', '>=', $begin)
                ->where('Booking_start', '<', $end);
            })->orWhere(function ($q) use ($begin, $end) {
                $q->where('Booking_start', '<=', $begin)
                ->where('Booking_end', '>', $end);
            })->orWhere(function ($q) use ($begin, $end) {
                $q->where('Booking_end', '>', $begin)
                ->where('Booking_end', '<=', $end);
            })->orWhere(function ($q) use ($begin, $end) {
                $q->where('Booking_start', '>=', $begin)
                ->where('Booking_end', '<=', $end);
            });
    })->get();

   //'amounts' are attributes for Booking objects. 

    foreach($otherbookings as $other){
        $guitarheadcount = $other->Equip->guitarheadamount + $guitarheadcount;
        $guitarcabcount = $other->Equip->guitarcabamount + $guitarcabcount;
        $guitarcombocount = $other->Equip->guitarcomboamount + $guitarcombocount;
        $bassheadcount = $other->Equip->bassheadamount + $bassheadcount;
        $basscabcount = $other->Equip->basscabamount + $basscabcount;
        $basscombocount = $other->Equip->basscomboamount + $basscombocount;
        $drumkitcount = $other->Equip->drumkitamount + $drumkitcount;
        $cymbalscount = $other->Equip->cymbalsamount + $cymbalscount;
    }

然后我使用个别if语句来重定向计数是否大于股票中的金额。
这个bug的一个例子是:
库存2个鼓包。订一张下午1-2点的票。。。下午2-3点,另一个在同一个房间。都需要一个鼓。
如果我试着从下午1点到3点在另一个地方预订的话,就算有一套鼓是免费的(如果有意义的话),数量已经是2了。
我真的被难住了。如果我需要:
继续“计数”,但是对于与另一个(?)在同一个房间的每一个项目,产生一个扣减1的值。
我是否应该完全报废计数和写每个设备项目的个人查询。。。我怎么会这么做!
任何帮助都将不胜感激。

vcudknz3

vcudknz31#

我将进一步测试这个,但我想我可能已经提出了一个解决方案。
我已经拥有的:
在选定的时间范围内获取所有冲突预订的机制。它可以提供集合中包含的所有项的计数。它不知道的是,在预订过程中,库存是否会用完。
解决方案(到目前为止,早期测试正在工作)。
我使用orderby按开始时间对原始查询结果进行排序。
我用foreach把它们都翻了一遍。
我在循环外定义了几个数组,可以使用它们将之前循环的属性传递回下一个循环。如果没有发现计数错误,则在末尾覆盖。
然后,我创建了一些if语句,用于检查下一个预订与上一个预订之间的差异。
如果下一个开始在上一个结束之前,那么我创建了另一个数组来传递当前值,为if中的每个数组启动另一个数组,然后对该时间范围内的所有预订进行重新计数。然后,如果计数再次超出可用库存,它就会爆发并重新定向。
当这个循环完成后,我们继续上一个循环。
为意大利面密码道歉。

$first = $otherbookings->first();

    if ($first == null){

    }else{
       $previous = [];
    $previous ['id'] = $first->id;
    $previous ['Booking_end'] = $first->Booking_end;
    }

    $tempdrumkitcount = 0;

    foreach($otherbookings as $other){

        if($previous ['id'] == $other->id){

            $drumkitcount = (int)$first->Equip->drumkitamount;
            //check
            if(($currenthireprices->drumkitstock - ($other->drumkitamount + $drumkitcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Check 1 error");
            }
        }
        else{
            if($previous ['Booking_end'] > $other->Booking_start){

                $current ['id'] = $other->id;
                $current ['Booking_start'] = $other->Booking_start;
                $current ['Booking_end'] = $other->Booking_end;

                foreach($otherbookings as $newother){

                    if($newother->id != $current ['id']){

                        if(($newother->Booking_start < $current ['Booking_start']) && ($newother->Booking_end > $current ['Booking_start'] )){
                            $tempdrumkitcount = $tempdrumkitcount + $newother->Equip->drumkitamount;
                        }
                        if(($newother->Booking_start > $current ['Booking_start']) && ($newother->Booking_end < $current ['Booking_end'] )){
                            $tempdrumkitcount = $tempdrumkitcount + $newother->Equip->drumkitamount;
                        }
                        if(($currenthireprices->drumkitstock - ($drumkitamount + $tempdrumkitcount)) < 0){
                            return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 100 [Cummalative Check]).");
                        }
                    }

                }
                $drumkitcount = $other->Equip->drumkitamount + $drumkitcount;

                if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
                    return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 150 [Non-Cummalative Check]).");
                }
                $drumkitcount =  $drumkitcount - $previous ['drumkitamount'];
            }
            if($previous ['Booking_end'] <= $other->Booking_start){
                $drumkitcount =  $drumkitcount - $previous ['drumkitamount'];
                $drumkitcount = $drumkitcount + $other->Equip->drumkitamount;

                if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
                    return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 200 [Non-overlap main check]).");
                }
            }
        }

        $previous ['id'] = $other->id;
        $previous ['Booking_end'] = $other->Booking_end;
        $previous ['drumkitamount'] = $other->Equip->drumkitamount;
    }
r9f1avp5

r9f1avp52#

虽然我之前的答案看起来很有希望。。。随着库存量和相邻预订量的增加,它开始出现无法纠正的计数错误。
我重新考虑了一下,想出了一个更好的解决办法。无论如何,用户只能预订至少30分钟的时段。
因此,使用do/while循环,对于用户选择的时隙每增加30分钟,它将执行一次库存检查。
我敢肯定,这是不是伟大的锤打服务器,但至少有一个固定的时间,它将被查询在预订。

///STOCK CHECK

    $stockcheckbegin = $begin;
    $stockcheckend = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($begin)));

    $tempguitarheadcount = 0;
    $tempguitarcabcount = 0;
    $tempguitarcombocount = 0;
    $tempbassheadcount = 0;
    $tempbasscabcount = 0;
    $tempbasscombocount = 0;
    $tempdrumkitcount = 0;
    $tempcymbalscount = 0;

    do {
        $otherbookings = Booking::orderby('Booking_start', 'ASC')
        ->where(function ($query) use ($stockcheckbegin, $stockcheckend) {
            $query->where(function ($q) use ($stockcheckbegin, $stockcheckend) {
                $q->where('Booking_start', '>=', $stockcheckbegin)
                ->where('Booking_start', '<', $stockcheckend);
            })->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
                $q->where('Booking_start', '<=', $stockcheckbegin)
                ->where('Booking_end', '>', $stockcheckend);
            })->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
                $q->where('Booking_end', '>', $stockcheckbegin)
                ->where('Booking_end', '<=', $stockcheckend);
            })->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
                $q->where('Booking_start', '>=', $stockcheckbegin)
                ->where('Booking_end', '<=', $stockcheckend);
            });
        })->get();

        foreach($otherbookings as $other){

            $tempguitarheadcount = $tempguitarheadcount + $other->Equip->guitarheadamount;
            $tempguitarcabcount = $tempguitarcabcount + $other->Equip->guitarcabamount;
            $tempguitarcombocount = $tempguitarcombocount + $other->Equip->guitarcomboamount;
            $tempbassheadcount = $tempbassheadcount + $other->Equip->bassheadamount;
            $tempbasscabcount = $tempbasscabcount + $other->Equip->basscabamount;
            $tempbasscombocount = $tempbasscombocount + $other->Equip->basscomboamount;
            $tempdrumkitcount = $tempdrumkitcount + $other->Equip->drumkitamount;
            $tempcymbalscount = $tempcymbalscount + $other->Equip->cymbalsamount;

            if(($currenthireprices->guitarheadstock - ($guitarheadamount + $tempguitarheadcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Head' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->guitarcabstock - ($guitarcabamount + $tempguitarcabcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Cab' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->guitarcombostock - ($guitarcomboamount + $tempguitarcombocount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Combo' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->bassheadstock - ($bassheadamount + $tempbassheadcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Head' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->basscabstock - ($basscabamount + $tempbasscabcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Cab' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->basscombostock - ($basscomboamount + $tempbasscombocount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Combo' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->drumkitstock - ($drumkitamount + $tempdrumkitcount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Drum kit' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
            if(($currenthireprices->cymbalsstock - ($cymbalsamount + $tempcymbalscount)) < 0){
                return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our sets of 'Cymbals' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
            }
        }

            $tempguitarheadcount = 0;
            $tempguitarcabcount = 0;
            $tempguitarcombocount = 0;
            $tempbassheadcount = 0;
            $tempbasscabcount = 0;
            $tempbasscombocount = 0;
            $tempdrumkitcount = 0;
            $tempcymbalscount = 0;

            $stockcheckbegin = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($stockcheckbegin)));
            $stockcheckend = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($stockcheckend)));

    } while ($stockcheckbegin != $end);

    if(($currenthireprices->guitarheadstock - ($guitarheadamount + $guitarheadcount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarheadamount guitar heads available between $timestart and $timeend. There's $currenthireprices->guitarheadstock in stock and $guitarheadcount in use.");
    }
    if(($currenthireprices->guitarcabstock - ($guitarcabamount + $guitarcabcount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarcabamount 'Guitar cabs' available between $timestart and $timeend. There's $currenthireprices->guitarcabstock in stock and $guitarcabcount in use.");
    }
    if(($currenthireprices->guitarcombostock - ($guitarcomboamount + $guitarcombocount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarcomboamount 'Guitar combos' available between $timestart and $timeend. There's $currenthireprices->guitarcombostock in stock and $guitarcombocount in use.");
    }
    if(($currenthireprices->bassheadstock - ($bassheadamount + $bassheadcount)) < 0) {
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $bassheadamount 'Bass heads' available between $timestart and $timeend. There's $currenthireprices->bassheadstock in stock and $bassheadcount in use.");
    }
    if(($currenthireprices->basscabstock - ($basscabamount + $basscabcount)) < 0) {
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $basscabamount 'Bass cabs' available between $timestart and $timeend. There's $currenthireprices->basscabstock in stock and $basscabcount in use.");
    }
    if(($currenthireprices->basscombostock - ($basscomboamount + $basscombocount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $basscomboamount 'Bass combos' available between $timestart and $timeend. There's $currenthireprices->basscombostock in stock and $basscombocount in use.");
    }
    if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend. There's $currenthireprices->drumkitstock in stock and $drumkitcount in use.");
    }
    if(($currenthireprices->cymbalsstock - ($cymbalsamount + $cymbalscount)) < 0){
        return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $cymbalsamount 'sets of cymbals' available between $timestart and $timeend. There's $currenthireprices->cymbalsstock in stock and $cymbalscount in use.");
    }

    //----- END OF STOCK CHECK

相关问题