first commit
This commit is contained in:
105
resources/js/hooks/useVendors.ts
Normal file
105
resources/js/hooks/useVendors.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* 廠商管理相關的業務邏輯 Hook
|
||||
*/
|
||||
|
||||
import { useState } from "react";
|
||||
import { toast } from "sonner";
|
||||
import type { Supplier, SupplyProduct } from "../types/vendor";
|
||||
import type { Product } from "../types/product";
|
||||
|
||||
export function useVendors(initialSuppliers: Supplier[], allProducts: Product[]) {
|
||||
const [suppliers, setSuppliers] = useState<Supplier[]>(initialSuppliers);
|
||||
|
||||
const addSupplier = (supplier: Omit<Supplier, "id">) => {
|
||||
const newSupplier: Supplier = {
|
||||
...supplier,
|
||||
id: `sup-${Date.now()}`,
|
||||
commonProducts: [],
|
||||
supplyProducts: [],
|
||||
};
|
||||
setSuppliers((prev) => [...prev, newSupplier]);
|
||||
toast.success("廠商已新增");
|
||||
};
|
||||
|
||||
const updateSupplier = (id: string, updatedSupplier: Omit<Supplier, "id">) => {
|
||||
setSuppliers((prev) =>
|
||||
prev.map((s) => (s.id === id ? { ...s, ...updatedSupplier } : s))
|
||||
);
|
||||
toast.success("廠商資料已更新");
|
||||
};
|
||||
|
||||
const deleteSupplier = (id: string) => {
|
||||
setSuppliers((prev) => prev.filter((s) => s.id !== id));
|
||||
toast.success("廠商已刪除");
|
||||
};
|
||||
|
||||
// 新增供貨商品
|
||||
const addSupplyProduct = (supplierId: string, productId: string, lastPrice?: number) => {
|
||||
const product = allProducts.find(p => p.id === productId);
|
||||
if (!product) return;
|
||||
|
||||
setSuppliers((prev) =>
|
||||
prev.map((s) => {
|
||||
if (s.id === supplierId) {
|
||||
const newSupplyProduct: SupplyProduct = {
|
||||
id: `sp-${Date.now()}`,
|
||||
productId: product.id,
|
||||
productName: product.name,
|
||||
unit: product.unit,
|
||||
lastPrice,
|
||||
};
|
||||
return {
|
||||
...s,
|
||||
supplyProducts: [...s.supplyProducts, newSupplyProduct],
|
||||
};
|
||||
}
|
||||
return s;
|
||||
})
|
||||
);
|
||||
toast.success("供貨商品已新增");
|
||||
};
|
||||
|
||||
// 更新供貨商品
|
||||
const updateSupplyProduct = (supplierId: string, productId: string, lastPrice?: number) => {
|
||||
setSuppliers((prev) =>
|
||||
prev.map((s) => {
|
||||
if (s.id === supplierId) {
|
||||
return {
|
||||
...s,
|
||||
supplyProducts: s.supplyProducts.map((sp) =>
|
||||
sp.productId === productId ? { ...sp, lastPrice } : sp
|
||||
),
|
||||
};
|
||||
}
|
||||
return s;
|
||||
})
|
||||
);
|
||||
toast.success("供貨商品已更新");
|
||||
};
|
||||
|
||||
// 移除供貨商品
|
||||
const removeSupplyProduct = (supplierId: string, productId: string) => {
|
||||
setSuppliers((prev) =>
|
||||
prev.map((s) => {
|
||||
if (s.id === supplierId) {
|
||||
return {
|
||||
...s,
|
||||
supplyProducts: s.supplyProducts.filter((sp) => sp.productId !== productId),
|
||||
};
|
||||
}
|
||||
return s;
|
||||
})
|
||||
);
|
||||
toast.success("供貨商品已移除");
|
||||
};
|
||||
|
||||
return {
|
||||
suppliers,
|
||||
addSupplier,
|
||||
updateSupplier,
|
||||
deleteSupplier,
|
||||
addSupplyProduct,
|
||||
updateSupplyProduct,
|
||||
removeSupplyProduct,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user