import React, { useState, useEffect, useRef } from 'react'; import { Plus, Search, Eye, Edit, Copy, Trash2, Play, Pause, ChevronRight, Layers } from 'lucide-react'; import { useTheme } from '../contexts/ThemeContext'; import { PageType } from '../components/Sidebar'; import { requestCrudService } from '@/service/request-axios-service'; import { Pagination, Dialog, Input, Textarea, Radio, Button, MessagePlugin, Popconfirm, Loading } from 'tdesign-react'; import { useNavigate } from 'react-router-dom'; interface SceneListProps { onViewDetail: (id: string) => void; onNavigate: (page: PageType) => void; } interface sceneItem { id?: number; status?: number; applicableTask?: string; sceneName?: string; sceneType: string; sceneIntro: string; sceneCode: string; relatedAgent: string; deleted?: number; updateTime?: string; taskJson?: string; version: string; } const zncmUrl = import.meta.env.VITE_API_BASE_URL || ''; const sceneStatus = { 0: '执行中', 1: '成功', 2: '失败', 3: '部分成功' } const SceneList: React.FC = ({ onViewDetail, onNavigate }) => { const { theme } = useTheme(); const isDark = theme === 'dark'; const [visible, setVisible] = useState(false); const [editDataShow, setEditDataShow] = useState(false); const [sceneName, setSceneName] = useState(''); const [scenes, setScenes] = useState([]); const [loading, setLoading] = useState(false); const [editLoading, setEditLoading] = useState(false); const [pageNum, setPageNum] = useState(1); const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); const [formData, setFormData] = useState({ applicableTask: '', relatedAgent: '', sceneCode: '', sceneIntro: '', sceneName: '', sceneType: '', taskJson: '', version: '', }); const state = useRef({ pageNum: 1, pageSize: 10 }); const navigate = useNavigate(); const scenesDataSearch = async (pageNumParam?: number, pageSizeParam?: number, sceneNameParam?: string) => { const parmy = { pageNum: pageNumParam ?? state.current.pageNum, pageSize: pageSizeParam ?? state.current.pageSize, sceneName: sceneNameParam ?? sceneName } setLoading(true); const res = await requestCrudService.get(`${zncmUrl}/scene/scenes`, parmy); setLoading(false); res.data.records.forEach((item) => { if (item.taskJson) { item.taskJson = JSON.parse(item.taskJson); } }) console.log('res.data.records', res.data.records) setScenes(res.data.records || []); setTotal(res.data.total || 0); } const addScene = async () => { const res = await requestCrudService.post(`${zncmUrl}/scene/sceneAdd`, formData); setVisible(false); MessagePlugin.success('新增场景成功'); await scenesDataSearch(); } const updateScene = async () => { setEditLoading(true); const res = await requestCrudService.post(`${zncmUrl}/scene/sceneUpdate`, { ...formData, }); setEditLoading(false); setEditDataShow(false); MessagePlugin.success('更新场景成功'); await scenesDataSearch(); } const handleDataChange = (key: keyof typeof formData, value: string | number) => { setFormData((prev) => ({ ...prev, [key]: value, })); }; const showDialog = () => { setFormData({ applicableTask: '', relatedAgent: '', sceneCode: '', sceneIntro: '', sceneName: '', sceneType: '', version: '' }); setVisible(true); }; const editShowChange = async (item: sceneItem) => { const response = await fetch('https://ch1.b.uat.4.cn/zncmweb/templates/6b_template.json'); const data = await response.json(); console.log('response', JSON.stringify(data)); // let taskJson = setFormData({ applicableTask: item.applicableTask, deleted: item.deleted, id: item.id, relatedAgent: item.relatedAgent, sceneCode: item.sceneCode, sceneIntro: item.sceneIntro, sceneName: item.sceneName, sceneType: item.sceneType, status: item.status, taskJson: JSON.stringify(data), version: item.version }); setEditDataShow(true); } const { Group: RadioGroup, Button: RadioButton } = Radio; const delDataChange = async (item: sceneItem) => { const res = await requestCrudService.delete(`${zncmUrl}/scene/sceneDelete/${item.id}`) console.log(res); MessagePlugin.success('场景删除成功'); await scenesDataSearch(); } const handleConfirm = (item: sceneItem) => { // 确认删除逻辑 console.log('用户点击了确认'); delDataChange(item); return true; // 返回 true 表示确认执行 }; const handleCancel = () => { // 取消删除逻辑 console.log('用户点击了取消'); return true; // 返回 true 表示取消 }; const pageIndexChange = async (value: number) => { state.current.pageNum = value; setPageNum(value); await scenesDataSearch(); } const pageSizeChange = async (value: number) => { state.current.pageSize = value; setPageSize(value); await scenesDataSearch(); } // 回车处理 const handleKeyDown = async (e) => { if ((e.metaKey || e.ctrlKey || e.shiftKey) && e.key === "Enter") { e.preventDefault(); } else if (e.keyCode === 13) { e.preventDefault(); await scenesDataSearch(); } else if (e.key === "/") { e.preventDefault(); } }; useEffect(() => { scenesDataSearch(); }, []) return (
{/* 页面标题区 */}

业务链条管理

管理和配置宣传策略流程模板

{/* 搜索和筛选区 */}
setSceneName(e.target.value)} onKeyDown={(e) => handleKeyDown(e)} placeholder="搜索场景名称..." className={`w-full pl-10 pr-4 py-2.5 ${isDark ? 'bg-slate-800/30' : 'bg-gray-50'} border ${isDark ? 'border-blue-800/30' : 'border-gray-300'} rounded-lg ${isDark ? 'text-white' : 'text-gray-900'} placeholder-${isDark ? 'text-slate-500' : 'text-gray-500'} text-sm focus:outline-none focus:border-blue-500/50 transition-colors`} />
{/* */}
{/* 场景列表 */}
{scenes.map((scene) => ( ))}
场景名称 场景类型 适用任务 版本 更新时间 状态 操作
{scene.sceneName}
{scene.sceneType} {scene.sceneIntro} {scene.version} {scene.updateTime} {sceneStatus[scene.status]}
{/* */} {/* */} {/* */} {/* handleConfirm(scene)} onCancel={handleCancel} > */}
{/* 分页 */}
pageIndexChange(Number(page))} onPageSizeChange={(size) => pageSizeChange(Number(size))} />
{/* 新增对话框 */} setVisible(false)} onClose={() => setVisible(false)} closeOnOverlayClick={true} >
handleDataChange('sceneName', val)} placeholder="请输入场景名称" className="w-full" />
handleDataChange('sceneType', val)} placeholder="请输入场景类型" className="w-full" />
handleDataChange('applicableTask', val)} placeholder="请输入适用任务" className="w-full" />
handleDataChange('sceneCode', val)} placeholder="请输入场景代码" className="w-full" />
handleDataChange('version', val)} placeholder="请输入版本" className="w-full" />