update pay ui

This commit is contained in:
2025-12-10 12:22:40 +08:00
parent 3f7d0e597e
commit ad97b5e769
4 changed files with 197 additions and 120 deletions

174
app.py
View File

@@ -12053,10 +12053,11 @@ def get_market_summary(seccode):
@app.route('/api/stocks/search', methods=['GET'])
def search_stocks():
"""搜索股票(支持股票代码、股票简称、拼音首字母"""
"""搜索股票和指数(支持代码、名称搜索"""
try:
query = request.args.get('q', '').strip()
limit = request.args.get('limit', 20, type=int)
search_type = request.args.get('type', 'all') # all, stock, index
if not query:
return jsonify({
@@ -12064,73 +12065,132 @@ def search_stocks():
'error': '请输入搜索关键词'
}), 400
results = []
with engine.connect() as conn:
test_sql = text("""
SELECT SECCODE, SECNAME, F001V, F003V, F010V, F011V
FROM ea_stocklist
WHERE SECCODE = '300750'
OR F001V LIKE '%ndsd%' LIMIT 5
""")
test_result = conn.execute(test_sql).fetchall()
# 搜索指数(优先显示指数,因为通常用户搜索代码时指数更常用)
if search_type in ('all', 'index'):
index_sql = text("""
SELECT DISTINCT
INDEXCODE as stock_code,
SECNAME as stock_name,
INDEXNAME as full_name,
F018V as exchange
FROM ea_exchangeindex
WHERE (
UPPER(INDEXCODE) LIKE UPPER(:query_pattern)
OR UPPER(SECNAME) LIKE UPPER(:query_pattern)
OR UPPER(INDEXNAME) LIKE UPPER(:query_pattern)
)
ORDER BY CASE
WHEN UPPER(INDEXCODE) = UPPER(:exact_query) THEN 1
WHEN UPPER(SECNAME) = UPPER(:exact_query) THEN 2
WHEN UPPER(INDEXCODE) LIKE UPPER(:prefix_pattern) THEN 3
WHEN UPPER(SECNAME) LIKE UPPER(:prefix_pattern) THEN 4
ELSE 5
END,
INDEXCODE
LIMIT :limit
""")
# 构建搜索SQL - 支持股票代码、股票简称、拼音简称搜索
search_sql = text("""
SELECT DISTINCT SECCODE as stock_code,
SECNAME as stock_name,
F001V as pinyin_abbr,
F003V as security_type,
F005V as exchange,
F011V as listing_status
FROM ea_stocklist
WHERE (
UPPER(SECCODE) LIKE UPPER(:query_pattern)
OR UPPER(SECNAME) LIKE UPPER(:query_pattern)
OR UPPER(F001V) LIKE UPPER(:query_pattern)
)
-- 基本过滤条件只搜索正常的A股和B股
AND (F011V = '正常上市' OR F010V = '013001') -- 正常上市状态
AND F003V IN ('A股', 'B股') -- 只搜索A股和B股
ORDER BY CASE
WHEN UPPER(SECCODE) = UPPER(:exact_query) THEN 1
WHEN UPPER(SECNAME) = UPPER(:exact_query) THEN 2
WHEN UPPER(F001V) = UPPER(:exact_query) THEN 3
WHEN UPPER(SECCODE) LIKE UPPER(:prefix_pattern) THEN 4
WHEN UPPER(SECNAME) LIKE UPPER(:prefix_pattern) THEN 5
WHEN UPPER(F001V) LIKE UPPER(:prefix_pattern) THEN 6
ELSE 7
END,
SECCODE LIMIT :limit
""")
index_result = conn.execute(index_sql, {
'query_pattern': f'%{query}%',
'exact_query': query,
'prefix_pattern': f'{query}%',
'limit': limit
}).fetchall()
result = conn.execute(search_sql, {
'query_pattern': f'%{query}%',
'exact_query': query,
'prefix_pattern': f'{query}%',
'limit': limit
}).fetchall()
for row in index_result:
results.append({
'stock_code': row.stock_code,
'stock_name': row.stock_name,
'full_name': row.full_name,
'exchange': row.exchange,
'isIndex': True,
'security_type': '指数'
})
stocks = []
for row in result:
# 获取当前价格
current_price, _ = get_latest_price_from_clickhouse(row.stock_code)
# 搜索股票
if search_type in ('all', 'stock'):
stock_sql = text("""
SELECT DISTINCT SECCODE as stock_code,
SECNAME as stock_name,
F001V as pinyin_abbr,
F003V as security_type,
F005V as exchange,
F011V as listing_status
FROM ea_stocklist
WHERE (
UPPER(SECCODE) LIKE UPPER(:query_pattern)
OR UPPER(SECNAME) LIKE UPPER(:query_pattern)
OR UPPER(F001V) LIKE UPPER(:query_pattern)
)
AND (F011V = '正常上市' OR F010V = '013001')
AND F003V IN ('A股', 'B股')
ORDER BY CASE
WHEN UPPER(SECCODE) = UPPER(:exact_query) THEN 1
WHEN UPPER(SECNAME) = UPPER(:exact_query) THEN 2
WHEN UPPER(F001V) = UPPER(:exact_query) THEN 3
WHEN UPPER(SECCODE) LIKE UPPER(:prefix_pattern) THEN 4
WHEN UPPER(SECNAME) LIKE UPPER(:prefix_pattern) THEN 5
WHEN UPPER(F001V) LIKE UPPER(:prefix_pattern) THEN 6
ELSE 7
END,
SECCODE
LIMIT :limit
""")
stocks.append({
'stock_code': row.stock_code,
'stock_name': row.stock_name,
'current_price': current_price or 0, # 添加当前价格
'pinyin_abbr': row.pinyin_abbr,
'security_type': row.security_type,
'exchange': row.exchange,
'listing_status': row.listing_status
})
stock_result = conn.execute(stock_sql, {
'query_pattern': f'%{query}%',
'exact_query': query,
'prefix_pattern': f'{query}%',
'limit': limit
}).fetchall()
for row in stock_result:
results.append({
'stock_code': row.stock_code,
'stock_name': row.stock_name,
'pinyin_abbr': row.pinyin_abbr,
'security_type': row.security_type,
'exchange': row.exchange,
'listing_status': row.listing_status,
'isIndex': False
})
# 如果搜索全部,按相关性重新排序(精确匹配优先)
if search_type == 'all':
def sort_key(item):
code = item['stock_code'].upper()
name = item['stock_name'].upper()
q = query.upper()
# 精确匹配代码优先
if code == q:
return (0, not item['isIndex'], code) # 指数优先
# 精确匹配名称
if name == q:
return (1, not item['isIndex'], code)
# 前缀匹配代码
if code.startswith(q):
return (2, not item['isIndex'], code)
# 前缀匹配名称
if name.startswith(q):
return (3, not item['isIndex'], code)
return (4, not item['isIndex'], code)
results.sort(key=sort_key)
# 限制总数
results = results[:limit]
return jsonify({
'success': True,
'data': stocks,
'count': len(stocks)
'data': results,
'count': len(results)
})
except Exception as e:
app.logger.error(f"搜索股票/指数错误: {e}")
return jsonify({
'success': False,
'error': str(e)