From 2770a821720f9ab9190839bcae96fa5a8fdb7648 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Mon, 15 Dec 2025 12:27:08 +0800 Subject: [PATCH] update pay ui --- app.py | 106 ++++++++++++++++++--------------------------------------- 1 file changed, 33 insertions(+), 73 deletions(-) diff --git a/app.py b/app.py index e9b6987c..d60c28c6 100755 --- a/app.py +++ b/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 # 计算涨跌幅