截单时间
This commit is contained in:
@@ -34,6 +34,10 @@ class OrderController extends BaseMiniController
|
||||
public function store(MiniOrderRequest $request): JsonResponse
|
||||
{
|
||||
$store = $this->currentStore($request);
|
||||
|
||||
// 截单时间校验:业务配置 services.order_time_start / order_time_end,均未配置时不限制
|
||||
$this->assertWithinOrderTimeWindow();
|
||||
|
||||
$level = $store->level_id > 0 ? $store->level : null;
|
||||
if ($level === null) {
|
||||
throw new RepositoryException('门店未设置客户等级,无法下单,请联系客服');
|
||||
@@ -321,4 +325,44 @@ class OrderController extends BaseMiniController
|
||||
|
||||
return $this->success([], '订单已取消');
|
||||
}
|
||||
|
||||
/**
|
||||
* 截单时间校验:业务配置 services.order_time_start / order_time_end(HH:mm)
|
||||
* 均留空不限制;只配一端按单边限制;开始时间晚于截单时间表示跨天时段(如 20:00-次日06:00);
|
||||
* 格式非法的配置按未配置处理,避免误配置导致全天无法下单
|
||||
*/
|
||||
private function assertWithinOrderTimeWindow(): void
|
||||
{
|
||||
$parse = static function (mixed $value): ?int {
|
||||
$value = trim((string) $value);
|
||||
if (! preg_match('/^([01]?\d|2[0-3]):([0-5]\d)$/', $value, $matches)) {
|
||||
return null;
|
||||
}
|
||||
return (int) $matches[1] * 60 + (int) $matches[2];
|
||||
};
|
||||
|
||||
$startText = trim((string) site_config('services.order_time_start', ''));
|
||||
$endText = trim((string) site_config('services.order_time_end', ''));
|
||||
$start = $parse($startText);
|
||||
$end = $parse($endText);
|
||||
if ($start === null && $end === null) {
|
||||
return;
|
||||
}
|
||||
if ($start !== null && $start === $end) {
|
||||
return;
|
||||
}
|
||||
|
||||
$now = (int) now()->format('H') * 60 + (int) now()->format('i');
|
||||
$allowed = match (true) {
|
||||
// 跨天时段:当晚开始时间之后 或 次日截单时间之前
|
||||
$start !== null && $end !== null && $start > $end => $now >= $start || $now <= $end,
|
||||
$start !== null && $end !== null => $now >= $start && $now <= $end,
|
||||
$start !== null => $now >= $start,
|
||||
default => $now <= $end,
|
||||
};
|
||||
if (! $allowed) {
|
||||
$window = ($startText !== '' ? $startText : '00:00') . ' - ' . ($endText !== '' ? $endText : '24:00');
|
||||
throw new RepositoryException('当前不在下单时段内(下单时间 ' . $window . '),请在规定时间内下单');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user