Files
second-mind-aep/WAMAS System - Требования и спецификация.md
2025-09-12 14:42:44 +04:00

25 KiB
Raw Blame History

Функциональные требования

FR-001: Поддержка типов лотков

Описание: Система должна поддерживать работу с четырьмя типами лотков (TUB1, TUB2, TUB4, TUB8) с различным количеством активных ячеек.

Критерии приемки:

  • TUB1: поддержка 1 активной ячейки с одним SKU
  • TUB2: поддержка 2 ячеек с различными SKU
  • TUB4: поддержка 4 активных ячеек
  • TUB8: поддержка 8 активных ячеек (новый тип)
  • Валидация соответствия типа лотка и номера ячейки

FR-002: Контрольное сканирование товаров

Описание: Система должна обеспечивать контрольное сканирование товаров с поддержкой различных типов кодов.

Критерии приемки:

  • Поддержка сканирования SGTIN (2D QR-коды)
  • Поддержка сканирования EAN (1D штрих-коды)
  • Режим без сканирования для товаров, не требующих контроля
  • Валидация минимальной длины сканируемого кода (поле LEN)
  • Защита от двойного сканирования (таймер 0.5 сек)

FR-003: Световая индикация ячеек

Описание: Система должна обеспечивать точную световую индикацию активных ячеек для каждого типа лотка.

Критерии приемки:

  • TUB1: подсветка всех 8 лампочек
  • TUB2: подсветка 4 лампочек
  • TUB4: подсветка 2 лампочек
  • TUB8: подсветка 1 лампочки
  • Режим мигания для товаров со специальными маркерами

FR-004: Печать этикеток

Описание: Система должна поддерживать печать этикеток через сетевые принтеры.

Критерии приемки:

  • Управление сетевыми принтерами через WAMAS-C
  • Загрузка файлов из директории /hcom/to_ssi/print/pbl_network_printer/
  • Использование файла по умолчанию при недоступности основного
  • Обработка ошибок печати с соответствующими уведомлениями

FR-005: Инвентаризация

Описание: Система должна поддерживать процесс инвентаризации лотков хранения.

Критерии приемки:

  • Поячеечная инвентаризация лотков
  • Отображение наименований SKU (до 42 символов)
  • Ввод фактического количества через интерфейс станции
  • Многоэкранное отображение информации с навигацией
  • Автоматическая отправка результатов в HOST систему

FR-006: Обработка маркеров товаров

Описание: Система должна обрабатывать специальные маркеры товаров и отображать соответствующие индикации.

Критерии приемки:

  • Маркер "damaged" → отображение "МЕХ"
  • Маркер "careful" → отображение "СТЕКЛ"
  • Маркер "scan" + SGTIN=true → отображение "МАРКИР"
  • Маркер "scan" + SGTIN=false → отображение "КОНТР"

Нефункциональные требования

NFR-001: Производительность

  • Время отклика системы на действия оператора: не более 2 секунд
  • Пропускная способность: обработка до 100 операций в минуту на станцию
  • Время обработки сканирования: не более 1 секунды

NFR-002: Надежность

  • Доступность системы: 99.5% в рабочее время
  • Устойчивость к сбоям сети между WAMAS и HOST системой
  • Автоматическое восстановление после кратковременных отключений

NFR-003: Безопасность

  • Валидация всех входящих сообщений от HOST системы
  • Логирование всех операций для аудита
  • Защита от некорректных данных в XML сообщениях

NFR-004: Совместимость

  • Обратная совместимость с существующими процессами WAMAS
  • Поддержка существующего протокола HOST Communication
  • Совместимость с текущим аппаратным обеспечением PTL станций

NFR-005: Масштабируемость

  • Поддержка до 50 PTL станций одновременно
  • Возможность добавления новых типов лотков без изменения архитектуры
  • Горизонтальное масштабирование обработки сообщений

Технические характеристики

Аппаратные требования

  • PTL станции: Дисплеи, световые индикаторы, кнопки-мультилайты
  • Сканеры: Стационарные сканеры 1D/2D кодов на каждой станции
  • Принтеры: Сетевые принтеры этикеток (один на станцию)
  • Сетевая инфраструктура: Ethernet подключение для всех устройств

Программные требования

  • WAMAS-C: Центральная система управления складом
  • HOST система: ERP/WMS система верхнего уровня
  • База данных: Таблицы для хранения данных операций и кодов
  • Файловая система: Доступ к сетевым директориям для файлов печати

Протоколы и форматы

  • Обмен данными: XML сообщения между HOST и WAMAS
  • Коды товаров: SGTIN (2D QR), EAN (1D штрих-код)
  • Файлы печати: PDF формат для этикеток
  • Кодировка: UTF-8 для всех текстовых данных

Схема проекта

Архитектура системы

graph TB
    HOST[HOST System<br/>ERP/WMS] 
    WAMAS[WAMAS-C<br/>Controller]
    PTL1[PTL Station #001]
    PTL2[PTL Station #002]  
    PTLX[PTL Station #XXX]
    
    subgraph Equipment1 ["PTL Station Equipment"]
        DISP[Display]
        LIGHTS[Light Indicators]
        SCAN[Scanner]
        PRINT[Printer]  
        BTN[Buttons/Multilights]
    end
    
    HOST <==>|XML Messages| WAMAS
    WAMAS -->|Control Commands| PTL1
    WAMAS -->|Control Commands| PTL2
    WAMAS -->|Control Commands| PTLX
    
    PTL1 --> DISP
    PTL1 --> LIGHTS
    PTL1 --> SCAN
    PTL1 --> PRINT
    PTL1 --> BTN

Взаимодействие компонентов

sequenceDiagram
    participant HOST as HOST System
    participant WAMAS as WAMAS-C Controller
    participant PTL as PTL Station Hardware
    
    HOST->>WAMAS: disp-add, tub-type, inventory-new-add
    WAMAS->>PTL: Station Commands
    PTL->>WAMAS: Hardware Status & Scan Data
    WAMAS->>HOST: pick-response, print-response, inventory-response
    
    Note over HOST,PTL: XML Protocol Communication

База данных

erDiagram
    RESERVE_LINES_OW {
        int TRANSFERID PK
        int order_id
        int order_line_id
        string station_id
        boolean print
        boolean SGTIN
        int LEN
        string marker
    }
    
    TUB_TYPE_OW {
        int TRANSFERID PK  
        int box_number
        string tu_type
    }
    
    INVENTORY_OW {
        int TRANSFERID PK
        int box_number
        string tu_type
        string station_id
    }
    
    PICK_WO {
        int TRANSFERID PK
        int picked
        int pick_status
        string station_id
        int tub_number
    }
    
    PICK_CODE_WO {
        int TRANSFERID PK
        string item_code
    }
    
    PRINT_WO {
        int TRANSFERID PK
        int print_status
        string station_id
        int order_id
    }
    
    PICK_WO ||--o{ PICK_CODE_WO : "TRANSFERID"

Use Cases

UC-001: Сборка заказа с маркированным товаром (SGTIN)

flowchart TD
    A[Лоток прибывает на станцию] --> B[Отображение 'МАРКИР' и количества]
    B --> C[Подсветка ячейки лотка]
    C --> D[Оператор берет товар]
    D --> E[Сканирование SGTIN QR-код]
    E --> F{Длина кода >= LEN?}
    F -->|Нет| G[Сообщение 'Пересканировать']
    G --> E
    F -->|Да| H{QR читается?}
    H -->|Нет| I[Сканирование эталонного QR]
    I --> J[Режим 1.5.3]
    H -->|Да| K{Двойное сканирование?}
    K -->|Да| L[Сообщение 'ПОВТОР']
    L --> M[Мигание кнопки №2]
    M --> N[Нажатие кнопки №2]
    N --> B
    K -->|Нет| O[Уменьшение счетчика]
    O --> P{Все единицы отсканированы?}
    P -->|Нет| D
    P -->|Да| Q[Отображение 'ПОДТВЕРДИТЬ']
    Q --> R[Нажатие кнопки-мультилайт]
    R --> S[Отправка pick-response с item_code]

Актеры: Оператор склада, WAMAS-C, HOST система

Предусловия:

  • Лоток хранения находится на станции
  • Получено задание disp-add с SGTIN=true, marker="scan"

Основной поток:

  1. Система отображает "МАРКИР" и количество на дисплее
  2. Загорается подсветка нужной ячейки лотка
  3. Оператор берет единицу товара
  4. Оператор сканирует SGTIN (QR-код)
  5. Система проверяет длину кода (должна быть >= LEN)
  6. Система уменьшает счетчик на дисплее
  7. Повторяется пп. 3-6 для всех единиц
  8. Система просит подтверждение "ПОДТВЕРДИТЬ"
  9. Оператор нажимает кнопку-мультилайт
  10. Система отправляет pick-response с item_code для каждой единицы

Альтернативные потоки:

  • 5а. Код слишком короткий → "Пересканировать"
  • 5б. QR не читается → сканирование эталонного кода → режим 1.5.3
  • 4а. Двойное сканирование → "ПОВТОР" → возврат к п.3

UC-002: Сборка заказа с обычным товаром (EAN)

flowchart TD
    A[Лоток прибывает на станцию] --> B[Отображение 'КОНТР' и количества]
    B --> C[Подсветка ячейки лотка]
    C --> D[Оператор берет товар]
    D --> E[Сканирование EAN штрих-код]
    E --> F{Код читается?}
    F -->|Нет| G[Сканирование эталонного кода]
    G --> E
    F -->|Да| H{Защита от двойного сканирования<br/>0.5 сек}
    H -->|Блокировка| H
    H -->|OK| I[Уменьшение счетчика]
    I --> J{Все единицы отсканированы?}
    J -->|Нет| D
    J -->|Да| K[Отправка pick-response с item_code]

Актеры: Оператор склада, WAMAS-C, HOST система

Предусловия:

  • Лоток хранения находится на станции
  • Получено задание disp-add с SGTIN=false, marker="scan"

Основной поток:

  1. Система отображает "КОНТР" и количество на дисплее
  2. Загорается подсветка нужной ячейки лотка
  3. Оператор берет единицу товара
  4. Оператор сканирует EAN (штрих-код)
  5. Система уменьшает счетчик на дисплее
  6. Повторяется пп. 3-5 для всех единиц
  7. Система отправляет pick-response с item_code

Альтернативные потоки:

  • 4а. Код не читается → сканирование эталонного кода
  • 4б. Защита от двойного сканирования (таймер 0.5 сек)

UC-003: Печать этикетки

flowchart TD
    A[Получено задание с print=true] --> B[Отображение 'УПАК' и стрелки к принтеру]
    B --> C[Подсветка кнопки-мультилайт у принтера]
    C --> D[Оператор нажимает кнопку принтера]
    D --> E[Загрузка файла этикетки]
    E --> F{Файл доступен?}
    F -->|Нет| G[Использование default_label.pdf]
    F -->|Да| H[Отправка на принтер]
    G --> H
    H --> I{Печать успешна?}
    I -->|Да| J[print-response status=1]
    I -->|Нет| K[Сообщение 'ОШИБКА ПЕЧАТИ']
    K --> L[Повторное нажатие кнопки]
    L --> M[print-response status=2]
    J --> N[Продолжение основного процесса]
    M --> N

Актеры: Оператор склада, WAMAS-C, Принтер, HOST система

Предусловия:

  • Получено задание disp-add с print=true
  • Принтер подключен и готов

UC-004: Инвентаризация лотка

flowchart TD
    A[Получено задание inventory-new-add] --> B[Лоток прибывает на станцию]
    B --> C[Отображение 'ИНВЕНТАРИЗАЦИЯ']
    C --> D[Оператор подтверждает кнопкой №2]
    D --> E[Подсветка первой ячейки]
    E --> F[Отображение наименования SKU<br/>до 3 экранов]
    F --> G[Отображение 'КОЛ-ВО: 0']
    G --> H[Оператор вводит количество +/-]
    H --> I[Подтверждение кнопкой №2]
    I --> J{Есть еще ячейки?}
    J -->|Да| K[Переход к следующей ячейке]
    K --> E
    J -->|Нет| L[Отправка inventory-response]
    L --> M[Лоток покидает станцию]
    
    style A fill:#e1f5fe
    style L fill:#c8e6c9
    style M fill:#c8e6c9

Актеры: Оператор склада, WAMAS-C, HOST система

Предусловия:

  • Получено задание inventory-new-add
  • Лоток прибыл на станцию

UC-005: Валидация типа лотка

flowchart TD
    A[Получено сообщение disp-add] --> B[Получено сообщение tub-type]
    B --> C[Проверка соответствия tu_type и compartment_id]
    C --> D{Соответствие корректно?}
    D -->|Да| E[Обработка задания]
    D -->|Нет| F[Запись в таблицу со статусом error]
    
    G[Правила валидации:<br/>TUB1: compartment_id = 1<br/>TUB2: compartment_id = 1,2<br/>TUB4: compartment_id = 1,2,3,4<br/>TUB8: compartment_id = 1,2,3,4,5,6,7,8]
    
    style D fill:#fff3e0
    style F fill:#ffcdd2
    style E fill:#c8e6c9

Актеры: WAMAS-C, HOST система

Предусловия: Получено сообщение disp-add

Host Communication процессы

Обмен данными HOST → WAMAS

MSG-001: disp-add (Задание на резервирование товара)

graph LR
    subgraph "HOST System"
        A[Create Task]
    end
    
    subgraph "XML Message"
        B[disp-add<br/>TRANSFERID<br/>order_id<br/>print=true/false<br/>SGTIN=true/false<br/>marker=scan/damaged/careful<br/>LEN=минимальная длина]
    end
    
    subgraph "WAMAS Database"
        C[RESERVE_LINES_OW<br/>Table]
    end
    
    A --> B
    B --> C

Назначение: Создание задания на сборку товара из лотка хранения Формат: XML Таблица: RESERVE_LINES_OW

Структура сообщения:

<record_type="disp-add" TRANSFERID="12900129" tub_number="110002556">
  <disp-add-line 
    order_id="1877865" 
    order_line_id="1" 
    station_id="PTL001" 
    geo_code="001.01.01.01" 
    compartment_id="1" 
    ordered="5"
    host_order_line_id="1863829413" 
    print="true" 
    SGTIN="true"
    LEN="20"
    marker="scan">
  </disp-add-line>
</disp-add>

Ключевые поля:

  • TRANSFERID: Уникальный идентификатор сообщения
  • print: Флаг необходимости печати этикетки (true/false)
  • SGTIN: Наличие SGTIN кодов у товара (true/false)
  • LEN: Минимальная длина сканируемого кода
  • marker: Специальные маркеры (damaged/careful/scan)

MSG-002: tub-type (Определение типа лотка)

graph LR
    subgraph "HOST System"
        A[Define Tub Type]
    end
    
    subgraph "XML Message"
        B[tub-type<br/>TRANSFERID<br/>box_number<br/>tu_type=TUB1/TUB2/TUB4/TUB8]
    end
    
    subgraph "WAMAS Database"
        C[TUB_TYPE_OW<br/>Table]
    end
    
    A --> B
    B --> C

Назначение: Сообщение о типе лотка для валидации операций Формат: XML Таблица: TUB_TYPE_OW

Структура сообщения:

<tub-type TRANSFERID="12900130" box_number="110002556" tu_type="TUB4"/>

MSG-003: inventory-new-add (Задание на инвентаризацию)

graph LR
    subgraph "HOST System"
        A[Create Inventory Task]
    end
    
    subgraph "XML Message"
        B[inventory-new-add<br/>TRANSFERID<br/>box_number<br/>tu_type<br/>station_id<br/>sku_names]
    end
    
    subgraph "WAMAS Database"
        C[INVENTORY_OW<br/>Table]
    end
    
    A --> B
    B --> C

Назначение: Создание задания на инвентаризацию лотка Формат: XML Таблица: INVENTORY_OW

Структура сообщения:

<inventory-new-add TRANSFERID="12900131" box_number="110002556" tu_type="TUB2" station_id="PTL001">
  <inventory-line compartment_id="1" sku_name="Товар 1"/>
  <inventory-line compartment_id="2" sku_name="Товар 2"/>
</inventory-new-add>

Обмен данными WAMAS → HOST

MSG-101: pick-response (Отчет о сборке заказа)

graph LR
    subgraph "WAMAS Database"
        A[PICK_WO<br/>Table]
        B[PICK_CODE_WO<br/>Table]
    end
    
    subgraph "XML Message"
        C[pick-response<br/>TRANSFERID<br/>picked quantity<br/>pick_status<br/>item_codes array]
    end
    
    subgraph "HOST System"
        D[Process Results]
    end
    
    A --> C
    B --> C
    C --> D

Назначение: Подтверждение выполнения операции сборки с деталями Формат: XML Таблицы: PICK_WO, PICK_CODE_WO

Структура сообщения:

<pick-response 
  TRANSFERID="12900141" 
  tote_number="40009681" 
  geo_code="001.01.01.01"
  customer_code="448359" 
  host_order_id="1280449" 
  station_id="PTL001"
  tub_number="110002964" 
  pick_status="1" 
  compartment_id="1" 
  picked="2">
  <pick-response-line item_code="SGTIN:123456789012345"/>
  <pick-response-line item_code="SGTIN:123456789012346"/>
</pick-response>

MSG-102: print-response (Отчет о печати)

graph LR
    subgraph "WAMAS Database"
        A[PRINT_WO<br/>Table]
    end
    
    subgraph "XML Message"
        B[print-response<br/>TRANSFERID<br/>print_status=1/2<br/>station_id<br/>order_id]
    end
    
    subgraph "HOST System"
        C[Update Print Status]
    end
    
    A --> B
    B --> C

Назначение: Подтверждение статуса печати этикетки Формат: XML
Таблица: PRINT_WO

Структура сообщения:

<print-response 
  TRANSFERID="169954915" 
  print_status="1" 
  station_id="PTL001" 
  order_id="1877865"/>

Статусы печати:

  • 1: Печать выполнена успешно
  • 2: Ошибка печати

MSG-103: inventory-response (Результаты инвентаризации)

graph LR
    subgraph "WAMAS Database"
        A[INVENTORY_WO<br/>Table]
    end
    
    subgraph "XML Message"
        B[inventory-response<br/>TRANSFERID<br/>box_number<br/>station_id<br/>actual quantities]
    end
    
    subgraph "HOST System"
        C[Update Inventory]
    end
    
    A --> B
    B --> C

Назначение: Передача результатов инвентаризации лотка Формат: XML

Структура сообщения:

<inventory-response 
  TRANSFERID="12900131" 
  box_number="110002556" 
  station_id="PTL001">
  <inventory-line compartment_id="1" actual_qty="15"/>
  <inventory-line compartment_id="2" actual_qty="0"/>
</inventory-response>

Процессы интеграции

INT-001: Инициация сборки заказа

sequenceDiagram
    participant HOST as HOST System
    participant WAMAS as WAMAS-C
    participant PTL as PTL Station
    participant OP as Operator
    
    HOST->>WAMAS: tub-type (определение типа лотка)
    WAMAS->>WAMAS: Сохранение типа лотка
    HOST->>WAMAS: disp-add (задание на сборку)
    WAMAS->>WAMAS: Валидация tu_type vs compartment_id
    
    alt Валидация успешна
        WAMAS->>PTL: Активация станции
        PTL->>OP: Отображение задания
        
        alt Требуется печать (print=true)
            PTL->>OP: "УПАК" + подсветка принтера
            OP->>PTL: Нажатие кнопки принтера
            PTL->>PTL: Печать этикетки
            PTL->>WAMAS: Статус печати
            WAMAS->>HOST: print-response (status=1)
        end
        
        PTL->>OP: Отображение товара + подсветка ячейки
        OP->>PTL: Сборка товара (с/без сканирования)
        PTL->>WAMAS: Результат операции
        WAMAS->>HOST: pick-response (с item_code если было сканирование)
        
    else Ошибка валидации
        WAMAS->>WAMAS: Запись в таблицу со статусом error
    end

INT-002: Обработка ошибок

flowchart TD
    A["Получение сообщения"] --> B{"Валидация OK?"}
    B -->|"Нет"| C["Запись в таблицу с error"]
    B -->|"Да"| D["Обработка на PTL"]
    D --> E{"Принтер доступен?"}
    E -->|"Нет"| F["print-response status=2"]
    E -->|"Да"| G["Печать OK"]
    G --> H["print-response status=1"]
    F --> I["Продолжение без печати"]
    H --> I
    I --> J{"Сканирование OK?"}
    J -->|"Ошибка"| K["Эталонный код или режим исключения"]
    J -->|"OK"| L["pick-response с кодами"]
    K --> M["pick-response без кодов"]
    L --> N["Завершение"]
    M --> N

    style C fill:#ffcccc
    style F fill:#ffffcc
    style K fill:#ffffcc

INT-003: Мониторинг и логирование

graph TB
    subgraph "Входящие события"
        A[XML Messages]
        B[Scan Operations]  
        C[Print Events]
        D[Validation Results]
    end
    
    subgraph "Система логирования"
        E[Message Logger]
        F[Operation Logger]
        G[Error Logger]
        H[Performance Monitor]
    end
    
    subgraph "Метрики и отчеты"
        I[Response Time]
        J[Success Rate]
        K[Station Load]
        L[Error Statistics]
    end
    
    A --> E
    B --> F  
    C --> F
    D --> G
    
    E --> I
    F --> J
    F --> K
    G --> L
    
    style G fill:#ffcccc
    style L fill:#ffcccc