This commit is contained in:
2026-04-29 22:26:53 +03:30
parent 8f74e4f385
commit 04d678fda4
23 changed files with 2860 additions and 711 deletions
@@ -0,0 +1,7 @@
import EconomicOverviewPageWrapper from '@views/dashboards/farm/EconomicOverviewPageWrapper'
const EconomicOverviewPage = () => {
return <EconomicOverviewPageWrapper />
}
export default EconomicOverviewPage
@@ -0,0 +1,324 @@
# Soil Data Backend Requirements
## وضعیت فعلی
صفحه `soil-data` در فرانت از فایل `src/views/dashboards/farm/SoilDataDashboardWrapper.tsx` رندر می‌شود و در حال حاضر این 4 بلاک را نمایش می‌دهد:
1. `SoilMoistureHeatmap`
2. `SensorRadarChart`
3. `AnomalyDetectionCard`
4. `SensorComparisonChart`
اما payload فعلی بک‌اند فقط این اطلاعات را برمی‌گرداند:
```json
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"healthScore": 42,
"profileSource": "خیار",
"healthScoreDetails": {
"method": "normalized_weighted_average",
"profileSource": "خیار",
"components": [
{
"metricType": "moisture",
"label": "رطوبت خاک",
"unit": "%",
"currentValue": 42.3,
"idealValue": 65.0,
"minRange": 45.0,
"maxRange": 75.0,
"weight": 0.45,
"normalizedValue": 0.0,
"weightedContribution": 0.0
}
]
},
"healthLanguage": {
"short_chip_text": "تنش بالا",
"action_hint": "اصلاح فوری رطوبت، تغذیه يا شوری بر اساس اجزای امتیاز انجام شود.",
"explanation": "چند شاخص اصلی خارج از بازه قابل قبول گیاه هستند."
},
"avgSoilMoisture": 42,
"avgSoilMoistureRaw": 42.3,
"avgSoilMoistureStatus": "نیازمند بررسی"
}
```
## مشکل اصلی
داده فعلی برای نمایش یک کارت خلاصه سلامت خاک مفید است، ولی برای کامپوننت‌های فعلی صفحه `soil-data` کافی نیست.
یعنی در حال حاضر:
- `healthScore` و `healthScoreDetails` دریافت می‌شوند، اما هیچ‌کدام مستقیم به ساختار موردنیاز کامپوننت‌های صفحه map نشده‌اند.
- داده‌ای برای heatmap زمانی/ناحیه‌ای وجود ندارد.
- داده‌ای برای نمودار radar وجود ندارد.
- داده anomalyهای قابل نمایش به فرمت UI وجود ندارد.
- داده trend هفتگی/مقایسه‌ای برای chart پایینی وجود ندارد.
## داده‌های موردنیاز که الان دریافت نمی‌شوند
### 1) Soil Moisture Heatmap
کامپوننت `SoilMoistureHeatmap.tsx` این ساختار را می‌خواهد:
```ts
{
soilMoistureHeatmap: {
series: Array<{
name: string
data: Array<{
x: string
y: number
}>
}>
}
}
```
### داده‌ای که باید بک‌اند بدهد
- `series[].name`: نام zone یا بخش مزرعه، مثلا `Zone A`
- `series[].data[].x`: بازه زمانی یا label محور افقی، مثلا `08:00` یا `شنبه`
- `series[].data[].y`: مقدار رطوبت برای همان zone و همان زمان در بازه `0..100`
### چیزی که الان نداریم
- رطوبت خاک به تفکیک zone
- رطوبت خاک در طول زمان
- داده heatmap-ready برای chart
---
### 2) Sensor Radar Chart
کامپوننت `SensorRadarChart.tsx` این ساختار را می‌خواهد:
```ts
{
sensorRadarChart: {
labels: string[]
series: Array<{
name: string
data: number[]
}>
}
}
```
### داده‌ای که باید بک‌اند بدهد
- `labels`: نام شاخص‌ها، مثلا:
- `Moisture`
- `pH`
- `EC`
- `Nitrogen`
- `Phosphorus`
- `Potassium`
- `series[0]`: مقادیر فعلی
- `series[1]`: مقادیر ایده‌آل یا target range
### چیزی که الان داریم ولی کافی نیست
در `healthScoreDetails.components` فقط 3 شاخص داریم:
- moisture
- ph
- ec
این داده برای radar chart کافی نیست مگر اینکه:
- بک‌اند آن را به فرمت `labels + series` تبدیل کند
- و ترجیحا شاخص‌های بیشتری هم بدهد
### چیزی که الان نداریم
- ساختار chart-ready برای radar
- سری مجزای `current` و `ideal`
- شاخص‌های کامل‌تر خاک برای مقایسه تصویری
---
### 3) Anomaly Detection Card
کامپوننت `AnomalyDetectionCard.tsx` این ساختار را می‌خواهد:
```ts
{
anomalyDetectionCard: {
anomalies: Array<{
sensor: string
value: string
expected: string
deviation: string
severity: "warning" | "error"
}>
}
}
```
### داده‌ای که باید بک‌اند بدهد
برای هر anomaly:
- نام سنسور یا متریک
- مقدار فعلی
- بازه یا مقدار مورد انتظار
- میزان انحراف
- سطح شدت
مثال:
```json
{
"anomalies": [
{
"sensor": "رطوبت خاک",
"value": "42.3%",
"expected": "45% - 75%",
"deviation": "-2.7%",
"severity": "error"
}
]
}
```
### چیزی که الان تا حدی داریم
از `healthScoreDetails.components` می‌شود فهمید بعضی متریک‌ها خارج از بازه‌اند، چون:
- `currentValue`
- `minRange`
- `maxRange`
- `idealValue`
وجود دارد.
ولی هنوز این‌ها را به anomaly list آماده‌ی UI تبدیل نکرده‌ایم.
### چیزی که الان نداریم
- لیست anomalyهای آماده نمایش
- severity استاندارد برای هر anomaly
- deviation format شده برای UI
---
### 4) Sensor Comparison Chart
کامپوننت `SensorComparisonChart.tsx` این ساختار را می‌خواهد:
```ts
{
sensorComparisonChart: {
categories: string[]
currentValue: number
vsLastWeek: string
series: Array<{
name: string
data: number[]
}>
}
}
```
### داده‌ای که باید بک‌اند بدهد
- `categories`: مثلا روزهای هفته یا timestampها
- `currentValue`: مقدار فعلی خلاصه‌شده، مثلا میانگین رطوبت امروز
- `vsLastWeek`: متن مقایسه‌ای مثل `+5% نسبت به هفته قبل`
- `series`: حداقل دو سری:
- سری فعلی
- سری هفته قبل یا baseline
مثال:
```json
{
"categories": ["Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"],
"currentValue": 42,
"vsLastWeek": "-8% نسبت به هفته قبل",
"series": [
{
"name": "این هفته",
"data": [45, 44, 43, 42, 41, 43, 42]
},
{
"name": "هفته قبل",
"data": [52, 50, 49, 48, 47, 46, 45]
}
]
}
```
### چیزی که الان نداریم
- داده trend زمانی
- مقایسه با هفته قبل
- seriesهای chart-ready
## جمع‌بندی داده‌های ناقص
payload فعلی بیشتر برای این use-case مناسب است:
- نمایش نمره سلامت خاک
- توضیح متنی وضعیت
- نمایش میانگین فعلی رطوبت
اما برای UI فعلی صفحه `soil-data` این data objectها هنوز از بک‌اند نیاز هستند:
```ts
{
soilMoistureHeatmap: { series: [...] },
sensorRadarChart: { labels: [...], series: [...] },
anomalyDetectionCard: { anomalies: [...] },
sensorComparisonChart: {
categories: [...],
currentValue: number,
vsLastWeek: string,
series: [...]
}
}
```
## پیشنهاد API خروجی
بهترین حالت این است که endpoint فعلی `/api/soil/summary/` همین ساختار نهایی را برگرداند:
```json
{
"code": 200,
"msg": "success",
"data": {
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"healthScore": 42,
"profileSource": "خیار",
"healthScoreDetails": {},
"healthLanguage": {},
"avgSoilMoisture": 42,
"avgSoilMoistureRaw": 42.3,
"avgSoilMoistureStatus": "نیازمند بررسی",
"soilMoistureHeatmap": {
"series": []
},
"sensorRadarChart": {
"labels": [],
"series": []
},
"anomalyDetectionCard": {
"anomalies": []
},
"sensorComparisonChart": {
"categories": [],
"currentValue": 42,
"vsLastWeek": "",
"series": []
}
}
}
```
## نکته مهم
اگر قرار است فقط همین payload فعلی از بک‌اند بماند، باید فرانت تغییر کند و به‌جای 4 کامپوننت فعلی، یک صفحه جدید بر اساس این داده‌ها بسازد؛ چون ساختار فعلی UI با داده فعلی backend هم‌خوانی کامل ندارد.