удаление складов + доставка
This commit is contained in:
parent
4683cf51db
commit
2f4f38b2aa
|
@ -56,7 +56,9 @@ class ProfileController extends Controller
|
||||||
'imports-delete',
|
'imports-delete',
|
||||||
'warehouses-write',
|
'warehouses-write',
|
||||||
'warehouses-rename',
|
'warehouses-rename',
|
||||||
'warehouses-delete'
|
'warehouses-delete',
|
||||||
|
'warehouses-close',
|
||||||
|
'warehouses-open'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -1319,4 +1321,152 @@ class ProfileController extends Controller
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Открыть склад
|
||||||
|
*
|
||||||
|
* @return array|string|null
|
||||||
|
*/
|
||||||
|
public function actionWarehousesOpen(): array|string|null
|
||||||
|
{
|
||||||
|
// Инициализация аккаунта
|
||||||
|
$account = Account::initAccount();
|
||||||
|
|
||||||
|
// Инициализация остальных входных параметров
|
||||||
|
$supply = new Supply(yii::$app->request->post('Supply') ?? yii::$app->request->get('Supply'));
|
||||||
|
$panel = yii::$app->request->post('panel') ?? yii::$app->request->get('panel');
|
||||||
|
$sidebar = $this->renderPartial('sidebar');
|
||||||
|
$groups = self::readGroups();
|
||||||
|
|
||||||
|
if (yii::$app->request->isPost) {
|
||||||
|
// POST-запрос
|
||||||
|
|
||||||
|
// Запись заголовка с типом ответа
|
||||||
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
|
// Инициализация буфера вывода
|
||||||
|
$return = [
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
];
|
||||||
|
|
||||||
|
// Инициализация идентификатора
|
||||||
|
$_key = yii::$app->request->post('_key');
|
||||||
|
|
||||||
|
if (empty($_key)) {
|
||||||
|
// Не передан идентификатор
|
||||||
|
|
||||||
|
// Запись кода ошибки
|
||||||
|
yii::$app->response->statusCode = 500;
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($warehouse = Warehouse::searchById(Warehouse::collectionName() . "/$_key")) {
|
||||||
|
// Найден склад
|
||||||
|
|
||||||
|
// Запись статуса
|
||||||
|
$warehouse->open = true;
|
||||||
|
|
||||||
|
if ($warehouse->update() > 0) {
|
||||||
|
// Открыт склад
|
||||||
|
|
||||||
|
// Отправка уведомления
|
||||||
|
Notification::_write("Склад $_key был открыт", account: $account->_key);
|
||||||
|
|
||||||
|
|
||||||
|
// Запись в буфер вывода реинициализированного элемента
|
||||||
|
$return['opened'] = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Не найден склад
|
||||||
|
|
||||||
|
// Отправка уведомления
|
||||||
|
Notification::_write("Не найден склад $_key", account: $account->_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запись в буфер вывода реинициализированного элемента
|
||||||
|
$return['main'] = $this->renderPartial('supplies', compact(
|
||||||
|
'supply',
|
||||||
|
'groups',
|
||||||
|
'sidebar',
|
||||||
|
'panel'
|
||||||
|
));
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Закрыть склад
|
||||||
|
*
|
||||||
|
* @return array|string|null
|
||||||
|
*/
|
||||||
|
public function actionWarehousesClose(): array|string|null
|
||||||
|
{
|
||||||
|
// Инициализация аккаунта
|
||||||
|
$account = Account::initAccount();
|
||||||
|
|
||||||
|
// Инициализация остальных входных параметров
|
||||||
|
$supply = new Supply(yii::$app->request->post('Supply') ?? yii::$app->request->get('Supply'));
|
||||||
|
$panel = yii::$app->request->post('panel') ?? yii::$app->request->get('panel');
|
||||||
|
$sidebar = $this->renderPartial('sidebar');
|
||||||
|
$groups = self::readGroups();
|
||||||
|
|
||||||
|
if (yii::$app->request->isPost) {
|
||||||
|
// POST-запрос
|
||||||
|
|
||||||
|
// Запись заголовка с типом ответа
|
||||||
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
|
// Инициализация буфера вывода
|
||||||
|
$return = [
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
];
|
||||||
|
|
||||||
|
// Инициализация идентификатора
|
||||||
|
$_key = yii::$app->request->post('_key');
|
||||||
|
|
||||||
|
if (empty($_key)) {
|
||||||
|
// Не передан идентификатор
|
||||||
|
|
||||||
|
// Запись кода ошибки
|
||||||
|
yii::$app->response->statusCode = 500;
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($warehouse = Warehouse::searchById(Warehouse::collectionName() . "/$_key")) {
|
||||||
|
// Найден склад
|
||||||
|
|
||||||
|
// Запись статуса
|
||||||
|
$warehouse->open = false;
|
||||||
|
|
||||||
|
if ($warehouse->update() > 0) {
|
||||||
|
// Закрыт склад
|
||||||
|
|
||||||
|
// Отправка уведомления
|
||||||
|
Notification::_write("Склад $_key был закрыт", account: $account->_key);
|
||||||
|
|
||||||
|
|
||||||
|
// Запись в буфер вывода реинициализированного элемента
|
||||||
|
$return['closed'] = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Не найден склад
|
||||||
|
|
||||||
|
// Отправка уведомления
|
||||||
|
Notification::_write("Не найден склад $_key", account: $account->_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запись в буфер вывода реинициализированного элемента
|
||||||
|
$return['main'] = $this->renderPartial('supplies', compact(
|
||||||
|
'supply',
|
||||||
|
'groups',
|
||||||
|
'sidebar',
|
||||||
|
'panel'
|
||||||
|
));
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,4 +96,28 @@ class Import extends Document
|
||||||
limit: $limit
|
limit: $limit
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поиск по поставке
|
||||||
|
*
|
||||||
|
* @param Supply $supply Поставка
|
||||||
|
* @param int $limit Ограничение по максимальному количеству
|
||||||
|
*
|
||||||
|
* @return array Инстанции испортов
|
||||||
|
*/
|
||||||
|
public static function searchBySupply(Supply $supply, int $limit = 10): array
|
||||||
|
{
|
||||||
|
return self::searchByEdge(
|
||||||
|
from: 'supply',
|
||||||
|
to: 'import',
|
||||||
|
edge: 'import_edge_supply',
|
||||||
|
direction: 'OUTBOUND',
|
||||||
|
subquery_where: [
|
||||||
|
['import_edge_supply._to' => $supply->readId()],
|
||||||
|
['import_edge_supply.type' => 'imported']
|
||||||
|
],
|
||||||
|
where: 'import_edge_supply[0] != null',
|
||||||
|
limit: $limit
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,9 +176,6 @@ class Search extends Document
|
||||||
foreach ($connections as $key => &$connection) {
|
foreach ($connections as $key => &$connection) {
|
||||||
// Перебор поставок
|
// Перебор поставок
|
||||||
|
|
||||||
// if (($cost = $connection['cost'] ?? $cost['ЦенаЗаЕдиницу'] ?? $connection['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) < 1
|
|
||||||
// || ($amount = $connection['supply']['amnt'] ?? $connection['supply_edge_product'][0]['onec']['Количество']) < 1
|
|
||||||
// ) {
|
|
||||||
if ($cost = $connection['supply']['cost'] < 1) {
|
if ($cost = $connection['supply']['cost'] < 1) {
|
||||||
// Цена меньше единицы (подразумевается как ошибка)
|
// Цена меньше единицы (подразумевается как ошибка)
|
||||||
|
|
||||||
|
@ -198,7 +195,7 @@ class Search extends Document
|
||||||
// Инициализация данных геолокации
|
// Инициализация данных геолокации
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
$from = (int) (Warehouse::searchBySupply(Supply::searchByCatn($connection['supply']['catn']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36);
|
||||||
} catch (exception $e) {
|
} catch (exception $e) {
|
||||||
$from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
$from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
||||||
}
|
}
|
||||||
|
@ -209,13 +206,20 @@ class Search extends Document
|
||||||
$to = 36;
|
$to = 36;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
// Инициализация буфера доставки
|
||||||
($buffer_connection = $connection['product']['bffr']["$from-$to"] ?? false)
|
$buffer_connection = $connection['product']['bffr']["$from-$to"] ?? null;
|
||||||
&& time() < $buffer_connection['expires']
|
|
||||||
) {
|
if (isset($buffer_connection) && !empty($buffer_connection['data']) && time() < $buffer_connection['expires'] ?? 0) {
|
||||||
// Найдены данные доставки в буфере
|
// Найдены данные доставки в буфере
|
||||||
// и срок хранения не превышен, информация актуальна
|
// и срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
// var_dump($buffer_connection);
|
||||||
|
// var_dump(isset($buffer_connection['data']));
|
||||||
|
// var_dump(isset($buffer_connection));
|
||||||
|
// var_dump(time() < $buffer_connection['expires'] ?? 0);
|
||||||
|
// var_dump(isset($buffer_connection) && time() < $buffer_connection['expires'] ?? 0);
|
||||||
|
// die;
|
||||||
|
|
||||||
// Запись в буфер вывода
|
// Запись в буфер вывода
|
||||||
$connection['delivery'] = $buffer_connection['data'];
|
$connection['delivery'] = $buffer_connection['data'];
|
||||||
$connection['delivery']['type'] = 'auto';
|
$connection['delivery']['type'] = 'auto';
|
||||||
|
@ -223,25 +227,31 @@ class Search extends Document
|
||||||
// Инициализация инстанции продукта в базе данных
|
// Инициализация инстанции продукта в базе данных
|
||||||
$product = Product::searchByCatn($connection['product']['catn']);
|
$product = Product::searchByCatn($connection['product']['catn']);
|
||||||
|
|
||||||
// Инициализация доставки Dellin (автоматическая)
|
if ($connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
$product->bffr = [
|
|
||||||
"$from-$to" => [
|
|
||||||
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
|
||||||
$from,
|
$from,
|
||||||
$to,
|
$to,
|
||||||
(int) ($connection['product']['wght'] ?? 0),
|
(int) ($connection['product']['wght'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['x'] ?? 0),
|
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['y'] ?? 0),
|
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['z'] ?? 0)
|
(int) ($connection['product']['dmns']['z'] ?? 0)
|
||||||
),
|
)) {
|
||||||
|
// Получены данные доставки
|
||||||
|
|
||||||
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
|
$product->bffr = [
|
||||||
|
"$from-$to" => [
|
||||||
|
'data' => $connection['delivery'],
|
||||||
'expires' => time() + 86400
|
'expires' => time() + 86400
|
||||||
]
|
]
|
||||||
] + ($product->bffr ?? []);
|
] + ($product->bffr ?? []);
|
||||||
$connection['delivery']['type'] = 'auto';
|
|
||||||
|
|
||||||
// Отправка в базу данных
|
// Отправка в базу данных
|
||||||
$product->update();
|
$product->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Запись типа доставки
|
||||||
|
$connection['delivery']['type'] = 'auto';
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$connection['delivery']['error'] = true;
|
$connection['delivery']['error'] = true;
|
||||||
|
|
||||||
|
@ -251,10 +261,11 @@ class Search extends Document
|
||||||
|
|
||||||
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
||||||
// die;
|
// die;
|
||||||
}
|
} finally {
|
||||||
|
// echo $connection['delivery']['price']['all'];
|
||||||
// Инициализация цены (цена поставки + цена доставки + наша наценка)
|
// Инициализация цены (цена поставки + цена доставки + наша наценка)
|
||||||
$connection['cost'] = $cost + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
$connection['cost'] = $cost + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
// Инициализация версии для рассчета доставки по воздуху
|
// Инициализация версии для рассчета доставки по воздуху
|
||||||
$buffer_delivery_avia = $connection;
|
$buffer_delivery_avia = $connection;
|
||||||
|
@ -262,10 +273,8 @@ class Search extends Document
|
||||||
try {
|
try {
|
||||||
// Инициализация данных геолокации
|
// Инициализация данных геолокации
|
||||||
|
|
||||||
if (($cost = $cost['ЦенаЗаЕдиницу'] ?? $buffer_delivery_avia['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) < 1
|
if ($cost = $connection['supply']['cost'] < 1) {
|
||||||
|| ($amount = $connection['supply']['amnt'] ?? $connection['supply_edge_product'][0]['onec']['Количество']) < 1
|
// Цена меньше единицы (подразумевается как ошибка)
|
||||||
) {
|
|
||||||
// Цена меньше единицы (подразумевается как ошибка) или количество меньше единицы
|
|
||||||
// Этот код не будет выполняться, так как цена одна на обе позиции и аналогичная проверка выше уже есть
|
// Этот код не будет выполняться, так как цена одна на обе позиции и аналогичная проверка выше уже есть
|
||||||
// Однако я это оставлю для возможных доработок в будущем
|
// Однако я это оставлю для возможных доработок в будущем
|
||||||
|
|
||||||
|
@ -276,7 +285,7 @@ class Search extends Document
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$from = (int) $buffer_delivery_avia['account']['opts']['delivery_from_terminal'] ?? empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
$from = (int) (Warehouse::searchBySupply(Supply::searchByCatn($connection['supply']['catn']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
$from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
|
||||||
}
|
}
|
||||||
|
@ -287,10 +296,10 @@ class Search extends Document
|
||||||
$to = 36;
|
$to = 36;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
// Инициализация буфера доставки
|
||||||
($buffer_connection = $buffer_delivery_avia['product']['bffr']["$from-$to-avia"] ?? false)
|
$buffer_connection = $connection['product']['bffr']["$from-$to-avia"] ?? null;
|
||||||
&& time() < $buffer_connection['expires']
|
|
||||||
) {
|
if (isset($buffer_connection) && !empty($buffer_connection['data']) && time() < $buffer_connection['expires'] ?? 0) {
|
||||||
// Найдены данные доставки в буфере
|
// Найдены данные доставки в буфере
|
||||||
// и срок хранения не превышен, информация актуальна
|
// и срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
@ -301,10 +310,7 @@ class Search extends Document
|
||||||
// Инициализация инстанции продукта в базе данных
|
// Инициализация инстанции продукта в базе данных
|
||||||
$product = Product::searchByCatn($buffer_delivery_avia['product']['catn']);
|
$product = Product::searchByCatn($buffer_delivery_avia['product']['catn']);
|
||||||
|
|
||||||
// Инициализация доставки Dellin (автоматическая)
|
if ($buffer_delivery_avia['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
$product->bffr = [
|
|
||||||
"$from-$to-avia" => [
|
|
||||||
'data' => $buffer_delivery_avia['delivery'] = Dellin::calcDeliveryAdvanced(
|
|
||||||
$from,
|
$from,
|
||||||
$to,
|
$to,
|
||||||
(int) ($buffer_delivery_avia['product']['wght'] ?? 0),
|
(int) ($buffer_delivery_avia['product']['wght'] ?? 0),
|
||||||
|
@ -312,30 +318,39 @@ class Search extends Document
|
||||||
(int) ($buffer_delivery_avia['product']['dmns']['y'] ?? 0),
|
(int) ($buffer_delivery_avia['product']['dmns']['y'] ?? 0),
|
||||||
(int) ($buffer_delivery_avia['product']['dmns']['z'] ?? 0),
|
(int) ($buffer_delivery_avia['product']['dmns']['z'] ?? 0),
|
||||||
avia: true
|
avia: true
|
||||||
),
|
)) {
|
||||||
|
// Получены данные доставки
|
||||||
|
|
||||||
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
|
$product->bffr = [
|
||||||
|
"$from-$to-avia" => [
|
||||||
|
'data' => $buffer_delivery_avia['delivery'],
|
||||||
'expires' => time() + 86400
|
'expires' => time() + 86400
|
||||||
]
|
]
|
||||||
] + ($product->bffr ?? []);
|
] + ($product->bffr ?? []);
|
||||||
$buffer_delivery_avia['delivery']['type'] = 'avia';
|
|
||||||
|
|
||||||
// Отправка в базу данных
|
// Отправка в базу данных
|
||||||
$product->update();
|
$product->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Запись типа доставки
|
||||||
|
$buffer_delivery_avia['delivery']['type'] = 'avia';
|
||||||
|
}
|
||||||
} catch (exception $e) {
|
} catch (exception $e) {
|
||||||
$buffer_delivery_avia['delivery']['error'] = true;
|
$buffer_delivery_avia['delivery']['error'] = true;
|
||||||
|
|
||||||
// echo '<pre>';
|
|
||||||
// var_dump($e->getMessage());
|
// var_dump($e->getMessage());
|
||||||
// var_dump($e->getTrace());
|
// var_dump($e->getTrace());
|
||||||
// var_dump($e->getFile());
|
// var_dump($e->getFile());
|
||||||
|
|
||||||
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
||||||
// die;
|
// die;
|
||||||
}
|
} finally {
|
||||||
|
|
||||||
if (!isset($buffer_delivery_avia['delivery']['error']) || $buffer_delivery_avia['delivery']['error'] !== true) {
|
if (!isset($buffer_delivery_avia['delivery']['error']) || $buffer_delivery_avia['delivery']['error'] !== true) {
|
||||||
// Если рассчиталась доставка самолётом
|
// Если рассчиталась доставка самолётом
|
||||||
|
|
||||||
|
// echo $buffer_delivery_avia['delivery']['price']['all']; die;
|
||||||
|
|
||||||
// Инициализация цены (цена поставки + цена доставки + наша наценка)
|
// Инициализация цены (цена поставки + цена доставки + наша наценка)
|
||||||
$buffer_delivery_avia['cost'] = $cost + ($buffer_delivery_avia['delivery']['price']['all'] ?? $buffer_delivery_avia['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
$buffer_delivery_avia['cost'] = $cost + ($buffer_delivery_avia['delivery']['price']['all'] ?? $buffer_delivery_avia['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0);
|
||||||
|
|
||||||
|
@ -343,6 +358,7 @@ class Search extends Document
|
||||||
$buffer_connections[] = $buffer_delivery_avia;
|
$buffer_connections[] = $buffer_delivery_avia;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Запись обработанных данных
|
// Запись обработанных данных
|
||||||
|
@ -426,7 +442,7 @@ class Search extends Document
|
||||||
}
|
}
|
||||||
|
|
||||||
// Инициализация цены
|
// Инициализация цены
|
||||||
$price_raw = $supply['cost'];
|
$price_raw = ($supply['cost'] ?? 0) + ($cost ?? 0);
|
||||||
// $price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта'] ?? 'руб';
|
// $price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта'] ?? 'руб';
|
||||||
$price = $price_raw . ' руб';
|
$price = $price_raw . ' руб';
|
||||||
|
|
||||||
|
@ -518,6 +534,7 @@ class Search extends Document
|
||||||
|
|
||||||
$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 - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1;
|
$delivery = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,8 @@ class Warehouse extends Document
|
||||||
'name',
|
'name',
|
||||||
'addr',
|
'addr',
|
||||||
'trmn',
|
'trmn',
|
||||||
'actv'
|
'actv',
|
||||||
|
'open'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -50,7 +51,8 @@ class Warehouse extends Document
|
||||||
'name' => 'Название',
|
'name' => 'Название',
|
||||||
'addr' => 'Адрес',
|
'addr' => 'Адрес',
|
||||||
'trmn' => 'Терминал',
|
'trmn' => 'Терминал',
|
||||||
'actv' => 'Активность'
|
'actv' => 'Активность',
|
||||||
|
'open' => 'Доступность'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -115,6 +117,8 @@ class Warehouse extends Document
|
||||||
* @param int $limit Ограничение по максимальному количеству
|
* @param int $limit Ограничение по максимальному количеству
|
||||||
*
|
*
|
||||||
* @return mixed Склады
|
* @return mixed Склады
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
public static function searchByAccount(Account|null $account = null, int $limit = 10): mixed
|
public static function searchByAccount(Account|null $account = null, int $limit = 10): mixed
|
||||||
{
|
{
|
||||||
|
@ -142,6 +146,43 @@ class Warehouse extends Document
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Найти по поставке
|
||||||
|
*
|
||||||
|
* @param Supply $supply Поставка
|
||||||
|
* @param int $limit Ограничение по максимальному количеству
|
||||||
|
*
|
||||||
|
* @return mixed Склады
|
||||||
|
*/
|
||||||
|
public static function searchBySupply(Supply $supply, int $limit = 10): mixed
|
||||||
|
{
|
||||||
|
return static::searchByImport(Import::searchBySupply($supply, limit: 1)[0], $limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Найти по инстанции поставки
|
||||||
|
*
|
||||||
|
* @param Import $import Инстанция поставки
|
||||||
|
* @param int $limit Ограничение по максимальному количеству
|
||||||
|
*
|
||||||
|
* @return mixed Склады
|
||||||
|
*/
|
||||||
|
public static function searchByImport(Import $import, int $limit = 10): mixed
|
||||||
|
{
|
||||||
|
return self::searchByEdge(
|
||||||
|
from: 'import',
|
||||||
|
to: 'warehouse',
|
||||||
|
edge: 'warehouse_edge_import',
|
||||||
|
direction: 'OUTBOUND',
|
||||||
|
subquery_where: [
|
||||||
|
['warehouse_edge_import._to' => $import->readId()],
|
||||||
|
['warehouse_edge_import.type' => 'loaded']
|
||||||
|
],
|
||||||
|
where: 'warehouse_edge_import[0] != null',
|
||||||
|
limit: $limit
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Инициализация с записью
|
* Инициализация с записью
|
||||||
*
|
*
|
||||||
|
@ -196,7 +237,7 @@ class Warehouse extends Document
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запись
|
// Запись
|
||||||
$list[$termial['id']] = $city->data['name'];
|
$list[$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,41 +84,17 @@ class Dellin extends Model
|
||||||
return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia, $account) {
|
return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia, $account) {
|
||||||
// Всё готово к работе
|
// Всё готово к работе
|
||||||
|
|
||||||
if (is_null($account)) {
|
$account = Account::initAccount($account);
|
||||||
// Данные аккаунта не переданы
|
|
||||||
|
|
||||||
if (yii::$app->user->isGuest) {
|
|
||||||
// Аккаунт не аутентифицирован
|
|
||||||
|
|
||||||
return [];
|
|
||||||
} else {
|
|
||||||
// Аккаунт аутентифицирован
|
|
||||||
|
|
||||||
// Инициализация
|
|
||||||
$account = yii::$app->user->identity;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (is_int($account)) {
|
|
||||||
// Передан идентификатор (_key) аккаунта (подразумевается)
|
|
||||||
|
|
||||||
// Инициализация (поиск в базе данных)
|
|
||||||
if (!$account = Account::searchById(Account::collectionName() . "/$account")) {
|
|
||||||
// Не удалось инициализировать аккаунт
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Инициализация
|
// Инициализация
|
||||||
$from = DellinModel::searchByTerminalId($from, terminal_data_only: true);
|
$from = DellinModel::searchByTerminalId($from, terminal_data_only: true);
|
||||||
$to = DellinModel::searchByTerminalId($to, terminal_data_only: true);
|
$to = DellinModel::searchByTerminalId($to, terminal_data_only: true);
|
||||||
|
|
||||||
// Значения по умолчанию, если указан 0
|
// Значения по умолчанию, если указан 0
|
||||||
$x === 0 and $x = 25;
|
if (empty($x) || $x === 0) $x = 25;
|
||||||
$y === 0 and $y = 40;
|
if (empty($y) || $y === 0) $y = 40;
|
||||||
$z === 0 and $z = 25;
|
if (empty($z) || $z === 0) $z = 25;
|
||||||
$weight === 0 and $weight = 300;
|
if (empty($weight) || $weight === 0) $weight = 300;
|
||||||
|
|
||||||
// Конвертация из сантиметров в метры
|
// Конвертация из сантиметров в метры
|
||||||
$x /= 100;
|
$x /= 100;
|
||||||
|
@ -220,11 +196,10 @@ class Dellin extends Model
|
||||||
'width' => $width,
|
'width' => $width,
|
||||||
'height' => $height,
|
'height' => $height,
|
||||||
'length' => $length,
|
'length' => $length,
|
||||||
'weight' => $weight,
|
'totalVolume' => $width * $height * $length,
|
||||||
'totalVolume' => $x * $y * $z,
|
|
||||||
'totalWeight' => $weight,
|
'totalWeight' => $weight,
|
||||||
'oversizedWeight' => $weight,
|
'oversizedWeight' => $weight,
|
||||||
'oversizedVolume' => $x * $y * $z
|
'oversizedVolume' => $width * $height * $length
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -136,7 +136,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
|
||||||
$amount_warehouses = 0;
|
$amount_warehouses = 0;
|
||||||
?>
|
?>
|
||||||
<?php foreach ($warehouses as $warehouse) : ?>
|
<?php foreach ($warehouses as $warehouse) : ?>
|
||||||
<section class="col<?= ++$amount_warehouses < count($warehouses) ? ' mb-4' : '' ?>">
|
<section class="col mb-4">
|
||||||
<h4 class="mb-3 d-flex">
|
<h4 class="mb-3 d-flex">
|
||||||
<span class="my-auto"><?= $warehouse->name ?? 'Без названия' ?></span>
|
<span class="my-auto"><?= $warehouse->name ?? 'Без названия' ?></span>
|
||||||
<?php $form = ActiveForm::begin([
|
<?php $form = ActiveForm::begin([
|
||||||
|
@ -147,7 +147,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
|
||||||
],
|
],
|
||||||
'options' => [
|
'options' => [
|
||||||
'onsubmit' => 'return false;',
|
'onsubmit' => 'return false;',
|
||||||
'class' => 'ml-auto'
|
'class' => 'ml-auto px-0 col-5'
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -161,8 +161,9 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
|
||||||
])->label(false); ?>
|
])->label(false); ?>
|
||||||
|
|
||||||
<?php ActiveForm::end(); ?>
|
<?php ActiveForm::end(); ?>
|
||||||
<small class="ml-4 my-auto h6"><a class="text-dark fas fa-pen" type="button" onclick="return page_profile_warehouses_rename(<?= $warehouse->_key ?>, prompt('Название склада', this.parentElement.parentElement.innerText));"></a></small>
|
<small class="ml-4 my-auto h6"><a class="text-dark fas fa-pen" title="Переименовать" type="button" onclick="return page_profile_warehouses_rename(<?= $warehouse->_key ?>, prompt('Название склада', this.parentElement.parentElement.innerText));"></a></small>
|
||||||
<small class="ml-3 my-auto h6"><a class="text-dark fas fa-trash-alt" type="button" onclick="return page_profile_warehouses_delete(<?= $warehouse->_key ?>);"></a></small>
|
<small class="ml-3 my-auto h6"><a class="text-dark fas fa-solid <?= ($warehouse->open ?? false) ? 'fa-lock-open' : 'fa-lock' ?>" title="<?= ($warehouse->open ?? false) ? 'Закрыть' : 'Открыть' ?>" type="button" onclick="return <?= ($warehouse->open ?? false) ? 'page_profile_warehouses_close' : 'page_profile_warehouses_open' ?>(this, <?= $warehouse->_key ?>, '<?= $warehouse->name ?? 'Без названия' ?>');"></a></small>
|
||||||
|
<small class="ml-3 my-auto h6"><a class="text-dark fas fa-trash-alt" title="Удалить" type="button" onclick="return page_profile_warehouses_delete(<?= $warehouse->_key ?>, '<?= $warehouse->name ?? 'Без названия' ?>');"></a></small>
|
||||||
</h4>
|
</h4>
|
||||||
<?php
|
<?php
|
||||||
// Инициализация номера инстанции импорта
|
// Инициализация номера инстанции импорта
|
||||||
|
@ -215,7 +216,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
|
||||||
<!-- <div class="dropdown-divider mx-3 mb-3"></div> -->
|
<!-- <div class="dropdown-divider mx-3 mb-3"></div> -->
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
<a class="mx-auto text-dark fas fa-plus" title="Добавить" type="button" onclick="return page_profile_warehouses_write();"></a>
|
<a class="mx-auto text-dark fas fa-plus" title="Добавить склад" type="button" onclick="return page_profile_warehouses_write();"></a>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
<div class="dropdown-divider mt-4 mb-3"></div>
|
<div class="dropdown-divider mt-4 mb-3"></div>
|
||||||
<section class="mx-3 px-2">
|
<section class="mx-3 px-2">
|
||||||
|
|
|
@ -118,8 +118,90 @@ function page_profile_warehouses_write() {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
function page_profile_warehouses_delete(_key) {
|
function page_profile_warehouses_open(element, _key, name) {
|
||||||
if (confirm(`Удалить склад ${_key}?`)) {
|
if (confirm(`Открыть склад "${name}"?`)) {
|
||||||
|
$.ajax({
|
||||||
|
url: '/profile/warehouses/open',
|
||||||
|
type: 'post',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
'_csrf': yii.getCsrfToken(),
|
||||||
|
_key
|
||||||
|
},
|
||||||
|
success: function (data, status, xhr) {
|
||||||
|
if (data !== undefined) {
|
||||||
|
// Получены данные с сервера
|
||||||
|
|
||||||
|
if (data.opened !== undefined && data.opened == true) {
|
||||||
|
// Получена информации об успешном открытии склала
|
||||||
|
|
||||||
|
// Перезапись иконки
|
||||||
|
element.classList.remove('fa-lock');
|
||||||
|
element.classList.add('fa-lock-open');
|
||||||
|
|
||||||
|
// Перезапись вызываемой функции
|
||||||
|
element.removeAttribute('onclick');
|
||||||
|
element.setAttribute('onclick', 'return page_profile_warehouses_close(this, ' + _key + ', \'' + element.parentElement.parentElement.parentElement.children[0].children[0].textContent + '\');"');
|
||||||
|
|
||||||
|
// Перезапись всплывающей подсказки
|
||||||
|
element.title = 'Закрыть';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page_profile_response_success(data, status, xhr);
|
||||||
|
},
|
||||||
|
error: page_profile_response_error
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function page_profile_warehouses_close(element, _key, name) {
|
||||||
|
if (confirm(`Закрыть склад "${name}"?`)) {
|
||||||
|
$.ajax({
|
||||||
|
url: '/profile/warehouses/close',
|
||||||
|
type: 'post',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
'_csrf': yii.getCsrfToken(),
|
||||||
|
_key
|
||||||
|
},
|
||||||
|
success: function (data, status, xhr) {
|
||||||
|
if (data !== undefined) {
|
||||||
|
// Получены данные с сервера
|
||||||
|
|
||||||
|
if (data.closed !== undefined && data.closed == true) {
|
||||||
|
// Получена информации об успешном открытии склала
|
||||||
|
|
||||||
|
// Перезапись иконки
|
||||||
|
element.classList.remove('fa-lock-open');
|
||||||
|
element.classList.add('fa-lock');
|
||||||
|
|
||||||
|
// Перезапись вызываемой функции
|
||||||
|
element.removeAttribute('onclick');
|
||||||
|
element.setAttribute('onclick', 'return page_profile_warehouses_open(this, ' + _key + ', \'' + element.parentElement.parentElement.parentElement.children[0].children[0].textContent + '\');"');
|
||||||
|
|
||||||
|
// Перезапись всплывающей подсказки
|
||||||
|
element.title = 'Открыть';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page_profile_response_success(data, status, xhr);
|
||||||
|
},
|
||||||
|
error: page_profile_response_error
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function page_profile_warehouses_delete(_key, name) {
|
||||||
|
if (confirm(`Удалить склад "${name}"?`)) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/profile/warehouses/delete',
|
url: '/profile/warehouses/delete',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
|
@ -262,9 +344,7 @@ function page_profile_monitoring(change = 1, panel) {
|
||||||
'search': search,
|
'search': search,
|
||||||
'panel': panel
|
'panel': panel
|
||||||
},
|
},
|
||||||
success: function (data, status) {
|
success: function (data, status, xhr) {
|
||||||
page_profile_response_success(data, status);
|
|
||||||
|
|
||||||
// Ренициализация
|
// Ренициализация
|
||||||
let url = new URL(document.location);
|
let url = new URL(document.location);
|
||||||
|
|
||||||
|
@ -273,6 +353,8 @@ function page_profile_monitoring(change = 1, panel) {
|
||||||
|
|
||||||
// Запись в историю
|
// Запись в историю
|
||||||
history.pushState('', document.title, url.toString());
|
history.pushState('', document.title, url.toString());
|
||||||
|
|
||||||
|
page_profile_response_success(data, status, xhr);
|
||||||
},
|
},
|
||||||
error: page_profile_response_error
|
error: page_profile_response_error
|
||||||
});
|
});
|
||||||
|
|
Reference in New Issue