Страница 1 из 1

Отбор товара

Добавлено: 03 дек 2019, 16:05
tanya
По структуре данных:

  • удалится поле ask_id из mssql таблицы ask_pick1.
  • добавится новая mssql таблица ask_pick1_cmd (команды к серверу АСК на основании строки ask_pick1) с полями:
    • id - автоинкрементируемый
    • date_time - дата/время (сервера АСК) добавления записи ask_pick1_cmd - ставится sarmat_timer при добавлении новой записи
    • ask_pick1_id - на запись ask_pick1
    • ask_id - на sarmat.command_order.id
    • qty - сколько товара надо подвезти
    • qty_promis - сколько товара обещается подвезти АСК
    • status:
      • =0 - только добавили запись, но ответ от ASK еще не считали
      • =1 - ответ от АСК считан
      • =2 - ошибка добавления записи
      • =5 - все что могли, подвезли по команде (даже если подвозить нечего)
В модуле sarmat_timer в той части, что вызывается в цикле и где происходит опрос mssql таблиц, до опроса таблицы ask_rec, должен быть реализован следующий алгоритм:

1. НАЧАЛО РАБОТЫ СО СТРОКОЙ ЗАКАЗА

Добавлено: 03 дек 2019, 16:07
tanya
(аббревиатура для логов BGN) - ищутся записи в ask_pick1 со статусом=0

  • если такие есть, то для каждой записи делается update status=1

2. ОБРАБОТКА НЕДОСТАЧИ

Добавлено: 03 дек 2019, 16:24
tanya
ОБРАБОТКА НЕДОСТАЧИ (аббревиатура для логов DFCT) - ищутся записи в ask_pick2 со статусом=4, и с ask_status in (0,1). Eсли такие есть, то для каждой:

  • ищем, есть ли для данного контейнера (ask_pick2.box) необработанные АСК отборы (записи в ask_pick2 с тем же контейнером И с ask_state in (0,1) И state in (0,1,5)). если не найдено ни одной такой записи, то:
    • сделать commit (если нужно, типа закрепить в базе все сделанные ранее изменения)
    • готовим блок запросов к серверу Oracle:
      • Order.Container.Content.Remove (quantity = ask_pick2.qty_picked)
      • Order.Container.Content.Deficit (quantity = ask_pick2.qty-ask_pick2.qty_picked)
      • Commit
    • запускаем вышеуказанный набор команд одним блоком
    • если Oracle вернул ошибку, то проверить ее ф-ией is_ora_bkp_error:
      • если ф-ия вернула true, то
        • сделать Rollback
        • прекратить работу программы
      • иначе
        • сделать Rollback
        • вывести в лог сообщение об ошибке
        • прекратить работу текущего шага - больше по нему ничего не делать
    • иначе через процедуру "RunMSSQL"
      • обновить таблицу mssql.container_placement по стандартному алгоритму
      • ask_pick2.ask_status :=2
      • сделать update соотв. ask_pick1 qty_promis:=qty_promis - (ask_pick2.qty-ask_pick2.qty_pick)

3. ОБНОВЛЕНИЕ ОБЕЩАНИЙ ПОДВОЗА

Добавлено: 03 дек 2019, 16:27
tanya
(аббревиатура для логов RPROM) - ищутся записи в ask_pick1 со статусом=1, у которых qty<>qty_promis. Для каждой такой записи ищутся соотв. записи в таблице ask_pick1_cmd со status=0. Если такие найдены, то для каждой:
  • считываем соотв. command_order
  • если command_order.status<>0, то делаем одной командой «RunMSSQL»:
    • ask_pick1_cmd.state:=1
    • ask_pick1_cmd.qty_promis:=command_order.quantity_promis
    • делаем update соотв. ask_pick1.qty_promis=ask_pick1.qty_promis+ask_pick1_cmd.qty_promis

4. ВЫДАЧА КОМАНД ПОДВОЗА

Добавлено: 03 дек 2019, 16:35
tanya
(аббревиатура для логов CMD) - ищутся записи в ask_pick1 со статусом=1, у которых qty<>qty_promis. Для каждой такой записи ищутся соотв. записи в таблице ask_pick1_cmd со status=0. Если такие не найдены, то:
  • ищется последняя по времени запись в таблице ask_pick1_cmd с соотв. ask_pick1_id. (Если не найдено ни одной подобной записи) или (последняя найденная запись с qty_promis<>0) или (последняя найденная запись с qty_promis=0 и (текущее дата-время)-(дата-время последней команды)>sarmat.repository.TIMEOUT_EMPTY_CMD в сек), то значит надо дать команду:
    • добавляется соотв. команда Order.Content.Out с qty=(ask_pick1.qty-ask_pick1.qty_promis). Сохраняется ее id.
      • если возникает raise добавления записи в Oraсle, то проверить ее ф-ией is_ora_bkp_error:
        • если ф-ия вернула true, то выйти из программы
        • иначе
          • выводим соотв. лог с текстом
          • добавляется соотв. запись в ask_pick1_cmd (через команду "RunMSSQL") с полями из ask_pick1
          • ask_pick1_cmd.qty=ask_pick1.qty-ask_pick1.qty_promis
          • ask_pick1_cmd.qty_promis:=0
          • ask_pick1_cmd.status:=2
          • остальные поля дублируются из записи ask_pick1
      • если запись добавилась успешно в sarmat.command_order, то:
        • добавляется соотв. запись в ask_pick1_cmd (через команду «RunMSSQL») с полями из ask_pick1
        • результирующий command_order.id прописываем в ask_pick1_cmd.ask_id
        • ask_pick1_cmd.status:=0
        • ask_pick1_cmd.qty=ask_pick1.qty-ask_pick1.qty_promis
        • остальные поля дублируются из записи ask_pick1

5. ОБНОВЛЕНИЕ РЕАЛЬНОГО ПОДВОЗА

Добавлено: 03 дек 2019, 16:43
tanya
(аббревиатура для логов RP2) - ищутся записи в ask_pick1_cmd со статусом=1, если такие есть, то для каждой записи:
  • считать соответствующую sarmat.command_order и сохранить для анализа (важно - сделать это до следующего шага!)
  • затем считать sarmat.command_order_out_container у которых cmd_order_id=ask_pick1_cmd.ask_id и state=0, если такие имеются, то для каждой
    • сделать update соответствующей command_order_out_container.state:=1
      • если возникает raise изменения записи в Oraсle, то проверить ее ф-ией is_ora_bkp_error:
        • если ф-ия вернула true, то выйти из программы
        • иначе прекратить действия по данному шагу, перейти на начало алгоритма
    • добавить новую запись в ask_pick2 (Все нижеследующие пункты в данном пп. делать через команды RunMSSQL, RefreshMSSQLContainer, RunMSSQL). при этом:
      • qty:= из sarmat.command_order_out_container
      • qty_pick:=0
      • ask_pick1_id проставить верно, а не ask_pick1_cmd.id!!!
    • обновить mssql таблицу container_placement по стандартному алгоритму
  • если у считанной ранее команды sarmat.command_order поле state in (2,5), то присвоить соотв. ask_pick1_cmd.status:=sarmat.command_order.state (важно - это делать «RunMSSQL» последней в этом пункте)

6. ОСВОБОЖДЕНИЕ ЯЧЕЕК СБРОСА

Добавлено: 03 дек 2019, 16:49
tanya
(аббревиатура для логов CFREE) - ищутся записи в ask_pick2 со статусом=1, и с ask_status=0. если такие есть, то для каждой:
  • запись в лог
  • обновляем запись в mssql таблице container_placemant по стандартному алгоритму
  • если положение контейнера в mssql таблице container_placement «в складе», то:
    • даем команду товароному серверу Container.Remove (см. вики)
      • если возникает ошибка добавления записи в Oraсle, то проверить ее ф-ией is_ora_bkp_error:
        • если ф-ия вернула true, то выйти из программы
        • иначе выводим ошибку Oracle в log
      • если команда дана успешно, то:
        • запись в лог
        • через команды RunMSSQL и RefreshMSSQLContainer:
          • ask_pick2.ask_state:=1
          • опять обновить таблицу mssql.container_placement по стандартному алгоритму

7. ОБРАБОТКА УСПЕШНОГО ОТБОРА

Добавлено: 03 дек 2019, 16:53
tanya
(аббревиатура для логов OK) - ищутся записи в ask_pick2 со статусом=5, и с ask_status in (0,1). Eсли такие есть, то для каждой:
    ]
  • даем команду серверу заказов Order.Container.Content.Remove - после нее все нижеследующе в этом пп. делаем через команды RunMSSQL, RefreshMSSQLContainer
    • если она дана успешно, то:
      • ask_pick2.ask_state:=5
      • обновить таблицу mssql.container_placement по стандартному алгоритму
    • если ошибка raise, то проверить ошибку oracle ф-ией is_ora_bkp_error:
      • если она вернула true, то выйти из программы
      • иначе ask_pick2.ask_state:=2

8. ПРЕКРАЩЕНИЕ РАБОТЫ СО СТРОКОЙ ЗАКАЗА

Добавлено: 03 дек 2019, 16:55
tanya
(аббревиатура для логов END) - ищутся записи в ask_pick1 со статусом=1, у которых qty_promis=qty_pick.
  • Для каждой такой записи ищутся соотв. записи в таблице ask_pick1_cmd со status=0.
    • Если такие не найдены, то ищутся записи в таблице ask_pick2 с соотв. полем ask_pick1_id и ask_status in (0,1).
      • Если такие не найдены, то ask_pick1.state:=5 (и только в этом случае выводится лог по пп. END)

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

Добавлено: 03 дек 2019, 16:59
tanya
  • вначале запустить скрипт, подготавливающий mssql таблицу ask_rec (файл ini.sql).
  • на эмуляторе штрих-сканера сэмулировать последовательно (подождав, пока робот заберет контейнер) штрих-коды: 00010324, 00010340, 00010158, 00101705, 00101228
  • дождаться приема контейнеров на хранение (пока sarmat все привезет)
  • запустить скрипт на подвоз первой партии товара (файл ini_pick1_1.sql)
  • как подвезет контейнер, запустить скрипт начала отбора (файл ini_pick2_1.sql) - проверить, что соотв. команды сервера АСК отработались ОК
  • как подвезет контейнер, запустить скрипт успешного отбора (файл ini_pick2_5.sql) - проверить отработку команд сервера АСК
  • вернуть контейнер, сэмулировав соотв. штрих-код на эмуляторе сканера возврата
  • дождаться пока контейнер будет принят на хранение
  • запустить скрипт на подвоз второй партии товара (файл ini_pick1_2.sql)
  • как подвезет контейнер, запустить скрипт начала отбора (файл ini_pick2_1.sql)
  • запустить скрипт на недостачу (файл ini_pick2_4.sql)
  • проверить, что АСК сама примет решение на подвоз второго контейнера
  • как подвезет, запустить скрипт успешного отбора (файл ini_pick2_5.sql)
  • вернуть контейнер на склад, сэмулировав соотв. штрих-код на сканере возврата

Протоколирование отбора

Добавлено: 03 дек 2019, 17:00
tanya
Все логи, касающиеся отбора товара (Oracle и MSSQL) будут иметь префикс [- TOPIC_ABBR -] сразу после времени, где «TOPIC_ABBR» - абревиатура пп. алгоритма отбора. Например, логи в mssql_log.txt:

«20:39:49.265 - BGN - AP1 3456 w status=0 found»

«20:39:49.265 - BGN - update AP1 w 3456 set status=1»

«20:39:49.265 - RPROM - AP1 3456 w status=1 found (qty=34 qty_promis=20)»

«20:39:49.265 - RPROM - AP1 3456 AP1C 76 w STATUS=0 found»

«20:39:49.265 - RPROM - update AP1C w 76 set STATUS=1, qty_promis=10»

«20:39:49.265 - RPROM - update AP1 w 3456 set qty_promis=30»

«21:39:49.265 - CMD - AP1 3456 w STATUS=1 qty=34 qty_promis=20 found, AP1C w status=0 not found»

«21:39:49.265 - CMD - AP1 3456 should give command…»

«21:39:49.265 - CMD - add AP1C id=77, qty=10»

«21:39:49.265 - CMD - update AP1C w 77 set ask_id=6»

«16:59:56.656 - RP2 - add AP2: id=456, ask_pick1_id=456, box=00010234, qty=10»

«16:59:56.656 - CFREE - Found AP2 w status=1 & ask_status=0 & container in RP: id=456»

«16:59:56.656 - CFREE - Update AP2 w 456 set ask_state=1»

«16:59:56.656 - DFCT - Found AP2 w status=4 & delta=5 & ask_status=1: id=456»

«16:59:56.656 - DFCT - Update AP2 w 456 set ask_state=2»

«16:59:56.656 - DFCT - Update AP1 w 48 set qty_promis=45»

«16:59:56.656 - OK - Found AP2 w status=5 & ask_status=1: id=456»

«16:59:56.656 - OK - Update AP2 w 456 set ask_state=5»

«16:59:56.656 - END - Found AP1 w status=1 & qty=10 & qty_promis=10: id=78»

«16:59:56.656 - END - Update AP1 w 78 set status=5»

Логи в oracle_log.txt:

«20:41:32.937 - RPROM - Cmd_order 678 with state=1 found»

«16:59:16.687 - CMD - Sending Order.Content.Out…»

«16:59:16.703 - CMD - Order.Content.Out successfully executed, id=6»

«16:59:56.625 - RP2 - Found cmd_ooc w state=0: CMD_ID=5, BOX=00010324, GD_ID=6921181, QTY=1»

«16:59:56.640 - RP2 - Update command_order_out_container w 456 set state = 1»

«16:59:56.656 - CFREE - Sending Container.Remove w BOX=00010224…»

«16:59:56.656 - CFREE - Container.Remove successfully executed, id=6»

«16:59:56.656 - DFCT - Sending Order.Container.Content.Deficit w BOX=23423423…»

«16:59:56.656 - DFCT - Order.Container.Content.Deficit successfully executed, id=7»

«16:59:56.656 - OK - Sending Order.Container.Content.Remove w BOX=23423423…»

«16:59:56.656 - OK - Order.Container.Content.Remove successfully executed, id=7»