|
|
|
@@ -26,7 +26,7 @@ import { |
|
|
|
updateStockOutLineStatus, |
|
|
|
createStockOutLine, |
|
|
|
recordPickExecutionIssue, |
|
|
|
fetchFGPickOrders, // ✅ Add this import |
|
|
|
fetchFGPickOrdersByUserId, // ✅ Add this import |
|
|
|
FGPickOrderResponse, |
|
|
|
autoAssignAndReleasePickOrder, |
|
|
|
AutoAssignReleaseResponse, |
|
|
|
@@ -49,7 +49,7 @@ import { SessionWithTokens } from "@/config/authConfig"; |
|
|
|
import { fetchStockInLineInfo } from "@/app/api/po/actions"; |
|
|
|
import GoodPickExecutionForm from "./GoodPickExecutionForm"; |
|
|
|
import FGPickOrderCard from "./FGPickOrderCard"; |
|
|
|
import FinishedGoodFloorLanePanel from "./FGPickOrderCard"; |
|
|
|
import FinishedGoodFloorLanePanel from "./FinishedGoodFloorLanePanel"; |
|
|
|
import FGPickOrderInfoCard from "./FGPickOrderInfoCard"; |
|
|
|
interface Props { |
|
|
|
filterArgs: Record<string, any>; |
|
|
|
@@ -357,28 +357,12 @@ const PickExecution: React.FC<Props> = ({ filterArgs, onFgPickOrdersChange }) => |
|
|
|
|
|
|
|
setFgPickOrdersLoading(true); |
|
|
|
try { |
|
|
|
// Get all pick order IDs from combinedLotData |
|
|
|
const pickOrderIds = Array.from(new Set(combinedLotData.map(lot => lot.pickOrderId))); |
|
|
|
// ✅ 简化:直接使用 userId 调用 API,不需要循环 |
|
|
|
const fgPickOrders = await fetchFGPickOrdersByUserId(currentUserId); |
|
|
|
|
|
|
|
if (pickOrderIds.length === 0) { |
|
|
|
setFgPickOrders([]); |
|
|
|
onFgPickOrdersChange?.([]); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Fetch FG pick orders for each pick order ID |
|
|
|
const fgPickOrdersPromises = pickOrderIds.map(pickOrderId => |
|
|
|
fetchFGPickOrders(pickOrderId) |
|
|
|
); |
|
|
|
|
|
|
|
const fgPickOrdersResults = await Promise.all(fgPickOrdersPromises); |
|
|
|
|
|
|
|
// Flatten the results (each fetchFGPickOrders returns an array) |
|
|
|
const allFgPickOrders = fgPickOrdersResults.flat(); |
|
|
|
|
|
|
|
setFgPickOrders(allFgPickOrders); |
|
|
|
onFgPickOrdersChange?.(allFgPickOrders); |
|
|
|
console.log("✅ Fetched FG pick orders:", allFgPickOrders); |
|
|
|
setFgPickOrders(fgPickOrders); |
|
|
|
onFgPickOrdersChange?.(fgPickOrders); |
|
|
|
console.log("✅ Fetched FG pick orders for user:", fgPickOrders); |
|
|
|
} catch (error) { |
|
|
|
console.error("❌ Error fetching FG pick orders:", error); |
|
|
|
setFgPickOrders([]); |
|
|
|
@@ -386,12 +370,14 @@ const PickExecution: React.FC<Props> = ({ filterArgs, onFgPickOrdersChange }) => |
|
|
|
} finally { |
|
|
|
setFgPickOrdersLoading(false); |
|
|
|
} |
|
|
|
}, [currentUserId, combinedLotData]); |
|
|
|
}, [currentUserId, onFgPickOrdersChange]); |
|
|
|
|
|
|
|
// ✅ 简化:移除复杂的 useEffect 依赖 |
|
|
|
useEffect(() => { |
|
|
|
if (combinedLotData.length > 0) { |
|
|
|
if (currentUserId) { |
|
|
|
fetchFgPickOrdersData(); |
|
|
|
} |
|
|
|
}, [combinedLotData, fetchFgPickOrdersData, onFgPickOrdersChange]); |
|
|
|
}, [currentUserId, fetchFgPickOrdersData]); |
|
|
|
|
|
|
|
// ✅ Handle QR code button click |
|
|
|
const handleQrCodeClick = (pickOrderId: number) => { |
|
|
|
@@ -963,69 +949,60 @@ const PickExecution: React.FC<Props> = ({ filterArgs, onFgPickOrdersChange }) => |
|
|
|
return sortedData.slice(startIndex, endIndex); |
|
|
|
}, [combinedLotData, paginationController]); |
|
|
|
|
|
|
|
return ( |
|
|
|
<FormProvider {...formProps}> |
|
|
|
{/* ✅ 条件渲染:没有活动订单时显示楼层选择面板 */} |
|
|
|
{!combinedDataLoading && fgPickOrders.length === 0 ? ( |
|
|
|
<FinishedGoodFloorLanePanel |
|
|
|
onPickOrderAssigned={() => { |
|
|
|
if (currentUserId) { |
|
|
|
fetchAllCombinedLotData(currentUserId); |
|
|
|
} |
|
|
|
}} |
|
|
|
/> |
|
|
|
) : ( |
|
|
|
// ✅ 有活动订单时,显示 FG 订单信息卡片 |
|
|
|
<Box> |
|
|
|
{fgPickOrdersLoading ? ( |
|
|
|
<Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}> |
|
|
|
<CircularProgress /> |
|
|
|
</Box> |
|
|
|
) : ( |
|
|
|
<Box> |
|
|
|
{fgPickOrders.length === 0 ? ( |
|
|
|
<Box sx={{ p: 3, textAlign: 'center' }}> |
|
|
|
<Typography variant="body2" color="text.secondary"> |
|
|
|
{t("No FG pick orders found")} |
|
|
|
</Typography> |
|
|
|
</Box> |
|
|
|
) : ( |
|
|
|
// ✅ 使用新的 FGPickOrderInfoCard 组件(类似 DoInfoCard 的格式) |
|
|
|
fgPickOrders.map((fgOrder) => ( |
|
|
|
<FGPickOrderInfoCard |
|
|
|
key={fgOrder.pickOrderId} |
|
|
|
fgOrder={fgOrder} |
|
|
|
/> |
|
|
|
)) |
|
|
|
)} |
|
|
|
</Box> |
|
|
|
)} |
|
|
|
</Box> |
|
|
|
)} |
|
|
|
|
|
|
|
{/* Modals */} |
|
|
|
<QrCodeModal |
|
|
|
open={qrModalOpen} |
|
|
|
onClose={() => setQrModalOpen(false)} |
|
|
|
lot={selectedLotForQr} |
|
|
|
onQrCodeSubmit={handleQrCodeSubmit} |
|
|
|
combinedLotData={combinedLotData} |
|
|
|
/> |
|
|
|
|
|
|
|
<GoodPickExecutionForm |
|
|
|
open={pickExecutionFormOpen} |
|
|
|
onClose={() => { |
|
|
|
setPickExecutionFormOpen(false); |
|
|
|
setSelectedLotForExecutionForm(null); |
|
|
|
}} |
|
|
|
onSubmit={handlePickExecutionFormSubmit} |
|
|
|
selectedLot={selectedLotForExecutionForm} |
|
|
|
selectedPickOrderLine={null} |
|
|
|
pickOrderId={selectedLotForExecutionForm?.pickOrderId} |
|
|
|
pickOrderCreateDate={null} |
|
|
|
// ... existing code ... |
|
|
|
|
|
|
|
return ( |
|
|
|
<FormProvider {...formProps}> |
|
|
|
{/* ✅ 修复:改进条件渲染逻辑 */} |
|
|
|
{combinedDataLoading || fgPickOrdersLoading ? ( |
|
|
|
// ✅ 数据加载中,显示加载指示器 |
|
|
|
<Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}> |
|
|
|
<CircularProgress /> |
|
|
|
</Box> |
|
|
|
) : fgPickOrders.length === 0 ? ( |
|
|
|
// ✅ 没有活动订单,显示楼层选择面板 |
|
|
|
<FinishedGoodFloorLanePanel |
|
|
|
onPickOrderAssigned={() => { |
|
|
|
if (currentUserId) { |
|
|
|
fetchAllCombinedLotData(currentUserId); |
|
|
|
} |
|
|
|
}} |
|
|
|
/> |
|
|
|
</FormProvider> |
|
|
|
); |
|
|
|
) : ( |
|
|
|
// ✅ 有活动订单,显示 FG 订单信息 |
|
|
|
<Box> |
|
|
|
{fgPickOrders.map((fgOrder) => ( |
|
|
|
<FGPickOrderInfoCard |
|
|
|
key={fgOrder.pickOrderId} |
|
|
|
fgOrder={fgOrder} |
|
|
|
/> |
|
|
|
))} |
|
|
|
</Box> |
|
|
|
)} |
|
|
|
|
|
|
|
{/* Modals */} |
|
|
|
<QrCodeModal |
|
|
|
open={qrModalOpen} |
|
|
|
onClose={() => setQrModalOpen(false)} |
|
|
|
lot={selectedLotForQr} |
|
|
|
onQrCodeSubmit={handleQrCodeSubmit} |
|
|
|
combinedLotData={combinedLotData} |
|
|
|
/> |
|
|
|
|
|
|
|
<GoodPickExecutionForm |
|
|
|
open={pickExecutionFormOpen} |
|
|
|
onClose={() => { |
|
|
|
setPickExecutionFormOpen(false); |
|
|
|
setSelectedLotForExecutionForm(null); |
|
|
|
}} |
|
|
|
onSubmit={handlePickExecutionFormSubmit} |
|
|
|
selectedLot={selectedLotForExecutionForm} |
|
|
|
selectedPickOrderLine={null} |
|
|
|
pickOrderId={selectedLotForExecutionForm?.pickOrderId} |
|
|
|
pickOrderCreateDate={null} |
|
|
|
/> |
|
|
|
</FormProvider> |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
export default PickExecution; |