File size: 5,378 Bytes
f306e2a 139419f f306e2a 139419f f306e2a 139419f f306e2a 139419f bb615b4 139419f f306e2a 139419f f306e2a bb615b4 139419f bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a 139419f f306e2a bb615b4 f306e2a 139419f f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 139419f f306e2a bb615b4 f306e2a 139419f f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a 139419f bb615b4 f306e2a bb615b4 f306e2a 139419f bb615b4 f306e2a bb615b4 f306e2a bb615b4 f306e2a bb615b4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | import streamlit as st
from datetime import datetime
from typing import Dict
import pandas as pd
from pdf_generator import create_enhanced_pdf_report, create_csv_export
def init_session_state():
if 'current_df' not in st.session_state:
st.session_state.current_df = None
if 'current_stats' not in st.session_state:
st.session_state.current_stats = None
if 'export_ready' not in st.session_state:
st.session_state.export_ready = False
if 'pdf_buffer' not in st.session_state:
st.session_state.pdf_buffer = None
if 'csv_data' not in st.session_state:
st.session_state.csv_data = None
def render_export_section(df: pd.DataFrame, stats: Dict, outliers: Dict, model, t: Dict):
st.markdown(f'<div class="section-header">{t["section_export"]}</div>', unsafe_allow_html=True)
col1, col2, col3 = st.columns(3)
with col1:
if st.button(t['btn_generate_pdf'], key="generate_pdf_btn", type="primary"):
try:
with st.spinner(t['pdf_generating']):
st.session_state.pdf_buffer = create_enhanced_pdf_report(df, stats, outliers, model)
st.session_state.export_ready = True
st.success(t['pdf_success'])
except Exception as e:
st.error(f"{t['pdf_failed']}: {str(e)}")
st.session_state.export_ready = False
if st.session_state.export_ready and st.session_state.pdf_buffer:
st.download_button(
label=t['btn_download_pdf'],
data=st.session_state.pdf_buffer,
file_name=f"production_report_{datetime.now().strftime('%Y%m%d_%H%M')}.pdf",
mime="application/pdf",
key="download_pdf_btn"
)
with col2:
if st.button(t['btn_generate_csv'], key="generate_csv_btn", type="primary"):
try:
st.session_state.csv_data = create_csv_export(df, stats)
st.success(t['csv_success'])
except Exception as e:
st.error(f"{t['csv_failed']}: {str(e)}")
if st.session_state.csv_data is not None:
csv_string = st.session_state.csv_data.to_csv(index=False)
st.download_button(
label=t['btn_download_csv'],
data=csv_string,
file_name=f"production_summary_{datetime.now().strftime('%Y%m%d_%H%M')}.csv",
mime="text/csv",
key="download_csv_btn"
)
with col3:
csv_string = df.to_csv(index=False)
st.download_button(
label=t['btn_download_raw'],
data=csv_string,
file_name=f"raw_production_data_{datetime.now().strftime('%Y%m%d_%H%M')}.csv",
mime="text/csv",
key="download_raw_btn"
)
def render_quality_check(outliers: Dict, t: Dict):
st.markdown(f'<div class="section-header">{t["section_quality_check"]}</div>', unsafe_allow_html=True)
cols = st.columns(len(outliers))
for i, (material, info) in enumerate(outliers.items()):
with cols[i]:
if info['count'] > 0:
dates_str = ", ".join(info['dates'])
st.markdown(f'''<div class="alert-warning">
<strong>{material.title()}</strong><br>
{info["count"]} {t['quality_outliers']}<br>
{t['quality_normal_range']}: {info["range"]}<br>
<div class="quality-dates">Dates: {dates_str}</div>
</div>''', unsafe_allow_html=True)
else:
st.markdown(f'<div class="alert-success"><strong>{material.title()}</strong><br>{t["quality_normal"]}</div>',
unsafe_allow_html=True)
def render_ai_insights(model, stats: Dict, df: pd.DataFrame, t: Dict, lang: str):
st.markdown(f'<div class="section-header">{t["section_ai_insights"]}</div>', unsafe_allow_html=True)
quick_questions = [t['ai_quick_q1'], t['ai_quick_q2'], t['ai_quick_q3']]
cols = st.columns(len(quick_questions))
for i, q in enumerate(quick_questions):
with cols[i]:
if st.button(q, key=f"ai_q_{i}"):
from ai_engine import query_ai
with st.spinner(t['ai_analyzing']):
answer = query_ai(model, stats, q, df, lang)
st.info(answer)
custom_question = st.text_input(
t['ai_ask_label'],
placeholder=t['ai_custom_placeholder'],
key="custom_ai_question"
)
if custom_question and st.button(t['ai_ask_btn'], key="ask_ai_btn"):
from ai_engine import query_ai
with st.spinner(t['ai_analyzing']):
answer = query_ai(model, stats, custom_question, df, lang)
st.success(f"**Q:** {custom_question}")
st.write(f"**A:** {answer}")
def render_welcome_screen(t: Dict):
st.markdown(f'<div class="section-header">{t["welcome_title"]}</div>', unsafe_allow_html=True)
col1, col2 = st.columns(2)
with col1:
st.markdown(f"### {t['welcome_quick_start']}")
st.markdown(t['welcome_steps'])
with col2:
st.markdown(f"### {t['welcome_features']}")
st.markdown(t['welcome_features_list'])
st.info(t['welcome_ready']) |