(llm-first): context budget, validation, and eval harness, orchestration general-prompt
This commit is contained in:
@@ -1,68 +0,0 @@
|
||||
-- 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;
|
||||
|
||||
85
server/prisma/migrations/20260403103310_init/migration.sql
Normal file
85
server/prisma/migrations/20260403103310_init/migration.sql
Normal file
@@ -0,0 +1,85 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "EquipmentStatus" AS ENUM ('Active', 'Repair', 'Reserve', 'WriteOff');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "laborOperation" AS ENUM ('Manual', 'MachineManual', 'Machine');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "EnumPeriodicityTO" AS ENUM ('Ежедневное', 'Еженедельное', 'Ежемесячное', 'Полугодовое', 'Годовое');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Role" AS ENUM ('Исполнитель', 'Подписант', 'Пользователь');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "CategoryPart" AS ENUM ('Расходник', 'Запчасть', 'Инструмент', 'Спецодежда');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "EquipmentType" AS ENUM ('Производственное', 'Энергетическое', 'Насосное', 'Компрессорное');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Equipment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"serialNumber" TEXT NOT NULL,
|
||||
"inventoryNumber" TEXT NOT NULL,
|
||||
"equipmentType" "EquipmentType" NOT NULL,
|
||||
"dateOfInspection" TIMESTAMP(3),
|
||||
"periodicityTO" "EnumPeriodicityTO" NOT NULL,
|
||||
"location" TEXT,
|
||||
"status" "EquipmentStatus" NOT NULL,
|
||||
"commissionedAt" TIMESTAMP(3),
|
||||
"totalEngineHours" DECIMAL(65,30),
|
||||
"engineHoursSinceLastRepair" DECIMAL(65,30),
|
||||
"lastRepairAt" TIMESTAMP(3),
|
||||
"notes" TEXT,
|
||||
"workAsPartOf" "laborOperation",
|
||||
"fuelConsumed" DOUBLE PRECISION,
|
||||
|
||||
CONSTRAINT "Equipment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Employee" (
|
||||
"code" TEXT NOT NULL,
|
||||
"fullName" TEXT NOT NULL,
|
||||
"role" "Role" NOT NULL,
|
||||
"position" TEXT NOT NULL,
|
||||
"bossCode" TEXT,
|
||||
"price" DOUBLE PRECISION,
|
||||
"phoneNumber" DOUBLE PRECISION,
|
||||
|
||||
CONSTRAINT "Employee_pkey" PRIMARY KEY ("code")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Part" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"categories" "CategoryPart",
|
||||
"price" DOUBLE PRECISION,
|
||||
"description" TEXT,
|
||||
"serialNumber" TEXT,
|
||||
|
||||
CONSTRAINT "Part_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "CategoryResource" (
|
||||
"id" TEXT NOT NULL,
|
||||
"partId" TEXT,
|
||||
"employeeCode" TEXT,
|
||||
|
||||
CONSTRAINT "CategoryResource_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Equipment_inventoryNumber_key" ON "Equipment"("inventoryNumber");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Employee" ADD CONSTRAINT "Employee_bossCode_fkey" FOREIGN KEY ("bossCode") REFERENCES "Employee"("code") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "CategoryResource" ADD CONSTRAINT "CategoryResource_partId_fkey" FOREIGN KEY ("partId") REFERENCES "Part"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "CategoryResource" ADD CONSTRAINT "CategoryResource_employeeCode_fkey" FOREIGN KEY ("employeeCode") REFERENCES "Employee"("code") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
3
server/prisma/migrations/migration_lock.toml
Normal file
3
server/prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "postgresql"
|
||||
@@ -14,61 +14,86 @@ enum EquipmentStatus {
|
||||
WriteOff
|
||||
}
|
||||
|
||||
enum RepairKind {
|
||||
TO
|
||||
TR
|
||||
TRE
|
||||
KR
|
||||
AR
|
||||
MP
|
||||
enum laborOperation {
|
||||
Manual
|
||||
MachineManual
|
||||
Machine
|
||||
}
|
||||
|
||||
enum RepairOrderStatus {
|
||||
Draft
|
||||
Approved
|
||||
InWork
|
||||
Done
|
||||
Cancelled
|
||||
enum EnumPeriodicityTO {
|
||||
EZHEDNEVNOE @map("Ежедневное")
|
||||
EZHENEDELNOE @map("Еженедельное")
|
||||
EZHEMESYACHNOE @map("Ежемесячное")
|
||||
POLUGODOVOE @map("Полугодовое")
|
||||
GODOVOE @map("Годовое")
|
||||
}
|
||||
|
||||
model EquipmentType {
|
||||
code String @id
|
||||
name String
|
||||
manufacturer String?
|
||||
maintenanceIntervalHours Int?
|
||||
overhaulIntervalHours Int?
|
||||
equipment Equipment[]
|
||||
enum Role {
|
||||
ISPOLNITEL @map("Исполнитель")
|
||||
PODPISANT @map("Подписант")
|
||||
POLZOVATEL @map("Пользователь")
|
||||
}
|
||||
|
||||
enum CategoryPart {
|
||||
RASKHODNIK @map("Расходник")
|
||||
ZAPCHAST @map("Запчасть")
|
||||
INSTRUMENT @map("Инструмент")
|
||||
SPETSODEZHDA @map("Спецодежда")
|
||||
}
|
||||
|
||||
enum EquipmentType {
|
||||
PROIZVODSTVENNOE @map("Производственное")
|
||||
ENERGETICHESKOE @map("Энергетическое")
|
||||
NASOSNOE @map("Насосное")
|
||||
KOMPRESSORNOE @map("Компрессорное")
|
||||
}
|
||||
|
||||
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?
|
||||
id String @id @default(uuid())
|
||||
name String
|
||||
serialNumber String
|
||||
inventoryNumber String @unique
|
||||
equipmentType EquipmentType
|
||||
dateOfInspection DateTime?
|
||||
periodicityTO EnumPeriodicityTO
|
||||
location String?
|
||||
status EquipmentStatus
|
||||
commissionedAt DateTime?
|
||||
totalEngineHours Decimal?
|
||||
engineHoursSinceLastRepair Decimal?
|
||||
lastRepairAt DateTime?
|
||||
notes String?
|
||||
equipmentType EquipmentType @relation(fields: [equipmentTypeCode], references: [code])
|
||||
repairOrders RepairOrder[]
|
||||
lastRepairAt DateTime?
|
||||
notes String?
|
||||
workAsPartOf laborOperation?
|
||||
fuelConsumed Float?
|
||||
}
|
||||
|
||||
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])
|
||||
model Employee {
|
||||
code String @id
|
||||
fullName String
|
||||
role Role
|
||||
position String
|
||||
bossCode String?
|
||||
boss Employee? @relation("EmployeeBoss", fields: [bossCode], references: [code])
|
||||
subordinates Employee[] @relation("EmployeeBoss")
|
||||
price Float?
|
||||
phoneNumber Float?
|
||||
categoryResources CategoryResource[]
|
||||
}
|
||||
|
||||
model Part {
|
||||
id String @id @default(uuid())
|
||||
name String
|
||||
categories CategoryPart?
|
||||
price Float?
|
||||
description String?
|
||||
serialNumber String?
|
||||
categoryResources CategoryResource[]
|
||||
}
|
||||
|
||||
model CategoryResource {
|
||||
id String @id @default(uuid())
|
||||
partId String?
|
||||
employeeCode String?
|
||||
part Part? @relation(fields: [partId], references: [id])
|
||||
employee Employee? @relation(fields: [employeeCode], references: [code])
|
||||
}
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
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