| @@ -25,7 +25,7 @@ export interface ShopAndTruck{ | |||
| truckLanceCode: String; | |||
| DepartureTime: String; | |||
| LoadingSequence?: number | null; | |||
| districtReference: Number; | |||
| districtReference: string | null; | |||
| Store_id: Number; | |||
| remark?: String | null; | |||
| truckId?: number; | |||
| @@ -43,7 +43,7 @@ export interface Truck{ | |||
| truckLanceCode: String; | |||
| departureTime: String | number[]; | |||
| loadingSequence: number; | |||
| districtReference: Number; | |||
| districtReference: string | null; | |||
| storeId: Number | String; | |||
| remark?: String | null; | |||
| shopName?: String | null; | |||
| @@ -55,7 +55,7 @@ export interface SaveTruckLane { | |||
| truckLanceCode: string; | |||
| departureTime: string; | |||
| loadingSequence: number; | |||
| districtReference: number; | |||
| districtReference: string | null; | |||
| storeId: string; | |||
| remark?: string | null; | |||
| } | |||
| @@ -82,7 +82,7 @@ export interface SaveTruckRequest { | |||
| shopName: string; | |||
| shopCode: string; | |||
| loadingSequence: number; | |||
| districtReference?: number | null; | |||
| districtReference?: string | null; | |||
| remark?: string | null; | |||
| } | |||
| @@ -91,7 +91,7 @@ export interface CreateTruckWithoutShopRequest { | |||
| truckLanceCode: string; | |||
| departureTime: string; | |||
| loadingSequence?: number; | |||
| districtReference?: number | null; | |||
| districtReference?: string | null; | |||
| remark?: string | null; | |||
| } | |||
| @@ -32,7 +32,6 @@ import { | |||
| AutoAssignReleaseResponse, | |||
| checkPickOrderCompletion, | |||
| PickOrderCompletionResponse, | |||
| checkAndCompletePickOrderByConsoCode, | |||
| fetchDoPickOrderDetail, | |||
| DoPickOrderDetail, | |||
| } 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(); | |||
| console.log("Pick quantity submitted successfully!"); | |||
| @@ -38,7 +38,6 @@ import { | |||
| checkPickOrderCompletion, | |||
| fetchAllPickOrderLotsHierarchicalWorkbench, | |||
| PickOrderCompletionResponse, | |||
| checkAndCompletePickOrderByConsoCode, | |||
| updateSuggestedLotLineId, | |||
| updateStockOutLineStatusByQRCodeAndLotNo, | |||
| confirmLotSubstitution, | |||
| @@ -2839,15 +2838,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||
| return next; | |||
| }); | |||
| 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(() => { | |||
| checkAndAutoAssignNext(); | |||
| }, 1000); | |||
| @@ -2950,15 +2940,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||
| return next; | |||
| }); | |||
| 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(() => { | |||
| checkAndAutoAssignNext(); | |||
| }, 1000); | |||
| @@ -3003,26 +2984,8 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||
| // 注意:库存过账(hold->out)与 ledger 由后端 updateStatus 内部统一处理; | |||
| // 前端不再额外调用 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(); | |||
| console.log("Pick quantity submitted successfully!"); | |||
| @@ -3049,7 +3012,6 @@ const handleSubmitPickQtyWithQty = useCallback(async (lot: any, submitQty: numbe | |||
| refreshWorkbenchAfterScanPick, | |||
| combinedLotData, | |||
| workbenchScanPickQtyFromLot, | |||
| checkAndCompletePickOrderByConsoCode, | |||
| t, | |||
| ]); | |||
| @@ -53,7 +53,6 @@ import GoodPickExecutionForm from "./GoodPickExecutionForm"; | |||
| import FGPickOrderCard from "./FGPickOrderCard"; | |||
| import FinishedGoodFloorLanePanel from "./FinishedGoodFloorLanePanel"; | |||
| import FGPickOrderInfoCard from "./FGPickOrderInfoCard"; | |||
| import GoodPickExecutiondetail from "./GoodPickExecutiondetail"; | |||
| interface Props { | |||
| filterArgs: Record<string, any>; | |||
| onFgPickOrdersChange?: (fgPickOrders: FGPickOrderResponse[]) => void; | |||
| @@ -41,7 +41,6 @@ import { | |||
| AutoAssignReleaseResponse, | |||
| checkPickOrderCompletion, | |||
| PickOrderCompletionResponse, | |||
| checkAndCompletePickOrderByConsoCode, | |||
| confirmLotSubstitution, | |||
| updateStockOutLineStatusByQRCodeAndLotNo, // ✅ 添加 | |||
| } from "@/app/api/pickOrder/actions"; | |||
| @@ -3053,20 +3052,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||
| return next; | |||
| }); | |||
| 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(() => { | |||
| checkAndAutoAssignNext(); | |||
| }, 1000); | |||
| @@ -3166,18 +3151,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||
| return next; | |||
| }); | |||
| 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(() => { | |||
| checkAndAutoAssignNext(); | |||
| }, 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); | |||
| console.log("Pick quantity submitted successfully!"); | |||
| @@ -3279,7 +3221,6 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs, onBackToList }) => { | |||
| refreshWorkbenchAfterScanPick, | |||
| combinedLotData, | |||
| workbenchScanPickQtyFromLot, | |||
| checkAndCompletePickOrderByConsoCode, | |||
| pickQtyData, | |||
| tPick, | |||
| workbenchStoreId, | |||
| @@ -291,7 +291,10 @@ const ShopDetail: React.FC = () => { | |||
| shopName: String(shopDetail!.name), | |||
| shopCode: String(shopDetail!.code), | |||
| loadingSequence: addLoadingSequence, | |||
| districtReference: Number(lane.districtReference) || 0, | |||
| districtReference: | |||
| lane.districtReference != null && String(lane.districtReference).trim() !== "" | |||
| ? String(lane.districtReference) | |||
| : null, | |||
| remark: remarkValue, | |||
| }); | |||
| @@ -301,7 +301,10 @@ const TruckLaneDetail: React.FC = () => { | |||
| truckLanceCode: String(row.truckLanceCode || ""), | |||
| departureTime: departureTimeStr, | |||
| loadingSequence: Number(row.loadingSequence) || 0, | |||
| districtReference: Number(row.districtReference) || 0, | |||
| districtReference: | |||
| row.districtReference != null && String(row.districtReference).trim() !== "" | |||
| ? String(row.districtReference) | |||
| : null, | |||
| storeId: storeIdStr, | |||
| remark: remarkValue, | |||
| }); | |||