This commit is contained in:
2026-04-11 03:54:15 +03:30
parent 883573004c
commit 36d6b05a7f
68 changed files with 3487 additions and 841 deletions
+14
View File
@@ -28,3 +28,17 @@ RECOMMEND_RESPONSE_DATA = {
"warning": "Avoid irrigation during midday hours in the coming week due to forecasted high temperatures.",
},
}
WATER_NEED_PREDICTION = {
"totalNext7Days": 3290,
"unit": "m3",
"categories": ["روز 1", "روز 2", "روز 3", "روز 4", "روز 5", "روز 6", "روز 7"],
"series": [{"name": "نیاز آبی", "data": [420, 450, 480, 460, 490, 510, 480]}],
}
IRRIGATION_DASHBOARD_RECOMMENDATION = {
"title": "آبیاری: 05:00 - 07:00",
"subtitle": "4 نوبت در هفته، 45 دقیقه برای هر نوبت. رطوبت هدف 72%.",
"avatarIcon": "tabler-droplet",
"avatarColor": "primary",
}
+77
View File
@@ -0,0 +1,77 @@
from copy import deepcopy
from .mock_data import IRRIGATION_DASHBOARD_RECOMMENDATION, RECOMMEND_RESPONSE_DATA, WATER_NEED_PREDICTION
from .models import IrrigationRecommendationRequest
def _extract_result(response_payload):
if not isinstance(response_payload, dict):
return {}
data = response_payload.get("data")
if isinstance(data, dict) and isinstance(data.get("result"), dict):
return data["result"]
result = response_payload.get("result")
if isinstance(result, dict):
return result
return {}
def _get_latest_result(farm):
if farm is None:
return {}
for request in IrrigationRecommendationRequest.objects.filter(farm=farm):
result = _extract_result(request.response_payload)
if result:
return result
return {}
def get_water_need_prediction_data(farm=None):
default_data = deepcopy(WATER_NEED_PREDICTION)
result = _get_latest_result(farm)
water_balance = result.get("water_balance", {})
daily = water_balance.get("daily", [])
if not daily:
return default_data
categories = [item.get("forecast_date") or f"روز {index + 1}" for index, item in enumerate(daily)]
series_data = [float(item.get("gross_irrigation_mm") or 0) for item in daily]
return {
"totalNext7Days": round(sum(series_data), 2),
"unit": "mm",
"categories": categories,
"series": [{"name": "نیاز آبی", "data": series_data}],
}
def get_irrigation_dashboard_recommendation(farm=None):
default_item = deepcopy(IRRIGATION_DASHBOARD_RECOMMENDATION)
result = _get_latest_result(farm)
plan = result.get("plan") or RECOMMEND_RESPONSE_DATA.get("plan", {})
best_time = plan.get("bestTimeOfDay") or "05:00 - 07:00"
frequency = plan.get("frequencyPerWeek")
duration = plan.get("durationMinutes")
moisture = plan.get("moistureLevel")
warning = plan.get("warning")
subtitle_parts = []
if frequency is not None and duration is not None:
subtitle_parts.append(f"{frequency} نوبت در هفته، {duration} دقیقه برای هر نوبت")
if moisture is not None:
subtitle_parts.append(f"رطوبت هدف {moisture}%")
if warning:
subtitle_parts.append(str(warning))
default_item["title"] = f"آبیاری: {best_time}"
if subtitle_parts:
default_item["subtitle"] = ". ".join(subtitle_parts)
return default_item