Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import pandas as pd | |
| import folium | |
| from streamlit_folium import folium_static | |
| import jdatetime | |
| import plotly.express as px | |
| import json | |
| from pathlib import Path | |
| # تنظیمات اولیه صفحه | |
| st.set_page_config( | |
| page_title="مدیریت چاهکهای مزارع نیشکر", | |
| page_icon="🌱", | |
| layout="wide", | |
| initial_sidebar_state="expanded" | |
| ) | |
| # CSS برای راست به چپ کردن متنها | |
| st.markdown( | |
| """ | |
| <style> | |
| .css-1d391kg { | |
| direction: rtl; | |
| } | |
| .stButton>button { | |
| float: right; | |
| } | |
| .stSelectbox>div>div { | |
| direction: rtl; | |
| text-align: right; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # تعریف دادههای اولیه | |
| def load_initial_data(): | |
| data = { | |
| 'مزرعه': ['01-28', '02-19', '02-27', '03-08', '03-30', '03-32'], | |
| 'کانال': ['01', '02', '02', '03', '03', '03'], | |
| 'اداره': [1, 2, 2, 1, 1, 1], | |
| 'واریته': ['CP69', 'CP69', 'CP69', 'CP69', 'IR01-412', 'IRC00-14'], | |
| 'مساحت': [23.83, 24.53, 24.84, 23.17, 23.35, 22.97], | |
| 'چاهک_1_نصب': [False] * 6, | |
| 'چاهک_1_تکنسین': [''] * 6, | |
| 'چاهک_1_تاریخ': [''] * 6, | |
| 'چاهک_1_lat': [0.0] * 6, | |
| 'چاهک_1_lon': [0.0] * 6, | |
| 'چاهک_2_نصب': [False] * 6, | |
| 'چاهک_2_تکنسین': [''] * 6, | |
| 'چاهک_2_تاریخ': [''] * 6, | |
| 'چاهک_2_lat': [0.0] * 6, | |
| 'چاهک_2_lon': [0.0] * 6, | |
| } | |
| return pd.DataFrame(data) | |
| # لود دادهها | |
| if 'farms_data' not in st.session_state: | |
| st.session_state.farms_data = load_initial_data() | |
| # تعریف تکنسینها | |
| TECHNICIANS = [ | |
| 'علی دغاغله', | |
| 'علیرضا حمیدی', | |
| 'مسعود بن موسی', | |
| 'امین هنری' | |
| ] | |
| # عنوان اصلی | |
| st.title("🌱 مدیریت چاهکهای مزارع نیشکر") | |
| # سایدبار برای فیلتر کردن | |
| with st.sidebar: | |
| st.header("فیلترها") | |
| selected_department = st.selectbox( | |
| "انتخاب اداره", | |
| options=[0, 1, 2, 3, 4], | |
| format_func=lambda x: "همه ادارات" if x == 0 else f"اداره {x}", | |
| ) | |
| search_term = st.text_input("جستجو بر اساس نام مزرعه یا کانال") | |
| # فیلتر کردن دادهها | |
| filtered_data = st.session_state.farms_data.copy() | |
| if selected_department != 0: | |
| filtered_data = filtered_data[filtered_data['اداره'] == selected_department] | |
| if search_term: | |
| mask = (filtered_data['مزرعه'].str.contains(search_term)) | (filtered_data['کانال'].str.contains(search_term)) | |
| filtered_data = filtered_data[mask] | |
| # نمایش آمار کلی | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| total_wells = len(filtered_data) * 2 | |
| installed_wells = filtered_data['چاهک_1_نصب'].sum() + filtered_data['چاهک_2_نصب'].sum() | |
| st.metric("کل چاهکها", total_wells) | |
| with col2: | |
| st.metric("چاهکهای نصب شده", installed_wells) | |
| with col3: | |
| st.metric("چاهکهای باقیمانده", total_wells - installed_wells) | |
| # نمایش نقشه | |
| st.header("🗺️ نقشه چاهکها") | |
| m = folium.Map(location=[31.3183, 48.6706], zoom_start=10) | |
| for idx, row in filtered_data.iterrows(): | |
| if row['چاهک_1_نصب'] and row['چاهک_1_lat'] != 0: | |
| folium.Marker( | |
| [row['چاهک_1_lat'], row['چاهک_1_lon']], | |
| popup=f"مزرعه: {row['مزرعه']}<br>چاهک: 1<br>تکنسین: {row['چاهک_1_تکنسین']}<br>تاریخ: {row['چاهک_1_تاریخ']}", | |
| icon=folium.Icon(color='red') | |
| ).add_to(m) | |
| if row['چاهک_2_نصب'] and row['چاهک_2_lat'] != 0: | |
| folium.Marker( | |
| [row['چاهک_2_lat'], row['چاهک_2_lon']], | |
| popup=f"مزرعه: {row['مزرعه']}<br>چاهک: 2<br>تکنسین: {row['چاهک_2_تکنسین']}<br>تاریخ: {row['چاهک_2_تاریخ']}", | |
| icon=folium.Icon(color='blue') | |
| ).add_to(m) | |
| folium_static(m) | |
| # لیست مزارع و ثبت چاهک | |
| st.header("📝 لیست مزارع و ثبت چاهک") | |
| for idx, row in filtered_data.iterrows(): | |
| with st.expander(f"مزرعه {row['مزرعه']} - کانال {row['کانال']}"): | |
| st.write(f"واریته: {row['واریته']}") | |
| st.write(f"مساحت: {row['مساحت']} هکتار") | |
| col1, col2 = st.columns(2) | |
| # چاهک 1 | |
| with col1: | |
| st.subheader("چاهک 1") | |
| if not row['چاهک_1_نصب']: | |
| if st.button(f"ثبت نصب چاهک 1 - مزرعه {row['مزرعه']}", key=f"well1_{idx}"): | |
| technician = st.selectbox( | |
| "انتخاب تکنسین", | |
| options=TECHNICIANS, | |
| key=f"tech1_{idx}" | |
| ) | |
| lat = st.number_input("عرض جغرافیایی", value=31.3183, key=f"lat1_{idx}") | |
| lon = st.number_input("طول جغرافیایی", value=48.6706, key=f"lon1_{idx}") | |
| if st.button("ثبت نهایی", key=f"save1_{idx}"): | |
| st.session_state.farms_data.at[idx, 'چاهک_1_نصب'] = True | |
| st.session_state.farms_data.at[idx, 'چاهک_1_تکنسین'] = technician | |
| st.session_state.farms_data.at[idx, 'چاهک_1_تاریخ'] = jdatetime.datetime.now().strftime("%Y/%m/%d") | |
| st.session_state.farms_data.at[idx, 'چاهک_1_lat'] = lat | |
| st.session_state.farms_data.at[idx, 'چاهک_1_lon'] = lon | |
| st.success("چاهک 1 با موفقیت ثبت شد") | |
| st.rerun() | |
| else: | |
| st.info(f"نصب شده توسط {row['چاهک_1_تکنسین']} در تاریخ {row['چاهک_1_تاریخ']}") | |
| # چاهک 2 | |
| with col2: | |
| st.subheader("چاهک 2") | |
| if not row['چاهک_2_نصب']: | |
| if st.button(f"ثبت نصب چاهک 2 - مزرعه {row['مزرعه']}", key=f"well2_{idx}"): | |
| technician = st.selectbox( | |
| "انتخاب تکنسین", | |
| options=TECHNICIANS, | |
| key=f"tech2_{idx}" | |
| ) | |
| lat = st.number_input("عرض جغرافیایی", value=31.3183, key=f"lat2_{idx}") | |
| lon = st.number_input("طول جغرافیایی", value=48.6706, key=f"lon2_{idx}") | |
| if st.button("ثبت نهایی", key=f"save2_{idx}"): | |
| st.session_state.farms_data.at[idx, 'چاهک_2_نصب'] = True | |
| st.session_state.farms_data.at[idx, 'چاهک_2_تکنسین'] = technician | |
| st.session_state.farms_data.at[idx, 'چاهک_2_تاریخ'] = jdatetime.datetime.now().strftime("%Y/%m/%d") | |
| st.session_state.farms_data.at[idx, 'چاهک_2_lat'] = lat | |
| st.session_state.farms_data.at[idx, 'چاهک_2_lon'] = lon | |
| st.success("چاهک 2 با موفقیت ثبت شد") | |
| st.rerun() | |
| else: | |
| st.info(f"نصب شده توسط {row['چاهک_2_تکنسین']} در تاریخ {row['چاهک_2_تاریخ']}") | |
| # نمودار پیشرفت نصب به تفکیک اداره | |
| st.header("📊 گزارش پیشرفت نصب") | |
| progress_data = [] | |
| for dept in range(1, 5): | |
| dept_data = st.session_state.farms_data[st.session_state.farms_data['اداره'] == dept] | |
| total = len(dept_data) * 2 | |
| installed = dept_data['چاهک_1_نصب'].sum() + dept_data['چاهک_2_نصب'].sum() | |
| progress_data.append({ | |
| 'اداره': f'اداره {dept}', | |
| 'درصد پیشرفت': (installed / total * 100) if total > 0 else 0 | |
| }) | |
| progress_df = pd.DataFrame(progress_data) | |
| fig = px.bar(progress_df, x='اداره', y='درصد پیشرفت', | |
| title='درصد پیشرفت نصب چاهکها به تفکیک اداره') | |
| st.plotly_chart(fig) |