whereIn('id',$shopcartIds)->pluck('store_id'); $stores = Store::query()->whereIn('id',$sotreIds)->get()->toArray(); if(empty($stores)){ $msg = ['sotreIds'=>$sotreIds,"shopcartIds"=>$shopcartIds]; throw new ErrorCodeException(ErrorCode::STORE_NOT_AVAILABLE,'',$msg); } $nowTime = time(); $startTime = ceil($nowTime / (30*60)) * (30*60); //服务站最晚营业时间 if (env('APP_ENV') === 'prod') { $endTime = strtotime(config('market.rest_time')); if($nowTime > $endTime){ throw new ErrorCodeException(ErrorCode::MARKET_REST); } }else{ $endTime = strtotime(date('Y-m-d 23:59:59')); } //取得所有店铺营业时间交集 for($i = $startTime;$i<= $endTime;$i+=1800){ $in = true; foreach($stores as $store){ $time1 = strtotime(($store['time1'])); $time2 = strtotime(($store['time2'])); if(empty($store['time3']) || empty($store['time4'])) { if($i < $time1 || $i > $time2){ $in = false; continue; } }else{ $time3 = strtotime(($store['time3'])) ; $time4 = strtotime(($store['time4'])); if(($i < $time1 || $i > $time2) && ($i < $time3 || $i > $time4)){ $in = false; continue; } } } if($in){ if($i === $startTime){ $res['distribution'][] = ['title'=>'尽快送达','value'=>'尽快送达']; $res['self_take'][] = ['title'=>'尽快自提','value'=>'尽快自提']; } $data['title'] = date('H:i',$i + 30 * 60) . ' - ' . date('H:i',$i + 30 * 60 * 2); $data['value'] = date('H:i',$i + 30 * 60) . ' - ' . date('H:i',$i + 30 * 60 * 2); $res['distribution'][] = $data; $res['self_take'][]= $data; } } // 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); } if (env('APP_ENV') === 'prod') { $closedTime = strtotime(config('market.rest_time')); if($closedTime < $endTime){ $endTime = $closedTime; } } //高峰段 区间 // $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; } }