UPDATE
This commit is contained in:
@@ -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 همخوانی کامل ندارد.
|
||||
Reference in New Issue
Block a user