Работа над сайтом 15

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-07-19 07:58:31 +10:00
parent bf821a9819
commit b3b5111006
15 changed files with 172 additions and 47 deletions

View File

@ -97,6 +97,7 @@ $config = [
'product/<catn:[^/]+>' => 'product/index', '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>', '<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' => 'order/index',
'orders/<type:[^/]+>' => 'order/index',
'orders/<_key:[^/]+>/<action:(accept)>' => 'order/<action>', '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)>' => 'order/supply-<action>',
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>', 'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>',

View File

@ -76,13 +76,13 @@ class AuthenticationController extends Controller
// Запись ответа // Запись ответа
$return['redirect'] = '/' . $cookies['redirect']; $return['redirect'] = '/' . $cookies['redirect'];
try { // try {
if (empty($return['main'] = $this->renderPartial($return['redirect']))) { // if (empty($return['main'] = $this->renderPartial($return['redirect']))) {
throw new Exception('Представление найдено, но вернуло пустой результат'); // throw new Exception('Представление найдено, но вернуло пустой результат');
} // }
} catch (Throwable $t) { // } catch (Throwable $t) {
$return['main'] = $this->renderPartial($return['redirect'] . '/index'); // $return['main'] = $this->renderPartial($return['redirect'] . '/index');
} // }
// Генерация и запись // Генерация и запись
// $controller = 'app\\controllers\\' . ucfirst($cookies['redirect']) . 'Controller'; // $controller = 'app\\controllers\\' . ucfirst($cookies['redirect']) . 'Controller';
@ -91,6 +91,11 @@ class AuthenticationController extends Controller
// Очистка cookie // Очистка cookie
unset(yii::$app->response->cookies['redirect']); unset(yii::$app->response->cookies['redirect']);
yii::$app->response->format = Response::FORMAT_HTML;
// Переадресация
return $this->redirect($return['redirect']);
} else { } else {
// Не найдено cookie с переадресацией // Не найдено cookie с переадресацией

View File

@ -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(); $moderator_orders = self::genOrdersForModeration();
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {

View File

@ -31,11 +31,6 @@ class ProfileController extends Controller
'roles' => ['@'], 'roles' => ['@'],
'actions' => ['index', 'supplies', 'import', 'monitoring', 'readGroups'] 'actions' => ['index', 'supplies', 'import', 'monitoring', 'readGroups']
], ],
[
'allow' => false,
'roles' => ['?'],
'denyCallback' => [$this, 'accessDenied']
],
[ [
'allow' => true, 'allow' => true,
'actions' => ['panel', 'panel-notification-write'], 'actions' => ['panel', 'panel-notification-write'],
@ -49,6 +44,11 @@ class ProfileController extends Controller
return false; return false;
} }
],
[
'allow' => false,
'roles' => ['?'],
'denyCallback' => [$this, 'accessDenied']
] ]
] ]
] ]

View File

@ -68,10 +68,27 @@ class RegistrationController extends Controller
// Запись ответа // Запись ответа
$return['redirect'] = '/' . $cookies['redirect']; $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 // Очистка cookie
unset(yii::$app->response->cookies['redirect']); unset(yii::$app->response->cookies['redirect']);
yii::$app->response->format = Response::FORMAT_HTML;
// Переадресация
return $this->redirect($return['redirect']);
} else { } else {
// Не найдено cookie с переадресацией // Не найдено cookie с переадресацией

View File

@ -186,6 +186,7 @@ class SearchController extends Controller
try { try {
// Инициализация данных геолокации // Инициализация данных геолокации
try { try {
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36; $from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
} catch (Exception $e) { } 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); $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 { 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) { } catch (Exception $e) {
$from = (int) Settings::search()->delivery_from_default ?? 36; $from = (int) Settings::search()->delivery_from_default ?? 36;
} }
@ -262,41 +265,41 @@ class SearchController extends Controller
} }
if ( 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'] && time() < $buffer_connection['expires']
) { ) {
// Найдены данные доставки в буфере // Найдены данные доставки в буфере
// и срок хранения не превышен, информация актуальна // и срок хранения не превышен, информация актуальна
// Запись в буфер вывода // Запись в буфер вывода
$connection['delivery'] = $buffer_connection['data']; $buffer_delivery_avia['delivery'] = $buffer_connection['data'];
$connection['delivery']['type'] = 'avia'; $buffer_delivery_avia['delivery']['type'] = 'avia';
} else { } else {
// Инициализация инстанции продукта в базе данных // Инициализация инстанции продукта в базе данных
$product = Product::searchByCatn($connection['product']['catn']); $product = Product::searchByCatn($buffer_delivery_avia['product']['catn']);
// Инициализация доставки Dellin (автоматическая) // Инициализация доставки Dellin (автоматическая)
$product->bffr = [ $product->bffr = [
"$from-$to-avia" => [ "$from-$to-avia" => [
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced( 'data' => $buffer_delivery_avia['delivery'] = Dellin::calcDeliveryAdvanced(
$from, $from,
$to, $to,
(int) ($connection['product']['wght'] ?? 0), (int) ($buffer_delivery_avia['product']['wght'] ?? 0),
(int) ($connection['product']['dmns']['x'] ?? 0), (int) ($buffer_delivery_avia['product']['dmns']['x'] ?? 0),
(int) ($connection['product']['dmns']['y'] ?? 0), (int) ($buffer_delivery_avia['product']['dmns']['y'] ?? 0),
(int) ($connection['product']['dmns']['z'] ?? 0), (int) ($buffer_delivery_avia['product']['dmns']['z'] ?? 0),
avia: true avia: true
), ),
'expires' => time() + 86400 'expires' => time() + 86400
] ]
] + ($product->bffr ?? []); ] + ($product->bffr ?? []);
$connection['delivery']['type'] = 'avia'; $buffer_delivery_avia['delivery']['type'] = 'avia';
// Отправка в базу данных // Отправка в базу данных
$product->update(); $product->update();
} }
} catch (Exception $e) { } catch (Exception $e) {
$buffer['delivery']['error'] = true; $buffer_delivery_avia['delivery']['error'] = true;
// var_dump($e->getMessage()); // var_dump($e->getMessage());
// var_dump($e->getTrace()); // var_dump($e->getTrace());
@ -306,14 +309,14 @@ class SearchController extends Controller
// die; // 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;
} }
} }

View File

@ -548,11 +548,24 @@ class Account extends Document implements IdentityInterface, PartnerInterface
// Функция для конвертации цифр в буквы // Функция для конвертации цифр в буквы
$int_to_string = function (int $target): string { $int_to_string = function (int $target): string {
$alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я']; // $alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'];
$alphabet = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Ю', 'Я'];
return $alphabet[$target]; return $alphabet[$target];
}; };
// Реестр запрещённых индексов
$registry = [
'ЧМО',
'ХЕР',
'ХУЙ',
'БЛЯ',
'СУК',
'СУЧ',
'ЖОП',
'ЛОХ'
];
foreach ($accounts as $account) { 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)); $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()) { if ($account->save()) {
// Аккаунт сохранён (в базе данных это поле проверяется на уникальность) // Аккаунт сохранён (в базе данных это поле проверяется на уникальность)
@ -586,7 +606,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
echo "Не удалось сохранить аккаунт с псевдоанонимным идентификатором $account->indx" . PHP_EOL; echo "Не удалось сохранить аккаунт с псевдоанонимным идентификатором $account->indx" . PHP_EOL;
} }
goto regenerate; goto regenerate_index;
} }
} }
} }

View File

@ -126,8 +126,8 @@ class Dellin extends Model
$query = []; $query = [];
// Рассчёт типа доставки // Рассчёт типа доставки
if ( if ( !$avia
$weight <= 30 && $weight <= 30
&& ($length <= 0.54 && $width <= 0.39 && $height <= 0.39) && ($length <= 0.54 && $width <= 0.39 && $height <= 0.39)
&& $length * $width * $height <= 0.1 && $length * $width * $height <= 0.1
) { ) {

View File

@ -171,7 +171,35 @@ if (
<?php endif ?> <?php endif ?>
<article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>"> <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="col mb-4 list rounded">
<div class="row py-3 text-center"> <div class="row py-3 text-center">
<!-- <div class="pl-3 mr-1"> <!-- <div class="pl-3 mr-1">
@ -191,6 +219,12 @@ if (
// Инициализация // Инициализация
extract($order); extract($order);
if (isset($order['stts']) && $order['stts'] === 'reserved') {
// Заказ был резервирован (отменён)
continue;
}
// Пропуск активного заказа (несформированного, корзины) // Пропуск активного заказа (несформированного, корзины)
if ($account_edge_order[0]['type'] === 'current') continue; if ($account_edge_order[0]['type'] === 'current') continue;

View File

@ -182,7 +182,7 @@ use app\models\Product;
</p> </p>
<!-- Вес --> <!-- Вес -->
<p class="form-control-sm p-0 h-auto"> <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> </p>
</section> </section>
<?php endif ?> <?php endif ?>

View File

@ -55,7 +55,7 @@ if (
// Инициализация // Инициализация
$model ?? $model = yii::$app->user->identity; $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"]]) <?= $form->field($model, 'opts[delivery_to_terminal]', ['options' => ['class' => "mb-1"]])

View File

@ -117,13 +117,28 @@
default => '<i class="mr-1 fas fa-truck"></i>' default => '<i class="mr-1 fas fa-truck"></i>'
}; };
// Инициализация времени // Инициализация даты отправки
try { 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(); $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_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;
} }
// Инициализация индекса аккаунта // Инициализация индекса аккаунта

View File

@ -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);

View File

@ -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) { function orders_response(data, status, xhr) {
// Обработка ответов // Обработка ответов

View File

@ -12,10 +12,10 @@ function product_search(text = '', advanced = 0) {
'advanced': advanced, 'advanced': advanced,
'request': text 'request': text
}, },
success: function (data, statu, xhrs) { success: function (data, status, xhr) {
search_panel_success(text, advanced, 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); search_panel_error(text, advanced, data, status, xhr);
}, },
statusCode: search_panel_statusCode statusCode: search_panel_statusCode
@ -37,10 +37,10 @@ function product_search_history(text = '', advanced = 0) {
'type': 'product', 'type': 'product',
'history': true 'history': true
}, },
success: function (data, status) { success: function (data, status, xhr) {
search_panel_success(text, advanced, 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); search_panel_error(text, advanced, data, status, xhr);
}, },
statusCode: search_panel_statusCode statusCode: search_panel_statusCode