Files
Logic/Modules/Ai/docs/crop_simulation_api_reference.md
T
2026-05-11 03:27:21 +03:30

1184 lines
36 KiB
Markdown

# Crop Simulation API Reference
این فایل توضیح کامل API های ماژول `crop_simulation` را پوشش می دهد:
- `POST /api/crop-simulation/current-farm-chart/`
- `POST /api/crop-simulation/growth/`
- `GET /api/crop-simulation/growth/{task_id}/status/`
- `POST /api/crop-simulation/harvest-prediction/`
- `GET /api/crop-simulation/yield-harvest-summary/`
- `POST /api/crop-simulation/yield-prediction/`
---
## الگوی کلی پاسخ ها
تقریبا همه endpoint ها از الگوی envelope زیر استفاده می کنند:
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
### معنی فیلدهای envelope
| فیلد | نوع | توضیح |
|---|---|---|
| `code` | integer | کد منطقی پاسخ. معمولا با HTTP status همسو است. |
| `msg` | string | پیام کوتاه پاسخ. در موفقیت معمولا `success` و در خطا متن فارسی خطا است. |
| `data` | object / null | بدنه اصلی داده. در خطاهای validation معمولا شامل جزئیات خطا است. |
### خطاهای رایج
| HTTP Status | `code` | توضیح |
|---|---|---|
| `400` | `400` | ورودی نامعتبر است؛ مثل نبودن `farm_uuid` یا ناقص بودن payload |
| `500` | `500` | اجرای سرویس یا شبیه سازی داخلی با خطا مواجه شده است |
| `202` | `202` | تسک async با موفقیت در صف قرار گرفته است |
---
## 1) POST `/api/crop-simulation/current-farm-chart/`
### کاربرد
برای ساخت chart وضعیت فعلی مزرعه با استفاده از شبیه سازی رشد.
این endpoint داده هایی مثل:
- روند روزانه رشد
- بیوماس
- وزن محصول
- شاخص سطح برگ
- رطوبت خاک
را برمی گرداند.
### درخواست
#### Body
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه‌فرنگی"
}
```
### فیلدهای ورودی
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `farm_uuid` | string (UUID) | بله | شناسه یکتای مزرعه |
| `plant_name` | string | خیر | نام گیاه. اگر ارسال نشود سیستم سعی می کند گیاه پیش فرض مزرعه را تشخیص دهد |
### پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"data": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه‌فرنگی",
"engine": "growth_projection",
"model_name": "growth_projection_v1",
"scenario_id": 12,
"simulation_warning": null,
"categories": ["2026-04-01", "2026-04-02"],
"series": [
{
"name": "تعداد برگ تخمینی",
"key": "leaf_count_estimate",
"data": [120.0, 140.0]
},
{
"name": "وزن بیوماس",
"key": "biomass_weight",
"data": [35.0, 45.0]
}
],
"summary": [
{
"title": "تعداد برگ تخمینی",
"subtitle": "وضعیت فعلی",
"amount": 140.0,
"unit": "leaf",
"avatarColor": "success",
"avatarIcon": "tabler-leaf"
}
],
"current_state": {
"date": "2026-04-02",
"leaf_count_estimate": 140.0,
"leaf_area_index": 0.0117,
"biomass_weight": 45.0,
"storage_organ_weight": 10.0,
"soil_moisture_percent": 41.2,
"development_stage": 0.35,
"gdd": 9.0
},
"metrics": {
"yield_estimate": 10.0
},
"daily_output": []
}
}
```
### توضیح کامل فیلدهای پاسخ
| فیلد | نوع | توضیح |
|---|---|---|
| `farm_uuid` | string / null | شناسه مزرعه |
| `plant_name` | string | نام گیاهی که شبیه سازی برای آن انجام شده |
| `engine` | string / null | موتور شبیه سازی استفاده شده |
| `model_name` | string / null | نام مدل شبیه سازی |
| `scenario_id` | integer / null | شناسه سناریو اگر در سیستم ثبت شده باشد |
| `simulation_warning` | string / null | هشدار غیر بحرانی؛ مثلا وقتی fallback استفاده شده |
| `categories` | array[string] | محور زمانی نمودار؛ معمولا تاریخ های روزانه |
| `series` | array[object] | سری های نمودار برای رندر frontend |
| `summary` | array[object] | کارت های خلاصه برای نمایش سریع وضعیت فعلی |
| `current_state` | object | وضعیت آخرین روز شبیه سازی |
| `metrics` | object | شاخص های محاسبه شده نهایی |
| `daily_output` | array[object] | خروجی روزانه خام شبیه سازی |
### ساختار `series`
هر عضو `series` معمولا این ساختار را دارد:
| فیلد | نوع | توضیح |
|---|---|---|
| `name` | string | عنوان سری برای chart |
| `key` | string | کلید فنی سری |
| `data` | array[number] | داده های عددی سری به ترتیب `categories` |
نمونه key های مهم:
- `leaf_count_estimate`
- `biomass_weight`
- `storage_organ_weight`
- `lai`
- `soil_moisture_percent`
### ساختار `summary`
هر آیتم `summary` یک KPI card است:
| فیلد | نوع | توضیح |
|---|---|---|
| `title` | string | عنوان کارت |
| `subtitle` | string | زیرعنوان |
| `amount` | number | مقدار اصلی کارت |
| `unit` | string | واحد |
| `avatarColor` | string | رنگ پیشنهادی برای UI |
| `avatarIcon` | string | آیکن پیشنهادی برای UI |
### ساختار `current_state`
| فیلد | نوع | توضیح |
|---|---|---|
| `date` | string | تاریخ آخرین رکورد |
| `leaf_count_estimate` | number | تعداد برگ تخمینی |
| `leaf_area_index` | number | شاخص سطح برگ (LAI) |
| `biomass_weight` | number | وزن بیوماس |
| `storage_organ_weight` | number | وزن اندام ذخیره ای / محصول |
| `soil_moisture_percent` | number | رطوبت خاک به درصد |
| `development_stage` | number | مرحله رشد گیاه به صورت DVS |
| `gdd` | number | درجه روز رشد همان روز |
### ساختار `daily_output`
این بخش خروجی خام شبیه سازی است و معمولا شامل فیلدهایی مثل این هاست:
- `DAY`
- `DVS`
- `LAI`
- `TAGP`
- `TWSO`
- `SM`
- `GDD`
- `TMIN`
- `TMAX`
- `RAIN`
- `ET0`
### خطاها
#### 400
وقتی `farm_uuid` ارسال نشود:
```json
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"farm_uuid": ["This field is required."]
}
}
```
#### 500
وقتی شبیه ساز داخلی fail شود:
```json
{
"code": 500,
"msg": "خطا در اجرای chart شبیه سازی مزرعه: simulator offline",
"data": null
}
```
---
## 2) POST `/api/crop-simulation/growth/`
### کاربرد
برای شروع شبیه سازی رشد گیاه به صورت async.
این endpoint خود نتیجه نهایی را برنمی گرداند؛ فقط یک `task_id` می دهد تا بعدا از endpoint وضعیت استفاده شود.
### درخواست
#### نمونه با weather مستقیم
```json
{
"plant_name": "گوجه‌فرنگی",
"dynamic_parameters": ["DVS", "LAI", "TAGP", "TWSO", "SM"],
"weather": [
{
"DAY": "2026-04-01",
"LAT": 35.7,
"LON": 51.4,
"TMIN": 12,
"TMAX": 24,
"RAIN": 0.0,
"ET0": 0.32
}
],
"soil_parameters": {
"SMFCF": 0.34,
"SMW": 0.14,
"RDMSOL": 120.0
},
"site_parameters": {
"WAV": 40.0
},
"page_size": 2
}
```
#### نمونه با farm
```json
{
"plant_name": "گوجه‌فرنگی",
"dynamic_parameters": ["DVS", "LAI", "TAGP"],
"farm_uuid": "11111111-1111-1111-1111-111111111111"
}
```
### فیلدهای ورودی
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `plant_name` | string | بله | نام گیاه |
| `dynamic_parameters` | array[string] | بله | پارامترهای رشد که باید در خروجی stageها گزارش شوند |
| `farm_uuid` | string (UUID) | شرطی | اگر weather نفرستید لازم است |
| `weather` | array/object | شرطی | اگر `farm_uuid` نفرستید لازم است |
| `soil_parameters` | object | خیر | پارامترهای خاک |
| `site_parameters` | object | خیر | پارامترهای سایت / مزرعه |
| `crop_parameters` | object | خیر | پارامترهای مدل محصول |
| `agromanagement` | object / array | خیر | مدیریت زراعی |
| `page_size` | integer | خیر | اندازه صفحه stage ها، بین `1` تا `50` |
### نکته مهم validation
حداقل یکی از این دو باید وجود داشته باشد:
- `farm_uuid`
- `weather`
### پاسخ موفق
```json
{
"code": 202,
"msg": "تسک شبیه سازی رشد در صف قرار گرفت.",
"data": {
"task_id": "growth-task-1",
"status_url": "/api/crop-simulation/growth/growth-task-1/status/",
"plant_name": "گوجه‌فرنگی"
}
}
```
### توضیح فیلدهای پاسخ
| فیلد | نوع | توضیح |
|---|---|---|
| `task_id` | string | شناسه تسک Celery |
| `status_url` | string | آدرس endpoint وضعیت برای پیگیری نتیجه |
| `plant_name` | string | نام گیاه مربوط به این شبیه سازی |
### خطاهای رایج
#### 400
اگر نه `farm_uuid` و نه `weather` ارسال نشده باشد:
```json
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"non_field_errors": ["یکی از farm_uuid یا weather باید ارسال شود."]
}
}
```
---
## 3) GET `/api/crop-simulation/growth/{task_id}/status/`
### کاربرد
برای گرفتن وضعیت تسک async شبیه سازی رشد.
### Query Parameters
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `page` | integer | خیر | شماره صفحه stage ها |
| `page_size` | integer | خیر | تعداد stage ها در هر صفحه، حداکثر `50` |
### حالت های پاسخ
این endpoint همیشه HTTP `200` می دهد، ولی فیلد `data.status` تعیین می کند تسک در چه وضعیتی است.
مقادیر مهم:
- `PENDING`
- `PROGRESS`
- `SUCCESS`
- `FAILURE`
---
### پاسخ در حالت `PENDING`
```json
{
"code": 200,
"msg": "success",
"data": {
"task_id": "growth-task-1",
"status": "PENDING",
"message": "تسک در صف یا یافت نشد."
}
}
```
#### توضیح
| فیلد | توضیح |
|---|---|
| `task_id` | شناسه تسک |
| `status` | وضعیت فعلی |
| `message` | پیام کمکی برای کاربر |
---
### پاسخ در حالت `PROGRESS`
```json
{
"code": 200,
"msg": "success",
"data": {
"task_id": "growth-task-1",
"status": "PROGRESS",
"progress": {
"current": 2,
"total": 3,
"message": "simulation finished"
}
}
}
```
#### توضیح
| فیلد | نوع | توضیح |
|---|---|---|
| `progress.current` | integer | مرحله فعلی پردازش |
| `progress.total` | integer | تعداد کل مراحل |
| `progress.message` | string | توضیح مرحله جاری |
---
### پاسخ در حالت `SUCCESS`
```json
{
"code": 200,
"msg": "success",
"data": {
"task_id": "growth-task-1",
"status": "SUCCESS",
"result": {
"plant_name": "گوجه‌فرنگی",
"dynamic_parameters": ["DVS"],
"engine": "growth_projection",
"model_name": "growth_projection_v1",
"scenario_id": null,
"simulation_warning": null,
"summary_metrics": {},
"stage_timeline": [
{
"order": 1,
"stage_code": "establishment",
"stage_name": "استقرار",
"start_date": "2026-04-01",
"end_date": "2026-04-02",
"days_count": 2,
"metrics": {
"DVS": {
"start": 0.1,
"end": 0.2,
"min": 0.1,
"max": 0.2,
"avg": 0.15
}
}
}
],
"stages_page": [
{
"order": 1,
"stage_code": "establishment",
"stage_name": "استقرار",
"start_date": "2026-04-01",
"end_date": "2026-04-02",
"days_count": 2,
"metrics": {
"DVS": {
"start": 0.1,
"end": 0.2,
"min": 0.1,
"max": 0.2,
"avg": 0.15
}
}
}
],
"pagination": {
"page": 1,
"page_size": 1,
"total_items": 3,
"total_pages": 3,
"has_next": true,
"has_previous": false
},
"daily_records_count": 7,
"default_page_size": 1
}
}
}
```
### توضیح کامل `result`
| فیلد | نوع | توضیح |
|---|---|---|
| `plant_name` | string | نام گیاه |
| `dynamic_parameters` | array[string] | پارامترهایی که stage metrics برایشان تولید شده |
| `engine` | string / null | موتور شبیه سازی |
| `model_name` | string / null | نام مدل |
| `scenario_id` | integer / null | شناسه سناریو |
| `simulation_warning` | string / null | هشدار غیر بحرانی |
| `summary_metrics` | object | شاخص های خلاصه |
| `stage_timeline` | array[object] | کل timeline مراحل رشد |
| `stages_page` | array[object] | فقط صفحه فعلی timeline |
| `pagination` | object | اطلاعات صفحه بندی |
| `daily_records_count` | integer | تعداد رکوردهای روزانه شبیه سازی |
| `default_page_size` | integer | اندازه صفحه پیش فرض |
### ساختار هر stage
| فیلد | نوع | توضیح |
|---|---|---|
| `order` | integer | ترتیب مرحله در timeline |
| `stage_code` | string | کد فنی مرحله رشد |
| `stage_name` | string | نام قابل نمایش مرحله |
| `start_date` | string | تاریخ شروع مرحله |
| `end_date` | string | تاریخ پایان مرحله |
| `days_count` | integer | تعداد روزهای این مرحله |
| `metrics` | object | خلاصه آماری پارامترهای درخواستی |
### ساختار `metrics` در هر stage
برای هر پارامتر مثل `DVS` یا `LAI`:
| فیلد | توضیح |
|---|---|
| `start` | مقدار ابتدای مرحله |
| `end` | مقدار پایان مرحله |
| `min` | کمترین مقدار در مرحله |
| `max` | بیشترین مقدار در مرحله |
| `avg` | میانگین مقدار در مرحله |
### ساختار `pagination`
| فیلد | نوع | توضیح |
|---|---|---|
| `page` | integer | شماره صفحه فعلی |
| `page_size` | integer | اندازه صفحه فعلی |
| `total_items` | integer | تعداد کل stage ها |
| `total_pages` | integer | تعداد کل صفحه ها |
| `has_next` | boolean | آیا صفحه بعدی وجود دارد |
| `has_previous` | boolean | آیا صفحه قبلی وجود دارد |
---
### پاسخ در حالت `FAILURE`
```json
{
"code": 200,
"msg": "success",
"data": {
"task_id": "growth-task-1",
"status": "FAILURE",
"error": "task crashed"
}
}
```
#### توضیح
| فیلد | توضیح |
|---|---|
| `error` | متن خطای نهایی تسک |
---
## 4) POST `/api/crop-simulation/harvest-prediction/`
### کاربرد
برای پیش بینی زمان تقریبی برداشت بر اساس خروجی شبیه سازی رشد و GDD.
### درخواست
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه‌فرنگی"
}
```
### فیلدهای ورودی
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `farm_uuid` | string (UUID) | بله | شناسه مزرعه |
| `plant_name` | string | خیر | نام گیاه |
### پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"data": {
"date": "2026-05-14",
"dateFormatted": "14 May 2026",
"daysUntil": 43,
"description": "شبيه ساز نشان مي دهد حدود 43 روز ديگر تا برداشت باقي مانده است.",
"optimalWindowStart": "2026-05-11",
"optimalWindowEnd": "2026-05-17",
"gddDetails": {
"current_cumulative_gdd": 50.0,
"required_gdd_for_maturity": 1200.0,
"remaining_gdd": 1150.0,
"simulation_engine": "growth_projection"
}
}
}
```
### توضیح کامل فیلدهای پاسخ
| فیلد | نوع | توضیح |
|---|---|---|
| `date` | string | تاریخ تخمینی برداشت با فرمت ISO |
| `dateFormatted` | string | همان تاریخ به فرمت human-readable |
| `daysUntil` | integer | تعداد روز باقی مانده تا برداشت |
| `description` | string | توضیح متنی قابل نمایش برای کاربر |
| `optimalWindowStart` | string | شروع بازه مناسب برداشت |
| `optimalWindowEnd` | string | پایان بازه مناسب برداشت |
| `gddDetails` | object | جزئیات محاسبات GDD و داده های پشتیبان |
### ساختار `gddDetails`
معمولا شامل این فیلدهاست:
| فیلد | نوع | توضیح |
|---|---|---|
| `current_cumulative_gdd` | number | GDD تجمعی فعلی |
| `required_gdd_for_maturity` | number | GDD مورد نیاز برای رسیدن به بلوغ |
| `remaining_gdd` | number | میزان GDD باقی مانده |
| `estimated_days_to_harvest` | integer | روزهای برآوردی تا برداشت |
| `predicted_harvest_date` | string | تاریخ برآوردی برداشت |
| `predicted_harvest_window` | object | بازه شروع/پایان مناسب برداشت |
| `daily_gdd_forecast` | array[object] | پیش بینی روزانه GDD |
| `simulation_engine` | string | موتور شبیه سازی |
| `simulation_model_name` | string | نام مدل شبیه سازی |
| `simulation_warning` | string / null | هشدار داخلی شبیه سازی |
| `scenario_id` | integer / null | شناسه سناریو |
### ساختار `daily_gdd_forecast`
هر آیتم:
| فیلد | نوع | توضیح |
|---|---|---|
| `date` | string | تاریخ |
| `gdd` | number | GDD همان روز |
| `cumulative_gdd` | number | GDD تجمعی تا آن روز |
| `development_stage` | number | DVS آن روز |
### خطاها
#### 400
```json
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"farm_uuid": ["This field is required."]
}
}
```
#### 500
```json
{
"code": 500,
"msg": "خطا در پیش بینی زمان برداشت: harvest offline",
"data": null
}
```
---
## 5) GET `/api/crop-simulation/yield-harvest-summary/`
### کاربرد
برای برگرداندن داشبورد کامل خلاصه عملکرد و برداشت.
این endpoint ترکیبی از چند block مختلف است:
- season highlights
- yield prediction
- harvest prediction
- readiness zones
- quality bands
- harvest operations
- yield chart
این endpoint می تواند علاوه بر داده های deterministic، متن های narrative را هم اضافه کند.
### Query Parameters
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `farm_uuid` | string (UUID) | بله | شناسه یکتای مزرعه |
| `season_year` | integer | خیر | سال زراعی |
| `crop_name` | string | خیر | نام محصول |
| `include_narrative` | boolean | خیر | اگر `true` باشد متن های توضیحی RAG هم merge می شوند |
### نمونه درخواست
```http
GET /api/crop-simulation/yield-harvest-summary/?farm_uuid=11111111-1111-1111-1111-111111111111&season_year=1404&crop_name=wheat&include_narrative=true
```
### پاسخ موفق
نمونه واقعی پاسخ فعلی:
```json
{
"code": 200,
"msg": "success",
"data": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"season_highlights_card": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "",
"season_year": "",
"title": "Season highlights",
"subtitle": "Projected harvest in 152 days with minimal yield prediction issues due to simulation fallback.",
"total_predicted_yield": 0.0,
"yield_unit": "تن",
"target_harvest_date": "28 September 2026",
"days_until_harvest": 152,
"average_readiness": null,
"primary_quality_grade": "C",
"estimated_revenue": null,
"soil_type": "loam"
},
"yield_prediction": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "خیار",
"season_year": "",
"predicted_yield_tons": 0.0,
"predicted_yield_raw": 0.0,
"unit": "تن",
"source_unit": "kg/ha",
"simulation_engine": "growth_projection",
"simulation_model": "growth_projection_v1",
"scenario_id": null,
"simulation_warning": "Simulation engine failed, fallback projection used: Value for parameter CVL missing.",
"secondary_kpis_estimated": true,
"descriptionSource": "deterministic",
"farm_context": {
"soil_type": "loam",
"soil_data_provider": "mock"
},
"supporting_metrics": {
"yield_estimate": 0.0,
"biomass": 232.9052,
"max_lai": 0.1063
},
"explanation": "شبيه ساز با محدوديت داده مواجه شد؛ براورد فعلی بدون تضمین و با روش جایگزین انجام شده است."
},
"harvest_prediction_card": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "",
"season_year": "",
"harvest_date": "2026-09-28",
"harvest_date_formatted": "28 September 2026",
"days_until": 152,
"optimal_window_start": "2026-09-25",
"optimal_window_end": "2026-10-01",
"description": "شبيه ساز تا انتهاي forecast هنوز به رسيدگي کامل نرسيده، اما با ميانگين رشد فعلي براورد مي شود خیار حدود 152 روز ديگر به برداشت برسد.",
"descriptionSource": "deterministic",
"field_conditions": {
"soil_moisture": 42.3,
"soil_temperature": 21.4
},
"readiness_metrics": {
"current_cumulative_gdd": 0.0,
"required_gdd_for_maturity": 1200.0
}
},
"harvest_readiness_zones": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"observationDate": null,
"vegetationHealthClass": "Unavailable",
"meanNdvi": null,
"ndviTrend": null,
"averageReadiness": null,
"zones": [],
"source": "ndvi_health_service",
"summary": "خیار هنوز در مراحل اولیه رشد است، 152 روز تا برداشته شدن باقی مانده است. میانگین آمادگی موجود نیست."
},
"yield_quality_bands": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "",
"season_year": "",
"source": "deterministic_grading_rules",
"is_estimated": true,
"protein_content": {
"value": 9.51,
"unit": "%"
},
"moisture_percentage": {
"value": 14.03,
"unit": "%"
},
"grade_distribution": [
{"grade": "A", "share_percent": 16},
{"grade": "B", "share_percent": 41},
{"grade": "C", "share_percent": 43}
],
"primary_quality_grade": "C",
"quality_score": 59,
"summary": "Primary quality grade is C."
},
"harvest_operations_card": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "خیار",
"season_year": "",
"stage_label": "early_pre_harvest",
"phase_name": "vegetative",
"days_until_harvest": 152,
"current_dvs": 0.0394,
"summary": "Operations are prioritized for خیار with 152 days remaining until the predicted harvest window.",
"rules_source": "deterministic_dvs_rules",
"field_context": {
"soil_type": "loam",
"soil_moisture": 42.3,
"soil_temperature": 21.4
},
"steps": [
{
"key": "weekly_monitoring",
"title": "Run weekly crop maturity checks",
"status": "active",
"is_completed": false,
"estimated_days": 14,
"note": "Check weekly crop status for any signs of maturity changes."
}
]
},
"yield_prediction_chart": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"crop_name": "خیار",
"season_year": "",
"series": [
{
"name": "Predicted Yield",
"type": "line",
"data": [[1777420800000, 0.0]]
},
{
"name": "Biomass",
"type": "area",
"data": [[1777420800000, 89.392]]
}
],
"xAxis": {
"type": "datetime"
},
"meta": {
"unit": "kg/ha",
"simulation_engine": "growth_projection",
"simulation_model": "growth_projection_v1",
"scenario_id": null,
"simulation_warning": "Simulation engine failed, fallback projection used: Value for parameter CVL missing.",
"field_context": {
"soil_type": "loam",
"center_coordinates": {
"lat": 50.0,
"lon": 50.0
}
}
}
}
}
}
```
### توضیح top-level response
| فیلد | نوع | توضیح |
|---|---|---|
| `farm_uuid` | string | شناسه مزرعه |
| `season_highlights_card` | object | خلاصه مهم ترین KPI ها |
| `yield_prediction` | object | خروجی پیش بینی عملکرد |
| `harvest_prediction_card` | object | تاریخ و وضعیت برداشت |
| `harvest_readiness_zones` | object | وضعیت آمادگی برداشت در zoneها |
| `yield_quality_bands` | object | کیفیت برآوردی محصول |
| `harvest_operations_card` | object | عملیات پیشنهادی برداشت |
| `yield_prediction_chart` | object | داده نمودار عملکرد و بیوماس |
### توضیح `season_highlights_card`
| فیلد | نوع | توضیح |
|---|---|---|
| `title` | string | عنوان کارت |
| `subtitle` | string | متن توضیحی کوتاه؛ ممکن است از RAG بیاید |
| `total_predicted_yield` | number / null | عملکرد پیش بینی شده |
| `yield_unit` | string | واحد عملکرد |
| `target_harvest_date` | string / null | تاریخ هدف برداشت |
| `days_until_harvest` | integer / null | روز باقی مانده |
| `average_readiness` | number / null | میانگین آمادگی zoneها |
| `primary_quality_grade` | string / null | درجه کیفیت غالب |
| `estimated_revenue` | number / null | درآمد تخمینی اگر داده اقتصادی موجود باشد |
| `soil_type` | string / null | نوع خاک |
### توضیح `yield_prediction`
| فیلد | نوع | توضیح |
|---|---|---|
| `predicted_yield_tons` | number | عملکرد بر حسب تن |
| `predicted_yield_raw` | number | عملکرد خام معمولا بر حسب `kg/ha` |
| `unit` | string | واحد نمایشی |
| `source_unit` | string | واحد منبع |
| `simulation_engine` | string / null | موتور شبیه سازی |
| `simulation_model` | string / null | نام مدل |
| `scenario_id` | integer / null | شناسه سناریو |
| `simulation_warning` | string / null | هشدار شبیه سازی |
| `secondary_kpis_estimated` | boolean | آیا KPIهای ثانویه تخمینی هستند |
| `descriptionSource` | string | منبع توضیح؛ معمولا `deterministic` یا `rag` |
| `farm_context` | object | بخشی از context مزرعه |
| `supporting_metrics` | object | متریک های پشتیبان مثل `yield_estimate` و `biomass` |
| `explanation` | string | توضیح متنی برای کاربر |
### توضیح `harvest_prediction_card`
| فیلد | نوع | توضیح |
|---|---|---|
| `harvest_date` | string | تاریخ ISO برداشت |
| `harvest_date_formatted` | string | تاریخ قابل نمایش |
| `days_until` | integer | تعداد روز باقی مانده |
| `optimal_window_start` | string | شروع پنجره مناسب برداشت |
| `optimal_window_end` | string | پایان پنجره مناسب برداشت |
| `description` | string | توضیح متنی |
| `descriptionSource` | string | منبع متن |
| `field_conditions` | object | شرایط فعلی مزرعه مثل رطوبت و دما |
| `readiness_metrics` | object | جزئیات محاسبات readiness/GDD |
### توضیح `harvest_readiness_zones`
| فیلد | نوع | توضیح |
|---|---|---|
| `observationDate` | string / null | تاریخ مشاهده NDVI |
| `vegetationHealthClass` | string / null | کلاس سلامت پوشش گیاهی |
| `meanNdvi` | number / null | NDVI میانگین |
| `ndviTrend` | number / null | روند تغییر NDVI |
| `averageReadiness` | number / null | میانگین آمادگی zoneها |
| `zones` | array[object] | فهرست zoneها |
| `source` | string | منبع داده |
| `summary` | string | توضیح متنی خلاصه |
### ساختار هر zone
| فیلد | نوع | توضیح |
|---|---|---|
| `zoneId` | string | شناسه zone |
| `zoneLabel` | string | نام نمایشی zone |
| `gridPosition` | object / null | موقعیت zone در grid |
| `meanNdvi` | number | میانگین NDVI zone |
| `readiness` | integer | درصد آمادگی برداشت |
| `daysUntil` | integer | روزهای تخمینی تا آمادگی |
| `status` | string | وضعیت مثل `ready`, `approaching`, `monitoring`, `not_ready` |
### توضیح `yield_quality_bands`
| فیلد | نوع | توضیح |
|---|---|---|
| `source` | string | منبع محاسبه کیفیت |
| `is_estimated` | boolean | آیا مقادیر تخمینی هستند |
| `protein_content` | object | درصد پروتئین |
| `moisture_percentage` | object | درصد رطوبت |
| `grade_distribution` | array[object] | توزیع درصدی gradeها |
| `primary_quality_grade` | string | grade غالب |
| `quality_score` | number | امتیاز کیفیت |
| `summary` | string | خلاصه متنی کیفیت |
### ساختار `protein_content` و `moisture_percentage`
| فیلد | نوع | توضیح |
|---|---|---|
| `value` | number | مقدار |
| `unit` | string | واحد، معمولا `%` |
### ساختار `grade_distribution`
| فیلد | نوع | توضیح |
|---|---|---|
| `grade` | string | گرید کیفیت مثل `A`, `B`, `C` |
| `share_percent` | integer | سهم درصدی آن گرید |
### توضیح `harvest_operations_card`
| فیلد | نوع | توضیح |
|---|---|---|
| `stage_label` | string | برچسب مرحله عملیاتی |
| `phase_name` | string | نام فاز رشد |
| `days_until_harvest` | integer | روز باقی مانده تا برداشت |
| `current_dvs` | number | DVS فعلی |
| `summary` | string | خلاصه عملیاتی |
| `rules_source` | string | منبع قواعد تصمیم |
| `field_context` | object | context مزرعه |
| `steps` | array[object] | گام های عملیاتی |
### ساختار هر step
| فیلد | نوع | توضیح |
|---|---|---|
| `key` | string | کلید فنی step |
| `title` | string | عنوان عملیات |
| `status` | string | وضعیت مثل `active`, `upcoming`, `ready` |
| `is_completed` | boolean | آیا انجام شده |
| `estimated_days` | integer | روز برآوردی برای انجام / رسیدن |
| `note` | string | توضیح تکمیلی یا توصیه |
### توضیح `yield_prediction_chart`
| فیلد | نوع | توضیح |
|---|---|---|
| `series` | array[object] | سری های نمودار عملکرد و بیوماس |
| `xAxis` | object | تنظیم محور افقی |
| `meta` | object | متادیتای chart |
### ساختار `yield_prediction_chart.series`
| فیلد | نوع | توضیح |
|---|---|---|
| `name` | string | نام سری |
| `type` | string | نوع رسم مثل `line` یا `area` |
| `data` | array[[timestamp, value]] | داده های نمودار بر پایه timestamp یونیکس میلی ثانیه |
### توضیح `yield_prediction_chart.meta`
| فیلد | نوع | توضیح |
|---|---|---|
| `unit` | string | واحد داده chart |
| `simulation_engine` | string | موتور شبیه سازی |
| `simulation_model` | string | مدل |
| `scenario_id` | integer / null | شناسه سناریو |
| `simulation_warning` | string / null | هشدار شبیه سازی |
| `field_context` | object | context مزرعه مثل نوع خاک و مختصات |
### خطاها
#### 400
وقتی `farm_uuid` ارسال نشده باشد:
```json
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"farm_uuid": ["This field is required."]
}
}
```
---
## 6) POST `/api/crop-simulation/yield-prediction/`
### کاربرد
برای تبدیل خروجی شبیه سازی رشد به پیش بینی عملکرد مزرعه.
### درخواست
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"plant_name": "گوجه‌فرنگی"
}
```
### فیلدهای ورودی
| فیلد | نوع | اجباری | توضیح |
|---|---|---:|---|
| `farm_uuid` | string (UUID) | بله | شناسه مزرعه |
| `plant_name` | string | خیر | نام گیاه |
### پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"data": {
"farm_uuid": "550e8400-e29b-41d4-a716-446655440000",
"plant_name": "گوجه‌فرنگی",
"predictedYieldTons": 5.4,
"predictedYieldRaw": 5400.0,
"unit": "تن",
"sourceUnit": "kg/ha",
"simulationEngine": "growth_projection",
"simulationModel": "growth_projection_v1",
"scenarioId": 12,
"simulationWarning": null,
"supportingMetrics": {
"yield_estimate": 5400.0
}
}
}
```
### توضیح کامل فیلدهای پاسخ
| فیلد | نوع | توضیح |
|---|---|---|
| `farm_uuid` | string | شناسه مزرعه |
| `plant_name` | string / null | نام گیاه |
| `predictedYieldTons` | number | عملکرد پیش بینی شده بر حسب تن |
| `predictedYieldRaw` | number | مقدار خام عملکرد |
| `unit` | string | واحد نمایشی، معمولا `تن` |
| `sourceUnit` | string | واحد محاسباتی اصلی، معمولا `kg/ha` |
| `simulationEngine` | string / null | موتور شبیه سازی |
| `simulationModel` | string / null | مدل شبیه سازی |
| `scenarioId` | integer / null | شناسه سناریو |
| `simulationWarning` | string / null | هشدار شبیه سازی |
| `supportingMetrics` | object | متریک های پشتیبان مورد استفاده برای محاسبه عملکرد |
### خطاها
#### 400
```json
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"farm_uuid": ["This field is required."]
}
}
```
#### 500
```json
{
"code": 500,
"msg": "خطا در پیش بینی عملکرد: yield offline",
"data": null
}
```
---
## جمع بندی تفاوت endpoint ها
| Endpoint | کاربرد اصلی | sync/async |
|---|---|---|
| `POST /current-farm-chart/` | ساخت نمودار وضعیت فعلی مزرعه | sync |
| `POST /growth/` | شروع شبیه سازی رشد | async |
| `GET /growth/{task_id}/status/` | بررسی وضعیت و نتیجه شبیه سازی رشد | async status |
| `POST /harvest-prediction/` | پیش بینی زمان برداشت | sync |
| `GET /yield-harvest-summary/` | داشبورد کامل عملکرد و برداشت | sync |
| `POST /yield-prediction/` | پیش بینی عملکرد نهایی | sync |
---
## نکات مهم برای frontend
- در endpoint `growth/status` همیشه به `data.status` نگاه کنید، نه فقط HTTP status.
- در پاسخ های chart و summary ممکن است `simulation_warning` مقدار داشته باشد، حتی اگر HTTP `200` باشد.
- در `yield-harvest-summary` بعضی فیلدها ممکن است `null` باشند، مخصوصا:
- `estimated_revenue`
- `average_readiness`
- `scenario_id`
- `simulation_warning`
- در `yield_prediction_chart.series[].data` timestamp ها بر حسب **milliseconds** هستند.
- در `yield-harvest-summary` اگر `include_narrative=true` باشد، بعضی متن ها ممکن است از RAG بیایند ولی اعداد deterministic باقی می مانند.
---
## مسیر فایل
این داکیومنت در مسیر زیر ذخیره شده است:
`docs/crop_simulation_api_reference.md`