You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
<?php
namespace App\Service\v3\Implementations;
use App\Constants\v3\ErrorCode;use App\Exception\ErrorCodeException;use App\Model\v3\ShoppingCart;use App\Model\v3\Store;use App\Service\v3\Interfaces\AppointmentTimeServiceInterface;use phpDocumentor\Reflection\Types\Object_;
class AppointmentTimeService implements AppointmentTimeServiceInterface{ public function do() { return [ '尽快送达', '08:30 - 09:00', '09:00 - 09:30', '09:30 - 10:00', '10:00 - 10:30' ]; }
public function check() { // TODO: Implement check() method.
}
public function undo() { // TODO: Implement undo() method.
}
public function get($shopcartIds) { $shopcartIds = explode(',',$shopcartIds); $sotreIds = ShoppingCart::query()->whereIn('id',$shopcartIds)->pluck('store_id'); $stores = Store::query()->whereIn('id',$sotreIds)->get()->toArray(); $time1Arr = []; $time2Arr = []; $time3Arr = []; $time4Arr = []; $nowTime = time(); //服务站最晚营业时间
if (env('APP_ENV') === 'prod') { $closedTime = strtotime(config('market.rest_time')); if($nowTime > $closedTime){ throw new ErrorCodeException(ErrorCode::MARKET_REST); } } //取得所有店铺营业时间交集
foreach($stores as $store){ //获取店铺开始营业时间
$time1 = strtotime(($store['time1'])); //店铺是否在营业时间 店铺手动点击休息 || 小于店铺开始营业时间 || 当前时间大于服务站休业时间
if($store['is_rest'] == 1 || $nowTime < $time1){ throw new ErrorCodeException(ErrorCode::STORE_REST); }
$time2 = strtotime(($store['time2'])); if(!empty($store['time3']) && !empty($store['time4'])){ $time3 = strtotime(($store['time3'])); $time4 = strtotime(($store['time4'])); array_push($time3Arr,$time3); array_push($time4Arr,$time4); $endTime = $time4; }else{ $endTime = $time2; } if($nowTime > $endTime){ throw new ErrorCodeException(ErrorCode::STORE_REST); } array_push($time1Arr,$time1); array_push($time2Arr,$time2); } $res = []; $time1Max = max($time1Arr); $time2Min = min($time2Arr); if($time2Min > $nowTime) { $res = array_merge($res,$this->calculateTime($time1Max, $time2Min)); } if(!empty($time3Arr) && !empty($time4Arr)){ $time3Max = max($time3Arr); $time4Min = min($time4Arr); if($time4Min > $nowTime) { $res = array_merge($res,$this->calculateTime($time3Max, $time4Min)); } } return $res; }
function calculateTime($startTime,$endTime) { $nowTime = time(); //如果开始时间小于当前时间则取当前时间
if($nowTime > $startTime){ $startTime = ceil($nowTime / (30*60)) * (30*60); } //高峰段 区间
$peakPeriod = strtotime('16:00'); $peakPeriodEnd = strtotime('18:00'); //取得订单下所有店铺时间段 交集 并计算时间段横跨单位区间长度
$length = ceil(($endTime - $startTime) / (30*60)) + 1; for ($i=1;$i<=$length;$i++){ $addTime = $startTime + (30*60*$i); if($addTime >= $peakPeriod && $addTime < $peakPeriodEnd){ $span = ($peakPeriodEnd - $addTime)/(30*60); $i+=$span; $addTime = $startTime + (30*60*$i); } $data['title'] = date('H:i',$addTime) . ' - ' . date('H:i',$addTime + (30*60)); $data['value'] = date('H:i',$addTime) . ' - ' . date('H:i',$addTime + (30*60)); $res[] = $data; } return $res; }}
|