fix: 创建组合时正确传递持仓币种

1. 新增 inferCurrencyFromCode 函数,根据股票代码推断币种
   - .US/.NYSE/.NASDAQ → USD
   - .HK/.HKEX → HKD
   - .SZ/.SH 或 6 位数字 → CNY
   - 加密货币 → USD

2. 搜索股票时映射 priceCurrency 字段
3. 选择股票时保存 currency 到表单
4. 提交时同时传递 assetType 字段
This commit is contained in:
claw_bot 2026-03-25 05:54:15 +00:00
parent eefde6da0e
commit 1702b88ebf

View File

@ -187,6 +187,7 @@ interface SearchResult {
name?: string; name?: string;
exchange?: string; exchange?: string;
assetType?: string; assetType?: string;
currency?: string;
stockIndex: number; stockIndex: number;
} }
@ -230,7 +231,11 @@ const searchStock = async (keyword: string, stockIndex: number): Promise<void> =
try { try {
const res = await api.ticker.search(keyword); const res = await api.ticker.search(keyword);
if (res.code === 200) { if (res.code === 200) {
searchResults.value = res.data.map((item: any) => ({ ...item, stockIndex })); searchResults.value = res.data.map((item: any) => ({
...item,
stockIndex,
currency: item.priceCurrency || item.currency //
}));
} }
} catch { } catch {
searchResults.value = []; searchResults.value = [];
@ -244,6 +249,7 @@ const selectStock = (result: SearchResult): void => {
if (stock) { if (stock) {
stock.name = result.ticker; stock.name = result.ticker;
stock.assetType = result.assetType; stock.assetType = result.assetType;
stock.currency = result.currency; //
} }
searchResults.value = []; searchResults.value = [];
activeSearchIndex.value = -1; activeSearchIndex.value = -1;
@ -353,6 +359,30 @@ const submitForm = async (): Promise<void> => {
} }
} }
//
const inferCurrencyFromCode = (code: string): string => {
if (!code) return selectedCurrency;
const upperCode = code.toUpperCase();
//
if (upperCode.endsWith('.US') || upperCode.endsWith('.NYSE') || upperCode.endsWith('.NASDAQ')) {
return 'USD';
}
//
if (upperCode.endsWith('.HK') || upperCode.endsWith('.HKEX')) {
return 'HKD';
}
// A
if (upperCode.endsWith('.SZ') || upperCode.endsWith('.SH') || /^[0-9]{6}$/.test(upperCode)) {
return 'CNY';
}
// USD
if (upperCode.includes('BTC') || upperCode.includes('ETH') || upperCode.includes('USDT')) {
return 'USD';
}
// 使
return selectedCurrency;
};
const selectedCurrency = currencyList.value[currencyIndex.value].code; const selectedCurrency = currencyList.value[currencyIndex.value].code;
const requestData = { const requestData = {
name: form.value.name, name: form.value.name,
@ -364,7 +394,8 @@ const submitForm = async (): Promise<void> => {
price: parseFloat(stock.price) || 0, price: parseFloat(stock.price) || 0,
amount: parseFloat(stock.amount) || 0, amount: parseFloat(stock.amount) || 0,
date: stock.date, date: stock.date,
currency: selectedCurrency currency: stock.currency || inferCurrencyFromCode(stock.name),
assetType: stock.assetType || 'Stock'
})) }))
}; };