From 3a78f774751d8080d0c27eaf52c230fca67c175f Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Fri, 2 May 2025 19:12:28 -0500 Subject: [PATCH] feat(helpercommand): bookin pallets --- .../helperCommands/commands/Bookin.tsx | 102 ++++++++++++++++++ .../logistics/helperCommands/helperPage.tsx | 9 ++ frontend/src/routeTree.gen.ts | 27 +++++ .../ocp/controller/labeling/bookIn.ts | 25 +++-- server/services/ocp/routes/labeling/bookIn.ts | 57 ++++++++++ 5 files changed, 214 insertions(+), 6 deletions(-) create mode 100644 frontend/src/components/logistics/helperCommands/commands/Bookin.tsx create mode 100644 frontend/src/components/logistics/helperCommands/helperPage.tsx create mode 100644 server/services/ocp/routes/labeling/bookIn.ts diff --git a/frontend/src/components/logistics/helperCommands/commands/Bookin.tsx b/frontend/src/components/logistics/helperCommands/commands/Bookin.tsx new file mode 100644 index 0000000..ac02459 --- /dev/null +++ b/frontend/src/components/logistics/helperCommands/commands/Bookin.tsx @@ -0,0 +1,102 @@ +import { LstCard } from "@/components/extendedUI/LstCard"; +import { Button } from "@/components/ui/button"; +import { CardContent, CardFooter, CardHeader } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { useForm } from "@tanstack/react-form"; +import axios from "axios"; +import { useState } from "react"; +import { toast } from "sonner"; + +export default function Bookin() { + const [bookingIn, setBookingIn] = useState(false); + const form = useForm({ + defaultValues: { runningNr: " " }, + onSubmit: async ({ value }) => { + // Do something with form data + setBookingIn(true); + + try { + const res = await axios.post("/api/ocp/bookin", { + runningNr: parseInt(value.runningNr), + }); + + if (res.data.success) { + toast.success(res.data.message); + form.reset(); + setBookingIn(false); + } else { + console.log(res.data.data.errors); + toast.error(res.data.data.errors[0]?.message); + form.reset(); + setBookingIn(false); + } + } catch (error) { + console.log(error); + toast.error( + "There was an error booking in pallet please validate you entered the correct info and try again." + ); + setBookingIn(false); + } + }, + }); + return ( + + +

Book in a pallet by running number

+
+
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + + + value.length > 2 + ? undefined + : "Please enter a valid running number", + }} + children={(field) => { + return ( +
+ + + field.handleChange(e.target.value) + } + /> + {field.state.meta.errors.length ? ( + + {field.state.meta.errors.join(",")} + + ) : null} +
+ ); + }} + /> +
+ +
+ +
+
+
+
+ ); +} diff --git a/frontend/src/components/logistics/helperCommands/helperPage.tsx b/frontend/src/components/logistics/helperCommands/helperPage.tsx new file mode 100644 index 0000000..b46de24 --- /dev/null +++ b/frontend/src/components/logistics/helperCommands/helperPage.tsx @@ -0,0 +1,9 @@ +import Bookin from "./commands/Bookin"; + +export default function HelperPage() { + return ( +
+ +
+ ); +} diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 2c2b821..812a552 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -33,6 +33,7 @@ import { Route as ocmeCyclecountIndexImport } from './routes/(ocme)/cyclecount/i import { Route as logisticsSiloAdjustmentsIndexImport } from './routes/(logistics)/siloAdjustments/index' import { Route as logisticsOpenOrdersIndexImport } from './routes/(logistics)/openOrders/index' import { Route as logisticsMaterialHelperIndexImport } from './routes/(logistics)/materialHelper/index' +import { Route as logisticsHelperCommandsIndexImport } from './routes/(logistics)/helperCommands/index' import { Route as logisticsDmIndexImport } from './routes/(logistics)/dm/index' import { Route as EomArticleAvImport } from './routes/_eom/article/$av' import { Route as logisticsSiloAdjustmentsHistImport } from './routes/(logistics)/siloAdjustments/$hist' @@ -173,6 +174,13 @@ const logisticsMaterialHelperIndexRoute = getParentRoute: () => rootRoute, } as any) +const logisticsHelperCommandsIndexRoute = + logisticsHelperCommandsIndexImport.update({ + id: '/(logistics)/helperCommands/', + path: '/helperCommands/', + getParentRoute: () => rootRoute, + } as any) + const logisticsDmIndexRoute = logisticsDmIndexImport.update({ id: '/(logistics)/dm/', path: '/dm/', @@ -364,6 +372,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof logisticsDmIndexImport parentRoute: typeof rootRoute } + '/(logistics)/helperCommands/': { + id: '/(logistics)/helperCommands/' + path: '/helperCommands' + fullPath: '/helperCommands' + preLoaderRoute: typeof logisticsHelperCommandsIndexImport + parentRoute: typeof rootRoute + } '/(logistics)/materialHelper/': { id: '/(logistics)/materialHelper/' path: '/materialHelper' @@ -480,6 +495,7 @@ export interface FileRoutesByFullPath { '/siloAdjustments/$hist': typeof logisticsSiloAdjustmentsHistRoute '/article/$av': typeof EomArticleAvRoute '/dm': typeof logisticsDmIndexRoute + '/helperCommands': typeof logisticsHelperCommandsIndexRoute '/materialHelper': typeof logisticsMaterialHelperIndexRoute '/openOrders': typeof logisticsOpenOrdersIndexRoute '/siloAdjustments': typeof logisticsSiloAdjustmentsIndexRoute @@ -509,6 +525,7 @@ export interface FileRoutesByTo { '/siloAdjustments/$hist': typeof logisticsSiloAdjustmentsHistRoute '/article/$av': typeof EomArticleAvRoute '/dm': typeof logisticsDmIndexRoute + '/helperCommands': typeof logisticsHelperCommandsIndexRoute '/materialHelper': typeof logisticsMaterialHelperIndexRoute '/openOrders': typeof logisticsOpenOrdersIndexRoute '/siloAdjustments': typeof logisticsSiloAdjustmentsIndexRoute @@ -541,6 +558,7 @@ export interface FileRoutesById { '/(logistics)/siloAdjustments/$hist': typeof logisticsSiloAdjustmentsHistRoute '/_eom/article/$av': typeof EomArticleAvRoute '/(logistics)/dm/': typeof logisticsDmIndexRoute + '/(logistics)/helperCommands/': typeof logisticsHelperCommandsIndexRoute '/(logistics)/materialHelper/': typeof logisticsMaterialHelperIndexRoute '/(logistics)/openOrders/': typeof logisticsOpenOrdersIndexRoute '/(logistics)/siloAdjustments/': typeof logisticsSiloAdjustmentsIndexRoute @@ -572,6 +590,7 @@ export interface FileRouteTypes { | '/siloAdjustments/$hist' | '/article/$av' | '/dm' + | '/helperCommands' | '/materialHelper' | '/openOrders' | '/siloAdjustments' @@ -600,6 +619,7 @@ export interface FileRouteTypes { | '/siloAdjustments/$hist' | '/article/$av' | '/dm' + | '/helperCommands' | '/materialHelper' | '/openOrders' | '/siloAdjustments' @@ -630,6 +650,7 @@ export interface FileRouteTypes { | '/(logistics)/siloAdjustments/$hist' | '/_eom/article/$av' | '/(logistics)/dm/' + | '/(logistics)/helperCommands/' | '/(logistics)/materialHelper/' | '/(logistics)/openOrders/' | '/(logistics)/siloAdjustments/' @@ -653,6 +674,7 @@ export interface RootRouteChildren { OcpIndexRoute: typeof OcpIndexRoute logisticsSiloAdjustmentsHistRoute: typeof logisticsSiloAdjustmentsHistRoute logisticsDmIndexRoute: typeof logisticsDmIndexRoute + logisticsHelperCommandsIndexRoute: typeof logisticsHelperCommandsIndexRoute logisticsMaterialHelperIndexRoute: typeof logisticsMaterialHelperIndexRoute logisticsOpenOrdersIndexRoute: typeof logisticsOpenOrdersIndexRoute logisticsSiloAdjustmentsIndexRoute: typeof logisticsSiloAdjustmentsIndexRoute @@ -675,6 +697,7 @@ const rootRouteChildren: RootRouteChildren = { OcpIndexRoute: OcpIndexRoute, logisticsSiloAdjustmentsHistRoute: logisticsSiloAdjustmentsHistRoute, logisticsDmIndexRoute: logisticsDmIndexRoute, + logisticsHelperCommandsIndexRoute: logisticsHelperCommandsIndexRoute, logisticsMaterialHelperIndexRoute: logisticsMaterialHelperIndexRoute, logisticsOpenOrdersIndexRoute: logisticsOpenOrdersIndexRoute, logisticsSiloAdjustmentsIndexRoute: logisticsSiloAdjustmentsIndexRoute, @@ -709,6 +732,7 @@ export const routeTree = rootRoute "/ocp/", "/(logistics)/siloAdjustments/$hist", "/(logistics)/dm/", + "/(logistics)/helperCommands/", "/(logistics)/materialHelper/", "/(logistics)/openOrders/", "/(logistics)/siloAdjustments/", @@ -805,6 +829,9 @@ export const routeTree = rootRoute "/(logistics)/dm/": { "filePath": "(logistics)/dm/index.tsx" }, + "/(logistics)/helperCommands/": { + "filePath": "(logistics)/helperCommands/index.tsx" + }, "/(logistics)/materialHelper/": { "filePath": "(logistics)/materialHelper/index.tsx" }, diff --git a/server/services/ocp/controller/labeling/bookIn.ts b/server/services/ocp/controller/labeling/bookIn.ts index 571bed1..21477ab 100644 --- a/server/services/ocp/controller/labeling/bookIn.ts +++ b/server/services/ocp/controller/labeling/bookIn.ts @@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm"; export const bookInLabel = async (data: any) => { // update sscc so we can book in const SSCC = data.SSCC.slice(2); + // api url const url = await prodEndpointCreation( "/public/v1.1/Manufacturing/ProductionControlling/BookIn" @@ -33,7 +34,9 @@ export const bookInLabel = async (data: any) => { "error", "labeling", "ocp", - `${data.printer[0].name}, Error:${res.data}` + `${ + data.printer ? data.printer[0].name : "Manual book in" + }, Error:${res.data}` ); //printerUpdate(data.printer, 7, "Error while booking in."); @@ -43,7 +46,6 @@ export const bookInLabel = async (data: any) => { data: res.data, }; } - // update the label. try { const booked = await db @@ -61,7 +63,7 @@ export const bookInLabel = async (data: any) => { "info", "labeling", "ocp", - `${booked[0].runningNr} , was just booked in.` + `${parseInt(data.SSCC.slice(10, -1))} , was just booked in.` ); return { @@ -72,24 +74,35 @@ export const bookInLabel = async (data: any) => { data: { SSCC: data.SSCC }, }; } catch (error) { + //console.log(error); createLog( "error", "labeling", "ocp", `Error creating new runningNumber in the DB.` ); + return { + success: true, + message: `${parseInt( + data.SSCC.slice(10, -1) + )}, encoutnered an error posting to the db`, + data: error, + }; } - } catch (error) { + } catch (error: any) { createLog( "error", "labeling", "ocp", - `${data.printer[0].name}, "Error: ${error}` + `${ + data.printer ? data.printer[0].name : "Manual book in" + }, "Error: ${error}` ); + // console.log(error.response.data); return { success: false, message: "There was an error booking in the label.", - data: error, + data: error.response.data, }; } }; diff --git a/server/services/ocp/routes/labeling/bookIn.ts b/server/services/ocp/routes/labeling/bookIn.ts new file mode 100644 index 0000000..a12739e --- /dev/null +++ b/server/services/ocp/routes/labeling/bookIn.ts @@ -0,0 +1,57 @@ +// an external way to creating logs +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { responses } from "../../../../globalUtils/routeDefs/responses.js"; +import { tryCatch } from "../../../../globalUtils/tryCatch.js"; +import { labelingProcess } from "../../controller/labeling/labelProcess.js"; +import { bookInLabel } from "../../controller/labeling/bookIn.js"; +import { createSSCC } from "../../../../globalUtils/createSSCC.js"; + +const app = new OpenAPIHono({ strict: false }); + +app.openapi( + createRoute({ + tags: ["ocp"], + summary: "Manual bookin by running Number", + method: "post", + path: "/bookin", + responses: responses(), + }), + async (c) => { + //const hours = c.req.query("hours"); + const { data: bodyData, error: bodyError } = await tryCatch( + c.req.json() + ); + + if (bodyError) { + return c.json({ + success: false, + message: "You are missing data", + }); + } + + // get the sscc number + const sscc = await createSSCC(bodyData.runningNr); + + const { data: bookinLabel, error: bookInError } = await tryCatch( + bookInLabel({ SSCC: sscc }) + ); + + if (bookInError) { + return c.json({ + success: false, + message: "There was an error booking in the label.", + data: bookInError, + }); + } + + const newLabel: any = bookinLabel; + //console.log(newLabel); + + return c.json({ + success: newLabel.success, + message: newLabel.message, + data: newLabel.data, + }); + } +); +export default app;