/** * 撥補單對話框元件 * 重構後:加入驗證邏輯模組化 */ import { useState, useEffect } from "react"; import { getCurrentDateTime } from "@/utils/format"; import axios from "axios"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/Components/ui/dialog"; import { Label } from "@/Components/ui/label"; import { Input } from "@/Components/ui/input"; import { Button } from "@/Components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/Components/ui/select"; import { Textarea } from "@/Components/ui/textarea"; import { toast } from "sonner"; import { Warehouse, TransferOrder, TransferOrderStatus } from "@/types/warehouse"; import { validateTransferOrder, validateTransferQuantity } from "@/utils/validation"; export type { TransferOrder }; interface TransferOrderDialogProps { open: boolean; onOpenChange: (open: boolean) => void; order: TransferOrder | null; warehouses: Warehouse[]; // inventories: WarehouseInventory[]; // Removed as we fetch from API onSave: (order: Omit) => void; } interface AvailableProduct { productId: string; productName: string; batchNumber: string; availableQty: number; unit: string; } export default function TransferOrderDialog({ open, onOpenChange, order, warehouses, // inventories, onSave, }: TransferOrderDialogProps) { const [formData, setFormData] = useState({ sourceWarehouseId: "", targetWarehouseId: "", productId: "", productName: "", batchNumber: "", quantity: 0, transferDate: getCurrentDateTime(), status: "待處理" as TransferOrderStatus, notes: "", }); const [availableProducts, setAvailableProducts] = useState([]); // 當對話框開啟或訂單變更時,重置表單 useEffect(() => { if (order) { setFormData({ sourceWarehouseId: order.sourceWarehouseId, targetWarehouseId: order.targetWarehouseId, productId: order.productId, productName: order.productName, batchNumber: order.batchNumber, quantity: order.quantity, transferDate: order.transferDate, status: order.status, notes: order.notes || "", }); } else { setFormData({ sourceWarehouseId: "", targetWarehouseId: "", productId: "", productName: "", batchNumber: "", quantity: 0, transferDate: getCurrentDateTime(), status: "待處理", notes: "", }); } }, [order, open]); // 當來源倉庫變更時,從 API 更新可用商品列表 useEffect(() => { if (formData.sourceWarehouseId) { axios.get(route('api.warehouses.inventories', formData.sourceWarehouseId)) .then(response => { setAvailableProducts(response.data); }) .catch(error => { console.error("Failed to fetch inventories:", error); toast.error("無法取得倉庫庫存資訊"); setAvailableProducts([]); }); } else { setAvailableProducts([]); } }, [formData.sourceWarehouseId]); const handleSubmit = () => { // 基本驗證 const validation = validateTransferOrder(formData); if (!validation.isValid) { toast.error(validation.error); return; } // 檢查可用數量 const selectedProduct = availableProducts.find( (p) => p.productId === formData.productId && p.batchNumber === formData.batchNumber ); if (selectedProduct) { const quantityValidation = validateTransferQuantity( formData.quantity, selectedProduct.availableQty ); if (!quantityValidation.isValid) { toast.error(quantityValidation.error); return; } } const sourceWarehouse = warehouses.find((w) => w.id === formData.sourceWarehouseId); const targetWarehouse = warehouses.find((w) => w.id === formData.targetWarehouseId); onSave({ sourceWarehouseId: formData.sourceWarehouseId, sourceWarehouseName: sourceWarehouse?.name || "", targetWarehouseId: formData.targetWarehouseId, targetWarehouseName: targetWarehouse?.name || "", productId: formData.productId, productName: formData.productName, batchNumber: formData.batchNumber, quantity: formData.quantity, transferDate: formData.transferDate, status: formData.status, notes: formData.notes, }); }; const handleProductChange = (productKey: string) => { const [productId, batchNumber] = productKey.split("|||"); const product = availableProducts.find( (p) => p.productId === productId && p.batchNumber === batchNumber ); if (product) { setFormData({ ...formData, productId: product.productId, productName: product.productName, batchNumber: product.batchNumber, quantity: 0, }); } }; const selectedProduct = availableProducts.find( (p) => p.productId === formData.productId && p.batchNumber === formData.batchNumber ); return ( {order ? "編輯撥補單" : "新增撥補單"} 填寫撥補單資訊
{/* 來源倉庫和目標倉庫 */}
{/* 商品選擇 */}
{/* 數量和日期 */}
setFormData({ ...formData, quantity: Number(e.target.value) }) } />
{selectedProduct && (

可用庫存: {selectedProduct.availableQty} {selectedProduct.unit}

)}
setFormData({ ...formData, transferDate: e.target.value }) } />
{/* 狀態(僅編輯時顯示) */} {order && (
)} {/* 備註 */}