270 lines
7.0 KiB
Markdown
270 lines
7.0 KiB
Markdown
|
|
# Yield/Harvest Prediction API Changes
|
||
|
|
|
||
|
|
این فایل تغییرات 3 API زیر را توضیح میدهد:
|
||
|
|
|
||
|
|
- `POST /api/yield-harvest/harvest-prediction/`
|
||
|
|
- `POST /api/yield-harvest/yield-prediction/`
|
||
|
|
- `POST /api/yield-harvest/current-farm-chart/`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## خلاصه تغییرات
|
||
|
|
|
||
|
|
تغییر اصلی در هر 3 endpoint این است که backend حالا context موردنیاز AI را خودش از روی مزرعه و planهای انتخابی میسازد.
|
||
|
|
|
||
|
|
### قبل
|
||
|
|
|
||
|
|
در استفاده قدیمی، معمولاً فرض میشد client باید context بیشتری برای AI بفرستد.
|
||
|
|
|
||
|
|
### الآن
|
||
|
|
|
||
|
|
- `farm_uuid` ورودی اصلی و الزامی است.
|
||
|
|
- `plant_name` اگر هم توسط client ارسال شود، مبنای نهایی backend نیست و از روی مزرعه بازنویسی/resolve میشود.
|
||
|
|
- در صورت نیاز، `irrigation_plan_id` و `fertilization_plan_id` هم میتوانند ارسال شوند.
|
||
|
|
- اگر plan انتخابی معتبر و متعلق به همان مزرعه کاربر باشد، backend محتوای آن را به payload ارسالی به AI اضافه میکند.
|
||
|
|
- خروجی backend بهصورت یکدست با فرمت `code / msg / data` برگردانده میشود.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Request Contract جدید
|
||
|
|
|
||
|
|
هر 3 API از این قرارداد ورودی استفاده میکنند:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"irrigation_plan_id": 12,
|
||
|
|
"fertilization_plan_id": 34
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### فیلدها
|
||
|
|
|
||
|
|
- `farm_uuid` اجباری
|
||
|
|
- `irrigation_plan_id` اختیاری
|
||
|
|
- `fertilization_plan_id` اختیاری
|
||
|
|
|
||
|
|
### نکته مهم
|
||
|
|
|
||
|
|
اگر client `plant_name` بفرستد، در این APIها مبنای نهایی backend نیست؛ backend نام گیاه را از مزرعه استخراج میکند.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1) POST `/api/yield-harvest/current-farm-chart/`
|
||
|
|
|
||
|
|
### تغییرات
|
||
|
|
|
||
|
|
- ورودی endpoint عملاً بر پایه `farm_uuid` کار میکند و `plant_name` از context مزرعه تعیین میشود.
|
||
|
|
- backend بهصورت خودکار `plant_name` را از مزرعه پیدا میکند.
|
||
|
|
- در صورت ارسال `irrigation_plan_id`، اطلاعات برنامه آبیاری داخل payload ارسالی به AI قرار میگیرد.
|
||
|
|
- در صورت ارسال `fertilization_plan_id`، اطلاعات برنامه کودی هم اضافه میشود.
|
||
|
|
|
||
|
|
### نمونه request
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### payload ارسالی backend به AI
|
||
|
|
|
||
|
|
نمونه مفهومی:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"plant_name": "گوجهفرنگی"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### در صورت انتخاب plan
|
||
|
|
|
||
|
|
نمونه مفهومی:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"plant_name": "گوجهفرنگی",
|
||
|
|
"irrigation_plan": {
|
||
|
|
"id": 12,
|
||
|
|
"plan_payload": {
|
||
|
|
"plan": {
|
||
|
|
"durationMinutes": 20
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### پاسخ موفق
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 200,
|
||
|
|
"msg": "success",
|
||
|
|
"data": {
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"plant_name": "گوجهفرنگی",
|
||
|
|
"scenario_id": 1,
|
||
|
|
"categories": ["day1"],
|
||
|
|
"series": {
|
||
|
|
"biomass": [1.2]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2) POST `/api/yield-harvest/harvest-prediction/`
|
||
|
|
|
||
|
|
### تغییرات
|
||
|
|
|
||
|
|
- ورودی endpoint عملاً بر پایه `farm_uuid` کار میکند و `plant_name` توسط backend تعیین میشود.
|
||
|
|
- امکان ارسال `fertilization_plan_id` و `irrigation_plan_id` برای enrich کردن context اضافه/پشتیبانی شده است.
|
||
|
|
- پاسخ AI بعد از extract شدن در `data.result`، به شکل مستقیم در `data` برگردانده میشود.
|
||
|
|
|
||
|
|
### نمونه request
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"fertilization_plan_id": 34
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### payload ارسالی backend به AI
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"plant_name": "گوجهفرنگی",
|
||
|
|
"fertilization_plan": {
|
||
|
|
"id": 34,
|
||
|
|
"plan_payload": {
|
||
|
|
"primary_recommendation": {
|
||
|
|
"fertilizer_code": "npk-151515"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### پاسخ موفق
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 200,
|
||
|
|
"msg": "success",
|
||
|
|
"data": {
|
||
|
|
"date": "2026-07-15",
|
||
|
|
"dateFormatted": "15 Jul 2026",
|
||
|
|
"daysUntil": 96,
|
||
|
|
"gddDetails": {
|
||
|
|
"current": 800
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3) POST `/api/yield-harvest/yield-prediction/`
|
||
|
|
|
||
|
|
### تغییرات
|
||
|
|
|
||
|
|
- مثل دو endpoint دیگر، `plant_name` از روی مزرعه resolve میشود.
|
||
|
|
- در نبود محصول مستقیم روی مزرعه، backend از fallback مناسب مزرعه استفاده میکند.
|
||
|
|
- امکان ارسال `irrigation_plan_id` و `fertilization_plan_id` برای فرستادن context planها به AI اضافه/پشتیبانی شده است.
|
||
|
|
- پاسخ نهایی با ساختار یکنواخت `code / msg / data` برگردانده میشود.
|
||
|
|
|
||
|
|
### نمونه request
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"irrigation_plan_id": 12,
|
||
|
|
"fertilization_plan_id": 34
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### payload ارسالی backend به AI
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"plant_name": "گوجهفرنگی",
|
||
|
|
"irrigation_plan": {
|
||
|
|
"id": 12,
|
||
|
|
"plan_payload": {
|
||
|
|
"plan": {
|
||
|
|
"durationMinutes": 30
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"fertilization_plan": {
|
||
|
|
"id": 34,
|
||
|
|
"plan_payload": {
|
||
|
|
"primary_recommendation": {
|
||
|
|
"fertilizer_code": "npk-202020"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### پاسخ موفق
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 200,
|
||
|
|
"msg": "success",
|
||
|
|
"data": {
|
||
|
|
"farm_uuid": "11111111-1111-1111-1111-111111111111",
|
||
|
|
"predictedYieldTons": 8.4,
|
||
|
|
"scenarioId": 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## خطاها و Validation
|
||
|
|
|
||
|
|
### 1) مزرعه نامعتبر یا متعلق به کاربر دیگر
|
||
|
|
|
||
|
|
در این حالت endpoint خطای دسترسی/یافتنشدن مزرعه برمیگرداند.
|
||
|
|
|
||
|
|
### 2) plan نامعتبر یا متعلق به مزرعه دیگر
|
||
|
|
|
||
|
|
اگر `irrigation_plan_id` یا `fertilization_plan_id` متعلق به همان مزرعه کاربر نباشد، درخواست با خطا رد میشود.
|
||
|
|
|
||
|
|
نمونه:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 404,
|
||
|
|
"msg": "error",
|
||
|
|
"data": {
|
||
|
|
"irrigation_plan_id": [
|
||
|
|
"Irrigation plan not found."
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3) خطای validation ورودی
|
||
|
|
|
||
|
|
اگر `farm_uuid` ارسال نشود یا `plan_id`ها نامعتبر باشند، serializer خطای validation برمیگرداند.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## جمعبندی تغییرات برای فرانت
|
||
|
|
|
||
|
|
- دیگر لازم نیست `plant_name` را برای این 3 API بفرستید.
|
||
|
|
- فقط `farm_uuid` اجباری است.
|
||
|
|
- اگر کاربر plan خاصی را انتخاب کرده، `irrigation_plan_id` و/یا `fertilization_plan_id` را هم بفرستید.
|
||
|
|
- response هر 3 endpoint با ساختار یکنواخت `code`, `msg`, `data` برمیگردد.
|
||
|
|
- backend خودش payload مناسب AI را از context مزرعه و planهای انتخابی میسازد.
|