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]) => (
))}
);
}
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()}
);
}