Завдання та передумови
Знайти замовлення з від’ємною сумою та надіслати контрольній групі стислий звіт двома каналами.
Приклад містить навчальні дані та налаштування. Виберіть власні тестові джерела й підключення замість ідентифікаторів demo_*, відтворіть очікуваний результат і лише потім використовуйте робочі об’єкти.
Приклад описує налаштування, а не надає дозвіл надсилати повідомлення реальним людям. Жодних листів чи повідомлень під час підготовки документації не надсилалося.
Навчальні вхідні дані
orders.csv
Order;Amount
O1;100
O2;-15
O3;50
Блоки, зв’язки й точні налаштування
Топологія прикладу 20: 6 блоків, 5 зв’язків. Збережено ідентифікатори вузлів і порти налаштованого графа.
Додайте наведені блоки в конструктор, відкрийте властивості кожного й установіть такі значення. Назви demo_* позначають навчальні джерела та підключення.
| Блок | Налаштування |
|---|---|
| 1 Файл src |
|
| 2 Маршрутизація router |
|
| 3 Розгалужувач split |
|
| 4 Лист електронною поштою email |
|
| 5 Повідомлення в Telegram telegram |
|
| 6 Вивантаження даних valid |
|
Зв’язки портів
- src
out→ routerin - router
invalid→ splitin - router
else→ validin - split
mail→ emailin - split
chat→ telegramin
Повна конфігурація графа JSON
{
"version": 3,
"nodes": [
{
"id": "src",
"type": "file",
"label": "src",
"config": {
"role": "source",
"source_id": "demo_notify_orders",
"options": {
"sheet": "CSV",
"range": "A1:B4",
"header": true,
"delimiter": ";"
}
}
},
{
"id": "router",
"type": "router",
"label": "router",
"config": {
"mode": "first",
"default_route": true,
"routes": [
{
"id": "invalid",
"label": "Від’ємна сума",
"predicates": [
{
"column": "Amount",
"op": "lt",
"value": 0,
"numeric": true,
"value_mode": "constant"
}
]
}
]
}
},
{
"id": "split",
"type": "splitter",
"label": "split",
"config": {
"branches": [
{
"id": "mail",
"label": "Пошта"
},
{
"id": "chat",
"label": "Telegram"
}
]
}
},
{
"id": "email",
"type": "email",
"label": "email",
"config": {
"connection_id": "demo_smtp",
"to": "[email protected]",
"subject": "UBC Data Bridge: винятки {{$date}}",
"body": "Потік {{$flow}}. Кількість винятків: {{$rows}}.\n{{$table}}",
"format": "text",
"time_zone": "Europe/Kyiv"
}
},
{
"id": "telegram",
"type": "telegram",
"label": "telegram",
"config": {
"connection_id": "demo_telegram",
"recipient_type": "auto",
"chats": "-1000000000000",
"text": "Потік {{$flow}}: винятків {{$rows}}.\n{{$table}}",
"parse_mode": "none",
"silent": true,
"time_zone": "Europe/Kyiv"
}
},
{
"id": "valid",
"type": "export",
"label": "valid",
"config": {
"format": "csv",
"filename": "valid_orders",
"destination": "download",
"delimiter": ";",
"timezone": "Europe/Kyiv"
}
}
],
"edges": [
{
"source": "src",
"target": "router",
"source_port": "out",
"target_port": "in"
},
{
"source": "router",
"target": "split",
"source_port": "invalid",
"target_port": "in"
},
{
"source": "router",
"target": "valid",
"source_port": "else",
"target_port": "in"
},
{
"source": "split",
"target": "email",
"source_port": "mail",
"target_port": "in"
},
{
"source": "split",
"target": "telegram",
"source_port": "chat",
"target_port": "in"
}
]
}Очікуваний результат
Навчальні рядки дають 1 виняток O2=-15. На гілці invalid створюється лист і повідомлення з кількістю 1 та таблицею цього рядка. valid_orders.csv містить O1=100 і O3=50. З наведеними адресами-заповнювачами реальна доставка не очікується.
Запуск і перевірка
- Створіть власні тестові підключення SMTP і Telegram; замініть адресу та ID чату лише на погоджені тестові одержувачі.
- Спочатку перевірте маршрутизацію й склад таблиці в попередньому перегляді; обидва канали мають отримати тільки O2.
- Виконайте навчальний запуск з реальними тестовими реквізитами, перевірте журнал кожного отримувача та доставку в обох каналах.
- Повторіть перевірку без від’ємних сум: гілка invalid не активується й повідомлення не повинні створюватися.
Типові помилки
- [email protected] і -1000000000000 — заповнювачі, не готові одержувачі.
- {{Order}} або {{$row}} у шаблоні робить його залежним від рядка; наведений шаблон використовує загальну кількість і таблицю.
- Некоректні або відсутні назви полів у тегах зупиняють підготовку повідомлення.
- silent=true вимикає звук Telegram; воно не скасовує надсилання.
- Невдала доставка одного каналу не доводить, що другий не відправив повідомлення: перевіряйте окремі статуси перед повтором.