# ERP & PM Integrated Platform — Dockerized ## سامانه یکپارچه تدارکات، انبارداری، مدیریت پروژه (PM) و ربات هوشمند مجموعه نرم‌افزاری یکپارچه و خودکفا (Self-contained) شامل تمامی سرویس‌ها، ماژول‌ها و تنظیمات زیرساختی مورد نیاز برای اجرا در محیط توسعه و عملیات: | سرویس | نام کانتینر | فناوری / کاربرد | پورت در دسترس | |---|---|---|---| | **postgres** | `procurement-postgres` | PostgreSQL 18 (دیتابیس مشترک `procurement` + `casdoor`) | `5455:5432` | | **minio** | `procurement-minio` | MinIO Object Storage (S3-compatible) برای فایل‌ها و پیش‌فاکتورها | `9000` (API), `9001` (کنسول) | | **casdoor** | `procurement-casdoor` | ارائه‌دهنده متمرکز هویت سازمانی (OIDC Provider) | `8080:8000` | | **api** | `procurement-api` | بک‌اند اصلی تدارکات و انبار (FastAPI + Asyncpg) | `8000:8000` | | **frontend** | `procurement-frontend` | فرانت‌اند وب ERP (React 19 + Vite + Tailwind) | سرو از طریق Traefik روی پورت `80` | | **pm-api** | `pm-api` | بک‌اند بومی مدیریت پروژه ساخت (FastAPI + Python 3.12) | درون‌شبکه‌ای (زیرمسیر `/pm/api`) | | **pm-frontend** | `pm-frontend` | فرانت‌اند پلتفرم PM (React 19 + تقویم شمسی + گانت + QC) | سرو از طریق Traefik روی `/pm` | | **bot** | `procurement-bot` | ربات هوشمند بله با پردازش صوت و متن (DeepSeek LLM + STT) | ارتباط Long-polling با Bale | | **db-backup** | `procurement-db-backup` | پشتیبان‌گیری خودکار زمان‌بندی‌شده از هر دو پایگاه داده | کانتینر دوره‌ای در پس‌زمینه | | **traefik** | `procurement-traefik` | ریورس پروکسی و مدیریت ترافیک لایه لبه (Traefik v3) | `80` (HTTP), `443` (HTTPS) | --- ## 🌐 معماری شبکه و هدایت ترافیک (Traefik Edge Routing) ```text ┌────────────────────────┐ │ Browser / Client │ └───────────┬────────────┘ │ :80 / :443 ▼ ┌────────────────────────┐ │ Traefik v3 (Edge) │ └───────────┬────────────┘ │ ┌────────────────────────────────────┼───────────────────────────────────┐ │ │ │ ▼ (Host: localhost) ▼ (PathPrefix: /pm) ▼ (Host: api.localhost) ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ │ frontend (React) │ │ pm-frontend / pm-api │ │ api (FastAPI Core) │ │ /api/* Proxy ───────┼────────────┼───────────────────────┼──────────►│ /api/v1/* │ └───────────────────────┘ └───────────────────────┘ └───────────┬───────────┘ │ │ ├────────────────────────────────────┬──────────────────────────────────────┤ ▼ ▼ ▼ ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ │ Casdoor OIDC (:8080) │ │ MinIO S3 (:9000) │ │ PostgreSQL 18 (:5455) │ │ Host: auth.localhost │ │ Host: s3 / storage │ │ procurement + casdoor │ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘ ▲ │ ثبت پیش‌نویس استعلام ┌────────┴──────────────┐ │ bot (Bale AI Agent) │ └───────────────────────┘ ``` --- ## 📁 ساختار پوشه‌ها و اجزای مخزن ```text ERP/ ├── docker-compose.yml ← پیکربندی اصلی اجرای کامل تمام سرویس‌های استک ├── docker-compose.prod.yml ← لایه تنظیمات عملیاتی (Let's Encrypt و دامنه‌های رسمی) ├── docker-compose.coolify.yml ← پیکربندی سازگار با استقرار بر روی Coolify ├── start.ps1 ← اسکریپت هلپر پاورشل برای ساخت و اجرا ├── mc.cmd ← ابزار خط فرمان MinIO Client برای مدیریت باکت‌ها ├── README.md ← همین سند راهنما ├── backend/ ← سرویس بک‌اند اصلی تدارکات و انبار (procurement-api) │ ├── app/ │ │ ├── db/ ← اتصال دیتابیس و توابع راه‌اندازی اسکیمای خودکار (init_db.py) │ │ ├── models/ ← مدل‌های پایگاه‌داده (procurement, inventory, catalog) │ │ ├── routers/ ← اندپوینت‌های API v1 (quotes, inventory, users, drafts, ...) │ │ ├── schemas/ ← مدل‌های اعتبارسنجی Pydantic │ │ ├── services/ ← منطق بیزینس (انبارداری، استعلام‌ها، ذخیره‌سازی، ...) │ │ ├── utils/ ← ابزارهای امنیتی، خطایابی، ریت‌لیمیت │ │ ├── auth.py ← تایید توکن Casdoor و تفکیک دسترسی‌ها │ │ ├── config.py ← متغیرهای پیکربندی │ │ └── main.py ← اسمبلی برنامه FastAPI و میدل‌ورها │ └── tools/ ← اسکریپت‌های سیدینگ (seed_casdoor.py) و تست‌های دود (Smoke) ├── frontend/ ← وب‌اپلیکیشن اصلی ERP (procurement-frontend) │ ├── src/ │ │ ├── components/ ← کامپوننت‌های مشترک، لایه‌بندی و سوییچر پنل‌ها │ │ ├── pages/ │ │ │ ├── Admin/ ← پنل مدیریت سامانه و همگام‌سازی کاربران │ │ │ ├── Auth/ ← صفحه ورود و احراز هویت │ │ │ ├── Dashboard/ ← کارتابل استعلام‌ها و تصمیم‌گیری خرید │ │ │ ├── Inventory/ ← انبارداری (موجودی، ورود کالا، انتقال کارگاهی، کنترل روزانه) │ │ │ ├── Organization/ ← ماتریس دسترسی پنل‌ها و انتساب پروژه‌ها │ │ │ ├── Projects/ ← مدیریت پروژه‌های عمرانی │ │ │ ├── Suppliers/ ← دسته‌بندی موضوعی و فهرست تأمین‌کنندگان │ │ │ ├── Units/ ← سیستم کاتالوگ متریال‌ها، تامین‌کنندگان و ضرایب تبدیل │ │ │ └── Wizard/ ← ویزارد مرحله‌ای ثبت استعلام (با اتصال مستقیم به پیش‌نویس ربات) │ │ ├── store/ ← مدیریت وضعیت با Zustand │ │ └── App.tsx ← درخت روت‌ها، گیت‌های امنیتی پنل‌ها و نقش‌ها ├── pm/ ← پلتفرم مدیریت پروژه و کنترل کیفیت (پلتفرم آرامش) │ ├── backend/ ← بک‌اند مستقل PM (FastAPI, CPM Engine, QC Service) │ ├── frontend/ ← فرانت‌اند PM (گانت چارت شمسی، WBS، ثبت عیوب و بازرسی) │ ├── sql/ ← اسکیما و اسکریپت‌های اختصاصی پایگاه داده PM │ └── API_CONTRACT.md ← قرارداد کامل اندپوینت‌های PM ├── bot/ ← ایجنت هوشمند بله برای ثبت صوتی/متنی استعلام‌ها │ ├── app/ ← کلاینت Bale، پردازشگر STT صوتی، استخراج NLU با DeepSeek │ ├── docs/SETUP.md ← راهنمای راه‌اندازی و اتصال توکن بله │ └── requirements.txt ├── monitoring/ ← استک مانیتورینگ، متریک‌ها و لاگ‌ها (پرومتئوس، گرافانا، لوکی) ├── infra/ ← تنظیمات وب‌هوک دیپلوی خودکار و کانفیگ‌های داینامیک Traefik ├── sql/ │ ├── migration.sql ← اسکریپت اولیه پایه دیتابیس │ └── 02-casdoor-db.sql ← اسکریپت راه‌اندازی دیتابیس هویت Casdoor └── tests/ ← تست‌های یکپارچگی NLU و ویزارد استعلام ``` --- ## 🔐 سیستم احراز هویت، ماتریس پنل‌ها و کنترل دسترسی (RBAC) سامانه از سیستم احراز هویت **Casdoor OIDC** بهره می‌برد؛ ورود به صورت In-Page بوده و توکن JWT صادر شده توسط بک‌اند با JWKS اعتبارسنجی می‌شود. مدل دسترسی سامانه بر پایه **پنل‌ها (`user_panels`)** بازطراحی شده است: ### ۱. لایه‌های دسترسی پنل‌ها * **پنل تدارکات (`procurement`):** * `full`: دسترسی کامل به کارتابل استعلام‌ها، تایید یا رد پیشنهادها، تامین‌کنندگان و قیمت‌ها. * `limited`: فقط امکان ثبت استعلام جدید در ویزارد برای پروژه‌های منتسب به کاربر (کاربر پس از ورود مستقیماً به `/wizard` یا `/requester` هدایت می‌شود). * **پنل انبارداری (`inventory`):** * `full`: مشاهده موجودی همه انبارها، رهگیری «کالاهای در راه» و کارتابل تایید رسید. * `limited`: فقط مشاهده و مدیریت انبارهای پروژه‌های تحت عضویت، همراه با دسترسی به ثبت تغییر موجودی کارگاهی (`/inventory/change`). * **پنل مدیریت پروژه (`pm`):** * دسترسی به مشاهده یا ویرایش تسک‌ها، چارت گانت، ثبت عیوب و فرم‌های QC در `/panel/pm`. ### ۲. قوانین و نقش سرپرست پروژه (`supervisor`) * کاربرانی با نقش `supervisor` تنها در صورتی مجاز به ورود به سامانه هستند که حداقل یک پروژه در جدول `user_project_members` یا `projects.pm_user_id` به آن‌ها منتسب شده باشد. در غیر این صورت، پیام عدم تخصیص پروژه نمایش داده شده و اجازه ورود نخواهند داشت. --- ## 🚀 راهنمای سریع راه‌اندازی محیط توسعه (Docker) ### پیش‌نیازها * Docker Desktop (ویندوز) یا Docker Engine + Docker Compose Plugin (لینوکس) * حداقل ۴ گیگابایت فضای خالی دیسک و اتصال اینترنت برای بارگیری ایمیج‌های اولیه ### دستورات اجرا ```powershell # ۱. رفتن به پوشه پروژه و ساخت/اجرای کانتینرها docker compose up -d --build # ۲. بررسی وضعیت سلامت سرویس‌ها docker compose ps ``` تمام سرویس‌ها باید وضعیت `Up` و دیتابیس وضعیت `(healthy)` را نشان دهند. ### درگاه‌ها و آدرس‌های محلی | بخش | آدرس محلی | توضیحات | |---|---|---| | **رابط کاربری ERP** | http://localhost | داشبورد اصلی سامانه | | **پلتفرم PM** | http://localhost/pm | مدیریت پروژه و کنترل کیفیت (قابل دسترس در `/panel/pm`) | | **مستندات API (Swagger)** | http://localhost:8000/docs | مستندات تعاملی اندپوینت‌های تدارکات | | **سلامت API** | http://localhost:8000/health/ready | بررسی اتصال دیتابیس، Casdoor و MinIO | | **کنسول MinIO** | http://localhost:9001 | نام کاربری و رمز پیش‌فرض: `minioadmin` / `minioadmin` | | **کنسول Casdoor** | http://localhost:8080 | نام کاربری و رمز اولیه: `admin` / `123` | | **پایگاه داده PostgreSQL** | `localhost:5455` | نام دیتابیس: `procurement`، کاربر: `postgres` | --- ## 🤖 ربات هوشمند بله (`procurement-bot`) ربات پیام‌رسان بله به عنوان یک سرویس اختصاصی درون شبکه فعال است: 1. پیام صوتی یا متنی فرستاده شده از طریق هوش مصنوعی (DeepSeek NLU) و تبدیل صوت به متن پردازش می‌شود. 2. قلم‌ها، متریال‌ها، پروژه‌ها و تامین‌کنندگان به صورت فازی جستجو و شناسایی می‌شوند. 3. پیش‌نویس در جدول `bot_drafts` ذخیره شده و شناسه پیش‌نویس تولید می‌شود. 4. کاربر می‌تواند با زدن دکمه روی بله یا مراجعه به لینک مستقیم: `http://localhost/wizard?draft=` اطلاعات استخراج‌شده را در ویزارد فرانت‌اند مرور، تکمیل و نهایی کند. 5. راهنمای تکمیلی تنظیم توکن در [bot/docs/SETUP.md](file:///c:/Users/Reza/Desktop/v1.6/bot/docs/SETUP.md) قرار دارد. --- ## 🔄 انتقال بین‌کارگاهی کالاها (`project_transfers`) سامانه دارای سیستم ردیابی انتقال متریال بین کارگاه‌هاست: * ثبت انتقال از طریق صفحه «تغییر موجودی» با نوع `انتقال بین کارگاهی`. * وضعیت‌های انتقال: `در حال انتقال (in_transit)`، `تحویل‌شده (received)` و `لغوشده (cancelled)`. * کارگاه مقصد از طریق زبانه «انتقالات ورودی» در صفحه «کالاهای در راه» اقلام ارسالی را دریافت و به انبارهای خود تخصیص می‌دهد. --- ## 🛠️ عملیات نگهداری و دیپلوی در سرور (Operations) * **دیپلوی خودکار:** سرور با هر Push به برنچ `production` از طریق وب‌هوک اختصاصی به صورت خودکار بیلد و بالا می‌آید. راهنمای کامل: [docs/OPERATIONS.md](file:///c:/Users/Reza/Desktop/v1.6/docs/OPERATIONS.md). * **پشتیبان‌گیری پایگاه داده:** سرویس `db-backup` به صورت روزانه از هر دو پایگاه داده `procurement` و `casdoor` فایل‌های `.dump` تولید و در پوشه `backups/` نگهداری می‌کند. * **مانیتورینگ و مشاهده‌پذیری:** ابزارهای Prometheus، لاگ‌های Loki و ردیابی خطاهای GlitchTip در پوشه [monitoring/](file:///c:/Users/Reza/Desktop/v1.6/monitoring/README.md) سازمان‌دهی شده‌اند.