Files

493 lines
13 KiB
Markdown
Raw Permalink Normal View History

2026-04-28 19:01:00 +03:30
# مستند API آبیاری و محصولات انتخاب‌شده
این فایل برای تحویل به فرانت نوشته شده و endpointهای مرتبط با آبیاری را به‌صورت کامل توضیح می‌دهد.
محدوده این مستند:
2026-05-02 06:16:36 +03:30
- همه endpointهای `irrigation/urls.py`
2026-04-28 19:01:00 +03:30
- endpoint دریافت محصولات انتخاب‌شده مزرعه: `GET /api/plants/selected/`
## نکات عمومی
- همه endpointها نیاز به authentication کاربر دارند، مگر اینکه در gateway یا لایه بالاتر خلاف آن تنظیم شده باشد.
- در همه endpointهای وابسته به مزرعه، `farm_uuid` باید متعلق به همان کاربر لاگین‌شده باشد.
- فرمت کلی پاسخ‌های موفق در این backend معمولاً به شکل زیر است:
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
- در خطاهای اعتبارسنجی معمولاً ساختار زیر برمی‌گردد:
```json
{
"farm_uuid": [
"This field is required."
]
}
```
یا در بعضی endpointها:
```json
{
"code": 404,
"msg": "error",
"data": {
"farm_uuid": [
"Farm not found."
]
}
}
```
---
# 1) محصولات انتخاب‌شده مزرعه
## GET `/api/plants/selected/`
این endpoint برای گرفتن محصول/محصولات انتخاب‌شده یک مزرعه استفاده می‌شود؛ یعنی همان محصولاتی که روی خود `FarmHub.products` ذخیره شده‌اند.
این endpoint برای فرانت مفید است وقتی می‌خواهید:
- محصول فعلی مزرعه را نمایش دهید
- لیست گیاه‌های متصل به مزرعه را برای انتخاب stage یا recommendation استفاده کنید
- قبل از درخواست recommendation، محصول‌های مرتبط با همان مزرعه را بخوانید
### Query Params
#### `farm_uuid`
- نوع: `string (uuid)`
- اجباری: بله
- توضیح: شناسه مزرعه برای خواندن محصولات انتخاب‌شده آن.
### نمونه درخواست
```bash
curl -s "http://localhost:8000/api/plants/selected/?farm_uuid=11111111-1111-1111-1111-111111111111" \
-H "accept: application/json" \
-H "Authorization: Bearer <token>"
```
### پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"data": [
{
"name": "گوجه فرنگی",
"icon": "tabler-carrot",
"growth_stages": ["رویشی", "گلدهی", "میوه دهی"]
}
]
}
```
### فیلدهای هر آیتم
#### `name`
- نوع: `string`
- توضیح: نام محصول.
#### `icon`
- نوع: `string`
- توضیح: آیکون پیشنهادی برای UI.
#### `growth_stages`
- نوع: `array<string>`
- توضیح: مراحل رشد قابل استفاده برای فرانت.
### خطاهای رایج
#### اگر `farm_uuid` ارسال نشود
```json
{
"farm_uuid": ["This field is required."]
}
```
#### اگر مزرعه متعلق به کاربر نباشد یا پیدا نشود
```json
{
"farm_uuid": ["Farm not found."]
}
```
# 5) تولید recommendation آبیاری
## POST `/api/irrigation/recommend/`
این endpoint recommendation آبیاری را تولید می‌کند و خروجی آن با UI فعلی recommendation هماهنگ شده است.
نکته مهم:
- روش آبیاری از body فرانت خوانده نمی‌شود.
- backend روش آبیاری را از خود مزرعه (`FarmHub.irrigation_method_id` و `FarmHub.irrigation_method_name`) برمی‌دارد.
- بنابراین قبل از صدا زدن این endpoint، فرانت باید روش آبیاری انتخاب‌شده را روی مزرعه ذخیره کرده باشد.
## ساختار کلی پاسخ
```json
{
"code": 200,
"msg": "success",
"data": {
"recommendation_uuid": "...",
"crop_id": "گوجه فرنگی",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"plan": {},
"water_balance": {},
"timeline": [],
"sections": []
}
}
```
## Request
### حداقل payload پیشنهادی
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی"
}
```
### فیلدهای Request
### `farm_uuid`
- نوع: `string`
- اجباری: بله
- توضیح: شناسه یکتای مزرعه.
### `sensor_uuid`
- نوع: `string`
- اجباری: خیر
- توضیح: نام قدیمی برای `farm_uuid`. اگر `farm_uuid` ارسال نشده باشد، این مقدار به جای آن استفاده می‌شود.
### `plant_name`
- نوع: `string`
- اجباری: خیر
- توضیح: نام گیاه هدف برای تولید recommendation.
### `growth_stage`
- نوع: `string`
- اجباری: خیر
- توضیح: مرحله رشد گیاه، مثل `رویشی`، `گلدهی` یا `میوه دهی`.
## فیلدهای `data`
### `recommendation_uuid`
- نوع: `string (uuid)`
- توضیح: شناسه recommendation ذخیره‌شده برای history/detail.
### `crop_id`
- نوع: `string`
- توضیح: نام/شناسه گیاه ذخیره‌شده روی recommendation.
### `plant_name`
- نوع: `string`
- توضیح: معادل `crop_id` برای مصرف آسان‌تر در UI.
### `growth_stage`
- نوع: `string`
- توضیح: مرحله رشد ذخیره‌شده همراه recommendation.
### `irrigation_method_name`
- نوع: `string`
- توضیح: نام روش آبیاری خوانده‌شده از مزرعه.
### `status`
- نوع: `string`
- توضیح: وضعیت recommendation. مقادیر فعلی:
- `in_progress`
- `pending_confirmation`
- `completed`
- `error`
### `status_label`
- نوع: `string`
- توضیح: متن فارسی وضعیت برای نمایش مستقیم در UI.
### `plan`
- نوع: `object`
- توضیح: خلاصه اصلی recommendation برای کارت بالای UI.
### `water_balance`
- نوع: `object`
- توضیح: تراز آب و خروجی محاسبات روزانه.
### `timeline`
- نوع: `array`
- توضیح: مراحل اجرایی recommendation برای stepper.
### `sections`
- نوع: `array`
- توضیح: هشدارها و نکات تکمیلی.
## نمونه پاسخ حداقلی قابل استفاده
```json
{
"code": 200,
"msg": "success",
"data": {
"recommendation_uuid": "8a4c22d8-3f75-4aef-8e04-b40f6b4a2d11",
"crop_id": "گوجه فرنگی",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"plan": {
"frequencyPerWeek": 4,
"durationMinutes": 38,
"bestTimeOfDay": "05:30 تا 08:00 صبح",
"moistureLevel": 72,
"warning": "در ساعات گرم روز آبیاری انجام نشود"
},
"water_balance": {
"active_kc": 0.93,
"crop_profile": {
"kc_initial": 0.55,
"kc_mid": 1.05,
"kc_end": 0.78
},
"daily": [
{
"forecast_date": "2025-02-12",
"et0_mm": 5.4,
"etc_mm": 4.9,
"effective_rainfall_mm": 0,
"gross_irrigation_mm": 17,
"irrigation_timing": "05:30 - 07:00"
}
]
},
"timeline": [
{
"step_number": 1,
"title": "بررسی فشار",
"description": "فشار ابتدا و انتهای لاین کنترل شود"
}
],
"sections": [
{
"title": "هشدار تبخیر بالا",
"icon": "tabler-alert-triangle",
"type": "warning",
"content": "در ساعات گرم روز آبیاری انجام نشود"
},
{
"title": "نکته بهره وری",
"icon": "tabler-bulb",
"type": "tip",
"content": "شست وشوی فیلترها به یکنواختی آبیاری کمک می کند"
}
]
}
}
```
---
# 6) لیست recommendationهای آبیاری
## GET `/api/irrigation/recommendations/`
این endpoint history recommendationهای آبیاری یک مزرعه را برمی‌گرداند.
### Query Params
#### `farm_uuid`
- نوع: `string (uuid)`
- اجباری: بله
#### `page`
- نوع: `number`
- اجباری: خیر
- پیش‌فرض: `1`
#### `page_size`
- نوع: `number`
- اجباری: خیر
- پیش‌فرض backend: `10`
- حداکثر: `100`
### نمونه درخواست
```bash
curl -s "http://localhost:8000/api/irrigation/recommendations/?farm_uuid=11111111-1111-1111-1111-111111111111&page=1&page_size=10" \
-H "accept: application/json" \
-H "Authorization: Bearer <token>"
```
### پاسخ موفق نمونه
```json
{
"code": 200,
"msg": "success",
"data": [
{
"recommendation_uuid": "8a4c22d8-3f75-4aef-8e04-b40f6b4a2d11",
"crop_id": "گوجه فرنگی",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"requested_at": "2025-02-12T09:30:00Z"
}
],
"pagination": {
"page": 1,
"page_size": 10,
"total_pages": 1,
"total_items": 1,
"has_next": false,
"has_previous": false,
"next": null,
"previous": null
}
}
```
### فیلدهای هر آیتم
#### `recommendation_uuid`
- نوع: `string (uuid)`
- توضیح: شناسه recommendation برای باز کردن جزئیات.
#### `crop_id`
- نوع: `string`
- توضیح: نام/شناسه گیاه.
#### `plant_name`
- نوع: `string`
- توضیح: معادل `crop_id`.
#### `growth_stage`
- نوع: `string`
- توضیح: مرحله رشد ثبت‌شده.
#### `irrigation_method_name`
- نوع: `string`
- توضیح: نام روش آبیاری.
#### `status`
- نوع: `string`
- توضیح: وضعیت recommendation.
#### `status_label`
- نوع: `string`
- توضیح: متن فارسی وضعیت.
#### `requested_at`
- نوع: `string(datetime)`
- توضیح: زمان ساخت recommendation.
---
# 7) جزئیات یک recommendation آبیاری
## GET `/api/irrigation/recommendations/{recommendation_uuid}/`
این endpoint جزئیات یک recommendation ذخیره‌شده را با همان shape endpoint اصلی recommendation برمی‌گرداند.
### Path Params
#### `recommendation_uuid`
- نوع: `string (uuid)`
- اجباری: بله
- توضیح: شناسه recommendation.
### پاسخ موفق نمونه
```json
{
"code": 200,
"msg": "success",
"data": {
"recommendation_uuid": "8a4c22d8-3f75-4aef-8e04-b40f6b4a2d11",
"crop_id": "گوجه فرنگی",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "completed",
"status_label": "پایان یافته",
"plan": {
"frequencyPerWeek": 4,
"durationMinutes": 30
},
"water_balance": {
"active_kc": 0.93,
"daily": []
},
"timeline": [
{
"step_number": 1,
"title": "مرحله اول",
"description": "اجرا شود"
}
],
"sections": [
{
"type": "tip",
"title": "نکته",
"content": "صبح زود آبیاری شود"
}
]
}
}
```
### خطای عدم وجود recommendation
```json
{
"code": 404,
"msg": "Recommendation not found."
}
```
---
# 9) پیشنهاد جریان استفاده در فرانت
برای صفحه recommendation آبیاری، ترتیب پیشنهادی این است:
1. با `GET /api/irrigation/` لیست روش‌های آبیاری را بگیرید.
2. کاربر یکی از روش‌ها را انتخاب کند.
3. روش انتخاب‌شده را روی مزرعه ذخیره کنید (`irrigation_method_id` و `irrigation_method_name`).
4. با `GET /api/plants/selected/?farm_uuid=...` محصولات انتخاب‌شده مزرعه را بگیرید.
5. کاربر محصول و مرحله رشد را انتخاب کند.
6. `POST /api/irrigation/recommend/` را فقط با `farm_uuid` و `plant_name` و `growth_stage` صدا بزنید.
7. برای history از `GET /api/irrigation/recommendations/` و برای جزئیات از `GET /api/irrigation/recommendations/{recommendation_uuid}/` استفاده کنید.
---
# 10) جمع‌بندی سریع endpointها
| Method | Path | کاربرد |
|---|---|---|
| GET | `/api/plants/selected/` | گرفتن محصولات انتخاب‌شده مزرعه |
| GET | `/api/irrigation/` | گرفتن لیست روش‌های آبیاری |
| POST | `/api/irrigation/` | ایجاد روش آبیاری جدید در upstream |
| GET | `/api/irrigation/config/` | گرفتن config اولیه صفحه recommendation |
| POST | `/api/irrigation/recommend/` | تولید recommendation آبیاری |
| GET | `/api/irrigation/recommendations/` | گرفتن history recommendationهای آبیاری |
| GET | `/api/irrigation/recommendations/{recommendation_uuid}/` | گرفتن جزئیات یک recommendation |
| POST | `/api/irrigation/water-stress/` | گرفتن شاخص تنش آبی |