Работа над сайтом 15
This commit is contained in:
parent
bf821a9819
commit
b3b5111006
|
@ -97,6 +97,7 @@ $config = [
|
|||
'product/<catn:[^/]+>' => 'product/index',
|
||||
'<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>',
|
||||
'orders' => 'order/index',
|
||||
'orders/<type:[^/]+>' => 'order/index',
|
||||
'orders/<_key:[^/]+>/<action:(accept)>' => 'order/<action>',
|
||||
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>',
|
||||
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>',
|
||||
|
|
|
@ -76,13 +76,13 @@ class AuthenticationController extends Controller
|
|||
// Запись ответа
|
||||
$return['redirect'] = '/' . $cookies['redirect'];
|
||||
|
||||
try {
|
||||
if (empty($return['main'] = $this->renderPartial($return['redirect']))) {
|
||||
throw new Exception('Представление найдено, но вернуло пустой результат');
|
||||
}
|
||||
} catch (Throwable $t) {
|
||||
$return['main'] = $this->renderPartial($return['redirect'] . '/index');
|
||||
}
|
||||
// try {
|
||||
// if (empty($return['main'] = $this->renderPartial($return['redirect']))) {
|
||||
// throw new Exception('Представление найдено, но вернуло пустой результат');
|
||||
// }
|
||||
// } catch (Throwable $t) {
|
||||
// $return['main'] = $this->renderPartial($return['redirect'] . '/index');
|
||||
// }
|
||||
|
||||
// Генерация и запись
|
||||
// $controller = 'app\\controllers\\' . ucfirst($cookies['redirect']) . 'Controller';
|
||||
|
@ -91,6 +91,11 @@ class AuthenticationController extends Controller
|
|||
|
||||
// Очистка cookie
|
||||
unset(yii::$app->response->cookies['redirect']);
|
||||
|
||||
yii::$app->response->format = Response::FORMAT_HTML;
|
||||
|
||||
// Переадресация
|
||||
return $this->redirect($return['redirect']);
|
||||
} else {
|
||||
// Не найдено cookie с переадресацией
|
||||
|
||||
|
|
|
@ -90,10 +90,10 @@ class OrderController extends Controller
|
|||
}
|
||||
}
|
||||
|
||||
public function actionIndex()
|
||||
public function actionIndex(string $type = 'all')
|
||||
{
|
||||
// Инициализация
|
||||
$orders = Order::search(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}', supplies: true);
|
||||
$orders = Order::search(type: $type, limit: 10, page: 1, select: '{account_edge_order, order}', supplies: true);
|
||||
$moderator_orders = self::genOrdersForModeration();
|
||||
|
||||
if (yii::$app->request->isPost) {
|
||||
|
|
|
@ -31,11 +31,6 @@ class ProfileController extends Controller
|
|||
'roles' => ['@'],
|
||||
'actions' => ['index', 'supplies', 'import', 'monitoring', 'readGroups']
|
||||
],
|
||||
[
|
||||
'allow' => false,
|
||||
'roles' => ['?'],
|
||||
'denyCallback' => [$this, 'accessDenied']
|
||||
],
|
||||
[
|
||||
'allow' => true,
|
||||
'actions' => ['panel', 'panel-notification-write'],
|
||||
|
@ -49,6 +44,11 @@ class ProfileController extends Controller
|
|||
|
||||
return false;
|
||||
}
|
||||
],
|
||||
[
|
||||
'allow' => false,
|
||||
'roles' => ['?'],
|
||||
'denyCallback' => [$this, 'accessDenied']
|
||||
]
|
||||
]
|
||||
]
|
||||
|
|
|
@ -68,10 +68,27 @@ class RegistrationController extends Controller
|
|||
|
||||
// Запись ответа
|
||||
$return['redirect'] = '/' . $cookies['redirect'];
|
||||
$return['main'] = $this->renderPartial($return['redirect'] . '/index');
|
||||
|
||||
// try {
|
||||
// if (empty($return['main'] = $this->renderPartial($return['redirect']))) {
|
||||
// throw new Exception('Представление найдено, но вернуло пустой результат');
|
||||
// }
|
||||
// } catch (Throwable $t) {
|
||||
// $return['main'] = $this->renderPartial($return['redirect'] . '/index');
|
||||
// }
|
||||
|
||||
// Генерация и запись
|
||||
// $controller = 'app\\controllers\\' . ucfirst($cookies['redirect']) . 'Controller';
|
||||
// $action = 'action' . ucfirst($cookies['redirect_action']);
|
||||
// $return['main'] = (new $controller())->$action();
|
||||
|
||||
// Очистка cookie
|
||||
unset(yii::$app->response->cookies['redirect']);
|
||||
|
||||
yii::$app->response->format = Response::FORMAT_HTML;
|
||||
|
||||
// Переадресация
|
||||
return $this->redirect($return['redirect']);
|
||||
} else {
|
||||
// Не найдено cookie с переадресацией
|
||||
|
||||
|
|
|
@ -186,6 +186,7 @@ class SearchController extends Controller
|
|||
|
||||
try {
|
||||
// Инициализация данных геолокации
|
||||
|
||||
try {
|
||||
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||
} catch (Exception $e) {
|
||||
|
@ -246,11 +247,13 @@ class SearchController extends Controller
|
|||
$connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
||||
|
||||
// Инициализация версии для рассчета доставки по воздуху
|
||||
$buffer = $connection;
|
||||
$buffer_delivery_avia = $connection;
|
||||
|
||||
try { // Инициализация данных геолокации
|
||||
try {
|
||||
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||
// Инициализация данных геолокации
|
||||
|
||||
try {
|
||||
$from = (int) $buffer_delivery_avia['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||
} catch (Exception $e) {
|
||||
$from = (int) Settings::search()->delivery_from_default ?? 36;
|
||||
}
|
||||
|
@ -262,41 +265,41 @@ class SearchController extends Controller
|
|||
}
|
||||
|
||||
if (
|
||||
($buffer_connection = $connection['product']['bffr']["$from-$to-avia"] ?? false)
|
||||
($buffer_connection = $buffer_delivery_avia['product']['bffr']["$from-$to-avia"] ?? false)
|
||||
&& time() < $buffer_connection['expires']
|
||||
) {
|
||||
// Найдены данные доставки в буфере
|
||||
// и срок хранения не превышен, информация актуальна
|
||||
|
||||
// Запись в буфер вывода
|
||||
$connection['delivery'] = $buffer_connection['data'];
|
||||
$connection['delivery']['type'] = 'avia';
|
||||
$buffer_delivery_avia['delivery'] = $buffer_connection['data'];
|
||||
$buffer_delivery_avia['delivery']['type'] = 'avia';
|
||||
} else {
|
||||
// Инициализация инстанции продукта в базе данных
|
||||
$product = Product::searchByCatn($connection['product']['catn']);
|
||||
$product = Product::searchByCatn($buffer_delivery_avia['product']['catn']);
|
||||
|
||||
// Инициализация доставки Dellin (автоматическая)
|
||||
$product->bffr = [
|
||||
"$from-$to-avia" => [
|
||||
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||
'data' => $buffer_delivery_avia['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||
$from,
|
||||
$to,
|
||||
(int) ($connection['product']['wght'] ?? 0),
|
||||
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||
(int) ($connection['product']['dmns']['z'] ?? 0),
|
||||
(int) ($buffer_delivery_avia['product']['wght'] ?? 0),
|
||||
(int) ($buffer_delivery_avia['product']['dmns']['x'] ?? 0),
|
||||
(int) ($buffer_delivery_avia['product']['dmns']['y'] ?? 0),
|
||||
(int) ($buffer_delivery_avia['product']['dmns']['z'] ?? 0),
|
||||
avia: true
|
||||
),
|
||||
'expires' => time() + 86400
|
||||
]
|
||||
] + ($product->bffr ?? []);
|
||||
$connection['delivery']['type'] = 'avia';
|
||||
$buffer_delivery_avia['delivery']['type'] = 'avia';
|
||||
|
||||
// Отправка в базу данных
|
||||
$product->update();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$buffer['delivery']['error'] = true;
|
||||
$buffer_delivery_avia['delivery']['error'] = true;
|
||||
|
||||
// var_dump($e->getMessage());
|
||||
// var_dump($e->getTrace());
|
||||
|
@ -306,14 +309,14 @@ class SearchController extends Controller
|
|||
// die;
|
||||
}
|
||||
|
||||
if (!isset($buffer['delivery']['error']) || $buffer['delivery']['error'] !== true) {
|
||||
if (!isset($buffer_delivery_avia['delivery']['error']) || $buffer_delivery_avia['delivery']['error'] !== true) {
|
||||
// Если рассчиталась доставка самолётом
|
||||
|
||||
// Инициализация цены (цена поставки + цена доставки + наша наценка)
|
||||
$buffer['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $buffer['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($buffer['delivery']['price']['all'] ?? $buffer['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
||||
$buffer_delivery_avia['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $buffer_delivery_avia['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($buffer_delivery_avia['delivery']['price']['all'] ?? $buffer_delivery_avia['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
||||
|
||||
// Запись в буфер
|
||||
$buffer_connections[] = $buffer;
|
||||
$buffer_connections[] = $buffer_delivery_avia;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -548,11 +548,24 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
|||
|
||||
// Функция для конвертации цифр в буквы
|
||||
$int_to_string = function (int $target): string {
|
||||
$alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'];
|
||||
// $alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'];
|
||||
$alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Ю', 'Я'];
|
||||
|
||||
return $alphabet[$target];
|
||||
};
|
||||
|
||||
// Реестр запрещённых индексов
|
||||
$registry = [
|
||||
'ЧМО',
|
||||
'ХЕР',
|
||||
'ХУЙ',
|
||||
'БЛЯ',
|
||||
'СУК',
|
||||
'СУЧ',
|
||||
'ЖОП',
|
||||
'ЛОХ'
|
||||
];
|
||||
|
||||
foreach ($accounts as $account) {
|
||||
// Перебор запрошенных аккаунтов
|
||||
|
||||
|
@ -560,11 +573,18 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
|||
// Запись только тех аккаунтов у кого не инициализирован индекс или если указано отсутствие проверки
|
||||
|
||||
// Повтор генерации
|
||||
regenerate:
|
||||
regenerate_index:
|
||||
|
||||
// Генерация
|
||||
$account->indx = $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32));
|
||||
|
||||
if (in_array($account->indx, $registry)) {
|
||||
// Сгенерированный индекс обнаружено в реестре запрещённых индексов
|
||||
|
||||
// Повтор генерации
|
||||
goto regenerate_index;
|
||||
}
|
||||
|
||||
// Запись
|
||||
if ($account->save()) {
|
||||
// Аккаунт сохранён (в базе данных это поле проверяется на уникальность)
|
||||
|
@ -586,7 +606,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
|||
echo "Не удалось сохранить аккаунт с псевдоанонимным идентификатором $account->indx" . PHP_EOL;
|
||||
}
|
||||
|
||||
goto regenerate;
|
||||
goto regenerate_index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -126,8 +126,8 @@ class Dellin extends Model
|
|||
$query = [];
|
||||
|
||||
// Рассчёт типа доставки
|
||||
if (
|
||||
$weight <= 30
|
||||
if ( !$avia
|
||||
&& $weight <= 30
|
||||
&& ($length <= 0.54 && $width <= 0.39 && $height <= 0.39)
|
||||
&& $length * $width * $height <= 0.1
|
||||
) {
|
||||
|
|
|
@ -171,7 +171,35 @@ if (
|
|||
<?php endif ?>
|
||||
|
||||
<article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>">
|
||||
<h4 class="ml-4 mt-2 mb-4"><i class="fas fa-list mr-2"></i>Заказы</h4>
|
||||
<div class="row mt-2 mb-3">
|
||||
<h4 class="col ml-4"><i class="fas fa-list mr-2"></i>Заказы</h4>
|
||||
<div class="col orders_panel_menu ml-auto text-right">
|
||||
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('all');">Все</abs>
|
||||
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('requested');">Запрошенные</a>
|
||||
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('accepted');">Активные</a>
|
||||
<a class="btn btn-sm button_white button_clean mb-0" type="button" onclick="return orders_read('completed');">Завершенные</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-4">
|
||||
<div class="ml-auto col-3">
|
||||
<div class="row mb-2">
|
||||
<p class="col-2 p-0 text-right">
|
||||
С
|
||||
</p>
|
||||
<div class="col-10">
|
||||
<input class="form-control" type="date" value="<?= date('Y-m-d', time() - 604800)?>" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<p class="col-2 p-0 text-right">
|
||||
По
|
||||
</p>
|
||||
<div class="col-10">
|
||||
<input class="form-control" type="date" value="<?= date('Y-m-d', time())?>" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col mb-4 list rounded">
|
||||
<div class="row py-3 text-center">
|
||||
<!-- <div class="pl-3 mr-1">
|
||||
|
@ -191,6 +219,12 @@ if (
|
|||
// Инициализация
|
||||
extract($order);
|
||||
|
||||
if (isset($order['stts']) && $order['stts'] === 'reserved') {
|
||||
// Заказ был резервирован (отменён)
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Пропуск активного заказа (несформированного, корзины)
|
||||
if ($account_edge_order[0]['type'] === 'current') continue;
|
||||
|
||||
|
|
|
@ -182,7 +182,7 @@ use app\models\Product;
|
|||
</p>
|
||||
<!-- Вес -->
|
||||
<p class="form-control-sm p-0 h-auto">
|
||||
<b>Габариты:</b><span id="prod_<?= $model['catn'] ?>_dmns_x" class="ml-1"><?= empty($model['wght']) ? '0' : $model['wght'] ?></span><small>г</small>
|
||||
<b>Вес:</b><span id="prod_<?= $model['catn'] ?>_dmns_x" class="ml-1"><?= empty($model['wght']) ? '0' : $model['wght'] ?></span>г
|
||||
</p>
|
||||
</section>
|
||||
<?php endif ?>
|
||||
|
|
|
@ -55,7 +55,7 @@ if (
|
|||
|
||||
// Инициализация
|
||||
$model ?? $model = yii::$app->user->identity;
|
||||
$delivery_to_terminal_list or $delivery_to_terminal_list = ['Нет данных'];
|
||||
$delivery_to_terminal_list ?? $delivery_to_terminal_list = ['Нет данных'];
|
||||
?>
|
||||
|
||||
<?= $form->field($model, 'opts[delivery_to_terminal]', ['options' => ['class' => "mb-1"]])
|
||||
|
|
|
@ -117,13 +117,28 @@
|
|||
default => '<i class="mr-1 fas fa-truck"></i>'
|
||||
};
|
||||
|
||||
// Инициализация времени
|
||||
// Инициализация даты отправки
|
||||
try {
|
||||
// Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель)
|
||||
|
||||
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspSender'])->getTimestamp();
|
||||
} catch (Throwable $e) {
|
||||
// Взять данные из "pickup" (Дата передачи груза на адресе отправителя)
|
||||
|
||||
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['pickup'])->getTimestamp();
|
||||
}
|
||||
|
||||
// Инициализация времени доставки
|
||||
try {
|
||||
// Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)
|
||||
|
||||
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
|
||||
} catch (Exception $e) {
|
||||
} catch (Throwable $e) {
|
||||
// Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)
|
||||
|
||||
$delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
|
||||
}
|
||||
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
|
||||
$delivery = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1;
|
||||
}
|
||||
|
||||
// Инициализация индекса аккаунта
|
||||
|
|
|
@ -35,3 +35,13 @@ function main_response(data, status, xhr) {
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
var page_loaded_for_history = window.history.state;
|
||||
|
||||
window.addEventListener('popstate', function() {
|
||||
if (page_loaded_for_history) {
|
||||
|
||||
console.log('сработало');
|
||||
window.location.reload();
|
||||
};
|
||||
}, false);
|
||||
|
|
|
@ -1,3 +1,23 @@
|
|||
// Запросить заказы
|
||||
function orders_read(type = 'all') {
|
||||
// Запрос
|
||||
$.ajax({
|
||||
url: '/orders/' + type,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
'_csrf': yii.getCsrfToken()
|
||||
},
|
||||
success: orders_response_success,
|
||||
error: orders_response_error
|
||||
});
|
||||
|
||||
// Пересчитывание стоимости
|
||||
cart_cost_calculate();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function orders_response(data, status, xhr) {
|
||||
// Обработка ответов
|
||||
|
||||
|
|
|
@ -12,10 +12,10 @@ function product_search(text = '', advanced = 0) {
|
|||
'advanced': advanced,
|
||||
'request': text
|
||||
},
|
||||
success: function (data, statu, xhrs) {
|
||||
success: function (data, status, xhr) {
|
||||
search_panel_success(text, advanced, data, status, xhr);
|
||||
},
|
||||
error: function (data, status) {
|
||||
error: function (data, status, xhr) {
|
||||
search_panel_error(text, advanced, data, status, xhr);
|
||||
},
|
||||
statusCode: search_panel_statusCode
|
||||
|
@ -37,10 +37,10 @@ function product_search_history(text = '', advanced = 0) {
|
|||
'type': 'product',
|
||||
'history': true
|
||||
},
|
||||
success: function (data, status) {
|
||||
success: function (data, status, xhr) {
|
||||
search_panel_success(text, advanced, data, status, xhr);
|
||||
},
|
||||
error: function (data, status) {
|
||||
error: function (data, status, xhr) {
|
||||
search_panel_error(text, advanced, data, status, xhr);
|
||||
},
|
||||
statusCode: search_panel_statusCode
|
||||
|
|
Reference in New Issue