子仓库提交

This commit is contained in:
2025-11-10 09:19:56 +08:00
parent 62f92213f7
commit 5feb24e4e2
733 changed files with 141413 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
'use client';
import { useReducer } from 'react';
import { toast } from 'sonner';
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 };