drag scheduling

This commit is contained in:
2026-03-18 00:18:30 -05:00
parent abc795b4a7
commit 6eaf084fcd
9 changed files with 309 additions and 26 deletions

View File

@@ -15,6 +15,7 @@ import {
listManufacturingStations,
listWorkOrders,
recordWorkOrderCompletion,
updateManufacturingStation,
updateWorkOrder,
updateWorkOrderOperationSchedule,
updateWorkOrderStatus,
@@ -100,6 +101,25 @@ manufacturingRouter.post("/stations", requirePermissions([permissions.manufactur
return ok(response, await createManufacturingStation(parsed.data, request.authUser?.id), 201);
});
manufacturingRouter.put("/stations/:stationId", requirePermissions([permissions.manufacturingWrite]), async (request, response) => {
const stationId = getRouteParam(request.params.stationId);
if (!stationId) {
return fail(response, 400, "INVALID_INPUT", "Manufacturing station id is invalid.");
}
const parsed = stationSchema.safeParse(request.body);
if (!parsed.success) {
return fail(response, 400, "INVALID_INPUT", "Manufacturing station payload is invalid.");
}
const result = await updateManufacturingStation(stationId, parsed.data, request.authUser?.id);
if (!result.ok) {
return fail(response, 404, "STATION_NOT_FOUND", result.reason);
}
return ok(response, result.station);
});
manufacturingRouter.get("/work-orders", requirePermissions([permissions.manufacturingRead]), async (request, response) => {
const parsed = workOrderFiltersSchema.safeParse(request.query);
if (!parsed.success) {

View File

@@ -927,6 +927,57 @@ export async function createManufacturingStation(payload: ManufacturingStationIn
return mapStation(station);
}
export async function updateManufacturingStation(stationId: string, payload: ManufacturingStationInput, actorId?: string | null) {
const existing = await prisma.manufacturingStation.findUnique({
where: { id: stationId },
});
if (!existing) {
return { ok: false as const, reason: "Manufacturing station was not found." };
}
const workingDays = normalizeStationWorkingDays(payload.workingDays);
const station = await prisma.manufacturingStation.update({
where: { id: stationId },
data: {
code: payload.code.trim(),
name: payload.name.trim(),
description: payload.description,
queueDays: payload.queueDays,
dailyCapacityMinutes: payload.dailyCapacityMinutes,
parallelCapacity: payload.parallelCapacity,
workingDays: workingDays.join(","),
isActive: payload.isActive,
},
});
await logAuditEvent({
actorId,
entityType: "manufacturing-station",
entityId: station.id,
action: "updated",
summary: `Updated manufacturing station ${station.code}.`,
metadata: {
previousCode: existing.code,
previousName: existing.name,
previousQueueDays: existing.queueDays,
previousDailyCapacityMinutes: existing.dailyCapacityMinutes,
previousParallelCapacity: existing.parallelCapacity,
previousWorkingDays: parseWorkingDays(existing.workingDays),
previousIsActive: existing.isActive,
code: station.code,
name: station.name,
queueDays: station.queueDays,
dailyCapacityMinutes: station.dailyCapacityMinutes,
parallelCapacity: station.parallelCapacity,
workingDays,
isActive: station.isActive,
},
});
return { ok: true as const, station: mapStation(station) };
}
export async function listManufacturingProjectOptions(): Promise<ManufacturingProjectOptionDto[]> {
const projects = await prisma.project.findMany({
where: {