| @@ -128,11 +128,14 @@ export const recordSecondScanIssue = cache(async ( | |||||
| pickOrderId: number, | pickOrderId: number, | ||||
| itemId: number, | itemId: number, | ||||
| data: { | data: { | ||||
| qty: number; | |||||
| qty: number; // verified qty (actual pick qty) | |||||
| missQty?: number; // ✅ 添加:miss qty | |||||
| badItemQty?: number; // ✅ 添加:bad item qty | |||||
| isMissing: boolean; | isMissing: boolean; | ||||
| isBad: boolean; | isBad: boolean; | ||||
| reason: string; | reason: string; | ||||
| createdBy: number; | createdBy: number; | ||||
| type?: string; // ✅ type 也应该是可选的 | |||||
| } | } | ||||
| ) => { | ) => { | ||||
| @@ -183,6 +183,7 @@ export const recordFailLot = async (data: PickAnotherLotFormData) => { | |||||
| return result; | return result; | ||||
| }; | }; | ||||
| export interface PickExecutionIssueData { | export interface PickExecutionIssueData { | ||||
| type: string; | |||||
| pickOrderId: number; | pickOrderId: number; | ||||
| pickOrderCode: string; | pickOrderCode: string; | ||||
| pickOrderCreateDate: string; | pickOrderCreateDate: string; | ||||
| @@ -833,9 +833,12 @@ const PickExecution: React.FC<Props> = ({ filterArgs, onFgPickOrdersChange }) => | |||||
| const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | ||||
| try { | try { | ||||
| console.log("Pick execution form submitted:", data); | |||||
| const result = await recordPickExecutionIssue(data); | |||||
| console.log("Pick execution form submitted:", data); | |||||
| const issueData = { | |||||
| ...data, | |||||
| type: "Do", // Delivery Order Record 类型 | |||||
| }; | |||||
| const result = await recordPickExecutionIssue(issueData); | |||||
| console.log("Pick execution issue recorded:", result); | console.log("Pick execution issue recorded:", result); | ||||
| if (result && result.code === "SUCCESS") { | if (result && result.code === "SUCCESS") { | ||||
| @@ -1151,8 +1151,12 @@ useEffect(() => { | |||||
| const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | ||||
| try { | try { | ||||
| console.log("Pick execution form submitted:", data); | console.log("Pick execution form submitted:", data); | ||||
| const issueData = { | |||||
| ...data, | |||||
| type: "Do", // Delivery Order Record 类型 | |||||
| }; | |||||
| const result = await recordPickExecutionIssue(data); | |||||
| const result = await recordPickExecutionIssue(issueData); | |||||
| console.log("Pick execution issue recorded:", result); | console.log("Pick execution issue recorded:", result); | ||||
| if (result && result.code === "SUCCESS") { | if (result && result.code === "SUCCESS") { | ||||
| @@ -1353,8 +1353,12 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | const handlePickExecutionFormSubmit = useCallback(async (data: any) => { | ||||
| try { | try { | ||||
| console.log("Pick execution form submitted:", data); | console.log("Pick execution form submitted:", data); | ||||
| const issueData = { | |||||
| ...data, | |||||
| type: "Jo", // Delivery Order Record 类型 | |||||
| }; | |||||
| const result = await recordPickExecutionIssue(data); | |||||
| const result = await recordPickExecutionIssue(issueData); | |||||
| console.log("Pick execution issue recorded:", result); | console.log("Pick execution issue recorded:", result); | ||||
| if (result && result.code === "SUCCESS") { | if (result && result.code === "SUCCESS") { | ||||
| @@ -903,11 +903,14 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| selectedLotForExecutionForm.pickOrderId, | selectedLotForExecutionForm.pickOrderId, | ||||
| selectedLotForExecutionForm.itemId, | selectedLotForExecutionForm.itemId, | ||||
| { | { | ||||
| qty: data.actualPickQty, | |||||
| qty: data.actualPickQty, // verified qty | |||||
| missQty: data.missQty || 0, // ✅ 添加:实际的 miss qty | |||||
| badItemQty: data.badItemQty || 0, // ✅ 添加:实际的 bad item qty | |||||
| isMissing: data.missQty > 0, | isMissing: data.missQty > 0, | ||||
| isBad: data.badItemQty > 0, | isBad: data.badItemQty > 0, | ||||
| reason: data.issueRemark || '', | reason: data.issueRemark || '', | ||||
| createdBy: currentUserId | |||||
| createdBy: currentUserId, | |||||
| type: "match" | |||||
| } | } | ||||
| ); | ); | ||||
| console.log("Pick execution issue recorded:", result); | console.log("Pick execution issue recorded:", result); | ||||
| @@ -125,7 +125,7 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| return new Date().toISOString().split('T')[0]; | return new Date().toISOString().split('T')[0]; | ||||
| } | } | ||||
| }; | }; | ||||
| // ✅ Initialize verified quantity to the received quantity (actualPickQty) | // ✅ Initialize verified quantity to the received quantity (actualPickQty) | ||||
| const initialVerifiedQty = selectedLot.actualPickQty || 0; | const initialVerifiedQty = selectedLot.actualPickQty || 0; | ||||
| setVerifiedQty(initialVerifiedQty); | setVerifiedQty(initialVerifiedQty); | ||||
| @@ -148,15 +148,16 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| lotNo: selectedLot.lotNo, | lotNo: selectedLot.lotNo, | ||||
| storeLocation: selectedLot.location, | storeLocation: selectedLot.location, | ||||
| requiredQty: selectedLot.requiredQty, | requiredQty: selectedLot.requiredQty, | ||||
| actualPickQty: initialVerifiedQty, // ✅ Use the initial value | |||||
| actualPickQty: initialVerifiedQty, | |||||
| missQty: 0, | missQty: 0, | ||||
| badItemQty: 0, | badItemQty: 0, | ||||
| issueRemark: '', | issueRemark: '', | ||||
| // pickerName: '', | |||||
| handledBy: undefined, | handledBy: undefined, | ||||
| }); | }); | ||||
| } | } | ||||
| }, [open, selectedLot, selectedPickOrderLine, pickOrderId, pickOrderCreateDate]); | |||||
| // ✅ 修复:只在 open 状态改变时重新初始化,移除其他依赖 | |||||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||||
| }, [open]); | |||||
| const handleInputChange = useCallback((field: keyof PickExecutionIssueData, value: any) => { | const handleInputChange = useCallback((field: keyof PickExecutionIssueData, value: any) => { | ||||
| setFormData(prev => ({ ...prev, [field]: value })); | setFormData(prev => ({ ...prev, [field]: value })); | ||||
| @@ -220,6 +221,8 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({ | |||||
| const submissionData = { | const submissionData = { | ||||
| ...formData, | ...formData, | ||||
| actualPickQty: verifiedQty, | actualPickQty: verifiedQty, | ||||
| missQty: formData.missQty || 0, | |||||
| badItemQty: formData.badItemQty || 0, | |||||
| lotId: formData.lotId || selectedLot?.lotId || 0, | lotId: formData.lotId || selectedLot?.lotId || 0, | ||||
| lotNo: formData.lotNo || selectedLot?.lotNo || '', | lotNo: formData.lotNo || selectedLot?.lotNo || '', | ||||
| pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '', | pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '', | ||||
| @@ -67,7 +67,6 @@ import SearchResults, { Column } from "../SearchResults/SearchResults"; | |||||
| import { defaultPagingController } from "../SearchResults/SearchResults"; | import { defaultPagingController } from "../SearchResults/SearchResults"; | ||||
| import SearchBox, { Criterion } from "../SearchBox"; | import SearchBox, { Criterion } from "../SearchBox"; | ||||
| import dayjs from "dayjs"; | import dayjs from "dayjs"; | ||||
| import { dummyQCData } from "../PoDetail/dummyQcTemplate"; | |||||
| import { CreateStockOutLine } from "@/app/api/pickOrder/actions"; | import { CreateStockOutLine } from "@/app/api/pickOrder/actions"; | ||||
| import LotTable from './LotTable'; | import LotTable from './LotTable'; | ||||
| import PickOrderDetailsTable from './PickOrderDetailsTable'; // ✅ Import the new component | import PickOrderDetailsTable from './PickOrderDetailsTable'; // ✅ Import the new component | ||||
| @@ -515,20 +514,7 @@ const PickExecution: React.FC<Props> = ({ filterArgs }) => { | |||||
| setSelectedLotForQc(selectedLot); | setSelectedLotForQc(selectedLot); | ||||
| const transformedDummyData = dummyQCData.map(item => ({ | |||||
| id: item.id, | |||||
| code: item.code, | |||||
| name: item.name, | |||||
| itemId: line.itemId, | |||||
| lowerLimit: undefined, | |||||
| upperLimit: undefined, | |||||
| description: item.description, | |||||
| qcPassed: undefined, | |||||
| failQty: undefined, | |||||
| remarks: undefined | |||||
| })); | |||||
| setQcItems(transformedDummyData as QcItemWithChecks[]); | |||||
| let qcResult: any[] = []; | let qcResult: any[] = []; | ||||
| try { | try { | ||||