import { Suspense, lazy, useEffect, useMemo, useState } from 'react'; import { PRODUCTION_WORKSPACE_ENTRY_TO_VIEW, PRODUCTION_WORKSPACE_TAB, PRODUCTION_WORKSPACE_VIEWS, PRODUCTION_WORKSPACE_WORKBENCHES, } from './config/appConstants'; import { PanelLoadingBody } from './components/app/AppLoadingFallbacks'; const LazyDinsarProductionPanel = lazy(() => import('./DinsarProductionPanel')); const LazySbasInsarProductionPanel = lazy(() => import('./SbasInsarProductionPanel')); const LazySbasInsarProductsPanel = lazy(() => import('./SbasInsarProductsPanel')); const LazyDinsarProductsPanel = lazy(() => import('./DinsarProductsPanel')); const LazyLandsarLt1ProductionPanel = lazy(() => import('./LandsarLt1ProductionPanel')); const LazyPairPlanningPanel = lazy(() => import('./panels/PairPlanningPanel')); const LazyPairsListPanel = lazy(() => import('./panels/PairsListPanel')); const LazyBatchPanel = lazy(() => import('./panels/BatchPanel')); const LazyDataCopierPanel = lazy(() => import('./DataCopierPanel')); const WORKFLOW_STEPS = [ '数据准备', '配对/栈规划', '生产运行', '质量检查', '成果发布', ]; const SENSOR_PRODUCTION_PLACEHOLDERS = { sentinel1_production: { title: 'Sentinel-1 生产占位', note: '当前主要沉淀数据与精轨管理约束,SBAS 仅保留规划能力。', rows: [ ['数据来源', 'ZIP/SAFE 本机 archive'], ['精轨策略', 'EOF 精轨本机管理'], ['准备方式', '按需解包到工作目录'], ['D-InSAR', '走统一生产任务队列'], ['SBAS', '保留序列规划能力'], ], }, gf3_native_registration: { title: '高分三结果登记', note: 'GF3 由外部 SARscape 服务生产,本系统登记回传成果并生成预览。', rows: [ ['生产方式', '外部 SARscape 服务'], ['落地路径', '本机登记 _geo 二进制'], ['预览生成', '转换 WebP 供地图使用'], ['精轨策略', '按外部生产结果留痕'], ['结果管理', '进入统一产品 catalog'], ], }, }; const shellStyle = { minHeight: '100%', background: '#f8fafc', color: '#0f172a', }; const headerStyle = { padding: '18px 20px 14px', borderBottom: '1px solid #e2e8f0', background: '#ffffff', }; const sectionStyle = { padding: '16px 20px 22px', }; const compactPanelStyle = { border: '1px solid #e2e8f0', borderRadius: 8, background: '#ffffff', }; const mutedTextStyle = { color: '#64748b', fontSize: 13, lineHeight: 1.6, }; function resolveView(activeEntry) { return PRODUCTION_WORKSPACE_ENTRY_TO_VIEW[activeEntry] || PRODUCTION_WORKSPACE_ENTRY_TO_VIEW[PRODUCTION_WORKSPACE_TAB]; } function resolveWorkbenchKey(viewKey) { const workbench = PRODUCTION_WORKSPACE_WORKBENCHES.find(item => item.views.some(view => view.key === viewKey), ); return workbench?.key || PRODUCTION_WORKSPACE_WORKBENCHES[0]?.key; } function buttonStyle(active) { return { border: `1px solid ${active ? '#2563eb' : '#cbd5e1'}`, background: active ? '#eff6ff' : '#ffffff', color: active ? '#1d4ed8' : '#334155', borderRadius: 6, padding: '7px 10px', fontSize: 13, fontWeight: 600, cursor: 'pointer', lineHeight: 1.3, }; } function PlaceholderView({ config }) { if (!config) { return (

生产入口未配置

当前视图尚未接入生产面板。

); } return (

{config.title}

{config.note}

{config.rows.map(([label, value]) => (
{label}
{value}
))}
); } export default function ProductionWorkspace({ activeEntry, readOnly, onTaskStart, apiEndpoint, language, foundPairs, selectedPairsCount, isLoading, hasEnoughRadarScenesForPlanning, hasRadarSearched, pairingPanel, radarPanel, pairsPanel, }) { const initialView = resolveView(activeEntry); const [activeView, setActiveView] = useState(initialView); const [activeWorkbench, setActiveWorkbench] = useState(resolveWorkbenchKey(initialView)); useEffect(() => { const nextView = resolveView(activeEntry); setActiveView(nextView); setActiveWorkbench(resolveWorkbenchKey(nextView)); }, [activeEntry]); const currentWorkbench = useMemo( () => PRODUCTION_WORKSPACE_WORKBENCHES.find(item => item.key === activeWorkbench) || PRODUCTION_WORKSPACE_WORKBENCHES[0], [activeWorkbench], ); const currentView = useMemo( () => PRODUCTION_WORKSPACE_VIEWS.find(view => view.key === activeView), [activeView], ); const switchWorkbench = workbench => { setActiveWorkbench(workbench.key); if (!workbench.views.some(view => view.key === activeView)) { setActiveView(workbench.defaultView); } }; const handleDinsarRunQueued = taskId => { onTaskStart?.(taskId, 'D-InSAR 任务已入队,等待处理...'); }; const handleDinsarProductQueued = taskId => { onTaskStart?.(taskId, 'D-InSAR 产物任务已入队,等待处理...'); }; const handleDinsarPrepareQueued = taskId => { onTaskStart?.(taskId, 'D-InSAR 生产准备任务已入队,正在处理...', { taskType: 'COPY_DATA', nonBlocking: true, }); }; const handleSbasProductQueued = taskId => { onTaskStart?.(taskId, 'SBAS-InSAR 结果 catalog 任务已入队。', { taskType: 'REBUILD_SBAS_INSAR_CATALOG', nonBlocking: true, }); }; const handleLt1ImageQueued = taskId => { onTaskStart?.(taskId, 'LT-1 地理编码 GeoTIFF 生产任务已入队。', { taskType: 'SAR_SCENE_PREPROCESS', nonBlocking: true, }); }; const renderContent = () => { if (activeView === 'dinsar_pairing') { return ( setActiveView('dinsar_pairs')} language={language} /> ); } if (activeView === 'dinsar_pairs') { return (
); } if (activeView === 'dinsar_prepare') { return ( ); } if (activeView === 'dinsar_runs') { return ; } if (activeView === 'dinsar_products') { return ; } if (['sbas_insar_planning', 'sbas_insar_batches', 'sbas_insar_prepare', 'sbas_insar_runs'].includes(activeView)) { const focusMap = { sbas_insar_planning: 'planning', sbas_insar_batches: 'batches', sbas_insar_prepare: 'prepare', sbas_insar_runs: 'runs', }; return ( ); } if (activeView === 'sbas_insar_products') { return ; } if (activeView === 'lt1_production') { return ; } return ; }; return (
生产工作台

InSAR 生产管理

面向科研工程生产的任务编排入口,统一组织数据准备、规划、运行、质量检查与成果发布。

{readOnly && (
当前为只读账号,生产提交操作已禁用。
)}
{WORKFLOW_STEPS.map((step, index) => (
{index + 1}. {step}
))}
{currentWorkbench?.label}

{currentView?.label || '生产视图'}

{currentView?.description}
{currentWorkbench?.views.map(view => ( ))}
}> {renderContent()}
); }