Esmaeilkianii commited on
Commit
f7822c5
·
verified ·
1 Parent(s): cad6d37

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +513 -0
app.py CHANGED
@@ -864,4 +864,517 @@ st.markdown("""
864
  <footer>
865
  <p>&copy; 2025 سامانه هوشمند پایش مزارع نیشکر دهخدا. تمامی حقوق محفوظ است.</p>
866
  </footer>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
867
  """, unsafe_allow_html=True)
 
864
  <footer>
865
  <p>&copy; 2025 سامانه هوشمند پایش مزارع نیشکر دهخدا. تمامی حقوق محفوظ است.</p>
866
  </footer>
867
+ """, unsafe_allow_html=True)# صفحه ورود اطلاعات
868
+ elif selected == "ورود اطلاعات":
869
+ st.markdown("## ورود اطلاعات روزانه مزارع")
870
+
871
+ tab1, tab2 = st.tabs(["ورود دستی", "آپلود فایل"])
872
+
873
+ with tab1:
874
+ col1, col2 = st.columns(2)
875
+
876
+ with col1:
877
+ selected_week = st.selectbox(
878
+ "انتخاب هفته",
879
+ options=[str(i) for i in range(1, 23)],
880
+ format_func=lambda x: f"هفته {x}"
881
+ )
882
+
883
+ with col2:
884
+ days = day_df['روز'].unique().tolist()
885
+ selected_day = st.selectbox("انتخاب روز", options=days)
886
+
887
+ filtered_farms = farm_df[farm_df['هفته'] == int(selected_week)]
888
+ filtered_farms = filtered_farms[filtered_farms['مزرعه'].isin(day_df[day_df['روز'] == selected_day]['مزرعه'])]
889
+
890
+ if filtered_farms.empty:
891
+ st.warning(f"هیچ مزرعه‌ای برای هفته {selected_week} و روز {selected_day} در پایگاه داده وجود ندارد.")
892
+ else:
893
+ st.markdown("### ورود داده‌های مزارع")
894
+
895
+ data_key = f"data_{selected_week}_{selected_day}"
896
+ if data_key not in st.session_state:
897
+ st.session_state[data_key] = pd.DataFrame({
898
+ 'مزرعه': filtered_farms['مزرعه'],
899
+ 'ایستگاه 1': [0] * len(filtered_farms),
900
+ 'ایستگاه 2': [0] * len(filtered_farms),
901
+ 'ایستگاه 3': [0] * len(filtered_farms),
902
+ 'ایستگاه 4': [0] * len(filtered_farms),
903
+ 'ایستگاه 5': [0] * len(filtered_farms),
904
+ 'چاهک 1': [0] * len(filtered_farms),
905
+ 'چاهک 2': [0] * len(filtered_farms),
906
+ 'رطوبت غلاف فعلی': [0] * len(filtered_farms),
907
+ 'نیتروژن فعلی': [0] * len(filtered_farms),
908
+ 'ارتفاع هفته جاری مزرعه': [0] * len(filtered_farms)
909
+ })
910
+
911
+ edited_df = st.data_editor(
912
+ st.session_state[data_key],
913
+ use_container_width=True,
914
+ num_rows="fixed",
915
+ column_config={
916
+ "مزرعه": st.column_config.TextColumn("مزرعه", disabled=True),
917
+ "ایستگاه 1": st.column_config.NumberColumn("ایستگاه 1", min_value=0, max_value=300, step=1),
918
+ "ایستگاه 2": st.column_config.NumberColumn("ایستگاه 2", min_value=0, max_value=300, step=1),
919
+ "ایستگاه 3": st.column_config.NumberColumn("ایستگاه 3", min_value=0, max_value=300, step=1),
920
+ "ایستگاه 4": st.column_config.NumberColumn("ایستگاه 4", min_value=0, max_value=300, step=1),
921
+ "ایستگاه 5": st.column_config.NumberColumn("ایستگاه 5", min_value=0, max_value=300, step=1),
922
+ "چاهک 1": st.column_config.NumberColumn("چاهک 1", min_value=0, max_value=300, step=1),
923
+ "چاهک 2": st.column_config.NumberColumn("چاهک 2", min_value=0, max_value=300, step=1),
924
+ "رطوبت غلاف فعلی": st.column_config.NumberColumn("رطوبت غلاف", min_value=0, max_value=100, step=1),
925
+ "نیتروژن فعلی": st.column_config.NumberColumn("نیتروژن", min_value=0, max_value=100, step=1),
926
+ "ارتفاع هفته جاری مزرعه": st.column_config.NumberColumn("میانگین ارتفاع", disabled=True),
927
+ },
928
+ hide_index=True
929
+ )
930
+
931
+ for i in range(len(edited_df)):
932
+ stations = [
933
+ edited_df.iloc[i]['ایستگاه 1'],
934
+ edited_df.iloc[i]['ایستگاه 2'],
935
+ edited_df.iloc[i]['ایستگاه 3'],
936
+ edited_df.iloc[i]['ایستگاه 4'],
937
+ edited_df.iloc[i]['ایستگاه 5']
938
+ ]
939
+ valid_stations = [s for s in stations if s > 0]
940
+ if valid_stations:
941
+ edited_df.iloc[i, edited_df.columns.get_loc('ارتفاع هفته جاری مزرعه')] = round(sum(valid_stations) / len(valid_stations), 1)
942
+
943
+ st.session_state[data_key] = edited_df
944
+
945
+ if st.button("ذخیره اطلاعات", use_container_width=True):
946
+ new_data = edited_df.copy()
947
+ new_data['هفته'] = int(selected_week)
948
+ new_data['تاریخ قرائت'] = (datetime.now() - timedelta(weeks=(22 - int(selected_week)))).strftime('%Y-%m-%d')
949
+ new_data['رقم'] = new_data['مزرعه'].map(farm_df.set_index('مزرعه')['رقم'])
950
+ new_data['سن'] = new_data['مزرعه'].map(farm_df.set_index('مزرعه')['سن'])
951
+ new_data['مساحت'] = new_data['مزرعه'].map(farm_df.set_index('مزرعه')['مساحت'])
952
+ new_data['کانال'] = new_data['مزرعه'].map(farm_df.set_index('مزرعه')['کانال'])
953
+ new_data['اداره'] = new_data['مزرعه'].map(farm_df.set_index('مزرعه')['اداره'])
954
+ new_data['سال'] = datetime.now().year
955
+
956
+ st.session_state.heights_df = pd.concat([st.session_state.heights_df, new_data], ignore_index=True)
957
+ st.success(f"داده‌های هفته {selected_week} برای روز {selected_day} با موفقیت ذخیره شدند.")
958
+ st.balloons()
959
+
960
+ with tab2:
961
+ st.markdown("### آپلود فایل اکسل")
962
+
963
+ uploaded_file = st.file_uploader("فایل اکسل خود را آپلود کنید", type=["xlsx", "xls", "csv"])
964
+
965
+ if uploaded_file is not None:
966
+ try:
967
+ if uploaded_file.name.endswith('.csv'):
968
+ df = pd.read_csv(uploaded_file, encoding='utf-8-sig')
969
+ else:
970
+ df = pd.read_excel(uploaded_file)
971
+ st.dataframe(df, use_container_width=True)
972
+
973
+ if st.button("ذخیره فایل", use_container_width=True):
974
+ st.session_state.heights_df = pd.concat([st.session_state.heights_df, df], ignore_index=True)
975
+ st.success("فایل با موفقیت ذخیره شد.")
976
+ st.balloons()
977
+ except Exception as e:
978
+ st.error(f"خطا در خواندن فایل: {e}")
979
+
980
+ st.markdown("### راهنمای فرمت فایل")
981
+ st.markdown("""
982
+ فایل اکسل باید شامل ستون‌های زیر باشد:
983
+
984
+ - مزرعه
985
+ - ایستگاه 1 تا ایستگاه 5
986
+ - چاهک 1 و چاهک 2
987
+ - رطوبت غلاف فعلی
988
+ - نیتروژن فعلی
989
+ """)
990
+
991
+ st.markdown("""
992
+ <div style="border: 2px dashed #1a8754; border-radius: 10px; padding: 40px; text-align: center; margin: 20px 0;">
993
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#1a8754" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
994
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
995
+ <polyline points="17 8 12 3 7 8"></polyline>
996
+ <line x1="12" y1="3" x2="12" y2="15"></line>
997
+ </svg>
998
+ <p style="margin-top: 10px; color: #1a8754;">فایل خود را اینجا رها کنید یا روی دکمه بالا کلیک کنید</p>
999
+ </div>
1000
+ """, unsafe_allow_html=True)
1001
+
1002
+ # صفحه تحلیل داده‌ها
1003
+ elif selected == "تحلیل داده‌ها":
1004
+ st.markdown("## تحلیل هوشمند داده‌ها")
1005
+
1006
+ col1, col2 = st.columns([1, 2])
1007
+
1008
+ with col1:
1009
+ st_lottie(lottie_analysis, height=200, key="analysis_animation")
1010
+
1011
+ with col2:
1012
+ st.markdown("""
1013
+ <div class="glass-card">
1014
+ <h3 style="background: linear-gradient(90deg, #1a8754 0%, #115740 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-weight: 700;">
1015
+ تحلیل پیشرفته داده‌های مزارع
1016
+ </h3>
1017
+ <p>در این بخش می‌توانید تحلیل‌های پیشرفته روی داده‌های مزارع انجام دهید و روندها و الگوهای مختلف را بررسی کنید.</p>
1018
+ </div>
1019
+ """, unsafe_allow_html=True)
1020
+
1021
+ tab1, tab2, tab3, tab4 = st.tabs(["تحلیل رشد", "مقایسه واریته‌ها", "تحلیل رطوبت", "پیش‌بینی"])
1022
+
1023
+ with tab1:
1024
+ st.markdown("### تحلیل رشد مزارع")
1025
+
1026
+ col1, col2 = st.columns(2)
1027
+
1028
+ with col1:
1029
+ selected_variety = st.selectbox(
1030
+ "انتخاب واریته",
1031
+ ["all"] + list(farm_df['رقم'].unique()),
1032
+ format_func=lambda x: "همه واریته‌ها" if x == "all" else x,
1033
+ key="growth_variety"
1034
+ )
1035
+
1036
+ with col2:
1037
+ selected_age = st.selectbox(
1038
+ "انتخاب سن",
1039
+ ["all"] + list(farm_df['سن'].unique()),
1040
+ format_func=lambda x: "همه سنین" if x == "all" else x,
1041
+ key="growth_age"
1042
+ )
1043
+
1044
+ growth_data = generate_real_growth_data(selected_variety, selected_age)
1045
+
1046
+ if growth_data['individual']:
1047
+ chart_data = []
1048
+ for farm_data in growth_data['individual']:
1049
+ for i, week in enumerate(farm_data['weeks']):
1050
+ chart_data.append({
1051
+ 'مزرعه': farm_data['farm_id'],
1052
+ 'هفته': week,
1053
+ 'ارتفاع': farm_data['heights'][i],
1054
+ 'رقم': farm_data['variety'],
1055
+ 'سن': farm_data['age']
1056
+ })
1057
+
1058
+ chart_df = pd.DataFrame(chart_data)
1059
+
1060
+ chart = alt.Chart(chart_df).mark_line(point=True).encode(
1061
+ x=alt.X('هفته:Q', title='هفته'),
1062
+ y=alt.Y('ارتفاع:Q', title='ارتفاع (سانتی‌متر)'),
1063
+ color=alt.Color('مزرعه:N', title='مزرعه'),
1064
+ tooltip=['مزرعه', 'هفته', 'ارتفاع', 'رقم', 'سن']
1065
+ ).properties(
1066
+ width='container',
1067
+ height=400,
1068
+ title='روند رشد مزارع بر اساس هفته'
1069
+ ).interactive()
1070
+
1071
+ st.altair_chart(chart, use_container_width=True)
1072
+
1073
+ st.markdown("### تحلیل نرخ رشد")
1074
+
1075
+ growth_rates = []
1076
+ for farm_data in growth_data['individual']:
1077
+ heights = farm_data['heights']
1078
+ for i in range(1, len(heights)):
1079
+ if heights[i] > 0 and heights[i-1] > 0:
1080
+ growth_rate = heights[i] - heights[i-1]
1081
+ growth_rates.append({
1082
+ 'مزرعه': farm_data['farm_id'],
1083
+ 'هفته': farm_data['weeks'][i],
1084
+ 'نرخ رشد': growth_rate,
1085
+ 'رقم': farm_data['variety'],
1086
+ 'سن': farm_data['age']
1087
+ })
1088
+
1089
+ growth_rate_df = pd.DataFrame(growth_rates)
1090
+
1091
+ chart = alt.Chart(growth_rate_df).mark_bar().encode(
1092
+ x=alt.X('هفته:O', title='هفته'),
1093
+ y=alt.Y('mean(نرخ رشد):Q', title='نرخ رشد (سانتی‌متر در هفته)'),
1094
+ color=alt.Color('مزرعه:N', title='مزرعه'),
1095
+ tooltip=['مزرعه', 'هفته', 'mean(نرخ رشد)']
1096
+ ).properties(
1097
+ width='container',
1098
+ height=400,
1099
+ title='نرخ رشد هفتگی مزارع'
1100
+ ).interactive()
1101
+
1102
+ st.altair_chart(chart, use_container_width=True)
1103
+ else:
1104
+ st.warning("داده‌ای برای نمایش وجود ندارد.")
1105
+
1106
+ with tab2:
1107
+ st.markdown("### مقایسه واریته‌ها")
1108
+
1109
+ variety_age_groups = farm_df.groupby(['رقم', 'سن']).size().reset_index(name='تعداد')
1110
+
1111
+ fig = px.density_heatmap(
1112
+ variety_age_groups,
1113
+ x='رقم',
1114
+ y='سن',
1115
+ z='تعداد',
1116
+ title='توزیع مزارع بر اساس واریته و سن',
1117
+ color_continuous_scale='Viridis'
1118
+ )
1119
+ fig.update_layout(
1120
+ font=dict(family="Vazirmatn"),
1121
+ template="plotly_white",
1122
+ xaxis_title="واریته",
1123
+ yaxis_title="سن"
1124
+ )
1125
+ st.plotly_chart(fig, use_container_width=True)
1126
+
1127
+ variety_heights = farm_df.groupby('رقم')['ارتفاع هفته جاری مزرعه'].apply(list).to_dict()
1128
+
1129
+ fig = go.Figure()
1130
+ for variety, heights in variety_heights.items():
1131
+ fig.add_trace(go.Box(
1132
+ y=heights,
1133
+ name=variety,
1134
+ boxpoints='outliers',
1135
+ marker_color=f'hsl({hash(variety) % 360}, 70%, 50%)'
1136
+ ))
1137
+ fig.update_layout(
1138
+ title='مقایسه ارتفاع بر اساس واریته',
1139
+ yaxis_title='ارتفاع (سانتی‌متر)',
1140
+ font=dict(family="Vazirmatn"),
1141
+ template="plotly_white",
1142
+ boxmode='group'
1143
+ )
1144
+ st.plotly_chart(fig, use_container_width=True)
1145
+
1146
+ variety_stats = {}
1147
+ for variety, heights in variety_heights.items():
1148
+ variety_stats[variety] = {
1149
+ 'میانگین': np.mean(heights),
1150
+ 'میانه': np.median(heights),
1151
+ 'انحراف معیار': np.std(heights),
1152
+ 'حداقل': np.min(heights),
1153
+ 'حداکثر': np.max(heights)
1154
+ }
1155
+ variety_stats_df = pd.DataFrame(variety_stats).T
1156
+ st.dataframe(variety_stats_df, use_container_width=True)
1157
+
1158
+ with tab3:
1159
+ st.markdown("### تحلیل رطوبت مزارع")
1160
+
1161
+ farms = farm_df['مزرعه'].unique()[:10]
1162
+ dates = pd.date_range(end=datetime.now(), periods=30, freq='D')
1163
+
1164
+ moisture_data = []
1165
+ for farm in farms:
1166
+ farm_data = farm_df[farm_df['مزرعه'] == farm]
1167
+ for date in dates:
1168
+ week_data = farm_data[farm_data['هفته'] == (date.isocalendar()[1] % 23 + 1)]
1169
+ moisture = week_data['رطوبت غلاف فعلی'].mean() if not week_data.empty else np.random.uniform(50, 80)
1170
+ moisture = max(0, min(100, moisture))
1171
+ moisture_data.append({
1172
+ 'مزرعه': farm,
1173
+ 'تاریخ': date,
1174
+ 'رطوبت': moisture
1175
+ })
1176
+
1177
+ moisture_df = pd.DataFrame(moisture_data)
1178
+
1179
+ fig = px.line(
1180
+ moisture_df,
1181
+ x='تاریخ',
1182
+ y='رطوبت',
1183
+ color='مزرعه',
1184
+ title='روند رطوبت مزارع در 30 روز گذشته',
1185
+ labels={'تاریخ': 'تاریخ', 'رطوبت': 'رطوبت (%)', 'مزرعه': 'مزرعه'}
1186
+ )
1187
+ fig.update_layout(
1188
+ font=dict(family="Vazirmatn"),
1189
+ template="plotly_white",
1190
+ hovermode="x unified"
1191
+ )
1192
+ st.plotly_chart(fig, use_container_width=True)
1193
+
1194
+ st.markdown("### همبستگی رطوبت و ارتفاع")
1195
+
1196
+ correlation_data = []
1197
+ for farm in farms:
1198
+ farm_data = farm_df[farm_df['مزرعه'] == farm]
1199
+ for _, row in farm_data.iterrows():
1200
+ correlation_data.append({
1201
+ 'مزرعه': farm,
1202
+ 'رطوبت': row['رطوبت غلاف فعلی'],
1203
+ 'ارتفاع': row['ارتفاع هفته جاری مزرعه']
1204
+ })
1205
+
1206
+ correlation_df = pd.DataFrame(correlation_data)
1207
+
1208
+ fig = px.scatter(
1209
+ correlation_df,
1210
+ x='رطوبت',
1211
+ y='ارتفاع',
1212
+ color='مزرعه',
1213
+ title='همبستگی بین رطوبت و ارتفاع',
1214
+ labels={'رطوبت': 'رطوبت (%)', 'ارتفاع': 'ارتفاع (سانتی‌متر)', 'مزرعه': 'مزرعه'},
1215
+ trendline='ols'
1216
+ )
1217
+ fig.update_layout(
1218
+ font=dict(family="Vazirmatn"),
1219
+ template="plotly_white"
1220
+ )
1221
+ st.plotly_chart(fig, use_container_width=True)
1222
+
1223
+ correlation = correlation_df['رطوبت'].corr(correlation_df['ارتفاع'])
1224
+ st.info(f"ضریب همبستگی بین رطوبت و ارتفاع: {correlation:.2f}")
1225
+
1226
+ with tab4:
1227
+ st.markdown("### پیش‌بینی رشد مزارع")
1228
+
1229
+ selected_farm_for_prediction = st.selectbox(
1230
+ "انتخاب مزرعه",
1231
+ options=farm_df['مزرعه'].tolist(),
1232
+ format_func=lambda x: f"مزرعه {x}"
1233
+ )
1234
+
1235
+ farm_data = farm_df[farm_df['مزرعه'] == selected_farm_for_prediction]
1236
+ historical_weeks = farm_data['هفته'].values
1237
+ historical_heights = farm_data['ارتفاع هفته جاری مزرعه'].values
1238
+
1239
+ if len(historical_weeks) > 1 and len(historical_heights) > 1:
1240
+ model = LinearRegression()
1241
+ model.fit(historical_weeks.reshape(-1, 1), historical_heights)
1242
+
1243
+ future_weeks = np.array(range(max(historical_weeks) + 1, 30)).reshape(-1, 1)
1244
+ future_heights = model.predict(future_weeks)
1245
+ lower_bound = future_heights - 15
1246
+ upper_bound = future_heights + 15
1247
+
1248
+ fig = go.Figure()
1249
+ fig.add_trace(go.Scatter(
1250
+ x=historical_weeks,
1251
+ y=historical_heights,
1252
+ mode='lines+markers',
1253
+ name='داده‌های تاریخی',
1254
+ line=dict(color='#1a8754', width=3),
1255
+ marker=dict(size=8, color='#1a8754')
1256
+ ))
1257
+ fig.add_trace(go.Scatter(
1258
+ x=future_weeks.flatten(),
1259
+ y=future_heights,
1260
+ mode='lines',
1261
+ name='پیش‌بینی',
1262
+ line=dict(color='#1976d2', width=3, dash='dash')
1263
+ ))
1264
+ fig.add_trace(go.Scatter(
1265
+ x=future_weeks.flatten(),
1266
+ y=lower_bound,
1267
+ mode='lines',
1268
+ name='حد پایین',
1269
+ line=dict(color='#d32f2f', width=1, dash='dot'),
1270
+ showlegend=True
1271
+ ))
1272
+ fig.add_trace(go.Scatter(
1273
+ x=future_weeks.flatten(),
1274
+ y=upper_bound,
1275
+ mode='lines',
1276
+ name='حد بالا',
1277
+ line=dict(color='#d32f2f', width=1, dash='dot'),
1278
+ fill='tonexty',
1279
+ showlegend=True
1280
+ ))
1281
+ fig.update_layout(
1282
+ title=f'پیش‌بینی رشد مزرعه {selected_farm_for_prediction}',
1283
+ xaxis_title='هفته',
1284
+ yaxis_title='ارتفاع (سانتی‌متر)',
1285
+ font=dict(family='Vazirmatn', size=14),
1286
+ hovermode='x unified',
1287
+ template='plotly_white',
1288
+ height=500
1289
+ )
1290
+ st.plotly_chart(fig, use_container_width=True)
1291
+ else:
1292
+ st.warning("داده‌های کافی برای پیش‌بینی وجود ندارد.")
1293
+
1294
+ # صفحه گزارش‌گیری
1295
+ elif selected == "گزارش‌گیری":
1296
+ st.markdown("## گزارش‌گیری")
1297
+
1298
+ report_week = st.selectbox("انتخاب هفته برای گزارش", options=[str(i) for i in range(1, 23)])
1299
+ report_day = st.selectbox("انتخاب روز برای گزارش", options=day_df['روز'].unique().tolist())
1300
+
1301
+ report_df = st.session_state.heights_df[
1302
+ (st.session_state.heights_df['هفته'] == int(report_week)) &
1303
+ (st.session_state.heights_df['مزرعه'].isin(day_df[day_df['روز'] == report_day]['مزرعه']))
1304
+ ]
1305
+
1306
+ if not report_df.empty:
1307
+ st.markdown(f"### گزارش هفته {report_week} - روز {report_day}")
1308
+ st.dataframe(report_df, use_container_width=True)
1309
+
1310
+ csv = report_df.to_csv(index=False).encode('utf-8-sig')
1311
+ st.download_button(
1312
+ label="دانلود گزارش (CSV)",
1313
+ data=csv,
1314
+ file_name=f"report_week_{report_week}_day_{report_day}.csv",
1315
+ mime="text/csv",
1316
+ )
1317
+
1318
+ st_lottie(lottie_report, height=200, key="report_animation")
1319
+ else:
1320
+ st.warning(f"داده‌ای برای هفته {report_week} و روز {report_day} یافت نشد.")
1321
+
1322
+ # صفحه تنظیمات
1323
+ elif selected == "تنظیمات":
1324
+ st.markdown("## تنظیمات سامانه")
1325
+
1326
+ st.markdown("""
1327
+ <div class="glass-card">
1328
+ <h3 style="background: linear-gradient(90deg, #1a8754 0%, #115740 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-weight: 700;">
1329
+ تنظیمات پیشرفته
1330
+ </h3>
1331
+ <p>در این بخش می‌توانید تنظیمات کلی سامانه، از جمله به‌روزرسانی داده‌ها و پیکربندی‌های پیشرفته را مدیریت کنید.</p>
1332
+ </div>
1333
+ """, unsafe_allow_html=True)
1334
+
1335
+ st.markdown("### به‌روزرسانی داده‌ها")
1336
+
1337
+ if st.button("بارگذاری مجدد داده‌ها", use_container_width=True):
1338
+ st.session_state.heights_df = load_farm_data()
1339
+ st.success("داده‌ها با موفقیت به‌روزرسانی شدند.")
1340
+
1341
+ st.markdown("### تنظیمات ظاهری")
1342
+
1343
+ theme = st.radio(
1344
+ "انتخاب تم",
1345
+ options=["سبز (پیش‌فرض)", "آبی", "سفید"],
1346
+ format_func=lambda x: x
1347
+ )
1348
+
1349
+ if theme == "آبی":
1350
+ st.markdown("""
1351
+ <style>
1352
+ .main-header {background: linear-gradient(90deg, #1976d2 0%, #0d47a1 100%);}
1353
+ .metric-card .metric-value {color: #1976d2;}
1354
+ .stButton>button {background: linear-gradient(90deg, #1976d2 0%, #0d47a1 100%);}
1355
+ </style>
1356
+ """, unsafe_allow_html=True)
1357
+ elif theme == "سفید":
1358
+ st.markdown("""
1359
+ <style>
1360
+ .main-header {background: linear-gradient(90deg, #ffffff 0%, #f5f5f5 100%);}
1361
+ .metric-card .metric-value {color: #333333;}
1362
+ .stButton>button {background: linear-gradient(90deg, #ffffff 0%, #f5f5f5 100%); color: #333333;}
1363
+ </style>
1364
+ """, unsafe_allow_html=True)
1365
+
1366
+ st.markdown("### اطلاعات تماس")
1367
+ st.markdown("""
1368
+ <div style="background: #f0f0f3; border-radius: 12px; box-shadow: 10px 10px 20px #d1d1d4, -10px -10px 20px #ffffff; padding: 1.5rem;">
1369
+ <p>برای پشتیبانی یا مشکلات فنی، با ما تماس بگیرید:</p>
1370
+ <p>ایمیل: [email protected]</p>
1371
+ <p>تلفن: +98 21 12345678</p>
1372
+ </div>
1373
+ """, unsafe_allow_html=True)
1374
+
1375
+ # فوتر
1376
+ st.markdown("""
1377
+ <footer>
1378
+ <p>© 2025 سامانه هوشمند پایش مزارع نیشکر دهخدا. تمامی حقوق محفوظ است.</p>
1379
+ </footer>
1380
  """, unsafe_allow_html=True)