Количество реализаций в час




Принцип обмена данными из 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='\

13 Comments

  1. ekaruk

    И в чем смысл и полезность этого отчета?

    Я еще понимаю, была бы какая-то аналитика за период. График распределения продаж по часам в течение какого-то периода.

    Но тупо группировка по количеству продаж в течение одного дня….

    По-моему публиковать такое как отдельную публикацию это неуважение к посетителям.

    Reply
  2. starik-2005

    (1) ekaruk, человек сидел, старался, писал отчет. Он ему показался неимоверно крутым, ибо создание его заняло большое время. А Вы вот так пришли и сказали все, что думаете, с высоты своего опыта.

    Хотя, конечно, отчет смешной.

    Reply
  3. ekaruk

    (2) starik-2005, Сидел, старался, писал отчет из одного запроса одного реквизита из одной таблицы.

    Подозреваю, что даже без формы все по умолчанию.

    У автора есть в профиле простые, но все-таки более полезные отчеты, так что причину появления тут этой публикации я лично не понимаю.

    Reply
  4. starik-2005

    (3) ekaruk, а вот, например, если бы отчет показывал количество документов с одним номером по видам документов и часам, то такой отчет был бы полезным на Ваш взгляд?

    Reply
  5. ekaruk

    (4) starik-2005,

    количество документов с одним номером по видам документов и часам

    Как-то мне сложно в предпредновогодний вечер осмыслить это предложение.

    На мой взгляд, он был бы полезным и интересным, если бы показывал «количество документов по видам документов и часам». Т.е. то же самое, но по всем документам построчно с общим итогом. И не за день, а за произвольный период времени.

    Reply
  6. starik-2005

    (5) ekaruk, я тут немного о другом. В 1С иногда происходит странная странность: создаются документы с одним и тем же номером — сбивается нумерация. Просто есть такой незамысловатый отчет, в котором за период по дням и часам выводятся документы одного вида, для которых Количество(Номер) > 1.

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

    Reply
  7. dima_finne

    (1) ekaruk, Не спорю, отчетик конечно простенький. Нужно было узнать, в какой час идет максимальный наплыв покупателей. Можно и руками посчитать, а можно и отчетом все вывести. Размещал его бесплатно, но что то пошло не так, и выставили за старт мани, как снять на бесплатно — не знаю.

    Reply
  8. starik-2005

    (7) вот это как раз говорит о том, что в аннотации надо было четко указать, зачем этот отчет, что могло бы предотвратить такую вот «первую» на него реакцию. Если добавить к отчету диаграмму и сделать период с анализом по месяцу/неделе/дню — вывод среднего почасового колебания, то отчету цены бы не было! )))

    Reply
  9. ekaruk

    (7) Такие данные за день не особо полезны для аналитики.

    Логичнее усреднять за период и группировать, например, по дням недели.

    По поводу бесплатно, то сами не сделаете.

    Только по согласовани с администрацией и не по принципу «потому что платно никто брать не будет», а скорее по принципу «вещь классная, в самом деле нужная и автор хочет ее дать бесплатно как можно большему числу людей»

    Если автор считает, что его вещь не стоит даже фантика (смартмани), то нет смысла эту вещь выкладывать.

    Reply
  10. TODD22

    (9) ekaruk,

    Такие данные за день не особо полезны для аналитики.

    Это вам не особо полезен. А есть те кому полезен. И анализировать количество продаж по часам на торговой точке иногда очень даже полезная вещь.

    Reply
  11. SerLeon

    По поводу публикации, отчет очень простой, но в нем действительно есть некоторый смысл. Так если вы его выкладываете на сайт, оформите его — прикрутите диаграммы, возможность выбирать несколько типов документов (не только РТУ), различные периоды группировки (не только час), произвольный отбор по периоду и т.д. А так получается идея какая-никакая есть, но реализация — однозначный минус.

    З.Ы. Автор, я не хочу придираться и по большому счету мне все равно, но вот вы программист, скажите мне, что значит «толстая форма»? Форма может быть обычной или управляемой, клиент может быть толстым или тонким, ну вы меня извините, вы же все-таки разработку выкладываете, выходит вы разработчик и такое невежество демонстрируете.

    Reply
  12. ZVN

    (13) starik-2005,

    какой народ? Что пишет?

    Народ — это и Вы тоже. Ведь зашли прочитали обругали и написали. Так сказать выразили своё ФУ.

    Типа ХОДЮТ ТУТ ВСЯКИЕ а ПОТОМ …..

    Reply
  13. starik-2005

    (14) ZVN, а Вы внимательнее прочитайте, что Я написал, а потом делайте выводы.

    Reply

Leave a Comment

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