From 0b895e72383d727558f5c5c293af2b3e07735aa2 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Tue, 28 Apr 2026 11:18:36 +0800 Subject: [PATCH] fix do reprint --- src/app/api/do/actions.tsx | 26 +++++ .../GoodPickExecutionWorkbenchRecord.tsx | 101 +++++++++++++++++- .../DoWorkbench/WorkbenchFloorLanePanel.tsx | 2 +- src/i18n/zh/jo.json | 1 + src/i18n/zh/pickOrder.json | 2 + 5 files changed, 130 insertions(+), 2 deletions(-) diff --git a/src/app/api/do/actions.tsx b/src/app/api/do/actions.tsx index bc12d14..5d8114c 100644 --- a/src/app/api/do/actions.tsx +++ b/src/app/api/do/actions.tsx @@ -528,6 +528,14 @@ export interface PrintWorkbenchDNLabelsRequest{ printQty: number; numOfCarton: number; } +export interface PrintWorkbenchDNLabelsReprintRequest{ + deliveryOrderPickOrderId: number; + printerId: number; + printQty: number; + fromCarton: number; + toCarton: number; + totalCartonsOnShipment: number; +} export async function printDNWorkbench(request: PrintWorkbenchDeliveryNoteRequest){ const params = new URLSearchParams(); params.append("doPickOrderId", request.deliveryOrderPickOrderId.toString()); @@ -576,6 +584,24 @@ export async function printDNLabelsWorkbench(request: PrintWorkbenchDNLabelsRequ return { success: true, message: "Print job sent successfully (workbench labels)"} as PrintDeliveryNoteResponse } +export async function printDNLabelsReprintWorkbench(request: PrintWorkbenchDNLabelsReprintRequest){ + const params = new URLSearchParams(); + params.append("doPickOrderId", request.deliveryOrderPickOrderId.toString()); + params.append("printerId", request.printerId.toString()); + if (request.printQty !== null && request.printQty !== undefined) { + params.append("printQty", request.printQty.toString()); + } + params.append("fromCarton", request.fromCarton.toString()); + params.append("toCarton", request.toCarton.toString()); + params.append("totalCartonsOnShipment", request.totalCartonsOnShipment.toString()); + + await serverFetchWithNoContent(`${BASE_API_URL}/doPickOrder/workbench/print-DNLabels-reprint?${params.toString()}`,{ + method: "GET" + }); + + return { success: true, message: "Print job sent successfully (workbench reprint labels)"} as PrintDeliveryNoteResponse +} + export interface Check4FTruckBatchResponse { hasProblem: boolean; problems: ProblemDoDto[]; diff --git a/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx b/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx index d032e16..5554ae7 100644 --- a/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx +++ b/src/components/DoWorkbench/GoodPickExecutionWorkbenchRecord.tsx @@ -35,7 +35,7 @@ import { fetchCompletedDoPickOrdersWorkbench, fetchCompletedDoPickOrdersWorkbenchAll, } from "@/app/api/pickOrder/actions"; -import { printDNWorkbench, printDNLabelsWorkbench } from "@/app/api/do/actions"; +import { printDNWorkbench, printDNLabelsWorkbench, printDNLabelsReprintWorkbench } from "@/app/api/do/actions"; import { fetchWorkbenchCompletedLotDetails } from "@/app/api/doworkbench/actions"; import SearchBox, { Criterion } from "../SearchBox"; @@ -281,6 +281,102 @@ const GoodPickExecutionWorkbenchRecord: React.FC = ({ }, [a4Printer, askNumOfCarton, labelPrinter, loadData, t], ); + const handleLabelReprint = useCallback(async (doPickOrder: CompletedDoPickOrderResponse) => { + if (!labelPrinter) { + Swal.fire({ + position: "bottom-end", + icon: "warning", + text: t("Please select a label printer first"), + showConfirmButton: false, + timer: 1500 + }); + return; + } + + const defaultTotalCartons = Math.max(1, doPickOrder.numberOfCartons || 1); + const result = await Swal.fire({ + title: t("Reprint DN Label"), + html: ` +
+
+ + +
+
+ + +
+
+ + +
+
+ `, + showCancelButton: true, + confirmButtonText: t("Confirm"), + cancelButtonText: t("Cancel"), + confirmButtonColor: "#8dba00", + cancelButtonColor: "#F04438", + focusConfirm: false, + preConfirm: () => { + const fromCarton = Number((document.getElementById("swal-from-carton") as HTMLInputElement | null)?.value || "0"); + const toCarton = Number((document.getElementById("swal-to-carton") as HTMLInputElement | null)?.value || "0"); + const totalCartonsOnShipment = Number((document.getElementById("swal-total-carton") as HTMLInputElement | null)?.value || "0"); + + if (!Number.isInteger(fromCarton) || fromCarton < 1) { + Swal.showValidationMessage(t("From carton must be at least 1")); + return null; + } + if (!Number.isInteger(toCarton) || toCarton < fromCarton) { + Swal.showValidationMessage(t("To carton must be greater than or equal to from carton")); + return null; + } + if (!Number.isInteger(totalCartonsOnShipment) || totalCartonsOnShipment < 1) { + Swal.showValidationMessage(t("Total cartons on shipment must be at least 1")); + return null; + } + if (toCarton > totalCartonsOnShipment) { + Swal.showValidationMessage(t("To carton cannot be greater than total cartons on shipment")); + return null; + } + + return { + fromCarton, + toCarton, + totalCartonsOnShipment, + }; + } + }); + + if (!result.isConfirmed || !result.value) { + return; + } + + try { + const response = await printDNLabelsReprintWorkbench({ + deliveryOrderPickOrderId: doPickOrder.doPickOrderRecordId, + printerId: labelPrinter.id, + printQty: 1, + fromCarton: result.value.fromCarton, + toCarton: result.value.toCarton, + totalCartonsOnShipment: result.value.totalCartonsOnShipment, + }); + + if (response.success) { + Swal.fire({ + position: "bottom-end", + icon: "success", + text: t("Printed Successfully."), + showConfirmButton: false, + timer: 1500 + }); + } else { + console.error("Reprint failed:", response.message); + } + } catch (error) { + console.error("reprint error: ", error); + } + }, [labelPrinter, t]); const handleDetailClick = useCallback( async (record: CompletedDoPickOrderResponse) => { @@ -547,6 +643,9 @@ const GoodPickExecutionWorkbenchRecord: React.FC = ({ + ))} diff --git a/src/components/DoWorkbench/WorkbenchFloorLanePanel.tsx b/src/components/DoWorkbench/WorkbenchFloorLanePanel.tsx index 4554f78..5356b20 100644 --- a/src/components/DoWorkbench/WorkbenchFloorLanePanel.tsx +++ b/src/components/DoWorkbench/WorkbenchFloorLanePanel.tsx @@ -453,7 +453,7 @@ const WorkbenchFloorLanePanel: React.FC = ({ onPickOrderAssigned, onSwitc setModalOpen(true); }} > - {`${t("Before today")} (${beforeTodayTruckXCount})`} + {`${t("車線-X")} (${beforeTodayTruckXCount})`} )} diff --git a/src/i18n/zh/jo.json b/src/i18n/zh/jo.json index 9a02757..a5a0e0e 100644 --- a/src/i18n/zh/jo.json +++ b/src/i18n/zh/jo.json @@ -11,6 +11,7 @@ "storing": "待品檢入倉", "Name": "成品/半成品名稱", "Picked Qty": "已提料數量", + "Insufficient available quantity on lot (may have been picked by another user)": "掃描的批次已被其他用戶完全提料。請掃描其他批次。", "Please check around have QR code or not, may be have just now stock in or transfer in or transfer out.": "請檢查周圍是否有QR碼,可能是剛剛入庫或轉移入庫或轉移出庫。", "is expired. Please check around have available QR code or not.": "已過期。請檢查周圍是否有可用的 QR 碼。", "Confirm All": "確認所有提料", diff --git a/src/i18n/zh/pickOrder.json b/src/i18n/zh/pickOrder.json index fb9192e..a1c2d5a 100644 --- a/src/i18n/zh/pickOrder.json +++ b/src/i18n/zh/pickOrder.json @@ -265,7 +265,9 @@ "storing": "待品檢入倉", "pick successful": "提料成功", "Suggestion success": "建議成功", + "Insufficient available quantity on lot (may have been picked by another user)": "掃描的批次已被其他用戶完全提料。請掃描其他批次。", "Scan": "掃描", + "Before today": "今天之前", "Scanned": "已掃描", "Loading data...": "正在載入數據...", "No available stock for this item": "沒有可用庫存",