Изменение отображения в поиске

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-06-07 03:49:13 +10:00
parent fab290eacd
commit 21cec0c5b4
14 changed files with 343 additions and 221 deletions

View File

@ -150,45 +150,39 @@ class OrderController extends Controller
// Инициализация входных данных // Инициализация входных данных
$account = yii::$app->user->identity; $account = yii::$app->user->identity;
$supplies = yii::$app->request->post('supplies'); $supply_id = yii::$app->request->post('supply_id');
$amount = yii::$app->request->post('amount') ?? 1;
$delivery_type = yii::$app->request->post('delivery_type');
// Запись настроек ответа в буфер
yii::$app->response->format = Response::FORMAT_JSON; yii::$app->response->format = Response::FORMAT_JSON;
if (empty($supply_id) || empty($delivery_type)) {
// Не выполнены условия для выполнения
// 501 Not Implemented
yii::$app->response->statusCode = 501;
}
// Инициализация возврата по умолчанию // Инициализация возврата по умолчанию
$return = [ $return = [
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];
if (is_null($supplies)) { // Инициализация корзины
// 501 Not Implemented if (!$model = Order::search($account)) {
yii::$app->response->statusCode = 501; // Корзина не найдена (текущий заказ)
// Инициализация
$model = new Order();
$model->save() or throw new Exception('Не удалось инициализировать заказ');
// Запись ребра: АККАУНТ -> ЗАКАЗ
AccountEdgeOrder::write($account->readId(), $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
} }
if (!is_null($supplies)) { // Если запись не удалась, то вернуть код: 500 Internal Server Error
// Переданы поставки для записи $model->writeSupply($supply_id, $delivery_type, (int) $amount) or yii::$app->response->statusCode = 500;
if (!$model = Order::search($account)) {
// Корзина не найдена (текущий заказ)
// Инициализация
$model = new Order();
$model->save() or throw new Exception('Не удалось инициализировать заказ');
// Запись ребра: АККАУНТ -> ЗАКАЗ
AccountEdgeOrder::write($account->readId(), $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
}
// Проверка входных данных
if (!is_array($supplies)) {
// Неверные входные данные
// Запись ошибки
$model->addError('errors', 'Переменная должна быть массивом');
}
// Если запись не удалась, то вернуть код: 500 Internal Server Error
$model->writeSupply($supplies) or yii::$app->response->statusCode = 500;
}
return $return; return $return;
} }

View File

@ -105,9 +105,10 @@ class ProfileController extends Controller
// Инициализация // Инициализация
is_array($model->opts) || $model->opts = []; is_array($model->opts) || $model->opts = [];
// Запись // Запись в буфер
$model->opts = array_merge($model->opts, $vars['opts']); $model->opts = array_merge($model->opts, $vars['opts']);
// Запись в базу данных
$model->update(); $model->update();
} else { } else {
/** /**

View File

@ -165,6 +165,9 @@ class SearchController extends Controller
select: '{supply, supply_edge_product}' select: '{supply, supply_edge_product}'
); );
// Инициализация буфера
$buffer_connections = [];
if (count($connections) === 11) { if (count($connections) === 11) {
// Если в базе данных хранится много поставок // Если в базе данных хранится много поставок
@ -179,15 +182,16 @@ class SearchController extends Controller
$connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']); $connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']);
try { try {
// Инициализация доставки // Инициализация доставки (автоматическая)
$connection['delivery'] = Dellin::calcDeliveryAdvanced( $connection['delivery'] = Dellin::calcDeliveryAdvanced(
explode('_', $connection['account']['opts']['delivery_from_terminal'])[1], $buffer['account']['opts']['delivery_from_terminal'],
explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1], yii::$app->user->identity->opts['delivery_to_terminal'],
(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)
); );
$buffer['delivery']['type'] = 'auto';
} catch (Exception $e) { } catch (Exception $e) {
$connection['delivery']['error'] = true; $connection['delivery']['error'] = true;
@ -196,9 +200,47 @@ 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;
try {
// Инициализация доставки Dellin (самолётом)
$buffer['delivery'] = Dellin::calcDeliveryAdvanced(
$buffer['account']['opts']['delivery_from_terminal'],
yii::$app->user->identity->opts['delivery_to_terminal'],
(int) ($buffer['product']['wght'] ?? 0),
(int) ($buffer['product']['dmns']['x'] ?? 0),
(int) ($buffer['product']['dmns']['y'] ?? 0),
(int) ($buffer['product']['dmns']['z'] ?? 0),
avia: true
);
$buffer['delivery']['type'] = 'avia';
} catch (Exception $e) {
$buffer['delivery']['error'] = true;
// var_dump($e->getMessage());
// var_dump($e->getTrace());
// var_dump($e->getFile());
// die;
// var_dump(json_decode($e->getMessage(), true)['errors']);
// die;
}
if (!isset($buffer['delivery']['error']) || $buffer['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_connections[] = $buffer;
}
} }
$row = $connections; // Запись обработанных данных
$row['supplies'] = array_merge($connections, $buffer_connections);
} }
// Запись ответа // Запись ответа

View File

@ -362,14 +362,14 @@ class Account extends Document implements IdentityInterface, PartnerInterface
foreach ($city->data['terminals']['terminal'] as $termial) { foreach ($city->data['terminals']['terminal'] as $termial) {
// Перебор терминалов // Перебор терминалов
if (in_array('id_'.$termial['id'], $list, true)) { if (in_array($termial['id'], $list, true)) {
// Если встретился дубликат (исполняется очень часто) // Если встретился дубликат (исполняется очень часто)
continue; continue;
} }
// Запись // Запись
empty($termial['id']) or $list['id_'.$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')'; $list[$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')';
} }
} }
@ -393,15 +393,16 @@ class Account extends Document implements IdentityInterface, PartnerInterface
foreach ($terminals as $terminal) { foreach ($terminals as $terminal) {
// Перебор городов // Перебор городов
if (in_array('id_' . $terminal->dell, $list, true)) { if (in_array($terminal->dell, $list, true)) {
// Если встретился дубликат (исполняется очень часто) // Если встретился дубликат (исполняется очень часто)
continue; continue;
} }
// Запись // Запись
empty($terminal->cntr) && empty($terminal->city) && empty($terminal->strt) && empty($terminal->hous) // empty($terminal->cntr) &&
or $list['id_' . $terminal->dell] = "$terminal->city ($terminal->strt, $terminal->hous, $terminal->offs)"; empty($terminal->city) && empty($terminal->strt) && empty($terminal->hous)
or $list[$terminal->dell] = "$terminal->city ($terminal->strt, $terminal->hous" . (empty($terminal->offs) ? ')' : ", $terminal->offs)");
} }
return $this->syncListWithSettings($list, 'delivery_to_terminal'); return $this->syncListWithSettings($list, 'delivery_to_terminal');
@ -431,18 +432,18 @@ class Account extends Document implements IdentityInterface, PartnerInterface
unset($list[$this->opts[$var]]); unset($list[$this->opts[$var]]);
// Сохранение параметра в начале массива // Сохранение параметра в начале массива
$list = array_merge([$this->opts[$var] => $buffer], $list); $list = [$this->opts[$var] => $buffer] + $list;
} else { } else {
// Совпадение не найдено // Совпадение не найдено
// Сохранение параметра из данных аккаунта в начале массива // Сохранение параметра из данных аккаунта в начале массива
$list = array_merge([$this->opts[$var] => $this->opts[$var]], $list); $list = [$this->opts[$var] => $this->opts[$var]] + $list;
} }
} else { } else {
// Параметр $var не найден в настройках аккаунта // Параметр $var не найден в настройках аккаунта
// Сохранение параметра из данных аккаунта в начале массива // Сохранение параметра из данных аккаунта в начале массива
$list = array_merge(['Выберите' => 'Выберите'], $list); $list = ['Выберите' => 'Выберите'] + $list;
} }
return $list; return $list;

View File

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace app\models; namespace app\models;
use ArangoDBClient\Document as ArangoDBDocument;
class Dellin extends Document class Dellin extends Document
{ {
public static function collectionName(): string public static function collectionName(): string
@ -33,9 +35,26 @@ class Dellin extends Document
/** /**
* Поиск по идентификатору города * Поиск по идентификатору города
*
* @param string $id Идентификатор города
*/ */
public static function searchByCityId(string $id): ?static public static function searchByCityId(string $id): ?static
{ {
return static::findOne(['data["id"]' => $id]); return static::findOne(['data["id"]' => $id]);
} }
/**
* Поиск по идентификатору терминала
*
* @param string $id Идентификатор терминала
* @param bool $terminal_data_only Запрос только данных терминала
*/
public static function searchByTerminalId(string $id, bool $terminal_data_only = false): bool|static|array|null|ArangoDBDocument
{
if ($terminal_data_only) {
return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->select('terminal')->createCommand()->execute()->getAll()[0];
}
return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->one();
}
} }

View File

@ -100,35 +100,31 @@ class Order extends Document implements DocumentInterface
} }
/** /**
* Запись товара * Запись товара к заказу
* *
* $supply = [ Supply $supply, int $amount = 1 ] * $supply = [ Supply $supply, int $amount = 1 ]
* *
* @param Supply|array $supply Поставка * @param string $supply_id Идентификатор поставки
* @param string $delivery_type Тип доставки
* @param int $amount Количество
* @param Account $trgt Заказчик * @param Account $trgt Заказчик
* *
* @return int Количество записанных поставок * @return int Количество записанных поставок
* *
* @todo Создать параметр разделителя для администрации * @todo Создать параметр разделителя для администрации
*/ */
public function writeSupply(Supply|string|array $supply, Account $trgt = null): int public function writeSupply(string $supply_id, string $delivery_type, int $amount = 1, Account $trgt = null): int
{ {
// Инициализация // Инициализация
$trgt ?? $trgt = yii::$app->user->identity ?? throw new Exception('Не удалось инициализировать заказчика'); $trgt ?? $trgt = yii::$app->user->identity ?? throw new Exception('Не удалось инициализировать заказчика');
if ($supply instanceof Supply) { // Проверка корзины
// Передана инстанция класса поставки или второй элемент массива не является числом
// Унификация входных данных
$supply = [$supply->catn => 1];
}
if (is_null($this->_key)) { if (is_null($this->_key)) {
// Корзина не инициализирована // Корзина не инициализирована
// Инициализация // Инициализация корзины
if (!$this->save()) { if (!$this->save()) {
// Инициализация заказа не удалась // Инициализация корзины (активного заказа) не удалась
throw new Exception('Ошибка при записи заказа в базу данных'); throw new Exception('Ошибка при записи заказа в базу данных');
} }
@ -142,43 +138,46 @@ class Order extends Document implements DocumentInterface
} }
// Инициализация // Инициализация
$amount = 0; $amount_buffer = 0;
foreach (is_array($supply) ? $supply : [$supply => 1] as $supply_raw => $amount_raw) { // Обработка поставок
// Перебор поставок for ($i = 0; $i < $amount; $i++) {
// Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину)
for ($i = 0; $i < $amount_raw; $i++) { // Запись ребра: ЗАКАЗ -> ПОСТАВКА
// Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину) if (!$supply_model = Supply::searchById($supply_id) or !$order_edge_supply = OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) {
// Поставка не найдена или запись ребра не удалась
// Запись ребра: ЗАКАЗ -> ПОСТАВКА continue;
if (!$supply_model = Supply::searchByCatn($supply_raw) or !OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) { } else {
// Поставка не найдена или запись ребра не удалась // Ребро создано (товар подключен к заказу)
continue; // Обновление счётчика добавленных товаров
} else { $amount_buffer++;
// Ребро создано (товар подключен к заказу)
// Постинкрементация счётчика добавленных товаров // Запись типа доставки
$amount++; $order_edge_supply->dlvr = [
'type' => $delivery_type
];
$order_edge_supply->update();
// Запись в журнал // Запись в журнал
$this->journal('write', ['target' => $supply_model->readId()]); $this->journal('write', ['target' => $supply_model->readId()]);
}
} }
} }
if ($amount === 0) { if ($amount_buffer === 0) {
// Отправка уведомления // Отправка уведомления
self::notification('Неудачная попытка добавить товар в корзину'); self::notification('Неудачная попытка добавить товар в корзину');
} else if ($amount === 1) { } else if ($amount_buffer === 1) {
// Отправка уведомления // Отправка уведомления
self::notification('Товар ' . $supply_model->catn . ' добавлен в корзину'); self::notification('Товар ' . $supply_model->catn . ' добавлен в корзину');
} else { } else {
// Отправка уведомления // Отправка уведомления
self::notification('Добавлено ' . $amount . ' товаров в корзину'); self::notification('Добавлено ' . $amount_buffer . ' товаров в корзину');
} }
return $amount; return $amount_buffer;
} }
/** /**
@ -321,6 +320,14 @@ class Order extends Document implements DocumentInterface
select: '{supply, order_edge_supply}' select: '{supply, order_edge_supply}'
); );
// Разделение поставок по типам доставки
// foreach ($connections as $key => &$connection) {
// // Перебор поставок
// $connection
// }
// Инициализация реестра дубликатов // Инициализация реестра дубликатов
$registry = []; $registry = [];
@ -328,7 +335,10 @@ class Order extends Document implements DocumentInterface
foreach ($connections as $key => &$connection) { foreach ($connections as $key => &$connection) {
// Перебор поставок // Перебор поставок
if (in_array($connection['supply']['catn'], $registry)) { if (in_array([
'catn' => $connection['supply']['catn'],
'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto'
], $registry)) {
// Если данная поставка найдена в реестре // Если данная поставка найдена в реестре
// Удаление // Удаление
@ -350,7 +360,10 @@ class Order extends Document implements DocumentInterface
$amount++; $amount++;
// Запись в реестр // Запись в реестр
$registry[] = $connection_for_check['supply']['catn']; $registry[] = [
'catn' => $connection_for_check['supply']['catn'],
'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto'
];
} }
} }
@ -384,47 +397,61 @@ class Order extends Document implements DocumentInterface
// Поиск привязанного товара // Поиск привязанного товара
$connection['product'] = Product::searchBySupplyId($connection['supply']['_id']); $connection['product'] = Product::searchBySupplyId($connection['supply']['_id']);
try { if (empty($connection['order_edge_supply']['dlvr']) || $connection['order_edge_supply']['dlvr']['type'] === 'auto') {
// Инициализация доставки Dellin (автоматическая) // Доставка автоматическая
$connection['delivery']['auto'] = Dellin::calcDeliveryAdvanced(
explode('_', $connection['account']['opts']['delivery_from_terminal'])[1],
explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1],
(int) ($connection['product']['wght'] ?? 0),
(int) ($connection['product']['dmns']['x'] ?? 0),
(int) ($connection['product']['dmns']['y'] ?? 0),
(int) ($connection['product']['dmns']['z'] ?? 0),
count($connection['order_edge_supply'])
);
} catch (Exception $e) {
$connection['delivery']['auto']['error'] = true;
// var_dump(json_decode($e->getMessage(), true)['errors']); die; try {
// Инициализация доставки Dellin (автоматическая)
$connection['delivery'] = Dellin::calcDeliveryAdvanced(
$connection['account']['opts']['delivery_from_terminal'],
yii::$app->user->identity->opts['delivery_to_terminal'],
(int) ($connection['product']['wght'] ?? 0),
(int) ($connection['product']['dmns']['x'] ?? 0),
(int) ($connection['product']['dmns']['y'] ?? 0),
(int) ($connection['product']['dmns']['z'] ?? 0),
count($connection['order_edge_supply'])
);
} catch (Exception $e) {
$connection['delivery']['error'] = true;
// var_dump($e->getMessage());
// var_dump($e->getTrace());
// var_dump($e->getFile()); die;
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись цены (цена поставки + цена доставки + наша наценка)
$connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
} else {
// Доставка самолётом
try {
// Инициализация доставки Dellin (самолётом)
$connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced(
$connection['account']['opts']['delivery_from_terminal'],
yii::$app->user->identity->opts['delivery_to_terminal'],
(int) ($connection['product']['wght'] ?? 0),
(int) ($connection['product']['dmns']['x'] ?? 0),
(int) ($connection['product']['dmns']['y'] ?? 0),
(int) ($connection['product']['dmns']['z'] ?? 0),
count($connection['order_edge_supply']),
avia: true
);
} catch (Exception $e) {
$connection['delivery']['avia']['error'] = true;
// var_dump($e->getMessage());
// var_dump($e->getTrace());
// var_dump($e->getFile()); die;
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись цены (цена поставки + цена доставки + наша наценка)
$connection['cost']['avia'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['avia']['price']['all'] ?? $connection['delivery']['avia']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
} }
// Запись цены (цена поставки + цена доставки + наша наценка)
$connection['cost']['auto'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['auto']['price']['all'] ?? $connection['delivery']['auto']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
try {
// Инициализация доставки Dellin (автоматическая)
$connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced(
explode('_', $connection['account']['opts']['delivery_from_terminal'])[1],
explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1],
(int) ($connection['product']['wght'] ?? 0),
(int) ($connection['product']['dmns']['x'] ?? 0),
(int) ($connection['product']['dmns']['y'] ?? 0),
(int) ($connection['product']['dmns']['z'] ?? 0),
count($connection['order_edge_supply']),
avia: true
);
} catch (Exception $e) {
$connection['delivery']['avia']['error'] = true;
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись цены (цена поставки + цена доставки + наша наценка)
$connection['cost']['avia'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['avia']['price']['all'] ?? $connection['delivery']['avia']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
// Запись валюты // Запись валюты
$connection['currency'] = $cost['Валюта']; $connection['currency'] = $cost['Валюта'];
} }

View File

@ -26,7 +26,8 @@ class OrderEdgeSupply extends Edge
'comm', 'comm',
'cost', 'cost',
'time', 'time',
'stts' 'stts',
'dlvr'
] ]
); );
} }
@ -42,7 +43,8 @@ class OrderEdgeSupply extends Edge
'comm' => 'Комментарий', 'comm' => 'Комментарий',
'cost' => 'Цена', 'cost' => 'Цена',
'time' => 'Время', 'time' => 'Время',
'stts' => 'Статус' 'stts' => 'Статус',
'dlvr' => 'Доставка'
] ]
); );
} }
@ -76,6 +78,11 @@ class OrderEdgeSupply extends Edge
'time', 'time',
'integer', 'integer',
'message' => '{attribute} должно быть числом' 'message' => '{attribute} должно быть числом'
],
[
'dlvr',
'arrayValidator',
'message' => '{attribute} должен быть массивом'
] ]
] ]
); );

View File

@ -43,13 +43,15 @@ class Terminal extends Document
'city', 'city',
'strt', 'strt',
'hous', 'hous',
'offs', 'offs'
'dell'
], ],
'string' 'string'
], ],
[ [
'hndl', [
'dell',
'hndl'
],
'int' 'int'
], ],
[ [

View File

@ -13,7 +13,6 @@ use GuzzleHttp\Client as Guzzle;
use GuzzleHttp\Exception\ClientException as GuzzleException; use GuzzleHttp\Exception\ClientException as GuzzleException;
use Exception; use Exception;
use phpDocumentor\Reflection\Types\Nullable;
class Dellin extends Model class Dellin extends Model
{ {
@ -62,8 +61,8 @@ class Dellin extends Model
* Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара * Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара
* В API всегда идет рассчет для одного товара, так было решено * В API всегда идет рассчет для одного товара, так было решено
* *
* @param string $from Номер КЛАДР * @param string $from Идентификатор терминала Dellin
* @param string $to Номер КЛАДР * @param string $to Идентификатор терминала Dellin
* @param int $weight Вес (г) * @param int $weight Вес (г)
* @param int $x Ширина () * @param int $x Ширина ()
* @param int $y Высота () * @param int $y Высота ()
@ -80,6 +79,10 @@ class Dellin extends Model
return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia) { return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia) {
// Всё готово к работе // Всё готово к работе
// Инициализация
$from = DellinModel::searchByTerminalId($from, terminal_data_only: true);
$to = DellinModel::searchByTerminalId($to, terminal_data_only: true);
// Значения по умолчанию, если указан 0 // Значения по умолчанию, если указан 0
$x === 0 and $x = 25; $x === 0 and $x = 25;
$y === 0 and $y = 55; $y === 0 and $y = 55;
@ -131,11 +134,11 @@ class Dellin extends Model
$query['delivery']['deliveryType']['type'] = 'small'; $query['delivery']['deliveryType']['type'] = 'small';
$query['delivery']['derival']['variant'] = 'address'; $query['delivery']['derival']['variant'] = 'address';
$query['delivery']['derival']['address']['search'] = $from; $query['delivery']['derival']['address']['search'] = $from->fullAddress;
$query['delivery']['derival']['time']['worktimeStart'] = '08:00'; $query['delivery']['derival']['time']['worktimeStart'] = '08:00';
$query['delivery']['derival']['time']['worktimeEnd'] = '20:00'; $query['delivery']['derival']['time']['worktimeEnd'] = '20:00';
$query['delivery']['arrival']['variant'] = 'address'; $query['delivery']['arrival']['variant'] = 'address';
$query['delivery']['arrival']['address']['search'] = $to; $query['delivery']['arrival']['address']['search'] = $to->fullAddress;
$query['delivery']['arrival']['time']['worktimeStart'] = '08:00'; $query['delivery']['arrival']['time']['worktimeStart'] = '08:00';
$query['delivery']['arrival']['time']['worktimeEnd'] = '20:00'; $query['delivery']['arrival']['time']['worktimeEnd'] = '20:00';
} else { } else {
@ -155,9 +158,9 @@ class Dellin extends Model
} }
$query['delivery']['derival']['variant'] = 'terminal'; $query['delivery']['derival']['variant'] = 'terminal';
$query['delivery']['derival']['terminalID'] = $from; $query['delivery']['derival']['terminalID'] = $from->id;
$query['delivery']['arrival']['variant'] = 'terminal'; $query['delivery']['arrival']['variant'] = 'terminal';
$query['delivery']['arrival']['terminalID'] = $to; $query['delivery']['arrival']['terminalID'] = $to->id;
} }
// Инициализация // Инициализация
@ -222,10 +225,12 @@ class Dellin extends Model
/** /**
* Рассчет доставки * Рассчет доставки
* *
* @param string $from Номер КЛАДР * @param string $from Идентификатор терминала Dellin
* @param string $to Номер КЛАДР * @param string $to Идентификатор терминала Dellin
* *
* @return string * @return string
*
* @deprecated
*/ */
public static function calcDelivery(string $from, string $to): array public static function calcDelivery(string $from, string $to): array
{ {

View File

@ -40,41 +40,27 @@ use DateTime;
// Перебор поставок // Перебор поставок
// Инициализация доставки // Инициализация доставки
if (isset($connection['delivery']['auto']['error'])) { if (isset($connection['delivery']['error'])) {
// Не удалось рассчитать доставку // Не удалось рассчитать доставку
// Инициализация времени // Инициализация времени
$delivery_auto = '?'; $delivery = '?';
// Инициализация цены // Инициализация цены
$cost_auto = '?'; $cost = '?';
} else { } else {
// Удалось рассчитать доставку // Удалось рассчитать доставку
// Инициализация времени // Инициализация времени
$delivery_auto = ceil((DateTime::createFromFormat('Y-m-d', $connection['delivery']['auto']['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24) + 1; try {
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch(Exception $e) {
$delivery_converted = DateTime::createFromFormat('Y-m-d', $connection['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
// Инициализация цены // Инициализация цены
$cost_auto = $connection['cost']['auto'] . ' ' . $connection['currency']; $cost = $connection['cost'] . ' ' . $connection['currency'];
}
// Инициализация доставки
if (isset($connection['delivery']['avia']['error'])) {
// Не удалось рассчитать доставку
// Инициализация времени
$delivery_avia = '?';
// Инициализация цены
$cost_avia = '?';
} else {
// Удалось рассчитать доставку
// Инициализация времени
$delivery_avia = ceil((DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['avia']['orderDates']['giveoutFromOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24) + 1;
// Инициализация цены
$cost_avia = $connection['cost']['avia'] . ' ' . $connection['currency'];
} }
// Инициализация комментария // Инициализация комментария
@ -97,12 +83,10 @@ use DateTime;
<input id="cart_list_amnt_{$connection['supply']['catn']}" class="form-control text-center" type="text" value="{$connection['amount']}" onchange="return cart_list_amount_update('{$connection['supply']['catn']}', this)" aria-invalid="false"> <input id="cart_list_amnt_{$connection['supply']['catn']}" class="form-control text-center" type="text" value="{$connection['amount']}" onchange="return cart_list_amount_update('{$connection['supply']['catn']}', this)" aria-invalid="false">
</div> </div>
<div class="col-2 my-auto text-right"> <div class="col-2 my-auto text-right">
<a type="button" onclick="return false;">$delivery_auto дн</a> <a type="button" onclick="return false;">$delivery дн</a>
<a type="button" onclick="return false;">$delivery_avia дн</a>
</div> </div>
<div class="col-2 my-auto mr-3 text-right"> <div class="col-2 my-auto mr-3 text-right">
$cost_auto $cost
$cost_avia
</div> </div>
</div> </div>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>

View File

@ -31,13 +31,14 @@
<?php <?php
// Инициализация // Инициализация
extract($row[0]); extract($row);
$name ?? $name = 'Без названия'; $name ?? $name = 'Без названия';
// $dscr ?? $dscr = 'Описание'; // $dscr ?? $dscr = 'Описание';
$catg ?? $catg = 'Категория'; $catg ?? $catg = 'Категория';
$covr = null; $catn ?? $catn = 'Неизвестно';
// Инициализация обложки // Инициализация обложки
$covr = null;
foreach ($imgs ?? [] as $img) { foreach ($imgs ?? [] as $img) {
// Перебор изображений для обложки // Перебор изображений для обложки
@ -61,45 +62,80 @@
} }
} }
// Инициализация буфера с HTML поставок
$supplies_html = ''; $supplies_html = '';
// Инициализация блокировщика для пустого блока (на случай, если нет поставок, чтобы не было дубликатов вывода)
$empty_block = false;
// Инициализация счётчика поставок
$supplies_amount = count($row['supplies']);
// Инициализация указателя номера цикла
$supply_iterator = 1;
?> ?>
<?php <?php foreach ($row['supplies'] as $supply) : ?>
// Инициализация артикула <?php
$catn = $supply['catn'] ?? $supply['onec']['Артикул']; // Инициализация переменных
extract($supply);
// Инициализация цены // Инициализация цены
$price_raw = $cost; $price_raw = $cost;
$price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта']; $price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта'];
// Инициализация количества // Инициализация количества
$amount_raw = $amount = $supply['amnt'] ?? $supply_edge_product[0]['onec']['Количество']; $amount_raw = $amount = $supply['amnt'] ?? $supply_edge_product[0]['onec']['Количество'];
if (empty($amount_raw) || $amount_raw < 1) { if (empty($amount_raw) || $amount_raw < 1) {
// Уже не используется // Уже не используется
$amount = 'Под заказ'; $amount = 'Под заказ';
} else { } else {
$amount .= ' шт'; $amount .= ' шт';
} }
// Инициализация доставки// Инициализация доставки // Инициализация доставки
if (isset($delivery['error'])) { if (isset($delivery['error']) || $delivery === '?') {
// Не удалось рассчитать доставку // Не удалось рассчитать доставку
$delivery = '?'; $delivery = '?';
} else { } else {
// Удалось рассчитать доставку // Удалось рассчитать доставку
$delivery = (DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24 + 1; // Инициализация типа доставки
} $delivery_type = $delivery['type'] ?? 'auto';
// Инициализация индекса аккаунта // Инициализация индикатора
$index = $account['indx'] ?? 'Неизвестен'; $delivery_icon = match ($delivery_type) {
'avia' => '<i class="mr-1 fas fa-plane"></i>',
default => '<i class="mr-1 fas fa-truck"></i>'
};
if ($amount_raw < 1 || $price_raw < 1) { // Инициализация времени
// Нет в наличии или цена 0 рублей try {
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) {
$delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
}
$supplies_html .= <<<HTML // Инициализация индекса аккаунта
<div class="row my-auto m-0 h-100 text-right"> $index = $account['indx'] ?? 'Неизвестен';
// Инициализация модификатора класса
if ($supplies_amount > $supply_iterator) {
$supply_class_modifier = 'mb-1';
} else {
$supply_class_modifier = '';
}
if ($amount_raw < 1 || $price_raw < 1) {
// Нет в наличии или цена 0 рублей
if ($empty_block) continue;
$supplies_html .= <<<HTML
<div class="row $supply_class_modifier m-0 h-100 text-right">
<a class="col-auto ml-auto my-auto text-dark" href="/order/new/custom" role="button" onclick="return false;"> <a class="col-auto ml-auto my-auto text-dark" href="/order/new/custom" role="button" onclick="return false;">
<small> <small>
Заказать поиск у оператора Заказать поиск у оператора
@ -107,41 +143,42 @@
</a> </a>
</div> </div>
HTML; HTML;
} else {
// Есть в наличии
$supplies_html .= <<<HTML // Запись блокировщика
<div class="row my-auto m-0 h-100 text-right"> $empty_block = true;
<small class="col-1 my-auto ml-auto pl-2 pr-0"> } else {
$index // Есть в наличии
</small>
<small class="col-1 my-auto pl-2 pr-0"> $supplies_html .= <<<HTML
$amount <div class="row $supply_class_modifier m-0 text-right">
</small> <div class="col-5 mr-4"></div>
<small class="col-1 my-auto pl-2 pr-0 mr-2"> <small class="col-1 ml-2 my-auto pl-2 pr-0">$index</small>
$delivery дн <small class="col-1 my-auto pl-2 pr-0 text-center">$amount</small>
</small> <small class="col-auto mr-2 my-auto pl-2 pr-0 text-left">$delivery_icon $delivery дн</small>
<b class="col-2 my-auto"> <b class="col-2 ml-auto my-auto">$price</b>
$price <a class="col-1 ml-0 py-2 text-dark d-flex button_white rounded" title="Добавить $catn в корзину" role="button" onclick="return cart_write('{$supply['_id']}', '$delivery_type');">
</b>
<a class="col-1 h-100 text-dark d-flex button_white rounded" title="Добавить $catn в корзину" role="button" onclick="return cart_write('$catn');">
<i class="fas fa-cart-arrow-down pr-1 m-auto"></i> <i class="fas fa-cart-arrow-down pr-1 m-auto"></i>
</a> </a>
</div> </div>
HTML; HTML;
} }
?>
// Обновление счётчика
++$supply_iterator;
?>
<?php endforeach ?>
<div class="col pb-2"> <div class="col pb-2">
<div class="row p-2 rounded"> <div class="row p-2 rounded">
<img class="ml-0 h-100 img-fluid rounded" src="<?= $covr ?>" /> <img class="ml-0 h-100 img-fluid rounded" src="<?= $covr ?>" />
<div class="col-3 ml-3 p-0 d-flex flex-column"> <div class="col-3 ml-3 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $catn ?>"> <a class="my-auto text-dark" href="/product/<?= $catn ?>">
<h5 class="m-0"><?= $name ?></h5> <h5 class="m-0"><?= $name ?></h5>
<h6 class="m-0"><small><?= $catn ?></small></h6> <h6 class="m-0"><small><?= $catn ?></small></h6>
</a> </a>
</div> </div>
<div class="col-1 ml-2 p-0 d-flex flex-column"> <div class="col-1 ml-2 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $catn ?>"> <a class="my-auto text-dark" href="/product/<?= $catn ?>">
<small><?= $catg ?></small> <small><?= $catg ?></small>
</a> </a>

View File

@ -38,7 +38,7 @@ if (isset($history) && $history) {
foreach ($response as $row) { foreach ($response as $row) {
// Перебор найденных данных // Перебор найденных данных
$catn = $row[0]['supply']['catn']; $catn = $row['catn'];
echo <<<HTML echo <<<HTML
<a class="dropdown-item button_white text-dark" href="/product/$catn">$catn</a> <a class="dropdown-item button_white text-dark" href="/product/$catn">$catn</a>

View File

@ -1,14 +1,17 @@
#page_search nav>div, #page_search nav>div, #page_search section>div>div {
#page_search section>div>div { /* height : 65px; */
height : 65px;
background-color: #fff; background-color: #fff;
border-right : 0 solid #fff; border-right: 0 solid #fff;
transition : 100ms ease-in; transition: 100ms ease-in;
}
#page_search .row_fixed_height {
height: calc(65px - 1rem);
} }
#page_search section>div>div>img { #page_search section>div>div>img {
object-fit: cover; object-fit: cover;
width : calc(65px - 1rem); width: calc(65px - 1rem);
} }
/* #page_search nav > div, #page_search section > div:hover > div { /* #page_search nav > div, #page_search section > div:hover > div {
@ -27,4 +30,4 @@
#page_search .search_card .search_card_cart_icon { #page_search .search_card .search_card_cart_icon {
font-size: larger; font-size: larger;
} }

View File

@ -1,19 +1,19 @@
/** /**
* Записать в корзину (создать корзину, если не существует) * Записать в корзину (создать корзину, если не существует)
*/ */
function cart_write(catn, amount = 1) { function cart_write(supply_id, delivery_type, amount = 1) {
// Инициализация // Инициализация
let data = {}; let data = {};
data[catn] = amount; data['supply_id'] = supply_id;
data['amount'] = amount;
data['delivery_type'] = delivery_type;
data['_csrf'] = yii.getCsrfToken()
$.ajax({ $.ajax({
url: '/order/write', url: '/order/write',
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: data,
'_csrf': yii.getCsrfToken(),
'supplies': data
},
success: cart_response_success, success: cart_response_success,
error: cart_response_error error: cart_response_error
}); });