Files
smart-cropx-ui/src/app/(app)/land-information/suitability/recommend/page.tsx
peng dfc29ce01f fix: 修复系统模块TypeScript类型错误和组件功能问题
- 修复消息组件JSX.Element类型错误,改为React.ReactNode
- 完善审核历史页面类型定义和API接口调用
- 优化验证码组件,移除备用验证码逻辑避免无限循环
- 简化系统设置页面,仅保留基本设置和外观设置
- 修复用户管理页面编辑模态框数据加载和CRUD操作
- 移除废弃的作物推荐组件文件

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 17:28:11 +08:00

184 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'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
} from './components/cropRecommendReducer';
import { FieldEnvironmentOverview } from './components/FieldEnvironmentOverview';
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>
{/* 知识库对话框 */}
<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>
);
}