Автоматизация: Построение оргструктуры организации в два клика




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

16 Comments

  1. coder1cv8

    Ну у меня, конечно, попроще… 🙂 Но ведь и простота — это иногда плюс! 🙂

    Reply
  2. wmp

    Ууууу какая штука, для моей конторы в которой появляется и исчезает раз в день по 999 филиалов, подразделений, складов и торговых точек это просто находка.

    Reply
  3. GSoft

    (1) согласен, я его переписывал раз 5 с нуля, и были моменты когда хотелось плюнуть на дорисовки линий — их вручную за две минуты проще было дорисовать)))))

    А если серьезно то простоту я старался реализовать с точки зрения пользователя — не надо ломать голову разрабатывая структуру иерархии основаную на коде или что-нибудь аналогичное. Тем более нет надобности постоянно проверять правильность указания кодов — при печати из справочника запускается процедура автопроверки уровней. ТО есть от пользователя требуется только знать родительское подразделение и все! А это действительно простота))

    (2) по плюсам не видно что для тебя это находка)))))

    Reply
  4. GSoft

    Будет время выложу построение телефонного справочника на основе этого алгоритма.

    Reply
  5. bambula

    Пока товарищ GSoft плохого не выкладывал. Можно структуры предприятия проектировать 🙂 Но было бы очень шикарно, если сюда привязать сотрудников, с описанием о количестве человек в каждом отделе… А при выборе определенного сотрудника показывать его историю повышения/понижения в должности (перемещение между отделами). Но плюсик обязательно надо ставить!

    Reply
  6. GSoft

    (5) спасибо за лестные слова)))))

    >с описанием о количестве человек в каждом отделе

    это можно, но если речь идет именно о количестве

    что касается повышения — понижения — не вижу смысла, так как тогда отчет будет привязан к определенной конфигурации

    Reply
  7. highlander

    Но все таки я не могу понять смысл этой строчки:

    Код
     ТЗ.УстановитьЗначение(НомерСтроки,Инд+2-Инд2,Подчиненный.ВходитВСостав); 

    Показать полностью

    Что такое Подчиненный.ВходитВСостав?

    Reply
  8. highlander

    Наверное должно было выглядеть так:

    Код
     ТЗ.УстановитьЗначение(НомерСтроки,Инд+2-Инд2,Подчиненный); 

    Показать полностью

    ?

    Reply
  9. highlander

    (7,8)ой…. сорри… уже увидел. Разобрался.

    Reply
  10. GSoft

    чтобы не запутаться там почти к каждой такой переменной в начале блока идет комментарий

    Reply
  11. leo232006

    Поставлю,попробую и тогда + или-

    Reply
  12. GSoft

    Вот так и бывает, сначала поставлю и попробую… а в результате ни тебе плюса ни тебе минуса. И непонятно то ли все плохо то ли наоборот все хорошо)

    Reply
  13. AS108

    СПАСИБО! У меня в одной конторе 200 подразделений (ЗиК), Отчет по Штатному расписанию типовой моих бухгалтеров не устраивает, потому как долго формируется и мало информации, надеюсь, что с вашим отчетом облегчу им жизнь. А вообще искала отчет по ШР с ФИО людей по подразделениям и с вакансиями — занятыми, свободными и если чел временно не работает, то бишь в декрете. Пока не нашла. Буду смотреть Вашу. Ставлю плюс заранее — за идею 🙂

    Reply
  14. GSoft

    отпишитесь пожалуйста по результату — так как я сам на ЗиКе не тестировал то что получится, Единственно что придется выставить для каждого подразделения «родителя».

    Reply
  15. alyuev

    Интересно, а генеалогическое дерево с помощью этой обработки можно нарисовать? 😀

    Reply
  16. GSoft

    можно даже в текущем исполнении — вместо подразделений указать людей — вот только будет оно не сверху вниз как обычно(или наоборот) а слева направо

    Reply

Leave a Comment

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