Spaces:
Runtime error
Runtime error
File size: 8,280 Bytes
697d810 885605d 697d810 885605d 697d810 885605d 697d810 885605d 697d810 885605d 697d810 885605d 697d810 |
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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
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
)
# تعریف دادههای اولیه
@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['مزرعه']}<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) |