update pay ui

This commit is contained in:
2025-12-15 16:50:03 +08:00
parent 90f8af6767
commit 4c16eddd6f
2 changed files with 1127 additions and 934 deletions

128
app.py
View File

@@ -153,6 +153,66 @@ def get_trading_day_near_date(target_date):
return trading_days[-1] if trading_days else None
def get_target_and_prev_trading_day(event_datetime):
"""
根据事件时间确定目标交易日和前一交易日(用于计算涨跌幅)
处理跨周末场景:
- 周五15:00后到周一15:00前分时图显示周一行情涨跌幅基于周五收盘价
逻辑:
- 如果事件时间在交易日的 9:00-15:00 之间,显示当天数据,涨跌幅基于前一交易日
- 如果事件时间在交易日的 15:00 之后,显示下一个交易日数据,涨跌幅基于当天
- 如果事件时间在非交易日(周末/节假日),显示下一个交易日数据,涨跌幅基于上一个交易日
- 如果事件时间在交易日的 9:00 之前,显示当天数据,涨跌幅基于前一交易日
返回:(target_date, prev_close_date) - 分时图显示日期和涨跌幅基准日期
"""
if not trading_days:
load_trading_days()
if not trading_days:
return None, None
# 如果是datetime提取date和time
if isinstance(event_datetime, datetime):
event_date = event_datetime.date()
event_time = event_datetime.time()
else:
event_date = event_datetime
event_time = dt_time(12, 0) # 默认中午,认为在盘中
# 检查事件日期是否是交易日
is_trading_day = event_date in trading_days_set
# 收盘时间判断
market_close_time = dt_time(15, 0)
is_after_market = event_time > market_close_time
if is_trading_day:
if is_after_market:
# 交易日收盘后:显示下一个交易日,涨跌幅基于当天(即本交易日)
target_date = get_trading_day_near_date(event_date + timedelta(days=1))
prev_close_date = event_date
else:
# 交易日盘中或开盘前:显示当天,涨跌幅基于前一交易日
target_date = event_date
# 找前一个交易日
target_idx = trading_days.index(event_date) if event_date in trading_days else -1
prev_close_date = trading_days[target_idx - 1] if target_idx > 0 else None
else:
# 非交易日(周末/节假日):显示下一个交易日,涨跌幅基于上一个交易日
target_date = get_trading_day_near_date(event_date)
# 找上一个交易日作为基准
prev_close_date = None
for td in reversed(trading_days):
if td < event_date:
prev_close_date = td
break
return target_date, prev_close_date
# 应用启动时加载交易日数据
load_trading_days()
@@ -7244,20 +7304,10 @@ def get_stock_quotes():
full_stock_names[orig_code] = name
full_stock_names[norm_code] = name
# ==================== 使用全局交易日数据(与 batch-kline 一致 ====================
# 确定目标交易日:获取事件时间对应的交易日或之前最近的交易日
event_date = event_time.date()
# 如果事件日期是交易日,使用该日期
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
# ==================== 使用全局交易日数据(处理跨周末场景 ====================
# 使用新的辅助函数处理跨周末场景:
# - 周五15:00后到周一15:00前分时图显示周一行情涨跌幅基于周五收盘价
target_date, prev_trading_day = get_target_and_prev_trading_day(event_time)
if not target_date:
return jsonify({
@@ -7266,17 +7316,11 @@ def get_stock_quotes():
for code in original_codes}
})
# 获取前一个交易日
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]
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 ''}, 交易日: {target_date}, 前一交易日: {prev_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}")
# 初始化 ClickHouse 客户端
client = get_clickhouse_client()
@@ -8081,14 +8125,9 @@ def get_batch_kline_data():
for row in result:
stock_names[row[0]] = row[1]
# 确定目标交易日
target_date = get_trading_day_near_date(event_datetime.date())
is_after_market = event_datetime.time() > dt_time(15, 0)
if target_date and is_after_market:
next_trade_date = get_trading_day_near_date(target_date + timedelta(days=1))
if next_trade_date:
target_date = next_trade_date
# 确定目标交易日和涨跌幅基准日(处理跨周末场景)
# - 周五15:00后到周一15:00前分时图显示周一行情涨跌幅基于周五收盘价
target_date, prev_trading_day = get_target_and_prev_trading_day(event_datetime)
if not target_date:
# 返回空数据(使用原始代码作为 key
@@ -8103,21 +8142,24 @@ def get_batch_kline_data():
results = {}
if chart_type == 'timeline':
# 批量获取昨收价(从 MySQL ea_trade 表)
# 批量获取前收盘价(从 MySQL ea_trade 表)
# 使用 prev_trading_day 作为基准日期(处理跨周末场景)
prev_close_map = {}
target_date_str = target_date.strftime('%Y%m%d')
with engine.connect() as conn:
base_codes = list(set([code.split('.')[0] for code in codes]))
if base_codes:
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'] = target_date_str
result = conn.execute(text(f"""
SELECT SECCODE, F007N FROM ea_trade
WHERE SECCODE IN ({placeholders}) AND TRADEDATE = :trade_date AND F007N > 0
"""), params).fetchall()
for row in result:
prev_close_map[row[0]] = float(row[1])
if prev_trading_day:
prev_date_str = prev_trading_day.strftime('%Y%m%d')
with engine.connect() as conn:
base_codes = list(set([code.split('.')[0] for code in codes]))
if base_codes:
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_date_str
result = conn.execute(text(f"""
SELECT SECCODE, F007N FROM ea_trade
WHERE SECCODE IN ({placeholders}) AND TRADEDATE = :trade_date AND F007N > 0
"""), params).fetchall()
for row in result:
prev_close_map[row[0]] = float(row[1])
print(f"分时图基准日期: {prev_trading_day}, 查询到 {len(prev_close_map)} 条前收盘价")
# 批量查询分时数据(使用标准化代码查询 ClickHouse
batch_data = client.execute("""

File diff suppressed because it is too large Load Diff