| @@ -35,14 +35,7 @@ const FGPickOrderCard: React.FC<Props> = ({ fgOrder, onQrCodeClick }) => { | |||||
| //helperText={fgOrder.pickOrderConsoCode} | //helperText={fgOrder.pickOrderConsoCode} | ||||
| /> | /> | ||||
| </Grid> | </Grid> | ||||
| <Grid item xs={6}> | |||||
| <TextField | |||||
| label={t("Shop PO Code")} | |||||
| fullWidth | |||||
| disabled={true} | |||||
| value={fgOrder.shopPoNo} | |||||
| /> | |||||
| </Grid> | |||||
| <Grid item xs={6}> | <Grid item xs={6}> | ||||
| <TextField | <TextField | ||||
| label={t("Store ID")} | label={t("Store ID")} | ||||
| @@ -51,14 +44,7 @@ const FGPickOrderCard: React.FC<Props> = ({ fgOrder, onQrCodeClick }) => { | |||||
| value={fgOrder.storeId} | value={fgOrder.storeId} | ||||
| /> | /> | ||||
| </Grid> | </Grid> | ||||
| <Grid item xs={6}> | |||||
| <TextField | |||||
| label={t("Shop ID")} | |||||
| fullWidth | |||||
| disabled={true} | |||||
| value={fgOrder.shopCode} | |||||
| /> | |||||
| </Grid> | |||||
| <Grid item xs={6}> | <Grid item xs={6}> | ||||
| <TextField | <TextField | ||||
| label={t("Shop Name")} | label={t("Shop Name")} | ||||
| @@ -20,7 +20,8 @@ import { useCallback, useEffect, useState } from "react"; | |||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import { GetPickOrderLineInfo, PickExecutionIssueData } from "@/app/api/pickOrder/actions"; | import { GetPickOrderLineInfo, PickExecutionIssueData } from "@/app/api/pickOrder/actions"; | ||||
| import { fetchEscalationCombo } from "@/app/api/user/actions"; | import { fetchEscalationCombo } from "@/app/api/user/actions"; | ||||
| import { useSession } from "next-auth/react"; | |||||
| import { SessionWithTokens } from "@/config/authConfig"; | |||||
| interface LotPickData { | interface LotPickData { | ||||
| id: number; | id: number; | ||||
| lotId: number; | lotId: number; | ||||
| @@ -82,7 +83,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| const [loading, setLoading] = useState(false); | const [loading, setLoading] = useState(false); | ||||
| const [handlers, setHandlers] = useState<Array<{ id: number; name: string }>>([]); | const [handlers, setHandlers] = useState<Array<{ id: number; name: string }>>([]); | ||||
| const [verifiedQty, setVerifiedQty] = useState<number>(0); | const [verifiedQty, setVerifiedQty] = useState<number>(0); | ||||
| // 计算剩余可用数量 | |||||
| const { data: session } = useSession() as { data: SessionWithTokens | null }; | |||||
| const calculateRemainingAvailableQty = useCallback((lot: LotPickData) => { | const calculateRemainingAvailableQty = useCallback((lot: LotPickData) => { | ||||
| const remainingQty = lot.inQty - lot.outQty; | const remainingQty = lot.inQty - lot.outQty; | ||||
| return Math.max(0, remainingQty); | return Math.max(0, remainingQty); | ||||
| @@ -149,7 +150,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| missQty: 0, | missQty: 0, | ||||
| badItemQty: 0, | badItemQty: 0, | ||||
| issueRemark: '', | issueRemark: '', | ||||
| pickerName: '', | |||||
| // pickerName: '', | |||||
| handledBy: undefined, | handledBy: undefined, | ||||
| }); | }); | ||||
| } | } | ||||
| @@ -212,7 +213,11 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| // ✅ Use the verified quantity in the submission | // ✅ Use the verified quantity in the submission | ||||
| const submissionData = { | const submissionData = { | ||||
| ...formData, | ...formData, | ||||
| actualPickQty: verifiedQty | |||||
| actualPickQty: verifiedQty, | |||||
| lotId: formData.lotId || selectedLot?.lotId || 0, | |||||
| lotNo: formData.lotNo || selectedLot?.lotNo || '', | |||||
| pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '', | |||||
| pickerName: session?.user?.name || '' | |||||
| } as PickExecutionIssueData; | } as PickExecutionIssueData; | ||||
| await onSubmit(submissionData); | await onSubmit(submissionData); | ||||
| @@ -278,7 +283,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| onChange={(e) => { | onChange={(e) => { | ||||
| const newValue = parseFloat(e.target.value) || 0; | const newValue = parseFloat(e.target.value) || 0; | ||||
| setVerifiedQty(newValue); | setVerifiedQty(newValue); | ||||
| handleInputChange('actualPickQty', newValue); | |||||
| // handleInputChange('actualPickQty', newValue); | |||||
| }} | }} | ||||
| error={!!errors.actualPickQty} | error={!!errors.actualPickQty} | ||||
| helperText={errors.actualPickQty || `${t('Max')}: ${selectedLot?.actualPickQty || 0}`} // ✅ 使用原始接收数量 | helperText={errors.actualPickQty || `${t('Max')}: ${selectedLot?.actualPickQty || 0}`} // ✅ 使用原始接收数量 | ||||
| @@ -428,6 +428,8 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| // ✅ 使用 Job Order API | // ✅ 使用 Job Order API | ||||
| const jobOrderData = await fetchCompletedJobOrderPickOrders(userIdToUse); | const jobOrderData = await fetchCompletedJobOrderPickOrders(userIdToUse); | ||||
| console.log("✅ Job Order data:", jobOrderData); | console.log("✅ Job Order data:", jobOrderData); | ||||
| console.log("✅ Pick Order Code from API:", jobOrderData.pickOrder?.code); | |||||
| console.log("✅ Expected Pick Order Code: P-20251003-001"); | |||||
| setJobOrderData(jobOrderData); | setJobOrderData(jobOrderData); | ||||
| @@ -870,6 +872,8 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| const handlePickExecutionForm = useCallback((lot: any) => { | const handlePickExecutionForm = useCallback((lot: any) => { | ||||
| console.log("=== Pick Execution Form ==="); | console.log("=== Pick Execution Form ==="); | ||||
| console.log("Lot data:", lot); | console.log("Lot data:", lot); | ||||
| console.log("lot.pickOrderCode:", lot.pickOrderCode); // ✅ 添加 | |||||
| console.log("lot.pickOrderId:", lot.pickOrderId); | |||||
| if (!lot) { | if (!lot) { | ||||
| console.warn("No lot data provided for pick execution form"); | console.warn("No lot data provided for pick execution form"); | ||||
| @@ -20,6 +20,8 @@ import { useCallback, useEffect, useState } from "react"; | |||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import { GetPickOrderLineInfo, PickExecutionIssueData } from "@/app/api/pickOrder/actions"; | import { GetPickOrderLineInfo, PickExecutionIssueData } from "@/app/api/pickOrder/actions"; | ||||
| import { fetchEscalationCombo } from "@/app/api/user/actions"; | import { fetchEscalationCombo } from "@/app/api/user/actions"; | ||||
| import { useSession } from "next-auth/react"; | |||||
| import { SessionWithTokens } from "@/config/authConfig"; | |||||
| interface LotPickData { | interface LotPickData { | ||||
| id: number; | id: number; | ||||
| @@ -82,6 +84,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| const [loading, setLoading] = useState(false); | const [loading, setLoading] = useState(false); | ||||
| const [handlers, setHandlers] = useState<Array<{ id: number; name: string }>>([]); | const [handlers, setHandlers] = useState<Array<{ id: number; name: string }>>([]); | ||||
| const [verifiedQty, setVerifiedQty] = useState<number>(0); | const [verifiedQty, setVerifiedQty] = useState<number>(0); | ||||
| const { data: session } = useSession() as { data: SessionWithTokens | null }; | |||||
| // 计算剩余可用数量 | // 计算剩余可用数量 | ||||
| const calculateRemainingAvailableQty = useCallback((lot: LotPickData) => { | const calculateRemainingAvailableQty = useCallback((lot: LotPickData) => { | ||||
| const remainingQty = lot.inQty - lot.outQty; | const remainingQty = lot.inQty - lot.outQty; | ||||
| @@ -149,7 +152,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| missQty: 0, | missQty: 0, | ||||
| badItemQty: 0, | badItemQty: 0, | ||||
| issueRemark: '', | issueRemark: '', | ||||
| pickerName: '', | |||||
| // pickerName: '', | |||||
| handledBy: undefined, | handledBy: undefined, | ||||
| }); | }); | ||||
| } | } | ||||
| @@ -216,7 +219,11 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| // ✅ Use the verified quantity in the submission | // ✅ Use the verified quantity in the submission | ||||
| const submissionData = { | const submissionData = { | ||||
| ...formData, | ...formData, | ||||
| actualPickQty: verifiedQty | |||||
| actualPickQty: verifiedQty, | |||||
| lotId: formData.lotId || selectedLot?.lotId || 0, | |||||
| lotNo: formData.lotNo || selectedLot?.lotNo || '', | |||||
| pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '', | |||||
| pickerName: session?.user?.name || '' | |||||
| } as PickExecutionIssueData; | } as PickExecutionIssueData; | ||||
| await onSubmit(submissionData); | await onSubmit(submissionData); | ||||
| @@ -291,7 +298,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| onChange={(e) => { | onChange={(e) => { | ||||
| const newValue = parseFloat(e.target.value) || 0; | const newValue = parseFloat(e.target.value) || 0; | ||||
| setVerifiedQty(newValue); | setVerifiedQty(newValue); | ||||
| handleInputChange('actualPickQty', newValue); | |||||
| //handleInputChange('actualPickQty', newValue); | |||||
| }} | }} | ||||
| error={!!errors.actualPickQty} | error={!!errors.actualPickQty} | ||||
| helperText={errors.actualPickQty || `${t('Max')}: ${selectedLot?.actualPickQty || 0}`} // ✅ 使用原始接收数量 | helperText={errors.actualPickQty || `${t('Max')}: ${selectedLot?.actualPickQty || 0}`} // ✅ 使用原始接收数量 | ||||