|
"""
|
|
كتالوج المعدات - وحدة إدارة معدات المقاولات
|
|
"""
|
|
|
|
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 = []
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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"
|
|
}
|
|
])
|
|
|
|
|
|
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":
|
|
|
|
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_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_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
|
|
|