Files

535 lines
12 KiB
Markdown
Raw Permalink Normal View History

2026-04-28 19:00:11 +03:30
# Smart Irrigation Backend Integration
این فایل مشخص می کند صفحه
`src/views/dashboards/farm/smartIrrigation/SmartIrrigationRecommendation.tsx`
برای کار کامل با بک‌اند دقیقا چه داده هایی لازم دارد و از کدام endpointها باید استفاده کند.
هدف این سند:
- حذف داده های ماک
- مشخص شدن contract حداقلی بین فرانت و بک‌اند
- معلوم شدن این که هر بخش UI از کدام فیلد تغذیه می شود
---
## 1) دریافت محصولات انتخاب شده مزرعه
### Endpoint
`GET /api/plants/selected/?farm_uuid=<uuid>`
### کاربرد در UI
برای این بخش ها استفاده می شود:
- نمایش لیست محصول ها برای انتخاب
- گرفتن stageهای هر محصول
- انتخاب مقدار اولیه `selectedCrop`
- انتخاب مقدار اولیه `growthStage`
### فیلدهای لازم از response
```json
{
"data": [
{
"name": "گوجه فرنگی",
"icon": "tabler-carrot",
"growth_stages": ["رویشی", "گلدهی", "میوه دهی"]
}
]
}
```
### فیلدهای مصرفی
- `data[].name`
- برای `crop.id`
- برای `crop.name`
- `data[].icon`
- برای آیکن کارت محصول
- `data[].growth_stages[]`
- برای لیست stageها
---
## 2) تولید recommendation آبیاری
### Endpoint
`POST /api/irrigation/recommend/`
### Request payload مورد نیاز فرانت
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی"
}
```
### نکته مهم
در UI فعلی برای recommendation فقط این سه فیلد برای request لازم هستند:
- `farm_uuid`
- `plant_name`
- `growth_stage`
---
## 3) فیلدهای لازم از response recommendation
فرانت در وضعیت فعلی فقط این بخش ها را برای نمایش نتیجه لازم دارد.
### ساختار کلی مورد نیاز
```json
{
"code": 200,
"msg": "success",
"data": {
"recommendation_uuid": "uuid",
"crop_id": "گوجه فرنگی",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"plan": {},
"water_balance": {},
"timeline": [],
"sections": []
}
}
```
---
## 4) مصرف دقیق هر فیلد در UI recommendation
## 4.1) هدر صفحه نتیجه
برای نوار بالای صفحه نتیجه:
- `data.plant_name`
- `data.growth_stage`
کاربرد:
- ساخت `resultContext`
- نمایش عنوان بالای صفحه بعد از تولید recommendation
---
## 4.2) کارت Instruction Details
این کارت از این فیلدها تغذیه می شود:
### از `plan`
- `plan.frequencyPerWeek`
- `plan.durationMinutes`
- `plan.bestTimeOfDay`
- `plan.moistureLevel`
### از `water_balance`
- `water_balance.daily[].gross_irrigation_mm`
### نمونه حداقلی
```json
{
"plan": {
"frequencyPerWeek": 4,
"durationMinutes": 38,
"bestTimeOfDay": "05:30 تا 08:00 صبح",
"moistureLevel": 72,
"warning": "در ساعات گرم روز آبیاری انجام نشود"
},
"water_balance": {
"daily": [
{
"gross_irrigation_mm": 17
}
]
}
}
```
### نکته
در UI فعلی مقدار `Water Amount` با تکیه بر:
- `water_balance.daily[0].gross_irrigation_mm`
- و مساحت انتخابی در فرانت
محاسبه می شود.
اگر بخواهید محاسبه دقیق تر و backend-driven شود، بهتر است بک‌اند یکی از این دو را هم بدهد:
- `recommended_liters_per_hectare`
- یا `recommended_total_liters`
اما فعلا UI بدون اینها هم کار می کند.
---
## 4.3) Gauge / Circular Indicator
برای gauge فقط این دو مقدار لازم است:
- `plan.moistureLevel`
- `water_balance.daily` لازم نیست
و اگر بخواهید target هم از بک‌اند بیاید، بهتر است این فیلد اضافه شود:
- `target_moisture`
### وضعیت فعلی
در نسخه فعلی فرانت هنوز یک target mock-style استفاده می کند.
برای اتصال کامل بهتر است بک‌اند این فیلد را هم داخل `plan` برگرداند:
```json
{
"plan": {
"moistureLevel": 72,
"targetMoisture": 78
}
}
```
### پیشنهاد
اگر ممکن است این فیلد به response اضافه شود:
- `plan.targetMoisture`
---
## 4.4) تراز آب و نیاز روزانه
این بخش مستقیما از `water_balance` استفاده می کند.
### فیلدهای لازم
```json
{
"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"
}
]
}
}
```
### فیلدهای مصرفی
#### از `water_balance.daily[]`
- `forecast_date`
- `gross_irrigation_mm`
- `irrigation_timing`
- `et0_mm`
- `etc_mm`
- `effective_rainfall_mm`
#### از `water_balance.crop_profile`
- `kc_initial`
- `kc_mid`
- `kc_end`
#### از `water_balance`
- `active_kc`
- فعلا در UI اصلی مستقیم رندر نمی شود، ولی برای آینده مفید است
---
## 4.5) Stepper مراحل و دستورالعمل اجرا
برای این بخش فقط `timeline` لازم است.
### ساختار لازم
```json
{
"timeline": [
{
"step_number": 1,
"title": "بررسی فشار",
"description": "فشار ابتدا و انتهای لاین کنترل شود"
}
]
}
```
### فیلدهای مصرفی
- `timeline[].step_number`
- `timeline[].title`
- `timeline[].description`
### نکته
در UI فعلی این فیلدها کافی هستند.
فیلدهایی مثل `time_label` یا `state` فعلا لازم نیستند.
---
## 4.6) هشدارها و نکات
این بخش از `plan.warning` و `sections` استفاده می کند.
### فیلدهای لازم
```json
{
"plan": {
"warning": "در ساعات گرم روز آبیاری انجام نشود"
},
"sections": [
{
"title": "هشدار تبخیر بالا",
"icon": "tabler-alert-triangle",
"type": "warning",
"content": "در ساعات گرم روز آبیاری انجام نشود"
},
{
"title": "نکته بهره وری",
"icon": "tabler-bulb",
"type": "tip",
"content": "شست وشوی فیلترها به یکنواختی آبیاری کمک می کند"
}
]
}
```
### مصرف در UI
#### هشدارها
- `plan.warning`
- `sections[].type === "warning"`
- `sections[].content`
#### نکات پایین صفحه
- `sections[].type === "tip"`
- `sections[].title`
- `sections[].icon`
- `sections[].content`
---
## 5) حداقل response پیشنهادی برای recommendation
اگر هدف فقط راه افتادن UI فعلی recommendation باشد، این حداقل پاسخ کافی است:
```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,
"targetMoisture": 78,
"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) history recommendationهای آبیاری
### Endpoint
`GET /api/irrigation/recommendations/?farm_uuid=<uuid>&page=1&page_size=10`
### کاربرد در UI
برای جدول history پایین فرم استفاده می شود.
### فیلدهای لازم هر آیتم
```json
{
"recommendation_uuid": "uuid",
"plant_name": "گوجه فرنگی",
"growth_stage": "گلدهی",
"irrigation_method_name": "آبیاری قطره ای",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"requested_at": "2025-02-12T09:30:00Z"
}
```
### نکته مهم برای فرانت فعلی
در کد فعلی جدول history این فیلد را به عنوان ستون روش آبیاری می خواهد:
- `irrigation_method`
اما طبق contract بک‌اند، فیلد موجود این است:
- `irrigation_method_name`
### نتیجه
برای اتصال کامل یکی از این دو کار باید انجام شود:
1. یا فرانت `irrigation_method_name` را بخواند
2. یا بک‌اند علاوه بر آن، فیلد `irrigation_method` هم برگرداند
پیشنهاد بهتر:
- فرانت را با `irrigation_method_name` align کنید
### pagination لازم
```json
{
"pagination": {
"page": 1,
"page_size": 10,
"total_pages": 1,
"total_items": 1,
"has_next": false,
"has_previous": false,
"next": null,
"previous": null
}
}
```
---
## 7) جزئیات یک recommendation
### Endpoint
`GET /api/irrigation/recommendations/{recommendation_uuid}/`
### کاربرد در UI
وقتی کاربر از جدول history روی آیکن گزارش کلیک می کند، این endpoint باید صدا زده شود.
### ساختار لازم
خروجی این endpoint باید همان shape endpoint recommendation اصلی را برگرداند؛ یعنی:
- `recommendation_uuid`
- `plant_name`
- `growth_stage`
- `irrigation_method_name`
- `status`
- `status_label`
- `plan`
- `water_balance`
- `timeline`
- `sections`
---
## 8) فیلدهایی که فعلا در UI لازم نیستند
این فیلدها در نسخه فعلی صفحه ضروری نیستند:
- `raw_response`
- `crop_id` (اگر `plant_name` وجود داشته باشد)
- `sensor_uuid`
- `status` در خود recommendation result page
- `generated_at`
- `final_verdict`
- `recommendation_title`
- `recommendation_subtitle`
- `primary_method`
- `usage_summary`
- `alternative_plans`
- `sections[].type = schedule`
- `sections[].type = method`
---
## 9) جمع بندی نهایی
برای این صفحه اگر بخواهیم فقط داده های ضروری از بک‌اند بگیریم، این endpointها کافی هستند:
1. `GET /api/plants/selected/`
2. `POST /api/irrigation/recommend/`
3. `GET /api/irrigation/recommendations/`
4. `GET /api/irrigation/recommendations/{recommendation_uuid}/`
و برای recommendation page حداقل این بخش های response باید حتما وجود داشته باشند:
- `plant_name`
- `growth_stage`
- `plan`
- `water_balance`
- `timeline`
- `sections`
و برای history:
- `recommendation_uuid`
- `plant_name`
- `growth_stage`
- `irrigation_method_name`
- `status`
- `status_label`
- `requested_at`
- `pagination`