Initial commit
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "EquipmentStatus" AS ENUM ('Active', 'Repair', 'Reserve', 'WriteOff');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "RepairKind" AS ENUM ('TO', 'TR', 'TRE', 'KR', 'AR', 'MP');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "RepairOrderStatus" AS ENUM ('Draft', 'Approved', 'InWork', 'Done', 'Cancelled');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "EquipmentType" (
|
||||
"code" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"manufacturer" TEXT,
|
||||
"maintenanceIntervalHours" INTEGER,
|
||||
"overhaulIntervalHours" INTEGER,
|
||||
|
||||
CONSTRAINT "EquipmentType_pkey" PRIMARY KEY ("code")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Equipment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"inventoryNumber" TEXT NOT NULL,
|
||||
"serialNumber" TEXT,
|
||||
"name" TEXT NOT NULL,
|
||||
"equipmentTypeCode" TEXT NOT NULL,
|
||||
"status" "EquipmentStatus" NOT NULL DEFAULT 'Active',
|
||||
"location" TEXT,
|
||||
"commissionedAt" TIMESTAMP(3),
|
||||
"totalEngineHours" DECIMAL(65,30),
|
||||
"engineHoursSinceLastRepair" DECIMAL(65,30),
|
||||
"lastRepairAt" TIMESTAMP(3),
|
||||
"notes" TEXT,
|
||||
|
||||
CONSTRAINT "Equipment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "RepairOrder" (
|
||||
"id" TEXT NOT NULL,
|
||||
"number" TEXT NOT NULL,
|
||||
"equipmentId" TEXT NOT NULL,
|
||||
"repairKind" "RepairKind" NOT NULL,
|
||||
"status" "RepairOrderStatus" NOT NULL DEFAULT 'Draft',
|
||||
"plannedAt" TIMESTAMP(3) NOT NULL,
|
||||
"startedAt" TIMESTAMP(3),
|
||||
"completedAt" TIMESTAMP(3),
|
||||
"contractor" TEXT,
|
||||
"engineHoursAtRepair" DECIMAL(65,30),
|
||||
"description" TEXT,
|
||||
"notes" TEXT,
|
||||
|
||||
CONSTRAINT "RepairOrder_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Equipment_inventoryNumber_key" ON "Equipment"("inventoryNumber");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "RepairOrder_number_key" ON "RepairOrder"("number");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Equipment" ADD CONSTRAINT "Equipment_equipmentTypeCode_fkey" FOREIGN KEY ("equipmentTypeCode") REFERENCES "EquipmentType"("code") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "RepairOrder" ADD CONSTRAINT "RepairOrder_equipmentId_fkey" FOREIGN KEY ("equipmentId") REFERENCES "Equipment"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
74
server/prisma/schema.prisma
Normal file
74
server/prisma/schema.prisma
Normal file
@@ -0,0 +1,74 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
enum EquipmentStatus {
|
||||
Active
|
||||
Repair
|
||||
Reserve
|
||||
WriteOff
|
||||
}
|
||||
|
||||
enum RepairKind {
|
||||
TO
|
||||
TR
|
||||
TRE
|
||||
KR
|
||||
AR
|
||||
MP
|
||||
}
|
||||
|
||||
enum RepairOrderStatus {
|
||||
Draft
|
||||
Approved
|
||||
InWork
|
||||
Done
|
||||
Cancelled
|
||||
}
|
||||
|
||||
model EquipmentType {
|
||||
code String @id
|
||||
name String
|
||||
manufacturer String?
|
||||
maintenanceIntervalHours Int?
|
||||
overhaulIntervalHours Int?
|
||||
equipment Equipment[]
|
||||
}
|
||||
|
||||
model Equipment {
|
||||
id String @id @default(uuid())
|
||||
inventoryNumber String @unique
|
||||
serialNumber String?
|
||||
name String
|
||||
equipmentTypeCode String
|
||||
status EquipmentStatus @default(Active)
|
||||
location String?
|
||||
commissionedAt DateTime?
|
||||
totalEngineHours Decimal?
|
||||
engineHoursSinceLastRepair Decimal?
|
||||
lastRepairAt DateTime?
|
||||
notes String?
|
||||
equipmentType EquipmentType @relation(fields: [equipmentTypeCode], references: [code])
|
||||
repairOrders RepairOrder[]
|
||||
}
|
||||
|
||||
model RepairOrder {
|
||||
id String @id @default(uuid())
|
||||
number String @unique
|
||||
equipmentId String
|
||||
repairKind RepairKind
|
||||
status RepairOrderStatus @default(Draft)
|
||||
plannedAt DateTime
|
||||
startedAt DateTime?
|
||||
completedAt DateTime?
|
||||
contractor String?
|
||||
engineHoursAtRepair Decimal?
|
||||
description String?
|
||||
notes String?
|
||||
equipment Equipment @relation(fields: [equipmentId], references: [id])
|
||||
}
|
||||
172
server/prisma/seed.ts
Normal file
172
server/prisma/seed.ts
Normal file
@@ -0,0 +1,172 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
const equipmentTypes = [
|
||||
{
|
||||
code: 'pump',
|
||||
name: 'Насосный агрегат',
|
||||
manufacturer: 'АО НасосПром',
|
||||
maintenanceIntervalHours: 2000,
|
||||
overhaulIntervalHours: 16000,
|
||||
},
|
||||
{
|
||||
code: 'compressor',
|
||||
name: 'Компрессорная установка',
|
||||
manufacturer: 'ОАО Компрессормаш',
|
||||
maintenanceIntervalHours: 1500,
|
||||
overhaulIntervalHours: 12000,
|
||||
},
|
||||
{
|
||||
code: 'generator',
|
||||
name: 'Дизель-генератор',
|
||||
manufacturer: 'АО ЭнергоМаш',
|
||||
maintenanceIntervalHours: 500,
|
||||
overhaulIntervalHours: 6000,
|
||||
},
|
||||
{
|
||||
code: 'valve',
|
||||
name: 'Запорная арматура',
|
||||
manufacturer: 'ЗАО АрматурПром',
|
||||
maintenanceIntervalHours: 1000,
|
||||
overhaulIntervalHours: 10000,
|
||||
},
|
||||
{
|
||||
code: 'sensor',
|
||||
name: 'Датчик давления',
|
||||
manufacturer: 'ООО ПриборСервис',
|
||||
maintenanceIntervalHours: 800,
|
||||
overhaulIntervalHours: 8000,
|
||||
},
|
||||
{
|
||||
code: 'motor',
|
||||
name: 'Электродвигатель',
|
||||
manufacturer: 'ПАО ЭлектроМотор',
|
||||
maintenanceIntervalHours: 1200,
|
||||
overhaulIntervalHours: 14000,
|
||||
},
|
||||
{
|
||||
code: 'fan',
|
||||
name: 'Вентилятор',
|
||||
manufacturer: 'АО ВентПром',
|
||||
maintenanceIntervalHours: 700,
|
||||
overhaulIntervalHours: 9000,
|
||||
},
|
||||
{
|
||||
code: 'heat-exchanger',
|
||||
name: 'Теплообменник',
|
||||
manufacturer: 'ОАО ТеплоТех',
|
||||
maintenanceIntervalHours: 1800,
|
||||
overhaulIntervalHours: 15000,
|
||||
},
|
||||
{
|
||||
code: 'filter',
|
||||
name: 'Фильтровальная установка',
|
||||
manufacturer: 'ООО ФильтрТех',
|
||||
maintenanceIntervalHours: 600,
|
||||
overhaulIntervalHours: 7000,
|
||||
},
|
||||
{
|
||||
code: 'separator',
|
||||
name: 'Сепаратор',
|
||||
manufacturer: 'АО СепараторМаш',
|
||||
maintenanceIntervalHours: 1600,
|
||||
overhaulIntervalHours: 13000,
|
||||
},
|
||||
{
|
||||
code: 'transformer',
|
||||
name: 'Трансформатор',
|
||||
manufacturer: 'ПАО ТрансЭнерго',
|
||||
maintenanceIntervalHours: 2500,
|
||||
overhaulIntervalHours: 20000,
|
||||
},
|
||||
] as const;
|
||||
|
||||
for (const type of equipmentTypes) {
|
||||
await prisma.equipmentType.upsert({
|
||||
where: { code: type.code },
|
||||
update: { ...type },
|
||||
create: { ...type },
|
||||
});
|
||||
}
|
||||
|
||||
const equipmentRecords: { id: string; inventoryNumber: string; name: string }[] = [];
|
||||
for (let i = 1; i <= 11; i++) {
|
||||
const type = equipmentTypes[(i - 1) % equipmentTypes.length];
|
||||
const inventoryNumber = `INV-${String(i).padStart(3, '0')}`;
|
||||
const serialNumber = `SN-2026-${String(i).padStart(4, '0')}`;
|
||||
const record = await prisma.equipment.upsert({
|
||||
where: { inventoryNumber },
|
||||
update: {
|
||||
serialNumber,
|
||||
name: `${type.name} #${i}`,
|
||||
equipmentTypeCode: type.code,
|
||||
status: i % 5 === 0 ? 'Repair' : 'Active',
|
||||
location: i % 2 === 0 ? `Площадка ${Math.ceil(i / 2)}` : `Цех ${Math.ceil(i / 3)}`,
|
||||
commissionedAt: new Date(2022, (i - 1) % 12, 1 + ((i - 1) % 28)),
|
||||
totalEngineHours: 1000 + i * 350,
|
||||
engineHoursSinceLastRepair: 200 + i * 25,
|
||||
},
|
||||
create: {
|
||||
inventoryNumber,
|
||||
serialNumber,
|
||||
name: `${type.name} #${i}`,
|
||||
equipmentTypeCode: type.code,
|
||||
status: i % 5 === 0 ? 'Repair' : 'Active',
|
||||
location: i % 2 === 0 ? `Площадка ${Math.ceil(i / 2)}` : `Цех ${Math.ceil(i / 3)}`,
|
||||
commissionedAt: new Date(2022, (i - 1) % 12, 1 + ((i - 1) % 28)),
|
||||
totalEngineHours: 1000 + i * 350,
|
||||
engineHoursSinceLastRepair: 200 + i * 25,
|
||||
},
|
||||
});
|
||||
equipmentRecords.push({ id: record.id, inventoryNumber: record.inventoryNumber, name: record.name });
|
||||
}
|
||||
|
||||
const repairKinds = ['TO', 'TR', 'TRE', 'KR', 'AR', 'MP'] as const;
|
||||
const statuses = ['Draft', 'Approved', 'InWork', 'Done', 'Cancelled'] as const;
|
||||
|
||||
for (let i = 1; i <= 11; i++) {
|
||||
const number = `RO-2026-${String(i).padStart(3, '0')}`;
|
||||
const equipment = equipmentRecords[(i - 1) % equipmentRecords.length];
|
||||
await prisma.repairOrder.upsert({
|
||||
where: { number },
|
||||
update: {
|
||||
equipmentId: equipment.id,
|
||||
repairKind: repairKinds[(i - 1) % repairKinds.length],
|
||||
status: statuses[(i - 1) % statuses.length],
|
||||
plannedAt: new Date(2026, ((i - 1) % 12), 1 + ((i - 1) % 28)),
|
||||
startedAt: i % 4 === 0 ? new Date(2026, ((i - 1) % 12), 2 + ((i - 1) % 28)) : null,
|
||||
completedAt: i % 5 === 0 ? new Date(2026, ((i - 1) % 12), 5 + ((i - 1) % 28)) : null,
|
||||
contractor: i % 3 === 0 ? 'ООО СервисРемонт' : 'АО ТехПодряд',
|
||||
engineHoursAtRepair: 1000 + i * 350,
|
||||
description: `Заявка на ремонт ${equipment.inventoryNumber} (${equipment.name})`,
|
||||
notes: i % 2 === 0 ? 'Тестовая заметка' : null,
|
||||
},
|
||||
create: {
|
||||
number,
|
||||
equipmentId: equipment.id,
|
||||
repairKind: repairKinds[(i - 1) % repairKinds.length],
|
||||
status: statuses[(i - 1) % statuses.length],
|
||||
plannedAt: new Date(2026, ((i - 1) % 12), 1 + ((i - 1) % 28)),
|
||||
startedAt: i % 4 === 0 ? new Date(2026, ((i - 1) % 12), 2 + ((i - 1) % 28)) : null,
|
||||
completedAt: i % 5 === 0 ? new Date(2026, ((i - 1) % 12), 5 + ((i - 1) % 28)) : null,
|
||||
contractor: i % 3 === 0 ? 'ООО СервисРемонт' : 'АО ТехПодряд',
|
||||
engineHoursAtRepair: 1000 + i * 350,
|
||||
description: `Заявка на ремонт ${equipment.inventoryNumber} (${equipment.name})`,
|
||||
notes: i % 2 === 0 ? 'Тестовая заметка' : null,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
console.log('Seed data created successfully');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
Reference in New Issue
Block a user