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( """ """, unsafe_allow_html=True ) # تعریف داده‌های اولیه @st.cache_data 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['مزرعه']}
چاهک: 1
تکنسین: {row['چاهک_1_تکنسین']}
تاریخ: {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['مزرعه']}
چاهک: 2
تکنسین: {row['چاهک_2_تکنسین']}
تاریخ: {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)