Веб-API для сбора, хранения и анализа технологических данных на промышленных предприятиях. Система имитирует работу с производственными линиями, датчиками и заказами в реальных условиях.
- Особенности
- Архитектура
- Технологический стек
- Структура проекта
- Быстрый старт
- API Документация
- Примеры использования
- Развертывание
- Разработка
- Двойная БД стратегия: PostgreSQL для сырых данных + SQL Server для агрегированных отчетов
- Промышленная аналитика: Расчет OEE (Overall Equipment Effectiveness), выявление аномалий, тренды
- Масштабируемость: Поддержка миллионов показаний датчиков с оптимизированными индексами
- Готовность к Production: Docker-контейнеры, миграции, полная документация
- Гибкая архитектура: Clean Architecture с четким разделением ответственности
graph TB
subgraph "Презентационный слой"
API[ASP.NET Core 8 Web API]
SW[Swagger UI]
end
subgraph "Бизнес-логика"
App[Application Layer<br/>Сервисы, DTO, Валидация]
end
subgraph "Инфраструктура"
Infra[Infrastructure Layer<br/>Репозитории, Контексты БД]
EF[EF Core + PostgreSQL]
Dapper[Dapper + SQL Server]
end
subgraph "Доменная модель"
Domain[Domain Layer<br/>Сущности, Интерфейсы]
end
subgraph "Базы данных"
Postgres[(PostgreSQL<br/>Сырые данные)]
MSSQL[(SQL Server<br/>Агрегированные данные)]
end
API --> App
App --> Domain
App --> Infra
Infra --> EF
Infra --> Dapper
EF --> Postgres
Dapper --> MSSQL
API --> SW
| Компонент | Технология | Назначение |
|---|---|---|
| Backend | ASP.NET Core 8 Web API | Основной фреймворк |
| Основная БД | PostgreSQL 16 + EF Core | Хранение сущностей и сырых данных |
| Аналитическая БД | SQL Server 2022 + Dapper | Агрегированные данные и отчеты |
| Архитектура | Clean Architecture / Onion | Разделение ответственности |
| ORM | Entity Framework Core 8 | Работа с PostgreSQL (Code-First) |
| Микро-ORM | Dapper | Высокопроизводительные запросы к SQL Server |
| Контейнеризация | Docker + Docker Compose | Развертывание БД |
| Документация | Swagger/OpenAPI 3.0 | Документация API |
| Валидация | FluentValidation | Валидация DTO |
| Маппинг | AutoMapper | Преобразование объектов |
| Логирование | Serilog | Структурированное логирование |
ProductionDataAnalyticsAPI/
├── src/
│ ├── ProductionDataAnalyticsAPI.API/
│ │ ├── Controllers/
│ │ ├── Program.cs
│ │ └── appsettings.json
│ ├── ProductionDataAnalyticsAPI.Application/
│ │ ├── Services/
│ │ ├── Interfaces/
│ │ ├── Validators/
│ │ └── Mappings/
│ ├── ProductionDataAnalyticsAPI.Domain/
│ │ ├── Entities/
│ │ ├── Interfaces/
│ │ ├── Enums/
│ │ └── Common/
│ └── ProductionDataAnalyticsAPI.Infrastructure/
│ ├── Data/
│ ├── Repositories/
│ └── Migrations/
├── tests/
├── docker/
│ ├── docker-compose.yml
│ ├── postgres/
│ └── mssql/
├── scripts/
│ └── sql/
├── .gitignore
└── README.md- Клонируйте репозиторий:
git clone https://github.com/exsilet/ProductionDataAnalyticsAPI.git
cd ProductionDataAnalyticsAPI- Запустите базы данных:
docker-compose up -d- Примените миграции PostgreSQL:
cd src/ProductionDataAnalyticsAPI.Infrastructure
dotnet ef database update --startup-project ../ProductionDataAnalyticsAPI.API- Примените миграции PostgreSQL:
cd ../ProductionDataAnalyticsAPI.API
dotnet run- Примените миграции PostgreSQL:
http://localhost:5191/swagger| Сущность | Описание | БД |
|---|---|---|
| Factory | Производственный завод | PostgreSQL |
| ProductionLine | Производственная линия | PostgreSQL |
| Sensor | Датчик (температура, давление и т.д.) | PostgreSQL |
| SensorReading | Показание датчика | PostgreSQL |
| ProductionOrder | Производственный заказ | SQL Server |
GET /api/factories- Получить список заводовPOST /api/factories- Создать новый заводGET /api/production-lines/{id}/current-status- Текущий статус линии
POST /api/sensor-readings/bulk- Прием пачки показаний (эмуляция промышленного шлюза)GET /api/sensors/{id}/readings- История показаний с пагинацией
GET /api/analytics/line-performance/{lineId}- Расчет OEE для линииGET /api/reports/daily-production- Сводный отчет за деньGET /api/sensorreadings/{sensorId}/aggregated-stats- Агрегированная статистика
GET /api/productionorders- Все производственные заказыPOST /api/productionorders- Создать новый заказGET /api/productionorders/status/{status}- Заказы по статусу
# 1. Создание завода
curl -X POST "http://localhost:5191/api/factories" \
-H "Content-Type: application/json" \
-d '{
"name": "Мини-завод напитков",
"location": "Москва",
"code": "BEV001"
}'
# 2. Создание производственной линии
curl -X POST "http://localhost:5191/api/production-lines" \
-H "Content-Type: application/json" \
-d '{
"name": "Линия розлива",
"code": "BOTTLING-01",
"factoryId": 1,
"productType": "Газированные напитки",
"targetSpeed": 150
}'
# 3. Создание датчиков
curl -X POST "http://localhost:5191/api/sensors" \
-H "Content-Type: application/json" \
-d '{
"name": "Температура печи",
"code": "TEMP-001",
"type": 1,
"unit": "°C",
"minValue": 0,
"maxValue": 1000,
"productionLineId": 1
}'# Расчет OEE (Overall Equipment Effectiveness)
curl "http://localhost:5191/api/analytics/line-performance/1?date=2026-01-26"
# Сводный отчет за день
curl "http://localhost:5191/api/reports/daily-production?date=2026-01-26"
# Статистика по датчику
curl "http://localhost:5191/api/sensorreadings/1/aggregated-stats?startDate=2026-01-26T00:00:00&endDate=2026-01-26T23:59:59"# Создание производственного заказа
curl -X POST "http://localhost:5191/api/productionorders" \
-H "Content-Type: application/json" \
-d '{
"orderNumber": "ORD-2026-001",
"productName": "Кола 0.5л",
"targetQuantity": 10000,
"productionLineId": 1,
"factoryId": 1
}'
# Получение заказов по статусу
curl "http://localhost:5191/api/productionorders/status/Pending"Создайте файл docker-compose.yml:
version: '3.8'
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: ProductionData
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- production-network
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: ${MSSQL_PASSWORD}
MSSQL_PID: "Developer"
volumes:
- mssql_data:/var/opt/mssql
networks:
- production-network
api:
build: .
ports:
- "8080:8080"
environment:
ConnectionStrings__PostgreSQL: "Host=postgres;Port=5432;Database=ProductionData;Username=${DB_USER};Password=${DB_PASSWORD}"
ConnectionStrings__MSSQLConnection: "Server=mssql,1433;Database=ProductionAnalytics;User Id=sa;Password=${MSSQL_PASSWORD};TrustServerCertificate=true"
depends_on:
- postgres
- mssql
networks:
- production-network
networks:
production-network:
driver: bridge
volumes:
postgres_data:
mssql_data:- Восстановите зависимости:
dotnet restore- Создайте миграции:
cd src/ProductionDataAnalyticsAPI.Infrastructure
dotnet ef migrations add InitialCreate --startup-project ../ProductionDataAnalyticsAPI.API --output-dir Migrations- Запустите тесты::
dotnet test- Clean Architecture: Строгое разделение слоев
- Dependency Injection: Внедрение зависимостей через конструкторы
- Асинхронное программирование: Все эндпоинты используют async/await
- Валидация: FluentValidation для входных данных
- Маппинг: AutoMapper для преобразования DTO ↔ Entity
# Запуск всех тестов
dotnet test
# Запуск специфичных тестов
dotnet test --filter "Category=Unit"
dotnet test --filter "Category=Integration"Этот проект распространяется под лицензией MIT.