子仓库提交

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,188 @@
'use client';
import { useReducer } from 'react';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { BookOpen, Target } from 'lucide-react';
import {
cropRecommendReducer,
initialState,
SuitabilityResult
} from './components/cropRecommendReducer';
import { FieldEnvironmentOverview } from './components/FieldEnvironmentOverview';
import { CropRecommendations } from './components/CropRecommendations';
import { KnowledgeBaseDialog } from './components/KnowledgeBaseDialog';
export default function CropPage() {
const [state, dispatch] = useReducer(cropRecommendReducer, initialState);
// 获取当前选中的地块结果
const currentResult = state.evaluationResults.find(r => r.fieldId === state.selectedField) || state.evaluationResults[0];
const handleFieldChange = (value: string) => {
dispatch({ type: 'SET_SELECTED_FIELD', payload: value });
};
const handleToggleKnowledgeBase = () => {
dispatch({ type: 'SET_SHOW_KNOWLEDGE_BASE', payload: !state.showKnowledgeBase });
};
const getGradeColor = (grade: string) => {
switch (grade) {
case '高度适宜': return 'bg-green-500';
case '一般适宜': return 'bg-yellow-500';
case '不适宜': return 'bg-red-500';
default: return 'bg-gray-500';
}
};
return (
<div className="space-y-6">
<div className="flex items-center justify-between">
<div>
<h2 className="text-green-800 dark:text-green-200"></h2>
<p className="text-muted-foreground">
</p>
</div>
<div className="flex gap-2">
<Button variant="outline" onClick={handleToggleKnowledgeBase}>
<BookOpen className="w-4 h-4 mr-2" />
</Button>
</div>
</div>
{/* 地块选择和适宜性概览 */}
<div className="grid grid-cols-1 lg:grid-cols-4 gap-4">
<div className="lg:col-span-1">
<div className="space-y-4">
<div className="p-4 bg-card rounded-lg border">
<label className="text-xs text-muted-foreground mb-2 block"></label>
<Select value={state.selectedField} onValueChange={handleFieldChange}>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
{state.evaluationResults.map((result) => (
<SelectItem key={result.fieldId} value={result.fieldId}>
{result.fieldName} - {result.grade} ({result.totalScore})
</SelectItem>
))}
</SelectContent>
</Select>
</div>
{/* 适宜性评分卡片 */}
<div className="p-4 bg-gradient-to-br from-green-50 to-green-100 dark:from-green-950 dark:to-green-900 rounded-lg border border-green-200 dark:border-green-800">
<div className="text-center">
<Target className="w-12 h-12 text-green-600 dark:text-green-400 mx-auto mb-3" />
<p className="text-xs text-muted-foreground mb-2"></p>
<p className="text-4xl font-bold text-green-600 dark:text-green-400 mb-2">{currentResult.totalScore}</p>
<Badge className={`${getGradeColor(currentResult.grade)} text-white`}>
{currentResult.grade}
</Badge>
</div>
</div>
{/* 因子评分统计 */}
<div className="p-4 bg-card rounded-lg border">
<p className="text-sm font-medium mb-3"></p>
<div className="space-y-2">
<div className="flex justify-between text-xs">
<span className="text-muted-foreground"></span>
<span className="text-green-600 font-medium">
{currentResult.factors.filter(f => f.score >= 80).length}
</span>
</div>
<div className="flex justify-between text-xs">
<span className="text-muted-foreground"></span>
<span className="text-red-600 font-medium">
{currentResult.factors.filter(f => f.score < 70).length}
</span>
</div>
<div className="flex justify-between text-xs">
<span className="text-muted-foreground"></span>
<span className="text-muted-foreground">{currentResult.timestamp}</span>
</div>
</div>
</div>
</div>
</div>
<div className="lg:col-span-3">
<FieldEnvironmentOverview currentResult={currentResult} />
</div>
</div>
{/* 智能作物推荐 */}
<CropRecommendations state={state} currentResult={currentResult} />
{/* 知识库对话框 */}
<KnowledgeBaseDialog
showKnowledgeBase={state.showKnowledgeBase}
onClose={handleToggleKnowledgeBase}
/>
{/* 系统说明 */}
<div className="p-5 bg-gradient-to-r from-green-50 to-blue-50 dark:from-green-950 dark:to-blue-950 rounded-lg border border-green-200 dark:border-green-800">
<div className="flex items-start gap-3">
<div className="p-2 bg-green-100 dark:bg-green-900 rounded-lg">
<Target className="w-6 h-6 text-green-700 dark:text-green-300 flex-shrink-0" />
</div>
<div className="flex-1">
<h4 className="text-green-900 dark:text-green-100 mb-3">-</h4>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 text-sm text-green-800 dark:text-green-200">
<div>
<p className="font-medium mb-2">🌾 </p>
<ul className="space-y-1 text-xs">
<li> <strong></strong>: </li>
<li> <strong></strong>: pH7</li>
<li> <strong></strong>: </li>
<li> <strong></strong>: </li>
</ul>
</div>
<div>
<p className="font-medium mb-2">🎯 </p>
<ul className="space-y-1 text-xs">
<li> <strong></strong>: </li>
<li> <strong></strong>: 10060</li>
<li> <strong></strong>: </li>
<li> <strong></strong>: 8570-84</li>
</ul>
</div>
<div>
<p className="font-medium mb-2">📊 </p>
<ul className="space-y-1 text-xs">
<li> <strong></strong>: //</li>
<li> <strong></strong>: </li>
<li> <strong></strong>: </li>
<li> <strong></strong>: </li>
</ul>
</div>
<div>
<p className="font-medium mb-2"> </p>
<ul className="space-y-1 text-xs">
<li> <strong></strong>: </li>
<li> <strong></strong>: </li>
<li> <strong></strong>: //</li>
<li> <strong></strong>: </li>
</ul>
</div>
</div>
<div className="mt-4 p-3 bg-white/60 dark:bg-black/20 rounded-lg border border-green-200 dark:border-green-800">
<p className="text-xs text-green-900 dark:text-green-100">
<strong>💡 </strong>
-
</p>
</div>
</div>
</div>
</div>
</div>
);
}