From c942a2ce072db2032a074384460abaf7ca606c81 Mon Sep 17 00:00:00 2001 From: peng Date: Sat, 1 Nov 2025 16:26:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E7=AE=A1=E7=90=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=20-=20=E5=BA=94=E7=94=A8=E7=94=9F=E6=88=90=E3=80=81?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ApplicationEditDialog.tsx | 517 ++++++++ .../components/ApplicationGenerateDialog.tsx | 505 ++++++++ .../ApplicationGenerationReducer.tsx | 180 +++ .../generation/components/ApplicationList.tsx | 303 +++++ .../components/ApplicationRunDialog.tsx | 455 +++++++ .../model-application/generation/page.tsx | 297 ++++- .../model-application/scheduling/page.tsx | 1112 ++++++++++++++++- crop-x/src/types/ai-model.ts | 76 ++ 8 files changed, 3433 insertions(+), 12 deletions(-) create mode 100644 crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationEditDialog.tsx create mode 100644 crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationGenerateDialog.tsx create mode 100644 crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationGenerationReducer.tsx create mode 100644 crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationList.tsx create mode 100644 crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationRunDialog.tsx create mode 100644 crop-x/src/types/ai-model.ts diff --git a/crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationEditDialog.tsx b/crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationEditDialog.tsx new file mode 100644 index 0000000..0862066 --- /dev/null +++ b/crop-x/src/app/(app)/ai-crop-model/model-application/generation/components/ApplicationEditDialog.tsx @@ -0,0 +1,517 @@ +/** + * filekorolheader: 应用编辑对话框 - 模型应用编辑流程对话框 + * 功能:多步骤应用编辑流程、表单验证、应用更新 + * 路径:/ai-crop-model/model-application/generation/components/ApplicationEditDialog + * 规范:遵循crop-x/docs/开发项目规范.md,使用shadcn语义化样式 + */ +'use client'; + +import { ApplicationGenerationState, ApplicationGenerationAction } from './ApplicationGenerationReducer'; +import { Application, ApplicationType, OutputFormat } from '@/types/ai-model'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { Card } from '@/components/ui/card'; +import { Label } from '@/components/ui/label'; +import { Input } from '@/components/ui/input'; +import { Textarea } from '@/components/ui/textarea'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Checkbox } from '@/components/ui/checkbox'; +import { + Edit, + ChevronLeft, + ChevronRight, + FileText, + Server, + BarChart3, + LineChart as LineChartIcon, + PieChart as PieChartIcon, + Table as TableIcon, + Type, + CheckCircle, + AlertTriangle, +} from 'lucide-react'; +import { toast } from 'sonner'; + +interface ApplicationEditDialogProps { + state: ApplicationGenerationState; + dispatch: React.Dispatch; +} + +export default function ApplicationEditDialog({ state, dispatch }: ApplicationEditDialogProps) { + const { showEditDialog, editStep, editAppData, availableModels, inputFieldOptions, editingApp } = state; + + const handleNextStep = () => { + if (editStep === 1) { + if (!editAppData.name || !editAppData.type || !editAppData.description) { + toast.error('请填写完整的基本信息'); + return; + } + } else if (editStep === 2) { + if (!editAppData.modelName || !editAppData.modelVersion) { + toast.error('请选择模型'); + return; + } + } else if (editStep === 3) { + if (editAppData.inputFields.length === 0) { + toast.error('请选择至少一个输入字段'); + return; + } + } else if (editStep === 4) { + if (!editAppData.outputFormat) { + toast.error('请选择输出格式'); + return; + } + } + dispatch({ type: 'SET_EDIT_STEP', payload: editStep + 1 }); + }; + + const handlePrevStep = () => { + dispatch({ type: 'SET_EDIT_STEP', payload: editStep - 1 }); + }; + + const handleSaveEdit = () => { + if (!editingApp) return; + + const updatedApp: Application = { + ...editingApp, + name: editAppData.name, + type: editAppData.type as ApplicationType, + description: editAppData.description, + modelName: editAppData.modelName, + modelVersion: editAppData.modelVersion, + inputConfig: { + fields: editAppData.inputFields, + }, + outputConfig: { + format: editAppData.outputFormat as OutputFormat, + }, + }; + + dispatch({ + type: 'UPDATE_APPLICATION', + payload: { id: editingApp.id, updates: updatedApp } + }); + + dispatch({ type: 'SET_SHOW_EDIT_DIALOG', payload: false }); + dispatch({ type: 'SET_EDIT_STEP', payload: 1 }); + dispatch({ type: 'SET_EDITING_APP', payload: null }); + dispatch({ type: 'RESET_EDIT_APP_DATA' }); + + toast.success(`应用"${updatedApp.name}"更新成功!`); + }; + + const handleClose = () => { + dispatch({ type: 'SET_SHOW_EDIT_DIALOG', payload: false }); + dispatch({ type: 'SET_EDIT_STEP', payload: 1 }); + dispatch({ type: 'SET_EDITING_APP', payload: null }); + dispatch({ type: 'RESET_EDIT_APP_DATA' }); + }; + + const getStepIcon = (step: number) => { + switch (step) { + case 1: + return ; + case 2: + return ; + case 3: + return ; + case 4: + return ; + default: + return ; + } + }; + + const getStepTitle = (step: number) => { + switch (step) { + case 1: + return '填写基本信息'; + case 2: + return '选择模型'; + case 3: + return '配置输入'; + case 4: + return '配置输出'; + case 5: + return '预览保存'; + default: + return ''; + } + }; + + return ( + + + + + + 编辑应用 - {getStepTitle(editStep)} + + + 步骤 {editStep} / 5 + + + + {/* 步骤指示器 */} +
+ {[1, 2, 3, 4, 5].map((step) => ( +
+
+ {step < editStep ? : getStepIcon(step)} +
+ + {getStepTitle(step)} + + {step < 5 && ( + + )} +
+ ))} +
+ + {/* 步骤内容 */} +
+ {/* 步骤1: 基本信息 */} + {editStep === 1 && ( +
+ +
+ + 请填写应用的基本信息 +
+
+
+ + dispatch({ type: 'SET_EDIT_APP_DATA', payload: { name: e.target.value } })} + /> +
+
+ + +
+
+ +