122 lines
4.7 KiB
TypeScript
122 lines
4.7 KiB
TypeScript
'use client';
|
|
|
|
|
|
export interface EvaluationFactor {
|
|
id: string;
|
|
name: string;
|
|
value: number;
|
|
weight: number;
|
|
unit: string;
|
|
optimalRange: [number, number];
|
|
score: number;
|
|
}
|
|
|
|
export interface SuitabilityResult {
|
|
fieldId: string;
|
|
fieldName: string;
|
|
totalScore: number;
|
|
grade: '高度适宜' | '一般适宜' | '不适宜';
|
|
factors: EvaluationFactor[];
|
|
timestamp: string;
|
|
}
|
|
|
|
export interface CropRecommendationState {
|
|
evaluationResults: SuitabilityResult[];
|
|
selectedField: string;
|
|
showKnowledgeBase: boolean;
|
|
}
|
|
|
|
export type CropRecommendAction =
|
|
| { type: 'SET_SELECTED_FIELD'; payload: string }
|
|
| { type: 'SET_SHOW_KNOWLEDGE_BASE'; payload: boolean }
|
|
| { type: 'SET_EVALUATION_RESULTS'; payload: SuitabilityResult[] }
|
|
| { type: 'UPDATE_EVALUATION_RESULT'; payload: SuitabilityResult };
|
|
|
|
const initialState: CropRecommendationState = {
|
|
evaluationResults: [
|
|
{
|
|
fieldId: 'field-1',
|
|
fieldName: '东区1号地',
|
|
totalScore: 87,
|
|
grade: '高度适宜',
|
|
factors: [
|
|
{ id: 'ph', name: 'pH值', value: 6.5, weight: 20, unit: '', optimalRange: [6.0, 7.5], score: 95 },
|
|
{ id: 'organic', name: '有机质含量', value: 32, weight: 25, unit: 'g/kg', optimalRange: [25, 40], score: 90 },
|
|
{ id: 'depth', name: '土层厚度', value: 85, weight: 20, unit: 'cm', optimalRange: [60, 100], score: 88 },
|
|
{ id: 'nitrogen', name: '全氮', value: 1.8, weight: 10, unit: 'g/kg', optimalRange: [1.5, 2.5], score: 85 },
|
|
{ id: 'phosphorus', name: '全磷', value: 1.2, weight: 10, unit: 'g/kg', optimalRange: [1.0, 2.0], score: 80 },
|
|
{ id: 'potassium', name: '全钾', value: 18, weight: 10, unit: 'g/kg', optimalRange: [15, 25], score: 82 },
|
|
{ id: 'drainage', name: '排水性', value: 4, weight: 5, unit: '', optimalRange: [3, 5], score: 90 },
|
|
],
|
|
timestamp: '2024-10-15 14:30',
|
|
},
|
|
{
|
|
fieldId: 'field-2',
|
|
fieldName: '西区2号地',
|
|
totalScore: 72,
|
|
grade: '一般适宜',
|
|
factors: [
|
|
{ id: 'ph', name: 'pH值', value: 7.8, weight: 20, unit: '', optimalRange: [6.0, 7.5], score: 65 },
|
|
{ id: 'organic', name: '有机质含量', value: 22, weight: 25, unit: 'g/kg', optimalRange: [25, 40], score: 70 },
|
|
{ id: 'depth', name: '土层厚度', value: 55, weight: 20, unit: 'cm', optimalRange: [60, 100], score: 68 },
|
|
{ id: 'nitrogen', name: '全氮', value: 1.3, weight: 10, unit: 'g/kg', optimalRange: [1.5, 2.5], score: 72 },
|
|
{ id: 'phosphorus', name: '全磷', value: 0.9, weight: 10, unit: 'g/kg', optimalRange: [1.0, 2.0], score: 75 },
|
|
{ id: 'potassium', name: '全钾', value: 14, weight: 10, unit: 'g/kg', optimalRange: [15, 25], score: 78 },
|
|
{ id: 'drainage', name: '排水性', value: 3, weight: 5, unit: '', optimalRange: [3, 5], score: 85 },
|
|
],
|
|
timestamp: '2024-10-15 14:28',
|
|
},
|
|
{
|
|
fieldId: 'field-3',
|
|
fieldName: '南区3号地',
|
|
totalScore: 58,
|
|
grade: '不适宜',
|
|
factors: [
|
|
{ id: 'ph', name: 'pH值', value: 8.5, weight: 20, unit: '', optimalRange: [6.0, 7.5], score: 45 },
|
|
{ id: 'organic', name: '有机质含量', value: 15, weight: 25, unit: 'g/kg', optimalRange: [25, 40], score: 52 },
|
|
{ id: 'depth', name: '土层厚度', value: 42, weight: 20, unit: 'cm', optimalRange: [60, 100], score: 55 },
|
|
{ id: 'nitrogen', name: '全氮', value: 0.8, weight: 10, unit: 'g/kg', optimalRange: [1.5, 2.5], score: 60 },
|
|
{ id: 'phosphorus', name: '全磷', value: 0.6, weight: 10, unit: 'g/kg', optimalRange: [1.0, 2.0], score: 65 },
|
|
{ id: 'potassium', name: '全钾', value: 10, weight: 10, unit: 'g/kg', optimalRange: [15, 25], score: 58 },
|
|
{ id: 'drainage', name: '排水性', value: 2, weight: 5, unit: '', optimalRange: [3, 5], score: 70 },
|
|
],
|
|
timestamp: '2024-10-15 14:25',
|
|
},
|
|
],
|
|
selectedField: 'field-1',
|
|
showKnowledgeBase: false,
|
|
};
|
|
|
|
export function cropRecommendReducer(
|
|
state: CropRecommendationState = initialState,
|
|
action: CropRecommendAction
|
|
): CropRecommendationState {
|
|
switch (action.type) {
|
|
case 'SET_SELECTED_FIELD':
|
|
return {
|
|
...state,
|
|
selectedField: action.payload,
|
|
};
|
|
case 'SET_SHOW_KNOWLEDGE_BASE':
|
|
return {
|
|
...state,
|
|
showKnowledgeBase: action.payload,
|
|
};
|
|
case 'SET_EVALUATION_RESULTS':
|
|
return {
|
|
...state,
|
|
evaluationResults: action.payload,
|
|
};
|
|
case 'UPDATE_EVALUATION_RESULT':
|
|
return {
|
|
...state,
|
|
evaluationResults: state.evaluationResults.map(result =>
|
|
result.fieldId === action.payload.fieldId ? action.payload : result
|
|
),
|
|
};
|
|
default:
|
|
return state;
|
|
}
|
|
}
|
|
|
|
export { initialState }; |