diff --git a/src/components/ProductionProcess/ProductionOutputForm.tsx b/src/components/ProductionProcess/ProductionOutputForm.tsx index 1f1d536d..5b2a399b 100644 --- a/src/components/ProductionProcess/ProductionOutputForm.tsx +++ b/src/components/ProductionProcess/ProductionOutputForm.tsx @@ -18,6 +18,7 @@ import { useTranslation } from "react-i18next"; import { UpdateProductProcessLineQtyRequest } from "@/app/api/jo/actions"; interface ProductionOutputFormProps { + showByproduct?: boolean; outputData: (UpdateProductProcessLineQtyRequest & { byproductName: string; byproductQty: number; @@ -34,13 +35,16 @@ interface ProductionOutputFormProps { >; onSubmit: () => Promise | void; onCancel: () => void; + submitting?: boolean; } const ProductionOutputForm: React.FC = ({ + showByproduct = false, outputData, setOutputData, onSubmit, onCancel, + submitting = false, }) => { const { t } = useTranslation(); @@ -88,10 +92,14 @@ const ProductionOutputForm: React.FC = ({ + {showByproduct && ( {t("By-product")} + + {outputData.byproductName} + @@ -106,22 +114,14 @@ const ProductionOutputForm: React.FC = ({ byproductQty: parseInt(e.target.value) || 0, }) } + inputProps={{ min: 0 }} /> - - setOutputData({ - ...outputData, - byproductUom: e.target.value, - }) - } - /> + {outputData.byproductUom || "-"} + )} @@ -199,7 +199,7 @@ const ProductionOutputForm: React.FC = ({ - diff --git a/src/components/ProductionProcess/ProductionOutputFormPage.tsx b/src/components/ProductionProcess/ProductionOutputFormPage.tsx index bdbbffba..607d3a63 100644 --- a/src/components/ProductionProcess/ProductionOutputFormPage.tsx +++ b/src/components/ProductionProcess/ProductionOutputFormPage.tsx @@ -1,5 +1,5 @@ "use client"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { Box, Button, @@ -25,6 +25,8 @@ const ProductionOutputFormPage: React.FC = ({ }) => { const { t } = useTranslation(); const [lineDetail, setLineDetail] = useState(null); + const outputInFlightRef = useRef(false); + const [isSubmitting, setIsSubmitting] = useState(false); const [outputData, setOutputData] = useState = ({ const handleSubmitOutput = async () => { if (!lineDetail?.id) return; + if (outputInFlightRef.current) return; + outputInFlightRef.current = true; + setIsSubmitting(true); try { await updateProductProcessLineQty({ @@ -110,6 +115,9 @@ const ProductionOutputFormPage: React.FC = ({ } catch (error) { console.error("Error submitting output:", error); alert("Failed to submit output data. Please try again."); + } finally { + outputInFlightRef.current = false; + setIsSubmitting(false); } }; @@ -133,10 +141,12 @@ const ProductionOutputFormPage: React.FC = ({ 0} outputData={outputData} setOutputData={setOutputData} onSubmit={handleSubmitOutput} onCancel={onBack} + submitting={isSubmitting} /> ); diff --git a/src/components/ProductionProcess/ProductionProcessStepExecution.tsx b/src/components/ProductionProcess/ProductionProcessStepExecution.tsx index 7431efcb..625adbd6 100644 --- a/src/components/ProductionProcess/ProductionProcessStepExecution.tsx +++ b/src/components/ProductionProcess/ProductionProcessStepExecution.tsx @@ -42,7 +42,7 @@ import { ProductProcessLineResponse, // ✅ 添加 } from "@/app/api/jo/actions"; import { Operator, Machine } from "@/app/api/jo"; -import React, { useCallback, useEffect, useState, useMemo } from "react"; // ✅ 添加 useMemo +import React, { useCallback, useEffect, useState, useMemo, useRef } from "react"; import { useQrCodeScannerContext } from "../QrCodeScannerProvider/QrCodeScannerProvider"; import { fetchNameList, NameList } from "@/app/api/user/actions"; import BagConsumptionForm from "./BagConsumptionForm"; // ✅ 添加导入 @@ -114,6 +114,9 @@ const ProductionProcessStepExecution: React.FC(null); const[isOpenReasonModel, setIsOpenReasonModel] = useState(false); const [pauseReason, setPauseReason] = useState(""); + const outputInFlightRef = useRef(false); + const [isSubmittingOutput, setIsSubmittingOutput] = useState(false); + const hasByproduct = (lineDetail?.byproductId ?? 0) > 0; // ✅ 添加:判断是否显示 Bag 表单的条件 const isPackagingProcess = useMemo(() => { @@ -360,6 +363,9 @@ const ProductionProcessStepExecution: React.FC { if (!lineDetail?.id) return; + if (outputInFlightRef.current) return; + outputInFlightRef.current = true; + setIsSubmittingOutput(true); try { await updateProductProcessLineQty({ @@ -422,6 +428,9 @@ const ProductionProcessStepExecution: React.FC + {hasByproduct && ( + + + {t("By-product")} + + {outputData.byproductName} + + + + setOutputData({ + ...outputData, + byproductQty: parseInt(e.target.value) || 0 + })} + inputProps={{ min: 0 }} + /> + + + {outputData.byproductUom || "-"} + + + + )} + {t("Defect")}{t("(1)")} @@ -1052,6 +1089,7 @@ const ProductionProcessStepExecution: React.FC} onClick={handleSubmitOutput} + disabled={isSubmittingOutput} > {t("Complete Step")}