Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import os | |
| from pymongo import MongoClient | |
| import pandas as pd | |
| from datetime import datetime | |
| from report_generator import generate_stock_report, show_report | |
| from utils import load_css, call_genai_summary | |
| import re | |
| def main(): | |
| mongo_uri = os.getenv("MONGO_URI") | |
| mongo_dbname = os.getenv("MONGO_DBNAME") | |
| def get_db(): | |
| client = MongoClient(mongo_uri) | |
| db = client[mongo_dbname] | |
| return db["reports"] | |
| reports_history = get_db() | |
| load_css() | |
| if "uid" not in st.session_state: | |
| st.warning("Vui lòng đăng nhập để sử dụng tính năng này.") | |
| st.page_link("StockInsights.py", label="Về trang Đăng nhập", icon="🏠") | |
| st.stop() | |
| # ==== Giao diện trang báo cáo === | |
| st.markdown("<h2>Báo cáo Cổ phiếu Thông minh</h2>", unsafe_allow_html=True) | |
| # st.markdown("<div class='report-container'>", unsafe_allow_html=True) | |
| col_history, col_main = st.columns([1, 3]) | |
| # ===== LEFT: Report History ===== | |
| with col_history: | |
| st.markdown("<h4>Báo cáo đã xem</h4>", unsafe_allow_html=True) | |
| # Initialize history list | |
| if "reports_history_list" not in st.session_state: | |
| query = {"uid": st.session_state["uid"]} | |
| st.session_state["reports_history_list"] = list( | |
| reports_history.find(query).sort("created_at", -1) | |
| ) | |
| history = st.session_state["reports_history_list"] | |
| if not history: | |
| st.info("Chưa có báo cáo nào được lưu.") | |
| else: | |
| for idx, report in enumerate(history): | |
| if st.button( | |
| f"{report['report_data'].get('stock_code', 'N/A')} ({report['report_data'].get('report_period', 'N/A')})", | |
| key=f"history_btn_{idx}" | |
| ): | |
| # Update the selected report in session state | |
| st.session_state["selected_report"] = report | |
| st.session_state["show_form"] = False # Hide form when viewing history | |
| # ===== RIGHT: Report View===== | |
| with col_main: | |
| if st.session_state.get("selected_report") and not st.session_state.get("show_form", False): | |
| selected = st.session_state["selected_report"] | |
| show_report(selected["report_data"], selected["summary"], selected["report_data"]["stock_code"]) | |
| # Tạo báo cáo mới | |
| if st.button("Tạo báo cáo mới", key="new_report_btn"): | |
| st.session_state["show_form"] = True | |
| st.session_state.pop("selected_report", None) | |
| st.rerun() | |
| else: | |
| with st.form("report_form"): | |
| stock_code_input = st.text_input( | |
| "Nhập mã cổ phiếu (ví dụ: VIC, HPG...)", value="HPG").upper() | |
| col_start, col_end = st.columns(2) | |
| with col_start: | |
| start_date = st.date_input( | |
| "Từ ngày", value=pd.to_datetime("2025-05-01")) | |
| with col_end: | |
| end_date = st.date_input("Đến ngày", value=datetime.now()) | |
| submitted = st.form_submit_button("Tạo báo cáo", use_container_width=True) | |
| if submitted and stock_code_input: | |
| temp = stock_code_input.strip().upper() | |
| if not re.fullmatch(r"[A-Z0-9]{1,6}", temp): | |
| st.error("Mã cổ phiếu không hợp lệ. Vui lòng nhập 1-6 ký tự chữ hoa hoặc số (ví dụ: HPG, VIC).") | |
| else: | |
| with st.spinner(f'Đang tổng hợp và phân tích dữ liệu cho mã {stock_code_input}...'): | |
| report_data = generate_stock_report( | |
| stock_code_input, (str(start_date), str(end_date))) | |
| if report_data and (report_data["overall_sentiment"]["positive_mentions"] > 0 or report_data["overall_sentiment"]["negative_mentions"] > 0): | |
| summary = call_genai_summary( | |
| report_data, stock_code_input, (str(start_date), str(end_date))) | |
| else: | |
| summary = f"Không tìm thấy đủ dữ liệu nổi bật cho mã **{stock_code_input}** trong khoảng thời gian đã chọn để tạo tóm tắt AI." | |
| # Save to MongoDB | |
| inserted_id = reports_history.insert_one({ | |
| "uid": st.session_state["uid"], | |
| "report_data": report_data, | |
| "summary": summary, | |
| "created_at": datetime.utcnow() | |
| }).inserted_id | |
| # Add new report to top of history | |
| new_report = { | |
| "_id": inserted_id, | |
| "report_data": report_data, | |
| "summary": summary, | |
| "created_at": datetime.utcnow() | |
| } | |
| st.session_state["reports_history_list"].insert(0, new_report) | |
| # Show new report | |
| st.session_state["selected_report"] = new_report | |
| st.session_state["show_form"] = False | |
| st.rerun() | |