如何构建具有重叠的基于时间的定价系统

时间:2015-11-11 00:39:47

标签: php mysql sql laravel laravel-5

我目前正在研究PHP中的预订系统(Laravel 5),我无法弄清楚如何建立一个基于时间的定价系统来计算带有重叠的总价格。预订与以下字段一起存储

Reservations (Table)

begindate_time (DateTime)
enddate_time (DateTime)
price (decimal(10,2))

我有一个价格表来查找输入开始时间和结束时间的价格,如下所示:

Prices (Table)

id (INT)
price (decimal(10,2))
begin_time (time)
end_time (time)
dayOfTheWeeks (varchar(255))

begin_time / end_time可以在00:00:00到23:59:59之间变化,dayOfTheWeeks是一个字符串,例如星期一,星期二,星期三。我知道每个领域应该只有一个值,但是我懒得在一周的几天里制作一张整张桌子。

根据活动链接到price_activity表的时间,您所拥有的活动链接到具有不同价格的预订,因为价格可能具有不同的活动

activity_price (Table)    

id
activity_id (INT)
price_id (INT)

我试图获得这样的活动和日期的价格,而不是我对它们进行排序,并且可以尝试循环它们并减去价格的结束时间减去预订的开始时间。这就是我想出来的但它没有用......

foreach($activity->prices()->orderBy('begin_time','asc')->get() as $price){

            $whichDayArray = explode(',',$price->dayOfTheWeeks);

            if(in_array($dayToday,$whichDayArray)){

            $prices = array();

                if(strtotime($price->end_time) > strtotime($input['begintime']) && strtotime($price->begin_time) < strtotime($input['endtime'])){
                    $prices[] = array('id' => $price->id,'price' => $price->price,'beginTimePrice' => $price->begin_time, 'endTimePrice' => $price->end_time);
                }

            }

}

这是很多代码,我现在的价格与预订重叠,但我如何计算预订的价格。我认为它可以比上面更容易和更好。

1 个答案:

答案 0 :(得分:0)

我已经解决了自己的问题。希望能帮助其他类似问题的人,我想解释一下我是如何解决问题的。

转储我的变量并对问题进行可视化后如下所示,我发现问题与我的查询有关。

[--pricerange1--][--pricerange2--][--pricerange2]
        [----------reservation-----------]

我必须在预订的开始时间和预订的结束时间之间的某一天获得活动的所有价格,之后我必须检查是否有一个价格,两个价格或超过2个价格。然后计算预订在某个范围内的小时数,并将其乘以一个范围的价格。这个代码看起来像这样:

$begintijd = \Carbon\Carbon::createFromTime(16,30);
$eindtijd = \Carbon\Carbon::createFromTime(20,30);

$activiteit = \App\Activiteit::find(1);

$prijzen = $activiteit->prices()->where('eindtijd','>=',$begintijd->toTimeString())->where('begintijd','<=',$eindtijd->toTimeString())->orderBy('begintijd','asc')->get();

$prijzenArray = array();

foreach($prijzen as $prijs){
    $whichDayArray = explode(',',$prijs->welkedagen);
    if(in_array('maandag',$whichDayArray)){
        $prijzenArray[] = array('prijs' => $prijs->prijs,'begintijdprijs' => $prijs->begintijd,'eindtijdprijs' => $prijs->eindtijd);
    }
}

$countPrijzen = count($prijzenArray);

if($countPrijzen == 1){
    $aantaluur = $begintijd->diffInMinutes($eindtijd) / 60;
    $totaalprijs = $aantaluur * $prijzenArray[0]['prijs'];
    echo('range1');
}

if($countPrijzen == 2){
    $aantaluurrange1 = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])->diffInMinutes($begintijd) / 60;
    $aantaluurrange2 = $eindtijd->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])) / 60;
    $totaalprijs = ($aantaluurrange1 * $prijzenArray[0]['prijs']) + ($aantaluurrange2 * $prijzenArray[1]['prijs']);
    echo('range2');
}

if($countPrijzen > 2){
    $aantaluurrange1 = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])->diffInMinutes($begintijd) / 60;
    $prijsrange1 = $prijzenArray[0]['prijs'] * $aantaluurrange1;

    $prijsertussen = 0;
    for($prijs=1;$prijs<($countPrijzen-1);$prijs++){
        $aantaluurertussen = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$prijs]['eindtijdprijs'])->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$prijs]['begintijdprijs'])) / 60;
        $prijsertussen += $prijzenArray[$prijs]['prijs'] * $aantaluurertussen;
    }

    $aantaluurlaatsterange = $eindtijd->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$countPrijzen-1]['begintijdprijs'])) / 60;
    $prijslaatsterange = $prijzenArray[$countPrijzen-1]['prijs'] * $aantaluurlaatsterange;

    $totaalprijs = $prijsrange1 + $prijsertussen + $prijslaatsterange;

}
相关问题