[История разработки] Терминал путевых листов




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

14 Comments

  1. lmnlmn

    Однозначно респект за «DIY» с терминалом!

    Reply
  2. s_vidyakin

    Выбор себя из списка можно исключить, если повесить камеру и запилить распознавание лиц, тут где-то была статья по созданию такой внешней компоненты для 1С 🙂 Вот кстати эти публикации — https://infostart.ru/public/868623/ и https://infostart.ru/public/605106/

    Или на крайний случай сканер отпечатков повесить, на алиэкспресс они рублей за 500

    RFID можно потерять или забыть

    Reply
  3. sm.artem

    Хорошая реализация! Мы сделали так на отдельном POS-терминале Атол Viva функционал выполнения операций.

    Вот только есть авторизация персонала через сканирование бейджика.

    Сейчас планируем масштабировать. И тоже рассматриваю вариант «простой» системник + сенсорный монитор вместо POS-терминала. Хотя может по цене в совокупности также будет.

    Reply
  4. EMelihoff

    У меня вопрос по навигации, скажите у Вас она показывает всегда 100% точно? А если пропадает сигнал с тех. средства, а потом появляется как поступаете?

    Reply
  5. rpgshnik

    (4) это уже явный саботаж со стороны водителя, по заверению того, главного диспетчера — сигнал просто так не пропадает. Тут уже ведутся профилактическая работа с водителем. А красть они любят и очень хитро. По этому и сигнал пропадать будет и на ходу сливы будут. Автограф позволяет внутри себя настроить соответствующие коэффициенты, чтобы фиксировать такие моменты. При желании их можно тоже интегрировать в 1С.

    Reply
  6. rpgshnik

    (2) сторонние POS-системы работают через RFID. Начиная с входа на предприятие, затем заправки, питание и всё по одной карте.

    Интересные публикации по распознаванию лица, но например меня мой смартфон Honor 8X не всегда может распознать. Конечно как альтернативный вариант идентификации можно 🙂

    Про палец тоже: грязный, порезанный, мокрый и уже не сканируется (ну это я про свой телефон). А на предприятие народ веселый, водителям погрузчиков дали планшеты, а они дрочили за продукцией :))) так что нужно надежное и крепкое оборудование 🙂

    Reply
  7. XOCTEP

    Не совсем понял слайд, с указанием количества литров на заправке. Вы пишите, что нужно вводить сумму, а на скрине — количество литров.

    И поправить орфографию в своей разработке, там много ошибок.

    Reply
  8. rpgshnik

    (7) имел ввиду, что сумма количества литров, если было две три заправке, вводиться сумма литров.

    Reply
  9. script

    Круть, однозначно.

    Reply
  10. user621724_Dimav1979

    И это работает! Своими глазами видел 🙂

    Reply
  11. user1233682

    Дмитрий, добрый день! Я представляю компанию «АвтоГРАФ», и нам бы хотелось обсудить с вами возможность публикации данного кейса на одном из наших сайтов. Если вам это интересно, свяжитесь, пожалуйста, со мной по адресу repin.d.a@yandex.ru

    Reply
  12. EasyWay

    (4)

    — грамотная установка прибора и антенн

    — резервирование GSM (2 сим-карты)

    — сглаживание и дорисовка треков в ПО мониторинга

    и все равно пропадает. но это уже единичные случаи.

    Reply
  13. EasyWay

    а «синяя» печать организации? а подписи и штампы уполномоченных лиц?

    Reply
  14. rpgshnik

    (13) а это уже коммерческая тайна 🙂

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *