Files
DashBoard/frontend/src/portal-shell/nativeModuleRegistry.js
egg f14591c7dc feat(mid-section-defect): full-line bidirectional defect trace center with dual query mode
Transform /mid-section-defect from TMTT-only backward analysis into a full-line
bidirectional defect traceability center supporting all detection stations.

Key changes:
- Parameterized station detection: any workcenter group as detection station
- Bidirectional tracing: backward (upstream attribution) + forward (downstream reject rates)
- Dual query mode: date range OR LOT/工單/WAFER container-based seed resolution
- Multi-select filters for upstream station, equipment model (RESOURCEFAMILYNAME), and loss reasons
- Progressive 3-stage trace pipeline (seed-resolve → lineage → events) with streaming UI
- Equipment model lookup via resource cache instead of SPECNAME
- Session caching, auto-refresh, searchable MultiSelect with fuzzy matching
- Remove legacy tmtt-defect module (fully superseded)
- Archive openspec change artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:16:33 +08:00

82 lines
2.8 KiB
JavaScript

function createNativeLoader(componentLoader, styleLoaders = []) {
let styleBootstrapPromise = null;
return async () => {
if (!styleBootstrapPromise) {
styleBootstrapPromise = Promise.all(styleLoaders.map((loadStyle) => loadStyle())).catch((error) => {
styleBootstrapPromise = null;
throw error;
});
}
await styleBootstrapPromise;
return componentLoader();
};
}
const NATIVE_MODULE_LOADERS = Object.freeze({
'/wip-overview': createNativeLoader(
() => import('../wip-overview/App.vue'),
[() => import('../wip-overview/style.css')],
),
'/wip-detail': createNativeLoader(
() => import('../wip-detail/App.vue'),
[() => import('../wip-detail/style.css')],
),
'/hold-overview': createNativeLoader(
() => import('../hold-overview/App.vue'),
[() => import('../wip-shared/styles.css'), () => import('../hold-overview/style.css')],
),
'/hold-detail': createNativeLoader(
() => import('../hold-detail/App.vue'),
[() => import('../hold-detail/style.css')],
),
'/hold-history': createNativeLoader(
() => import('../hold-history/App.vue'),
[() => import('../wip-shared/styles.css'), () => import('../hold-history/style.css')],
),
'/reject-history': createNativeLoader(
() => import('../reject-history/App.vue'),
[() => import('../wip-shared/styles.css'), () => import('../reject-history/style.css')],
),
'/resource': createNativeLoader(
() => import('../resource-status/App.vue'),
[() => import('../resource-shared/styles.css'), () => import('../resource-status/style.css')],
),
'/resource-history': createNativeLoader(
() => import('../resource-history/App.vue'),
[() => import('../resource-shared/styles.css'), () => import('../resource-history/style.css')],
),
'/qc-gate': createNativeLoader(
() => import('../qc-gate/App.vue'),
[() => import('../qc-gate/style.css')],
),
'/job-query': createNativeLoader(
() => import('../job-query/App.vue'),
[() => import('../resource-shared/styles.css'), () => import('../job-query/style.css')],
),
'/excel-query': createNativeLoader(
() => import('../excel-query/App.vue'),
[() => import('../excel-query/style.css')],
),
'/query-tool': createNativeLoader(
() => import('../query-tool/App.vue'),
[() => import('../query-tool/style.css')],
),
'/tables': createNativeLoader(
() => import('../tables/App.vue'),
[() => import('../tables/style.css')],
),
'/mid-section-defect': createNativeLoader(
() => import('../mid-section-defect/App.vue'),
[() => import('../mid-section-defect/style.css')],
),
'/admin/performance': createNativeLoader(
() => import('../admin-performance/App.vue'),
[() => import('../admin-performance/style.css')],
),
});
export function getNativeModuleLoader(route) {
return NATIVE_MODULE_LOADERS[String(route || '').trim()] || null;
}