64 lines
1.9 KiB
Markdown
64 lines
1.9 KiB
Markdown
# پایگاه داده — تسک ۱۶: داشبورد هوشمند
|
|
|
|
## هیچ migration لازم نیست
|
|
|
|
همه دادهها از جداول موجود و جداول ساختهشده در تسکهای قبل خوانده میشوند.
|
|
|
|
## Query های جدید
|
|
|
|
### نوبتها بر اساس روز (admin chart)
|
|
```sql
|
|
SELECT
|
|
FLOOR(created_at / 86400) * 86400 AS date_unix,
|
|
COUNT(*) AS count
|
|
FROM appointments
|
|
WHERE created_at BETWEEN :from AND :to
|
|
GROUP BY date_unix
|
|
ORDER BY date_unix ASC
|
|
```
|
|
|
|
### درآمد بر اساس روز (از patient_sessions)
|
|
```sql
|
|
SELECT
|
|
FLOOR(created_at / 86400) * 86400 AS date_unix,
|
|
SUM(final_price_rials) AS amount_rials
|
|
FROM patient_sessions
|
|
WHERE entity_type = :entityType
|
|
AND record_id IN (
|
|
SELECT id FROM patient_records WHERE entity_type = :entityType AND entity_id = :entityId
|
|
)
|
|
AND created_at BETWEEN :from AND :to
|
|
GROUP BY date_unix
|
|
ORDER BY date_unix ASC
|
|
```
|
|
|
|
### فروش اشتراک بر اساس پنل (admin)
|
|
```sql
|
|
SELECT
|
|
sp.name AS plan,
|
|
COUNT(cs.id) AS count,
|
|
SUM(p.amount) AS total_rials
|
|
FROM clinic_subscriptions cs
|
|
JOIN subscription_plans sp ON cs.plan_id = sp.id
|
|
LEFT JOIN payments p ON cs.payment_id = p.id
|
|
WHERE cs.is_trial = 0
|
|
AND cs.created_at BETWEEN :from AND :to
|
|
GROUP BY sp.name
|
|
```
|
|
|
|
### بیماران منحصربهفرد در بازه
|
|
```sql
|
|
SELECT COUNT(DISTINCT pr.user_id) AS unique_count
|
|
FROM patient_records pr
|
|
JOIN patient_sessions ps ON ps.record_id = pr.id
|
|
WHERE pr.entity_type = :entityType
|
|
AND pr.entity_id = :entityId
|
|
AND ps.created_at BETWEEN :from AND :to
|
|
```
|
|
|
|
## نکات مهم
|
|
|
|
- تمام `created_at` ها Unix timestamp هستند — فیلتر بازه زمانی مستقیم روی عدد اعمال میشود
|
|
- گروهبندی روزانه: `FLOOR(created_at / 86400) * 86400` → شروع روز به Unix
|
|
- نمایش در frontend: تبدیل Unix به تاریخ شمسی با `formatDate()`
|