78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
|
|
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
|