Spaces:
Running
Running
| from datetime import datetime | |
| import pandas as pd | |
| import streamlit as st | |
| from schedule_api_client import fetch_schedule_api_bundle, process_schedule_dataframe | |
| st.set_page_config(layout="wide", page_title="排程 API 数据") | |
| st.title("🧩 排程 API 数据查看") | |
| st.caption("统一展示排程相关 API:场次、影厅座位、标准影片名。") | |
| col1, col2 = st.columns([2, 1]) | |
| with col1: | |
| selected_date = st.date_input("排程日期", value=datetime.now().date(), key="schedule_api_date") | |
| with col2: | |
| st.write("") | |
| st.write("") | |
| fetch_btn = st.button("获取并展示", type="primary", key="schedule_api_fetch") | |
| date_str = selected_date.strftime("%Y-%m-%d") | |
| if fetch_btn: | |
| with st.spinner(f"正在获取 {date_str} 的排程 API 数据..."): | |
| bundle = fetch_schedule_api_bundle(date_str) | |
| if not bundle: | |
| st.error("获取失败,请检查 .env、网络或 token。") | |
| else: | |
| st.session_state["schedule_api_bundle"] = bundle | |
| st.toast("排程 API 数据加载成功", icon="✅") | |
| bundle = st.session_state.get("schedule_api_bundle") | |
| if bundle: | |
| schedule_list = bundle.get("schedule_list") or [] | |
| hall_seat_map = bundle.get("hall_seat_map") or {} | |
| canonical_names = bundle.get("canonical_names") or [] | |
| c1, c2, c3 = st.columns(3) | |
| c1.metric("场次数", len(schedule_list)) | |
| c2.metric("影厅数", len(hall_seat_map)) | |
| c3.metric("标准影片名数量", len(canonical_names)) | |
| tidy_df = process_schedule_dataframe(schedule_list, hall_seat_map, canonical_names) | |
| tab1, tab2, tab3, tab4 = st.tabs( | |
| [ | |
| "整理后表格", | |
| "原始场次 API", | |
| "影厅座位 API", | |
| "标准影片名 API", | |
| ] | |
| ) | |
| with tab1: | |
| if tidy_df.empty: | |
| st.warning("暂无可展示的排程数据。") | |
| else: | |
| st.dataframe(tidy_df, width="stretch", height=600) | |
| with tab2: | |
| if schedule_list: | |
| raw_schedule_df = pd.DataFrame(schedule_list) | |
| st.dataframe(raw_schedule_df, width="stretch", height=500) | |
| with st.expander("查看原始 JSON"): | |
| st.json(schedule_list) | |
| else: | |
| st.info("API 返回空场次列表。") | |
| with tab3: | |
| if hall_seat_map: | |
| hall_df = pd.DataFrame( | |
| [{"hallId": k, "seatNum": v} for k, v in hall_seat_map.items()] | |
| ).sort_values("hallId") | |
| st.dataframe(hall_df, width="stretch", height=500) | |
| with st.expander("查看原始 JSON"): | |
| st.json(hall_seat_map) | |
| else: | |
| st.info("未获取到影厅座位数据。") | |
| with tab4: | |
| if canonical_names: | |
| canonical_df = pd.DataFrame({"movieName": canonical_names}) | |
| st.dataframe(canonical_df, width="stretch", height=500) | |
| with st.expander("查看原始 JSON"): | |
| st.json(canonical_names) | |
| else: | |
| st.info("未获取到标准影片名数据(可能是 CINEMA_ID 未配置或接口返回为空)。") | |
| else: | |
| st.info("请选择日期并点击「获取并展示」。") | |