51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
|
|
export async function POST(req: Request) {
|
|
const apiKey = req.headers.get("x-api-key");
|
|
if (!apiKey) return NextResponse.json({ ok: false, error: "Missing api key" }, { status: 401 });
|
|
|
|
const body = await req.json().catch(() => null);
|
|
if (!body?.machineId || !body?.kpis) {
|
|
return NextResponse.json({ ok: false, error: "Invalid payload" }, { status: 400 });
|
|
}
|
|
|
|
const machine = await prisma.machine.findFirst({
|
|
where: { id: String(body.machineId), apiKey },
|
|
select: { id: true, orgId: true },
|
|
});
|
|
if (!machine) return NextResponse.json({ ok: false, error: "Unauthorized" }, { status: 401 });
|
|
|
|
const wo = body.activeWorkOrder ?? {};
|
|
const k = body.kpis ?? {};
|
|
|
|
const row = await prisma.machineKpiSnapshot.create({
|
|
data: {
|
|
orgId: machine.orgId,
|
|
machineId: machine.id,
|
|
|
|
workOrderId: wo.id ? String(wo.id) : null,
|
|
sku: wo.sku ? String(wo.sku) : null,
|
|
|
|
target: typeof wo.target === "number" ? wo.target : null,
|
|
good: typeof wo.good === "number" ? wo.good : null,
|
|
scrap: typeof wo.scrap === "number" ? wo.scrap : null,
|
|
|
|
cycleCount: typeof body.cycle_count === "number" ? body.cycle_count : null,
|
|
goodParts: typeof body.good_parts === "number" ? body.good_parts : null,
|
|
|
|
cycleTime: typeof body.cycleTime === "number" ? body.cycleTime : null,
|
|
|
|
availability: typeof k.availability === "number" ? k.availability : null,
|
|
performance: typeof k.performance === "number" ? k.performance : null,
|
|
quality: typeof k.quality === "number" ? k.quality : null,
|
|
oee: typeof k.oee === "number" ? k.oee : null,
|
|
|
|
trackingEnabled: typeof body.trackingEnabled === "boolean" ? body.trackingEnabled : null,
|
|
productionStarted: typeof body.productionStarted === "boolean" ? body.productionStarted : null,
|
|
},
|
|
});
|
|
|
|
return NextResponse.json({ ok: true, id: row.id, ts: row.ts });
|
|
}
|