*/ final class metals_model extends core { /** * Расчёт скорость реза металла * * @param string $metal Металл * @param string $gas Газ * @param float $lenght Толщина * @param array &$errors Журнал ошибок * * @return float|int Скорость реза (мм/с) */ public static function cut(string $metal, string $gas, float $lenght, array &$errors = []): float|int { try { return (float) settings::read("cut_speed_${metal}_${gas}_$lenght", $errors) ?? throw new exception('Не удалось определить скорость реза металла'); } catch (exception $e) { // Запись в журнал ошибок $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } return 0; } /** * Определение веса * * @param string $type Тип * @param array &$errors Журнал ошибок * * @return float|null Вес (кг) */ public static function kg(string $type = 'stainless_steel', array &$errors = []): ?float { try { return (float) match ($type) { 'steel' => 8, 'galvanized_steel' => 8, 'stainless_steel' => 8.7, 'brass' => 8.7, 'copper' => 9, 'aluminum' => 3, default => throw new exception('Не удалось определить тип металла') }; } catch (exception $e) { // Запись в журнал ошибок $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } return null; } /** * Запись в базу данных * * @param int $supply Идентификатор записи поставки в базе данных * @param string $type Тип * @param string $mark Марка * @param float $width Ширина (мм) * @param float $height Высота (мм) * @param float $length Толщина (мм) * @param int $piece Цена за лист (руб) * @param int $ton Цена за тонну (руб) * @param array &$errors Журнал ошибок * * @return bool Статус записи */ public static function write(int $supply, string $type, string $mark, float $width, float $height, float $length, int $piece, int $ton, array &$errors = []): bool { try { if ($account = accounts::account($errors)) { // Инициализирован аккаунт // Инициализация запроса $request = static::$db->prepare("INSERT INTO `metals` (`supply`, `type`, `mark`, `width`, `height`, `length`, `piece`, `ton`, `account`) VALUES (:supply, :type, :mark, :width, :height, :length, :piece, :ton, :account)"); // Инициализация параметров $params = [ ':supply' => $supply, ':type' => $type, ':mark' => $mark, ':width' => $width, ':height' => $height, ':length' => $length, ':piece' => $piece, ':ton' => $ton, ':account' => $account['id'], ]; // Отправка запроса $request->execute($params); // Получение ответа return $request->fetch(pdo::FETCH_ASSOC) !== false; } } catch (exception $e) { // Запись в журнал ошибок $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } return false; } /** * Чтение из базы данных * * Очищает от дубликатов * * @param string $type Тип * @param string $mark Марка * @param float $length Толщина * @param array &$errors Журнал ошибок * * @return float|null Цена за 1 килограмм (руб) */ public static function read(string $type, string $mark, float $length, array &$errors = []): ?array { try { // Инициализация запроса $request = static::$db->prepare("SELECT `width`, `height`, `piece`, `ton` FROM `metals` WHERE `type` = :type && `mark` = :mark && `length` = :length LIMIT 30"); // Отправка запроса $request->execute([ ':type' => $type, ':mark' => $mark, ':length' => $length ]); // Генерация ответа $response = $request->fetchAll(pdo::FETCH_ASSOC); // Проверка на полученные значения if (!is_array($response)) return false; if (count($response) === 1) return $response[0]; else if (count($response) > 1) { // Найдено более чем одно значение // Инициализация буфера вывода $buffer = $response[0]; foreach ($response as $metal) { // Перебор полученных значений металлов // Запись в буфер металла с самой большей площадью листа if (($metal['width'] * $metal['height']) > ($buffer['width'] * $buffer['height'])) $buffer = $metal; } return $metal; } } catch (exception $e) { // Запись в журнал ошибок $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } return null; } /** * Поиск и чтение марок металла * * Очищает от дубликатов * * @param string $type Тип * @param array &$errors Журнал ошибок * * @return float|null Цена за 1 килограмм (руб) */ public static function marks(string $type = '*', array &$errors = []): ?array { try { // Инициализация запроса $request = static::$db->prepare("SELECT DISTINCT `mark` FROM `metals` WHERE `type` = :type"); // Отправка запроса $request->execute([':type' => $type]); // Генерация ответа $response = $request->fetchAll(pdo::FETCH_COLUMN); return $response === false ? null : (array) $response; } catch (exception $e) { // Запись в журнал ошибок $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } return null; } }