import gradio as gr import pandas as pd import plotly.graph_objects as go import plotly.express as px from datetime import datetime, timedelta import json import os from typing import Dict, List, Any from chicken_ai import AdvancedChickenAI class AdminPanel: def __init__(self): self.ai = AdvancedChickenAI() self.data_dir = "/home/ubuntu/chicken_assistant/admin_data" self.ensure_data_directory() def ensure_data_directory(self): """التأكد من وجود مجلد البيانات""" os.makedirs(self.data_dir, exist_ok=True) # إنشاء ملفات البيانات الأساسية إذا لم تكن موجودة default_files = { "users.json": [], "farm_settings.json": { "farm_name": "مزرعة الدجاج الذكية", "location": "", "capacity": 1000, "established_date": datetime.now().strftime("%Y-%m-%d") }, "alerts.json": [], "reports.json": [] } for filename, default_content in default_files.items(): filepath = os.path.join(self.data_dir, filename) if not os.path.exists(filepath): with open(filepath, 'w', encoding='utf-8') as f: json.dump(default_content, f, ensure_ascii=False, indent=2) def load_data(self, filename: str) -> Any: """تحميل البيانات من ملف""" filepath = os.path.join(self.data_dir, filename) try: with open(filepath, 'r', encoding='utf-8') as f: return json.load(f) except: return [] def save_data(self, filename: str, data: Any) -> bool: """حفظ البيانات في ملف""" filepath = os.path.join(self.data_dir, filename) try: with open(filepath, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) return True except: return False def add_disease(self, name: str, symptoms: str, treatment: str, prevention: str, hygiene: str) -> str: """إضافة مرض جديد""" if not all([name, symptoms, treatment, prevention, hygiene]): return "❌ يرجى ملء جميع الحقول المطلوبة" # تحديث قاعدة بيانات الأمراض symptoms_list = [s.strip() for s in symptoms.split(',')] weights = {symptom: 0.8 for symptom in symptoms_list} # وزن افتراضي self.ai.diseases_db[name] = { "symptoms": symptoms_list, "probability_weights": weights, "treatment": treatment, "prevention": prevention, "hygiene": hygiene } # حفظ في ملف منفصل للأمراض المخصصة custom_diseases = self.load_data("custom_diseases.json") custom_diseases[name] = self.ai.diseases_db[name] self.save_data("custom_diseases.json", custom_diseases) return f"✅ تم إضافة المرض '{name}' بنجاح!" def add_breed(self, name: str, breed_type: str, egg_production: str, characteristics: str, immunity: str) -> str: """إضافة سلالة جديدة""" if not all([name, breed_type, characteristics, immunity]): return "❌ يرجى ملء جميع الحقول المطلوبة" breed_info = { "type": breed_type, "characteristics": characteristics, "immunity": immunity } if egg_production: breed_info["egg_production"] = egg_production breed_info["egg_color"] = "غير محدد" self.ai.breeds_db[name] = breed_info # حفظ في ملف منفصل للسلالات المخصصة custom_breeds = self.load_data("custom_breeds.json") custom_breeds[name] = breed_info self.save_data("custom_breeds.json", custom_breeds) return f"✅ تم إضافة السلالة '{name}' بنجاح!" def generate_farm_report(self) -> str: """إنشاء تقرير شامل للمزرعة""" # تحميل بيانات الإنتاج production_file = "/home/ubuntu/chicken_assistant/production_data.json" if os.path.exists(production_file): with open(production_file, 'r', encoding='utf-8') as f: production_data = json.load(f) else: production_data = [] if not production_data: return "📊 لا توجد بيانات إنتاج متاحة لإنشاء التقرير" # حساب الإحصائيات total_eggs = sum(record.get('eggs', 0) for record in production_data) total_feed = sum(record.get('feed', 0) for record in production_data) days_count = len(production_data) avg_eggs_per_day = total_eggs / days_count if days_count > 0 else 0 avg_feed_per_day = total_feed / days_count if days_count > 0 else 0 # حساب كفاءة التحويل feed_conversion_ratio = total_feed / total_eggs if total_eggs > 0 else 0 # تحليل الاتجاهات recent_data = production_data[-7:] if len(production_data) >= 7 else production_data recent_avg_eggs = sum(record.get('eggs', 0) for record in recent_data) / len(recent_data) trend = "📈 متزايد" if recent_avg_eggs > avg_eggs_per_day else "📉 متناقص" if recent_avg_eggs < avg_eggs_per_day else "➡️ مستقر" report = f""" # 📊 تقرير أداء المزرعة الشامل ## 📈 إحصائيات الإنتاج العامة - **فترة التقرير:** {days_count} يوم - **إجمالي إنتاج البيض:** {total_eggs:,} بيضة - **متوسط الإنتاج اليومي:** {avg_eggs_per_day:.1f} بيضة/يوم - **إجمالي استهلاك العلف:** {total_feed:.1f} كجم - **متوسط استهلاك العلف:** {avg_feed_per_day:.1f} كجم/يوم ## 🔄 كفاءة التحويل - **معدل تحويل العلف:** {feed_conversion_ratio:.2f} كجم علف/بيضة - **الاتجاه الحالي:** {trend} ## 📊 تحليل الأداء - **أعلى إنتاج يومي:** {max(record.get('eggs', 0) for record in production_data)} بيضة - **أقل إنتاج يومي:** {min(record.get('eggs', 0) for record in production_data)} بيضة - **متوسط الأسبوع الأخير:** {recent_avg_eggs:.1f} بيضة/يوم ## 💡 التوصيات """ # إضافة توصيات بناءً على الأداء if feed_conversion_ratio > 0.15: report += "- ⚠️ معدل تحويل العلف مرتفع، يُنصح بمراجعة جودة العلف ونوعه\n" if recent_avg_eggs < avg_eggs_per_day * 0.9: report += "- 📉 انخفاض في الإنتاج مؤخراً، يُنصح بفحص صحة القطيع\n" if avg_eggs_per_day < 0.7: # أقل من 70% إنتاج report += "- 🔍 إنتاجية منخفضة، يُنصح بمراجعة التغذية والإضاءة\n" report += f"\n**تاريخ التقرير:** {datetime.now().strftime('%Y-%m-%d %H:%M')}" # حفظ التقرير reports = self.load_data("reports.json") reports.append({ "date": datetime.now().isoformat(), "type": "farm_performance", "content": report }) self.save_data("reports.json", reports) return report def create_alert(self, alert_type: str, message: str, priority: str) -> str: """إنشاء تنبيه جديد""" if not all([alert_type, message, priority]): return "❌ يرجى ملء جميع الحقول" alerts = self.load_data("alerts.json") new_alert = { "id": len(alerts) + 1, "type": alert_type, "message": message, "priority": priority, "created_at": datetime.now().isoformat(), "status": "active" } alerts.append(new_alert) self.save_data("alerts.json", alerts) priority_emoji = {"عالي": "🔴", "متوسط": "🟡", "منخفض": "🟢"} return f"✅ تم إنشاء التنبيه بنجاح!\n{priority_emoji.get(priority, '⚪')} {alert_type}: {message}" def get_active_alerts(self) -> str: """الحصول على التنبيهات النشطة""" alerts = self.load_data("alerts.json") active_alerts = [alert for alert in alerts if alert.get("status") == "active"] if not active_alerts: return "✅ لا توجد تنبيهات نشطة حالياً" output = "## 🚨 التنبيهات النشطة\n\n" priority_emoji = {"عالي": "🔴", "متوسط": "🟡", "منخفض": "🟢"} for alert in sorted(active_alerts, key=lambda x: x.get("created_at", ""), reverse=True): emoji = priority_emoji.get(alert.get("priority", ""), "⚪") created_date = datetime.fromisoformat(alert.get("created_at", "")).strftime("%Y-%m-%d %H:%M") output += f"### {emoji} {alert.get('type', 'غير محدد')}\n" output += f"**الرسالة:** {alert.get('message', '')}\n" output += f"**الأولوية:** {alert.get('priority', 'غير محدد')}\n" output += f"**التاريخ:** {created_date}\n\n" output += "---\n\n" return output def update_farm_settings(self, farm_name: str, location: str, capacity: int) -> str: """تحديث إعدادات المزرعة""" if not farm_name: return "❌ اسم المزرعة مطلوب" settings = self.load_data("farm_settings.json") settings.update({ "farm_name": farm_name, "location": location, "capacity": capacity, "last_updated": datetime.now().isoformat() }) if self.save_data("farm_settings.json", settings): return f"✅ تم تحديث إعدادات المزرعة بنجاح!\nالاسم: {farm_name}\nالموقع: {location}\nالسعة: {capacity:,} طائر" else: return "❌ حدث خطأ في حفظ الإعدادات" # إنشاء مثيل من لوحة الإدارة admin = AdminPanel() def create_admin_interface(): """إنشاء واجهة لوحة الإدارة""" with gr.Blocks( title="🛠️ لوحة التحكم الإدارية - مساعد تربية الدجاج", theme=gr.themes.Soft( primary_hue="blue", secondary_hue="emerald", neutral_hue="slate", font=[gr.themes.GoogleFont("Cairo"), "Arial", "sans-serif"] ), css=""" .admin-header { background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%); color: white; padding: 2rem; border-radius: 15px; margin-bottom: 2rem; text-align: center; } .admin-card { background: white; border-radius: 12px; padding: 1.5rem; box-shadow: 0 4px 15px rgba(0,0,0,0.1); border: 1px solid #e2e8f0; margin-bottom: 1rem; } .metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1rem 0; } .metric-item { background: linear-gradient(135deg, #3b82f6 0%, #1e40af 100%); color: white; padding: 1rem; border-radius: 10px; text-align: center; } """ ) as admin_app: # العنوان الرئيسي gr.HTML("""

🛠️ لوحة التحكم الإدارية

إدارة شاملة لنظام مساعد تربية الدجاج الذكي

""") with gr.Tabs() as admin_tabs: # تبويب إدارة المحتوى with gr.Tab("📝 إدارة المحتوى"): gr.HTML("
") gr.Markdown("### 🦠 إضافة مرض جديد") with gr.Row(): with gr.Column(): disease_name = gr.Textbox(label="اسم المرض", placeholder="مثال: إنفلونزا الطيور") disease_symptoms = gr.Textbox( label="الأعراض (مفصولة بفواصل)", placeholder="خمول، حمى، صعوبة تنفس", lines=2 ) disease_treatment = gr.Textbox( label="العلاج", placeholder="وصف العلاج المناسب...", lines=3 ) with gr.Column(): disease_prevention = gr.Textbox( label="الوقاية", placeholder="إجراءات الوقاية...", lines=3 ) disease_hygiene = gr.Textbox( label="النظافة", placeholder="إجراءات النظافة المطلوبة...", lines=3 ) add_disease_btn = gr.Button("➕ إضافة المرض", variant="primary", size="lg") disease_status = gr.Markdown() gr.HTML("
") gr.HTML("
") gr.Markdown("### 🐔 إضافة سلالة جديدة") with gr.Row(): with gr.Column(): breed_name = gr.Textbox(label="اسم السلالة", placeholder="مثال: براهما") breed_type = gr.Dropdown( label="نوع السلالة", choices=["بياض", "لاحم", "ثنائي الغرض", "زينة"], value="بياض" ) breed_egg_production = gr.Textbox( label="إنتاج البيض (اختياري)", placeholder="200-250 بيضة/سنة" ) with gr.Column(): breed_characteristics = gr.Textbox( label="الخصائص", placeholder="وصف خصائص السلالة...", lines=3 ) breed_immunity = gr.Dropdown( label="مستوى المناعة", choices=["ممتازة", "جيدة", "متوسطة", "ضعيفة"], value="جيدة" ) add_breed_btn = gr.Button("➕ إضافة السلالة", variant="primary", size="lg") breed_status = gr.Markdown() gr.HTML("
") # تبويب التقارير والإحصائيات with gr.Tab("📊 التقارير والإحصائيات"): gr.HTML("
") gr.Markdown("### 📈 تقارير الأداء") generate_report_btn = gr.Button("📊 إنشاء تقرير شامل", variant="primary", size="lg") farm_report_output = gr.Markdown() gr.HTML("
") # تبويب التنبيهات with gr.Tab("🚨 إدارة التنبيهات"): gr.HTML("
") gr.Markdown("### ➕ إنشاء تنبيه جديد") with gr.Row(): with gr.Column(): alert_type = gr.Dropdown( label="نوع التنبيه", choices=["صحة القطيع", "نقص العلف", "انخفاض الإنتاج", "صيانة المعدات", "أخرى"], value="صحة القطيع" ) alert_priority = gr.Dropdown( label="الأولوية", choices=["عالي", "متوسط", "منخفض"], value="متوسط" ) with gr.Column(): alert_message = gr.Textbox( label="رسالة التنبيه", placeholder="وصف التنبيه...", lines=3 ) create_alert_btn = gr.Button("🚨 إنشاء التنبيه", variant="primary", size="lg") alert_status = gr.Markdown() gr.HTML("
") gr.HTML("
") gr.Markdown("### 📋 التنبيهات النشطة") refresh_alerts_btn = gr.Button("🔄 تحديث التنبيهات", variant="secondary") active_alerts_output = gr.Markdown() gr.HTML("
") # تبويب إعدادات المزرعة with gr.Tab("⚙️ إعدادات المزرعة"): gr.HTML("
") gr.Markdown("### 🏠 معلومات المزرعة") # تحميل الإعدادات الحالية current_settings = admin.load_data("farm_settings.json") with gr.Row(): with gr.Column(): farm_name_input = gr.Textbox( label="اسم المزرعة", value=current_settings.get("farm_name", ""), placeholder="اسم المزرعة" ) farm_location_input = gr.Textbox( label="الموقع", value=current_settings.get("location", ""), placeholder="المدينة، البلد" ) with gr.Column(): farm_capacity_input = gr.Number( label="السعة (عدد الطيور)", value=current_settings.get("capacity", 1000), minimum=1 ) update_settings_btn = gr.Button("💾 حفظ الإعدادات", variant="primary", size="lg") settings_status = gr.Markdown() gr.HTML("
") # ربط الأحداث add_disease_btn.click( fn=admin.add_disease, inputs=[disease_name, disease_symptoms, disease_treatment, disease_prevention, disease_hygiene], outputs=[disease_status] ) add_breed_btn.click( fn=admin.add_breed, inputs=[breed_name, breed_type, breed_egg_production, breed_characteristics, breed_immunity], outputs=[breed_status] ) generate_report_btn.click( fn=admin.generate_farm_report, outputs=[farm_report_output] ) create_alert_btn.click( fn=admin.create_alert, inputs=[alert_type, alert_message, alert_priority], outputs=[alert_status] ) refresh_alerts_btn.click( fn=admin.get_active_alerts, outputs=[active_alerts_output] ) update_settings_btn.click( fn=admin.update_farm_settings, inputs=[farm_name_input, farm_location_input, farm_capacity_input], outputs=[settings_status] ) # تحميل التنبيهات عند بدء التطبيق admin_app.load(fn=admin.get_active_alerts, outputs=[active_alerts_output]) return admin_app if __name__ == "__main__": admin_interface = create_admin_interface() admin_interface.launch( server_name="0.0.0.0", server_port=7861, share=False, show_error=True )