refactor(status): derive site ready/business_date from PG instead of ingest_state
_ready_flags 改从 PostgreSQL 直接查询(expected_record / actual_record / baishi_daily_stats),target_date = today − offset。 消除因 ingested_at 日期比对导致的每日零点全站 ready 集体重置。 store.py: 新增 has_data(site, kind, target_date) 查 PG 数据存在性 runtime.py: _ready_flags 返回 (flags, dates) 同源元组,_apply_ready 同步写入 business_date,修正 ready 与 business_date 不同源导致的 前端日期标签漂移(如实到就绪却显示'前天') Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -482,6 +482,52 @@ def get_existing_handover_nos(site):
|
||||
return set()
|
||||
|
||||
|
||||
# ============================== PG 数据存在性查询 ==============================
|
||||
|
||||
|
||||
def has_data(site, kind, target_date):
|
||||
"""查询 PG:指定站点在 target_date 是否有业务数据。
|
||||
target_date: str 'YYYY-MM-DD' 或 date 对象。
|
||||
返回 (has_rows: bool, count: int)。
|
||||
PG 不可达时返回 (False, 0),不抛异常——调用方按「未确认存在」处理。
|
||||
|
||||
kind 路由:
|
||||
expected → expected_record (business_date)
|
||||
actual → actual_record (scan_time::date)
|
||||
undelivered → 百世: baishi_daily_stats;4 站: 不单独查(由调用方 expected∧actual 派生)
|
||||
"""
|
||||
if site == "百世" and kind == "undelivered":
|
||||
sql = (
|
||||
"SELECT COUNT(*) FROM baishi_daily_stats"
|
||||
" WHERE site = %s AND business_date = %s"
|
||||
)
|
||||
params = (site, target_date)
|
||||
elif kind == "expected":
|
||||
sql = (
|
||||
"SELECT COUNT(*) FROM expected_record"
|
||||
" WHERE site = %s AND business_date = %s"
|
||||
)
|
||||
params = (site, target_date)
|
||||
elif kind == "actual":
|
||||
sql = (
|
||||
"SELECT COUNT(*) FROM actual_record"
|
||||
" WHERE site = %s AND scan_time::date = %s"
|
||||
)
|
||||
params = (site, target_date)
|
||||
else:
|
||||
return (False, 0)
|
||||
try:
|
||||
with _connect(_load_pg_config()["dbname"]) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql, params)
|
||||
row = cur.fetchone()
|
||||
cnt = int(row[0]) if row else 0
|
||||
return (cnt > 0, cnt)
|
||||
except Exception as e:
|
||||
print(f">> [状态] PG 查询 {site}/{kind}/{target_date} 失败: {e}")
|
||||
return (False, 0)
|
||||
|
||||
|
||||
# ============================== 命令行 ==============================
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user