Алгоритм sarmat_timer - Прием товара

korvin
Администратор
Сообщения: 201
Зарегистрирован: 18 ноя 2017, 15:36

Алгоритм sarmat_timer - Прием товара

Сообщение korvin » 29 ноя 2019, 13:42

В модуле таймера каждые N секунд (параметр настраивается) делается опрос tcp/ip штрих-сканеров из таблицы sarmat.scanner, у которых is_present=1 (пристуствует в системе) и sc_trype=0 (сканеры на прием товаров). Если считанный штрих-код не равен штрих-коду, считанному на предыдущем шаге, и является реальным штрих-кодом (а не строкой «No read») то считаем, что на входе новый контейнер, который нужно обработать по следующему алгоритму:
  • ищем полученный штрих-код в MSSQL табличке ASK_REC по полю box = полученному штрих-коду
    • если такого ШК нет в таблице ASK_REC со Status = 0, то подать звуковое сообщение об ошибке
    • если ШК найден в таблице ASK_REC со Status = 0, то:
      • послать команду товарному серверу «GoodDesc.AddInfo»
        • если Oracle вернул ошибку, то проверить ее ф-ией is_ora_bkp_error:
          • если ф-ия вернула true, то прекратить работу программы
          • иначе продолжить выполнение данного алгоритма (см. шаг ниже)
      • послать команду товарному серверу «Container.Accept», сохранив автосгенерированный command_gas.id
        • если ошибка посыла команды, то проверить ее ф-ией is_ora_bkp_error:
          • если ф-ия вернула true, то прекратить работу программы
          • иначе:
            • вывести в лог сообщение об ошибке
            • подать звуковой сигнал об ошибке
            • ask_rec.state:=2 - через "RunMSSQL"
        • иначе (командой «UpdateMSSQLFromOracle») считать соотв. команду command_gas с сохраненным на предыдущем шаге command_gas.id
          • если command_gas.state=1, то сделать апдейт таблицы mssql ASK_REC:
            • state:=1,
            • ask_id:= сохраненный command_gas.id
          • если command_gas.state=2, то сделать апдейт таблицы mssql ASK_REC:
            • state:=2,
            • ask_id:= сохраненный command_gas.id, звуковой сигнал об ошибке

Также в этом же цикле далее ищутся все записи в таблице mssql ask_rec у которых state=1. Для каждой найденной записи выбирается соотв. запись command_gas (и далее через команды «RunMSSQL» и «RefreshMSSQLContainer»):
  • если command_gas.cell_out_name <> ask_rec.cell_name, то сделать update ask_rec.cell_name:=command_gas.cell_out_name
  • если command_gas.zone_letter <> ask_rec.zone_letter, то сделать update ask_rec.zone_letter:=command_gas.zone_letter
  • если у соотв. command_gas state=2, то делаем update соотв. ask_reс state:=2
  • если у соотв. command_gas state=5, то делаем update соотв. ask_reс state:=5
  • обновляем mssql таблицу container_placemnet по стандартному алгоритму

tanya
Сообщения: 21
Зарегистрирован: 03 дек 2019, 13:02

Типичные цепочки проверки приема

Сообщение tanya » 03 дек 2019, 13:54

  1. Сканер сканирует штрих-код, которого нет в ASK_RET вообще: необходимо издать звуковой сигнал ошибки
  2. Сканер сканирует штрих-код, который есть в ASK_RET, но со статусом <>0 : необходимо издать звуковой сигнал ошибки
  3. Сканер сканирует штрих-код, который есть в ASK_RET со статусом =0. Далее:
    • в первые секунды после подачи команды:
      • должны означиться поля соотв. mssql таблицы ask_rec: CELL_NAME и ZONE_LETTER
      • должна создаться запись CONTAINER_PLACEMENT (если ее нет по такому коду контейнера) или найтись
      • должны обновиться поля записи CONTAINER_PLACEMENT (по стандартной процедуре обновления container_placement):
        • container_rp_id = подсклад ячейки для приема контейнеров
        • container_cell_name = ячейка приема
        • good_desc_id - код товара
        • quantity - количество товара
    • по ходу движения контейнера должны менятся поля в соотв. mssql таблице CONTAINER_PLACEMENT по стандатрной процедуре обновления записи в mssql.container_placement (штрих-код контейнера у нас прописан в ask_reс) вплоть до достижения контейнером места постоянного хранения.

tanya
Сообщения: 21
Зарегистрирован: 03 дек 2019, 13:02

Протоколирование приема

Сообщение tanya » 03 дек 2019, 15:57

Все логи, касающиеся приема товара (Oracle и MSSQL) будут иметь префикс [+] сразу после времени. Ниже перечислены виды логов в mssql_log.txt:

«10:53:25.218 + BOX 00010324 - search in ask_rec»

«16:10:19.187 + BOX 00010324 - found successfully in ask_rec.id=123»

«16:10:27.171 + BOX 00010324 - updating ask_rec.id 123: cell_name=001L175»

«16:10:27.203 + BOX 00010324 - updating ask_rec.id 123: zone_letter=B»

«16:12:09.484 + BOX 00010324 - updating ask_rec.id 123: status=5»

Виды логов в oracle_log.txt:

«16:10:20.593 + BOX 00010324 - GoodDesc.AddInfo sending, good_desc_id=6921181»

«16:10:21.859 + BOX 00010324 - sending Container.Accept…»

«16:10:23.156 + BOX 00010324 - Container.Accept sent successfully»

«16:10:23.375 + BOX 00010324 - updating ASK_REC.id 123: status=1, ask_id=2»

«16:12:09.453 + BOX 00010324 - COMMAND_GAS.STATE=5»


Вернуться в «АСК ЭТМ»