Compare commits

...

8 Commits

19 changed files with 681 additions and 289 deletions

View File

@@ -58,6 +58,7 @@ router.get("/", async (req, res) => {
memoryUsage: `Heap: ${(used.heapUsed / 1024 / 1024).toFixed(2)} MB / RSS: ${( memoryUsage: `Heap: ${(used.heapUsed / 1024 / 1024).toFixed(2)} MB / RSS: ${(
used.rss / 1024 / 1024 used.rss / 1024 / 1024
).toFixed(2)} MB`, ).toFixed(2)} MB`,
eomFGPkgSheetVersion: 1, // this is the excel file version when we have a change to the macro we want to grab this
}); });
}); });

View File

@@ -1,123 +1,125 @@
import type { Address } from "nodemailer/lib/mailer/index.js";
import type { Transporter } from "nodemailer"; import type { Transporter } from "nodemailer";
import type SMTPTransport from "nodemailer/lib/smtp-transport/index.js";
import type Mail from "nodemailer/lib/mailer/index.js";
import os from "os";
import nodemailer from "nodemailer"; import nodemailer from "nodemailer";
import type Mail from "nodemailer/lib/mailer/index.js";
import type { Address } from "nodemailer/lib/mailer/index.js";
import type SMTPTransport from "nodemailer/lib/smtp-transport/index.js";
import hbs from "nodemailer-express-handlebars";
import os from "os";
import path from "path"; import path from "path";
import { fileURLToPath } from "url"; import { fileURLToPath } from "url";
import { promisify } from "util"; import { promisify } from "util";
import hbs from "nodemailer-express-handlebars";
import { createLogger } from "../../logger/logger.js"; import { createLogger } from "../../logger/logger.js";
interface HandlebarsMailOptions extends Mail.Options { interface HandlebarsMailOptions extends Mail.Options {
template: string; template: string;
context: Record<string, unknown>; context: Record<string, unknown>;
} }
interface EmailData { interface EmailData {
email: string; email: string;
subject: string; subject: string;
template: string; template: string;
context: Record<string, unknown>; context: Record<string, unknown>;
} }
export const sendEmail = async (data: EmailData): Promise<any> => { export const sendEmail = async (data: EmailData): Promise<any> => {
const log = createLogger({ module: "pkg", subModule: "sendMail" }); const log = createLogger({ module: "pkg", subModule: "sendMail" });
let transporter: Transporter; let transporter: Transporter;
let fromEmail: string | Address; let fromEmail: string | Address;
if ( // if (
os.hostname().includes("OLP") && // os.hostname().includes("OLP") &&
process.env.EMAIL_USER && // process.env.EMAIL_USER &&
process.env.EMAIL_PASSWORD // process.env.EMAIL_PASSWORD
) { // ) {
transporter = nodemailer.createTransport({ // transporter = nodemailer.createTransport({
service: "gmail", // service: "gmail",
auth: { // auth: {
user: process.env.EMAIL_USER, // user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASSWORD, // pass: process.env.EMAIL_PASSWORD,
}, // },
//debug: true, // //debug: true,
}); // });
// update the from email // // update the from email
fromEmail = process.env.EMAIL_USER; // fromEmail = process.env.EMAIL_USER;
} else { // } else {
// convert to the correct plant token. // // convert to the correct plant token.
let host = `${os.hostname().replace("VMS006", "")}-smtp.alpla.net`; //let host = `${os.hostname().replace("VMS006", "")}-smtp.alpla.net`;
//const testServers = ["vms036", "VMS036"]; //const testServers = ["vms036", "VMS036"];
if (os.hostname().includes("VMS036")) { // if (os.hostname().includes("VMS036")) {
host = "USMCD1-smtp.alpla.net"; // host = "USMCD1-smtp.alpla.net";
} // }
// if (plantToken[0].value === "usiow2") { // if (plantToken[0].value === "usiow2") {
// host = "USIOW1-smtp.alpla.net"; // host = "USIOW1-smtp.alpla.net";
// } // }
transporter = nodemailer.createTransport({ transporter = nodemailer.createTransport({
host: host, host: "smtp.azurecomm.net",
port: 25, port: 587,
rejectUnauthorized: false, //rejectUnauthorized: false,
//secure: false, tls: {
// auth: { minVersion: "TLSv1.2",
// user: "alplaprod", },
// pass: "obelix", auth: {
// }, user: "donotreply@mail.alpla.com",
debug: true, pass: process.env.SMTP_PASSWORD,
} as SMTPTransport.Options); },
debug: true,
} as SMTPTransport.Options);
// update the from email // update the from email
fromEmail = `noreply@alpla.com`; fromEmail = `DoNotReply@mail.alpla.com`;
} //}
// creating the handlbar options // creating the handlbar options
const viewPath = path.resolve( const viewPath = path.resolve(
path.dirname(fileURLToPath(import.meta.url)), path.dirname(fileURLToPath(import.meta.url)),
"./views/" "./views/",
); );
const handlebarOptions = { const handlebarOptions = {
viewEngine: { viewEngine: {
extname: ".hbs", extname: ".hbs",
//layoutsDir: path.resolve(viewPath, "layouts"), // Path to layouts directory //layoutsDir: path.resolve(viewPath, "layouts"), // Path to layouts directory
defaultLayout: "", // Specify the default layout defaultLayout: "", // Specify the default layout
partialsDir: viewPath, partialsDir: viewPath,
}, },
viewPath: viewPath, viewPath: viewPath,
extName: ".hbs", // File extension for Handlebars templates extName: ".hbs", // File extension for Handlebars templates
}; };
transporter.use("compile", hbs(handlebarOptions)); transporter.use("compile", hbs(handlebarOptions));
const mailOptions: HandlebarsMailOptions = { const mailOptions: HandlebarsMailOptions = {
from: fromEmail, from: fromEmail,
to: data.email, to: data.email,
subject: data.subject, subject: data.subject,
//text: "You will have a reset token here and only have 30min to click the link before it expires.", //text: "You will have a reset token here and only have 30min to click the link before it expires.",
//html: emailTemplate("BlakesTest", "This is an example with css"), //html: emailTemplate("BlakesTest", "This is an example with css"),
template: data.template, // Name of the Handlebars template (e.g., 'welcome.hbs') template: data.template, // Name of the Handlebars template (e.g., 'welcome.hbs')
context: data.context, context: data.context,
}; };
// now verify and send the email // now verify and send the email
const sendMailPromise = promisify(transporter.sendMail).bind(transporter); const sendMailPromise = promisify(transporter.sendMail).bind(transporter);
try { try {
// Send email and await the result // Send email and await the result
const info = await sendMailPromise(mailOptions); const info = await sendMailPromise(mailOptions);
log.info(null, `Email was sent to: ${data.email}`); log.info(null, `Email was sent to: ${data.email}`);
return { success: true, message: "Email sent.", data: info }; return { success: true, message: "Email sent.", data: info };
} catch (err) { } catch (err) {
console.log(err); console.log(err);
log.error( log.error(
{ error: err }, { error: err },
`Error sending Email to : ${data.email}` `Error sending Email to : ${data.email}`,
); );
return { success: false, message: "Error sending email.", error: err }; return { success: false, message: "Error sending email.", error: err };
} }
}; };

View File

@@ -10,7 +10,8 @@
"dev:dbgen": " drizzle-kit generate --config=drizzle-dev.config.ts", "dev:dbgen": " drizzle-kit generate --config=drizzle-dev.config.ts",
"dev:dbmigrate": " drizzle-kit migrate --config=drizzle-dev.config.ts", "dev:dbmigrate": " drizzle-kit migrate --config=drizzle-dev.config.ts",
"build": "npm run build:server", "build": "npm run build:server",
"build:server": "rimraf dist && tsc --build && npm run copy:scripts && xcopy server\\services\\notifications\\utils\\views\\ dist\\server\\services\\notifications\\utils\\views\\ /E /I /Y ", "build:server": "rimraf dist && tsc --build && npm run copy:scripts && xcopy server\\services\\notifications\\utils\\views\\ dist\\server\\services\\notifications\\utils\\views\\ /E /I /Y && npm run build:copySql",
"build:copySql": "xcopy server\\services\\sqlServer\\querys\\newQueries dist\\server\\services\\sqlServer\\querys\\newQueries\\ /E /I /Y ",
"build:frontend": "cd frontend && npm run build", "build:frontend": "cd frontend && npm run build",
"build:iisNet": "rimraf dotnetwrapper\\bin && xcopy frontend\\dist dotnetwrapper\\wwwroot /E /I /Y && cd dotnetwrapper && dotnet publish lst-wrapper.csproj --configuration Release --output ../prodBuild", "build:iisNet": "rimraf dotnetwrapper\\bin && xcopy frontend\\dist dotnetwrapper\\wwwroot /E /I /Y && cd dotnetwrapper && dotnet publish lst-wrapper.csproj --configuration Release --output ../prodBuild",
"copy:scripts": "tsx server/scripts/copyScripts.ts", "copy:scripts": "tsx server/scripts/copyScripts.ts",

View File

@@ -37,6 +37,10 @@ export class ScannerClient {
} }
private initialize() { private initialize() {
if (!this.host || !this.port) {
console.log("Host or port is missing");
return;
}
this.socket.connect(this.port, this.host, () => { this.socket.connect(this.port, this.host, () => {
console.info("Connected to scanner"); console.info("Connected to scanner");
this.connected = true; this.connected = true;

View File

@@ -4,95 +4,92 @@ import { notifications } from "../../../../../database/schema/notifications.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js"; import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { createLog } from "../../../logger/logger.js"; import { createLog } from "../../../logger/logger.js";
import { query } from "../../../sqlServer/prodSqlServer.js"; import { query } from "../../../sqlServer/prodSqlServer.js";
import { sendEmail } from "../sendMail.js";
import { bow2incoming } from "../../../sqlServer/querys/notifications/bow2henkel.js"; import { bow2incoming } from "../../../sqlServer/querys/notifications/bow2henkel.js";
import { sendEmail } from "../sendMail.js";
const notification = async (notifyData: any) => { const notification = async (notifyData: any) => {
/** /**
* Pass the entire notification over * Pass the entire notification over
*/ */
createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`); createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`);
// validate if there are any emails. // validate if there are any emails.
if (notifyData.emails === "") { if (notifyData.emails === "") {
createLog( createLog(
"error", "error",
"reprinting", "reprinting",
"notify", "notify",
`There are no emails set for ${notifyData.name}` `There are no emails set for ${notifyData.name}`,
); );
return; return;
} }
//let labels: Labels[]; //let labels: Labels[];
const { data: l, error: labelError } = await tryCatch( const { data: l, error: labelError } = await tryCatch(
query( query(
bow2incoming.replace( bow2incoming.replace("[time]", notifyData.notifiySettings.processTime),
"[time]", "Label Reprints",
notifyData.notifiySettings.processTime ),
), );
"Label Reprints" const labels: any = l?.data as any;
) if (labelError) {
); createLog(
const labels: any = l?.data as any; "error",
if (labelError) { "reprinting",
createLog( "notify",
"error", `Failed to get the labels: ${labelError}`,
"reprinting", );
"notify", return;
`Failed to get the labels: ${labelError}` }
);
return;
}
if (labels.length > 0) { if (labels.length > 0) {
//send the email :D //send the email :D
const emailSetup = { const emailSetup = {
email: notifyData.emails, email: notifyData.emails,
subject: "Alert! New incoming goods has been received", subject: "Alert! New incoming goods has been received",
template: "bow2IncomingGoods", template: "bow2IncomingGoods",
context: { context: {
items: labels, items: labels,
time: notifyData.notifiySettings.processTime, time: notifyData.notifiySettings.processTime,
}, },
}; };
const sentEmail = await sendEmail(emailSetup); const sentEmail = await sendEmail(emailSetup);
if (!sentEmail.success) { if (!sentEmail.success) {
createLog( createLog(
"error", "error",
"reprinting", "reprinting",
"notify", "notify",
"Failed to send email, will try again on next interval" "Failed to send email, will try again on next interval",
); );
return; return;
} }
// // update the last time we ran and the prod id // // update the last time we ran and the prod id
// const notifUpdate = { // const notifUpdate = {
// prodID: labels[0].IdEtikettenHistorie, // prodID: labels[0].IdEtikettenHistorie,
// lastRan: nowDate(), // lastRan: nowDate(),
// }; // };
// update the last time ran // update the last time ran
const { data, error } = await tryCatch( const { data, error } = await tryCatch(
db db
.update(notifications) .update(notifications)
.set({ .set({
lastRan: sql`NOW()`, lastRan: sql`NOW()`,
notifiySettings: { notifiySettings: {
...notifyData.notifiySettings, ...notifyData.notifiySettings,
prodID: labels[0].IdEtikettenHistorie, prodID: labels[0].IdEtikettenHistorie,
}, },
}) })
.where(eq(notifications.name, notifyData.name)) .where(eq(notifications.name, notifyData.name)),
); );
} else { } else {
return; return;
} }
}; };
export default notification; export default notification;

View File

@@ -0,0 +1,108 @@
import { eq, sql } from "drizzle-orm";
import { db } from "../../../../../database/dbclient.js";
import { notifications } from "../../../../../database/schema/notifications.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { createLog } from "../../../logger/logger.js";
import { query } from "../../../sqlServer/prodSqlServer.js";
import {
type SqlQuery,
sqlQuerySelector,
} from "../../../sqlServer/utils/querySelector.utils.js";
import { sendEmail } from "../sendMail.js";
export interface Labels {
IdEtikettenHistorie?: number;
}
const notification = async (notifyData: any) => {
/**
* Pass the entire notification over
*/
createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`);
// validate if there are any emails.
if (notifyData.emails === "") {
createLog(
"error",
"reprinting",
"notify",
`There are no emails set for ${notifyData.name}`,
);
return;
}
const cycleCountCheck = sqlQuerySelector("cycleCountCheck.query") as SqlQuery;
if (!cycleCountCheck.success) {
console.log("Failed to load the query: ", cycleCountCheck.message);
return;
}
const { data: c, error: cError } = await tryCatch(
query(
cycleCountCheck.query.replace("[timeTest]", notifyData.checkInterval),
"Cycle count check",
),
);
const cycle: any = c?.data ?? ([] as any);
//console.log(cycle);
if (cError) {
createLog(
"error",
"reprinting",
"notify",
`Failed to get the labels: ${cError}`,
);
return;
}
if (cycle.length > 0) {
//send the email :D
const emailSetup = {
email: notifyData.emails,
subject: `Alert! RowBlocked for more than ${notifyData.checkInterval} min(s)`,
template: "cycleCountCheck",
context: {
checkTime: notifyData.checkInterval,
items: cycle,
},
};
const sentEmail = await sendEmail(emailSetup);
if (!sentEmail.success) {
createLog(
"error",
"reprinting",
"notify",
"Failed to send email, will try again on next interval",
);
return;
}
// // update the last time we ran and the prod id
// const notifUpdate = {
// prodID: labels[0].IdEtikettenHistorie,
// lastRan: nowDate(),
// };
// update the last time ran
const { data, error } = await tryCatch(
db
.update(notifications)
.set({
lastRan: sql`NOW()`,
// notifiySettings: {
// ...notifyData.notifiySettings,
// prodID: labels[0].IdEtikettenHistorie,
// },
})
.where(eq(notifications.name, notifyData.name)),
);
} else {
return;
}
};
export default notification;

View File

@@ -67,34 +67,34 @@ export const sendEmail = async (data: any): Promise<any> => {
fromEmail = process.env.EMAIL_USER; fromEmail = process.env.EMAIL_USER;
} else { } else {
// convert to the correct plant token. // convert to the correct plant token.
const plantToken = settingData.filter((s) => s.name === "plantToken"); //const plantToken = settingData.filter((s) => s.name === "plantToken");
let host = `${plantToken[0].value}-smtp.alpla.net`; // let host = `${plantToken[0].value}-smtp.alpla.net`;
const testServers = ["test1", "test2", "test3"]; // const testServers = ["test1", "test2", "test3"];
if (testServers.includes(plantToken[0].value)) { // if (testServers.includes(plantToken[0].value)) {
host = "USMCD1-smtp.alpla.net"; // host = "USMCD1-smtp.alpla.net";
} // }
if (plantToken[0].value === "usiow2") { // if (plantToken[0].value === "usiow2") {
host = "USIOW1-smtp.alpla.net"; // host = "USIOW1-smtp.alpla.net";
} // }
transporter = nodemailer.createTransport({ transporter = nodemailer.createTransport({
host: host, host: "smtp.azurecomm.net",
port: 25, port: 587,
rejectUnauthorized: false, //rejectUnauthorized: false,
//secure: false, tls: {
// auth: { minVersion: "TLSv1.2",
// user: "alplaprod", },
// pass: "obelix", auth: {
// }, user: "donotreply@mail.alpla.com",
pass: process.env.SMTP_PASSWORD,
},
debug: true, debug: true,
} as SMTPTransport.Options); });
fromEmail = `DoNotReply@mail.alpla.com`;
// update the from email
fromEmail = `donotreply@alpla.com`;
} }
// creating the handlbar options // creating the handlbar options

View File

@@ -12,6 +12,7 @@ import blocking from "./routes/qualityBlocking.js";
import sendemail from "./routes/sendMail.js"; import sendemail from "./routes/sendMail.js";
import errorHandling from "./routes/tooManyErrors.js"; import errorHandling from "./routes/tooManyErrors.js";
import { note, notificationCreate } from "./utils/masterNotifications.js"; import { note, notificationCreate } from "./utils/masterNotifications.js";
import { sqlJobCleanUp } from "./utils/notificationSqlCleanup.js";
import { startNotificationMonitor } from "./utils/processNotifications.js"; import { startNotificationMonitor } from "./utils/processNotifications.js";
const app = new OpenAPIHono(); const app = new OpenAPIHono();
@@ -57,6 +58,7 @@ if (notesError) {
setTimeout(() => { setTimeout(() => {
notificationCreate(); notificationCreate();
startNotificationMonitor(); startNotificationMonitor();
sqlJobCleanUp();
}, 5 * 1000); }, 5 * 1000);
export default app; export default app;

View File

@@ -152,6 +152,18 @@ export const note: any = [
errorCount: 10, // change this to something else or leave blank to use the av type errorCount: 10, // change this to something else or leave blank to use the av type
}, },
}, },
{
name: "cycleCountCheck",
description:
"Checks if a cycle count has been active for longer than the defined time.",
checkInterval: 60,
timeType: "min",
emails: "",
active: false,
notifiySettings: {
errorCount: 10, // change this to something else or leave blank to use the av type
},
},
]; ];
export const notificationCreate = async () => { export const notificationCreate = async () => {

View File

@@ -0,0 +1,85 @@
import { tryCatch } from "../../../globalUtils/tryCatch.js";
import { query } from "../../sqlServer/prodSqlServer.js";
import {
type SqlQuery,
sqlQuerySelector,
} from "../../sqlServer/utils/querySelector.utils.js";
const cleanUpQuery = `
DECLARE @JobName varchar(max) = '[jobName]'
UPDATE msdb.dbo.sysjobs
SET enabled = 0
WHERE name = @JobName;
`;
// disable the jobs
const jobNames: string[] = [
"monitor_$_lots",
"monitor_$_lots_2",
"monitor$lots",
"Monitor_APO", //listen for people to cry this is no longer a thing
"Monitor_APO2",
"Monitor_AutoConsumeMaterials", // TODO: migrate to lst
"Monitor_AutoConsumeMaterials_iow1",
"Monitor_AutoConsumeMaterials_iow2",
"Monitor_BlockedINV_Loc",
"monitor_inv_cycle",
"monitor_inv_cycle_1",
"monitor_inv_cycle_2",
"monitor_edi_import", // TODO: migrate to lst -- for the query select count(*) from AlplaPROD_test3.dbo.T_EDIDokumente (nolock) where /* IdLieferant > 1 and */ add_date > DATEADD(MINUTE, -30, getdate())
"Monitor_Lot_Progression",
"Monitor_Lots", // TODO: migrate to lst -- this should be the one where we monitor the when a lot is assigned if its missing some data.
"Monitor_MinMax", // TODO:Migrate to lst
"Monitor_MinMax_iow2",
"Monitor_PM",
"Monitor_Purity",
"monitor_wastebookings", // TODO: Migrate
"LastPriceUpdate", // not even sure what this is
"GETLabelsCount", // seems like an old jc job
"jobforpuritycount", // was not even working correctly
"Monitor_EmptyAutoConsumLocations", // not sure who uses this one
"monitor_labelreprint", // Migrated but need to find out who really wants this
"test", // not even sure why this is active
"UpdateLastMoldUsed", // old jc inserts data into a table but not sure what its used for not linked to any other alert
"UpdateWhsePositions3", // old jc inserts data into a table but not sure what its used for not linked to any other alert
"UpdateWhsePositions4",
"delete_print", // i think this was in here for when we was having lag prints in iowa1
"INV_WHSE_1", // something random i wrote long time ago looks like an inv thing to see aged stuff
"INV_WHSE_2",
"laneAgeCheck", // another strange one thats been since moved to lst
"monitor_blocking_2",
"monitor_blocking", // already in lst
"monitor_min_inv", // do we still want this one? it has a description of: this checks m-f the min inventory of materials based on the min level set in stock
"Monitor_MixedLocations",
"Monitor_PM",
"Monitor_PM2",
"wrong_lots_1",
"wrong_lots_2",
"invenotry check", // spelling error one of my stupids
"monitor_hold_monitor",
"Monitor_Silo_adjustments",
];
export const sqlJobCleanUp = async () => {
// running a query to disable jobs that are moved to lst to be better maintained
const sqlQuery = sqlQuerySelector("disableJob.query") as SqlQuery;
if (!sqlQuery.success) {
console.log("Failed to load the query: ", sqlQuery.message);
return;
}
for (const job of jobNames) {
const { data, error } = await tryCatch(
query(
sqlQuery.query.replace("[jobName]", `${job}`),
`Disabling job: ${job}`,
),
);
if (error) {
console.log(error);
}
//console.log(data);
}
};

View File

@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{{!-- <link rel="stylesheet" href="styles/styles.css" /> --}}
{{> styles}}
</head>
<body>
<p>All,</p>
<p>The below are cycle counts that have been in progress for longer than {{checkTime}} min(s). </p>
<table >
<thead>
<tr>
<th>WarehouseID</th>
<th>Warehouse</th>
<th>LocationID</th>
<th>Location</th>
<th>Cycle count Started</th>
<th>Started by</th>
{{!-- <th>Downtime finish</th> --}}
</tr>
</thead>
<tbody>
{{#each items}}
<tr>
<td>{{idWarehouse}}</td>
<td>{{warehouse}}</td>
<td>{{locationId}}</td>
<td>{{location}}</td>
<td>{{cycleCountStartAt}}</td>
<td>{{blockedBy}}</td>
{{!-- <td>{{dtEnd}}</td> --}}
</tr>
{{/each}}
</tbody>
</table>
<div>
<p>Thank you,</p>
<p>LST Team</p>
</div>
</body>
</html>

View File

@@ -41,7 +41,7 @@ export const qualityCycle = async () => {
message: "There was an error getting quality request data", message: "There was an error getting quality request data",
}; };
} }
const lstQData: any = data; const lstQData: any = data ?? [];
// get the pallets that currentStat is moved // get the pallets that currentStat is moved
// const res = await runQuery(palletMoveCheck, "palletCheck"); // const res = await runQuery(palletMoveCheck, "palletCheck");

View File

@@ -0,0 +1,33 @@
/*
checks the age of an inventory dose not exceed x time
*/
use AlplaPROD_test1
DECLARE @timeCheck INT = [timeTest]
select
w.IdWarenLager as idWarehouse
,w.KurzBezeichnung as warehouse
,b.IdLagerAbteilung as locationId
,x.KurzBezeichnung as 'location'
--,case when b.upd_date < Dateadd(minute, -(@timeCheck * 1.5), getdate()) then 'OVERDUE' else 'In-Progress' end as invStatus
,format(b.Upd_Date, 'M/d/yyyy HH:mm') as cycleCountStartAt
,b.Upd_User as blockedBy
--,*
from [dbo].[V_LagerAbteilungenInventuren] (nolock) as b
-- get the loction name
left join
dbo.T_LagerAbteilungen (nolock) as x
on x.IdLagerAbteilung = b.IdLagerAbteilung
-- get the whse
left join
dbo.T_WarenLager (nolock) as w
on x.idWarenLager = w.idWarenLager
where status = 1
and b.Upd_Date < Dateadd(minute, -@timeCheck, getdate())

View File

@@ -0,0 +1,8 @@
/*
disables sql jobs.
*/
DECLARE @JobName varchar(max) = '[jobName]'
UPDATE msdb.dbo.sysjobs
SET enabled = 0
WHERE name = @JobName;

View File

@@ -1,14 +1,21 @@
import { readFileSync } from "fs"; import { readFileSync } from "fs";
export type SqlQuery = {
query: string;
success: boolean;
message: string;
};
export const sqlQuerySelector = (name: string) => { export const sqlQuerySelector = (name: string) => {
try { try {
const queryFile = readFileSync( const queryFile = readFileSync(
new URL(`../querys/${name}.sql`, import.meta.url), new URL(`../querys/newQueries/${name}.sql`, import.meta.url),
"utf8", "utf8",
); );
return { return {
success: true, success: true,
message: `Query for: ${name}`,
query: queryFile, query: queryFile,
}; };
} catch (error) { } catch (error) {

View File

@@ -93,7 +93,14 @@ scanner.connect(50000, "10.204.0.26", async () => {
}); });
scanner.on("data", async (data) => { scanner.on("data", async (data) => {
console.log("Response:", data.toString("ascii")); console.log(
"Response:",
data
.toString("ascii")
.replace(/\x00/g, "") // remove null bytes
.replace(/\x1B\[[0-9;?]*[A-Za-z]/g, "") // remove ANSI escape codes
.trim(),
);
}); });
scanner.on("close", () => { scanner.on("close", () => {

View File

@@ -5,46 +5,51 @@ import net from "net";
*/ */
const scannerID = "98@"; const scannerID = "98@";
const scannerCommand = "Alplaprodcmd112"; // to consume all the pallets const scannerCommand = "Alplaprodcmd112"; // to consume all the pallets
const lot = "AlplaPRODchg#00000016706"; // to consume to the lot make sure its showing in 2.0 to be able to consume to it const lot = "AlplaPRODchg#11601"; // to consume to the lot make sure its showing in 2.0 to be able to consume to it
const labels = [ const labels = [
"1000000000000000000000000000000005106656", "1000000000000000000000000000000004551860",
"1000000000000000000000000000000005106386", "1000000000000000000000000000000004551640",
"1000000000000000000000000000000005106446", "1000000000000000000000000000000004551840",
"1000000000000000000000000000000005106326", "1000000000000000000000000000000004551610",
"1000000000000000000000000000000005105726", "1000000000000000000000000000000004551720",
"1000000000000000000000000000000005106056", "1000000000000000000000000000000004551680",
"1000000000000000000000000000000005106256", "1000000000000000000000000000000004551740",
"1000000000000000000000000000000005105836", "1000000000000000000000000000000004551660",
"1000000000000000000000000000000005105986", "1000000000000000000000000000000004551570",
"1000000000000000000000000000000005105506", "1000000000000000000000000000000004551480",
"1000000000000000000000000000000005106136", "1000000000000000000000000000000004551510",
"1000000000000000000000000000000005105696", "1000000000000000000000000000000004551460",
"1000000000000000000000000000000005105426", "1000000000000000000000000000000004551600",
"1000000000000000000000000000000005105916", "1000000000000000000000000000000004551340",
"1000000000000000000000000000000005105216", "1000000000000000000000000000000004551580",
"1000000000000000000000000000000005105416", "1000000000000000000000000000000004551330",
"1000000000000000000000000000000005105196", "1000000000000000000000000000000004551290",
"1000000000000000000000000000000005105226", "1000000000000000000000000000000004551180",
"1000000000000000000000000000000005105816", "1000000000000000000000000000000004551260",
"1000000000000000000000000000000005110186", "1000000000000000000000000000000004551150",
"1000000000000000000000000000000005110256", "1000000000000000000000000000000004551390",
"1000000000000000000000000000000005109926", "1000000000000000000000000000000004551440",
"1000000000000000000000000000000005110096", "1000000000000000000000000000000004551360",
"1000000000000000000000000000000005110026", "1000000000000000000000000000000004551400",
"1000000000000000000000000000000005110036", "1000000000000000000000000000000004544780",
"1000000000000000000000000000000005109716", "1000000000000000000000000000000004551230",
"1000000000000000000000000000000005110006", "1000000000000000000000000000000004544770",
"1000000000000000000000000000000005109446", "1000000000000000000000000000000004551200",
"1000000000000000000000000000000005109606", "1000000000000000000000000000000004544850",
"1000000000000000000000000000000005109076", "1000000000000000000000000000000004548370",
"1000000000000000000000000000000004544840",
"1000000000000000000000000000000004548470",
"1000000000000000000000000000000004611380",
"1000000000000000000000000000000004611470",
"1000000000000000000000000000000004611440",
]; ];
const STX = "\x02"; const STX = "\x02";
const ETX = "\x03"; const ETX = "\x03";
const scanner = new net.Socket(); const scanner = new net.Socket();
scanner.connect(50000, "10.204.0.26", async () => { scanner.connect(50001, "10.80.0.26", async () => {
console.log("Connected to scanner"); console.log("Connected to scanner");
// change the scanner to the to 112 // change the scanner to the to 112
@@ -76,7 +81,14 @@ scanner.connect(50000, "10.204.0.26", async () => {
}); });
scanner.on("data", async (data) => { scanner.on("data", async (data) => {
console.log("Response:", data.toString("ascii")); console.log(
"Response:",
data
.toString("ascii")
.replace(/\x00/g, "") // remove null bytes
.replace(/\x1B\[[0-9;?]*[A-Za-z]/g, "") // remove ANSI escape codes
.trim(),
);
}); });
scanner.on("close", () => { scanner.on("close", () => {

View File

@@ -6,69 +6,131 @@ import net from "net";
const prodIP = "10.204.0.26"; const prodIP = "10.204.0.26";
const prodPort = 50000; const prodPort = 50000;
const scannerID = "98@"; const scannerID = "98@";
const scannerCommand = "AlplaPRODcmd00000042#000028547"; // top of the picksheet const scannerCommand = "AlplaPRODcmd00000042#000028643"; // top of the picksheet
const scannerCommand2 = ""; // bottom of the pick sheet const scannerCommand2 = ""; // bottom of the pick sheet
const labels = [ const labels = [
"1000000000000000000000000000000005566030", "1000000000000000000000000000000005572620",
"1000000000000000000000000000000005544896", "1000000000000000000000000000000005572630",
"1000000000000000000000000000000005544906", "1000000000000000000000000000000005572640",
"1000000000000000000000000000000005544916", "1000000000000000000000000000000005572650",
"1000000000000000000000000000000005544926", "1000000000000000000000000000000005572660",
"1000000000000000000000000000000005544936", "1000000000000000000000000000000005572670",
"1000000000000000000000000000000005544946", "1000000000000000000000000000000005572680",
"1000000000000000000000000000000005544956", "1000000000000000000000000000000005572690",
"1000000000000000000000000000000005544966", "1000000000000000000000000000000005572700",
"1000000000000000000000000000000005544976", "1000000000000000000000000000000005572710",
"1000000000000000000000000000000005544986", "1000000000000000000000000000000005572720",
"1000000000000000000000000000000005544996", "1000000000000000000000000000000005572730",
"1000000000000000000000000000000005545006", "1000000000000000000000000000000005572740",
"1000000000000000000000000000000005545016", "1000000000000000000000000000000005572750",
"1000000000000000000000000000000005545026", "1000000000000000000000000000000005572760",
"1000000000000000000000000000000005545036", "1000000000000000000000000000000005572770",
"1000000000000000000000000000000005545046", "1000000000000000000000000000000005572780",
"1000000000000000000000000000000005545056", "1000000000000000000000000000000005572790",
"1000000000000000000000000000000005545066", "1000000000000000000000000000000005572800",
"1000000000000000000000000000000005545076", "1000000000000000000000000000000005572810",
"1000000000000000000000000000000005545086", "1000000000000000000000000000000005572820",
"1000000000000000000000000000000005545096", "1000000000000000000000000000000005572830",
"1000000000000000000000000000000005545106", "1000000000000000000000000000000005572840",
"1000000000000000000000000000000005545116", "1000000000000000000000000000000005572850",
"1000000000000000000000000000000005545126", "1000000000000000000000000000000005572860",
"1000000000000000000000000000000005545136", "1000000000000000000000000000000005572870",
"1000000000000000000000000000000005545146", "1000000000000000000000000000000005572880",
"1000000000000000000000000000000005545156", "1000000000000000000000000000000005572890",
"1000000000000000000000000000000005545166", "1000000000000000000000000000000005572900",
"1000000000000000000000000000000005545176", "1000000000000000000000000000000005572910",
"1000000000000000000000000000000005545186", "1000000000000000000000000000000005573226",
"1000000000000000000000000000000005544580", "1000000000000000000000000000000005573236",
"1000000000000000000000000000000005544590", "1000000000000000000000000000000005573246",
"1000000000000000000000000000000005544600", "1000000000000000000000000000000005573256",
"1000000000000000000000000000000005544610", "1000000000000000000000000000000005573266",
"1000000000000000000000000000000005544640", "1000000000000000000000000000000005573276",
"1000000000000000000000000000000005544650", "1000000000000000000000000000000005573286",
"1000000000000000000000000000000005544660", "1000000000000000000000000000000005573296",
"1000000000000000000000000000000005544670", "1000000000000000000000000000000005573306",
"1000000000000000000000000000000005544680", "1000000000000000000000000000000005573316",
"1000000000000000000000000000000005544690", "1000000000000000000000000000000005573326",
"1000000000000000000000000000000005544700", "1000000000000000000000000000000005573336",
"1000000000000000000000000000000005544710", "1000000000000000000000000000000005573346",
"1000000000000000000000000000000005544720", "1000000000000000000000000000000005573356",
"1000000000000000000000000000000005544730", "1000000000000000000000000000000005573366",
"1000000000000000000000000000000005544740", "1000000000000000000000000000000005573376",
"1000000000000000000000000000000005544750", "1000000000000000000000000000000005573386",
"1000000000000000000000000000000005544760", "1000000000000000000000000000000005573396",
"1000000000000000000000000000000005544770", "1000000000000000000000000000000005573406",
"1000000000000000000000000000000005544780", "1000000000000000000000000000000005573416",
"1000000000000000000000000000000005544790", "1000000000000000000000000000000005573426",
"1000000000000000000000000000000005544800", "1000000000000000000000000000000005573436",
"1000000000000000000000000000000005544810", "1000000000000000000000000000000005573446",
"1000000000000000000000000000000005544820", "1000000000000000000000000000000005573456",
"1000000000000000000000000000000005544830", "1000000000000000000000000000000005573466",
"1000000000000000000000000000000005544840", "1000000000000000000000000000000005573476",
"1000000000000000000000000000000005544850", "1000000000000000000000000000000005573486",
"1000000000000000000000000000000005544860", "1000000000000000000000000000000005573496",
"1000000000000000000000000000000005544870", "1000000000000000000000000000000005573506",
"1000000000000000000000000000000005573516",
"1000000000000000000000000000000005581616",
"1000000000000000000000000000000005581626",
"1000000000000000000000000000000005581636",
"1000000000000000000000000000000005581646",
"1000000000000000000000000000000005581656",
"1000000000000000000000000000000005581666",
"1000000000000000000000000000000005581676",
"1000000000000000000000000000000005581686",
"1000000000000000000000000000000005581696",
"1000000000000000000000000000000005581706",
"1000000000000000000000000000000005581716",
"1000000000000000000000000000000005581726",
"1000000000000000000000000000000005581736",
"1000000000000000000000000000000005581746",
"1000000000000000000000000000000005581756",
"1000000000000000000000000000000005581766",
"1000000000000000000000000000000005581776",
"1000000000000000000000000000000005581786",
"1000000000000000000000000000000005581796",
"1000000000000000000000000000000005581806",
"1000000000000000000000000000000005581816",
"1000000000000000000000000000000005581826",
"1000000000000000000000000000000005581836",
"1000000000000000000000000000000005581846",
"1000000000000000000000000000000005581856",
"1000000000000000000000000000000005582760",
"1000000000000000000000000000000005581866",
"1000000000000000000000000000000005581876",
"1000000000000000000000000000000005581886",
"1000000000000000000000000000000005581896",
"1000000000000000000000000000000005581906",
"1000000000000000000000000000000005581310",
"1000000000000000000000000000000005581320",
"1000000000000000000000000000000005581330",
"1000000000000000000000000000000005581340",
"1000000000000000000000000000000005581350",
"1000000000000000000000000000000005581360",
"1000000000000000000000000000000005581370",
"1000000000000000000000000000000005581380",
"1000000000000000000000000000000005581390",
"1000000000000000000000000000000005581400",
"1000000000000000000000000000000005581410",
"1000000000000000000000000000000005581420",
"1000000000000000000000000000000005581430",
"1000000000000000000000000000000005581440",
"1000000000000000000000000000000005581450",
"1000000000000000000000000000000005581460",
"1000000000000000000000000000000005581470",
"1000000000000000000000000000000005581480",
"1000000000000000000000000000000005581490",
"1000000000000000000000000000000005581500",
"1000000000000000000000000000000005581510",
"1000000000000000000000000000000005581520",
"1000000000000000000000000000000005581530",
"1000000000000000000000000000000005581540",
"1000000000000000000000000000000005581550",
"1000000000000000000000000000000005581560",
"1000000000000000000000000000000005581570",
"1000000000000000000000000000000005581580",
"1000000000000000000000000000000005581590",
"1000000000000000000000000000000005581600",
]; ];
const STX = "\x02"; const STX = "\x02";
const ETX = "\x03"; const ETX = "\x03";
@@ -106,7 +168,14 @@ scanner.connect(prodPort, prodIP, async () => {
}); });
scanner.on("data", async (data) => { scanner.on("data", async (data) => {
console.log("Response:", data.toString("ascii")); console.log(
"Response:",
data
.toString("ascii")
.replace(/\x00/g, "") // remove null bytes
.replace(/\x1B\[[0-9;?]*[A-Za-z]/g, "") // remove ANSI escape codes
.trim(),
);
}); });
scanner.on("close", () => { scanner.on("close", () => {