feat(ocp): materials contorls and transfer to next lot logic
This commit is contained in:
@@ -170,20 +170,15 @@ export const labelingProcess = async ({
|
||||
};
|
||||
}
|
||||
|
||||
// check mm is good
|
||||
// check the material... mm,color (auto and manual combined), pkg
|
||||
const mmStaged = await isMainMatStaged(filteredLot[0]);
|
||||
|
||||
if (!mmStaged) {
|
||||
createLog(
|
||||
"error",
|
||||
"labeling",
|
||||
"ocp",
|
||||
`Main material is not prepaired for lot ${filteredLot[0].lot}`
|
||||
);
|
||||
if (!mmStaged.success) {
|
||||
createLog("error", "labeling", "ocp", mmStaged.message);
|
||||
|
||||
return {
|
||||
success: false,
|
||||
message: `Main material is not prepaired for lot ${filteredLot[0].lot}`,
|
||||
message: mmStaged.message,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
206
server/services/ocp/controller/materials/lotTransfer.ts
Normal file
206
server/services/ocp/controller/materials/lotTransfer.ts
Normal file
@@ -0,0 +1,206 @@
|
||||
import { eq } from "drizzle-orm";
|
||||
import { db } from "../../../../../database/dbclient.js";
|
||||
import { printerData } from "../../../../../database/schema/printers.js";
|
||||
import { runProdApi } from "../../../../globalUtils/runProdApi.js";
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { createLog } from "../../../logger/logger.js";
|
||||
import { query } from "../../../sqlServer/prodSqlServer.js";
|
||||
import { labelInfo } from "../../../sqlServer/querys/warehouse/labelInfo.js";
|
||||
|
||||
type NewLotData = {
|
||||
runnungNumber: number;
|
||||
lotNumber: number;
|
||||
originalAmount: number;
|
||||
level: number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Move manual material to a new lot.
|
||||
*
|
||||
* The data sent over should be
|
||||
* Running number
|
||||
* Lot number
|
||||
* Orignal Quantity
|
||||
* level of gaylord
|
||||
*/
|
||||
export const lotMaterialTransfer = async (data: NewLotData) => {
|
||||
// get the barcode, and layoutID from the running number
|
||||
const { data: label, error: labelError } = (await tryCatch(
|
||||
query(
|
||||
labelInfo.replace("[runningNr]", `${data.runnungNumber}`),
|
||||
"Get label info"
|
||||
)
|
||||
)) as any;
|
||||
|
||||
if (labelError) {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
"There was an error getting the label info"
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: "There was an error getting the label info",
|
||||
data: labelError,
|
||||
};
|
||||
}
|
||||
|
||||
// if (
|
||||
// label.data[0]?.stockStatus === "notOnStock" ||
|
||||
// label.data.length === 0
|
||||
// ) {
|
||||
// createLog(
|
||||
// "error",
|
||||
// "materials",
|
||||
// "ocp",
|
||||
// `${data.runnungNumber}: dose not exist or no longer in stock.`
|
||||
// );
|
||||
// return {
|
||||
// success: false,
|
||||
// message: `${data.runnungNumber}: dose not exist or no longer in stock.`,
|
||||
// data: [],
|
||||
// };
|
||||
// }
|
||||
|
||||
if (label.data[0]?.stockStatus === "onStock") {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
`${data.runnungNumber}: currently in stock and not consumed to a lot.`
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: `${data.runnungNumber}: currently in stock and not consumed to a lot.`,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
// get the pdf24 printer id
|
||||
const { data: printer, error: printerError } = (await tryCatch(
|
||||
db.select().from(printerData).where(eq(printerData.name, "PDF24"))
|
||||
)) as any;
|
||||
|
||||
if (printerError) {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
"There was an error the printer info"
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: "There was an error the printer info",
|
||||
data: printerError,
|
||||
};
|
||||
}
|
||||
// calculate the remaining amount bascially it will be orignal number * level sent over
|
||||
// level should be sent in a decimal .25 .5 .75 .95 the 95 will allow basically the what looks to be a full gaylord but we always want to consume something
|
||||
const newQty = (data.originalAmount * data.level).toFixed(0);
|
||||
|
||||
// reprint the label and send it to pdf24
|
||||
const reprintData = {
|
||||
clientId: 999,
|
||||
runningNo: label?.data[0].runnungNumber,
|
||||
printerId: printer[0].humanReadableId,
|
||||
layoutId: label?.data[0].labelLayout,
|
||||
noOfCopies: 0,
|
||||
quantity: newQty,
|
||||
} as any;
|
||||
|
||||
const { data: reprint, error: reprintError } = (await tryCatch(
|
||||
runProdApi({
|
||||
endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel",
|
||||
data: [reprintData],
|
||||
})
|
||||
)) as any;
|
||||
|
||||
if (!reprint.success) {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
`RN:${data.runnungNumber}, Error: ${reprint.data.data.message}`
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: `RN:${data.runnungNumber}, Error: ${reprint.data.data.message}`,
|
||||
data: reprint,
|
||||
};
|
||||
}
|
||||
// return the label back to fm1 lane id 10001
|
||||
|
||||
const matReturnData = {
|
||||
barcode: label?.data[0].Barcode,
|
||||
laneId: 10001,
|
||||
};
|
||||
const { data: matReturn, error: matReturError } = (await tryCatch(
|
||||
runProdApi({
|
||||
endpoint:
|
||||
"/public/v1.0/IssueMaterial/ReturnPartiallyConsumedManualMaterial",
|
||||
data: [matReturnData],
|
||||
})
|
||||
)) as any;
|
||||
|
||||
if (!matReturn.success) {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
`RN:${data.runnungNumber}, Error ${matReturn.data.data.errors[0].message}`
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: `RN:${data.runnungNumber}, Error ${matReturn.data.data.errors[0].message}`,
|
||||
data: matReturn,
|
||||
};
|
||||
}
|
||||
// consume to the lot provided.
|
||||
const consumeLot = {
|
||||
productionLot: data.lotNumber,
|
||||
barcode: label?.data[0].Barcode,
|
||||
};
|
||||
const { data: matConsume, error: matConsumeError } = (await tryCatch(
|
||||
runProdApi({
|
||||
endpoint:
|
||||
"/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial",
|
||||
data: [consumeLot],
|
||||
})
|
||||
)) as any;
|
||||
|
||||
if (!matConsume.success) {
|
||||
createLog(
|
||||
"error",
|
||||
"materials",
|
||||
"ocp",
|
||||
`RN:${data.runnungNumber}, Error ${matConsume.data.data.errors[0].message}`
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
message: `RN:${data.runnungNumber}, Error ${matConsume.data.data.errors[0].message}`,
|
||||
data: matConsume,
|
||||
};
|
||||
}
|
||||
|
||||
createLog(
|
||||
"info",
|
||||
"materials",
|
||||
"ocp",
|
||||
`RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`
|
||||
);
|
||||
return {
|
||||
success: true,
|
||||
message: `RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`,
|
||||
data: [],
|
||||
};
|
||||
};
|
||||
|
||||
// setTimeout(async () => {
|
||||
// lotMaterialTransfer({
|
||||
// runnungNumber: 603468,
|
||||
// lotNumber: 24897,
|
||||
// originalAmount: 380,
|
||||
// level: 0.95,
|
||||
// });
|
||||
// }, 5000);
|
||||
@@ -1,12 +1,14 @@
|
||||
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
|
||||
import { createLog } from "../../../logger/logger.js";
|
||||
import { serverSettings } from "../../../server/controller/settings/getSettings.js";
|
||||
import { query } from "../../../sqlServer/prodSqlServer.js";
|
||||
import { machineCheck } from "../../../sqlServer/querys/ocp/machineId.js";
|
||||
import { mmQuery } from "../../../sqlServer/querys/ocp/mainMaterial.js";
|
||||
|
||||
export const isMainMatStaged = async (lot: any) => {
|
||||
const set = serverSettings.length === 0 ? [] : serverSettings;
|
||||
// make staged false by deefault and error logged if theres an issue
|
||||
let isStaged = false;
|
||||
let isStaged = { message: "Material is staged", success: true };
|
||||
|
||||
const { data, error } = (await tryCatch(
|
||||
query(
|
||||
@@ -26,7 +28,10 @@ export const isMainMatStaged = async (lot: any) => {
|
||||
"ocp",
|
||||
`The machine dose not require mm to print and book in.`
|
||||
);
|
||||
return true;
|
||||
return {
|
||||
message: "Machine dose not require material to be staged",
|
||||
success: true,
|
||||
};
|
||||
}
|
||||
|
||||
// strangly the lot is not always sending over in slc so adding this in for now to see what line is cauing this issue
|
||||
@@ -51,20 +56,101 @@ export const isMainMatStaged = async (lot: any) => {
|
||||
|
||||
const res: any = r.data;
|
||||
|
||||
createLog(
|
||||
"info",
|
||||
"mainMaterial",
|
||||
"ocp",
|
||||
`MainMaterial results: ${JSON.stringify(res)}`
|
||||
);
|
||||
|
||||
if (res[0].Staged >= 1) {
|
||||
isStaged = true;
|
||||
}
|
||||
|
||||
// if (res[0].noShortage === "good") {
|
||||
// if (res[0].Staged >= 1) {
|
||||
// isStaged = true;
|
||||
// }
|
||||
|
||||
createLog("info", "mainMaterial", "ocp", `Maint material query ran.`);
|
||||
|
||||
const mainMateiral = res.filter((n: any) => n.IsMainMaterial);
|
||||
|
||||
if (mainMateiral[0]?.noMaterialShortage === "no") {
|
||||
isStaged = {
|
||||
message: `Main material: ${mainMateiral[0].MaterialHumanReadableId} - ${mainMateiral[0].MaterialDescription}: is not staged for ${lot.lot} `,
|
||||
success: false,
|
||||
};
|
||||
}
|
||||
|
||||
// we need to filter the color stuff and then look for includes instead of a standard name. this way we can capture a everything and not a single type
|
||||
// for manual consume color if active to check colors
|
||||
const checkColorSetting = set.filter((n) => n.name === "checkColor");
|
||||
|
||||
if (checkColorSetting[0].value === "1") {
|
||||
const autoConsumeColor = res.filter(
|
||||
(n: any) => !n.IsMainMaterial && !n.isManual
|
||||
);
|
||||
if (
|
||||
autoConsumeColor.some(
|
||||
(n: any) => n.autoConsumeCheck === "autoConsumeNOK"
|
||||
)
|
||||
) {
|
||||
const onlyNOK = autoConsumeColor.filter(
|
||||
(n: any) => n.autoConsumeCheck === "autoConsumeNOK"
|
||||
);
|
||||
isStaged = {
|
||||
message: `lot: ${lot.lot}, is missing: ${onlyNOK
|
||||
.map(
|
||||
(o: any) =>
|
||||
`${o.MaterialHumanReadableId} - ${o.MaterialDescription}`
|
||||
)
|
||||
.join(",\n ")} for autoconsume`,
|
||||
success: false,
|
||||
};
|
||||
}
|
||||
|
||||
// // for manual consume color
|
||||
const manualConsumeColor = res.filter(
|
||||
(n: any) => !n.IsMainMaterial && n.isManual
|
||||
);
|
||||
if (
|
||||
manualConsumeColor.some(
|
||||
(n: any) => n.noMaterialShortage === "yes"
|
||||
)
|
||||
) {
|
||||
isStaged = {
|
||||
message: `lot: ${lot.lot}, is missing: ${manualConsumeColor
|
||||
.map(
|
||||
(o: any) =>
|
||||
`${o.MaterialHumanReadableId} - ${o.MaterialDescription}`
|
||||
)
|
||||
.join(",\n ")} for manual Material`,
|
||||
success: false,
|
||||
};
|
||||
}
|
||||
} else {
|
||||
createLog(
|
||||
"info",
|
||||
"mainMaterial",
|
||||
"ocp",
|
||||
"Color check is not active."
|
||||
);
|
||||
}
|
||||
|
||||
// // if we want to check the packaging
|
||||
const checkPKGSetting = set.filter((n) => n.name === "checkPKG");
|
||||
if (checkPKGSetting[0].value === "1") {
|
||||
const packagingCheck = res.filter(
|
||||
(n: any) => !n.IsMainMaterial && n.isManual
|
||||
);
|
||||
if (packagingCheck.some((n: any) => n.noPKGShortage === "noPkg")) {
|
||||
isStaged = {
|
||||
message: `lot: ${lot.lot}, is missing: ${packagingCheck
|
||||
.map(
|
||||
(o: any) =>
|
||||
`${o.MaterialHumanReadableId} - ${o.MaterialDescription}`
|
||||
)
|
||||
.join(",\n ")} for pkg`,
|
||||
success: false,
|
||||
};
|
||||
}
|
||||
} else {
|
||||
createLog(
|
||||
"info",
|
||||
"mainMaterial",
|
||||
"ocp",
|
||||
"PKG check is not active."
|
||||
);
|
||||
}
|
||||
} catch (err) {
|
||||
createLog(
|
||||
"error",
|
||||
|
||||
Reference in New Issue
Block a user