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)