Wahbi-AI / pricing_system /modules /catalogs /equipment_catalog.py
EGYADMIN's picture
Upload 70 files
d9e7bdd verified
raw
history blame
78.4 kB
"""
كتالوج المعدات - وحدة إدارة معدات المقاولات
"""
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import os
import json
from datetime import datetime
import io
class EquipmentCatalog:
"""كتالوج المعدات"""
def __init__(self):
"""تهيئة كتالوج المعدات"""
# تهيئة حالة الجلسة لكتالوج المعدات
if 'equipment_catalog' not in st.session_state:
# إنشاء بيانات افتراضية للمعدات
self._initialize_equipment_catalog()
def _initialize_equipment_catalog(self):
"""تهيئة بيانات كتالوج المعدات"""
# تعريف فئات المعدات
equipment_categories = [
"معدات الحفر والردم",
"معدات النقل",
"معدات الرفع",
"معدات الخرسانة",
"معدات الطرق",
"معدات الصرف الصحي",
"معدات السيول والكباري",
"معدات الضغط والتثبيت",
"معدات التوليد والطاقة",
"معدات القياس والمساحة"
]
# إنشاء قائمة المعدات
equipment_data = []
# 1. معدات الحفر والردم
equipment_data.extend([
{
"id": "EQ-001",
"name": "حفارة هيدروليكية كبيرة",
"category": "معدات الحفر والردم",
"subcategory": "حفارات",
"brand": "كاتربيلر",
"model": "CAT 336",
"capacity": "2.5 م3",
"production_rate": "150 م3/ساعة",
"hourly_cost": 350,
"daily_cost": 2800,
"weekly_cost": 16800,
"monthly_cost": 67200,
"fuel_consumption": "35 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 5000,
"operator_required": True,
"description": "حفارة هيدروليكية كبيرة مناسبة لأعمال الحفر الثقيلة ومشاريع البنية التحتية الكبيرة",
"image_url": "https://example.com/cat336.jpg"
},
{
"id": "EQ-002",
"name": "حفارة هيدروليكية متوسطة",
"category": "معدات الحفر والردم",
"subcategory": "حفارات",
"brand": "كاتربيلر",
"model": "CAT 320",
"capacity": "1.5 م3",
"production_rate": "100 م3/ساعة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "25 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3500,
"operator_required": True,
"description": "حفارة هيدروليكية متوسطة الحجم مناسبة لمعظم مشاريع البنية التحتية",
"image_url": "https://example.com/cat320.jpg"
},
{
"id": "EQ-003",
"name": "حفارة هيدروليكية صغيرة",
"category": "معدات الحفر والردم",
"subcategory": "حفارات",
"brand": "كاتربيلر",
"model": "CAT 308",
"capacity": "0.8 م3",
"production_rate": "50 م3/ساعة",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "15 لتر/ساعة",
"maintenance_period": "200 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "حفارة هيدروليكية صغيرة مناسبة للمشاريع الصغيرة والمساحات الضيقة",
"image_url": "https://example.com/cat308.jpg"
},
{
"id": "EQ-004",
"name": "بلدوزر كبير",
"category": "معدات الحفر والردم",
"subcategory": "بلدوزرات",
"brand": "كاتربيلر",
"model": "D9",
"capacity": "13.5 م3",
"production_rate": "300 م3/ساعة",
"hourly_cost": 400,
"daily_cost": 3200,
"weekly_cost": 19200,
"monthly_cost": 76800,
"fuel_consumption": "45 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 6000,
"operator_required": True,
"description": "بلدوزر كبير لأعمال التسوية والدفع في المشاريع الكبيرة",
"image_url": "https://example.com/catd9.jpg"
},
{
"id": "EQ-005",
"name": "بلدوزر متوسط",
"category": "معدات الحفر والردم",
"subcategory": "بلدوزرات",
"brand": "كاتربيلر",
"model": "D7",
"capacity": "8.5 م3",
"production_rate": "200 م3/ساعة",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "35 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 4500,
"operator_required": True,
"description": "بلدوزر متوسط الحجم مناسب لمعظم مشاريع البنية التحتية",
"image_url": "https://example.com/catd7.jpg"
},
{
"id": "EQ-006",
"name": "لودر أمامي كبير",
"category": "معدات الحفر والردم",
"subcategory": "لودرات",
"brand": "كاتربيلر",
"model": "980",
"capacity": "5.5 م3",
"production_rate": "250 م3/ساعة",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "30 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 4000,
"operator_required": True,
"description": "لودر أمامي كبير لأعمال التحميل في المشاريع الكبيرة",
"image_url": "https://example.com/cat980.jpg"
},
{
"id": "EQ-007",
"name": "لودر أمامي متوسط",
"category": "معدات الحفر والردم",
"subcategory": "لودرات",
"brand": "كاتربيلر",
"model": "950",
"capacity": "3.5 م3",
"production_rate": "180 م3/ساعة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "25 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3500,
"operator_required": True,
"description": "لودر أمامي متوسط الحجم مناسب لمعظم مشاريع البنية التحتية",
"image_url": "https://example.com/cat950.jpg"
},
{
"id": "EQ-008",
"name": "باكهو لودر",
"category": "معدات الحفر والردم",
"subcategory": "لودرات",
"brand": "جي سي بي",
"model": "3CX",
"capacity": "1.0 م3",
"production_rate": "60 م3/ساعة",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "12 لتر/ساعة",
"maintenance_period": "200 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "باكهو لودر متعدد الاستخدامات للحفر والتحميل",
"image_url": "https://example.com/jcb3cx.jpg"
},
{
"id": "EQ-009",
"name": "جريدر",
"category": "معدات الحفر والردم",
"subcategory": "معدات تسوية",
"brand": "كاتربيلر",
"model": "140",
"capacity": "3.7 م عرض الشفرة",
"production_rate": "2000 م2/ساعة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "جريدر لتسوية الطرق والمساحات",
"image_url": "https://example.com/cat140.jpg"
},
{
"id": "EQ-010",
"name": "سكريبر",
"category": "معدات الحفر والردم",
"subcategory": "معدات تسوية",
"brand": "كاتربيلر",
"model": "621",
"capacity": "21 م3",
"production_rate": "400 م3/ساعة",
"hourly_cost": 350,
"daily_cost": 2800,
"weekly_cost": 16800,
"monthly_cost": 67200,
"fuel_consumption": "35 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 5000,
"operator_required": True,
"description": "سكريبر لنقل وتسوية التربة لمسافات متوسطة",
"image_url": "https://example.com/cat621.jpg"
}
])
# 2. معدات النقل
equipment_data.extend([
{
"id": "EQ-011",
"name": "شاحنة قلاب كبيرة",
"category": "معدات النقل",
"subcategory": "شاحنات قلاب",
"brand": "مان",
"model": "TGS 40.480",
"capacity": "30 م3",
"production_rate": "30 م3/رحلة",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "25 لتر/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "شاحنة قلاب كبيرة لنقل مواد الحفر والردم",
"image_url": "https://example.com/mantgs.jpg"
},
{
"id": "EQ-012",
"name": "شاحنة قلاب متوسطة",
"category": "معدات النقل",
"subcategory": "شاحنات قلاب",
"brand": "مرسيدس",
"model": "Actros 3341",
"capacity": "20 م3",
"production_rate": "20 م3/رحلة",
"hourly_cost": 180,
"daily_cost": 1440,
"weekly_cost": 8640,
"monthly_cost": 34560,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 2500,
"operator_required": True,
"description": "شاحنة قلاب متوسطة لنقل مواد الحفر والردم",
"image_url": "https://example.com/actros.jpg"
},
{
"id": "EQ-013",
"name": "شاحنة خلاطة خرسانة",
"category": "معدات النقل",
"subcategory": "شاحنات خرسانة",
"brand": "مرسيدس",
"model": "Actros 3236",
"capacity": "8 م3",
"production_rate": "8 م3/رحلة",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "شاحنة خلاطة خرسانة لنقل الخرسانة الجاهزة",
"image_url": "https://example.com/mixer.jpg"
},
{
"id": "EQ-014",
"name": "شاحنة نقل مياه",
"category": "معدات النقل",
"subcategory": "شاحنات مياه",
"brand": "مان",
"model": "TGS 33.360",
"capacity": "20000 لتر",
"production_rate": "20000 لتر/رحلة",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "18 لتر/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "شاحنة نقل مياه للمشاريع والرش",
"image_url": "https://example.com/watertruck.jpg"
},
{
"id": "EQ-015",
"name": "شاحنة نقل معدات",
"category": "معدات النقل",
"subcategory": "شاحنات نقل",
"brand": "فولفو",
"model": "FH16",
"capacity": "60 طن",
"production_rate": "60 طن/رحلة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "25 لتر/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 3500,
"operator_required": True,
"description": "شاحنة نقل معدات ثقيلة (لوبد)",
"image_url": "https://example.com/lowbed.jpg"
}
])
# 3. معدات الرفع
equipment_data.extend([
{
"id": "EQ-016",
"name": "رافعة برجية",
"category": "معدات الرفع",
"subcategory": "رافعات برجية",
"brand": "ليبهر",
"model": "200 EC-H",
"capacity": "10 طن",
"production_rate": "20 رفعة/ساعة",
"hourly_cost": 400,
"daily_cost": 3200,
"weekly_cost": 19200,
"monthly_cost": 76800,
"fuel_consumption": "30 كيلوواط/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 5000,
"operator_required": True,
"description": "رافعة برجية للمشاريع الإنشائية الكبيرة",
"image_url": "https://example.com/towercrane.jpg"
},
{
"id": "EQ-017",
"name": "رافعة متحركة كبيرة",
"category": "معدات الرفع",
"subcategory": "رافعات متحركة",
"brand": "ليبهر",
"model": "LTM 1200",
"capacity": "200 طن",
"production_rate": "15 رفعة/ساعة",
"hourly_cost": 600,
"daily_cost": 4800,
"weekly_cost": 28800,
"monthly_cost": 115200,
"fuel_consumption": "40 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 8000,
"operator_required": True,
"description": "رافعة متحركة كبيرة للأحمال الثقيلة",
"image_url": "https://example.com/mobilecrane.jpg"
},
{
"id": "EQ-018",
"name": "رافعة متحركة متوسطة",
"category": "معدات الرفع",
"subcategory": "رافعات متحركة",
"brand": "ليبهر",
"model": "LTM 1070",
"capacity": "70 طن",
"production_rate": "15 رفعة/ساعة",
"hourly_cost": 400,
"daily_cost": 3200,
"weekly_cost": 19200,
"monthly_cost": 76800,
"fuel_consumption": "30 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 6000,
"operator_required": True,
"description": "رافعة متحركة متوسطة للاستخدامات المتنوعة",
"image_url": "https://example.com/mobilecrane2.jpg"
},
{
"id": "EQ-019",
"name": "رافعة شوكية",
"category": "معدات الرفع",
"subcategory": "رافعات شوكية",
"brand": "كاتربيلر",
"model": "DP70N",
"capacity": "7 طن",
"production_rate": "30 رفعة/ساعة",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "12 لتر/ساعة",
"maintenance_period": "200 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "رافعة شوكية لنقل المواد في الموقع",
"image_url": "https://example.com/forklift.jpg"
},
{
"id": "EQ-020",
"name": "رافعة سلة",
"category": "معدات الرفع",
"subcategory": "رافعات سلة",
"brand": "جيني",
"model": "S-85",
"capacity": "227 كجم",
"production_rate": "ارتفاع 26 متر",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "10 لتر/ساعة",
"maintenance_period": "200 ساعة",
"maintenance_cost": 2500,
"operator_required": True,
"description": "رافعة سلة للوصول إلى الارتفاعات",
"image_url": "https://example.com/boomlift.jpg"
}
])
# 4. معدات الخرسانة
equipment_data.extend([
{
"id": "EQ-021",
"name": "خلاطة خرسانة مركزية",
"category": "معدات الخرسانة",
"subcategory": "خلاطات",
"brand": "ليبهر",
"model": "Betomix 3.0",
"capacity": "120 م3/ساعة",
"production_rate": "120 م3/ساعة",
"hourly_cost": 800,
"daily_cost": 6400,
"weekly_cost": 38400,
"monthly_cost": 153600,
"fuel_consumption": "60 كيلوواط/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 10000,
"operator_required": True,
"description": "محطة خلط خرسانة مركزية للمشاريع الكبيرة",
"image_url": "https://example.com/batchplant.jpg"
},
{
"id": "EQ-022",
"name": "خلاطة خرسانة متنقلة",
"category": "معدات الخرسانة",
"subcategory": "خلاطات",
"brand": "كارمكس",
"model": "MCP-30",
"capacity": "30 م3/ساعة",
"production_rate": "30 م3/ساعة",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "25 كيلوواط/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 5000,
"operator_required": True,
"description": "محطة خلط خرسانة متنقلة للمشاريع المتوسطة",
"image_url": "https://example.com/mobilemixer.jpg"
},
{
"id": "EQ-023",
"name": "مضخة خرسانة ثابتة",
"category": "معدات الخرسانة",
"subcategory": "مضخات",
"brand": "بوتزميستر",
"model": "BSA 1409",
"capacity": "90 م3/ساعة",
"production_rate": "90 م3/ساعة",
"hourly_cost": 350,
"daily_cost": 2800,
"weekly_cost": 16800,
"monthly_cost": 67200,
"fuel_consumption": "30 كيلوواط/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 6000,
"operator_required": True,
"description": "مضخة خرسانة ثابتة للمشاريع الكبيرة",
"image_url": "https://example.com/concretepump.jpg"
},
{
"id": "EQ-024",
"name": "مضخة خرسانة متحركة",
"category": "معدات الخرسانة",
"subcategory": "مضخات",
"brand": "بوتزميستر",
"model": "M42-5",
"capacity": "160 م3/ساعة",
"production_rate": "160 م3/ساعة",
"hourly_cost": 500,
"daily_cost": 4000,
"weekly_cost": 24000,
"monthly_cost": 96000,
"fuel_consumption": "40 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 8000,
"operator_required": True,
"description": "مضخة خرسانة متحركة بذراع 42 متر",
"image_url": "https://example.com/boomconcretepump.jpg"
},
{
"id": "EQ-025",
"name": "هزاز خرسانة",
"category": "معدات الخرسانة",
"subcategory": "هزازات",
"brand": "واكر نيوسن",
"model": "IREN",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 20,
"daily_cost": 160,
"weekly_cost": 960,
"monthly_cost": 3840,
"fuel_consumption": "غير محدد",
"maintenance_period": "100 ساعة",
"maintenance_cost": 500,
"operator_required": True,
"description": "هزاز خرسانة لدمك الخرسانة",
"image_url": "https://example.com/vibrator.jpg"
},
{
"id": "EQ-026",
"name": "ماكينة تسوية الخرسانة",
"category": "معدات الخرسانة",
"subcategory": "معدات تشطيب",
"brand": "سومرو",
"model": "S-840",
"capacity": "840 م2/ساعة",
"production_rate": "840 م2/ساعة",
"hourly_cost": 100,
"daily_cost": 800,
"weekly_cost": 4800,
"monthly_cost": 19200,
"fuel_consumption": "5 لتر/ساعة",
"maintenance_period": "150 ساعة",
"maintenance_cost": 1500,
"operator_required": True,
"description": "ماكينة تسوية الخرسانة (هليكوبتر)",
"image_url": "https://example.com/powertrowel.jpg"
}
])
# 5. معدات الطرق
equipment_data.extend([
{
"id": "EQ-027",
"name": "فرادة أسفلت كبيرة",
"category": "معدات الطرق",
"subcategory": "فرادات",
"brand": "فوجيلي",
"model": "Super 2100-3i",
"capacity": "1100 طن/ساعة",
"production_rate": "1100 طن/ساعة",
"hourly_cost": 600,
"daily_cost": 4800,
"weekly_cost": 28800,
"monthly_cost": 115200,
"fuel_consumption": "45 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 8000,
"operator_required": True,
"description": "فرادة أسفلت كبيرة للطرق السريعة",
"image_url": "https://example.com/paver.jpg"
},
{
"id": "EQ-028",
"name": "فرادة أسفلت متوسطة",
"category": "معدات الطرق",
"subcategory": "فرادات",
"brand": "فوجيلي",
"model": "Super 1800-3i",
"capacity": "700 طن/ساعة",
"production_rate": "700 طن/ساعة",
"hourly_cost": 450,
"daily_cost": 3600,
"weekly_cost": 21600,
"monthly_cost": 86400,
"fuel_consumption": "35 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 6000,
"operator_required": True,
"description": "فرادة أسفلت متوسطة للطرق العامة",
"image_url": "https://example.com/paver2.jpg"
},
{
"id": "EQ-029",
"name": "مدحلة أسفلت ثقيلة",
"category": "معدات الطرق",
"subcategory": "مداحل",
"brand": "بوماج",
"model": "BW 203",
"capacity": "غير محدد",
"production_rate": "3000 م2/ساعة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3500,
"operator_required": True,
"description": "مدحلة أسفلت ثقيلة للطرق",
"image_url": "https://example.com/roller.jpg"
},
{
"id": "EQ-030",
"name": "مدحلة أسفلت مطاطية",
"category": "معدات الطرق",
"subcategory": "مداحل",
"brand": "بوماج",
"model": "BW 27 RH",
"capacity": "غير محدد",
"production_rate": "3500 م2/ساعة",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "18 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "مدحلة أسفلت مطاطية للطرق",
"image_url": "https://example.com/rubberroller.jpg"
},
{
"id": "EQ-031",
"name": "قاشطة أسفلت",
"category": "معدات الطرق",
"subcategory": "قاشطات",
"brand": "ويرتجن",
"model": "W 210",
"capacity": "غير محدد",
"production_rate": "800 م2/ساعة",
"hourly_cost": 500,
"daily_cost": 4000,
"weekly_cost": 24000,
"monthly_cost": 96000,
"fuel_consumption": "40 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 7000,
"operator_required": True,
"description": "قاشطة أسفلت لإزالة طبقات الأسفلت القديمة",
"image_url": "https://example.com/milling.jpg"
},
{
"id": "EQ-032",
"name": "شاحنة رش البيتومين",
"category": "معدات الطرق",
"subcategory": "معدات رش",
"brand": "روزنباور",
"model": "S12000",
"capacity": "12000 لتر",
"production_rate": "15000 م2/ساعة",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "15 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "شاحنة رش البيتومين للطرق",
"image_url": "https://example.com/bitumensprayer.jpg"
}
])
# 6. معدات الصرف الصحي
equipment_data.extend([
{
"id": "EQ-033",
"name": "حفارة خنادق كبيرة",
"category": "معدات الصرف الصحي",
"subcategory": "حفارات خنادق",
"brand": "فيرمير",
"model": "T1255III",
"capacity": "غير محدد",
"production_rate": "300 م/ساعة",
"hourly_cost": 400,
"daily_cost": 3200,
"weekly_cost": 19200,
"monthly_cost": 76800,
"fuel_consumption": "35 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 6000,
"operator_required": True,
"description": "حفارة خنادق كبيرة لمشاريع الصرف الصحي",
"image_url": "https://example.com/trencher.jpg"
},
{
"id": "EQ-034",
"name": "ماكينة دفع أنابيب",
"category": "معدات الصرف الصحي",
"subcategory": "معدات دفع",
"brand": "هيرينكنيشت",
"model": "HK-500",
"capacity": "غير محدد",
"production_rate": "20 م/ساعة",
"hourly_cost": 600,
"daily_cost": 4800,
"weekly_cost": 28800,
"monthly_cost": 115200,
"fuel_consumption": "40 كيلوواط/ساعة",
"maintenance_period": "300 ساعة",
"maintenance_cost": 8000,
"operator_required": True,
"description": "ماكينة دفع أنابيب بدون حفر مفتوح",
"image_url": "https://example.com/pipejacking.jpg"
},
{
"id": "EQ-035",
"name": "سيارة شفط وتنظيف مجاري",
"category": "معدات الصرف الصحي",
"subcategory": "معدات تنظيف",
"brand": "كايزر",
"model": "AquaStar",
"capacity": "12000 لتر",
"production_rate": "غير محدد",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 4000,
"operator_required": True,
"description": "سيارة شفط وتنظيف مجاري بضغط عالي",
"image_url": "https://example.com/sewercleaner.jpg"
},
{
"id": "EQ-036",
"name": "كاميرا فحص مجاري",
"category": "معدات الصرف الصحي",
"subcategory": "معدات فحص",
"brand": "إيبوس",
"model": "ROVION",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "غير محدد",
"maintenance_period": "200 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "كاميرا فحص مجاري للتفتيش والصيانة",
"image_url": "https://example.com/sewercamera.jpg"
},
{
"id": "EQ-037",
"name": "مضخة مياه غاطسة كبيرة",
"category": "معدات الصرف الصحي",
"subcategory": "مضخات",
"brand": "جرندفوس",
"model": "S2",
"capacity": "400 م3/ساعة",
"production_rate": "400 م3/ساعة",
"hourly_cost": 100,
"daily_cost": 800,
"weekly_cost": 4800,
"monthly_cost": 19200,
"fuel_consumption": "15 كيلوواط/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 2500,
"operator_required": False,
"description": "مضخة مياه غاطسة كبيرة لمشاريع الصرف الصحي",
"image_url": "https://example.com/submersiblepump.jpg"
}
])
# 7. معدات السيول والكباري
equipment_data.extend([
{
"id": "EQ-038",
"name": "معدات دق الخوازيق",
"category": "معدات السيول والكباري",
"subcategory": "معدات خوازيق",
"brand": "بوير",
"model": "BG 28",
"capacity": "غير محدد",
"production_rate": "10 خازوق/يوم",
"hourly_cost": 800,
"daily_cost": 6400,
"weekly_cost": 38400,
"monthly_cost": 153600,
"fuel_consumption": "60 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 10000,
"operator_required": True,
"description": "معدات دق الخوازيق للكباري والأساسات العميقة",
"image_url": "https://example.com/piling.jpg"
},
{
"id": "EQ-039",
"name": "رافعة جسرية",
"category": "معدات السيول والكباري",
"subcategory": "رافعات",
"brand": "ليبهر",
"model": "LG 1750",
"capacity": "750 طن",
"production_rate": "غير محدد",
"hourly_cost": 1200,
"daily_cost": 9600,
"weekly_cost": 57600,
"monthly_cost": 230400,
"fuel_consumption": "80 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 15000,
"operator_required": True,
"description": "رافعة جسرية لتركيب عناصر الكباري الثقيلة",
"image_url": "https://example.com/bridgecrane.jpg"
},
{
"id": "EQ-040",
"name": "معدات شد الكابلات",
"category": "معدات السيول والكباري",
"subcategory": "معدات شد",
"brand": "فرايسينت",
"model": "C500",
"capacity": "500 طن",
"production_rate": "غير محدد",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "غير محدد",
"maintenance_period": "300 ساعة",
"maintenance_cost": 5000,
"operator_required": True,
"description": "معدات شد الكابلات للكباري المعلقة",
"image_url": "https://example.com/stressing.jpg"
},
{
"id": "EQ-041",
"name": "معدات حفر الأنفاق",
"category": "معدات السيول والكباري",
"subcategory": "معدات أنفاق",
"brand": "هيرينكنيشت",
"model": "S-500",
"capacity": "غير محدد",
"production_rate": "15 م/يوم",
"hourly_cost": 1500,
"daily_cost": 12000,
"weekly_cost": 72000,
"monthly_cost": 288000,
"fuel_consumption": "100 كيلوواط/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 20000,
"operator_required": True,
"description": "معدات حفر الأنفاق للمشاريع الكبيرة",
"image_url": "https://example.com/tbm.jpg"
},
{
"id": "EQ-042",
"name": "سدود مؤقتة",
"category": "معدات السيول والكباري",
"subcategory": "معدات سيول",
"brand": "أكواباريير",
"model": "K-100",
"capacity": "غير محدد",
"production_rate": "100 م/يوم",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "غير محدد",
"maintenance_period": "غير محدد",
"maintenance_cost": 2000,
"operator_required": True,
"description": "سدود مؤقتة للحماية من السيول",
"image_url": "https://example.com/cofferdam.jpg"
}
])
# 8. معدات الضغط والتثبيت
equipment_data.extend([
{
"id": "EQ-043",
"name": "مدحلة تربة ثقيلة",
"category": "معدات الضغط والتثبيت",
"subcategory": "مداحل",
"brand": "بوماج",
"model": "BW 226",
"capacity": "غير محدد",
"production_rate": "3000 م2/ساعة",
"hourly_cost": 250,
"daily_cost": 2000,
"weekly_cost": 12000,
"monthly_cost": 48000,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 3500,
"operator_required": True,
"description": "مدحلة تربة ثقيلة للمشاريع الكبيرة",
"image_url": "https://example.com/soilroller.jpg"
},
{
"id": "EQ-044",
"name": "دكاكة قفازة",
"category": "معدات الضغط والتثبيت",
"subcategory": "دكاكات",
"brand": "واكر نيوسن",
"model": "BS 60-4",
"capacity": "غير محدد",
"production_rate": "150 م2/ساعة",
"hourly_cost": 50,
"daily_cost": 400,
"weekly_cost": 2400,
"monthly_cost": 9600,
"fuel_consumption": "2 لتر/ساعة",
"maintenance_period": "100 ساعة",
"maintenance_cost": 800,
"operator_required": True,
"description": "دكاكة قفازة للمساحات الضيقة",
"image_url": "https://example.com/rammer.jpg"
},
{
"id": "EQ-045",
"name": "دكاكة هزازة",
"category": "معدات الضغط والتثبيت",
"subcategory": "دكاكات",
"brand": "واكر نيوسن",
"model": "DPU 6555",
"capacity": "غير محدد",
"production_rate": "500 م2/ساعة",
"hourly_cost": 80,
"daily_cost": 640,
"weekly_cost": 3840,
"monthly_cost": 15360,
"fuel_consumption": "3 لتر/ساعة",
"maintenance_period": "100 ساعة",
"maintenance_cost": 1000,
"operator_required": True,
"description": "دكاكة هزازة للمساحات المتوسطة",
"image_url": "https://example.com/platecompactor.jpg"
},
{
"id": "EQ-046",
"name": "معدات تثبيت التربة",
"category": "معدات الضغط والتثبيت",
"subcategory": "معدات تثبيت",
"brand": "ويرتجن",
"model": "WR 250",
"capacity": "غير محدد",
"production_rate": "5000 م2/يوم",
"hourly_cost": 500,
"daily_cost": 4000,
"weekly_cost": 24000,
"monthly_cost": 96000,
"fuel_consumption": "40 لتر/ساعة",
"maintenance_period": "250 ساعة",
"maintenance_cost": 7000,
"operator_required": True,
"description": "معدات تثبيت التربة بالإسمنت أو الجير",
"image_url": "https://example.com/soilstabilizer.jpg"
}
])
# 9. معدات التوليد والطاقة
equipment_data.extend([
{
"id": "EQ-047",
"name": "مولد كهرباء كبير",
"category": "معدات التوليد والطاقة",
"subcategory": "مولدات",
"brand": "كاتربيلر",
"model": "C15",
"capacity": "500 كيلوواط",
"production_rate": "500 كيلوواط",
"hourly_cost": 300,
"daily_cost": 2400,
"weekly_cost": 14400,
"monthly_cost": 57600,
"fuel_consumption": "80 لتر/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 5000,
"operator_required": False,
"description": "مولد كهرباء كبير للمشاريع الكبيرة",
"image_url": "https://example.com/generator.jpg"
},
{
"id": "EQ-048",
"name": "مولد كهرباء متوسط",
"category": "معدات التوليد والطاقة",
"subcategory": "مولدات",
"brand": "كاتربيلر",
"model": "C9",
"capacity": "250 كيلوواط",
"production_rate": "250 كيلوواط",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "45 لتر/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 3500,
"operator_required": False,
"description": "مولد كهرباء متوسط للمشاريع المتوسطة",
"image_url": "https://example.com/generator2.jpg"
},
{
"id": "EQ-049",
"name": "ضاغط هواء كبير",
"category": "معدات التوليد والطاقة",
"subcategory": "ضواغط",
"brand": "أطلس كوبكو",
"model": "XRVS 1000",
"capacity": "1000 قدم مكعب/دقيقة",
"production_rate": "1000 قدم مكعب/دقيقة",
"hourly_cost": 200,
"daily_cost": 1600,
"weekly_cost": 9600,
"monthly_cost": 38400,
"fuel_consumption": "30 لتر/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 3000,
"operator_required": False,
"description": "ضاغط هواء كبير للمشاريع الكبيرة",
"image_url": "https://example.com/compressor.jpg"
},
{
"id": "EQ-050",
"name": "ضاغط هواء متوسط",
"category": "معدات التوليد والطاقة",
"subcategory": "ضواغط",
"brand": "أطلس كوبكو",
"model": "XRVS 500",
"capacity": "500 قدم مكعب/دقيقة",
"production_rate": "500 قدم مكعب/دقيقة",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "20 لتر/ساعة",
"maintenance_period": "500 ساعة",
"maintenance_cost": 2500,
"operator_required": False,
"description": "ضاغط هواء متوسط للمشاريع المتوسطة",
"image_url": "https://example.com/compressor2.jpg"
}
])
# 10. معدات القياس والمساحة
equipment_data.extend([
{
"id": "EQ-051",
"name": "محطة رصد متكاملة",
"category": "معدات القياس والمساحة",
"subcategory": "محطات رصد",
"brand": "ليكا",
"model": "TS16",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 100,
"daily_cost": 800,
"weekly_cost": 4800,
"monthly_cost": 19200,
"fuel_consumption": "غير محدد",
"maintenance_period": "1000 ساعة",
"maintenance_cost": 2000,
"operator_required": True,
"description": "محطة رصد متكاملة للمساحة الدقيقة",
"image_url": "https://example.com/totalstation.jpg"
},
{
"id": "EQ-052",
"name": "جهاز GPS مساحي",
"category": "معدات القياس والمساحة",
"subcategory": "أجهزة GPS",
"brand": "ترمبل",
"model": "R10",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 80,
"daily_cost": 640,
"weekly_cost": 3840,
"monthly_cost": 15360,
"fuel_consumption": "غير محدد",
"maintenance_period": "1000 ساعة",
"maintenance_cost": 1500,
"operator_required": True,
"description": "جهاز GPS مساحي دقيق",
"image_url": "https://example.com/gps.jpg"
},
{
"id": "EQ-053",
"name": "جهاز مسح ليزري ثلاثي الأبعاد",
"category": "معدات القياس والمساحة",
"subcategory": "أجهزة مسح",
"brand": "ليكا",
"model": "RTC360",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 150,
"daily_cost": 1200,
"weekly_cost": 7200,
"monthly_cost": 28800,
"fuel_consumption": "غير محدد",
"maintenance_period": "1000 ساعة",
"maintenance_cost": 3000,
"operator_required": True,
"description": "جهاز مسح ليزري ثلاثي الأبعاد للمشاريع المعقدة",
"image_url": "https://example.com/laserscanner.jpg"
},
{
"id": "EQ-054",
"name": "طائرة بدون طيار للمسح",
"category": "معدات القياس والمساحة",
"subcategory": "طائرات مسح",
"brand": "دي جي آي",
"model": "Phantom 4 RTK",
"capacity": "غير محدد",
"production_rate": "غير محدد",
"hourly_cost": 100,
"daily_cost": 800,
"weekly_cost": 4800,
"monthly_cost": 19200,
"fuel_consumption": "غير محدد",
"maintenance_period": "500 ساعة",
"maintenance_cost": 1000,
"operator_required": True,
"description": "طائرة بدون طيار للمسح الجوي والتصوير",
"image_url": "https://example.com/drone.jpg"
}
])
# تخزين البيانات في حالة الجلسة
st.session_state.equipment_catalog = pd.DataFrame(equipment_data)
def render(self):
"""عرض واجهة كتالوج المعدات"""
st.markdown("## كتالوج المعدات")
# إنشاء تبويبات لعرض الكتالوج
tabs = st.tabs([
"عرض الكتالوج",
"إضافة معدة",
"تحليل التكاليف",
"استيراد/تصدير"
])
with tabs[0]:
self._render_catalog_view_tab()
with tabs[1]:
self._render_add_equipment_tab()
with tabs[2]:
self._render_cost_analysis_tab()
with tabs[3]:
self._render_import_export_tab()
def _render_catalog_view_tab(self):
"""عرض تبويب عرض الكتالوج"""
st.markdown("### عرض كتالوج المعدات")
# استخراج البيانات
equipment_df = st.session_state.equipment_catalog
# إنشاء فلاتر للعرض
col1, col2 = st.columns(2)
with col1:
# فلتر حسب الفئة
categories = ["الكل"] + sorted(equipment_df["category"].unique().tolist())
selected_category = st.selectbox("اختر فئة المعدات", categories)
with col2:
# فلتر حسب الفئة الفرعية
if selected_category != "الكل":
subcategories = ["الكل"] + sorted(equipment_df[equipment_df["category"] == selected_category]["subcategory"].unique().tolist())
else:
subcategories = ["الكل"] + sorted(equipment_df["subcategory"].unique().tolist())
selected_subcategory = st.selectbox("اختر الفئة الفرعية", subcategories)
# تطبيق الفلاتر
filtered_df = equipment_df.copy()
if selected_category != "الكل":
filtered_df = filtered_df[filtered_df["category"] == selected_category]
if selected_subcategory != "الكل":
filtered_df = filtered_df[filtered_df["subcategory"] == selected_subcategory]
# عرض البيانات
if not filtered_df.empty:
# عرض عدد النتائج
st.info(f"تم العثور على {len(filtered_df)} معدة")
# عرض المعدات في شكل بطاقات
for i, (_, equipment) in enumerate(filtered_df.iterrows()):
col1, col2 = st.columns([1, 2])
with col1:
# عرض صورة المعدة (استخدام صورة افتراضية)
st.image("https://via.placeholder.com/150", caption=equipment["name"])
with col2:
# عرض معلومات المعدة
st.markdown(f"**{equipment['name']}** (الكود: {equipment['id']})")
st.markdown(f"الفئة: {equipment['category']} - {equipment['subcategory']}")
st.markdown(f"الماركة: {equipment['brand']} | الموديل: {equipment['model']}")
st.markdown(f"السعة: {equipment['capacity']} | معدل الإنتاج: {equipment['production_rate']}")
# عرض التكاليف
cost_col1, cost_col2, cost_col3, cost_col4 = st.columns(4)
with cost_col1:
st.metric("بالساعة", f"{equipment['hourly_cost']} ريال")
with cost_col2:
st.metric("باليوم", f"{equipment['daily_cost']} ريال")
with cost_col3:
st.metric("بالأسبوع", f"{equipment['weekly_cost']} ريال")
with cost_col4:
st.metric("بالشهر", f"{equipment['monthly_cost']} ريال")
# إضافة زر لعرض التفاصيل
if st.button(f"عرض التفاصيل الكاملة", key=f"details_{equipment['id']}"):
st.session_state.selected_equipment = equipment['id']
self._show_equipment_details(equipment)
st.markdown("---")
else:
st.warning("لا توجد معدات تطابق معايير البحث")
def _show_equipment_details(self, equipment):
"""عرض تفاصيل المعدة"""
st.markdown(f"## تفاصيل المعدة: {equipment['name']}")
col1, col2 = st.columns([1, 2])
with col1:
# عرض صورة المعدة (استخدام صورة افتراضية)
st.image("https://via.placeholder.com/300", caption=equipment["name"])
with col2:
# عرض المعلومات الأساسية
st.markdown("### المعلومات الأساسية")
st.markdown(f"**الكود:** {equipment['id']}")
st.markdown(f"**الفئة:** {equipment['category']} - {equipment['subcategory']}")
st.markdown(f"**الماركة:** {equipment['brand']}")
st.markdown(f"**الموديل:** {equipment['model']}")
st.markdown(f"**السعة:** {equipment['capacity']}")
st.markdown(f"**معدل الإنتاج:** {equipment['production_rate']}")
st.markdown(f"**الوصف:** {equipment['description']}")
# عرض معلومات التكلفة
st.markdown("### معلومات التكلفة")
cost_col1, cost_col2, cost_col3, cost_col4 = st.columns(4)
with cost_col1:
st.metric("التكلفة بالساعة", f"{equipment['hourly_cost']} ريال")
with cost_col2:
st.metric("التكلفة باليوم", f"{equipment['daily_cost']} ريال")
with cost_col3:
st.metric("التكلفة بالأسبوع", f"{equipment['weekly_cost']} ريال")
with cost_col4:
st.metric("التكلفة بالشهر", f"{equipment['monthly_cost']} ريال")
# عرض معلومات التشغيل والصيانة
st.markdown("### معلومات التشغيل والصيانة")
maint_col1, maint_col2, maint_col3 = st.columns(3)
with maint_col1:
st.metric("استهلاك الوقود", f"{equipment['fuel_consumption']}")
with maint_col2:
st.metric("فترة الصيانة", f"{equipment['maintenance_period']}")
with maint_col3:
st.metric("تكلفة الصيانة", f"{equipment['maintenance_cost']} ريال")
st.markdown(f"**يتطلب مشغل:** {'نعم' if equipment['operator_required'] else 'لا'}")
# إضافة زر للتعديل
if st.button("تعديل بيانات المعدة"):
st.session_state.edit_equipment = equipment['id']
# هنا يمكن إضافة منطق التعديل
def _render_add_equipment_tab(self):
"""عرض تبويب إضافة معدة"""
st.markdown("### إضافة معدة جديدة")
# استخراج البيانات
equipment_df = st.session_state.equipment_catalog
# إنشاء نموذج إضافة معدة
with st.form("add_equipment_form"):
st.markdown("#### المعلومات الأساسية")
# الصف الأول
col1, col2 = st.columns(2)
with col1:
equipment_id = st.text_input("كود المعدة", value=f"EQ-{len(equipment_df) + 1:03d}")
equipment_name = st.text_input("اسم المعدة", placeholder="مثال: حفارة هيدروليكية متوسطة")
with col2:
# استخراج الفئات والفئات الفرعية الموجودة
categories = sorted(equipment_df["category"].unique().tolist())
equipment_category = st.selectbox("فئة المعدة", categories)
# استخراج الفئات الفرعية بناءً على الفئة المختارة
subcategories = sorted(equipment_df[equipment_df["category"] == equipment_category]["subcategory"].unique().tolist())
equipment_subcategory = st.selectbox("الفئة الفرعية", subcategories)
# الصف الثاني
col1, col2 = st.columns(2)
with col1:
equipment_brand = st.text_input("الماركة", placeholder="مثال: كاتربيلر")
equipment_model = st.text_input("الموديل", placeholder="مثال: CAT 320")
with col2:
equipment_capacity = st.text_input("السعة", placeholder="مثال: 1.5 م3")
equipment_production_rate = st.text_input("معدل الإنتاج", placeholder="مثال: 100 م3/ساعة")
st.markdown("#### معلومات التكلفة")
# الصف الثالث
col1, col2, col3, col4 = st.columns(4)
with col1:
equipment_hourly_cost = st.number_input("التكلفة بالساعة (ريال)", min_value=0, step=10)
with col2:
equipment_daily_cost = st.number_input("التكلفة باليوم (ريال)", min_value=0, step=100)
with col3:
equipment_weekly_cost = st.number_input("التكلفة بالأسبوع (ريال)", min_value=0, step=500)
with col4:
equipment_monthly_cost = st.number_input("التكلفة بالشهر (ريال)", min_value=0, step=1000)
st.markdown("#### معلومات التشغيل والصيانة")
# الصف الرابع
col1, col2, col3 = st.columns(3)
with col1:
equipment_fuel_consumption = st.text_input("استهلاك الوقود", placeholder="مثال: 25 لتر/ساعة")
with col2:
equipment_maintenance_period = st.text_input("فترة الصيانة", placeholder="مثال: 250 ساعة")
with col3:
equipment_maintenance_cost = st.number_input("تكلفة الصيانة (ريال)", min_value=0, step=500)
# الصف الخامس
col1, col2 = st.columns(2)
with col1:
equipment_operator_required = st.checkbox("يتطلب مشغل")
with col2:
equipment_image_url = st.text_input("رابط الصورة", placeholder="مثال: https://example.com/image.jpg")
# وصف المعدة
equipment_description = st.text_area("وصف المعدة", placeholder="أدخل وصفاً تفصيلياً للمعدة")
# زر الإضافة
submit_button = st.form_submit_button("إضافة المعدة")
if submit_button:
# التحقق من البيانات
if not equipment_name or not equipment_category or not equipment_subcategory:
st.error("يرجى إدخال المعلومات الأساسية للمعدة")
else:
# إنشاء معدة جديدة
new_equipment = {
"id": equipment_id,
"name": equipment_name,
"category": equipment_category,
"subcategory": equipment_subcategory,
"brand": equipment_brand,
"model": equipment_model,
"capacity": equipment_capacity,
"production_rate": equipment_production_rate,
"hourly_cost": equipment_hourly_cost,
"daily_cost": equipment_daily_cost,
"weekly_cost": equipment_weekly_cost,
"monthly_cost": equipment_monthly_cost,
"fuel_consumption": equipment_fuel_consumption,
"maintenance_period": equipment_maintenance_period,
"maintenance_cost": equipment_maintenance_cost,
"operator_required": equipment_operator_required,
"description": equipment_description,
"image_url": equipment_image_url if equipment_image_url else "https://via.placeholder.com/150"
}
# إضافة المعدة إلى الكتالوج
st.session_state.equipment_catalog = pd.concat([
st.session_state.equipment_catalog,
pd.DataFrame([new_equipment])
], ignore_index=True)
st.success(f"تمت إضافة المعدة {equipment_name} بنجاح!")
def _render_cost_analysis_tab(self):
"""عرض تبويب تحليل التكاليف"""
st.markdown("### تحليل تكاليف المعدات")
# استخراج البيانات
equipment_df = st.session_state.equipment_catalog
# تحليل متوسط التكاليف حسب الفئة
st.markdown("#### متوسط التكاليف حسب الفئة")
# حساب متوسط التكاليف لكل فئة
category_costs = equipment_df.groupby("category").agg({
"hourly_cost": "mean",
"daily_cost": "mean",
"weekly_cost": "mean",
"monthly_cost": "mean"
}).reset_index()
# تغيير أسماء الأعمدة
category_costs.columns = ["الفئة", "متوسط التكلفة بالساعة", "متوسط التكلفة باليوم", "متوسط التكلفة بالأسبوع", "متوسط التكلفة بالشهر"]
# عرض الجدول
st.dataframe(category_costs, use_container_width=True)
# إنشاء رسم بياني للمقارنة
st.markdown("#### مقارنة متوسط التكاليف اليومية حسب الفئة")
fig = px.bar(
category_costs,
x="الفئة",
y="متوسط التكلفة باليوم",
title="متوسط التكاليف اليومية حسب فئة المعدات",
color="الفئة",
text_auto=True
)
st.plotly_chart(fig, use_container_width=True)
# تحليل توزيع المعدات حسب الفئة
st.markdown("#### توزيع المعدات حسب الفئة")
# حساب عدد المعدات في كل فئة
category_counts = equipment_df["category"].value_counts().reset_index()
category_counts.columns = ["الفئة", "عدد المعدات"]
# إنشاء رسم بياني دائري
fig = px.pie(
category_counts,
values="عدد المعدات",
names="الفئة",
title="توزيع المعدات حسب الفئة",
color="الفئة"
)
st.plotly_chart(fig, use_container_width=True)
# حاسبة تكاليف المشروع
st.markdown("#### حاسبة تكاليف المشروع")
with st.form("project_cost_calculator"):
st.markdown("أدخل المعدات المطلوبة للمشروع")
# اختيار المعدات
selected_equipment = st.multiselect(
"اختر المعدات",
options=equipment_df["name"].tolist(),
format_func=lambda x: f"{x} ({equipment_df[equipment_df['name'] == x]['id'].iloc[0]})"
)
# اختيار مدة المشروع
project_duration = st.number_input("مدة المشروع (بالأيام)", min_value=1, value=30)
# زر الحساب
calculate_button = st.form_submit_button("حساب التكاليف")
if calculate_button:
if not selected_equipment:
st.error("يرجى اختيار معدة واحدة على الأقل")
else:
# حساب التكاليف
project_costs = []
for equipment_name in selected_equipment:
equipment = equipment_df[equipment_df["name"] == equipment_name].iloc[0]
# حساب التكلفة بناءً على المدة
if project_duration <= 1:
# تكلفة يوم واحد
cost = equipment["daily_cost"]
cost_type = "يومية"
elif project_duration <= 7:
# تكلفة أسبوع
cost = equipment["weekly_cost"]
cost_type = "أسبوعية"
else:
# تكلفة شهر أو أكثر
months = project_duration / 30
cost = equipment["monthly_cost"] * months
cost_type = "شهرية"
project_costs.append({
"المعدة": equipment_name,
"الكود": equipment["id"],
"نوع التكلفة": cost_type,
"التكلفة الإجمالية": cost
})
# عرض النتائج
project_costs_df = pd.DataFrame(project_costs)
st.dataframe(project_costs_df, use_container_width=True)
# حساب إجمالي التكاليف
total_cost = project_costs_df["التكلفة الإجمالية"].sum()
st.metric("إجمالي تكاليف المعدات للمشروع", f"{total_cost:,.2f} ريال")
def _render_import_export_tab(self):
"""عرض تبويب استيراد/تصدير"""
st.markdown("### استيراد وتصدير بيانات المعدات")
# استيراد البيانات
st.markdown("#### استيراد البيانات")
uploaded_file = st.file_uploader("اختر ملف Excel لاستيراد بيانات المعدات", type=["xlsx", "xls"])
if uploaded_file is not None:
try:
# قراءة الملف
imported_df = pd.read_excel(uploaded_file)
# عرض البيانات المستوردة
st.dataframe(imported_df, use_container_width=True)
# زر الاستيراد
if st.button("استيراد البيانات"):
# التحقق من وجود الأعمدة المطلوبة
required_columns = ["id", "name", "category", "subcategory"]
if all(col in imported_df.columns for col in required_columns):
# دمج البيانات المستوردة مع البيانات الحالية
st.session_state.equipment_catalog = pd.concat([
st.session_state.equipment_catalog,
imported_df
], ignore_index=True).drop_duplicates(subset=["id"])
st.success(f"تم استيراد {len(imported_df)} معدة بنجاح!")
else:
st.error("الملف المستورد لا يحتوي على الأعمدة المطلوبة")
except Exception as e:
st.error(f"حدث خطأ أثناء استيراد الملف: {str(e)}")
# تصدير البيانات
st.markdown("#### تصدير البيانات")
# اختيار تنسيق التصدير
export_format = st.radio("اختر تنسيق التصدير", ["Excel", "CSV", "JSON"], horizontal=True)
if st.button("تصدير البيانات"):
# استخراج البيانات
equipment_df = st.session_state.equipment_catalog
# تصدير البيانات حسب التنسيق المختار
if export_format == "Excel":
# تصدير إلى Excel
output = io.BytesIO()
with pd.ExcelWriter(output, engine="openpyxl") as writer:
equipment_df.to_excel(writer, index=False, sheet_name="Equipment")
# تحميل الملف
st.download_button(
label="تنزيل ملف Excel",
data=output.getvalue(),
file_name="equipment_catalog.xlsx",
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
elif export_format == "CSV":
# تصدير إلى CSV
csv_data = equipment_df.to_csv(index=False)
# تحميل الملف
st.download_button(
label="تنزيل ملف CSV",
data=csv_data,
file_name="equipment_catalog.csv",
mime="text/csv"
)
else: # JSON
# تصدير إلى JSON
json_data = equipment_df.to_json(orient="records", force_ascii=False)
# تحميل الملف
st.download_button(
label="تنزيل ملف JSON",
data=json_data,
file_name="equipment_catalog.json",
mime="application/json"
)
def get_equipment_by_id(self, equipment_id):
"""الحصول على معدة بواسطة الكود"""
equipment_df = st.session_state.equipment_catalog
equipment = equipment_df[equipment_df["id"] == equipment_id]
if not equipment.empty:
return equipment.iloc[0].to_dict()
return None
def get_equipment_by_category(self, category):
"""الحصول على المعدات حسب الفئة"""
equipment_df = st.session_state.equipment_catalog
equipment = equipment_df[equipment_df["category"] == category]
if not equipment.empty:
return equipment.to_dict(orient="records")
return []
def calculate_equipment_cost(self, equipment_id, duration_days):
"""حساب تكلفة المعدة بناءً على المدة"""
equipment = self.get_equipment_by_id(equipment_id)
if equipment:
# حساب التكلفة بناءً على المدة
if duration_days <= 1:
# تكلفة يوم واحد
return equipment["daily_cost"]
elif duration_days <= 7:
# تكلفة أسبوع
return equipment["weekly_cost"]
else:
# تكلفة شهر أو أكثر
months = duration_days / 30
return equipment["monthly_cost"] * months
return 0