Модели данных
Полное описание моделей данных из Prisma схем всех сервисов.
Обзор
Система использует PostgreSQL с Prisma ORM для трех сервисов: - Auth Service — пользователи и refresh токены - Personnel Service — кадровые данные - Production Service — производственные данные
Каждый сервис имеет собственную Prisma schema в apps/<service>/prisma/schema.prisma.
Prisma клиент генерируется в apps/<service>/src/generated/prisma.
Auth Service Models
User
Модель пользователя системы.
Таблица: users
Схема: apps/auth-service/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
email |
String @unique | Email пользователя | @db.VarChar(255) |
passwordHash |
String | Хеш пароля (bcrypt) | @map("password_hash") @db.VarChar(255) |
fullName |
String | Полное имя пользователя | @map("full_name") @db.VarChar(150) |
role |
UserRole | Роль пользователя | @default(EMPLOYEE) |
isActive |
Boolean | Статус активности | @default(true) @map("is_active") |
employeeId |
UUID? | ID связанного сотрудника (nullable) | @map("employee_id") @db.Uuid |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @updatedAt @map("updated_at") |
Связи
refreshTokens— один ко многим с RefreshToken
Индексы
email— уникальный индекс
Prisma модель
model User {
id String @id @default(uuid()) @db.Uuid
email String @unique @db.VarChar(255)
passwordHash String @map("password_hash") @db.VarChar(255)
fullName String @map("full_name") @db.VarChar(150)
role UserRole @default(EMPLOYEE)
isActive Boolean @default(true) @map("is_active")
employeeId String? @map("employee_id") @db.Uuid
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
refreshTokens RefreshToken[]
@@map("users")
}
RefreshToken
Модель refresh токена для обновления сессии.
Таблица: refresh_tokens
Схема: apps/auth-service/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
userId |
UUID | ID пользователя | @map("user_id") @db.Uuid |
tokenHash |
String | Хеш refresh токена | @map("token_hash") @db.VarChar(255) |
expiresAt |
DateTime | Дата истечения токена | @map("expires_at") |
isRevoked |
Boolean | Отозван ли токен | @default(false) @map("is_revoked") |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Связи
user— многие к одному с User
Индексы
userId— индексexpiresAt— индекс
Prisma модель
model RefreshToken {
id String @id @default(uuid()) @db.Uuid
userId String @map("user_id") @db.Uuid
tokenHash String @map("token_hash") @db.VarChar(255)
expiresAt DateTime @map("expires_at")
isRevoked Boolean @default(false) @map("is_revoked")
createdAt DateTime @default(now()) @map("created_at")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([expiresAt])
@@map("refresh_tokens")
}
UserRole
Enum ролей пользователя.
Таблица: user_role
Значения:
| Значение | База данных | Описание |
|---|---|---|
ADMIN |
admin |
Администратор |
MANAGER |
manager |
Менеджер |
ANALYST |
analyst |
Аналитик |
SHIFT_MANAGER |
shift_manager |
Менеджер смены |
EMPLOYEE |
employee |
Сотрудник |
enum UserRole {
ADMIN @map("admin")
MANAGER @map("manager")
ANALYST @map("analyst")
SHIFT_MANAGER @map("shift_manager")
EMPLOYEE @map("employee")
@@map("user_role")
}
Personnel Service Models
Department
Модель подразделения организации.
Таблица: departments
Схема: apps/personnel/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
name |
String | Название подразделения | @db.VarChar(150) |
code |
String @unique | Код подразделения | @db.VarChar(20) |
type |
DepartmentType | Тип подразделения | |
parentId |
UUID? | ID родительского подразделения | @map("parent_id") @db.Uuid |
headEmployeeId |
UUID? | ID руководителя | @map("head_employee_id") @db.Uuid |
sourceSystemId |
String? | ID в исходной системе | @map("source_system_id") @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @updatedAt @map("updated_at") |
Связи
parent— многие к одному с Department (саморекурсия)children— один ко многим с Department (саморекурсия)positions— один ко многим с Positionemployees— один ко многим с Employee
Индексы
parentId— индексcode— индексsourceSystemId— индекс
Prisma модель
model Department {
id String @id @default(uuid()) @db.Uuid
name String @db.VarChar(150)
code String @unique @db.VarChar(20)
type DepartmentType
parentId String? @map("parent_id") @db.Uuid
headEmployeeId String? @map("head_employee_id") @db.Uuid
sourceSystemId String? @map("source_system_id") @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
parent Department? @relation("DepartmentHierarchy", fields: [parentId], references: [id])
children Department[] @relation("DepartmentHierarchy")
positions Position[]
employees Employee[]
@@index([parentId])
@@index([code])
@@index([sourceSystemId])
@@map("departments")
}
Position
Модель должности.
Таблица: positions
Схема: apps/personnel/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
title |
String | Название должности | @db.VarChar(150) |
code |
String @unique | Код должности | @db.VarChar(20) |
departmentId |
UUID | ID подразделения | @map("department_id") @db.Uuid |
sourceSystemId |
String? | ID в исходной системе | @map("source_system_id") @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Связи
department— многие к одному с Departmentemployees— один ко многим с Employee
Индексы
departmentId— индексsourceSystemId— индекс
Prisma модель
model Position {
id String @id @default(uuid()) @db.Uuid
title String @db.VarChar(150)
code String @unique @db.VarChar(20)
departmentId String @map("department_id") @db.Uuid
sourceSystemId String? @map("source_system_id") @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
department Department @relation(fields: [departmentId], references: [id])
employees Employee[]
@@index([departmentId])
@@index([sourceSystemId])
@@map("positions")
}
Employee
Модель сотрудника.
Таблица: employees
Схема: apps/personnel/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
personnelNumber |
String @unique | Табельный номер | @map("personnel_number") @db.VarChar(10) |
fullName |
String | Полное имя | @map("full_name") @db.VarChar(150) |
dateOfBirth |
DateTime | Дата рождения | @map("date_of_birth") @db.Date |
departmentId |
UUID | ID подразделения | @map("department_id") @db.Uuid |
positionId |
UUID | ID должности | @map("position_id") @db.Uuid |
hireDate |
DateTime | Дата приема | @map("hire_date") @db.Date |
terminationDate |
DateTime? | Дата увольнения | @map("termination_date") @db.Date |
employmentType |
EmploymentType | Тип занятости | @map("employment_type") |
status |
EmployeeStatus | Статус сотрудника | @default(ACTIVE) |
sourceSystemId |
String? @unique | ID в исходной системе | @map("source_system_id") @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @updatedAt @map("updated_at") |
Связи
department— многие к одному с Departmentposition— многие к одному с Position
Индексы
departmentId— индексpositionId— индексstatus— индексpersonnelNumber— индексsourceSystemId— уникальный индекс
Prisma модель
model Employee {
id String @id @default(uuid()) @db.Uuid
personnelNumber String @unique @map("personnel_number") @db.VarChar(10)
fullName String @map("full_name") @db.VarChar(150)
dateOfBirth DateTime @map("date_of_birth") @db.Date
departmentId String @map("department_id") @db.Uuid
positionId String @map("position_id") @db.Uuid
hireDate DateTime @map("hire_date") @db.Date
terminationDate DateTime? @map("termination_date") @db.Date
employmentType EmploymentType @map("employment_type")
status EmployeeStatus @default(ACTIVE)
sourceSystemId String? @unique @map("source_system_id") @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
department Department @relation(fields: [departmentId], references: [id])
position Position @relation(fields: [positionId], references: [id])
@@index([departmentId])
@@index([positionId])
@@index([status])
@@index([personnelNumber])
@@index([sourceSystemId])
@@map("employees")
}
ShiftScheduleTemplate
Модель шаблона смены.
Таблица: shift_schedule_templates
Схема: apps/personnel/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
name |
String | Название шаблона | @db.VarChar(100) |
shiftType |
ShiftType | Тип смены | @map("shift_type") |
startTime |
String | Время начала | @map("start_time") @db.VarChar(5) |
endTime |
String | Время окончания | @map("end_time") @db.VarChar(5) |
workDaysPattern |
String | Паттерн рабочих дней | @map("work_days_pattern") @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Prisma модель
model ShiftScheduleTemplate {
id String @id @default(uuid()) @db.Uuid
name String @db.VarChar(100)
shiftType ShiftType @map("shift_type")
startTime String @map("start_time") @db.VarChar(5)
endTime String @map("end_time") @db.VarChar(5)
workDaysPattern String @map("work_days_pattern") @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
@@map("shift_schedule_templates")
}
OutboxMessage (Personnel)
Модель outbox для надежной публикации событий.
Таблица: outbox_messages
Схема: apps/personnel/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
eventType |
String | Тип события | @map("event_type") @db.VarChar(100) |
payload |
Json | Payload события | |
correlationId |
String? | ID корреляции | @map("correlation_id") @db.VarChar(100) |
status |
OutboxStatus | Статус | @default(PENDING) |
retryCount |
Int | Количество попыток | @default(0) @map("retry_count") |
errorMessage |
String? | Сообщение об ошибке | @map("error_message") |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @updatedAt @map("updated_at") |
processedAt |
DateTime? | Дата обработки | @map("processed_at") |
Индексы
status— индексcreatedAt— индексstatus, createdAt— композитный индекс
Prisma модель
model OutboxMessage {
id String @id @default(uuid()) @db.Uuid
eventType String @map("event_type") @db.VarChar(100)
payload Json
correlationId String? @map("correlation_id") @db.VarChar(100)
status OutboxStatus @default(PENDING)
retryCount Int @default(0) @map("retry_count")
errorMessage String? @map("error_message")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
processedAt DateTime? @map("processed_at")
@@index([status])
@@index([createdAt])
@@index([status, createdAt])
@@map("outbox_messages")
}
Personnel Enums
DepartmentType
Таблица: department_type
| Значение | База данных | Описание |
|---|---|---|
DIVISION |
division |
Дивизион |
DEPARTMENT |
department |
Отдел |
SECTION |
section |
Секция |
UNIT |
unit |
Юнит |
EmploymentType
Таблица: employment_type
| Значение | База данных | Описание |
|---|---|---|
MAIN |
main |
Основной |
PART_TIME |
part_time |
Неполный |
EmployeeStatus
Таблица: employee_status
| Значение | База данных | Описание |
|---|---|---|
ACTIVE |
active |
Активен |
TERMINATED |
terminated |
Уволен |
ON_LEAVE |
on_leave |
В отпуске |
ShiftType
Таблица: shift_type
| Значение | База данных | Описание |
|---|---|---|
DAY_SHIFT |
day_shift |
Дневная смена |
NIGHT_SHIFT |
night_shift |
Ночная смена |
ROTATING |
rotating |
Ротирующаяся |
OutboxStatus
Таблица: outbox_status
| Значение | База данных | Описание |
|---|---|---|
PENDING |
pending |
Ожидает публикации |
SENT |
sent |
Отправлено |
FAILED |
failed |
Ошибка публикации |
Production Service Models
Product
Модель продукта.
Таблица: products
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
code |
String @unique | Код продукта | @db.VarChar(20) |
name |
String | Название продукта | @db.VarChar(200) |
category |
ProductCategory | Категория продукта | |
brand |
String? | Бренд | @db.VarChar(50) |
unitOfMeasure |
String | Единица измерения | @map("unit_of_measure") @db.VarChar(10) |
shelfLifeDays |
Int? | Срок хранения в днях | @map("shelf_life_days") |
requiresQualityCheck |
Boolean | Требуется контроль качества | @default(false) @map("requires_quality_check") |
sourceSystemId |
String? @unique | ID в исходной системе | @map("source_system_id") @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @default(now()) @updatedAt @map("updated_at") |
Связи
orders— один ко многим с ProductionOrderoutputs— один ко многим с ProductionOutputsales— один ко многим с Saleinventory— один ко многим с InventoryqualityResults— один ко многим с QualityResult
Индексы
category— индексcode— индексsourceSystemId— уникальный индекс
Prisma модель
model Product {
id String @id @default(uuid()) @db.Uuid
code String @unique @db.VarChar(20)
name String @db.VarChar(200)
category ProductCategory
brand String? @db.VarChar(50)
unitOfMeasure String @map("unit_of_measure") @db.VarChar(10)
shelfLifeDays Int? @map("shelf_life_days")
requiresQualityCheck Boolean @default(false) @map("requires_quality_check")
sourceSystemId String? @unique @map("source_system_id") @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @updatedAt @map("updated_at")
orders ProductionOrder[]
outputs ProductionOutput[]
sales Sale[]
inventory Inventory[]
qualityResults QualityResult[]
@@index([category])
@@index([code])
@@index([sourceSystemId])
@@map("products")
}
ProductionOrder
Модель производственного заказа.
Таблица: production_orders
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
externalOrderId |
String? @unique | Внешний номер заказа | @map("external_order_id") @db.VarChar(50) |
productId |
UUID | ID продукта | @map("product_id") @db.Uuid |
targetQuantity |
Decimal | Целевое количество | @map("target_quantity") @db.Decimal(15, 3) |
actualQuantity |
Decimal? | Фактическое количество | @map("actual_quantity") @db.Decimal(15, 3) |
unitOfMeasure |
String | Единица измерения | @map("unit_of_measure") @db.VarChar(10) |
status |
OrderStatus | Статус заказа | @default(PLANNED) |
productionLine |
String | Производственная линия | @map("production_line") @db.VarChar(50) |
plannedStart |
DateTime | Планируемое начало | @map("planned_start") |
plannedEnd |
DateTime | Планируемое окончание | @map("planned_end") |
actualStart |
DateTime? | Фактическое начало | @map("actual_start") |
actualEnd |
DateTime? | Фактическое окончание | @map("actual_end") |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
updatedAt |
DateTime | Дата обновления | @updatedAt @map("updated_at") |
Связи
product— многие к одному с Productoutputs— один ко многим с ProductionOutput
Индексы
productId— индексstatus— индексproductionLine— индексplannedStart— индекс
Prisma модель
model ProductionOrder {
id String @id @default(uuid()) @db.Uuid
externalOrderId String? @unique @map("external_order_id") @db.VarChar(50)
productId String @map("product_id") @db.Uuid
targetQuantity Decimal @map("target_quantity") @db.Decimal(15, 3)
actualQuantity Decimal? @map("actual_quantity") @db.Decimal(15, 3)
unitOfMeasure String @map("unit_of_measure") @db.VarChar(10)
status OrderStatus @default(PLANNED)
productionLine String @map("production_line") @db.VarChar(50)
plannedStart DateTime @map("planned_start")
plannedEnd DateTime @map("planned_end")
actualStart DateTime? @map("actual_start")
actualEnd DateTime? @map("actual_end")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
product Product @relation(fields: [productId], references: [id])
outputs ProductionOutput[]
@@index([productId])
@@index([status])
@@index([productionLine])
@@index([plannedStart])
@@map("production_orders")
}
ProductionOutput
Модель выпуска продукции.
Таблица: production_output
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
orderId |
UUID | ID заказа | @map("order_id") @db.Uuid |
productId |
UUID | ID продукта | @map("product_id") @db.Uuid |
lotNumber |
String | Номер партии | @map("lot_number") @db.VarChar(20) |
quantity |
Decimal | Количество | @db.Decimal(15, 3) |
qualityStatus |
QualityStatus | Статус качества | @default(PENDING) @map("quality_status") |
productionDate |
DateTime | Дата производства | @map("production_date") |
shift |
String | Смена | @db.VarChar(20) |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Связи
order— многие к одному с ProductionOrderproduct— многие к одному с Product
Индексы
orderId— индексproductId— индексlotNumber— индексproductionDate— индекс
Prisma модель
model ProductionOutput {
id String @id @default(uuid()) @db.Uuid
orderId String @map("order_id") @db.Uuid
productId String @map("product_id") @db.Uuid
lotNumber String @map("lot_number") @db.VarChar(20)
quantity Decimal @db.Decimal(15, 3)
qualityStatus QualityStatus @default(PENDING) @map("quality_status")
productionDate DateTime @map("production_date")
shift String @db.VarChar(20)
createdAt DateTime @default(now()) @map("created_at")
order ProductionOrder @relation(fields: [orderId], references: [id])
product Product @relation(fields: [productId], references: [id])
@@index([orderId])
@@index([productId])
@@index([lotNumber])
@@index([productionDate])
@@map("production_output")
}
Sale
Модель продажи.
Таблица: sales
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
externalId |
String | Внешний ID продажи | @map("external_id") @db.VarChar(20) |
productId |
UUID | ID продукта | @map("product_id") @db.Uuid |
customerName |
String | Имя клиента | @map("customer_name") @db.VarChar(200) |
quantity |
Decimal | Количество | @db.Decimal(15, 3) |
amount |
Decimal | Сумма | @db.Decimal(15, 2) |
saleDate |
DateTime | Дата продажи | @map("sale_date") @db.Date |
region |
String | Регион | @db.VarChar(100) |
channel |
SaleChannel | Канал продаж | |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Связи
product— многие к одному с Product
Индексы
productId— индексsaleDate— индексregion— индексchannel— индекс
Prisma модель
model Sale {
id String @id @default(uuid()) @db.Uuid
externalId String @map("external_id") @db.VarChar(20)
productId String @map("product_id") @db.Uuid
customerName String @map("customer_name") @db.VarChar(200)
quantity Decimal @db.Decimal(15, 3)
amount Decimal @db.Decimal(15, 2)
saleDate DateTime @map("sale_date") @db.Date
region String @db.VarChar(100)
channel SaleChannel
createdAt DateTime @default(now()) @map("created_at")
product Product @relation(fields: [productId], references: [id])
@@index([productId])
@@index([saleDate])
@@index([region])
@@index([channel])
@@map("sales")
}
Inventory
Модель складских остатков.
Таблица: inventory
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
productId |
UUID | ID продукта | @map("product_id") @db.Uuid |
warehouseCode |
String | Код склада | @map("warehouse_code") @db.VarChar(20) |
lotNumber |
String? | Номер партии | @map("lot_number") @db.VarChar(20) |
quantity |
Decimal | Количество | @db.Decimal(15, 3) |
unitOfMeasure |
String | Единица измерения | @map("unit_of_measure") @db.VarChar(10) |
lastUpdated |
DateTime | Дата последнего обновления | @map("last_updated") |
Связи
product— многие к одному с Product
Индексы
productId— индексwarehouseCode— индекс
Prisma модель
model Inventory {
id String @id @default(uuid()) @db.Uuid
productId String @map("product_id") @db.Uuid
warehouseCode String @map("warehouse_code") @db.VarChar(20)
lotNumber String? @map("lot_number") @db.VarChar(20)
quantity Decimal @db.Decimal(15, 3)
unitOfMeasure String @map("unit_of_measure") @db.VarChar(10)
lastUpdated DateTime @map("last_updated")
product Product @relation(fields: [productId], references: [id])
@@index([productId])
@@index([warehouseCode])
@@map("inventory")
}
QualityResult
Модель результата контроля качества.
Таблица: quality_results
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
lotNumber |
String | Номер партии | @map("lot_number") @db.VarChar(20) |
productId |
UUID | ID продукта | @map("product_id") @db.Uuid |
parameterName |
String | Название параметра | @map("parameter_name") @db.VarChar(100) |
resultValue |
Decimal | Результат | @map("result_value") @db.Decimal(15, 6) |
lowerLimit |
Decimal | Нижний предел | @map("lower_limit") @db.Decimal(15, 6) |
upperLimit |
Decimal | Верхний предел | @map("upper_limit") @db.Decimal(15, 6) |
inSpec |
Boolean | Соответствует норме | @map("in_spec") |
decision |
QualityDecision | Решение | |
testDate |
DateTime | Дата теста | @map("test_date") |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Связи
product— многие к одному с Product
Индексы
lotNumber— индексproductId— индексdecision— индекс
Prisma модель
model QualityResult {
id String @id @default(uuid()) @db.Uuid
lotNumber String @map("lot_number") @db.VarChar(20)
productId String @map("product_id") @db.Uuid
parameterName String @map("parameter_name") @db.VarChar(100)
resultValue Decimal @map("result_value") @db.Decimal(15, 6)
lowerLimit Decimal @map("lower_limit") @db.Decimal(15, 6)
upperLimit Decimal @map("upper_limit") @db.Decimal(15, 6)
inSpec Boolean @map("in_spec")
decision QualityDecision
testDate DateTime @map("test_date")
createdAt DateTime @default(now()) @map("created_at")
product Product @relation(fields: [productId], references: [id])
@@index([lotNumber])
@@index([productId])
@@index([decision])
@@map("quality_results")
}
SensorReading
Модель показания датчика.
Таблица: sensor_readings
Схема: apps/production/prisma/schema.prisma
Поля
| Поле | Тип | Описание | Constraints |
|---|---|---|---|
id |
UUID @id | Уникальный идентификатор | @default(uuid()) |
deviceId |
String | ID устройства | @map("device_id") @db.VarChar(50) |
productionLine |
String | Производственная линия | @map("production_line") @db.VarChar(50) |
parameterName |
String | Название параметра | @map("parameter_name") @db.VarChar(50) |
value |
Decimal | Значение | @db.Decimal(15, 4) |
unit |
String | Единица измерения | @db.VarChar(20) |
quality |
SensorQuality | Качество сигнала | |
recordedAt |
DateTime | Время записи | @map("recorded_at") |
createdAt |
DateTime | Дата создания | @default(now()) @map("created_at") |
Индексы
deviceId— индексproductionLine— индексparameterName— индексrecordedAt— индекс
Prisma модель
model SensorReading {
id String @id @default(uuid()) @db.Uuid
deviceId String @map("device_id") @db.VarChar(50)
productionLine String @map("production_line") @db.VarChar(50)
parameterName String @map("parameter_name") @db.VarChar(50)
value Decimal @db.Decimal(15, 4)
unit String @db.VarChar(20)
quality SensorQuality
recordedAt DateTime @map("recorded_at")
createdAt DateTime @default(now()) @map("created_at")
@@index([deviceId])
@@index([productionLine])
@@index([parameterName])
@@index([recordedAt])
@@map("sensor_readings")
}
OutboxMessage (Production)
Модель outbox для надежной публикации событий (аналогично Personnel).
Таблица: outbox_messages
Схема: apps/production/prisma/schema.prisma
Структура идентична Personnel OutboxMessage.
Production Enums
ProductCategory
Таблица: product_category
| Значение | База данных | Описание |
|---|---|---|
RAW_MATERIAL |
raw_material |
Сырье |
SEMI_FINISHED |
semi_finished |
Полуфабрикат |
FINISHED_PRODUCT |
finished_product |
Готовая продукция |
PACKAGING |
packaging |
Упаковка |
OrderStatus
Таблица: order_status
| Значение | База данных | Описание |
|---|---|---|
PLANNED |
planned |
Запланирован |
IN_PROGRESS |
in_progress |
В работе |
COMPLETED |
completed |
Завершен |
CANCELLED |
cancelled |
Отменен |
QualityStatus
Таблица: quality_status
| Значение | База данных | Описание |
|---|---|---|
PENDING |
pending |
Ожидает |
APPROVED |
approved |
Одобрено |
REJECTED |
rejected |
Отклонено |
QualityDecision
Таблица: quality_decision
| Значение | База данных | Описание |
|---|---|---|
APPROVED |
approved |
Одобрено |
REJECTED |
rejected |
Отклонено |
PENDING |
pending |
Ожидает |
SaleChannel
Таблица: sale_channel
| Значение | База данных | Описание |
|---|---|---|
RETAIL |
retail |
Розница |
WHOLESALE |
wholesale |
Опт |
HORECA |
horeca |
HoReCa |
EXPORT |
export |
Экспорт |
SensorQuality
Таблица: sensor_quality
| Значение | База данных | Описание |
|---|---|---|
GOOD |
good |
Хорошее |
DEGRADED |
degraded |
Ухудшенное |
BAD |
bad |
Плохое |
ETL Service Models (MongoDB)
ETL сервис использует MongoDB для хранения данных интеграции.
RawImport
Журнал операций импорта.
Коллекция: raw_imports
Схема: Mongoose
Поля
| Поле | Тип | Описание |
|---|---|---|
_id |
ObjectId | Уникальный идентификатор |
sourceSystem |
String | Источник системы (ZUP, ERP, MES, SCADA, LIMS) |
importType |
String | Тип импорта |
status |
String | Статус (pending, processing, completed, failed) |
recordsCount |
Number | Количество записей |
rawPayload |
Array | Исходные данные |
fileId |
ObjectId? | GridFS ID файла (если загружен через file upload) |
statistics |
Object | Статистика трансформаций |
errors |
Array | Ошибки обработки |
createdAt |
Date | Дата создания |
processedAt |
Date? | Дата обработки |
TransformationLog
Лог трансформации записей.
Коллекция: transformation_logs
Схема: Mongoose
Поля
| Поле | Тип | Описание |
|---|---|---|
_id |
ObjectId | Уникальный идентификатор |
importId |
ObjectId | ID импорта |
entityType |
String | Тип сущности (employee, product, etc.) |
sourceRecord |
Object | Исходная запись |
canonicalRecord |
Object | Каноническая запись |
status |
String | Статус (SUCCESS, ERROR, SKIPPED) |
errorMessage |
String? | Сообщение об ошибке |
createdAt |
Date | Дата создания |
GridFS (Files)
Хранение исходных файлов импорта.
Buckets: fs.files, fs.chunks
Используется: Mongoose GridFS
Для хранения файлов .xlsx и .json, загруженных через POST /etl/import/file.
Работа с Prisma
Генерация клиента
Клиент генерируется в apps/<service>/src/generated/prisma.
Применение миграций
Prisma Studio
Откроется веб-интерфейс для работы с БД.
Использование в коде
import { PrismaClient } from '../generated/prisma';
const prisma = new PrismaClient();
// Создание
const user = await prisma.user.create({
data: {
email: 'ivan@example.com',
passwordHash: '...',
fullName: 'Иванов Иван',
},
});
// Чтение
const users = await prisma.user.findMany({
where: { isActive: true },
});
// Обновление
const updated = await prisma.user.update({
where: { id: userId },
data: { fullName: 'Иванов Иван Петрович' },
});
// Удаление
await prisma.user.delete({
where: { id: userId },
});
Мониторинг БД
PostgreSQL
Для мониторинга PostgreSQL используйте:
pg_stat_activity— активные соединенияpg_stat_user_tables— статистика по таблицамpg_stat_user_indexes— статистика по индексам
Пример запроса для проверки outbox:
MongoDB
Для мониторинга MongoDB используйте:
db.stats()— статистика базы данныхdb.collection.stats()— статистика коллекцииdb.currentOp()— активные операции
Пример запроса для проверки импортов: