diff --git a/frontend/src/pages/News.jsx b/frontend/src/pages/News.jsx
index 981c766..ce54341 100644
--- a/frontend/src/pages/News.jsx
+++ b/frontend/src/pages/News.jsx
@@ -481,55 +481,94 @@ export default function News() {
) : (
- {/* 成交行情 - 统计区域 */}
+ {/* 成交行情 - 价格统计表格 */}
{activeTab === 'deal' && (() => {
- // 统计各维度
- const stats = { version: {}, packaging: {}, category: {}, platform: {}, date: {}, totalCount: infoList.length, totalAmount: 0 }
- infoList.forEach(item => {
- const content = item.content || ''
- // 版本
+ const [selectedVersion, setSelectedVersion] = useState('龙钞')
+ const [selectedDate, setSelectedDate] = useState('')
+
+ const versions = ['龙钞', '马钞', '蛇钞', '其他']
+ const packagings = ['标百', '标十', '单张']
+ const categories = ['带4号', '带7号', '永恒号', '钻石号', '如意号', '朦胧号', '天马号', '金山号', '金马号']
+
+ const filteredData = infoList.filter(item => {
const serial = (item.title || '').split('-')[0] || ''
let version = '其他'
if (serial.startsWith('J0')) version = '龙钞'
else if (serial.startsWith('J1')) version = '马钞'
else if (serial.startsWith('J3')) version = '蛇钞'
- stats.version[version] = (stats.version[version] || 0) + 1
- // 包装
- const pkg = content.match(/包装:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || item.packaging || '-'
- stats.packaging[pkg] = (stats.packaging[pkg] || 0) + 1
- // 分类
- const cat = content.match(/分类:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || item.category || '-'
- stats.category[cat] = (stats.category[cat] || 0) + 1
- // 平台
- const plat = content.match(/平台:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || '-'
- stats.platform[plat] = (stats.platform[plat] || 0) + 1
- // 日期
- const date = content.match(/日期:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || item.deal_date || '-'
- stats.date[date] = (stats.date[date] || 0) + 1
- // 总金额
- stats.totalAmount += item.deal_price || 0
+ if (version !== selectedVersion) return false
+ if (selectedDate) {
+ const dealDate = item.deal_date || ''
+ if (!dealDate.startsWith(selectedDate)) return false
+ }
+ return true
})
- const renderStat = (title, data) => (
-
-
{title}
-
- {Object.entries(data).sort((a,b) => b[1] - a[1]).map(([k, v]) => (
- {k} ({v})
- ))}
-
-
- )
+ const calcAvg = (pkg, cat) => {
+ const items = filteredData.filter(item => {
+ const content = item.content || ''
+ const p = content.match(/包装:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || item.packaging || ''
+ const c = content.match(/分类:\s*(.+?)(?:\n|$)/)?.[1]?.trim() || item.category || ''
+ return p === pkg && c === cat
+ })
+ if (items.length === 0) return null
+ const sum = items.reduce((a, b) => a + (b.deal_price || 0), 0)
+ return { avg: Math.round(sum / items.length), count: items.length, items }
+ }
return (
-
📊 成交行情统计
-
总成交 {stats.totalCount} 笔,总金额 ¥{stats.totalAmount.toLocaleString()}
- {renderStat('版本分布', stats.version)}
- {renderStat('包装分布', stats.packaging)}
- {renderStat('号码分类', stats.category)}
- {renderStat('成交平台', stats.platform)}
- {renderStat('成交日期', stats.date)}
+
+
+ {versions.map(v => (
+
+ ))}
+
+
setSelectedDate(e.target.value)}
+ style={{ padding: '8px 12px', borderRadius: '8px', border: '1px solid rgba(255,255,255,0.2)',
+ background: 'rgba(255,255,255,0.05)', color: '#fff', fontSize: '14px' }} />
+
+
+
+
+
+
+ |
+ {packagings.map(p => (
+ {p} |
+ ))}
+
+
+
+ {categories.map(cat => {
+ const rowData = packagings.map(pkg => calcAvg(pkg, cat))
+ const hasData = rowData.some(d => d !== null)
+ if (!hasData) return null
+ return (
+
+ | {cat} |
+ {rowData.map((d, i) => (
+
+ {d ? (
+ alert(`${selectedVersion} ${cat} ${packagings[i]} 平均价¥${d.avg.toLocaleString()}, 共${d.count}笔`)}>
+ ¥{d.avg.toLocaleString()}
+ ({d.count})
+
+ ) : -}
+ |
+ ))}
+
+ )
+ })}
+
+
+
)
})()}