update pay ui

This commit is contained in:
2025-12-15 12:27:08 +08:00
parent 9603adbd31
commit 2770a82172

106
app.py
View File

@@ -7174,9 +7174,9 @@ def get_transmission_chain(event_id):
@app.route('/api/stock/quotes', methods=['GET', 'POST'])
def get_stock_quotes():
"""
获取股票行情数据(无缓存版本,直接查询数据库
获取股票行情数据(使用全局交易日数据,与 batch-kline 保持一致
- 股票名称:从 MySQL ea_stocklist 查询
- 交易日数据:从 MySQL trading_days 查询
- 交易日数据:使用全局 trading_days(从 tdays.csv 加载)
- 前一交易日收盘价:从 MySQL ea_trade 查询
- 实时价格:从 ClickHouse stock_minute 查询
"""
@@ -7198,6 +7198,8 @@ def get_stock_quotes():
return code
if code.startswith(('6',)):
return f"{code}.SH"
elif code.startswith(('8', '9', '4')):
return f"{code}.BJ"
else:
return f"{code}.SZ"
@@ -7240,90 +7242,46 @@ def get_stock_quotes():
full_stock_names[orig_code] = name
full_stock_names[norm_code] = name
# ==================== 交易日判断(直接查 MySQL ====================
def is_trading_day(date_str):
"""检查是否为交易日"""
with engine.connect() as conn:
result = conn.execute(text(
"SELECT 1 FROM trading_days WHERE EXCHANGE_DATE = :date"
), {"date": date_str}).fetchone()
return result is not None
# ==================== 使用全局交易日数据(与 batch-kline 一致 ====================
# 确定目标交易日:获取事件时间对应的交易日或之前最近的交易日
event_date = event_time.date()
def get_next_trading_day(date_str):
"""获取下一个交易日"""
with engine.connect() as conn:
result = conn.execute(text("""
SELECT EXCHANGE_DATE FROM trading_days
WHERE EXCHANGE_DATE > :date ORDER BY EXCHANGE_DATE LIMIT 1
"""), {"date": date_str}).fetchone()
# 如果事件日期是交易日,使用该日期
if event_date in trading_days_set:
target_date = event_date
else:
# 否则,找之前最近的交易日(用于获取历史数据)
target_date = None
for td in reversed(trading_days):
if td <= event_date:
target_date = td
break
if result:
return result[0].date() if hasattr(result[0], 'date') else result[0]
return None
def get_prev_trading_day(date_str):
"""获取前一个交易日"""
with engine.connect() as conn:
result = conn.execute(text("""
SELECT EXCHANGE_DATE FROM trading_days
WHERE EXCHANGE_DATE < :date ORDER BY EXCHANGE_DATE DESC LIMIT 1
"""), {"date": date_str}).fetchone()
if result:
return result[0].date() if hasattr(result[0], 'date') else result[0]
return None
def get_trading_day_and_times(event_datetime):
event_date = event_datetime.date()
event_time_val = event_datetime.time()
date_str = event_date.strftime('%Y-%m-%d')
market_open = dt_time(9, 30)
market_close = dt_time(15, 0)
if is_trading_day(date_str):
if event_time_val < market_open:
return event_date, market_open, market_close
elif event_time_val > market_close:
next_day = get_next_trading_day(date_str)
return (next_day, market_open, market_close)
else:
return event_date, event_time_val, market_close
else:
next_day = get_next_trading_day(date_str)
return (next_day, market_open, market_close)
trading_day, start_time, end_time = get_trading_day_and_times(event_time)
if not trading_day:
if not target_date:
return jsonify({
'success': True,
'data': {code: {'name': name, 'price': None, 'change': None}
for code, name in full_stock_names.items()}
'data': {code: {'name': full_stock_names.get(code, f'股票{code}'), 'price': None, 'change': None}
for code in original_codes}
})
start_datetime = datetime.combine(trading_day, start_time)
end_datetime = datetime.combine(trading_day, end_time)
# 获取前一个交易日
prev_trading_day = get_prev_trading_day(trading_day.strftime('%Y-%m-%d'))
prev_trading_day = None
target_idx = trading_days.index(target_date) if target_date in trading_days else -1
if target_idx > 0:
prev_trading_day = trading_days[target_idx - 1]
# 如果交易日在未来,只返回名称
if trading_day > current_time.date():
return jsonify({
'success': True,
'data': {code: {'name': name, 'price': None, 'change': None}
for code, name in full_stock_names.items()}
})
start_datetime = datetime.combine(target_date, dt_time(9, 30))
end_datetime = datetime.combine(target_date, dt_time(15, 0))
results = {}
print(f"批量处理 {len(codes)} 只股票: {codes[:5]}{'...' if len(codes) > 5 else ''}, 交易日: {trading_day}, 时间范围: {start_datetime} - {end_datetime}")
print(f"批量处理 {len(codes)} 只股票: {codes[:5]}{'...' if len(codes) > 5 else ''}, 交易日: {target_date}, 前一交易日: {prev_trading_day}, 时间范围: {start_datetime} - {end_datetime}")
# ==================== 查询前一交易日收盘价(直接查 MySQL ====================
try:
prev_close_map = {}
if prev_trading_day:
prev_day_str = prev_trading_day.strftime('%Y-%m-%d') if hasattr(prev_trading_day, 'strftime') else str(prev_trading_day)
# ea_trade 表的 TRADEDATE 格式是 YYYYMMDD无连字符
prev_day_str = prev_trading_day.strftime('%Y%m%d') if hasattr(prev_trading_day, 'strftime') else str(prev_trading_day).replace('-', '')
base_codes = list(set([code.split('.')[0] for code in codes]))
base_close_map = {}
@@ -7331,7 +7289,7 @@ def get_stock_quotes():
with engine.connect() as conn:
placeholders = ','.join([f':code{i}' for i in range(len(base_codes))])
params = {f'code{i}': code for i, code in enumerate(base_codes)}
params['trade_date'] = prev_trading_day
params['trade_date'] = prev_day_str
prev_close_result = conn.execute(text(f"""
SELECT SECCODE, F007N as close_price
@@ -7431,12 +7389,14 @@ def get_stock_quotes():
prev_close = None
if prev_trading_day and last_price is not None:
base_code = orig_code.split('.')[0]
# ea_trade 表的 TRADEDATE 格式是 YYYYMMDD无连字符
prev_day_str = prev_trading_day.strftime('%Y%m%d') if hasattr(prev_trading_day, 'strftime') else str(prev_trading_day).replace('-', '')
with engine.connect() as conn:
prev_result = conn.execute(text("""
SELECT F007N as close_price
FROM ea_trade
WHERE SECCODE = :code AND TRADEDATE = :trade_date
"""), {'code': base_code, 'trade_date': prev_trading_day}).fetchone()
"""), {'code': base_code, 'trade_date': prev_day_str}).fetchone()
prev_close = float(prev_result[0]) if prev_result and prev_result[0] else None
# 计算涨跌幅