Files
Logic/Modules/Backend/docs/fertilization_recommendation_frontend.md
2026-05-11 03:27:21 +03:30

331 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fertilization Recommendation History APIs
این فایل برای تیم فرانت نوشته شده تا بتواند از APIهای history توصیه های کودهی استفاده کند.
## وضعیت recommendation
هر recommendation یک status دارد.
### statusهای ممکن
- `pending_confirmation``منتظر تایید`
- `in_progress``در حال مصرف`
- `completed``پایان یافته`
### وضعیت فعلی سیستم
فعلاً همه recommendationهای جدید و recommendationهای قبلی که migrate شده اند با وضعیت زیر ذخیره می شوند:
- `pending_confirmation`
- برچسب نمایشی: `منتظر تایید`
فرانت باید `status` را برای منطق برنامه و `status_label` را برای نمایش مستقیم استفاده کند.
---
## 1) لیست توصیه های کودهی یک مزرعه
### Endpoint
`GET /api/fertilization/recommendations/?farm_uuid=<farm_uuid>`
### کاربرد
- نمایش history توصیه های کودهی یک مزرعه
- ساخت جدول یا لیست برای مشاهده توصیه های قبلی
- نمایش badge وضعیت recommendation
- ورود به صفحه جزئیات هر recommendation
### Query Params
- `farm_uuid`: شناسه مزرعه
- `crop_id`: شناسه یا نام محصول. این فیلد همان plant name است و مستقیم برای AI هم ارسال می شود
- `page`: شماره صفحه، شروع از `1`
- `page_size`: تعداد آیتم در هر صفحه، بین `1` تا `100`
### هدرها
- `Authorization: Bearer <token>`
- `Accept: application/json`
### نمونه درخواست
```bash
curl -X GET \
'http://localhost:8000/api/fertilization/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": "4d595ee0-9dbb-4c50-a871-2b4359d0d748",
"crop_id": "گندم",
"plant_name": "گندم",
"growth_stage": "vegetative",
"fertilizer_type": "NPK",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"requested_at": "2025-01-10T08:30:00Z"
},
{
"recommendation_uuid": "bbdf0d50-0f78-4099-a4d3-b1c4aa54eeb9",
"crop_id": "ذرت",
"plant_name": "ذرت",
"growth_stage": "flowering",
"fertilizer_type": "Micronutrient",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"requested_at": "2025-01-08T09:10:00Z"
}
],
"pagination": {
"page": 1,
"page_size": 10,
"total_pages": 3,
"total_items": 25,
"has_next": true,
"has_previous": false,
"next": "http://localhost:8000/api/fertilization/recommendations/?farm_uuid=11111111-1111-1111-1111-111111111111&page=2&page_size=10",
"previous": null
}
}
```
### فیلدهای `data[]`
- `recommendation_uuid`: شناسه یکتای recommendation برای گرفتن جزئیات
- `crop_id`: شناسه یا نام محصول ثبت شده در recommendation
- `plant_name`: معادل نمایشی `crop_id` برای سازگاری با فرانت
- `growth_stage`: مرحله رشد در زمان ثبت recommendation
- `fertilizer_type`: نوع کود پیشنهادی مثل `NPK`
- `status`: کد وضعیت recommendation
- `status_label`: متن نمایشی وضعیت recommendation
- `requested_at`: زمان ثبت recommendation
### فیلدهای `pagination`
- `page`: صفحه فعلی
- `page_size`: تعداد آیتم در هر صفحه
- `total_pages`: تعداد کل صفحات
- `total_items`: تعداد کل recommendationها
- `has_next`: آیا صفحه بعدی وجود دارد یا نه
- `has_previous`: آیا صفحه قبلی وجود دارد یا نه
- `next`: لینک صفحه بعدی
- `previous`: لینک صفحه قبلی
### پیشنهاد نمایش status در UI
- `pending_confirmation` → badge زرد یا خاکستری روشن
- `in_progress` → badge آبی یا سبز
- `completed` → badge خاکستری یا سفید
### خطاهای رایج
#### مزرعه پیدا نشد
```json
{
"farm_uuid": [
"Farm not found."
]
}
```
#### پارامترهای pagination نامعتبر
```json
{
"page": [
"Ensure this value is greater than or equal to 1."
]
}
```
---
## 2) جزئیات یک recommendation
### Endpoint
`GET /api/fertilization/recommendations/<recommendation_uuid>/`
### کاربرد
- نمایش کامل جزئیات recommendation
- باز کردن صفحه detail یا modal recommendation
- replay کردن خروجی recommendation بدون نیاز به درخواست مجدد از AI
### Path Param
- `recommendation_uuid`: شناسه recommendation از API لیست
### نکته مهم برای محصول
- فیلد اصلی محصول در این ماژول `crop_id` است
- `crop_id` همان plant name است
- بک اند همان `crop_id` را مستقیم برای AI ارسال می کند
- `plant_name` در response فقط برای سازگاری فرانت نگه داشته شده و مقدارش برابر `crop_id` است
### هدرها
- `Authorization: Bearer <token>`
- `Accept: application/json`
### نمونه درخواست
```bash
curl -X GET \
'http://localhost:8000/api/fertilization/recommendations/4d595ee0-9dbb-4c50-a871-2b4359d0d748/' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <token>'
```
### نمونه پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"data": {
"crop_id": "گندم",
"plant_name": "گندم",
"growth_stage": "vegetative",
"status": "pending_confirmation",
"status_label": "منتظر تایید",
"primary_recommendation": {
"fertilizer_code": "npk-202020",
"fertilizer_name": "NPK 20-20-20",
"display_title": "کود کامل متعادل",
"fertilizer_type": "NPK",
"npk_ratio": {
"n": 20,
"p": 20,
"k": 20,
"label": "20-20-20"
},
"application_method": {
"id": "fertigation",
"label": "کودآبیاری"
},
"application_interval": {
"value": 14,
"unit": "day",
"label": "هر 14 روز"
},
"dosage": {
"base_amount_per_hectare": 65,
"base_amount_per_square_meter": 0.0065,
"unit": "kg",
"label": "65 کیلوگرم در هکتار",
"calculation_basis": "engine-v2"
},
"reasoning": "متعادل برای فاز رشد",
"summary": "مصرف منظم در این مرحله توصیه می شود"
},
"nutrient_analysis": {
"macro": [
{
"key": "n",
"name": "Nitrogen",
"value": 20,
"unit": "percent",
"description": "تقویت رشد رویشی"
}
],
"micro": []
},
"application_guide": {
"safety_warning": "در ساعات خنک مصرف شود",
"steps": [
{
"step_number": 1,
"title": "حل کردن",
"description": "کود را در آب حل کنید"
}
]
},
"alternative_recommendations": [
{
"fertilizer_code": "npk-121236",
"fertilizer_name": "NPK 12-12-36",
"fertilizer_type": "NPK",
"usage_method": "fertigation",
"description": "برای نیاز پتاس بالا"
}
],
"sections": [
{
"type": "recommendation",
"title": "پیشنهاد اصلی",
"icon": "leaf",
"content": "NPK 20-20-20"
}
]
}
}
```
### نکته مهم
این response دقیقا همان ساختار endpoint زیر را برمی گرداند:
`POST /api/fertilization/recommend/`
یعنی فرانت می تواند برای صفحه detail همان componentهایی را استفاده کند که برای recommendation اصلی استفاده می کند.
### خطای رایج
#### recommendation پیدا نشد
```json
{
"code": 404,
"msg": "Recommendation not found."
}
```
---
## پیشنهاد پیاده سازی در فرانت
### برای صفحه history
- ابتدا API لیست را با `farm_uuid` صدا بزنید
- `data` را در جدول یا کارت لیست نمایش دهید
- `status_label` را مستقیم در badge یا chip نشان دهید
- اگر لازم بود رفتار UI بر اساس وضعیت تغییر کند، از `status` استفاده کنید
- با `pagination.page` و `pagination.total_pages` صفحه بندی را بسازید
- روی هر آیتم با `recommendation_uuid` به صفحه detail بروید
### برای صفحه detail
- `recommendation_uuid` را از route بگیرید
- API جزئیات را صدا بزنید
- `data.primary_recommendation` را در Hero/Card اصلی نمایش دهید
- `data.nutrient_analysis` را در بخش تحلیل عناصر نمایش دهید
- `data.application_guide` را در بخش راهنمای مصرف نمایش دهید
- `data.alternative_recommendations` را برای جایگزین ها نمایش دهید
- در صورت نیاز برای سازگاری، از `data.sections` هم استفاده کنید
### فرمول محاسبه مقدار مصرف
```text
مقدار کل = base_amount_per_square_meter × مساحت مزرعه
```
---
## خلاصه مسیرها
- لیست recommendationها:
- `GET /api/fertilization/recommendations/?farm_uuid=<farm_uuid>&page=1&page_size=10`
- جزئیات recommendation:
- `GET /api/fertilization/recommendations/<recommendation_uuid>/`