1184 lines
36 KiB
Markdown
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`
|