Files
ERP/pm/DATABASE_GUIDE.md
MMD 2747f9d4bb chore(pm): vendor the Aramesh/PM platform under pm/ (squash of Aramesh/PM @ 91f3271)
The PM panel (PmPanelPage -> iframe /pm/) needs the project-management
platform served at /pm/ on the ERP domain. Source: org repo Aramesh/PM,
branch feature/project-management-platform. Update via:
git subtree pull --prefix=pm aramesh-pm feature/project-management-platform --squash
2026-10-07 15:14:20 +03:30

14 KiB
Raw Permalink Blame History

راهنمای جامع معماری و مدل داده پایگاه‌داده سیستم مدیریت پروژه عمرانی (Construction PM)

دستورالعمل برای هوش مصنوعی (AI Prompt / Context):
این سند، مشخصات دقیق معماری، موجودیت‌ها (Entities)، فیلدها، روابط و قواعد تجاری یک سیستم بومی مدیریت پروژه عمرانی (Construction Project Management) است.
لطفاً این راهنما را مطالعه کرده و بر اساس آن، ساختار سیستم، نحوه ذخیره‌سازی داده‌ها، جریان کار (Workflow) و روابط میان جداول را برای کاربر تحلیل و تشریح نما.


۱. نمای کلی سیستم و فناوری‌ها (Architecture Overview)

  • ماهیت سامانه: پلتفرم یکپارچه و بومی مدیریت پروژه‌های عمرانی و ساختمانی (Native Construction PM Platform).
  • لایه‌های نرم‌افزاری:
    • فرانت‌اند: React + TypeScript + TailwindCSS + TanStack Query (رابط کاربری مدرن با پشتیبانی تقویم شمسی و نمودار گانت تعاملی).
    • بک‌اند: Python 3.10+ با فریم‌ورک FastAPI و SQLAlchemy 2.0 (Async ORM با درایور aiosqlite / asyncpg).
    • پایگاه‌داده: SQLite / PostgreSQL با ساختار کاملاً رابطه‌ای (Relational) و فیلدهای ساخت‌یافته JSON.
  • شناسه‌های یکتا (Primary Keys): تمامی جداول از کلیدهای اصلی ۱۰۰٪ بومی از نوع UUID v4 استفاده می‌کنند. هیچ‌گونه شناسه یا وابستگی به سیستم‌های قدیمی (Legacy) وجود ندارد.
  • منطق تاریخ‌ها: تاریخ‌ها در پایگاه‌داده به صورت استاندارد میلادی (Date و DateTime) ذخیره می‌شوند و تبدیل‌های شمسی به‌صورت لایه‌ای و لحظه‌ای برای نمایش به کاربر انجام می‌گیرد.

۲. نمودار رابطه موجودیت‌ها (ERD)

erDiagram
    PROJECTS ||--o{ TASKS : "شامل می‌شود (1:N)"
    PROJECTS ||--o{ PROJECT_MEMBERS : "تخصیص اعضا (1:N)"
    PM_USERS ||--o{ PROJECT_MEMBERS : "عضویت کاربر (1:N)"
    PM_USERS ||--o{ PROJECT_ASSIGNMENTS : "دسترسی پروژه (1:N)"
    PROJECTS ||--o{ PROJECT_ASSIGNMENTS : "محدوده دسترسی (1:N)"
    PM_USERS ||--o{ TASKS : "مسئول وظیفه (Assignee)"
    
    TASKS ||--o{ TASKS : "ساختار درختی WBS (والد/فرزند)"
    TASKS ||--o{ TASK_RELATIONS : "وظیفه پیش‌نیاز (from_task)"
    TASKS ||--o{ TASK_RELATIONS : "وظیفه پس‌نیاز (to_task)"
    PROJECTS ||--o{ TASK_RELATIONS : "روابط گانت پروژه"

    TASKS ||--o{ TASK_QC_DEFINITIONS : "چک‌لیست‌های کنترلی"
    TASK_QC_DEFINITIONS ||--o{ TASK_QC_QUESTIONS : "آیتم‌های کنترلی"
    TASK_QC_QUESTIONS ||--o{ TASK_QC_RESULTS : "تاریخچه بازرسی‌ها"
    
    TASKS ||--o{ DEFECTS : "عیوب و عدم انطباق‌ها"
    TASK_QC_QUESTIONS ||--o{ DEFECTS : "علت ریشه‌ای عیب (اختیاری)"
    
    QC_TEMPLATES ||--o{ QC_QUESTIONS : "قالب‌های عمومی بازرسی"

۳. شرح تفصیلی جداول و موجودیت‌ها (Data Dictionary)

۱. جدول پروژه‌ها (projects)

موجودیت ریشه سامانه که اطلاعات اصلی کارگاه‌های عمرانی را نگهداری می‌کند.

نام فیلد نوع داده کلید / ایندکس توضیحات
id UUID PK شناسه یکتای پروژه
name VARCHAR(255) Index نام پروژه (مانند «پروژه برج بهارستان»)
description TEXT - شرح پروژه، الزامات و مشخصات فنی
location VARCHAR(255) - موقعیت جغرافیایی / نشانی کارگاه
project_manager VARCHAR(255) - نام مدیر یا سرپرست کارگاه
status VARCHAR(32) Index وضعیت: PLANNED, ACTIVE, ON_HOLD, COMPLETED, CANCELLED
planned_start DATE - تاریخ شروع مصوب (محاسبه و تجمیع خودکار از کمترین تاریخ شروع تسک‌ها)
planned_end DATE - تاریخ پایان مصوب (محاسبه و تجمیع خودکار از بیشترین تاریخ پایان تسک‌ها)
actual_start DATE - تاریخ شروع واقعی (محاسبه خودکار از زمان آغاز اولین تسک)
actual_end DATE - تاریخ پایان واقعی (محاسبه خودکار با اتمام ۱۰۰٪ تمام تسک‌ها)
progress FLOAT - درصد پیشرفت فیزیکی پروژه (میانگین وزنی درصد پیشرفت تسک‌ها از ۰ تا ۱۰۰)
created_at TIMESTAMP - زمان ثبت رکورد
updated_at TIMESTAMP - زمان آخرین ویرایش رکورد

۲. جدول وظایف و فعالیت‌ها (tasks)

اصلی‌ترین موجودیت سامانه برای ساختار شکست کار (WBS)، گانت، تخصیص منابع و کنترل کیفی.

نام فیلد نوع داده کلید / ایندکس توضیحات
id UUID PK شناسه یکتای وظیفه
project_id UUID FK -> projects.id پروژه‌ای که وظیفه به آن تعلق دارد (Cascade Delete)
parent_id UUID (Nullable) FK -> tasks.id والد در ساختار درختی WBS با عمق نامحدود (فاز ➔ فعالیت ➔ زیرتسک)
title VARCHAR(512) - عنوان وظیفه (مانند «بتن‌ریزی سقف طبقه ۲»)
description TEXT - مشخصات و الزامات کار
status VARCHAR(32) Index وضعیت: TODO, IN_PROGRESS, BLOCKED, COMPLETED, CANCELLED
priority VARCHAR(32) - اولویت: low, medium, high, urgent
assignee_id UUID (Nullable) FK -> pm_users.id کاربر سیستم مسئول اجرای وظیفه
assignee_name VARCHAR(255) - نام متنی کاربر جهت نمایش سریع
planned_start DATE - تاریخ شروع برنامه‌ریزی‌شده
planned_end DATE - تاریخ پایان برنامه‌ریزی‌شده
actual_start DATE (Nullable) - شروع واقعی (ثبت خودکار هنگام تغییر پیشرفت به بیشتر از صفر)
actual_end DATE (Nullable) - پایان واقعی (ثبت خودکار در زمان تکمیل ۱۰۰٪)
duration INTEGER - مدت زمان برآورد شده بر حسب روز کاری
progress INTEGER - درصد پیشرفت واقعی از ۰ تا ۱۰۰
qc_status VARCHAR(32) - وضعیت کنترل کیفی: none, pre_qc_pending, pre_qc_failed, ready, exec_qc_pending, in_progress, qc_failed_rework, final_passed
human_resources JSON - لیست نقش‌ها و نفرات: [{"role": "آرماتوربند", "count": 4}]
materials JSON - لیست مصالح و تجهیزات/ماشین‌آلات: [{"name": "سیمان تیپ ۲", "unit": "تن", "specifications": ["عیار ۳۵۰"], "count": 10}, {"name": "تاور کرین", "unit": "دستگاه", "specifications": ["ظرفیت ۸ تن"], "count": 1}]
created_at TIMESTAMP - تاریخ ایجاد رکورد
updated_at TIMESTAMP - تاریخ آخرین به‌روزرسانی

۳. جدول روابط وابستگی و گانت (task_relations)

پایه‌گذار روش مسیر بحرانی (CPM Scheduling) و شبکه فعالیت‌های گانت.

نام فیلد نوع داده کلید / ایندکس توضیحات
id UUID PK شناسه رابطه
project_id UUID FK -> projects.id پروژه مربوطه
from_task_id UUID FK -> tasks.id فعالیت پیش‌نیاز (Predecessor)
to_task_id UUID FK -> tasks.id فعالیت وابسته / پس‌نیاز (Successor)
relation_type VARCHAR(8) - نوع وابستگی: FS (پایان به شروع)، SS (شروع به شروع)، FF (پایان به پایان)، SF (شروع به پایان)
lag_days INTEGER - فاصله زمانی مجاز (تاخیر یا تقدم) بر حسب روز
created_at TIMESTAMP - زمان ثبت رابطه

محدودیت (Constraint): زوج (from_task_id, to_task_id) یکتا بوده و از ایجاد حلقه (Cycle) در الگوریتم CPM جلوگیری می‌شود.


۴. حوزه کنترل کیفیت و بازرسی فنی (QC Domain)

این بخش تضمین می‌کند کلیه اقدامات اجرایی کارگاه دارای تاییدیه‌های استاندارد باشند:

الف) قالب‌های سراسری بازرسی (qc_templates و qc_questions)

  • qc_templates: کتابخانه فرم‌های استاندارد کیفی (مثلاً قالب بازرسی بتن‌ریزی، قالب سفت‌کاری).
  • qc_questions: سوالات و ضوابط کنترلی در سه فاز اجرایی:
    • pre: پیش از اجرا (آمادگی کارگاه، تایید نقشه‌ها، مصالح ورودی).
    • during: حین اجرا (دمای بتن، ویبره مناسب، ایمنی).
    • after: پس از اجرا (عمل‌آوری، مقاومت فشاری نمونه‌ها).

ب) فرم‌های کیفی اختصاص‌یافته به وظایف (task_qc_definitions و task_qc_questions)

  • با تخصیص چک‌لیست به یک تسک، یک نسخه مستقل از قالب بر روی وظیفه ایجاد می‌شود تا هرگونه تغییر روی قالب سراسری به تاریخچه بازرسی‌های ثبت‌شده آسیب نزند.

ج) نتایج و تاریخچه بازرسی (task_qc_results)

  • سیستم ثبت پیوسته (Append-Only Log) بدون امکان حذف؛ هر ارزیابی بازرس شامل:
    • question_id: شناسه آیتم بازرسی.
    • answer: پاسخ بازرس (pass تایید، fail عدم انطباق، na عدم کاربرد).
    • comment: توضیحات فنی و نواقص مشاهده‌شده.
    • evaluated_by: نام بازرس ناظر.
    • evaluated_at: زمان دقیق بازرسی.

د) جدول عیوب و عدم انطباق‌ها (defects)

  • ثبت رخدادهای نامنطبق در جریان اجرای کار:
    • id (UUID - PK): شناسه عیب.
    • task_id (UUID - FK -> tasks.id): وظیفه مربوطه.
    • question_id (UUID - FK اختیاری): سوال بازرسی که منجر به رد شدن شده است.
    • title: عنوان عدم انطباق (مثلاً: «کرموشدگی بتن ستون جنوبی»).
    • description: شرح دقیق ایراد.
    • severity: درجه شدت عیب (minor, medium, major, critical).
    • status: وضعیت رفع (open, in_progress, resolved).
    • corrective_action: دستور اقدام اصلاحی صادرشده توسط مهندس ناظر.
    • resolution_notes: شرح نحوه رفع عیب.
    • photo_path: مسیر ذخیره تصویر مستند عیب در سرور.
    • resolved_at: زمان تایید رفع عیب.

۵. احراز هویت و دسترسی‌ها (pm_users, project_members, project_assignments)

  • pm_users: کاربران سازمانی سیستم (username, password_hash, display_name, role).
    • نقش‌های سیستمی: project_manager (دسترسی نامحدود به تمام پروژه‌ها)، project_supervisor (دسترسی محدود به پروژه‌های مشخص).
  • project_members: اعضای منتسب به هر پروژه با نقش کارگاهی:
    • role: project_manager, site_engineer, qc_inspector, member.
  • project_assignments: جدول دامنه دسترسی برای ناظران و سرپرستان دارای دسترسی محدود (Scoped Roles).

۴. قواعد و منطق‌های تجاری نهفته در سیستم (Business Invariants)

  1. گیتینگ کنترل کیفی (QC Gating Rule): اگر وظیفه‌ای دارای چک‌لیست بازرسی فاز pre (پیش از اجرا) باشد، تا زمانی که تمامی این سوالات وضعیت pass یا na دریافت نکنند، سیستم اجازه شروع کار (IN_PROGRESS) و افزایش پیشرفت را نمی‌دهد.
  2. محاسبات پیش‌بینی مسیر بحرانی (CPM Logic): محاسبات زمان‌بندی با عبور رفت و برگشت (Forward & Backward Pass) تاریخ‌های زودهنگام و دیرهنگام را استخراج کرده و فعالیت‌های با شناوری صفر (Total Float = 0) را به عنوان مسیر بحرانی مشخص می‌کند.
  3. چرخه حیات خودکار تاریخ‌های واقعی: با اولین تغییر در پیشرفت تسک (progress > 0)، فیلد actual_start به تاریخ جاری تنظیم می‌گردد. با رسیدن پیشرفت به 100%، فیلد actual_end تنظیم و وضعیت وظیفه خودکار به COMPLETED تغییر می‌یابد.
  4. تجمیع پروژه (Rollup Logic): تاریخ شروع، پایان و درصد پیشرفت فیزیکی کل پروژه همواره حاصل تجمیع و میانگین‌گیری پویای وظایف موجود در پروژه است.