| @@ -108,6 +108,7 @@ const ManualLotConfirmationModal: React.FC<{ | |||||
| isLoading?: boolean; | isLoading?: boolean; | ||||
| }> = ({ open, onClose, onConfirm, expectedLot, scannedLot, isLoading = false }) => { | }> = ({ open, onClose, onConfirm, expectedLot, scannedLot, isLoading = false }) => { | ||||
| const { t } = useTranslation("pickOrder"); | const { t } = useTranslation("pickOrder"); | ||||
| const [expectedLotInput, setExpectedLotInput] = useState(""); | const [expectedLotInput, setExpectedLotInput] = useState(""); | ||||
| const [scannedLotInput, setScannedLotInput] = useState(""); | const [scannedLotInput, setScannedLotInput] = useState(""); | ||||
| const [error, setError] = useState(""); | const [error, setError] = useState(""); | ||||
| @@ -298,7 +299,11 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| const [pickOrderLoading, setPickOrderLoading] = useState(false); | const [pickOrderLoading, setPickOrderLoading] = useState(false); | ||||
| const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10 }); | const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10 }); | ||||
| const [totalCountItems, setTotalCountItems] = useState(0); | const [totalCountItems, setTotalCountItems] = useState(0); | ||||
| const localizeBackendMessage = (msg: unknown, fallbackKey: string) => { | |||||
| const text = typeof msg === "string" ? msg.trim() : ""; | |||||
| if (!text) return t(fallbackKey); | |||||
| return t(text, { defaultValue: text }); | |||||
| }; | |||||
| const [selectedPickOrderLineId, setSelectedPickOrderLineId] = useState<number | null>(null); | const [selectedPickOrderLineId, setSelectedPickOrderLineId] = useState<number | null>(null); | ||||
| const [selectedPickOrderId, setSelectedPickOrderId] = useState<number | null>(null); | const [selectedPickOrderId, setSelectedPickOrderId] = useState<number | null>(null); | ||||
| const [selectedTopMeta, setSelectedTopMeta] = useState<{ | const [selectedTopMeta, setSelectedTopMeta] = useState<{ | ||||
| @@ -579,21 +584,13 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| ...(typeof qtyValue === "number" && Number.isFinite(qtyValue) ? { qty: qtyValue } : {}), | ...(typeof qtyValue === "number" && Number.isFinite(qtyValue) ? { qty: qtyValue } : {}), | ||||
| userId, | userId, | ||||
| }); | }); | ||||
| if (res.code !== "SUCCESS") { | |||||
| setError((res.message as string) || t("Scan pick failed")); | |||||
| startTransition(() => { | |||||
| setQrScanError(true); | |||||
| setQrScanSuccess(false); | |||||
| setQrScanErrorMsg((res.message as string) || t("Scan pick failed")); | |||||
| }); | |||||
| return; | |||||
| } | |||||
| setMessage((res.message as string) || t("Scan pick success")); | |||||
| startTransition(() => { | |||||
| setQrScanError(false); | |||||
| setQrScanSuccess(true); | |||||
| setQrScanSuccessMsg((res.message as string) || t("Scan pick success")); | |||||
| }); | |||||
| const errMsg = localizeBackendMessage(res.message, "Scan pick failed"); | |||||
| setError(errMsg); | |||||
| setQrScanErrorMsg(errMsg); | |||||
| const okMsg = localizeBackendMessage(res.message, "Scan pick success"); | |||||
| setMessage(okMsg); | |||||
| setQrScanSuccessMsg(okMsg); | |||||
| if (workbenchScanPickResponseNeedsFullRefresh(res)) { | if (workbenchScanPickResponseNeedsFullRefresh(res)) { | ||||
| if (selectedPickOrderId != null && selectedPickOrderLineId != null && selectedTopMeta) { | if (selectedPickOrderId != null && selectedPickOrderLineId != null && selectedTopMeta) { | ||||
| await loadLineDetailV2(selectedPickOrderId, selectedPickOrderLineId, selectedTopMeta); | await loadLineDetailV2(selectedPickOrderId, selectedPickOrderLineId, selectedTopMeta); | ||||