Всем привет! С вами сегодня Лео, и я профессионально занимаюсь оцифровкой видеокассет уже больше 7 лет.

Скоро майские праздники, и поток клиентов возрастает. Да так, что с ними стало тяжело справляться - в сутки может прийти 7-8 человек, и попробуй их запомни. До этого дня использовал для учёта самописную панельку для учёта заказов на PHP, и программу "Бизнес Пак" для печати товарных чеков. В целом, их хватало. Но когда поток людей стал превышать все мыслимые нормы, было понятно, что надо с этим что-то делать.

Вот так выглядела панелька учёта заказов до внесения правок.
Вот так выглядела панелька учёта заказов до внесения правок.

Для решения вопроса было принято решение перевести всё на систему штрих-кодов. Иду на известную площадку объявлений, и покупаю себе за 500 рублей самый дешёвый сканер.

Сканер этот работает в режиме эмуляции клавиатуры - навели на код, он распознал и пропечатал.

Дописал панельку таким вот образом: внизу расположил поля ввода, которые ведут на add.php, inwork.php, и т.п., которые выполняют запрос в базу. Максимально просто, но работает.

Максимально просто, но работает.
Максимально просто, но работает.

На радостях скачал шрифты для создания кодов, распечатал на бумаге... И ничего! Сканер просто не сканирует код, либо сканирует с 5-6 попытки.

...Напечатал на глянцевой бумаге - работает! Как выяснилось, дело было в стандарте - в Code128 нужно было добавлять управляющие символы в начале и конце строки. И если на глянцевой бумаге сканер кое-как, но понимал код с ошибкой, то на матовой бумаге уже не мог его отсканировать.

Проблему решил использованием стандарта Code 39 - он намного проще для печати из любого текстового редактора, чем другие виды штрих-кодов.

Для этого достаточно закодировать номер в формате *1234567890*. Не вникая в теорию, проще говоря, звёздочки здесь - управляющие символы.

Печатаем, сканируем код... Всё работает!

Однако, сканер нам отдаёт код вида T000001. Как я понял после чтения документации на сканер - символ T здесь образуется из нескольких бит информации, которые он отдаёт софту, который должен понять что используется сканер.

Можно конечно перенастроить, но мы этот символ в PHP просто вырежем:

$num = htmlspecialchars($_POST["num"]);
$num = preg_replace('/[^0-9]/', '', $num);
if (strlen2($abc)<3)
{
echo "Номер заказа не может быть менее 3-х символов";
exit;
}
mysql_query ("UPDATE myloveclients SET `status` = 'open' WHERE `number` = '$num';");

"Пикаем" сканером по коду, и наш код успешно в базе!

Теперь при помощи штрих-кодов мы можем успешно менять номера заказов в базе, и даже смотреть телефона клиента :)


...Только вот как нам распечатать кучу кодов на одном листе? Можно конечно использовать специальный софт, но вот тащить 1,5 гб не очень хочется. В этом нам поможет Excel!

...Для этого просто скачем шрифт Code 39, и создадим 2 поля. Единичка в первом поле, двойка - во втором.

...Затем выделяем эти 2 ячейки и тянем вниз за вот этот уголок, насколько хватит.

Теперь у нас очень много циферок. Добавляем к концу кода символ "*" чтоб закрыть строку, и выбираем шрифт. Далее настраиваем столбцы и строки по вкусу. Ура, у нас есть пачка штриходов, которые можно напечатать!

Выглядит наша распечатка, кстати, так.
Выглядит наша распечатка, кстати, так.

Теперь можно клеить штрих-код к клиентскому заказу, и обновлять его статус.


...Только вот снова проблема. Мы утыкаемся в ручное заполнение товаров в программе "Бизнес-пак". Нам надо как-то сделать это быстрее.

Берём нашу панельку в качестве основы, в таблице sales создаём несколько полей - автоматический id строки, время добавления строки, id товара, id чека. Делаем интерфейс, заточенный исключительно под сканер.

В качестве товарных позиций - ID. Например, 0001 = "Оцифровка VHS", 0002 = "Оцифровка Video8", и т.д. Их мы распечатаем, чтоб повесить на стену.

Настало время для ChatGPT. Времени у меня было очень мало, поэтому написал индусский код в виде if-else, и попросил ChatGPT оптимизировать его. Она успешно справляется!

...Просим написать ещё кусок кода.

...В JS она тоже "умеет".

По итогу, с ChatGPT за час мы собрали вот такой товарный чек, который можно отправлять на печать :)

Формочки, заточенные под сканер, тоже есть.

В общем, теперь наш сканер штрих-кода "подружился" с PHP, а скорость обработки заказов увеличилась в несколько раз. Всем добра :)

Комментарии (11)


  1. Wesha
    17.04.2023 19:52
    +1

    Картинка

    ... так автор изобрёл компилятор из естественного языка в PHP.

    Который у любого нормального программиста — в голове.

    (Кстати, если ничего не передавать, то выдастся "цена товара 0 руб".)

    ... а программисты помнят, что Enter вызывает отработку кнопки Submit по умолчанию, причём отработка игнорируется, если кнопка disabled. Поэтому не нужно мутить никаких жабаскриптов:

    <form action="...">
      <!-- Эта кнопка Submit первая по очереди, поэтому по Enter "нажмётся" она -->
      <button type="submit" disabled style="display: none"/>
      <!-- ...но это нажатие ни к чему не приведёт, потому что она disabled,
           а кроме того, она ещё и невидима для юзера, поэтому тот будет
           в полных непонятках :) -->
      <button type="submit">Жмякай сюда мышой, чтобы РЕАЛЬНО отправить форму</button>
    </form>

    Как говориться, "сводить лошадь к воде много ума не надо. Но вот если вы научили её плавать на спине — вот тогда вы чего-то добились" (c)


    1. Valle
      17.04.2023 19:52
      +2

      Любой нормальный программист необязательно в курсе как php работает


      1. Wesha
        17.04.2023 19:52

        То есть любой, кто знает, как работает система, с к оторой он общается/работает — ненормальный? Спасибо, так Петровичу, который в гараже свой старый "жигуль" перебирает, и передам.


      1. FanatPHP
        17.04.2023 19:52

        Это вы к чему? "Компилятор из естественного языка в PHP" не требует знания того "как работает РНР". Собственно, говорящая жестянка, которая выдала этот код, знает и того меньше.
        Речь идет всего лишь о знании синтаксиса языка и самых примитивных алгоритмов. То есть буквально о переводе фразы "если у джона был два яблока, а а эндрю шесть..." в синтаксис ЯП. При чем здесь какое-то сокровенное знание о том, как ЯП будет этот код обрабатывать?


        1. Valle
          17.04.2023 19:52

          Я имел в виду что множество нормальных программистов включает тех кто на PHP ни разу не программировал, никаких подвохов и оскорблений не имел в виду, извините что пришлось объяснять


          1. FanatPHP
            17.04.2023 19:52

            Понятно. То есть вы решили просто придраться к фразе "любой нормальный программист", даже без всякого контекста. Хотя под "PHP" там очевидно имеется в виду "язык, на котором программист пишет".


            Ну давайте тогда придираться дальше. Возьмем код c картинки


            if ($type >= 1 && $type <= 10) {
                $price = 2 * $poz;
            }

            и поищем программиста, который не в состоянии написать (или хотя бы прочитать) этот код. Предлагайте варианты. Меня вполне устроит "вот я — Valle, программист, "синьер" и занимаюсь бигдатой. Ваще не понимаю, что здесь написано. Мне для этого потребуется глубокое изучение механизма работы интерпретатора РНР".


            1. Valle
              17.04.2023 19:52

              Надеюсь вам не нужно глубокое изучение русского языка для понимания фразы «никаких подвохов и оскорблений не имел в виду»


              1. FanatPHP
                17.04.2023 19:52

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


  1. csharpreader
    17.04.2023 19:52
    +2

    Отлично. Очень интересно видеть пусть и велосипед на костылях (я по-доброму), но в практическом применении.


  1. FanatPHP
    17.04.2023 19:52
    +1

    Я бы скорее сказал, что chatGPT успешно облажался. Как обычно.


    Причем я даже не буду упоминать оператор ??, который заменяет простыню с isset.


    Главная проблема здесь — это утверждение "позволяет избежать ошибки, если тип не существует". Совершенно идиотское, как раз в стиле этого генератора галлюцинаций.


    Если подумать, то ошибку "тип не существует" этот код никак не исправляет. Тип (хотя на самом деле не тип, а его имя) из ниоткуда волшебным образом не появляется. Ошибка (логическая), как была — так и осталась.


    То есть этот код не исправляет, а подавляет, и не ошибку, а сообщение об ошибке.


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


    А вместо этого код просто выдает пустоту. Но зато сообщения об ошибке нету! Ну чисто страус — раз не видно сообщения об ошибке, то и ошибок нет, правда же?


    Если бы ваш жестяной помощник был хоть чуть-чуть поумнее, хотя бы на уровне способного джуниора, то написал бы либо


    $name = $services[$post['type']];

    и тогда сообщение об ошибке подскажет программисту, что он забыл добавить в $services новый тип. Либо мог бы сделать более щадящий вариант, который информирует о проблеме, но при этом программа продолжает работать штатно:


    $name = $services[$post['type']] ?? "Неизвестный тип ".$post['type'];


  1. vassabi
    17.04.2023 19:52

    в общем - кроме багов джуниоров, будут еще и баги ChatGPT.

    Единственная надежда, что оно будет обучаться быстрее, чем будут выходить новые фреймворки и стандарты ....