update pay ui
This commit is contained in:
106
app.py
106
app.py
@@ -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
|
||||
|
||||
# 计算涨跌幅
|
||||
|
||||
Reference in New Issue
Block a user