summaryrefslogtreecommitdiff
path: root/lib/bidding/selection/bidding-item-table.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bidding/selection/bidding-item-table.tsx')
-rw-r--r--lib/bidding/selection/bidding-item-table.tsx71
1 files changed, 42 insertions, 29 deletions
diff --git a/lib/bidding/selection/bidding-item-table.tsx b/lib/bidding/selection/bidding-item-table.tsx
index c101f7e7..aa2b34ec 100644
--- a/lib/bidding/selection/bidding-item-table.tsx
+++ b/lib/bidding/selection/bidding-item-table.tsx
@@ -2,10 +2,7 @@
import * as React from 'react'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
-import {
- getPRItemsForBidding,
- getVendorPricesForBidding
-} from '@/lib/bidding/detail/service'
+import { getBiddingSelectionItemsAndPrices } from '@/lib/bidding/service'
import { formatNumber } from '@/lib/utils'
import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area'
@@ -21,26 +18,55 @@ export function BiddingItemTable({ biddingId }: BiddingItemTableProps) {
const [loading, setLoading] = React.useState(true)
React.useEffect(() => {
+ let isMounted = true
+
const loadData = async () => {
try {
setLoading(true)
- const [prItems, vendorPrices] = await Promise.all([
- getPRItemsForBidding(biddingId),
- getVendorPricesForBidding(biddingId)
- ])
- console.log('prItems', prItems)
- console.log('vendorPrices', vendorPrices)
- setData({ prItems, vendorPrices })
+ const { prItems, vendorPrices } = await getBiddingSelectionItemsAndPrices(biddingId)
+
+ if (isMounted) {
+ console.log('prItems', prItems)
+ console.log('vendorPrices', vendorPrices)
+ setData({ prItems, vendorPrices })
+ }
} catch (error) {
console.error('Failed to load bidding items:', error)
} finally {
- setLoading(false)
+ if (isMounted) {
+ setLoading(false)
+ }
}
}
loadData()
+
+ return () => {
+ isMounted = false
+ }
}, [biddingId])
+ // Memoize calculations
+ const totals = React.useMemo(() => {
+ const { prItems } = data
+ return {
+ quantity: prItems.reduce((sum, item) => sum + Number(item.quantity || 0), 0),
+ weight: prItems.reduce((sum, item) => sum + Number(item.totalWeight || 0), 0),
+ targetAmount: prItems.reduce((sum, item) => sum + Number(item.targetAmount || 0), 0)
+ }
+ }, [data.prItems])
+
+ const vendorTotals = React.useMemo(() => {
+ const { vendorPrices } = data
+ return vendorPrices.map(vendor => {
+ const total = vendor.itemPrices.reduce((sum: number, item: any) => sum + Number(item.amount || 0), 0)
+ return {
+ companyId: vendor.companyId,
+ totalAmount: total
+ }
+ })
+ }, [data.vendorPrices])
+
if (loading) {
return (
<Card>
@@ -58,19 +84,6 @@ export function BiddingItemTable({ biddingId }: BiddingItemTableProps) {
const { prItems, vendorPrices } = data
- // Calculate Totals
- const totalQuantity = prItems.reduce((sum, item) => sum + Number(item.quantity || 0), 0)
- const totalWeight = prItems.reduce((sum, item) => sum + Number(item.totalWeight || 0), 0)
- const totalTargetAmount = prItems.reduce((sum, item) => sum + Number(item.targetAmount || 0), 0)
-
- // Calculate Vendor Totals
- const vendorTotals = vendorPrices.map(vendor => {
- const total = vendor.itemPrices.reduce((sum: number, item: any) => sum + Number(item.amount || 0), 0)
- return {
- companyId: vendor.companyId,
- totalAmount: total
- }
- })
return (
<Card>
@@ -118,17 +131,17 @@ export function BiddingItemTable({ biddingId }: BiddingItemTableProps) {
{/* Summary Row */}
<tr className="border-b transition-colors hover:bg-muted/50 bg-muted/30 font-semibold">
<td className="p-4 align-middle text-center border-r" colSpan={4}>합계</td>
- <td className="p-4 align-middle text-right border-r">{formatNumber(totalQuantity)}</td>
+ <td className="p-4 align-middle text-right border-r">{formatNumber(totals.quantity)}</td>
<td className="p-4 align-middle text-center border-r">-</td>
- <td className="p-4 align-middle text-right border-r">{formatNumber(totalWeight)}</td>
+ <td className="p-4 align-middle text-right border-r">{formatNumber(totals.weight)}</td>
<td className="p-4 align-middle text-center border-r">-</td>
<td className="p-4 align-middle text-center border-r">-</td>
- <td className="p-4 align-middle text-right border-r">{formatNumber(totalTargetAmount)}</td>
+ <td className="p-4 align-middle text-right border-r">{formatNumber(totals.targetAmount)}</td>
<td className="p-4 align-middle text-center border-r">KRW</td>
{vendorPrices.map((vendor) => {
const vTotal = vendorTotals.find(t => t.companyId === vendor.companyId)?.totalAmount || 0
- const ratio = totalTargetAmount > 0 ? (vTotal / totalTargetAmount) * 100 : 0
+ const ratio = totals.targetAmount > 0 ? (vTotal / totals.targetAmount) * 100 : 0
return (
<React.Fragment key={vendor.companyId}>
<td className="p-4 align-middle text-center border-r">-</td>