diff --git a/frontend/src/components/ocme/ocmeCycleCount.tsx b/frontend/src/components/ocme/ocmeCycleCount.tsx index 9b8c33e..63c7342 100644 --- a/frontend/src/components/ocme/ocmeCycleCount.tsx +++ b/frontend/src/components/ocme/ocmeCycleCount.tsx @@ -3,211 +3,239 @@ import { LstCard } from "../extendedUI/LstCard"; import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, } from "../ui/table"; import { Skeleton } from "../ui/skeleton"; //import CycleCountLog from "./CycleCountLog"; import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, } from "../ui/select"; import { Controller, useForm } from "react-hook-form"; import axios from "axios"; import { useState } from "react"; export default function OcmeCycleCount() { - const token = localStorage.getItem("auth_token"); - const [data, setData] = useState([]); - const [counting, setCounting] = useState(false); - const { - register, - handleSubmit, - //watch, - formState: { errors }, - reset, - control, - } = useForm(); + const token = localStorage.getItem("auth_token"); + const [data, setData] = useState([]); + const [counting, setCounting] = useState(false); + const { + register, + handleSubmit, + //watch, + formState: { errors }, + reset, + control, + } = useForm(); - const onSubmit = async (data: any) => { - setData([]); - setCounting(true); - toast.success(`Cycle count started`); - try { - const res = await axios.post("/ocme/api/v1/cycleCount", data, { - headers: { Authorization: `Bearer ${token}` }, - }); - console.log(data); - toast.success(res.data.message); - setData(res.data.data); - setCounting(false); - reset(); - } catch (error) { - console.log(error); - toast.error("There was an error cycle counting"); - setCounting(false); - reset(); - } - }; - - return ( -
-
- -

- Please enter the name or laneID you want to cycle count. -

-
-
-
-
- -
- ( - - )} - /> -
-
- -
-
-
-
- - - - LaneID - Lane - AV - Description - Running Number - In Ocme - In Stock - Result - - - {data?.length === 0 ? ( - - {Array(10) - .fill(0) - .map((_, i) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - ))} - - ) : ( - <> - {data?.map((i: any) => { - let classname = ``; - if (i.info === "Quality Check Required") { - classname = `bg-red-500`; - } - if (i.info === "Sent to Inv") { - classname = `bg-amber-700`; - } - return ( - - - {i.alpla_laneID} - - - {i.alpla_laneDescription} - - - {i.Article} - - - {i.alpla_laneDescription} - - - {i.runningNumber} - - - {i.ocme} - - - {i.stock} - - - {i.info} - - - ); - })} - - )} -
-
-
-
- {/*
+ const onSubmit = async (data: any) => { + setData([]); + setCounting(true); + toast.success(`Cycle count started`); + try { + const res = await axios.post("/ocme/api/v1/cyclecount", data, { + headers: { Authorization: `Bearer ${token}` }, + }); + toast.success(res.data.message); + setData(res.data.data); + setCounting(false); + reset(); + } catch (error) { + toast.error("There was an error cycle counting"); + setCounting(false); + reset(); + } + }; + return ( +
+
+ +

+ Please enter the name or laneID you want to cycle count. +

+
+
+
+
+ +
+ ( + + )} + /> +
+
+ +
+
+
+
+ + + + LaneID + Lane + AV + Description + Running Number + In Ocme + In Stock + Result + + + {data.length === 0 ? ( + + {Array(10) + .fill(0) + .map((_, i) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ))} + + ) : ( + <> + {data.map((i: any) => { + let classname = ``; + if ( + i.info === "Quality Check Required" + ) { + classname = `bg-red-500`; + } + if (i.info === "Sent to Inv") { + classname = `bg-amber-700`; + } + return ( + + + {i.alpla_laneID} + + + {i.alpla_laneDescription} + + + {i.Article} + + + {i.alpla_laneDescription} + + + {i.runningNumber} + + + {i.ocme} + + + {i.stock} + + + {i.info} + + + ); + })} + + )} +
+
+
+
+ {/*
*/} -
- ); +
+ ); } diff --git a/package.json b/package.json index 814030f..68b297d 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "deploy": "standard-version --conventional-commits && npm run prodBuild", "zipServer": "dotenvx run -f .env -- tsx server/scripts/zipUpBuild.ts \"C:\\Users\\matthes01\\Documents\\lstv2\"", "v1Build": "cd C:\\Users\\matthes01\\Documents\\logisticsSupportTool && npm run oldBuilder", - "prodBuild": "npm run v1Build && powershell -ExecutionPolicy Bypass -File server/scripts/build.ps1 -dir \"C:\\Users\\matthes01\\Documents\\lstv2\" && npm run zipServer", + "prodBuild": "npm run v1Build && powershell -ExecutionPolicy Bypass -File server/scripts/build.ps1 -dir \"C:\\Users\\matthes01\\Documents\\lstv2-dev\" && npm run zipServer", "commit": "cz", "prodinstall": "npm i --omit=dev && npm run db:migrate", "checkupdates": "npx npm-check-updates" @@ -78,4 +78,4 @@ "ws": "^8.18.1", "zod": "^3.24.2" } -} \ No newline at end of file +} diff --git a/server/index.ts b/server/index.ts index 01d03e7..8e6e434 100644 --- a/server/index.ts +++ b/server/index.ts @@ -31,28 +31,28 @@ export const lstAuth = btoa(`${username}:${password}`); // checking to make sure we have the settings intialized const serverIntialized = await db.select({ count: count() }).from(settings); export const installed = - serverIntialized[0].count === 0 && process.env.NODE_ENV !== "development" - ? false - : true; + serverIntialized[0].count === 0 && process.env.NODE_ENV !== "development" + ? false + : true; createLog("info", "LST", "server", `Server is installed: ${installed}`); const app = new OpenAPIHono({ strict: false }); // middle ware if (process.env.NODE_ENV === "development") { - app.use("*", logger()); + app.use("*", logger()); } app.use( - "*", - cors({ - origin: "*", // Allow all origins - allowHeaders: ["Content-Type", "Authorization", "X-Requested-With"], - allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"], - //exposeHeaders: ["Content-Length", "X-Kuma-Revision"], - credentials: true, // Allow credentials if needed - maxAge: 600, - }) + "*", + cors({ + origin: "*", // Allow all origins + allowHeaders: ["Content-Type", "Authorization", "X-Requested-With"], + allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"], + //exposeHeaders: ["Content-Length", "X-Kuma-Revision"], + credentials: true, // Allow credentials if needed + maxAge: 600, + }) ); // Middleware to normalize route case @@ -69,29 +69,29 @@ app.use( // }); app.doc("/api/ref", { - openapi: "3.0.0", - info: { - version: "2.0.0", - title: "LST API", - }, + openapi: "3.0.0", + info: { + version: "2.0.0", + title: "LST API", + }, }); const routes = [ - scalar, - auth, - // apiHits, - system, - tcpServer, - sqlService, - logistics, - rfid, - printers, - loggerService, - ocpService, + scalar, + auth, + // apiHits, + system, + tcpServer, + sqlService, + logistics, + rfid, + printers, + loggerService, + ocpService, ] as const; const appRoutes = routes.forEach((route) => { - app.route("/api/", route); + app.route("/api/", route); }); app.route("/ocme/", ocme); @@ -132,48 +132,48 @@ app.use("*", serveStatic({ path: "./frontend/dist/index.html" })); // Handle app exit signals process.on("SIGINT", async () => { - console.log("\nGracefully shutting down..."); - //await closePool(); - process.exit(0); + console.log("\nGracefully shutting down..."); + //await closePool(); + process.exit(0); }); process.on("SIGTERM", async () => { - console.log("Received termination signal, closing database..."); - //await closePool(); - process.exit(0); + console.log("Received termination signal, closing database..."); + //await closePool(); + process.exit(0); }); process.on("uncaughtException", async (err) => { - console.log("Uncaught Exception:", err); - //await closePool(); - process.exit(1); + console.log("Uncaught Exception:", err); + //await closePool(); + process.exit(1); }); process.on("beforeExit", async () => { - console.log("Process is about to exit..."); - //await closePool(); - process.exit(0); + console.log("Process is about to exit..."); + //await closePool(); + process.exit(0); }); const port = - process.env.NODE_ENV === "development" - ? process.env.VITE_SERVER_PORT - : process.env.PROD_PORT; + process.env.NODE_ENV === "development" + ? process.env.VITE_SERVER_PORT + : process.env.PROD_PORT; serve( - { - fetch: app.fetch, - port: Number(port), - hostname: "0.0.0.0", - }, - (info) => { - createLog( - "info", - "LST", - "server", - `Server is running on http://${info.address}:${info.port}` - ); - } + { + fetch: app.fetch, + port: Number(port), + hostname: "0.0.0.0", + }, + (info) => { + createLog( + "info", + "LST", + "server", + `Server is running on http://${info.address}:${info.port}` + ); + } ); export type AppRoutes = typeof appRoutes; diff --git a/server/scripts/updateServers.ts b/server/scripts/updateServers.ts index ac6aaa6..ab5c150 100644 --- a/server/scripts/updateServers.ts +++ b/server/scripts/updateServers.ts @@ -4,12 +4,26 @@ import { db } from "../../database/dbclient.js"; import { serverData } from "../../database/schema/serverData.js"; import { eq, sql } from "drizzle-orm"; import { createLog } from "../services/logger/logger.js"; +import { spawn } from "child_process"; +import { getAppInfo } from "../globalUtils/appInfo.js"; +import { db } from "../../database/dbclient.js"; +import { serverData } from "../../database/schema/serverData.js"; +import { eq, sql } from "drizzle-orm"; +import { createLog } from "../services/logger/logger.js"; type UpdateServerResponse = { success: boolean; message: string; + success: boolean; + message: string; }; +export const updateServer = async ( + devApp: string, + server: string | null +): Promise => { + const app = await getAppInfo(devApp); + const serverInfo = await db export const updateServer = async ( devApp: string, server: string | null @@ -33,7 +47,32 @@ export const updateServer = async ( "Looks like you are missing the plant token or have entered an incorrect one please try again.", }; } + if (serverInfo.length === 0) { + createLog( + "error", + "lst", + "serverUpdater", + `Looks like you are missing the plant token or have entered an incorrect one please try again.` + ); + return { + success: false, + message: + "Looks like you are missing the plant token or have entered an incorrect one please try again.", + }; + } + if (serverInfo[0].isUpgrading) { + createLog( + "error", + "lst", + "serverUpdater", + `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.` + ); + return { + success: false, + message: `Looks like ${serverInfo[0].plantToken} is upgrading already you cant do this again.`, + }; + } if (serverInfo[0].isUpgrading) { createLog( "error", @@ -77,6 +116,15 @@ export const updateServer = async ( , ]; + return new Promise(async (resolve, reject) => { + const process = spawn("powershell", args); + // change the server to upgradeing + await db + .update(serverData) + .set({ isUpgrading: true }) + .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); + //let stdout = ""; + //let stderr = ""; return new Promise(async (resolve, reject) => { const process = spawn("powershell", args); // change the server to upgradeing @@ -87,6 +135,12 @@ export const updateServer = async ( //let stdout = ""; //let stderr = ""; + // Collect stdout data + process.stdout.on("data", (data) => { + const output = data.toString().trim(); + createLog("info", "lst", "serverUpdater", `${output}`); + //onData(output); + }); // Collect stdout data process.stdout.on("data", (data) => { const output = data.toString().trim(); @@ -94,6 +148,12 @@ export const updateServer = async ( //onData(output); }); + // Collect stderr data + process.stderr.on("data", (data) => { + const output = data.toString().trim(); + createLog("info", "lst", "serverUpdater", `${output}`); + //onData(output); + }); // Collect stderr data process.stderr.on("data", (data) => { const output = data.toString().trim(); @@ -101,6 +161,13 @@ export const updateServer = async ( //onData(output); }); + // Handle process close + process.on("close", async (code) => { + if (code === 0) { + // if (count >= servers) { + // //onClose(`Server completed with code: ${code}`); + // } + createLog("info", "lst", "serverUpdater", `${server}`); // Handle process close process.on("close", async (code) => { if (code === 0) { @@ -109,6 +176,26 @@ export const updateServer = async ( // } createLog("info", "lst", "serverUpdater", `${server}`); + //update the last build. + try { + await db + .update(serverData) + .set({ lastUpdated: sql`NOW()`, isUpgrading: false }) + .where(eq(serverData.plantToken, server?.toLowerCase() ?? "")); + createLog( + "info", + "lst", + "serverUpdater", + `${server?.toLowerCase()}, has been updated and can now be used again.` + ); + } catch (error) { + createLog( + "error", + "lst", + "serverUpdater", + `There was an error updating the last time the server was updated: ${error}` + ); + } //update the last build. try { await db @@ -130,6 +217,12 @@ export const updateServer = async ( ); } + resolve({ + success: true, + message: `${server?.toLowerCase()}, has been updated and can now be used again.`, + }); + } else { + const errorMessage = `Process exited with code ${code}`; resolve({ success: true, message: `${server?.toLowerCase()}, has been updated and can now be used again.`, @@ -137,6 +230,9 @@ export const updateServer = async ( } else { const errorMessage = `Process exited with code ${code}`; + // if (count >= servers) { + // //onClose(code); + // } // if (count >= servers) { // //onClose(code); // } @@ -147,6 +243,12 @@ export const updateServer = async ( }); } }); + reject({ + success: false, + message: `${server?.toLowerCase()}, Has encounted an error while updating.`, + }); + } + }); // Handle errors with the process itself process.on("error", (error) => { @@ -155,11 +257,31 @@ export const updateServer = async ( reject(error); }); }); + // Handle errors with the process itself + process.on("error", (error) => { + //onError(err.message); + createLog("error", "lst", "serverUpdater", `${error}`); + reject(error); + }); + }); }; export async function processAllServers(devApp: string) { const servers = await db.select().from(serverData); + const servers = await db.select().from(serverData); + createLog( + "info", + "lst", + "serverUpdater", + `Running the update on all servers` + ); + let count = 1; + for (const server of servers) { + try { + const updateToServer = await updateServer(devApp, server.plantToken); + createLog("info", "lst", "serverUpdater", `${server.sName} was updated.`); + count = count + 1; createLog( "info", "lst", @@ -184,4 +306,15 @@ export async function processAllServers(devApp: string) { //return {success: false, message: `Error updating ${server.sName}: ${error.message}`}; } } + //return {success: true, message: `${server.sName} was updated.`, data: updateToServer}; + } catch (error: any) { + createLog( + "info", + "lst", + "serverUpdater", + `Error updating ${server.sName}: ${error.message}` + ); + //return {success: false, message: `Error updating ${server.sName}: ${error.message}`}; + } + } } diff --git a/server/services/ocme/controller/postRunningNr.ts b/server/services/ocme/controller/postRunningNr.ts index 22cfa2a..a5ac9af 100644 --- a/server/services/ocme/controller/postRunningNr.ts +++ b/server/services/ocme/controller/postRunningNr.ts @@ -4,6 +4,12 @@ import { createSSCC } from "../../../globalUtils/createSSCC.js"; import { createLog } from "../../logger/logger.js"; import { query } from "../../sqlServer/prodSqlServer.js"; import { labelData } from "../../sqlServer/querys/materialHelpers/labelInfo.js"; +import { db } from "../../../../database/dbclient.js"; +import { ocmeData } from "../../../../database/schema/ocme.js"; +import { createSSCC } from "../../../globalUtils/createSSCC.js"; +import { createLog } from "../../logger/logger.js"; +import { query } from "../../sqlServer/prodSqlServer.js"; +import { labelData } from "../../sqlServer/querys/materialHelpers/labelInfo.js"; export const postLabelData = async (data: any) => { console.log(data);