انتقل إلى المحتوى

نظرة عامة على البنية

ما هي

ManpowerIQ هي منصة جدولة قوى عاملة متعدّدة المستأجرين للموانئ والمحطات، مبنية كـ واجهة خلفية .NET 8 مع واجهة ويب أمامية React (Vite)، على PostgreSQL عبر EF Core 8 / Npgsql. تتبع الواجهة الخلفية Clean Architecture — أربعة مشاريع بقاعدة اعتمادية صارمة موجَّهة للداخل — وهي قائمة على الخدمات، لا CQRS/MediatR (انظر Clean Architecture).

هذه الصفحة هي نقطة الدخول إلى قسم البنية؛ ولكل نظام فرعي صفحته الخاصة أدناه.

لماذا بُنيت بهذه الطريقة

تخدم المنصة عدّة شركات تشغيل من نشر واحد، فتسيطر خاصيّتان على التصميم:

  1. عزل صارم للمستأجرين — يجب ألّا ترى شركة بيانات شركة أخرى أو تلمسها، عرَضًا أو عمدًا. يُنفَّذ هذا في ثلاث طبقات مستقلة (انظر تعدّد المستأجرين).
  2. تحكّم وصول دقيق ومتّسق — في الميناء مخطّطون ومشرفون ومديرون وموارد بشرية وموظفون، يحتاج كلٌّ منهم إلى شريحة محصورة. الوصول متمحور حول الصلاحيات بحيث تستطيع وحدتا عمل تشكيل الأدوار على نحو مختلف بينما تبقى القدرات نفسها مُنفَّذة باتّساق (انظر المصادقة وRBAC).

يُبقي تقسيم Clean Architecture نموذج النطاق وقواعد العمل مستقلّة عن قاعدة البيانات وإطار الويب، فيمكن التفكير في محرّك التخصيص والقواعد والكيانات واختبارها دون بنية تحتية.

كيف تعمل

الحزمة التقنية المُتحقَّق منها (الورقة 01 §build-status؛ الورقة 00-index):

flowchart TB
    subgraph Client
        WEB[تطبيق ويب React + Vite<br/>متجاوب، ليس PWA]
        MOB[جوّال Expo/RN<br/>هيكل فحص صحة فقط]
    end
    subgraph API[ManpowerIQ.API · ASP.NET Core]
        CTRL[وحدات التحكّم · محروسة بالصلاحيات]
    end
    subgraph APP[ManpowerIQ.Application]
        SVC[الخدمات · قواعد العمل<br/>محرّك التخصيص، الطلب، الإجازات…]
    end
    subgraph DOM[ManpowerIQ.Domain]
        ENT[الكيانات · AuditableEntity / TenantEntity]
    end
    subgraph INFRA[ManpowerIQ.Infrastructure]
        EF[EF Core 8 · DbContext<br/>مرشّحات الاستعلام + المعترِضات]
        HF[Hangfire · مهمة استيراد فقط]
    end
    DB[(PostgreSQL<br/>RLS + snake_case)]

    WEB -->|JWT| CTRL
    MOB -.->|/api/health| CTRL
    CTRL --> SVC
    SVC --> ENT
    SVC --> EF
    EF --> DB
    SVC -.enqueue.-> HF
    HF --> DB
  • الواجهة الأمامية — تطبيق صفحة واحدة React/Vite يصادق بـ JWT؛ متجاوب (Tailwind) لكن ليس PWA. مشروع جوّال Expo/React-Native هو هيكل فحص-صحة فقط (الورقة 20). ولكل الأغراض العملية، ManpowerIQ هي تطبيق ويب.
  • الـ API — متحكّمات ASP.NET Core، كلٌّ محروس بسياسة صلاحية. يشغّل خطّ أنابيب الطلب المصادقة، ثم وسيطًا لسياق المستأجر يدفع المستأجر إلى متغيّر جلسة Postgres، ثم التخويل (الورقة 01 §build-status، Program.cs:476-478).
  • التطبيق — منطق العمل في أصناف خدمة عادية (محرّك التخصيص، تخطيط الطلب، الإجازة، الحضور…). دون توسّط mediator.
  • النطاق — كيانات مبنية على صنفين أساسيين، AuditableEntity وTenantEntity (الورقة 01 §entities).
  • البنية التحتية — EF Core 8 مع مرشحات استعلام عامة ومعترضات كتابة، إضافةً إلى Hangfire لمهمة الاستيراد غير المتزامنة الواحدة.
  • قاعدة البيانات — PostgreSQL بتسمية snake-case وأمان على مستوى الصف؛ هجرات EF هي مصدر الحقيقة للمخطط (الورقة 00-index).

مزالق / قيود

  • لا CQRS/MediatR. سيفترض قارئ .NET وجود MediatR؛ وهو غير موجود. تُحقَن الخدمات وتُستدعى مباشرةً (انظر Clean Architecture).
  • يعيش المخطط في الهجرات، لا في تفريغ قاعدة بيانات حيّة. أي شيء يحتاج عدد صفوف حيًّا يُعلَّم لكل ورقة؛ إجماليات RBAC المُتحقَّق منها تأتي من استخراج حيّ (Sprint/RBAC_RolePermission_Extract.md).
  • سلسلتا اتصال PostgreSQL — اتصال مالك (BYPASSRLS، للهجرات فقط) واتصال وقت تشغيل مقيَّد بـ RLS. لا يمكن لوقت التشغيل تجاوز عزل المستأجر أبدًا (الورقة 01 §decisions، Program.cs:147-149).

حالة البناء

Available — الحزمة الطبقية .NET 8 + React + PostgreSQL هي المنتج الحيّ. حالة كل مكوّن على حدة موجودة في كل صفحة أدناه ومُلخَّصة في نظرة عامة على دليل المطوّر.

ذات صلة