Расписание занятости помещений/сотрудников




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

12 Comments

  1. идея хорошая

    Reply
  2. MaxiSoft

    «Не смог реализовать перетаскивание из поля табличного документа. Ни кто не делал?» Вся проблема в том что ты не смог реализовать по причине бага в документации по самой платформе, в частности в описании методов табличного поля НачалоПеретаскивания и прочих.

    В доке написано что для табличного поля данные методы будут работать только при установленном значении ТОЛЬКО ПРОСМОТР = ИСТИНА, на самом деле это небольшая ложь, убираешь признак только просмотра и все начинает работать, табличное поле сразу же начинает вести себя адекватно в плане того, что оно является как источником так и приемником для перетаскивания.

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

    Reply
  3. Путин

    Заработало. Спасибо. В моей очень толстой книжке ещё указано что «Защита» тоже должна быть «Истина». Оказывается тоже нельзя устанавливать «Защита», иначе событие «ПроверкаПеретаскивания» не срабатывает.

    Reply
  4. MaxiSoft

    А еще если бы ты сделал компоновку граф немного иначе например сверху бы вывел название помещения чуть ниже всех кто там принимает это было бы вообще супер, да и график на неделю было бы правильнее смещать не вниз а в с торону, а так идея реально супер.

    Reply
  5. molot

    А я вот че замутил: http://infostart.ru/projects/4619/

    Reply
  6. Путин

    MaxiSoft (4). Упорство юзеров не отходить от привычного представления данных «как в экселе» переломить тяжело. А в нём было именно вниз. Хотя я и сам не задумался об этом. 🙂

    molot (5). Поначалу я все сделал на Ганте. За основу брал готовый отчет из конфигурации CRM_Проф. Но пользователи приняли в штыки, да так рьяно охаяли, что пришлось забыть о диаграмме.

    Reply
  7. wolder

    А если щелкнуть по белому полю (свободному внемени) создается документ занятости?

    Reply
  8. MaxiSoft

    (7) Пока этого нет, новый документ создается при нажатии контекстного меню. Но было бы практичнее сделать именно клик по ячейке и тогда предложить тип документа или еще что!

    Reply
  9. Путин

    Обновил отчет. Теперь работает перетаскивание. информация выводится не 5-минутными интервалами, а часовыми. Изменения оформил новым отчетом, сохранив старый. Ещё раз спасибо to MaxiSoft, заказчик очень хотел перетаскивание, а с такими глюками в документации… М-да.

    Reply
  10. C-Noptik

    Только не получается драг-н-дроп — просто тупо ячейки выделяются

    Reply
  11. avavadim

    Спасибо за функционал…

    Reply
  12. ksnik

    Я делал, у меня перетаскивается http://infostart.ru/public/139090/

    Reply

Leave a Comment

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