simulate.py воспроизводит полный pipeline без Camunda/Java: Kafka → EnrichProfile → ClassifyPain (AI) → priority gateway → route-to-department → ProactiveContact/HumanTask → CSAT → Close Эмулирует обращения к моковым внешним системам (CRM, ASC, NetworkMon, Finance, STPK, WhatsApp, Notifier). Выходные артефакты: dashboard/cases.json — 7 кейсов детракторов в формате REST API dashboard/simulation.log — лог симулированных вызовов Дашборд теперь читает cases.json как fallback когда /api/v1/cases недоступен — даёт деплой на Gitea Pages без backend (ветка gitea-pages). |
||
|---|---|---|
| ai-service | ||
| bpmn | ||
| dashboard | ||
| data/synthetic | ||
| sql | ||
| workers | ||
| .gitignore | ||
| docker-compose.yml | ||
| GITEA.md | ||
| PRD.md | ||
| README.md | ||
| simulate.py | ||
| TRD.md | ||
Адвокат клиента — MVP (Iteration 1)
Реализация TRD.md, Итерация 1 (MVP).
Стек: Camunda 7.21 · Spring Boot 3 (workers) · PostgreSQL 15 · FastAPI (AI) · Nginx static (dashboard) · всё в Docker Compose.
Что внутри
| Каталог | Что |
|---|---|
bpmn/ |
client-advocate-main.bpmn, route-to-department.bpmn |
sql/ |
DDL для PostgreSQL + создание camunda БД |
data/synthetic/appeals.json |
7 синтетических детракторов из PRD §1.2 |
workers/ |
Spring Boot — все Iter-1 воркеры + REST API на :8082 |
ai-service/ |
FastAPI — keyword-based sentiment + classifier на :8081 |
dashboard/ |
Статический HTML/JS дашборд на :3000 |
Production URLs (Traefik)
После push в main сервер автоматически поднимает стек через docker-compose.yml.
- Дашборд (UI + API): https://advocate.telecom.quest
- Camunda Cockpit: https://advocate-camunda.telecom.quest/camunda (логин
demo/demo) - Workers REST: https://advocate.telecom.quest/api/v1/cases (проксируется через nginx дашборда)
Внутренние сервисы (postgres, workers, ai-service) наружу не выставлены — только через Traefik роутеры.
Внешняя Traefik-сеть называется traefik. Если у вас другое имя — поправьте networks.traefik.name и traefik.docker.network лейблы в docker-compose.yml.
Локальный запуск
Для запуска без Traefik (без ports: теперь по умолчанию недоступно с хоста), создайте docker-compose.override.yml:
services:
dashboard: { ports: ["3000:80"] }
camunda: { ports: ["8080:8080"] }
workers: { ports: ["8082:8082"] }
postgres: { ports: ["5432:5432"] }
Затем:
docker compose up --build
MockEventProducer ждёт 30 секунд после старта, затем каждые 30 секунд запускает по одному из 7 кейсов через Camunda REST.
Что увидите
| Кейс | Клиент | Обращений | Ожидаемый приоритет | Маршрут |
|---|---|---|---|---|
| №1 | KT-10000001 | 98 | ⚫ BLACK | Human Task → personal escalation |
| №6 | KT-10000006 | 59 | ⚫ BLACK | Human Task |
| №3 | KT-10000003 | 46 | ⚫ BLACK | Human Task |
| №5 | KT-10000005 | 15 | ⚫ BLACK | Human Task |
| №2 | KT-10000002 | 22 | ⚫ BLACK | Human Task |
| №4 | KT-10000004 | 22 | ⚫ BLACK | Human Task |
| №7 | KT-10000007 | 21 | ⚫ BLACK | Human Task |
BLACK кейсы блокируются на Human Task — открой Camunda Tasklist (http://localhost:8080/camunda/app/tasklist) с логином demo/demo и подтверди их вручную (требование PRD §5).
YELLOW кейсы пауза 4 часа на SLA timer (TRD §4.3) — для демо считать корректным.
API
GET /api/v1/cases — список всех кейсов
GET /api/v1/cases/{id} — кейс + рекомендации + лог событий
POST /api/v1/cases — создать кейс вручную
POST /api/v1/cases/{id}/csat — принять CSAT-ответ
Дальше (по TRD §10)
- Iter 2 — реальные интеграции (CRM/ASC/WhatsApp/Kafka)
- Iter 3 — AI-слой (BERT sentiment, LLM рекомендации, churn-модель)
- Iter 4 — Kubernetes + нагрузочное тестирование
В этой папке инициализирован git и подключен remote origin → Gitea. См. GITEA.md.