Feature: API PostgreSQL — upsert по «Название», загрузка из БД при открытии

Made-with: Cursor
This commit is contained in:
cursor-agent
2026-04-06 08:59:29 +00:00
parent 5c0028c308
commit f506563cdb
11 changed files with 1272 additions and 28 deletions

View File

@@ -2,25 +2,47 @@
**Репозиторий:** https://git.gen7x.ru/cursor-agent/omc-servicedesk-monitor
**Публичный URL (прод):** https://sd.gen7x.ru/ — раздача через Nginx с сервера (`/opt/gen7x/nginx/conf.d/sd.gen7x.ru.conf`).
**Публичный URL (прод):** https://sd.gen7x.ru/ — статика и API через Nginx (`/opt/gen7x/nginx/conf.d/sd.gen7x.ru.conf`).
Одностраничный дашборд для мониторинга инцидентов ServiceDesk: KPI, диаграммы, таблица и разбивка по сотрудникам. Работает в браузере без бэкенда — данные загружаются из CSV, JSON или Excel (.xlsx / .xls) с той же таблицей колонок.
Дашборд инцидентов ServiceDesk: KPI, диаграммы, таблица, разбивка по сотрудникам. Загрузка файла (CSV, JSON, Excel) **сохраняется в PostgreSQL**: ключ записи — целое число из поля **«Название»**; при совпадении ключей строка **обновляется**, иначе **добавляется**. При открытии страницы данные **подгружаются из базы** (если API доступен).
## Запуск
## База данных и API
### Локально
- БД: PostgreSQL, база `omc_sd_monitor`, таблица `incidents` (`number_key` PK, `data` JSONB с полями как в экспорте).
- API (Node.js, Express): `GET /api/incidents`, `POST /api/incidents/sync`, `GET /api/health`.
- Контейнер `omc-sd-api` в Docker-сети `docker_gen7x_network`, порт на хосте `127.0.0.1:3910`; Nginx проксирует `https://sd.gen7x.ru/api/` → этот порт.
Откройте в браузере файл [`index.html`](index.html) (двойной клик или `file://`). Для быстрой проверки можно загрузить [`sample-data.csv`](sample-data.csv).
Создание базы (один раз, от суперпользователя Postgres):
### Docker
```sql
CREATE DATABASE omc_sd_monitor;
```
В `.env` задайте `DATABASE_URL` (см. `.env.example`). Спецсимволы в пароле — в URL-кодировании (например `/``%2F`).
Запуск только API на сервере:
```bash
cd /opt/omc-servicedesk-monitor
cp .env.example .env # при необходимости измените PORT
docker compose up -d
# .env с DATABASE_URL
docker compose up -d api
```
Страница: `http://localhost:${PORT}` (по умолчанию 8080).
## Запуск
### Локально (только UI)
Откройте [`index.html`](index.html). Без API сохранение в БД недоступно (будет сообщение об ошибке после разбора файла). Пример данных: [`sample-data.csv`](sample-data.csv).
### Docker (статика + опционально API)
```bash
cd /opt/omc-servicedesk-monitor
cp .env.example .env # задать DATABASE_URL для API
docker compose up -d # web на PORT, api на 3910
```
Страница статики: `http://localhost:${PORT}` (по умолчанию 8080).
## Формат данных
@@ -30,7 +52,7 @@ docker compose up -d
| Колонка | Описание |
|---------|----------|
| Название | Номер заявки (число) |
| Название | Номер заявки (число), ключ в БД |
| Статус | Код статуса (см. бейджи в интерфейсе) |
| Ответственный (команда) | Команда |
| Ответственный (сотрудник) | Исполнитель |
@@ -42,28 +64,22 @@ docker compose up -d
| Кем решен (сотрудник) | Непустое значение трактуется как закрытый инцидент |
| Уникальный идентификатор | UUID для ссылки в ServiceDesk |
### JSON
### JSON / Excel
Массив объектов с теми же ключами полей, что и в CSV.
### Excel
Первый лист книги; первая строка — заголовки, совпадающие с колонками CSV (те же русские названия). Поддерживаются `.xlsx` и устаревший `.xls`. Разбор в браузере через SheetJS (`xlsx`, CDN).
Те же поля (русские названия колонок). Excel: первый лист, первая строка — заголовки.
## Недельная динамика
График «хронология по неделям» и таблица под ним заполняются константой `WEEK_STATS` внутри `index.html` и **не** зависят от загружаемого файла. Обновляйте массив вручную при необходимости.
График по неделям и таблица под ним задаются константой `WEEK_STATS` в `index.html`, не из БД.
## Стек
- Chart.js (CDN)
- PapaParse 5.4.1 (CDN)
- SheetJS xlsx 0.18.5 (CDN) — Excel
- Шрифты: Barlow Condensed, IBM Plex Sans, IBM Plex Mono (Google Fonts)
- Фронт: Chart.js, PapaParse, SheetJS xlsx, шрифты Google Fonts.
- Бэк: Node 20, `express`, `pg` (каталог `server/`).
## Логи и бэкапы
Статический файл; логи приложения отсутствуют. Резервное копирование — копия каталога проекта или репозитория Git.
Логи API: `docker logs omc-sd-api`. Данные инцидентов — в PostgreSQL (общий бэкап кластера). Статика — файлы в каталоге проекта.
## История изменений