Browse Source

Merge branch 'production' of http://svn.2fi-solutions.com:8300/derek/FPSMS-frontend into production

production
CANCERYS\kw093 6 days ago
parent
commit
819087108b
7 changed files with 17 additions and 129 deletions
  1. +5
    -5
      src/app/api/shop/actions.ts
  2. +1
    -21
      src/components/DoWorkbench/WorkbenchGoodPickExecution.tsx
  3. +2
    -40
      src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx
  4. +0
    -1
      src/components/FinishedGoodSearch/GoodPickExecution.tsx
  5. +1
    -60
      src/components/JoWorkbench/newJobPickExecution.tsx
  6. +4
    -1
      src/components/Shop/ShopDetail.tsx
  7. +4
    -1
      src/components/Shop/TruckLaneDetail.tsx

+ 5
- 5
src/app/api/shop/actions.ts View File

@@ -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;
} }




+ 1
- 21
src/components/DoWorkbench/WorkbenchGoodPickExecution.tsx View File

@@ -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!");


+ 2
- 40
src/components/DoWorkbench/WorkbenchGoodPickExecutionDetail.tsx View File

@@ -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,
]); ]);




+ 0
- 1
src/components/FinishedGoodSearch/GoodPickExecution.tsx View File

@@ -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;


+ 1
- 60
src/components/JoWorkbench/newJobPickExecution.tsx View File

@@ -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,


+ 4
- 1
src/components/Shop/ShopDetail.tsx View File

@@ -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,
}); });


+ 4
- 1
src/components/Shop/TruckLaneDetail.tsx View File

@@ -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,
}); });


Loading…
Cancel
Save