update pay ui
This commit is contained in:
@@ -7,6 +7,18 @@ import MiniTimelineChart from './MiniTimelineChart';
|
|||||||
import { fetchBatchKlineData, klineDataCache, getCacheKey } from '../utils/klineDataCache';
|
import { fetchBatchKlineData, klineDataCache, getCacheKey } from '../utils/klineDataCache';
|
||||||
import { logger } from '../../../../../utils/logger';
|
import { logger } from '../../../../../utils/logger';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准化股票代码为6位格式
|
||||||
|
* @param {string} code - 股票代码
|
||||||
|
* @returns {string} 6位标准化代码
|
||||||
|
*/
|
||||||
|
const normalizeStockCode = (code) => {
|
||||||
|
if (!code) return '';
|
||||||
|
const s = String(code).trim();
|
||||||
|
const m = s.match(/(\d{6})/);
|
||||||
|
return m ? m[1] : s;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 股票列表表格组件
|
* 股票列表表格组件
|
||||||
* 显示事件相关股票列表,包括分时图、涨跌幅、自选股操作等
|
* 显示事件相关股票列表,包括分时图、涨跌幅、自选股操作等
|
||||||
@@ -260,7 +272,9 @@ const StockTable = ({
|
|||||||
width: 150,
|
width: 150,
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
render: (_, record) => {
|
render: (_, record) => {
|
||||||
const isInWatchlist = watchlistSet.has(record.stock_code);
|
// 标准化代码后再比较,确保 600000.SH 和 600000 能匹配
|
||||||
|
const normalizedCode = normalizeStockCode(record.stock_code);
|
||||||
|
const isInWatchlist = watchlistSet.has(normalizedCode);
|
||||||
return (
|
return (
|
||||||
<div style={{ display: 'flex', gap: '4px' }}>
|
<div style={{ display: 'flex', gap: '4px' }}>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -5,6 +5,27 @@ import { loadWatchlist, toggleWatchlist as toggleWatchlistAction } from '../../.
|
|||||||
import { message } from 'antd';
|
import { message } from 'antd';
|
||||||
import { logger } from '../../../../../utils/logger';
|
import { logger } from '../../../../../utils/logger';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准化股票代码为6位格式
|
||||||
|
* 支持: 600000, 600000.SH, 600000.SZ, SH600000 等格式
|
||||||
|
* @param {string} code - 股票代码
|
||||||
|
* @returns {string} 6位标准化代码
|
||||||
|
*/
|
||||||
|
const normalizeStockCode = (code) => {
|
||||||
|
if (!code) return '';
|
||||||
|
const s = String(code).trim().toUpperCase();
|
||||||
|
// 匹配6位数字(可能带 .SH/.SZ 后缀)
|
||||||
|
const m1 = s.match(/^(\d{6})(?:\.(?:SH|SZ))?$/i);
|
||||||
|
if (m1) return m1[1];
|
||||||
|
// 匹配 SH/SZ 前缀格式
|
||||||
|
const m2 = s.match(/^(?:SH|SZ)(\d{6})$/i);
|
||||||
|
if (m2) return m2[1];
|
||||||
|
// 尝试提取任意6位数字
|
||||||
|
const m3 = s.match(/(\d{6})/);
|
||||||
|
if (m3) return m3[1];
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自选股管理 Hook
|
* 自选股管理 Hook
|
||||||
* 封装自选股的加载、添加、移除逻辑
|
* 封装自选股的加载、添加、移除逻辑
|
||||||
@@ -19,9 +40,9 @@ export const useWatchlist = (shouldLoad = true) => {
|
|||||||
const watchlistArray = useSelector(state => state.stock.watchlist, shallowEqual);
|
const watchlistArray = useSelector(state => state.stock.watchlist, shallowEqual);
|
||||||
const loading = useSelector(state => state.stock.loading.watchlist);
|
const loading = useSelector(state => state.stock.loading.watchlist);
|
||||||
|
|
||||||
// 转换为 Set 方便快速查询
|
// 转换为 Set 方便快速查询(标准化为6位代码)
|
||||||
const watchlistSet = useMemo(() => {
|
const watchlistSet = useMemo(() => {
|
||||||
return new Set(watchlistArray);
|
return new Set(watchlistArray.map(normalizeStockCode));
|
||||||
}, [watchlistArray]);
|
}, [watchlistArray]);
|
||||||
|
|
||||||
// 初始化时加载自选股列表(只在 shouldLoad 为 true 时)
|
// 初始化时加载自选股列表(只在 shouldLoad 为 true 时)
|
||||||
@@ -33,32 +54,36 @@ export const useWatchlist = (shouldLoad = true) => {
|
|||||||
}, [dispatch, shouldLoad]);
|
}, [dispatch, shouldLoad]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查股票是否在自选股中
|
* 检查股票是否在自选股中(支持带后缀的代码格式)
|
||||||
* @param {string} stockCode - 股票代码
|
* @param {string} stockCode - 股票代码(支持 600000, 600000.SH 等格式)
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
const isInWatchlist = useCallback((stockCode) => {
|
const isInWatchlist = useCallback((stockCode) => {
|
||||||
return watchlistSet.has(stockCode);
|
const normalized = normalizeStockCode(stockCode);
|
||||||
|
return watchlistSet.has(normalized);
|
||||||
}, [watchlistSet]);
|
}, [watchlistSet]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 切换自选股状态
|
* 切换自选股状态
|
||||||
* @param {string} stockCode - 股票代码
|
* @param {string} stockCode - 股票代码(支持带后缀格式,会自动标准化)
|
||||||
* @param {string} stockName - 股票名称
|
* @param {string} stockName - 股票名称
|
||||||
* @returns {Promise<boolean>} 操作是否成功
|
* @returns {Promise<boolean>} 操作是否成功
|
||||||
*/
|
*/
|
||||||
const toggleWatchlist = useCallback(async (stockCode, stockName) => {
|
const toggleWatchlist = useCallback(async (stockCode, stockName) => {
|
||||||
const wasInWatchlist = watchlistSet.has(stockCode);
|
const normalized = normalizeStockCode(stockCode);
|
||||||
|
const wasInWatchlist = watchlistSet.has(normalized);
|
||||||
|
|
||||||
logger.debug('useWatchlist', '切换自选股状态', {
|
logger.debug('useWatchlist', '切换自选股状态', {
|
||||||
stockCode,
|
stockCode,
|
||||||
|
normalized,
|
||||||
stockName,
|
stockName,
|
||||||
wasInWatchlist
|
wasInWatchlist
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 传递标准化后的6位代码给 Redux action
|
||||||
await dispatch(toggleWatchlistAction({
|
await dispatch(toggleWatchlistAction({
|
||||||
stockCode,
|
stockCode: normalized,
|
||||||
stockName,
|
stockName,
|
||||||
isInWatchlist: wasInWatchlist
|
isInWatchlist: wasInWatchlist
|
||||||
})).unwrap();
|
})).unwrap();
|
||||||
@@ -68,6 +93,7 @@ export const useWatchlist = (shouldLoad = true) => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('useWatchlist', '切换自选股失败', error, {
|
logger.error('useWatchlist', '切换自选股失败', error, {
|
||||||
stockCode,
|
stockCode,
|
||||||
|
normalized,
|
||||||
stockName
|
stockName
|
||||||
});
|
});
|
||||||
message.error(error.message || '操作失败,请稍后重试');
|
message.error(error.message || '操作失败,请稍后重试');
|
||||||
@@ -87,16 +113,17 @@ export const useWatchlist = (shouldLoad = true) => {
|
|||||||
|
|
||||||
let successCount = 0;
|
let successCount = 0;
|
||||||
const promises = stocks.map(async ({ code, name }) => {
|
const promises = stocks.map(async ({ code, name }) => {
|
||||||
if (!watchlistSet.has(code)) {
|
const normalized = normalizeStockCode(code);
|
||||||
|
if (!watchlistSet.has(normalized)) {
|
||||||
try {
|
try {
|
||||||
await dispatch(toggleWatchlistAction({
|
await dispatch(toggleWatchlistAction({
|
||||||
stockCode: code,
|
stockCode: normalized,
|
||||||
stockName: name,
|
stockName: name,
|
||||||
isInWatchlist: false
|
isInWatchlist: false
|
||||||
})).unwrap();
|
})).unwrap();
|
||||||
successCount++;
|
successCount++;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('useWatchlist', '添加失败', error, { code, name });
|
logger.error('useWatchlist', '添加失败', error, { code, normalized, name });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user