#P1741
GET /v2/core/hub/analyze
Hub: Flight Reservation Analysis
این اندپوینت یک گزارش تحلیلی جامع از تمام رزروهای پرواز آنلاین (`product='online'`, `byproduct='aircraft'`) ارائه میدهد. دادهها بر اساس سال شمسی، تأمینکننده (Supplier)، و تأمینکننده سیستمی (System Supplier) دستهبندی و agregare میشوند. خروجی شامل تعداد کل رزروها و مجموع مبالغ خرید در هر دستهبندی است.
Request Overview
URL:
/v2/core/hub/analyzeMethod: GET
Controller: HubController@hubAnalysis
Middleware: authWithJwt
Access Control
- نیاز به توکن احراز هویت (JWT) دارد.
- این گزارش به صورت سراسری (Global) است و به شعبه کاربر لاگین کرده محدود نمیشود.
Logic Details
فرآیند تحلیل دادهها در این اندپوینت طی چندین مرحله پیچیده انجام میشود:
- استخراج دادههای اولیه:
- یک کوئری به جدول
factor_itemsارسال میشود تا تمام رکوردهایی که دارای شرایط زیر هستند، استخراج شوند:productبرابر با'online'byproductبرابر با'aircraft'
- نتایج بر اساس
idبه صورت نزولی (DESC) مرتب میشوند تا ابتدا جدیدترین رزروها پردازش شوند.
- یک کوئری به جدول
- پردازش تکتک رزروها:
- سیستم در یک حلقه (loop) تمام رزروهای استخراج شده را پیمایش میکند.
- برای هر رزرو، فیلد
detailsکه یک رشته JSON است، به آرایه PHP تبدیل میشود. - اعتبارسنجی حیاتی: سیستم بررسی میکند که آیا مسیر
$details['Book']['DepartureSegment']در آبجکت JSON وجود دارد یا نه. اگر وجود نداشته باشد، آن رزرو از فرآیند تحلیل حذف شده و حلقه به تکرار بعدی میرود.
- گروهبندی و تجمیع دادهها (Aggregation):
- استخراج تاریخ: سال و ماه شمسی از فیلد
created_atرزرو با استفاده ازCalendarUtils::strftimeاستخراج میشود (مثلاً `1404-09`). - استخراج تأمینکنندگان: شناسههای
SupplierوSystemSupplierاز آبجکتDepartureSegmentخوانده میشوند. - کش کردن نام تأمینکننده:
- برای جلوگیری از کوئریهای تکراری به دیتابیس، یک آرایه به نام
$colleaguesبه عنوان کش داخلی عمل میکند. - هر بار که یک شناسه تأمینکننده جدید یافت میشود، سیستم یک بار به جدول
colleaguesکوئری میزند تا نام دفتر (office) را پیدا کند. - اگر نام دفتر پیدا شود، در کش ذخیره میشود. در غیر این صورت، خود شناسه تأمینکننده به عنوان نام پیشفرض استفاده میشود.
- برای جلوگیری از کوئریهای تکراری به دیتابیس، یک آرایه به نام
- افزایش شمارندهها: برای هر رزرو معتبر، شمارندههای
count(تعداد) وpaid(مجموع مبلغ خرید از فیلدbuy) در سطوح مختلف ساختار داده افزایش مییابند:- مجموع کل (Grand Total)
- مجموع کل سال مربوطه
- مجموع کل تأمینکننده (Supplier) در آن سال
- مجموع ماهانه تأمینکننده (Supplier) در آن سال
- همین فرآیند به طور موازی برای تأمینکننده سیستمی (System Supplier) نیز تکرار میشود.
- استخراج تاریخ: سال و ماه شمسی از فیلد
- ساختار نهایی خروجی:
- نتیجه نهایی یک آبجکت بسیار تودرتو است که دادهها را به تفکیک سال، تأمینکننده، و ماه نمایش میدهد.
- این آبجکت در فیلد
payloadپاسخ نهایی قرار میگیرد.
Response Structure
پاسخ موفق
- Status Code:
200 OK - ساختار خروجی بسیار تودرتو است. کلیدهای آبجکتهای
years،suppliers،system_suppliersوmonthsبه ترتیب شناسههای سال، تأمینکننده، و ماه هستند.
{
"payload": {
"years": {
"1404": { // سال شمسی
"suppliers": {
"55": { // شناسه Supplier
"id": 55,
"title": "Ghasreshirin", // نام استخراج شده از جدول colleagues
"total": {
"count": 10, // کل رزروها از این Supplier در سال 1404
"paid": 95000000 // مجموع خرید از این Supplier در سال 1404
},
"months": {
"08": { // ماه شمسی
"total": {
"count": 4,
"paid": 38000000
}
},
"09": {
"total": {
"count": 6,
"paid": 57000000
}
}
}
}
},
"system_suppliers": {
"10": { // شناسه SystemSupplier
"id": 10,
"title": "Parsian System",
"total": {
"count": 10, // کل رزروها از این SystemSupplier در سال 1404
"paid": 95000000
},
"months": {
"08": { /* ... */ },
"09": { /* ... */ }
}
}
},
"total": { // مجموع کل برای سال 1404
"count": 10,
"paid": 95000000
}
}
},
"total": { // مجموع کل در تمام سالها
"count": 10,
"paid": 95000000
}
},
"meta": {
"timestamp": 1733736600
}
}
Flowchart
Start Request (GET /v2/core/hub/analyze)
↓
Query `factor_items` WHERE `product`='online' AND `byproduct`='aircraft'
↓
Initialize `analyze` & `colleagues` arrays
↓
For each reservation in results:
Decode `details` JSON
↓
`details['Book']['DepartureSegment']` exists?
No
Continue to next reservation
↓ (Yes)
Extract Year, Month, Supplier IDs
↓
Is Supplier ID new?
↓ (Yes)
Query `colleagues` table & cache the title
↓
Aggregate Data:
Increment `count` & `paid` at all levels (Grand, Year, Supplier, Month) for both Supplier & SystemSupplier
Increment `count` & `paid` at all levels (Grand, Year, Supplier, Month) for both Supplier & SystemSupplier
↓
Return 200 OK with `payload`