2025-09-08 12:06:01 +08:00
|
|
|
|
import React, { useState } from 'react';
|
|
|
|
|
|
import { motion, AnimatePresence } from 'framer-motion';
|
2025-09-29 10:02:15 +08:00
|
|
|
|
import { X, Sparkles, FileText, Zap } from 'lucide-react';
|
|
|
|
|
|
import orderClassesData from '../data/orderClasses.json';
|
|
|
|
|
|
import { OrderClassIconMap } from './OrderClassIcons';
|
2025-09-08 12:06:01 +08:00
|
|
|
|
|
|
|
|
|
|
interface RequirementModalProps {
|
|
|
|
|
|
isOpen: boolean;
|
|
|
|
|
|
onClose: () => void;
|
2025-09-29 10:02:15 +08:00
|
|
|
|
onSubmit: (requirement: string, orderClass: string) => void;
|
2025-09-08 12:06:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-29 10:02:15 +08:00
|
|
|
|
const RequirementModal: React.FC<RequirementModalProps> = ({ isOpen, onClose, onSubmit }) => {
|
|
|
|
|
|
const [requirement, setRequirement] = useState('');
|
|
|
|
|
|
const [selectedTemplate, setSelectedTemplate] = useState<string | null>(null);
|
|
|
|
|
|
const [selectedOrderClass, setSelectedOrderClass] = useState<string>('');
|
|
|
|
|
|
|
|
|
|
|
|
const handleTemplateSelect = (orderClass: any) => {
|
|
|
|
|
|
// 使用配置文件中的模板内容
|
|
|
|
|
|
const content = orderClass.template?.description || '';
|
|
|
|
|
|
setRequirement(content);
|
|
|
|
|
|
setSelectedTemplate(orderClass.id);
|
|
|
|
|
|
setSelectedOrderClass(orderClass.id);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const generateTemplateContent = (orderClass: any) => {
|
|
|
|
|
|
// 直接返回配置中的描述
|
|
|
|
|
|
return orderClass.template?.description || '';
|
|
|
|
|
|
// 保留原有的模板作为备用
|
|
|
|
|
|
const templates: { [key: string]: string } = {
|
|
|
|
|
|
tourism: `展会名称:2024长三角国际新能源汽车与智能交通产业博览会
|
2025-09-08 12:06:01 +08:00
|
|
|
|
地点:上海国家会展中心
|
|
|
|
|
|
时间:2024年10月18日-20日
|
|
|
|
|
|
规模:50,000平方米,预计350家展商,50,000人次观众
|
|
|
|
|
|
主题:双碳目标下的新能源汽车产业创新与发展
|
2025-09-29 10:02:15 +08:00
|
|
|
|
特色:整车展示、核心零部件、充电设施、智能交通解决方案`,
|
2025-09-08 12:06:01 +08:00
|
|
|
|
|
2025-09-29 10:02:15 +08:00
|
|
|
|
food: `展会名称:2024国际健康食品与轻食产业博览会
|
|
|
|
|
|
地点:北京国家会议中心
|
|
|
|
|
|
时间:2024年11月15日-17日
|
|
|
|
|
|
规模:30,000平方米,预计200家展商,30,000人次观众
|
|
|
|
|
|
主题:健康饮食新风尚,轻食产业新机遇
|
|
|
|
|
|
特色:健康食品展示、轻食品牌推广、营养科技创新、餐饮连锁加盟`,
|
|
|
|
|
|
|
|
|
|
|
|
finance: `展会名称:2024国际美妆产业与电商创新博览会
|
|
|
|
|
|
地点:广州琶洲会展中心
|
|
|
|
|
|
时间:2024年12月8日-10日
|
|
|
|
|
|
规模:40,000平方米,预计300家展商,40,000人次观众
|
|
|
|
|
|
主题:美妆新零售,电商新生态
|
|
|
|
|
|
特色:美妆品牌展示、电商平台对接、直播带货、供应链展示`,
|
|
|
|
|
|
|
|
|
|
|
|
dev: `展会名称:2024国际教育科技与智慧学习博览会
|
|
|
|
|
|
地点:深圳会展中心
|
|
|
|
|
|
时间:2024年10月25日-27日
|
|
|
|
|
|
规模:35,000平方米,预计250家展商,35,000人次观众
|
|
|
|
|
|
主题:AI赋能教育,科技引领未来
|
|
|
|
|
|
特色:智慧教育解决方案、在线学习平台、教育硬件、课程内容`,
|
2025-09-08 12:06:01 +08:00
|
|
|
|
|
2025-09-29 10:02:15 +08:00
|
|
|
|
manufacturing: `展会名称:2024国际智能制造与工业自动化博览会
|
|
|
|
|
|
地点:苏州国际博览中心
|
|
|
|
|
|
时间:2024年11月20日-22日
|
|
|
|
|
|
规模:45,000平方米,预计300家展商,40,000人次观众
|
|
|
|
|
|
主题:智能制造,智慧工厂
|
|
|
|
|
|
特色:工业机器人、PLC控制、智能物流、数字化工厂`,
|
|
|
|
|
|
|
|
|
|
|
|
design: `展会名称:2024国际文创设计与视觉艺术博览会
|
|
|
|
|
|
地点:杭州国际博览中心
|
|
|
|
|
|
时间:2024年11月5日-7日
|
|
|
|
|
|
规模:25,000平方米,预计150家展商,25,000人次观众
|
|
|
|
|
|
主题:创意设计,美好生活
|
|
|
|
|
|
特色:文创产品、视觉设计、影视制作、数字艺术`,
|
|
|
|
|
|
|
|
|
|
|
|
logistics: `展会名称:2024国际智慧物流与供应链博览会
|
|
|
|
|
|
地点:上海新国际博览中心
|
|
|
|
|
|
时间:2024年12月15日-17日
|
|
|
|
|
|
规模:50,000平方米,预计400家展商,50,000人次观众
|
|
|
|
|
|
主题:智慧物流,高效供应链
|
|
|
|
|
|
特色:AGV系统、智能仓储、冷链物流、供应链管理`,
|
|
|
|
|
|
|
|
|
|
|
|
civil: `展会名称:2024国际建筑科技与绿色建造博览会
|
|
|
|
|
|
地点:武汉国际博览中心
|
|
|
|
|
|
时间:2024年11月28日-30日
|
|
|
|
|
|
规模:35,000平方米,预计200家展商,30,000人次观众
|
|
|
|
|
|
主题:绿色建筑,智慧建造
|
|
|
|
|
|
特色:BIM技术、装配式建筑、生态材料、智慧工地`,
|
|
|
|
|
|
|
|
|
|
|
|
health: `展会名称:2024国际大健康产业与医疗创新博览会
|
|
|
|
|
|
地点:成都世纪城新国际会展中心
|
|
|
|
|
|
时间:2024年12月22日-24日
|
|
|
|
|
|
规模:40,000平方米,预计300家展商,35,000人次观众
|
|
|
|
|
|
主题:科技赋能健康,创新引领医疗
|
|
|
|
|
|
特色:智慧医疗、心理健康、康复设备、健康管理`,
|
|
|
|
|
|
|
|
|
|
|
|
energy: `展会名称:2024国际新能源与光伏产业博览会
|
|
|
|
|
|
地点:西安国际会展中心
|
|
|
|
|
|
时间:2024年11月12日-14日
|
|
|
|
|
|
规模:38,000平方米,预计280家展商,35,000人次观众
|
|
|
|
|
|
主题:清洁能源,绿色发展
|
|
|
|
|
|
特色:光伏技术、储能系统、智能电网、新能源装备`,
|
|
|
|
|
|
|
|
|
|
|
|
chemical: `展会名称:2024国际新材料与精细化工博览会
|
|
|
|
|
|
地点:南京国际博览中心
|
|
|
|
|
|
时间:2024年12月5日-7日
|
|
|
|
|
|
规模:30,000平方米,预计200家展商,25,000人次观众
|
|
|
|
|
|
主题:新材料,新未来
|
|
|
|
|
|
特色:半导体材料、精细化工、功能材料、检测设备`,
|
|
|
|
|
|
|
|
|
|
|
|
environment: `展会名称:2024国际环保科技与生态治理博览会
|
|
|
|
|
|
地点:青岛国际会展中心
|
|
|
|
|
|
时间:2024年11月25日-27日
|
|
|
|
|
|
规模:32,000平方米,预计220家展商,28,000人次观众
|
|
|
|
|
|
主题:生态文明,绿色发展
|
|
|
|
|
|
特色:环境监测、污水处理、大气治理、生态修复`
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return templates[orderClass.id] || orderClass.scenario;
|
2025-09-08 12:06:01 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleSubmit = () => {
|
2025-09-29 10:02:15 +08:00
|
|
|
|
if (requirement.trim() && selectedOrderClass) {
|
|
|
|
|
|
onSubmit(requirement, selectedOrderClass);
|
2025-09-08 12:06:01 +08:00
|
|
|
|
setRequirement('');
|
|
|
|
|
|
setSelectedTemplate(null);
|
2025-09-29 10:02:15 +08:00
|
|
|
|
setSelectedOrderClass('');
|
2025-09-08 12:06:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<AnimatePresence>
|
|
|
|
|
|
{isOpen && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
{/* 背景遮罩 */}
|
|
|
|
|
|
<motion.div
|
|
|
|
|
|
initial={{ opacity: 0 }}
|
|
|
|
|
|
animate={{ opacity: 1 }}
|
|
|
|
|
|
exit={{ opacity: 0 }}
|
|
|
|
|
|
className="fixed inset-0 bg-black/60 backdrop-blur-sm z-50"
|
|
|
|
|
|
onClick={onClose}
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 弹窗内容 */}
|
|
|
|
|
|
<motion.div
|
|
|
|
|
|
initial={{ opacity: 0, scale: 0.9, y: 20 }}
|
|
|
|
|
|
animate={{ opacity: 1, scale: 1, y: 0 }}
|
|
|
|
|
|
exit={{ opacity: 0, scale: 0.9, y: 20 }}
|
|
|
|
|
|
transition={{ type: 'spring', damping: 25, stiffness: 300 }}
|
|
|
|
|
|
className="fixed inset-0 flex items-center justify-center z-50 p-4"
|
|
|
|
|
|
onClick={(e) => e.stopPropagation()}
|
|
|
|
|
|
>
|
2025-09-29 10:02:15 +08:00
|
|
|
|
<div className="bg-white rounded-2xl shadow-2xl max-w-5xl w-full max-h-[90vh] overflow-hidden">
|
2025-09-29 16:07:19 +08:00
|
|
|
|
{/* 头部 - 苹果风格设计 */}
|
|
|
|
|
|
<div className="relative">
|
|
|
|
|
|
{/* 渐变背景 */}
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="absolute inset-0 bg-gradient-to-br from-slate-50 via-white to-gray-50"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundImage: 'url(/image/bg.png)',
|
|
|
|
|
|
backgroundSize: '100% 100%',
|
|
|
|
|
|
backgroundPosition: 'center',
|
|
|
|
|
|
backgroundRepeat: 'no-repeat'
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 内容区 */}
|
|
|
|
|
|
<div className="relative px-8 py-6">
|
|
|
|
|
|
<div className="flex items-center justify-between">
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div className="flex items-center gap-4">
|
|
|
|
|
|
<div className="w-20 h-20 overflow-hidden flex-shrink-0">
|
|
|
|
|
|
<video
|
|
|
|
|
|
src="https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/video/cloude.mp4"
|
|
|
|
|
|
className="w-full h-full object-cover"
|
|
|
|
|
|
autoPlay
|
|
|
|
|
|
loop
|
|
|
|
|
|
muted
|
|
|
|
|
|
playsInline
|
|
|
|
|
|
controls={false}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<h2 className="text-2xl font-bold bg-gradient-to-r from-gray-900 to-gray-600 bg-clip-text text-transparent">
|
|
|
|
|
|
AI 智能需求分析
|
|
|
|
|
|
</h2>
|
|
|
|
|
|
<p className="text-gray-500 text-sm mt-1">选择业务场景,让AI为您定制专属解决方案</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={onClose}
|
|
|
|
|
|
className="w-10 h-10 bg-white hover:bg-gray-50 rounded-full shadow-sm hover:shadow-md transition-all duration-200 flex items-center justify-center group"
|
|
|
|
|
|
>
|
|
|
|
|
|
<X className="w-5 h-5 text-gray-400 group-hover:text-gray-600 transition-colors" />
|
|
|
|
|
|
</button>
|
2025-09-08 12:06:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2025-09-29 16:07:19 +08:00
|
|
|
|
|
|
|
|
|
|
{/* 底部分割线 */}
|
|
|
|
|
|
<div className="h-px bg-gradient-to-r from-transparent via-gray-200 to-transparent" />
|
2025-09-08 12:06:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-09-29 10:02:15 +08:00
|
|
|
|
<div className="p-6 max-h-[calc(90vh-120px)] overflow-y-auto">
|
|
|
|
|
|
{/* 订单班选择 */}
|
2025-09-08 12:06:01 +08:00
|
|
|
|
<div className="mb-6">
|
|
|
|
|
|
<h3 className="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2">
|
|
|
|
|
|
<FileText className="w-4 h-4" />
|
|
|
|
|
|
快速选择需求模板
|
|
|
|
|
|
</h3>
|
2025-09-29 10:02:15 +08:00
|
|
|
|
<div className="grid grid-cols-3 gap-3">
|
|
|
|
|
|
{orderClassesData.orderClasses.map((orderClass) => (
|
2025-09-08 12:06:01 +08:00
|
|
|
|
<button
|
2025-09-29 10:02:15 +08:00
|
|
|
|
key={orderClass.id}
|
|
|
|
|
|
onClick={() => handleTemplateSelect(orderClass)}
|
2025-09-08 12:06:01 +08:00
|
|
|
|
className={`p-4 rounded-xl border-2 transition-all hover:shadow-lg ${
|
2025-09-29 10:02:15 +08:00
|
|
|
|
selectedTemplate === orderClass.id
|
2025-09-08 12:06:01 +08:00
|
|
|
|
? 'border-blue-500 bg-blue-50'
|
|
|
|
|
|
: 'border-gray-200 hover:border-gray-300'
|
|
|
|
|
|
}`}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div className="flex items-center gap-3 mb-2">
|
2025-09-29 10:02:15 +08:00
|
|
|
|
<div className={`p-2 rounded-lg transition-all ${
|
|
|
|
|
|
selectedTemplate === orderClass.id
|
|
|
|
|
|
? 'bg-gradient-to-br from-blue-500 to-blue-600 text-white shadow-md scale-110'
|
|
|
|
|
|
: 'text-white hover:scale-105'
|
|
|
|
|
|
}`}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor: selectedTemplate === orderClass.id ? undefined : orderClass.color,
|
|
|
|
|
|
boxShadow: selectedTemplate === orderClass.id ? '0 4px 12px rgba(59, 130, 246, 0.4)' : undefined
|
|
|
|
|
|
}}>
|
|
|
|
|
|
{(() => {
|
|
|
|
|
|
const IconComponent = OrderClassIconMap[orderClass.id];
|
|
|
|
|
|
return IconComponent ? <IconComponent size={20} /> : <FileText className="w-5 h-5" />;
|
|
|
|
|
|
})()}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="text-left flex-1">
|
|
|
|
|
|
<div className="font-medium text-gray-900">{orderClass.name}</div>
|
|
|
|
|
|
<div className="text-xs text-gray-500 truncate">{orderClass.template?.title || orderClass.description}</div>
|
2025-09-08 12:06:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</button>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 输入区域 */}
|
|
|
|
|
|
<div className="mb-6">
|
|
|
|
|
|
<label className="block text-sm font-semibold text-gray-700 mb-2">
|
|
|
|
|
|
需求描述
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<textarea
|
|
|
|
|
|
value={requirement}
|
|
|
|
|
|
onChange={(e) => setRequirement(e.target.value)}
|
2025-09-29 10:02:15 +08:00
|
|
|
|
placeholder="请输入项目的具体需求、规模、时间、预算等信息..."
|
2025-09-08 12:06:01 +08:00
|
|
|
|
className="w-full h-48 px-4 py-3 border border-gray-300 rounded-xl text-gray-900 placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none transition-all"
|
|
|
|
|
|
style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}
|
|
|
|
|
|
/>
|
2025-09-29 10:02:15 +08:00
|
|
|
|
<div className="mt-2 flex justify-between items-center">
|
2025-09-08 12:06:01 +08:00
|
|
|
|
<span className="text-xs text-gray-500">{requirement.length} 字符</span>
|
2025-09-29 10:02:15 +08:00
|
|
|
|
{selectedTemplate && (
|
|
|
|
|
|
<span className="text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded-full">
|
|
|
|
|
|
已选择:{orderClassesData.orderClasses.find(o => o.id === selectedTemplate)?.name}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
)}
|
2025-09-08 12:06:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 底部按钮 */}
|
|
|
|
|
|
<div className="flex items-center justify-between">
|
|
|
|
|
|
<div className="text-sm text-gray-500">
|
|
|
|
|
|
<span className="inline-flex items-center gap-1">
|
|
|
|
|
|
<Sparkles className="w-4 h-4 text-yellow-500" />
|
2025-09-29 10:02:15 +08:00
|
|
|
|
{selectedTemplate ? (
|
|
|
|
|
|
<>
|
|
|
|
|
|
AI将基于您的需求生成专业的
|
|
|
|
|
|
<strong className="font-semibold text-gray-700">
|
|
|
|
|
|
{orderClassesData.orderClasses.find(o => o.id === selectedTemplate)?.template?.title || '解决方案'}
|
|
|
|
|
|
</strong>
|
|
|
|
|
|
</>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
'AI将基于您的需求生成专业的解决方案'
|
|
|
|
|
|
)}
|
2025-09-08 12:06:01 +08:00
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="flex gap-3">
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={onClose}
|
|
|
|
|
|
className="px-6 py-2.5 text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors font-medium"
|
|
|
|
|
|
>
|
|
|
|
|
|
取消
|
|
|
|
|
|
</button>
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={handleSubmit}
|
2025-09-29 10:02:15 +08:00
|
|
|
|
disabled={!requirement.trim() || !selectedOrderClass}
|
2025-09-08 12:06:01 +08:00
|
|
|
|
className={`px-6 py-2.5 rounded-lg font-medium transition-all flex items-center gap-2 ${
|
2025-09-29 10:02:15 +08:00
|
|
|
|
requirement.trim() && selectedOrderClass
|
2025-09-29 16:07:19 +08:00
|
|
|
|
? 'bg-gradient-to-r from-blue-500 to-blue-600 text-white hover:shadow-lg transform hover:scale-105'
|
2025-09-08 12:06:01 +08:00
|
|
|
|
: 'bg-gray-300 text-gray-500 cursor-not-allowed'
|
|
|
|
|
|
}`}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Zap className="w-4 h-4" />
|
|
|
|
|
|
开始生成方案
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</motion.div>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</AnimatePresence>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export default RequirementModal;
|