| @@ -25,7 +25,7 @@ export interface ShopAndTruck{ | |||||
| truckLanceCode: String; | truckLanceCode: String; | ||||
| DepartureTime: String; | DepartureTime: String; | ||||
| LoadingSequence?: number | null; | LoadingSequence?: number | null; | ||||
| districtReference: Number; | |||||
| districtReference: string | null; | |||||
| Store_id: Number; | Store_id: Number; | ||||
| remark?: String | null; | remark?: String | null; | ||||
| truckId?: number; | truckId?: number; | ||||
| @@ -43,7 +43,7 @@ export interface Truck{ | |||||
| truckLanceCode: String; | truckLanceCode: String; | ||||
| departureTime: String | number[]; | departureTime: String | number[]; | ||||
| loadingSequence: number; | loadingSequence: number; | ||||
| districtReference: Number; | |||||
| districtReference: string | null; | |||||
| storeId: Number | String; | storeId: Number | String; | ||||
| remark?: String | null; | remark?: String | null; | ||||
| shopName?: String | null; | shopName?: String | null; | ||||
| @@ -55,7 +55,7 @@ export interface SaveTruckLane { | |||||
| truckLanceCode: string; | truckLanceCode: string; | ||||
| departureTime: string; | departureTime: string; | ||||
| loadingSequence: number; | loadingSequence: number; | ||||
| districtReference: number; | |||||
| districtReference: string | null; | |||||
| storeId: string; | storeId: string; | ||||
| remark?: string | null; | remark?: string | null; | ||||
| } | } | ||||
| @@ -82,7 +82,7 @@ export interface SaveTruckRequest { | |||||
| shopName: string; | shopName: string; | ||||
| shopCode: string; | shopCode: string; | ||||
| loadingSequence: number; | loadingSequence: number; | ||||
| districtReference?: number | null; | |||||
| districtReference?: string | null; | |||||
| remark?: string | null; | remark?: string | null; | ||||
| } | } | ||||
| @@ -91,7 +91,7 @@ export interface CreateTruckWithoutShopRequest { | |||||
| truckLanceCode: string; | truckLanceCode: string; | ||||
| departureTime: string; | departureTime: string; | ||||
| loadingSequence?: number; | loadingSequence?: number; | ||||
| districtReference?: number | null; | |||||
| districtReference?: string | null; | |||||
| remark?: string | null; | remark?: string | null; | ||||
| } | } | ||||
| @@ -32,7 +32,6 @@ import { | |||||
| AutoAssignReleaseResponse, | AutoAssignReleaseResponse, | ||||
| checkPickOrderCompletion, | checkPickOrderCompletion, | ||||
| PickOrderCompletionResponse, | PickOrderCompletionResponse, | ||||
| checkAndCompletePickOrderByConsoCode, | |||||
| fetchDoPickOrderDetail, | fetchDoPickOrderDetail, | ||||
| DoPickOrderDetail, | DoPickOrderDetail, | ||||
| } from "@/app/api/pickOrder/actions"; | } from "@/app/api/pickOrder/actions"; | ||||
| @@ -947,26 +946,7 @@ const fetchFgPickOrdersData = useCallback(async () => { | |||||
| }); | }); | ||||
| } | } | ||||
| // FIXED: Use the proper API function instead of direct fetch | |||||
| if (newStatus === 'completed' && lot.pickOrderConsoCode) { | |||||
| console.log(` Lot ${lot.lotNo} completed, checking if pick order ${lot.pickOrderConsoCode} is complete...`); | |||||
| try { | |||||
| // Use the imported API function instead of direct fetch | |||||
| const completionResponse = await checkAndCompletePickOrderByConsoCode(lot.pickOrderConsoCode); | |||||
| console.log(` Pick order completion check result:`, completionResponse); | |||||
| if (completionResponse.code === "SUCCESS") { | |||||
| console.log(`�� Pick order ${lot.pickOrderConsoCode} completed successfully!`); | |||||
| } else if (completionResponse.message === "not completed") { | |||||
| console.log(`⏳ Pick order not completed yet, more lines remaining`); | |||||
| } else { | |||||
| console.error(`❌ Error checking completion: ${completionResponse.message}`); | |||||
| } | |||||
| } catch (error) { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| } | |||||
| } | |||||
| // Workbench completion is handled in backend scan-pick flow. | |||||
| await fetchAllCombinedLotData(); | await fetchAllCombinedLotData(); | ||||
| console.log("Pick quantity submitted successfully!"); | console.log("Pick quantity submitted successfully!"); | ||||
| @@ -38,7 +38,6 @@ import { | |||||
| checkPickOrderCompletion, | checkPickOrderCompletion, | ||||
| fetchAllPickOrderLotsHierarchicalWorkbench, | fetchAllPickOrderLotsHierarchicalWorkbench, | ||||
| PickOrderCompletionResponse, | PickOrderCompletionResponse, | ||||
| checkAndCompletePickOrderByConsoCode, | |||||
| updateSuggestedLotLineId, | updateSuggestedLotLineId, | ||||
| updateStockOutLineStatusByQRCodeAndLotNo, | updateStockOutLineStatusByQRCodeAndLotNo, | ||||
| confirmLotSubstitution, | confirmLotSubstitution, | ||||
| @@ -2839,15 +2838,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||||
| return next; | return next; | ||||
| }); | }); | ||||
| await refreshWorkbenchAfterScanPick(); | await refreshWorkbenchAfterScanPick(); | ||||
| if (canonicalLotForSol.pickOrderConsoCode) { | |||||
| void checkAndCompletePickOrderByConsoCode(canonicalLotForSol.pickOrderConsoCode) | |||||
| .then((completionResponse) => { | |||||
| console.log(` Pick order completion check (workbench just complete):`, completionResponse); | |||||
| }) | |||||
| .catch((error) => { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| }); | |||||
| } | |||||
| setTimeout(() => { | setTimeout(() => { | ||||
| checkAndAutoAssignNext(); | checkAndAutoAssignNext(); | ||||
| }, 1000); | }, 1000); | ||||
| @@ -2950,15 +2940,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||||
| return next; | return next; | ||||
| }); | }); | ||||
| await refreshWorkbenchAfterScanPick(); | await refreshWorkbenchAfterScanPick(); | ||||
| if (lot.pickOrderConsoCode) { | |||||
| void checkAndCompletePickOrderByConsoCode(lot.pickOrderConsoCode) | |||||
| .then((completionResponse) => { | |||||
| console.log(` Pick order completion check (workbench submit):`, completionResponse); | |||||
| }) | |||||
| .catch((error) => { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| }); | |||||
| } | |||||
| setTimeout(() => { | setTimeout(() => { | ||||
| checkAndAutoAssignNext(); | checkAndAutoAssignNext(); | ||||
| }, 1000); | }, 1000); | ||||
| @@ -3003,26 +2984,8 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||||
| // 注意:库存过账(hold->out)与 ledger 由后端 updateStatus 内部统一处理; | // 注意:库存过账(hold->out)与 ledger 由后端 updateStatus 内部统一处理; | ||||
| // 前端不再额外调用 updateInventoryLotLineQuantities(operation='pick'),避免 double posting。 | // 前端不再额外调用 updateInventoryLotLineQuantities(operation='pick'),避免 double posting。 | ||||
| // Check if pick order is completed when lot status becomes 'completed' | |||||
| if (newStatus === 'completed' && lot.pickOrderConsoCode) { | |||||
| console.log(` Lot ${lot.lotNo} completed, checking if pick order ${lot.pickOrderConsoCode} is complete...`); | |||||
| try { | |||||
| const completionResponse = await checkAndCompletePickOrderByConsoCode(lot.pickOrderConsoCode); | |||||
| console.log(` Pick order completion check result:`, completionResponse); | |||||
| if (completionResponse.code === "SUCCESS") { | |||||
| console.log(` Pick order ${lot.pickOrderConsoCode} completed successfully!`); | |||||
| } else if (completionResponse.message === "not completed") { | |||||
| console.log(`⏳ Pick order not completed yet, more lines remaining`); | |||||
| } else { | |||||
| console.error(` Error checking completion: ${completionResponse.message}`); | |||||
| } | |||||
| } catch (error) { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| } | |||||
| } | |||||
| // Workbench completion is handled in backend scan-pick flow. | |||||
| void fetchAllCombinedLotData(); | void fetchAllCombinedLotData(); | ||||
| console.log("Pick quantity submitted successfully!"); | console.log("Pick quantity submitted successfully!"); | ||||
| @@ -3049,7 +3012,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||||
| refreshWorkbenchAfterScanPick, | refreshWorkbenchAfterScanPick, | ||||
| combinedLotData, | combinedLotData, | ||||
| workbenchScanPickQtyFromLot, | workbenchScanPickQtyFromLot, | ||||
| checkAndCompletePickOrderByConsoCode, | |||||
| t, | t, | ||||
| ]); | ]); | ||||
| @@ -53,7 +53,6 @@ import GoodPickExecutionForm from "./GoodPickExecutionForm"; | |||||
| import FGPickOrderCard from "./FGPickOrderCard"; | import FGPickOrderCard from "./FGPickOrderCard"; | ||||
| import FinishedGoodFloorLanePanel from "./FinishedGoodFloorLanePanel"; | import FinishedGoodFloorLanePanel from "./FinishedGoodFloorLanePanel"; | ||||
| import FGPickOrderInfoCard from "./FGPickOrderInfoCard"; | import FGPickOrderInfoCard from "./FGPickOrderInfoCard"; | ||||
| import GoodPickExecutiondetail from "./GoodPickExecutiondetail"; | |||||
| interface Props { | interface Props { | ||||
| filterArgs: Record<string, any>; | filterArgs: Record<string, any>; | ||||
| onFgPickOrdersChange?: (fgPickOrders: FGPickOrderResponse[]) => void; | onFgPickOrdersChange?: (fgPickOrders: FGPickOrderResponse[]) => void; | ||||
| @@ -41,7 +41,6 @@ import { | |||||
| AutoAssignReleaseResponse, | AutoAssignReleaseResponse, | ||||
| checkPickOrderCompletion, | checkPickOrderCompletion, | ||||
| PickOrderCompletionResponse, | PickOrderCompletionResponse, | ||||
| checkAndCompletePickOrderByConsoCode, | |||||
| confirmLotSubstitution, | confirmLotSubstitution, | ||||
| updateStockOutLineStatusByQRCodeAndLotNo, // ✅ 添加 | updateStockOutLineStatusByQRCodeAndLotNo, // ✅ 添加 | ||||
| } from "@/app/api/pickOrder/actions"; | } from "@/app/api/pickOrder/actions"; | ||||
| @@ -3053,20 +3052,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||||
| return next; | return next; | ||||
| }); | }); | ||||
| await refreshWorkbenchAfterScanPick(); | await refreshWorkbenchAfterScanPick(); | ||||
| if (canonicalLotForSol.pickOrderConsoCode) { | |||||
| void checkAndCompletePickOrderByConsoCode( | |||||
| canonicalLotForSol.pickOrderConsoCode, | |||||
| ) | |||||
| .then((completionResponse) => { | |||||
| console.log( | |||||
| ` Pick order completion check (workbench just complete):`, | |||||
| completionResponse, | |||||
| ); | |||||
| }) | |||||
| .catch((error) => { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| }); | |||||
| } | |||||
| setTimeout(() => { | setTimeout(() => { | ||||
| checkAndAutoAssignNext(); | checkAndAutoAssignNext(); | ||||
| }, 1000); | }, 1000); | ||||
| @@ -3166,18 +3151,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||||
| return next; | return next; | ||||
| }); | }); | ||||
| await refreshWorkbenchAfterScanPick(); | await refreshWorkbenchAfterScanPick(); | ||||
| if (lot.pickOrderConsoCode) { | |||||
| void checkAndCompletePickOrderByConsoCode(lot.pickOrderConsoCode) | |||||
| .then((completionResponse) => { | |||||
| console.log( | |||||
| ` Pick order completion check (workbench submit):`, | |||||
| completionResponse, | |||||
| ); | |||||
| }) | |||||
| .catch((error) => { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| }); | |||||
| } | |||||
| setTimeout(() => { | setTimeout(() => { | ||||
| checkAndAutoAssignNext(); | checkAndAutoAssignNext(); | ||||
| }, 1000); | }, 1000); | ||||
| @@ -3219,38 +3192,7 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||||
| ); | ); | ||||
| } | } | ||||
| if (newStatus === "completed" && lot.pickOrderConsoCode) { | |||||
| console.log( | |||||
| ` Lot ${lot.lotNo} completed, checking if pick order ${lot.pickOrderConsoCode} is complete...`, | |||||
| ); | |||||
| try { | |||||
| const completionResponse = | |||||
| await checkAndCompletePickOrderByConsoCode( | |||||
| lot.pickOrderConsoCode, | |||||
| ); | |||||
| console.log( | |||||
| ` Pick order completion check result:`, | |||||
| completionResponse, | |||||
| ); | |||||
| if (completionResponse.code === "SUCCESS") { | |||||
| console.log( | |||||
| ` Pick order ${lot.pickOrderConsoCode} completed successfully!`, | |||||
| ); | |||||
| } else if (completionResponse.message === "not completed") { | |||||
| console.log( | |||||
| `⏳ Pick order not completed yet, more lines remaining`, | |||||
| ); | |||||
| } else { | |||||
| console.error( | |||||
| ` Error checking completion: ${completionResponse.message}`, | |||||
| ); | |||||
| } | |||||
| } catch (error) { | |||||
| console.error("Error checking pick order completion:", error); | |||||
| } | |||||
| } | |||||
| // Workbench completion is handled in backend scan-pick flow. | |||||
| void fetchJobOrderData(pickOrderIdForRefresh); | void fetchJobOrderData(pickOrderIdForRefresh); | ||||
| console.log("Pick quantity submitted successfully!"); | console.log("Pick quantity submitted successfully!"); | ||||
| @@ -3279,7 +3221,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||||
| refreshWorkbenchAfterScanPick, | refreshWorkbenchAfterScanPick, | ||||
| combinedLotData, | combinedLotData, | ||||
| workbenchScanPickQtyFromLot, | workbenchScanPickQtyFromLot, | ||||
| checkAndCompletePickOrderByConsoCode, | |||||
| pickQtyData, | pickQtyData, | ||||
| tPick, | tPick, | ||||
| workbenchStoreId, | workbenchStoreId, | ||||
| @@ -291,7 +291,10 @@ const ShopDetail: React.FC = () => { | |||||
| shopName: String(shopDetail!.name), | shopName: String(shopDetail!.name), | ||||
| shopCode: String(shopDetail!.code), | shopCode: String(shopDetail!.code), | ||||
| loadingSequence: addLoadingSequence, | loadingSequence: addLoadingSequence, | ||||
| districtReference: Number(lane.districtReference) || 0, | |||||
| districtReference: | |||||
| lane.districtReference != null && String(lane.districtReference).trim() !== "" | |||||
| ? String(lane.districtReference) | |||||
| : null, | |||||
| remark: remarkValue, | remark: remarkValue, | ||||
| }); | }); | ||||
| @@ -301,7 +301,10 @@ const TruckLaneDetail: React.FC = () => { | |||||
| truckLanceCode: String(row.truckLanceCode || ""), | truckLanceCode: String(row.truckLanceCode || ""), | ||||
| departureTime: departureTimeStr, | departureTime: departureTimeStr, | ||||
| loadingSequence: Number(row.loadingSequence) || 0, | loadingSequence: Number(row.loadingSequence) || 0, | ||||
| districtReference: Number(row.districtReference) || 0, | |||||
| districtReference: | |||||
| row.districtReference != null && String(row.districtReference).trim() !== "" | |||||
| ? String(row.districtReference) | |||||
| : null, | |||||
| storeId: storeIdStr, | storeId: storeIdStr, | ||||
| remark: remarkValue, | remark: remarkValue, | ||||
| }); | }); | ||||