Библиотека — Книговыдача
Одной из самых первых задач поставленных передо мной, была реализация электронной книговыдачи на базе Drupal.
Как оно должно работать: читатель (студент/преподователь) показывает свой цифровой ключ (представляет из себя карточку на простой бумаге, с логином в двух вариантах отображения: штрихкод и текстовый), библиотекарь сканирует штрих код и открывается формуляр читателя. Читатель называет книги которые ему нужны, библиотекарь их приносит, и начинает сканировать штрих-коды с книг. После каждого сканирования выдаётся чек на принтер. Читатель расписывается в чеке за каждый экземпляр выданной ему книги и получает книги на руки. Всё.
Технические средства: сканер штрих кодов NoName, принтер Zebra EPL 2824.
Разработка: был написан парсер базы ИРБИС, под utf8:
$file=file_get_contents($files->filepath);
$file = str_replace(pack("CCC", 0xef, 0xbb, 0xbf), '', $file);
$arr=explode('*****',$file); $arr = array_diff($arr,array('')); # разбиваем на массив по разделителю (*****) и удаляем пустые элементы
foreach ($arr as $key=>$list): # цикл - обработка каждой книги
$s_arr = explode("\n", trim($list));
foreach ($s_arr as $str) { # обработка каждой строчки
preg_match('/^#(\d+): (.*)$/',$str,$res);
if ($res[1]=='700' or $res[1]=='701') {
$author = trim(preg_replace('#(\^\d+|\^.)#', ' ', $res[2]));
}
if ($res[1]=='200') {
$title = trim(preg_replace('#\^.#', ' ', $res[2]));
}
if ($res[1] == '461' and strlen($title)<10) {
$title = trim(preg_replace('#\^.#', ' ', $res[2]));
}
if ($res[1]=='910') {
// Когда количество наклееных штрихкодов на книгах станет больше 99999 следует исправить эту строчку
preg_match("/[H][0]{3}[0-9]{5}/", $res[2], $ololo);
$code = $ololo[0];
$shcode=substr($code, 1, strlen($code));
if (strlen($code)>0) { // echo '<b>'.$author.'</b> '.$title.' '.$shcode.'<br>';
} } }
$author = '';
endforeach;
}
Затем был словлен геморрой по настройке принтера. Он такой особый, что не сохраняет введённые настройки в виндовую оболочку дров. Путём нелёгких манипуляций он таки начал печатать прямо, так как нам надо. Пока никакой дизайн чеков не придумали, просто выводим системную информацию. Позже эта система будет изменена. Кстати о зебрах.
Zebra EPL 2824 использует язык программирования EPL. Когда в нём разбераешся, то печатать очень просто. Вот пример:
'N\n', 'A00,0,0,a,1,1,N,"Книга:"\n', 'A00,50,0,a,1,1,N,"'.$b1.'"\n', 'A00,100,0,a,1,1,N,"Код: '.$shcode.'"\n', 'A00,150,0,a,1,1,N,"Взял:'.$fio.'"\n', 'A00,200,0,a,1,1,N,"Логин: '.$login.'"\n', 'A00,250,0,a,1,1,N,"Подпись: _____________"\n', 'P1\n'
Где A — ASCII текст, p1 — позиция Х, p2 — позиция Y, p3 — шрифт.
Поскольку дефолтный шрифт не знал русского языка, пришлось заливать на него Arial с русскими символами через спец утилиту от производителя.
В общем метров 15 ленты я на тесты истратил. Облепил ей широкоформатный моник ![]()
Ещё была приделана аварийная форма для ввода данных вручную. Работает она по такому принципу: пока не все книги в библиотеке обладают штрих-кодами, соответственно их нет в базе книг. В форму вбивается автор, название книги, инвентарный номер (по которому можно однозначно опознать экземпляр в ИРБИСе) и наклеенный штрих код. С этой формы сразу идёт занесение на пользователя. Позже выводится отчёт, и в базу ИРБИСа вбиваются новые штрих коды. Затем когда базу перезаливают, те записи которые были сделаны через аварийную форму принимают нормальный вид (название по библиотечным ГОСТам и т.д.).
Как всё получилось: весь первый день я стоял в библиотеке и наблюдал как они работают. Без фокуса на поле и при большом формуляре им приходилось прокручивать форму вниз и кликать на нужном поле, что при больших объёмах непрактично. Вбивать вручную 10 одинаковых книг смертельно долго. Расписываться на каждом чеке тоже неудобно. Ещё несколько мелких программных багов, которые я за сегодня исправил.
Итого: в общем пока не получилось быстродействия. Я поправил дизайн, начал дорабатывать автофокус на нужном поле, и приделывать копирование для аварийной формы. Всё, и то что выплывет за следующие дни работы системы и сложит её конечное рабочее состояние.
ты сделал это!