From dec3cd12365df5e7d4c391369f14c457cf56d7d9 Mon Sep 17 00:00:00 2001 From: leefer Date: Fri, 31 Jul 2026 15:08:57 +0800 Subject: [PATCH] migration: preserve frontend shell pages and styles --- app/backend/bootstrap/config.py | 2 +- app/frontend/app.js | 1943 ++++ app/{static => frontend}/heaven-loading.js | 0 app/{static => frontend}/index.html | 18 +- app/{static => frontend}/pages.config.js | 0 app/frontend/pages/auction/page.js | 272 + app/frontend/pages/dragon-tiger/page.js | 375 + .../pages/heaven/loading-v2.js} | 0 .../pages/heaven/page.css} | 0 app/frontend/pages/heaven/page.js | 1847 ++++ app/frontend/pages/ladder/page.js | 96 + app/frontend/pages/market/runtime.js | 1333 +++ app/frontend/pages/mentor/page.js | 497 + app/frontend/pages/pools/page.js | 409 + app/frontend/pages/popularity/page.js | 82 + app/frontend/pages/review/page.js | 699 ++ app/frontend/pages/rotation/page.js | 173 + app/{static => frontend}/pages/runtime.js | 0 app/frontend/pages/screener/page.js | 1082 ++ app/frontend/pages/sentiment/page.js | 316 + app/frontend/pages/themes/page.js | 108 + app/{static => frontend}/shared/api.js | 0 app/{static => frontend}/shared/components.js | 0 app/frontend/shared/export.js | 149 + app/{static => frontend}/shared/shell.js | 0 app/{static => frontend}/shared/state.js | 0 app/{static => frontend}/shared/tokens.css | 0 app/{static => frontend/shared}/ui-core.js | 0 .../styles}/design-system.css | 0 .../styles}/redesign-v2.css | 0 .../styles}/renovation.css | 0 app/{static => frontend/styles}/styles.css | 0 app/{static => frontend/styles}/theme.css | 0 app/{static => frontend}/vendor/lucide.min.js | 0 app/playwright.config.js | 4 +- app/static/app.js | 9283 ----------------- app/static/pages/auction/page.js | 4 - app/static/pages/dragon-tiger/page.js | 3 - app/static/pages/heaven/page.js | 4 - app/static/pages/ladder/page.js | 1 - app/static/pages/mentor/page.js | 3 - app/static/pages/pools/page.js | 7 - app/static/pages/popularity/page.js | 3 - app/static/pages/review/page.js | 3 - app/static/pages/rotation/page.js | 3 - app/static/pages/screener/page.js | 5 - app/static/pages/sentiment/page.js | 3 - app/static/pages/themes/page.js | 3 - app/tests/__init__.py | 1 + app/tests/preservation_helpers.py | 75 + app/tests/test_css_governance.py | 26 +- app/tests/test_frontend_boundaries.py | 14 +- app/tests/test_frontend_contract.py | 20 +- app/tests/test_global_search.py | 5 +- app/tests/test_preservation_slice_accounts.py | 2 +- app/tests/test_preservation_slice_frontend.py | 100 + ...test_preservation_slice_ladder_rotation.py | 31 +- app/tests/test_preservation_slice_market.py | 31 +- ...test_preservation_slice_market_insights.py | 35 +- app/tests/test_preservation_slice_screener.py | 23 +- ...test_preservation_slice_sentiment_pools.py | 30 +- app/tools/build_architecture_inventory.py | 18 +- app/tools/compare_preservation_databases.py | 36 +- app/tools/split_frontend_runtime.py | 184 + docs/migration/evidence/slice-10/README.md | 66 + .../migration/evidence/slice-10/api-diff.json | 236 + .../evidence/slice-10/api-requests.json | 29 + .../evidence/slice-10/browser-acceptance.json | 93 + .../evidence/slice-10/database-diff.json | 202 + ...ntend-migrated-auction-light-1920x1080.png | Bin 0 -> 24303 bytes ...tend-migrated-dark-sentiment-1920x1080.png | Bin 0 -> 136137 bytes ...ontend-migrated-dark-sentiment-390x844.png | Bin 0 -> 35544 bytes ...igrated-heaven-fortune-light-1920x1080.png | Bin 0 -> 99086 bytes ...ed-heaven-heart-breath-light-1920x1080.png | Bin 0 -> 71914 bytes ...ted-heaven-heart-intro-light-1920x1080.png | Bin 0 -> 78900 bytes ...frontend-migrated-heaven-trend-390x844.png | Bin 0 -> 31554 bytes ...-migrated-heaven-trend-light-1920x1080.png | Bin 0 -> 72587 bytes .../frontend-migrated-light-1920x1080.png | Bin 0 -> 129058 bytes ...tend-migrated-screener-light-1920x1080.png | Bin 0 -> 92115 bytes ...ntend-original-auction-light-1920x1080.png | Bin 0 -> 142536 bytes ...tend-original-dark-sentiment-1920x1080.png | Bin 0 -> 136270 bytes ...ontend-original-dark-sentiment-390x844.png | Bin 0 -> 35554 bytes ...riginal-heaven-fortune-light-1920x1080.png | Bin 0 -> 99067 bytes ...al-heaven-heart-breath-light-1920x1080.png | Bin 0 -> 69016 bytes ...nal-heaven-heart-intro-light-1920x1080.png | Bin 0 -> 79183 bytes ...frontend-original-heaven-trend-390x844.png | Bin 0 -> 31351 bytes ...-original-heaven-trend-light-1920x1080.png | Bin 0 -> 72460 bytes .../frontend-original-light-1920x1080.png | Bin 0 -> 129054 bytes ...tend-original-screener-light-1920x1080.png | Bin 0 -> 92826 bytes .../slice-10/frontend-source-map.json | 190 + docs/migration/保真迁移状态.json | 10 +- docs/migration/保真迁移账本.md | 20 +- 92 files changed, 10758 insertions(+), 9449 deletions(-) create mode 100644 app/frontend/app.js rename app/{static => frontend}/heaven-loading.js (100%) rename app/{static => frontend}/index.html (99%) rename app/{static => frontend}/pages.config.js (100%) create mode 100644 app/frontend/pages/auction/page.js create mode 100644 app/frontend/pages/dragon-tiger/page.js rename app/{static/heaven-loading-v2.js => frontend/pages/heaven/loading-v2.js} (100%) rename app/{static/wentian-v2.css => frontend/pages/heaven/page.css} (100%) create mode 100644 app/frontend/pages/heaven/page.js create mode 100644 app/frontend/pages/ladder/page.js create mode 100644 app/frontend/pages/market/runtime.js create mode 100644 app/frontend/pages/mentor/page.js create mode 100644 app/frontend/pages/pools/page.js create mode 100644 app/frontend/pages/popularity/page.js create mode 100644 app/frontend/pages/review/page.js create mode 100644 app/frontend/pages/rotation/page.js rename app/{static => frontend}/pages/runtime.js (100%) create mode 100644 app/frontend/pages/screener/page.js create mode 100644 app/frontend/pages/sentiment/page.js create mode 100644 app/frontend/pages/themes/page.js rename app/{static => frontend}/shared/api.js (100%) rename app/{static => frontend}/shared/components.js (100%) create mode 100644 app/frontend/shared/export.js rename app/{static => frontend}/shared/shell.js (100%) rename app/{static => frontend}/shared/state.js (100%) rename app/{static => frontend}/shared/tokens.css (100%) rename app/{static => frontend/shared}/ui-core.js (100%) rename app/{static => frontend/styles}/design-system.css (100%) rename app/{static => frontend/styles}/redesign-v2.css (100%) rename app/{static => frontend/styles}/renovation.css (100%) rename app/{static => frontend/styles}/styles.css (100%) rename app/{static => frontend/styles}/theme.css (100%) rename app/{static => frontend}/vendor/lucide.min.js (100%) delete mode 100644 app/static/app.js delete mode 100644 app/static/pages/auction/page.js delete mode 100644 app/static/pages/dragon-tiger/page.js delete mode 100644 app/static/pages/heaven/page.js delete mode 100644 app/static/pages/ladder/page.js delete mode 100644 app/static/pages/mentor/page.js delete mode 100644 app/static/pages/pools/page.js delete mode 100644 app/static/pages/popularity/page.js delete mode 100644 app/static/pages/review/page.js delete mode 100644 app/static/pages/rotation/page.js delete mode 100644 app/static/pages/screener/page.js delete mode 100644 app/static/pages/sentiment/page.js delete mode 100644 app/static/pages/themes/page.js create mode 100644 app/tests/__init__.py create mode 100644 app/tests/preservation_helpers.py create mode 100644 app/tests/test_preservation_slice_frontend.py create mode 100644 app/tools/split_frontend_runtime.py create mode 100644 docs/migration/evidence/slice-10/README.md create mode 100644 docs/migration/evidence/slice-10/api-diff.json create mode 100644 docs/migration/evidence/slice-10/api-requests.json create mode 100644 docs/migration/evidence/slice-10/browser-acceptance.json create mode 100644 docs/migration/evidence/slice-10/database-diff.json create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-auction-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-390x844.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-heaven-fortune-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-heaven-heart-breath-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-heaven-heart-intro-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-390x844.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-migrated-screener-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-auction-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-dark-sentiment-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-dark-sentiment-390x844.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-heaven-fortune-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-heaven-heart-breath-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-heaven-heart-intro-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-heaven-trend-390x844.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-heaven-trend-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-original-screener-light-1920x1080.png create mode 100644 docs/migration/evidence/slice-10/frontend-source-map.json diff --git a/app/backend/bootstrap/config.py b/app/backend/bootstrap/config.py index 08d4d11..243ebb6 100644 --- a/app/backend/bootstrap/config.py +++ b/app/backend/bootstrap/config.py @@ -9,7 +9,7 @@ from typing import Any APP_DIR = Path(__file__).resolve().parents[2] -STATIC_DIR = APP_DIR / "static" +STATIC_DIR = APP_DIR / "frontend" DATA_DIR = APP_DIR / "data" ENV_FILE = APP_DIR / ".env" MENTOR_SKILLS_DIR = APP_DIR / "游资skills" diff --git a/app/frontend/app.js b/app/frontend/app.js new file mode 100644 index 0000000..8e18c64 --- /dev/null +++ b/app/frontend/app.js @@ -0,0 +1,1943 @@ +/* PRESERVATION-SOURCE-BEGIN app.js:1-1206 */ +const { + clamp, + displayCompactDate, + escapeHtml, + formatNumber, + formatTimestamp, + localDateString, + number, + parseLocalDate, + todayString, +} = window.XiaobaiUI; + +const { + emptyStateHtml, + renderEmptyState, +} = window.XiaobaiComponents; + +const HEART_BREATH_INHALE_MS = 3_000; +const HEART_BREATH_HOLD_MS = 2_000; +const HEART_BREATH_EXHALE_MS = 4_000; +const HEART_BREATH_PREPARE_MS = 1_000; +const HEART_BREATH_CYCLE_MS = HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS + HEART_BREATH_EXHALE_MS; +const HEART_BREATH_ACTIVE_MS = HEART_BREATH_CYCLE_MS * 5; +const HEART_BREATH_TOTAL_MS = HEART_BREATH_PREPARE_MS + HEART_BREATH_ACTIVE_MS; +const THEME_STORAGE_KEY = "xiaobaiTheme"; +let activeThemeTransition = null; +let themeSwitchSequence = 0; + +const state = window.XiaobaiState.create({ + session: { + user: null, + csrfToken: "", + authMode: "login", + started: false, + activeView: "sentimentCycleView", + dashboardLoading: false, + dashboardRequestSequence: 0, + dashboardRequestDate: "", + adminModels: [], + globalSearchResults: [], + globalSearchActiveIndex: -1, + globalSearchRequestSequence: 0, + }, + market: { + dashboard: null, + filter: "all", + query: "", + sortKey: "streak", + sortDirection: "desc", + brokenQuery: "", + brokenSortKey: "", + brokenSortDirection: "desc", + downQuery: "", + downSortKey: "", + downSortDirection: "asc", + yesterdayFilter: "all", + yesterdayQuery: "", + yesterdaySortKey: "", + yesterdaySortDirection: "desc", + dragonTiger: null, + dragonViewMode: "daily", + dragonFilter: "all", + dragonQuery: "", + selectedDragonTraderId: "", + hotMoneyProfiles: null, + hotMoneyProfileQuery: "", + selectedHotMoneyProfileId: "", + rotationHistory: null, + rotationHistoryKey: "", + rotationSelectedSector: "", + rotationSelectedDate: "", + rotationMembers: null, + rotationMembersKey: "", + rotationMembersLoading: false, + rotationOrder: localStorage.getItem("xiaobaiRotationOrder") === "latest" ? "latest" : "oldest", + rotationLoading: false, + auctionData: null, + auctionDataset: "focus", + auctionFilter: "all", + auctionQuery: "", + auctionSortKey: "attention_score", + auctionSortDirection: "desc", + auctionLoading: false, + auctionTimer: null, + themeLibrary: null, + themeQuery: "", + selectedThemeCode: "", + themeDetail: null, + themeLoading: false, + popularityData: null, + popularitySource: "combined", + popularityQuery: "", + popularityLoading: false, + expandedLadderLevels: new Set(), + ladderSortMode: "time", + sentimentHistory: null, + sentimentRange: 20, + sentimentHistoryKey: "", + sentimentLoading: false, + }, + details: { + stockDetail: null, + activeStock: null, + stockDetailChartMode: "daily", + stockDetailIntraday: null, + stockDetailRequestSequence: 0, + entityDetailItem: null, + entityDetailPayload: null, + entityDetailChartMode: "daily", + entityDetailIntraday: null, + entityDetailRequestSequence: 0, + stockPreviewCode: "", + stockPreviewType: "stock", + stockPreviewItem: null, + stockPreviewPayload: null, + stockPreviewChart: "daily", + stockPreviewFallback: null, + initialStockOpened: false, + }, + review: { + watchlist: [], + watchlistSelection: null, + watchlistSearchResults: [], + watchlistSearchRequestSequence: 0, + editingDailyNoteId: 0, + notes: [], + tradeEntries: [], + tradeSummary: {}, + editingTradeId: 0, + alerts: [], + alertFilter: "all", + alertUnreadCount: 0, + assistantMessages: [], + assistantLoading: false, + assistantController: null, + }, + screener: { + screenerSetup: null, + screenerSetupKey: "", + screenerSetupRequestKey: "", + screenerSetupPromise: null, + selectedRegime: "", + selectedStrategy: null, + customStrategyDraft: null, + screenerRunning: false, + screenerRunningMode: "", + screenerResults: { smart: null, curated: null, quant: null }, + screenerResultContexts: { smart: null, curated: null, quant: null }, + screenerResultStore: {}, + screenerTracking: null, + screenerMode: ["smart", "curated", "quant"].includes(localStorage.getItem("xiaobaiScreenerMode")) + ? localStorage.getItem("xiaobaiScreenerMode") + : "smart", + curatedCategory: "全部", + curatedSchool: "全部", + curatedQuery: "", + curatedViewMode: localStorage.getItem("xiaobaiCuratedViewMode") === "grid" ? "grid" : "list", + selectedCuratedStrategyId: 0, + quantFilters: [], + quantScores: [], + screenerMobileView: "strategy", + }, + mentor: { + mentorSetup: null, + selectedMentorId: "", + mentorMessages: [], + mentorLoading: false, + mentorQuery: "", + mentorGrade: "all", + mentorDirectoryOpen: false, + mentorSortMode: false, + mentorSavingPreferences: false, + mentorController: null, + }, + heaven: { + heavenSetup: null, + heavenManualData: null, + personalField: null, + heavenPanel: "trend", + heavenInterpretations: { trend: "", fortune: "", heart: "" }, + heavenReadingMode: "trend", + heavenReadingTab: "current", + heavenReadingHistory: { trend: [], fortune: [], heart: [] }, + heavenReadingSelectedId: 0, + heavenReadingLoading: false, + heavenReadingError: "", + heartStage: "intro", + heartTimer: null, + heartSeconds: HEART_BREATH_TOTAL_MS / 1000, + heartBreathingEndsAt: 0, + heartLines: [], + heartThrows: [], + heartHexagram: null, + heartCurtainTimer: null, + heartStageToken: 0, + heartRevealToken: 0, + heavenPerformanceKey: "", + heavenPerformancePanels: new Set(), + heavenPerformanceActive: "", + heavenRequestSequence: 0, + }, +}); + +window.XiaobaiAPI.configure({ + csrfToken: () => state.csrfToken, + onUnauthorized: () => showAuthGate("登录状态已失效,请重新登录。"), +}); + +const applicationShell = window.XiaobaiShell.create({ + state, + pages: window.XiaobaiPages, + motionEnabled, + animateRows, + refreshIcons, + tradeDate: () => displayCompactDate( + state.dashboard?.meta?.trade_date || document.querySelector("#tradeDate")?.value || "", + ), + onNavigate: (viewId) => openView(viewId), + onNavigationSync: () => toggleAccountDropdown(false), +}); + +const pageModules = window.XiaobaiPageModules.create({ + pages: window.XiaobaiPages, + actions: { + closeTransientUi: () => closeStockPreview(), + applyAccess: () => applyMembershipAccess(), + clearAuction: () => clearAuctionTimer(), + stopHeaven: () => { + stopQiFieldCanvas(); + stopHeartDust(); + cancelHeavenPerformance(); + }, + loadSentiment: () => loadSentimentHistory(), + loadRotation: () => loadRotationHistory(), + loadAuction: () => loadAuctionCenter(), + loadThemes: () => loadThemeLibrary(), + loadPopularity: () => loadPopularity(), + loadDragonTiger: () => loadDragonTiger(), + loadReview: () => loadReviewWorkspace(), + loadScreener: () => { + if (hasMemberAccess() && state.dashboard) loadScreenerSetup(); + }, + loadMentor: () => { + if (hasMemberAccess()) loadMentorSetup(); + }, + loadHeaven: () => { + if (!hasMemberAccess()) return; + loadHeavenSetup(false, "", document.querySelector("#heavenStockInput").value.trim()); + }, + }, +}); + +const elements = { + tradeDate: document.querySelector("#tradeDate"), + loading: document.querySelector("#loadingOverlay"), + toast: document.querySelector("#toast"), + stockDialog: document.querySelector("#stockDialog"), + tradeLogDialog: document.querySelector("#tradeLogDialog"), + watchlistDialog: document.querySelector("#watchlistDialog"), + alertsDialog: document.querySelector("#alertsDialog"), + assistantDialog: document.querySelector("#assistantDialog"), + heavenReadingDialog: document.querySelector("#heavenReadingDialog"), + globalSearchDialog: document.querySelector("#globalSearchDialog"), + globalSearchInput: document.querySelector("#globalSearchInput"), + globalSearchResults: document.querySelector("#globalSearchResults"), + entityDetailDialog: document.querySelector("#entityDetailDialog"), + entityDetailChart: document.querySelector("#entityDetailChart"), + settingsDialog: document.querySelector("#settingsDialog"), + adminDialog: document.querySelector("#adminDialog"), + priceChart: document.querySelector("#priceChart"), + stockPreview: document.querySelector("#stockPreview"), + stockPreviewBackdrop: document.querySelector("#stockPreviewBackdrop"), + stockPreviewChart: document.querySelector("#stockPreviewChart"), +}; + +function openModalDialog(dialog) { + applicationShell.openModalDialog(dialog); +} + +const metricAnimationFrames = new WeakMap(); +const stockPreviewCache = new Map(); +const STOCK_PREVIEW_DELAY = 380; +const STOCK_PREVIEW_CACHE_MS = 5 * 60 * 1000; +const LIVE_REFRESH_DEFAULT_MS = 10 * 1000; +let qiFieldAnimationFrame = 0; +let qiFieldSoloElement = ""; +let heavenPerformanceToken = 0; +let heavenReadingAnimation = null; +let heartHoldTimer = null; +let heartHoldTriggered = false; +let heartHoldStartedAt = 0; +let heartHoldAnimationFrame = 0; +let heartCastingBusy = false; +let heartDustAnimationFrame = 0; +let heartDustParticles = []; +let heartIncenseAnimation = null; +const heartCoinRotations = [0, 0, 0]; +let rowAnimationObserver = null; +let stockPreviewOpenTimer = null; +let stockPreviewCloseTimer = null; +let stockPreviewAbortController = null; +let stockPreviewAnchor = null; +let sentimentChartAnimationFrame = null; +let heavenResizeTimer = null; +let globalSearchTimer = null; +let watchlistSearchTimer = null; +let assistantRenderFrame = 0; + +const heartSound = { + enabled: false, + context: null, + ensure() { + if (!this.context) { + const AudioContextClass = window.AudioContext || window.webkitAudioContext; + if (!AudioContextClass) return null; + this.context = new AudioContextClass(); + } + if (this.context.state === "suspended") this.context.resume(); + return this.context; + }, + tone(frequency, duration, gain, type = "sine", delay = 0) { + if (!this.enabled) return; + const context = this.ensure(); + if (!context) return; + const start = context.currentTime + delay; + const oscillator = context.createOscillator(); + const volume = context.createGain(); + oscillator.type = type; + oscillator.frequency.value = frequency; + volume.gain.setValueAtTime(0.0001, start); + volume.gain.linearRampToValueAtTime(gain, start + 0.015); + volume.gain.exponentialRampToValueAtTime(0.0001, start + duration); + oscillator.connect(volume).connect(context.destination); + oscillator.start(start); + oscillator.stop(start + duration + 0.05); + }, + chime(frequency = 640) { + this.tone(frequency, 4.8, 0.12); + this.tone(frequency * 2.02, 3.6, 0.045); + this.tone(frequency * 3.96, 2.2, 0.018); + }, + coin(delay = 0) { + this.tone(2350 + Math.random() * 260, 0.28, 0.055, "triangle", delay); + this.tone(3250 + Math.random() * 260, 0.18, 0.025, "triangle", delay + 0.01); + }, +}; + +const HEART_WHISPERS = [ + ["应无所住,而生其心", 10, 12, 0], + ["不是风动,不是幡动,仁者心动", 89, 8, 1], + ["菩提本无树,明镜亦非台", 16, 52, 2], + ["本来无一物,何处惹尘埃", 84, 54, 3], + ["心外无物,心外无理", 22, 18, 4], + ["知行合一", 78, 30, 5], + ["此心光明,亦复何言", 90, 60, 6], +]; + +window.addEventListener("resize", () => { + clearTimeout(heavenResizeTimer); + heavenResizeTimer = setTimeout(() => { + if (state.activeView !== "heavenView") return; + if (state.heavenPanel === "fortune" && state.heavenSetup?.field) { + renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false }); + drawQiUseConnections(false); + } + if (state.heavenPanel === "heart") startHeartDust(); + }, 120); +}); + +document.addEventListener("DOMContentLoaded", initialize); + +function syncThemeControl() { + const theme = document.documentElement.dataset.theme === "dark" ? "dark" : "light"; + const button = document.querySelector("#themeToggle"); + if (!button) return; + const dark = theme === "dark"; + const label = dark ? "切换到日间模式" : "切换到夜间模式"; + button.title = label; + button.setAttribute("aria-label", label); + button.setAttribute("aria-pressed", String(dark)); + button.querySelector("i")?.setAttribute("data-lucide", dark ? "sun" : "moon"); +} + +function clearThemeTransitionEffects() { + document.querySelectorAll(".row-enter, .row-pending, .view-entering").forEach((element) => { + element.classList.remove("row-enter", "row-pending", "view-entering"); + element.style.removeProperty("--row-delay"); + }); +} + +function redrawThemeSensitiveVisuals() { + if (!elements.stockPreview.hidden && state.stockPreviewPayload) { + selectStockPreviewChart(state.stockPreviewChart); + } + if (elements.stockDialog.open) { + if (state.stockDetailChartMode === "intraday" && state.stockDetailIntraday?.points?.length) { + drawIntradayCanvas( + elements.priceChart, + state.stockDetailIntraday.points, + [], + state.stockDetailIntraday.meta?.previous_close, + ); + } else if (state.stockDetail?.prices) drawPriceChart(state.stockDetail.prices); + } + if (elements.entityDetailDialog.open) { + if (state.entityDetailChartMode === "intraday" && state.entityDetailIntraday?.points?.length) { + drawIntradayCanvas( + elements.entityDetailChart, + state.entityDetailIntraday.points, + [], + state.entityDetailIntraday.meta?.previous_close, + ); + } else if (state.entityDetailPayload?.series) { + drawEntityDetailChart(state.entityDetailPayload.series); + } + } + if (state.activeView === "sentimentCycleView" && state.sentimentHistory) { + drawSentimentTrendChart(state.sentimentHistory.rows || []); + } + if (state.activeView === "heavenView") { + if (state.heavenPanel === "fortune" && state.heavenSetup?.field) { + renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false }); + drawQiUseConnections(false); + } + if (state.heavenPanel === "heart") startHeartDust(); + } +} + +function commitTheme(normalized, persist) { + document.documentElement.dataset.theme = normalized; + document.documentElement.style.colorScheme = normalized; + if (persist) { + try { + localStorage.setItem(THEME_STORAGE_KEY, normalized); + } catch (_error) { + // The selected theme still applies for the current page when storage is unavailable. + } + } + syncThemeControl(); + refreshIcons(); + redrawThemeSensitiveVisuals(); +} + +function applyTheme(theme, persist = true) { + const normalized = theme === "dark" ? "dark" : "light"; + const root = document.documentElement; + if (root.dataset.theme === normalized) { + commitTheme(normalized, persist); + return; + } + const sequence = ++themeSwitchSequence; + activeThemeTransition?.skipTransition?.(); + clearThemeTransitionEffects(); + root.classList.add("theme-switching"); + + const update = () => commitTheme(normalized, persist); + const finish = () => { + if (sequence !== themeSwitchSequence) return; + clearThemeTransitionEffects(); + root.classList.remove("theme-switching"); + activeThemeTransition = null; + }; + const reducedMotion = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches; + if (!reducedMotion && typeof document.startViewTransition === "function") { + activeThemeTransition = document.startViewTransition(update); + activeThemeTransition.finished.then(finish, finish); + return; + } + update(); + requestAnimationFrame(() => requestAnimationFrame(finish)); +} + +function toggleTheme() { + applyTheme(document.documentElement.dataset.theme === "dark" ? "light" : "dark"); +} + +async function initialize() { + syncThemeControl(); + refreshIcons(); + applicationShell.initialize(); + elements.tradeDate.value = todayString(); + const initialUrl = new URL(window.location.href); + if (initialUrl.searchParams.has("date")) { + initialUrl.searchParams.delete("date"); + history.replaceState(null, "", initialUrl); + } + elements.tradeDate.max = todayString(); + document.querySelector("#journalDate").value = elements.tradeDate.value; + document.querySelector("#journalDate").max = todayString(); + document.querySelector("#tradeLogDate").value = elements.tradeDate.value; + document.querySelector("#tradeLogDate").max = todayString(); + document.querySelector("#backfillStart").value = todayString(); + document.querySelector("#backfillEnd").value = todayString(); + document.querySelector("#backfillStart").max = todayString(); + document.querySelector("#backfillEnd").max = todayString(); + document.querySelector("#qiObservationDate").value = elements.tradeDate.value; + document.querySelector("#qiObservationDate").max = todayString(); + document.querySelector("#accountBirthDate").max = todayString(); + document.querySelector("#alertDate").value = todayString(); + bindEvents(); + try { + const session = await apiRequest("/api/auth/me"); + if (!session.authenticated) { + if (session.registration_required) selectAuthMode("register"); + showAuthGate(); + return; + } + await applyAuthenticatedSession(session); + } catch (error) { + showAuthGate(error.message || "无法连接本地服务"); + } +} + +async function startAuthenticatedApp() { + if (state.started) return; + state.started = true; + const searchParams = new URLSearchParams(window.location.search); + const requestedHeavenPanel = searchParams.get("heaven"); + if (["trend", "fortune", "heart"].includes(requestedHeavenPanel)) { + state.heavenPanel = requestedHeavenPanel; + } + const requestedView = window.XiaobaiPages.resolve(searchParams.get("view")); + if ( + requestedView + && window.XiaobaiPages.has(requestedView) + && document.getElementById(requestedView)?.classList.contains("workspace-view") + ) { + openView(requestedView, false); + if (requestedView !== searchParams.get("view")) { + const url = new URL(window.location.href); + url.searchParams.set("view", requestedView); + history.replaceState(null, "", url); + } + } + loadDashboard(); + loadAlerts(); + if (new URLSearchParams(window.location.search).get("settings") === "1") { + setTimeout(openSettings, 0); + } +} + +function selectAuthMode(mode) { + state.authMode = mode === "register" ? "register" : "login"; + document.querySelectorAll("[data-auth-mode]").forEach((button) => { + button.classList.toggle("active", button.dataset.authMode === state.authMode); + }); + const registering = state.authMode === "register"; + document.querySelector("#authConfirmField").hidden = !registering; + document.querySelector("#authPasswordConfirm").required = registering; + document.querySelector("#authPassword").autocomplete = registering ? "new-password" : "current-password"; + document.querySelector("#authSubmitButton").textContent = registering ? "注册并进入" : "登录"; + document.querySelector("#authError").hidden = true; +} + +async function submitAuthForm(event) { + event.preventDefault(); + const username = document.querySelector("#authUsername").value.trim(); + const password = document.querySelector("#authPassword").value; + const errorElement = document.querySelector("#authError"); + if (state.authMode === "register" && password !== document.querySelector("#authPasswordConfirm").value) { + errorElement.textContent = "两次输入的密码不一致。"; + errorElement.hidden = false; + return; + } + const button = document.querySelector("#authSubmitButton"); + button.disabled = true; + try { + const session = await apiRequest(`/api/auth/${state.authMode}`, "POST", { username, password }); + document.querySelector("#authForm").reset(); + await applyAuthenticatedSession(session); + } catch (error) { + errorElement.textContent = error.message || "账号操作失败"; + errorElement.hidden = false; + } finally { + button.disabled = false; + } +} + +async function applyAuthenticatedSession(session) { + state.user = session.user; + state.csrfToken = session.csrf_token || ""; + setText("accountName", session.user?.username || "账号"); + const isAdmin = session.user?.role === "admin"; + updateAccountIdentityBadges(session.user?.membership || {}); + document.querySelector("#settingsButton").hidden = !isAdmin; + document.querySelector("#syncButton").hidden = !isAdmin; + document.querySelector("#reasonForm").hidden = !isAdmin; + document.querySelector("#sectorPhaseManager").hidden = !isAdmin; + document.querySelector("#authGate").hidden = true; + applyMembershipAccess(); + await startAuthenticatedApp(); +} + +function showAuthGate(message = "") { + state.user = null; + state.csrfToken = ""; + const gate = document.querySelector("#authGate"); + gate.hidden = false; + const errorElement = document.querySelector("#authError"); + errorElement.textContent = message; + errorElement.hidden = !message; + document.querySelector("#authUsername").focus(); +} + +async function logoutAccount() { + toggleAccountDropdown(false); + try { + await apiRequest("/api/auth/logout", "POST", {}); + } catch (error) { + showToast(error.message || "退出失败"); + return; + } + window.location.reload(); +} + +function bindEvents() { + document.querySelectorAll("[data-auth-mode]").forEach((button) => { + button.addEventListener("click", () => selectAuthMode(button.dataset.authMode)); + }); + document.querySelector("#authForm").addEventListener("submit", submitAuthForm); + document.querySelector("#refreshButton").addEventListener("click", async (event) => { + const button = event.currentTarget; + button.disabled = true; + try { + await loadDashboard(false, false, false); + } finally { + button.disabled = false; + } + }); + document.querySelector("#syncButton").addEventListener("click", startAdminRefresh); + elements.tradeDate.addEventListener("change", () => { + state.dashboardRequestSequence += 1; + state.heavenRequestSequence += 1; + state.heavenManualData = null; + document.querySelector("#qiObservationDate").value = elements.tradeDate.value; + loadDashboard(); + }); + document.querySelector("#prevDate").addEventListener("click", () => shiftDate(-1)); + document.querySelector("#nextDate").addEventListener("click", () => shiftDate(1)); + document.querySelector("#stockSearch").addEventListener("input", (event) => { + state.query = event.target.value.trim().toLowerCase(); + renderLimitTable(); + }); + document.querySelectorAll("[data-table-search]").forEach((input) => { + input.addEventListener("input", () => { + const query = input.value.trim().toLowerCase(); + const body = document.querySelector(`#${CSS.escape(input.dataset.tableSearch)}`); + body?.querySelectorAll("tr").forEach((row) => { + row.hidden = Boolean(query) && !row.textContent.toLowerCase().includes(query); + }); + }); + }); + + document.querySelectorAll("[data-filter]").forEach((button) => { + button.addEventListener("click", () => { + document.querySelectorAll("[data-filter]").forEach((item) => item.classList.remove("active")); + button.classList.add("active"); + state.filter = button.dataset.filter; + renderLimitTable(); + }); + }); + + document.querySelector("#globalSearchButton").addEventListener("click", openGlobalSearch); + document.querySelector("#themeToggle").addEventListener("click", toggleTheme); + document.querySelector("#alertButton").addEventListener("click", openAlerts); + document.querySelector("#assistantButton").addEventListener("click", openReviewAssistant); + document.querySelector("#closeAssistantDialog").addEventListener("click", () => elements.assistantDialog.close()); + document.querySelector("#assistantForm").addEventListener("submit", sendAssistantQuestion); + document.querySelector("#stopAssistant").addEventListener("click", stopAssistantResponse); + document.querySelector("#clearAssistantMessages").addEventListener("click", clearAssistantConversation); + document.querySelectorAll("[data-assistant-prompt]").forEach((button) => { + button.addEventListener("click", () => useAssistantPrompt(button.dataset.assistantPrompt)); + }); + document.querySelector("#closeAlertsDialog").addEventListener("click", () => elements.alertsDialog.close()); + document.querySelector("#alertForm").addEventListener("submit", saveAlert); + document.querySelector("#markAllAlertsRead").addEventListener("click", markAllAlertsRead); + document.querySelector("#alertList").addEventListener("click", handleAlertAction); + document.querySelectorAll("[data-alert-filter]").forEach((button) => { + button.addEventListener("click", () => selectAlertFilter(button.dataset.alertFilter)); + }); + document.querySelector("#closeGlobalSearch").addEventListener("click", closeGlobalSearch); + document.querySelector("#closeEntityDetail").addEventListener("click", () => elements.entityDetailDialog.close()); + document.querySelectorAll("[data-entity-detail-chart]").forEach((button) => { + button.addEventListener("click", () => selectEntityDetailChart(button.dataset.entityDetailChart)); + }); + elements.globalSearchDialog.addEventListener("click", (event) => { + if (event.target === elements.globalSearchDialog) closeGlobalSearch(); + }); + elements.globalSearchInput.addEventListener("input", scheduleGlobalSearch); + elements.globalSearchInput.addEventListener("keydown", handleGlobalSearchInputKeydown); + elements.globalSearchResults.addEventListener("click", (event) => { + const result = event.target.closest("[data-search-result-index]"); + if (result) openGlobalSearchResult(number(result.dataset.searchResultIndex)); + }); + document.addEventListener("click", (event) => { + if (!event.target.closest(".account-menu-shell")) toggleAccountDropdown(false); + }); + window.addEventListener("keydown", handleGlobalSearchShortcut); + document.addEventListener("keydown", (event) => { + if (event.key === "Escape") { + toggleAccountDropdown(false, true); + toggleMentorDirectory(false); + } + handleAccountMenuKeydown(event); + }); + window.addEventListener("resize", () => { + if (window.innerWidth > 720) toggleMentorDirectory(false); + if (!elements.stockPreview.hidden) closeStockPreview(); + if (state.activeView === "dragonView") layoutDragonCards(); + }); + document.querySelectorAll("[data-open-account]").forEach((button) => { + button.addEventListener("click", () => openSettings("membership")); + }); + document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => { + header.addEventListener("click", () => changeSort(header.dataset.sort)); + }); + document.querySelector("#brokenSearch").addEventListener("input", (event) => { + state.brokenQuery = event.target.value.trim().toLowerCase(); + renderBrokenTable(state.dashboard?.broken || []); + }); + document.querySelectorAll("#brokenTable th[data-broken-sort]").forEach((header) => { + header.addEventListener("click", () => changeBrokenSort(header.dataset.brokenSort)); + }); + document.querySelector("#downSearch").addEventListener("input", (event) => { + state.downQuery = event.target.value.trim().toLowerCase(); + renderDownTable(state.dashboard?.down_limits || []); + }); + document.querySelectorAll("#downTable th[data-down-sort]").forEach((header) => { + header.addEventListener("click", () => changeDownSort(header.dataset.downSort)); + }); + document.querySelector("#yesterdaySearch").addEventListener("input", (event) => { + state.yesterdayQuery = event.target.value.trim().toLowerCase(); + renderYesterdayTable(state.dashboard?.yesterday_limits || []); + }); + document.querySelectorAll("[data-yesterday-filter]").forEach((button) => { + button.addEventListener("click", () => { + state.yesterdayFilter = button.dataset.yesterdayFilter; + renderYesterdayTable(state.dashboard?.yesterday_limits || []); + }); + }); + document.querySelectorAll("#yesterdayTable th[data-yesterday-sort]").forEach((header) => { + header.addEventListener("click", () => changeYesterdaySort(header.dataset.yesterdaySort)); + }); + document.querySelectorAll("[data-ladder-sort]").forEach((button) => { + button.addEventListener("click", () => { + state.ladderSortMode = button.dataset.ladderSort === "open" ? "open" : "time"; + document.querySelectorAll("[data-ladder-sort]").forEach((item) => { + const active = item === button; + item.classList.toggle("active", active); + item.setAttribute("aria-pressed", String(active)); + }); + renderLadderBoard(state.dashboard?.ladders || []); + }); + }); + + document.querySelector("#exportButton").addEventListener("click", exportStocks); + document.querySelector("#brokenExportButton").addEventListener("click", exportBroken); + document.querySelector("#downExportButton").addEventListener("click", exportDown); + document.querySelector("#yesterdayExportButton").addEventListener("click", exportYesterday); + document.querySelector("#ladderExportButton").addEventListener("click", exportLadder); + document.querySelector("#rotationExportButton").addEventListener("click", exportRotation); + document.querySelectorAll("[data-rotation-order]").forEach((button) => { + button.addEventListener("click", () => { + state.rotationOrder = button.dataset.rotationOrder === "latest" ? "latest" : "oldest"; + localStorage.setItem("xiaobaiRotationOrder", state.rotationOrder); + renderRotationHistory(); + }); + }); + document.querySelector("#sentimentExportButton").addEventListener("click", exportSentimentHistory); + document.querySelectorAll("[data-sentiment-range]").forEach((button) => { + button.addEventListener("click", () => { + state.sentimentRange = number(button.dataset.sentimentRange) || 20; + document.querySelectorAll("[data-sentiment-range]").forEach((item) => { + item.classList.toggle("active", item === button); + }); + loadSentimentHistory(true); + }); + }); + document.querySelector("#settingsButton").addEventListener("click", () => openAdminSettings()); + document.querySelector("#accountButton").addEventListener("click", (event) => { + event.stopPropagation(); + toggleAccountDropdown(); + }); + document.querySelector("#accountVipBadge").addEventListener("click", () => openSettings("membership")); + document.querySelectorAll("[data-account-panel]").forEach((button) => { + button.addEventListener("click", () => openSettings(button.dataset.accountPanel)); + }); + document.querySelector("#switchAccountMenuButton").addEventListener("click", switchAccount); + document.querySelector("#logoutMenuButton").addEventListener("click", logoutAccount); + document.querySelector("#closeSettingsDialog").addEventListener("click", () => elements.settingsDialog.close()); + document.querySelector("#closeAdminDialog").addEventListener("click", () => elements.adminDialog.close()); + document.querySelector("#closeStockDialog").addEventListener("click", () => elements.stockDialog.close()); + document.querySelectorAll("[data-stock-detail-chart]").forEach((button) => { + button.addEventListener("click", () => selectStockDetailChart(button.dataset.stockDetailChart)); + }); + document.querySelector("#closeStockPreview").addEventListener("click", closeStockPreview); + elements.stockPreviewBackdrop.addEventListener("click", closeStockPreview); + document.querySelector("#openStockDetailFromPreview").addEventListener("click", openStockDetailFromPreview); + document.querySelectorAll("[data-preview-chart]").forEach((button) => { + button.addEventListener("click", () => selectStockPreviewChart(button.dataset.previewChart)); + }); + elements.stockPreview.addEventListener("pointerenter", cancelStockPreviewClose); + elements.stockPreview.addEventListener("pointerleave", scheduleStockPreviewClose); + document.addEventListener("pointerover", handleStockPreviewPointerOver); + document.addEventListener("pointerout", handleStockPreviewPointerOut); + document.addEventListener("focusin", handleStockPreviewFocus); + document.addEventListener("focusout", handleStockPreviewFocusOut); + document.addEventListener("click", handleMobileStockPreviewClick, true); + document.addEventListener("keydown", handleStockPreviewKeydown); + document.addEventListener("scroll", repositionStockPreview, true); + document.querySelector("#auctionRefreshButton").addEventListener("click", () => loadAuctionCenter(true)); + document.querySelector("#auctionExportButton").addEventListener("click", exportAuctionRows); + document.querySelector("#auctionSearch").addEventListener("input", (event) => { + state.auctionQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderAuctionTable(); + }); + document.querySelectorAll("[data-auction-dataset]").forEach((button) => { + button.addEventListener("click", () => { + state.auctionDataset = button.dataset.auctionDataset || "focus"; + state.auctionFilter = "all"; + state.auctionSortKey = state.auctionDataset === "onePrice" ? "amount_million" : "attention_score"; + state.auctionSortDirection = "desc"; + document.querySelectorAll("[data-auction-dataset]").forEach((item) => { + const active = item === button; + item.classList.toggle("active", active); + item.setAttribute("aria-selected", String(active)); + }); + document.querySelectorAll("[data-auction-filter]").forEach((item) => item.classList.toggle("active", item.dataset.auctionFilter === "all")); + renderAuctionTable(); + }); + }); + document.querySelectorAll("[data-auction-filter]").forEach((button) => { + button.addEventListener("click", () => { + state.auctionFilter = button.dataset.auctionFilter || "all"; + document.querySelectorAll("[data-auction-filter]").forEach((item) => item.classList.toggle("active", item === button)); + renderAuctionTable(); + }); + }); + document.querySelector("#auctionTable").addEventListener("click", (event) => { + const header = event.target.closest("th[data-auction-sort]"); + if (!header) return; + const key = header.dataset.auctionSort; + if (state.auctionSortKey === key) state.auctionSortDirection = state.auctionSortDirection === "asc" ? "desc" : "asc"; + else { + state.auctionSortKey = key; + state.auctionSortDirection = "desc"; + } + renderAuctionTable(); + }); + document.querySelector("#openStrategyDrawerButton").addEventListener("click", openCustomStrategyDrawer); + document.querySelector("#closeStrategyDrawerButton").addEventListener("click", () => document.querySelector("#strategyDrawer").close()); + document.querySelector("#strategyDrawer").addEventListener("click", (event) => { + if (event.target === event.currentTarget) event.currentTarget.close(); + }); + document.querySelector("#themeRefreshButton").addEventListener("click", () => loadThemeLibrary(true)); + document.querySelector("#themeSearch").addEventListener("input", (event) => { + state.themeQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderThemeDirectory(); + }); + document.querySelector("#themeDirectory").addEventListener("click", (event) => { + const button = event.target.closest("[data-theme-code]"); + if (button) selectTheme(button.dataset.themeCode); + }); + document.querySelector("#popularityRefreshButton").addEventListener("click", () => loadPopularity(true)); + document.querySelector("#popularitySearch").addEventListener("input", (event) => { + state.popularityQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderPopularityTable(); + }); + document.querySelectorAll("[data-popularity-source]").forEach((button) => { + button.addEventListener("click", () => { + state.popularitySource = button.dataset.popularitySource || "combined"; + document.querySelectorAll("[data-popularity-source]").forEach((item) => { + const active = item === button; + item.classList.toggle("active", active); + item.setAttribute("aria-selected", String(active)); + }); + renderPopularityTable(); + }); + }); + document.querySelector("#dragonRefreshButton").addEventListener("click", () => { + if (state.dragonViewMode === "profiles") loadHotMoneyProfiles(true); + else loadDragonTiger(true); + }); + document.querySelector("#dragonEmptyRefreshButton").addEventListener("click", () => loadDragonTiger(true)); + document.querySelector("#dragonPreviousButton").addEventListener("click", () => shiftDate(-1)); + document.querySelector("#dragonExportButton").addEventListener("click", () => { + if (state.dragonViewMode === "profiles") exportHotMoneyProfiles(); + else exportDragonTiger(); + }); + document.querySelectorAll("[data-dragon-view-mode]").forEach((button) => { + button.addEventListener("click", () => selectDragonViewMode(button.dataset.dragonViewMode)); + }); + document.querySelector("#dragonSearch").addEventListener("input", (event) => { + state.dragonQuery = event.target.value.trim().toLowerCase(); + renderDragonTraderList(); + }); + document.querySelectorAll("[data-dragon-filter]").forEach((button) => { + button.addEventListener("click", () => { + state.dragonFilter = button.dataset.dragonFilter; + document.querySelectorAll("[data-dragon-filter]").forEach((item) => { + item.classList.toggle("active", item === button); + }); + renderDragonTraderList(); + }); + }); + document.querySelector("#hotMoneyProfileSearch").addEventListener("input", (event) => { + state.hotMoneyProfileQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderHotMoneyProfiles(); + }); + document.querySelector("#hotMoneyProfileList").addEventListener("click", (event) => { + const button = event.target.closest("[data-hot-money-profile]"); + if (!button) return; + state.selectedHotMoneyProfileId = button.dataset.hotMoneyProfile; + renderHotMoneyProfiles(); + }); + document.querySelector("#journalForm").addEventListener("submit", saveJournal); + document.querySelector("#journalDate").addEventListener("change", populateJournalForm); + document.querySelector("#openWatchlistDialog").addEventListener("click", () => openWatchlistDialog()); + document.querySelector("#closeWatchlistDialog").addEventListener("click", closeWatchlistDialog); + document.querySelector("#cancelWatchlistEdit").addEventListener("click", closeWatchlistDialog); + document.querySelector("#changeWatchlistSelection").addEventListener("click", clearWatchlistSelection); + document.querySelector("#watchlistSearchInput").addEventListener("input", scheduleWatchlistSearch); + document.querySelector("#watchlistForm").addEventListener("submit", saveWatchlistFromDialog); + document.querySelector("#watchlistSearchResults").addEventListener("click", handleWatchlistSearchResult); + document.querySelector("#reviewHistoryToggle").addEventListener("click", (event) => { + const panel = document.querySelector("#reviewHistoryPanel"); + const expanded = event.currentTarget.getAttribute("aria-expanded") === "true"; + event.currentTarget.setAttribute("aria-expanded", String(!expanded)); + event.currentTarget.querySelector("span").textContent = expanded ? "历史复盘" : "收起历史"; + panel.hidden = expanded; + if (!expanded) panel.scrollIntoView({ behavior: "smooth", block: "nearest" }); + }); + document.querySelector("#openTradeLogDialog").addEventListener("click", openTradeLogDialog); + document.querySelector("#closeTradeLogDialog").addEventListener("click", closeTradeLogDialog); + document.querySelector("#tradeLogForm").addEventListener("submit", saveTradeLog); + document.querySelector("#cancelTradeEdit").addEventListener("click", closeTradeLogDialog); + elements.tradeLogDialog.addEventListener("close", resetTradeLogForm); + document.querySelector("#tradeLogTableBody").addEventListener("click", handleTradeLogAction); + document.querySelector("#stockNoteForm").addEventListener("submit", saveStockNote); + document.querySelector("#watchStockButton").addEventListener("click", toggleActiveWatchlist); + document.querySelector("#stockHeavenButton").addEventListener("click", openActiveStockInHeaven); + document.querySelector("#stockReminderButton").addEventListener("click", openStockReminder); + document.querySelector("#reasonForm").addEventListener("submit", saveReasonOverride); + document.querySelector("#backfillButton").addEventListener("click", backfillData); + document.querySelector("#openScreenerTrackingButton").addEventListener("click", async () => { + await loadScreenerTracking(true); + openView("screenerTrackingView"); + }); + document.querySelector("#closeScreenerTrackingButton").addEventListener("click", () => openView("screenerView")); + document.querySelector("#refreshTrackingButton").addEventListener("click", refreshScreenerTracking); + document.querySelector("#trackingTableBody").addEventListener("click", handleTrackingTableAction); + document.querySelectorAll("[data-screener-mobile-view]").forEach((button) => { + button.addEventListener("click", () => selectScreenerMobileView(button.dataset.screenerMobileView)); + }); + document.querySelector("#compileStrategyButton").addEventListener("click", compileStrategy); + document.querySelector("#saveStrategyButton").addEventListener("click", saveCurrentStrategy); + document.querySelector("#deleteStrategyButton").addEventListener("click", deleteCurrentStrategy); + document.querySelector("#screenerExportButton").addEventListener("click", exportScreenerResults); + document.querySelector("#runBacktestToggle").addEventListener("change", updateBacktestTaskStatus); + document.querySelectorAll("[data-screener-mode]").forEach((button) => { + button.addEventListener("click", () => selectScreenerMode(button.dataset.screenerMode)); + }); + document.querySelector("#curatedStrategyList").addEventListener("click", (event) => { + if (event.target.closest("button")) return; + const card = event.target.closest("[data-curated-strategy]"); + if (!card) return; + state.selectedCuratedStrategyId = number(card.dataset.curatedStrategy); + renderCuratedStrategyLibrary(); + renderScreenerResult(); + }); + document.querySelector("#curatedStrategySearch").addEventListener("input", (event) => { + state.curatedQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderCuratedStrategyLibrary(); + }); + document.querySelector("#curatedCategoryFilter").addEventListener("change", (event) => { + state.curatedCategory = event.target.value; + renderCuratedStrategyLibrary(); + }); + document.querySelector("#curatedSchoolFilters").addEventListener("click", (event) => { + const button = event.target.closest("[data-curated-school]"); + if (!button) return; + state.curatedSchool = button.dataset.curatedSchool; + renderCuratedStrategyLibrary(); + }); + document.querySelectorAll("[data-curated-view]").forEach((button) => { + button.addEventListener("click", () => { + state.curatedViewMode = button.dataset.curatedView === "grid" ? "grid" : "list"; + localStorage.setItem("xiaobaiCuratedViewMode", state.curatedViewMode); + renderCuratedStrategyLibrary(); + }); + }); + document.querySelector("#quantResetButton").addEventListener("click", resetQuantBuilder); + document.querySelector("#addQuantFilterButton").addEventListener("click", () => addQuantFilter()); + document.querySelector("#addQuantScoreButton").addEventListener("click", () => addQuantScore()); + document.querySelector("#quantFilterRows").addEventListener("input", handleQuantBuilderInput); + document.querySelector("#quantFilterRows").addEventListener("change", handleQuantBuilderInput); + document.querySelector("#quantFilterRows").addEventListener("click", handleQuantBuilderClick); + document.querySelector("#quantScoreRows").addEventListener("input", handleQuantBuilderInput); + document.querySelector("#quantScoreRows").addEventListener("change", handleQuantBuilderInput); + document.querySelector("#quantScoreRows").addEventListener("click", handleQuantBuilderClick); + ["quantListedDays", "quantLimit", "quantMinScore", "quantExcludeSt"].forEach((id) => { + document.querySelector(`#${id}`).addEventListener("input", renderQuantSummary); + document.querySelector(`#${id}`).addEventListener("change", renderQuantSummary); + }); + document.querySelector("#quantRunButton").addEventListener("click", runQuantStrategy); + document.querySelector("#quantSaveButton").addEventListener("click", saveQuantAsStrategy); + document.querySelector("#quantBacktestToggle").addEventListener("change", updateBacktestTaskStatus); + document.querySelector("#mentorChatForm").addEventListener("submit", sendMentorQuestion); + document.querySelector("#clearMentorChatButton").addEventListener("click", clearMentorConversation); + document.querySelector("#mentorDirectoryToggle").addEventListener("click", () => { + toggleMentorDirectory(!state.mentorDirectoryOpen); + }); + document.querySelector("#closeMentorDirectory").addEventListener("click", () => toggleMentorDirectory(false)); + document.querySelector("#mentorDirectoryBackdrop").addEventListener("click", () => toggleMentorDirectory(false)); + document.querySelector("#mentorSortToggle").addEventListener("click", toggleMentorSortMode); + document.querySelector("#mentorSearchInput").addEventListener("input", (event) => { + state.mentorQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); + renderMentorDirectory(); + }); + document.querySelectorAll("[data-mentor-grade]").forEach((button) => { + button.addEventListener("click", () => { + state.mentorGrade = button.dataset.mentorGrade || "all"; + document.querySelectorAll("[data-mentor-grade]").forEach((item) => { + item.classList.toggle("active", item === button); + }); + renderMentorDirectory(); + }); + }); + document.querySelectorAll("[data-mentor-prompt]").forEach((button) => { + button.addEventListener("click", () => useMentorQuickPrompt(button.dataset.mentorPrompt)); + }); + document.querySelectorAll("[data-heaven-panel]").forEach((button) => { + button.addEventListener("click", () => selectHeavenPanel(button.dataset.heavenPanel, true)); + }); + document.querySelector("#loadHeavenSelectionButton").addEventListener("click", loadHeavenSelection); + document.querySelector("#heavenCalibrationForm").addEventListener("submit", applyHeavenCalibration); + document.querySelector("#resetHeavenCalibrationButton").addEventListener("click", resetHeavenCalibration); + document.querySelector("#heavenStockInput").addEventListener("keydown", (event) => { + if (event.key === "Enter") { + event.preventDefault(); + loadHeavenSelection(); + } + }); + document.querySelector("#interpretTrendButton").addEventListener("click", () => interpretHeaven("trend")); + document.querySelector("#interpretFortuneButton").addEventListener("click", () => interpretHeaven("fortune")); + document.querySelector("#historyTrendButton").addEventListener("click", () => openHeavenHistory("trend")); + document.querySelector("#historyFortuneButton").addEventListener("click", () => openHeavenHistory("fortune")); + document.querySelector("#qiObservationDate").addEventListener("change", () => { + state.personalField = null; + state.heavenManualData = null; + state.heavenInterpretations.fortune = ""; + loadHeavenSetup( + true, + "", + document.querySelector("#heavenStockInput").value.trim(), + ); + }); + document.querySelector("#openPersonalSettingsButton").addEventListener("click", () => openSettings("profile")); + document.querySelector("#accountBirthForm").addEventListener("submit", saveAccountBirthProfile); + document.querySelector("#deleteBirthProfileButton").addEventListener("click", deleteAccountBirthProfile); + document.querySelector("#passwordForm").addEventListener("submit", changeAccountPassword); + document.querySelector("#sectorPhaseForm").addEventListener("submit", saveSectorPhaseOverride); + document.querySelector("#startBreathingButton").addEventListener("click", startHeartBreathing); + document.querySelector("#beginCastingButton").addEventListener("click", beginHeartCasting); + document.querySelector("#heartSoundToggle").addEventListener("click", toggleHeartSound); + document.querySelector("#historyHeartButton").addEventListener("click", () => openHeavenHistory("heart")); + initializeHeartCoinHold(); + initializeHeartLineInspection(); + document.querySelector("#interpretHeartButton").addEventListener("click", () => interpretHeaven("heart")); + document.querySelector("#viewHeartReadingButton").addEventListener("click", () => openHeavenReading("heart")); + document.querySelector("#restartHeartButton").addEventListener("click", resetHeartRitual); + document.querySelector("#closeHeavenReadingDialog").addEventListener("click", () => elements.heavenReadingDialog.close()); + elements.heavenReadingDialog.addEventListener("close", stopHeavenReadingAnimation); + document.querySelectorAll("[data-heaven-reading-tab]").forEach((button) => { + button.addEventListener("click", () => selectHeavenReadingTab(button.dataset.heavenReadingTab)); + }); + document.querySelector("#heavenReadingHistoryList").addEventListener("click", handleHeavenHistorySelection); + document.querySelector("#heavenReadingHistoryDetail").addEventListener("click", handleHeavenHistoryAction); + document.querySelectorAll("[data-heart-return]").forEach((button) => { + button.addEventListener("click", resetHeartRitual); + }); + document.querySelector("#adminSectionSelect").addEventListener("change", (event) => selectAdminPanel(event.target.value)); + document.querySelector("#systemMarketForm").addEventListener("submit", saveMarketSettings); + document.querySelector("#systemModelsForm").addEventListener("submit", saveModelPool); + document.querySelector("#membershipSettingsForm").addEventListener("submit", saveMembershipSettings); + document.querySelector("#addPlatformModel").addEventListener("click", addPlatformModel); + document.querySelector("#adminRefreshButton").addEventListener("click", startAdminRefresh); + window.addEventListener("resize", redrawThemeSensitiveVisuals); + initializeAutoTableSorting(); +} + +async function loadDashboard(force = false, background = false, showOverlay = true) { + const requestedDate = elements.tradeDate.value; + if (state.dashboardLoading && state.dashboardRequestDate === requestedDate) return; + state.dashboardLoading = true; + state.dashboardRequestDate = requestedDate; + const requestSequence = ++state.dashboardRequestSequence; + if (force) stockPreviewCache.clear(); + if (!background && showOverlay) { + setLoading(true, "正在加载市场数据"); + setStatus("正在加载市场数据"); + } else if (!background) { + setStatus("正在刷新行情"); + } + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + if (force) query.set("force", "1"); + const payload = await apiRequest(`/api/dashboard?${query}`); + if ( + requestSequence !== state.dashboardRequestSequence + || requestedDate !== elements.tradeDate.value + ) return; + applyDashboard(payload, background); + } catch (error) { + if (background) { + setStatus("实时刷新暂时中断,正在等待重试"); + } else { + showToast(error.message || "无法连接本地服务"); + setStatus("加载失败"); + } + } finally { + if (requestSequence === state.dashboardRequestSequence) { + state.dashboardLoading = false; + state.dashboardRequestDate = ""; + if (!background && showOverlay) setLoading(false); + updateDateButtons(); + } + } +} + +async function startAdminRefresh() { + const buttons = [document.querySelector("#syncButton"), document.querySelector("#adminRefreshButton")].filter(Boolean); + buttons.forEach((button) => { button.disabled = true; }); + try { + const payload = await apiRequest("/api/admin/refresh", "POST", { trade_date: elements.tradeDate.value }); + showToast(payload.message || "后台刷新已提交"); + setStatus("后台刷新运行中,当前页面保持不变"); + } catch (error) { + showToast(error.message || "后台刷新启动失败"); + } finally { + buttons.forEach((button) => { button.disabled = false; }); + } +} + +function applyDashboard(payload, background = false) { + state.dashboard = payload; + const selectedDate = payload.meta.requested_date || payload.meta.trade_date; + elements.tradeDate.value = selectedDate; + document.querySelector("#qiObservationDate").value = selectedDate; + document.querySelector("#journalDate").value = selectedDate; + renderDashboard(); + setStatus(`${dashboardSourceLabel(payload.meta)} · 数据已更新`); + if (!background) { + if (state.activeView === "dragonView") loadDragonTiger(); + if (state.activeView === "screenerView") loadScreenerSetup(); + if (state.activeView === "screenerTrackingView") loadScreenerTracking(true); + if (state.activeView === "mentorView") loadMentorSetup(true); + if (state.activeView === "heavenView") loadHeavenSetup(true); + if (state.activeView === "sentimentCycleView") loadSentimentHistory(true); + if (state.activeView === "rotationView") loadRotationHistory(true); + if (state.activeView === "auctionView") loadAuctionCenter(true); + if (state.activeView === "themeLibraryView") loadThemeLibrary(true); + if (state.activeView === "popularityView") loadPopularity(true); + } + const requestedStock = new URLSearchParams(window.location.search).get("stock"); + if (!state.initialStockOpened && /^\d{6}$/.test(requestedStock || "")) { + state.initialStockOpened = true; + openStock(requestedStock); + } +} + +function dashboardSourceLabel(meta = {}) { + if (meta.realtime && !["closed", "after_hours"].includes(String(meta.market_status || ""))) return "盘中行情"; + if (meta.carried_forward) return "最近收盘行情"; + if (meta.market_status === "historical") return "历史行情"; + return "收盘行情"; +} + +function renderDashboard() { + const { meta, overview, ladders, sectors } = state.dashboard; + animateMetric("tapeUp", overview.up_count, (value) => Math.round(value)); + animateMetric("tapeDown", overview.down_count, (value) => Math.round(value)); + setText("tapeLimit", `${overview.limit_up_count} / 跌停 ${overview.limit_down_count}`); + animateMetric("tapeAmount", overview.amount_billion, (value) => `${formatNumber(value, 1)} 亿`); + animateMetric("limitUpMetric", overview.limit_up_count, (value) => `${Math.round(value)} 家`); + animateMetric("limitDownMetric", overview.limit_down_count, (value) => `${Math.round(value)} 家`); + animateMetric("brokenMetric", overview.broken_count, (value) => `${Math.round(value)} 家`); + animateMetric("sealRateMetric", overview.seal_rate, (value) => `${formatNumber(value, 1)}%`); + animateMetric("amountMetric", overview.amount_billion, (value) => `${formatNumber(value, 1)} 亿`); + setText("dataDateMetric", dashboardDataTimestamp(meta)); + animateMetric("sentimentScore", overview.sentiment_score, (value) => Math.round(value)); + setText("sentimentText", sentimentLabel(overview.sentiment_score)); + updateSentimentGauge(overview.sentiment_score); + setText("updatedAt", `${dashboardSourceLabel(meta)} · 更新 ${formatTimestamp(meta.updated_at)}`); + + renderLimitTable(); + renderLadderMini(ladders || []); + renderSectorMini(sectors || []); + renderBrokenTable(state.dashboard.broken || []); + renderDownTable(state.dashboard.down_limits || []); + renderYesterdayTable(state.dashboard.yesterday_limits || []); + renderPerformance(state.dashboard.limit_performance || []); + renderLadderBoard(ladders || []); + renderRotationMembers(); +} + +/* PRESERVATION-SOURCE-END app.js:1-1206 */ +/* PRESERVATION-SOURCE-BEGIN app.js:3471-3489 */ +async function backfillData() { + const button = document.querySelector("#backfillButton"); + button.disabled = true; + setLoading(true, "正在回补历史交易日"); + try { + const payload = await apiRequest("/api/backfill", "POST", { + start_date: document.querySelector("#backfillStart").value, + end_date: document.querySelector("#backfillEnd").value, + }); + showToast(`历史回补完成,共处理 ${payload.results.length} 个工作日`); + await openAdminSettings(true); + } catch (error) { + showToast(error.message); + } finally { + setLoading(false); + button.disabled = false; + } +} + +/* PRESERVATION-SOURCE-END app.js:3471-3489 */ +/* PRESERVATION-SOURCE-BEGIN app.js:8427-8904 */ +function hasMemberAccess() { + return state.user?.role === "admin" || Boolean(state.user?.membership?.active); +} + +function updateAccountIdentityBadges(membership = {}) { + const isAdmin = state.user?.role === "admin" || Boolean(membership.is_admin); + const subscribed = Boolean(membership.subscribed); + document.querySelector("#accountAdminBadge").hidden = !isAdmin; + const vipBadge = document.querySelector("#accountVipBadge"); + vipBadge.hidden = false; + vipBadge.classList.toggle("is-nonmember", !subscribed); + setText("accountVipLabel", subscribed ? "会员" : "非会员"); + vipBadge.title = subscribed ? "查看会员状态" : "查看会员权益"; +} + +function applyMembershipAccess() { + const unlocked = hasMemberAccess(); + document.querySelectorAll(".member-feature-view").forEach((view) => { + view.classList.toggle("member-locked", !unlocked); + const gate = view.querySelector(".member-gate"); + if (gate) gate.hidden = unlocked; + view.querySelectorAll("button, input, textarea, select").forEach((control) => { + if (control.closest(".member-gate") || control.hasAttribute("data-member-navigation")) return; + control.disabled = !unlocked; + }); + }); + const assistantButton = document.querySelector("#assistantButton"); + assistantButton.classList.toggle("member-locked-control", !unlocked); + assistantButton.title = unlocked ? "复盘助手" : "复盘助手(会员可用)"; + updateAssistantControls(); +} + +function openView(viewId, updateHash = true) { + if (!applicationShell.page(viewId) || !pageModules.has(viewId)) return; + const previousView = state.activeView; + pageModules.beforeMount(viewId, previousView); + if (!applicationShell.mount(viewId, { updateUrl: updateHash })) return; + pageModules.afterMount(viewId, previousView); +} + +function initializeAutoTableSorting() { + markAutoSortableHeaders(document); + document.addEventListener("click", (event) => { + const header = event.target.closest?.("th[data-auto-sort]"); + if (!header || header.closest("#limitTable")) return; + const table = header.closest("table"); + const body = table?.tBodies?.[0]; + if (!body || body.rows.length < 2) return; + const direction = header.classList.contains("sort-asc") ? "desc" : "asc"; + table.querySelectorAll("th.sort-asc, th.sort-desc").forEach((item) => { + item.classList.remove("sort-asc", "sort-desc", "sorted"); + item.removeAttribute("aria-sort"); + const arrow = item.querySelector(".arr"); + if (arrow) arrow.textContent = "↕"; + }); + header.classList.add(`sort-${direction}`, "sorted"); + header.setAttribute("aria-sort", direction === "asc" ? "ascending" : "descending"); + const activeArrow = header.querySelector(".arr"); + if (activeArrow) activeArrow.textContent = direction === "asc" ? "▲" : "▼"; + const columnIndex = header.cellIndex; + const rows = [...body.rows].map((row, index) => ({ row, index })); + rows.sort((left, right) => { + const leftValue = autoSortValue(left.row.cells[columnIndex]); + const rightValue = autoSortValue(right.row.cells[columnIndex]); + let result; + if (leftValue.kind === "number" && rightValue.kind === "number") result = leftValue.value - rightValue.value; + else result = String(leftValue.value).localeCompare(String(rightValue.value), "zh-CN", { numeric: true, sensitivity: "base" }); + if (result === 0) result = left.index - right.index; + return direction === "asc" ? result : -result; + }); + rows.forEach(({ row }) => body.appendChild(row)); + const firstHeader = [...header.parentElement.cells][0]?.textContent.trim(); + if (["#", "排名"].includes(firstHeader)) { + [...body.rows].forEach((row, index) => { + if (row.cells[0]) row.cells[0].textContent = String(index + 1); + }); + } + }); +} + +function markAutoSortableHeaders(root) { + root.querySelectorAll?.(".data-table:not(#limitTable) thead th").forEach((header) => { + if (header.closest("#brokenTable, #downTable, #yesterdayTable, #rotationTable")) return; + if (number(header.colSpan) > 1) return; + const label = header.textContent.trim(); + if (!label || ["#", "操作"].includes(label)) return; + header.dataset.autoSort = "true"; + header.classList.add("sortable"); + if (!header.querySelector(".arr")) header.insertAdjacentHTML("beforeend", ''); + header.title = `${label}:点击排序`; + }); +} + +function autoSortValue(cell) { + const text = String(cell?.dataset?.sortValue || cell?.textContent || "").trim(); + if (!text || text === "--" || text.includes("样本不足")) return { kind: "text", value: "\uffff" }; + const boardMatch = text.match(/(\d+)\s*板/); + if (boardMatch) return { kind: "number", value: Number(boardMatch[1]) }; + const normalized = text.replaceAll(",", "").replace(/[+%]/g, ""); + const numericMatch = normalized.match(/^-?\d+(?:\.\d+)?/); + if (numericMatch) { + let value = Number(numericMatch[0]); + if (text.includes("亿")) value *= 10000; + return { kind: "number", value }; + } + return { kind: "text", value: text }; +} + +function changeSort(key) { + if (state.sortKey === key) state.sortDirection = state.sortDirection === "asc" ? "desc" : "asc"; + else { + state.sortKey = key; + state.sortDirection = ["name", "code", "sector", "first_time", "last_time"].includes(key) ? "asc" : "desc"; + } + renderLimitTable(); +} + +function compareRows(left, right) { + const leftValue = left[state.sortKey] ?? ""; + const rightValue = right[state.sortKey] ?? ""; + let result = typeof leftValue === "number" || typeof rightValue === "number" + ? number(leftValue) - number(rightValue) + : String(leftValue).localeCompare(String(rightValue), "zh-CN", { numeric: true }); + if (result === 0 && state.sortKey !== "first_time") result = String(left.first_time || "").localeCompare(String(right.first_time || "")); + return state.sortDirection === "asc" ? result : -result; +} + +function updateSortHeaders() { + document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => { + header.classList.remove("sort-asc", "sort-desc", "sorted"); + const active = header.dataset.sort === state.sortKey; + if (active) header.classList.add(state.sortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); + const arrow = header.querySelector(".arr"); + if (arrow) arrow.textContent = active ? (state.sortDirection === "asc" ? "▲" : "▼") : "↕"; + }); +} + +function shiftDate(delta) { + const current = parseLocalDate(elements.tradeDate.value); + current.setDate(current.getDate() + delta); + const next = localDateString(current); + if (next > todayString()) return; + elements.tradeDate.value = next; + state.heavenManualData = null; + document.querySelector("#qiObservationDate").value = next; + loadDashboard(); +} + +function updateDateButtons() { + document.querySelector("#nextDate").disabled = elements.tradeDate.value >= todayString(); +} + +function selectAccountPanel(panel) { + const selected = ["profile", "membership", "password"].includes(panel) ? panel : "profile"; + const titles = { profile: "个人资料", membership: "会员状态", password: "修改密码" }; + setText("accountDialogTitle", titles[selected]); + document.querySelectorAll("[data-account-panel-content]").forEach((section) => { + section.hidden = section.dataset.accountPanelContent !== selected; + }); + document.querySelector("#connectionStatus").hidden = selected !== "membership"; + return selected; +} + +async function openSettings(panel = "profile") { + selectAccountPanel(panel); + toggleAccountDropdown(false); + toggleHeaderCommandMenu(false); + const status = document.querySelector("#connectionStatus"); + status.className = "connection-status"; + status.textContent = "正在读取账号状态"; + openModalDialog(elements.settingsDialog); + try { + const payload = await apiRequest("/api/account/status"); + const access = payload.llm_access || {}; + const membership = access.membership || {}; + if (state.user) { + state.user.membership = membership; + updateAccountIdentityBadges(membership); + applyMembershipAccess(); + } + status.textContent = membership.active ? "账户权益已同步" : "账户信息已同步"; + status.classList.toggle("connected", true); + setText("membershipBadge", membership.subscribed ? "会员有效" : membership.is_admin ? "管理员权限" : "普通用户"); + setText("membershipStateValue", membership.subscribed ? "已开通" : membership.is_admin ? "管理员可用" : "未开通"); + setText("membershipRemainingValue", membership.subscribed && membership.expires_at + ? `${number(membership.remaining_days)} 天` + : membership.is_admin || membership.subscribed ? "长期有效" : "--"); + setText("membershipDetail", membership.subscribed + ? `${membership.plan || "会员"}${membership.expires_at ? ` · 有效至 ${membershipDateDisplay(membership.expires_at, true)}` : " · 长期有效"}` + : membership.is_admin + ? "管理员拥有智能功能管理权限,但不会因此显示为已开通会员。" + : "开通会员后可使用智能选股、问师、问天、复盘助手等智能功能。"); + setText("membershipQuotaHint", `会员默认每日智能分析额度 ${number(access.daily_limit)} 次,由管理员统一设置。`); + setText("membershipUsage", membership.active + ? `今日已用 ${number(access.used_today)} 次` + : "今日智能分析:--"); + setText("membershipUsageSummary", membership.active ? `${number(access.used_today)} / ${number(access.daily_limit)}` : "--"); + setText("membershipRemainingUsage", membership.is_admin ? "不限" : membership.active ? `${number(access.remaining_calls)} 次` : "--"); + const birth = payload.birth_profile || {}; + if (birth.birth_datetime) { + const [birthDate, birthTime] = String(birth.birth_datetime).split("T"); + document.querySelector("#accountBirthDate").value = birthDate || ""; + document.querySelector("#accountBirthTime").value = (birthTime || "").slice(0, 5); + document.querySelector("#accountBirthGender").value = birth.gender || "unspecified"; + } + setText("birthProfileStatus", payload.birth_profile_configured ? "已加密保存" : "尚未设置"); + document.querySelector("#deleteBirthProfileButton").disabled = !payload.birth_profile_configured; + } catch (error) { + status.hidden = false; + status.textContent = "账户状态暂时无法同步"; + showToast(error.message || "账号信息加载失败"); + } +} + +async function changeAccountPassword(event) { + event.preventDefault(); + const form = event.currentTarget; + const button = form.querySelector("button[type='submit']"); + button.disabled = true; + try { + await apiRequest("/api/account/password", "POST", { + current_password: document.querySelector("#currentPassword").value, + new_password: document.querySelector("#newPassword").value, + confirm_password: document.querySelector("#confirmPassword").value, + }); + form.reset(); + showToast("密码已更新"); + } catch (error) { + showToast(error.message || "密码更新失败"); + } finally { + button.disabled = false; + } +} + +async function switchAccount() { + const button = document.querySelector("#switchAccountMenuButton"); + button.disabled = true; + toggleAccountDropdown(false); + try { + await apiRequest("/api/auth/logout", "POST", {}); + window.location.reload(); + } catch (error) { + showToast(error.message || "切换账号失败"); + button.disabled = false; + } +} + +async function openAdminSettings(refreshOnly = false) { + if (state.user?.role !== "admin") return; + if (!refreshOnly) openModalDialog(elements.adminDialog); + const status = document.querySelector("#adminConnectionStatus"); + status.textContent = "正在读取系统状态"; + try { + const payload = await apiRequest("/api/admin/settings"); + const data = payload.data || {}; + const ifind = data.ifind || {}; + const llm = payload.llm || {}; + const membership = payload.membership || {}; + status.textContent = `Tushare ${data.configured ? "已配置" : "未配置"} · iFinD ${ifind.configured ? "已配置" : "未配置"} · ${number(data.snapshot_dates)} 个交易日`; + status.classList.toggle("connected", Boolean(data.configured)); + setText("systemDataStatus", data.background_refresh_enabled ? "后台刷新已启用" : "后台刷新已暂停"); + document.querySelector("#systemTokenInput").value = ""; + document.querySelector("#systemIfindTokenInput").value = ""; + document.querySelector("#systemBackgroundRefresh").checked = Boolean(data.background_refresh_enabled); + document.querySelector("#memberDailyLimit").value = number(membership.member_daily_limit) || 50; + renderModelPool(llm.models || [], llm.primary_model_id || "", llm.fallback_model_id || ""); + renderAdminUsers(payload.users || []); + } catch (error) { + status.textContent = error.message || "系统配置读取失败"; + } +} + +function selectAdminPanel(panel) { + const selected = ["market", "models", "members"].includes(panel) ? panel : "market"; + document.querySelector("#adminSectionSelect").value = selected; + document.querySelectorAll("[data-admin-panel]").forEach((item) => { + item.hidden = item.dataset.adminPanel !== selected; + }); +} + +function renderModelPool(models, primaryId = "", fallbackId = "") { + state.adminModels = models.map((item) => ({ ...item, api_key: item.api_key || "" })); + const container = document.querySelector("#modelPoolList"); + container.innerHTML = state.adminModels.map((item, index) => ` +
+
${escapeHtml(item.name || `模型 ${index + 1}`)}${item.configured ? "已保存密钥" : "待配置"}
+
+ + + + +
+
未测试
+
+ `).join("") || emptyStateHtml("模型池为空,请先添加模型"); + updateModelRoleOptions(primaryId, fallbackId); + container.querySelectorAll("[data-test-model]").forEach((button) => button.addEventListener("click", () => testPlatformModel(button.closest("[data-model-id]")))); + container.querySelectorAll("[data-delete-model]").forEach((button) => button.addEventListener("click", () => deletePlatformModel(button.closest("[data-model-id]")))); + container.querySelectorAll("[data-model-field='name']").forEach((input) => input.addEventListener("input", updateModelRoleLabels)); + refreshIcons(); +} + +function collectModelPool() { + const saved = new Map(state.adminModels.map((item) => [item.id, item])); + return [...document.querySelectorAll("#modelPoolList [data-model-id]")].map((row) => ({ + id: row.dataset.modelId, + name: row.querySelector("[data-model-field='name']").value.trim(), + base_url: row.querySelector("[data-model-field='base_url']").value.trim(), + model: row.querySelector("[data-model-field='model']").value.trim(), + api_key: row.querySelector("[data-model-field='api_key']").value.trim(), + configured: Boolean(saved.get(row.dataset.modelId)?.configured), + })); +} + +function updateModelRoleOptions(primaryId = document.querySelector("#platformPrimaryModelSelect").value, fallbackId = document.querySelector("#platformFallbackModelSelect").value) { + const models = collectModelPool(); + const options = models.map((item) => ``).join(""); + const primary = document.querySelector("#platformPrimaryModelSelect"); + const fallback = document.querySelector("#platformFallbackModelSelect"); + primary.innerHTML = models.length ? options : ''; + fallback.innerHTML = `${options}`; + primary.value = models.some((item) => item.id === primaryId) ? primaryId : models[0]?.id || ""; + fallback.value = models.some((item) => item.id === fallbackId) && fallbackId !== primary.value ? fallbackId : ""; +} + +function updateModelRoleLabels() { + updateModelRoleOptions(); +} + +function addPlatformModel() { + const models = collectModelPool(); + const id = `model-${Date.now()}-${Math.floor(Math.random() * 10000)}`; + models.push({ id, name: `模型 ${models.length + 1}`, base_url: "https://api.openai.com/v1", model: "", api_key: "", configured: false }); + renderModelPool(models, document.querySelector("#platformPrimaryModelSelect").value || id, document.querySelector("#platformFallbackModelSelect").value); + document.querySelector(`[data-model-id="${CSS.escape(id)}"] [data-model-field="name"]`)?.focus(); +} + +function deletePlatformModel(row) { + if (!row) return; + const id = row.dataset.modelId; + const primary = document.querySelector("#platformPrimaryModelSelect").value; + const fallback = document.querySelector("#platformFallbackModelSelect").value; + if (id === primary || id === fallback) { + showToast("请先为主模型或辅助模型选择其他模型,再删除当前模型"); + return; + } + const models = collectModelPool().filter((item) => item.id !== id); + renderModelPool(models, primary, fallback); +} + +function renderAdminUsers(users) { + const container = document.querySelector("#adminUsersList"); + container.innerHTML = users.map((user) => { + const admin = user.role === "admin"; + const member = Boolean(user.membership_subscribed); + const identityLabels = [admin ? "管理员" : "", member ? "会员有效" : "普通用户"].filter(Boolean).join(" · "); + const expiry = member + ? (user.membership_expires_at ? `有效至 ${membershipDateDisplay(user.membership_expires_at)}` : "永久有效") + : user.membership_status === "suspended" + ? "会员已停用" + : user.membership_status === "active" && user.membership_expires_at + ? `已于 ${membershipDateDisplay(user.membership_expires_at)} 到期` + : "尚未开通"; + return `
+
${escapeHtml(user.username)}${escapeHtml(identityLabels)}${escapeHtml(expiry)}
+
今日调用 ${number(user.used_today)}
+
+ + + +
当前到期${escapeHtml(expiry)}
+ +
+
`; + }).join("") || emptyStateHtml("暂无注册用户"); + container.querySelectorAll(".membership-form").forEach((form) => form.addEventListener("submit", saveMembership)); +} + +async function saveMembership(event) { + event.preventDefault(); + const form = event.currentTarget; + const data = Object.fromEntries(new FormData(form).entries()); + const button = form.querySelector("button[type='submit']"); + button.disabled = true; + try { + const payload = await apiRequest("/api/admin/membership", "POST", data); + renderAdminUsers(payload.users || []); + showToast("会员状态已更新"); + } catch (error) { + showToast(error.message || "会员状态保存失败"); + } finally { + button.disabled = false; + } +} + +async function saveMarketSettings(event) { + event.preventDefault(); + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + try { + await apiRequest("/api/admin/settings", "POST", { + tushare_token: document.querySelector("#systemTokenInput").value.trim(), + ifind_refresh_token: document.querySelector("#systemIfindTokenInput").value.trim(), + background_refresh_enabled: document.querySelector("#systemBackgroundRefresh").checked, + }); + document.querySelector("#systemTokenInput").value = ""; + document.querySelector("#systemIfindTokenInput").value = ""; + showToast("行情配置已保存"); + await openAdminSettings(true); + } catch (error) { + showToast(error.message || "系统配置保存失败"); + } finally { + button.disabled = false; + } +} + +async function saveModelPool(event) { + event.preventDefault(); + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + try { + await apiRequest("/api/admin/settings", "POST", { + models: collectModelPool(), + primary_model_id: document.querySelector("#platformPrimaryModelSelect").value, + fallback_model_id: document.querySelector("#platformFallbackModelSelect").value, + }); + showToast("模型池已保存"); + await openAdminSettings(true); + } catch (error) { + showToast(error.message || "模型池保存失败"); + } finally { + button.disabled = false; + } +} + +async function saveMembershipSettings(event) { + event.preventDefault(); + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + try { + await apiRequest("/api/admin/settings", "POST", { + member_daily_limit: number(document.querySelector("#memberDailyLimit").value), + }); + showToast("会员调用额度已保存"); + await openAdminSettings(true); + } catch (error) { + showToast(error.message || "会员调用额度保存失败"); + } finally { + button.disabled = false; + } +} + +async function testPlatformModel(row) { + if (!row) return; + const button = row.querySelector("[data-test-model]"); + const status = row.querySelector(".model-test-status"); + const profile = collectModelPool().find((item) => item.id === row.dataset.modelId) || {}; + button.disabled = true; + status.textContent = "连接中"; + try { + const payload = await apiRequest("/api/admin/settings/test", "POST", { model_id: row.dataset.modelId, profile }); + status.textContent = `已连通 · ${number(payload.result.latency_ms)} ms`; + status.className = "model-test-status success"; + } catch (error) { + status.textContent = error.message; + status.className = "model-test-status failure"; + } finally { + button.disabled = false; + } +} + +function membershipDateDisplay(value) { + if (!value) return ""; + const parsed = new Date(value); + if (Number.isNaN(parsed.getTime())) return String(value).slice(0, 10); + return new Intl.DateTimeFormat("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit" }).format(parsed); +} + +/* PRESERVATION-SOURCE-END app.js:8427-8904 */ +/* PRESERVATION-SOURCE-BEGIN app.js:9052-9283 */ +function outcomeClass(outcome) { + return { "晋级": "outcome-advance", "炸板": "outcome-broken", "跌停": "outcome-down", "断板": "outcome-open" }[outcome] || "outcome-open"; +} + +function trendClass(trend) { + return { "升温": "trend-hot", "降温": "trend-cool", "新进": "trend-new", "持平": "trend-flat" }[trend] || "trend-flat"; +} + +function changeClass(value) { + return number(value) > 0 ? "up" : number(value) < 0 ? "down" : ""; +} + +function sentimentLabel(score) { + const value = number(score); + if (value >= 80) return "情绪高涨"; + if (value >= 60) return "情绪偏强"; + if (value >= 40) return "情绪中性"; + if (value >= 20) return "情绪偏弱"; + return "情绪冰点"; +} + +function streakLabel(streak) { + const value = Math.max(1, number(streak)); + return value === 1 ? "首板" : `${value}板`; +} + +function signed(value) { + const parsed = number(value); + return `${parsed > 0 ? "+" : ""}${formatNumber(parsed, 2)}`; +} + +function dashboardDataTimestamp(meta = {}) { + const tradeDate = displayCompactDate(meta.trade_date); + if (tradeDate === "--") return "--"; + const intraday = tradeDate === todayString() && Boolean(meta.realtime) && !["closed", "after_hours"].includes(String(meta.market_status || "")); + if (intraday) { + const updated = new Date(meta.updated_at); + if (!Number.isNaN(updated.getTime())) { + const dateText = `${updated.getFullYear()}-${String(updated.getMonth() + 1).padStart(2, "0")}-${String(updated.getDate()).padStart(2, "0")}`; + const timeText = updated.toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", hour12: false }); + return `${dateText} ${timeText}`; + } + } + return `${tradeDate} 15:00`; +} + +function formatMoneyMillion(value) { + const parsed = number(value); + const sign = parsed > 0 ? "+" : ""; + if (Math.abs(parsed) >= 100) return `${sign}${formatNumber(parsed / 100, 2)} 亿`; + return `${sign}${formatNumber(parsed * 100, 0)} 万`; +} + +async function apiRequest(url, method = "GET", body = null, requestOptions = {}) { + return window.XiaobaiAPI.request(url, method, body, requestOptions); +} + +function setLoading(loading, text = "正在加载复盘数据", context = "default") { + elements.loading.hidden = !loading; + elements.loading.dataset.context = loading ? context : "default"; + setText("loadingTitle", text); + setText( + "loadingHint", + context === "screener" + ? "正在完成因子筛选、候选排序与历史样本回测,这通常需要一点时间" + : "请稍候", + ); +} + +function setStatus(text) { + applicationShell.setStatus(text); +} + +let toastTimer; +function showToast(message) { + clearTimeout(toastTimer); + elements.toast.textContent = message; + elements.toast.hidden = false; + toastTimer = setTimeout(() => { elements.toast.hidden = true; }, 3600); +} + +function setText(id, value) { + const element = document.getElementById(id); + if (element) element.textContent = value; +} + +function motionEnabled() { + return !window.matchMedia("(prefers-reduced-motion: reduce)").matches; +} + +function refreshIcons() { + if (!window.lucide?.createIcons) return; + window.lucide.createIcons({ attrs: { "aria-hidden": "true" } }); +} + +function toggleHeaderCommandMenu(force) { + applicationShell.toggleHeaderCommandMenu(force); +} + +function toggleAccountDropdown(force, returnFocus = false) { + const menu = document.querySelector("#accountDropdown"); + const button = document.querySelector("#accountButton"); + if (!menu || !button) return; + const open = typeof force === "boolean" ? force : menu.hidden; + menu.hidden = !open; + button.setAttribute("aria-expanded", String(open)); + document.querySelector(".account-menu-shell")?.classList.toggle("is-open", open); + if (open) { + setText("accountMenuName", state.user?.username || "当前账号"); + const membership = state.user?.membership || {}; + setText("accountMenuRole", state.user?.role === "admin" ? (membership.subscribed ? "管理员 · 会员" : "管理员") : membership.subscribed ? "会员用户" : "普通用户"); + } else if (returnFocus) { + button.focus(); + } +} + +function handleAccountMenuKeydown(event) { + const menu = document.querySelector("#accountDropdown"); + if (!menu) return; + if (menu.hidden) { + if (document.activeElement?.id === "accountButton" && event.key === "ArrowDown") { + event.preventDefault(); + toggleAccountDropdown(true); + menu.querySelector('[role="menuitem"]')?.focus(); + } + return; + } + const items = [...menu.querySelectorAll('[role="menuitem"]:not(:disabled)')]; + if (!items.length) return; + const current = items.indexOf(document.activeElement); + if (event.key === "ArrowDown" || event.key === "ArrowUp") { + event.preventDefault(); + const offset = event.key === "ArrowDown" ? 1 : -1; + items[(current + offset + items.length) % items.length].focus(); + } else if (event.key === "Home" || event.key === "End") { + event.preventDefault(); + items[event.key === "Home" ? 0 : items.length - 1].focus(); + } +} + +function updateSentimentGauge(rawScore) { + const gauge = document.querySelector("#sentimentGauge"); + if (!gauge) return; + const score = clamp(rawScore, 0, 100); + const previous = Number(gauge.dataset.score); + gauge.dataset.score = String(score); + gauge.style.setProperty("--score", score); + if (!motionEnabled() || !Number.isFinite(previous) || Math.abs(previous - score) < 15) return; + gauge.classList.remove("sentiment-pulse"); + void gauge.offsetWidth; + gauge.classList.add("sentiment-pulse"); + gauge.addEventListener("animationend", () => gauge.classList.remove("sentiment-pulse"), { once: true }); +} + +function animateMetric(id, rawValue, formatter = (value) => value) { + const element = document.getElementById(id); + const target = Number(rawValue); + if (!element || !Number.isFinite(target)) { + setText(id, formatter(rawValue)); + return; + } + const storedValue = Number(element.dataset.metricValue); + const previous = Number.isFinite(storedValue) ? storedValue : 0; + element.dataset.metricValue = String(target); + const existingFrame = metricAnimationFrames.get(element); + if (existingFrame) cancelAnimationFrame(existingFrame); + if (!motionEnabled() || previous === target) { + element.textContent = formatter(target); + return; + } + element.classList.remove("metric-changed"); + void element.offsetWidth; + element.classList.add("metric-changed"); + const startedAt = performance.now(); + const duration = 560; + const update = (now) => { + const progress = Math.min(1, (now - startedAt) / duration); + const eased = 1 - (1 - progress) ** 3; + element.textContent = formatter(previous + (target - previous) * eased); + if (progress < 1) { + metricAnimationFrames.set(element, requestAnimationFrame(update)); + } else { + element.textContent = formatter(target); + metricAnimationFrames.delete(element); + setTimeout(() => element.classList.remove("metric-changed"), 80); + } + }; + metricAnimationFrames.set(element, requestAnimationFrame(update)); +} + +function animateRows(container) { + if (!container) return; + const rows = [...container.children].filter((item) => item.matches("tr, [data-code]")); + if (!motionEnabled()) { + rows.forEach((row) => row.classList.remove("row-pending", "row-enter")); + return; + } + const unseenRows = rows.filter((row) => row.dataset.motionSeen !== "1"); + unseenRows.slice(0, 12).forEach((row, index) => { + row.dataset.motionSeen = "1"; + row.classList.remove("row-pending", "row-enter"); + row.style.setProperty("--row-delay", `${index * 24}ms`); + requestAnimationFrame(() => row.classList.add("row-enter")); + row.addEventListener("animationend", () => row.classList.remove("row-enter"), { once: true }); + }); + if (!("IntersectionObserver" in window)) { + unseenRows.slice(12).forEach((row) => { row.dataset.motionSeen = "1"; }); + return; + } + if (!rowAnimationObserver) { + rowAnimationObserver = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) return; + const row = entry.target; + rowAnimationObserver.unobserve(row); + row.dataset.motionSeen = "1"; + row.classList.remove("row-pending"); + row.style.setProperty("--row-delay", "0ms"); + requestAnimationFrame(() => row.classList.add("row-enter")); + row.addEventListener("animationend", () => row.classList.remove("row-enter"), { once: true }); + }); + }, { threshold: 0.08, rootMargin: "0px 0px 40px 0px" }); + } + unseenRows.slice(12).forEach((row) => { + row.classList.add("row-pending"); + rowAnimationObserver.observe(row); + }); +} + +function waitForMotion(duration) { + return new Promise((resolve) => setTimeout(resolve, motionEnabled() ? duration : 0)); +} +/* PRESERVATION-SOURCE-END app.js:9052-9283 */ diff --git a/app/static/heaven-loading.js b/app/frontend/heaven-loading.js similarity index 100% rename from app/static/heaven-loading.js rename to app/frontend/heaven-loading.js diff --git a/app/static/index.html b/app/frontend/index.html similarity index 99% rename from app/static/index.html rename to app/frontend/index.html index ca466dc..2996b1f 100644 --- a/app/static/index.html +++ b/app/frontend/index.html @@ -18,12 +18,12 @@ })(); - - - - - - + + + + + +
@@ -1865,12 +1865,13 @@ - + + @@ -1884,7 +1885,8 @@ - + + diff --git a/app/static/pages.config.js b/app/frontend/pages.config.js similarity index 100% rename from app/static/pages.config.js rename to app/frontend/pages.config.js diff --git a/app/frontend/pages/auction/page.js b/app/frontend/pages/auction/page.js new file mode 100644 index 0000000..500631d --- /dev/null +++ b/app/frontend/pages/auction/page.js @@ -0,0 +1,272 @@ +window.XiaobaiPageModules.register("auction", ["auctionView"], { + enter: ["loadAuction"], + leave: ["clearAuction"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:2217-2481 */ +async function loadAuctionCenter(force = false) { + if (state.auctionLoading) return; + state.auctionLoading = true; + const button = document.querySelector("#auctionRefreshButton"); + button.disabled = true; + setText("auctionDateLabel", "正在读取竞价数据"); + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + if (force) query.set("force", "1"); + state.auctionData = await apiRequest(`/api/auction?${query}`); + renderAuctionCenter(); + scheduleAuctionTransition(state.auctionData.meta || {}); + } catch (error) { + document.querySelector("#auctionSummary").innerHTML = ""; + document.querySelector("#auctionThemeCarry").innerHTML = ""; + document.querySelector("#auctionNewThemes").innerHTML = ""; + document.querySelector("#auctionAmountTrend").innerHTML = ""; + document.querySelector("#auctionAmountCompare").innerHTML = ""; + document.querySelector("#auctionTableBody").innerHTML = ""; + document.querySelector("#auctionEmpty").hidden = false; + setText("auctionDateLabel", error.message || "竞价数据暂不可用"); + showToast(error.message || "竞价数据加载失败"); + } finally { + state.auctionLoading = false; + button.disabled = false; + } +} + +function renderAuctionCenter() { + const payload = state.auctionData; + if (!payload) return; + const summary = payload.summary || {}; + renderAuctionPhase(payload.meta || {}); + setText( + "auctionDateLabel", + `${payload.meta?.carried_forward ? "最近有效竞价" : "竞价日期"} ${payload.meta?.trade_date || "--"}`, + ); + document.querySelector("#auctionSummary").innerHTML = [ + ["竞价覆盖", `${formatNumber(summary.stock_count, 0)} 只`, ""], + ["重点异动", `${formatNumber(summary.focus_count, 0)} 只`, "up"], + ["竞价一字", `${formatNumber(summary.one_price_count, 0)} 只`, ""], + ["竞价成交额", `${formatNumber(summary.amount_billion, 2)} 亿`, ""], + ].map(([label, value, tone]) => `
${label}${value}
`).join(""); + setText("auctionFocusCount", number(summary.focus_count)); + setText("auctionAllCount", number(summary.candidate_count)); + setText("auctionOnePriceCount", number(summary.one_price_count)); + setText("auctionWatchlistCount", number(payload.watchlist_rows?.length)); + renderAuctionInsights(payload); + renderAuctionTable(); +} + +function renderAuctionInsights(payload) { + const themes = payload.themes || {}; + const carry = themes.carry || []; + const tone = { "强承接": "strong", "有承接": "steady", "分歧": "mixed", "承接弱": "weak" }; + setText("auctionThemeBaseline", `基于 ${payload.candidate_meta?.baseline_date || "--"}`); + document.querySelector("#auctionThemeCarry").innerHTML = carry.length + ? carry.map((item) => ` +
+ ${escapeHtml(item.name)} + ${escapeHtml(item.leader || "--")} · 昨日 ${number(item.prior_limit_count)} 只涨停 + ${escapeHtml(item.status)} + ${item.median_change == null ? "暂无有效候选" : `${signed(item.median_change)}%`}中位 +
`).join("") + : '
暂无昨日强势题材基线
'; + + const newThemes = themes.new_themes || []; + document.querySelector("#auctionNewThemes").innerHTML = newThemes.length + ? newThemes.map((item) => `${escapeHtml(item.name)} ${number(item.stock_count)}`).join("") + : '尚未形成多股共振的新线索'; + + const history = payload.amount_history || []; + const maximum = Math.max(...history.map((item) => number(item.amount_billion)), 1); + const priorFive = history.slice(Math.max(0, history.length - 6), Math.max(0, history.length - 1)); + const fiveDayAverage = priorFive.length + ? priorFive.reduce((sum, item) => sum + number(item.amount_billion), 0) / priorFive.length + : null; + document.querySelector("#auctionAmountTrend").innerHTML = history.length + ? history.map((item, index) => { + const height = Math.max(8, number(item.amount_billion) / maximum * 100); + const current = index === history.length - 1 ? " current" : ""; + return `
+ ${escapeHtml(String(item.trade_date || "").slice(5))} +
`; + }).join("") + (fiveDayAverage === null ? "" : `
5日均 ${formatNumber(fiveDayAverage, 1)}
`) + : '
历史竞价量能尚未形成
'; + setText("auctionAmountValue", `${formatNumber(payload.summary?.amount_billion, 2)} 亿`); + const comparison = [ + ["较昨日", payload.summary?.amount_change_previous], + ["较5日均值", payload.summary?.amount_change_5d], + ]; + document.querySelector("#auctionAmountCompare").innerHTML = comparison.map(([label, value]) => ` + ${label}${value == null ? "--" : `${signed(value)}%`} + `).join(""); +} + +function renderAuctionPhase(meta) { + const phase = meta.phase || "archive"; + const available = Boolean(meta.available); + const copy = { + pending: ["竞价尚未开始", "9:15 进入观察期,9:25 读取最终竞价结果。", "下一阶段 09:15"], + observing: ["竞价观察期", "此阶段先观察盘前变化,系统将在 9:25 自动读取最终结果。", "09:25 定格"], + selection: available + ? ["竞价筛选窗口", "最终竞价结果已经定格,请在 9:30 前完成筛选。", "有效至 09:30"] + : ["等待最终竞价", "9:25 数据尚未到达,系统正在自动重试。", "即将更新"], + finalized: ["今日竞价已定格", "9:30 后停止更新,仅保留用于复盘、回测与智能选股。", "已冻结"], + archive: ["历史竞价归档", "当前展示所选交易日的最终竞价结果。", "归档数据"], + }[phase] || ["竞价状态", "当前竞价状态待确认。", "--"]; + const notice = document.querySelector("#auctionPhaseNotice"); + notice.dataset.phase = phase; + setText("auctionPhaseTitle", copy[0]); + setText("auctionPhaseDetail", copy[1]); + setText("auctionPhaseTime", copy[2]); + const refresh = document.querySelector("#auctionRefreshButton"); + refresh.hidden = phase !== "selection"; + refresh.disabled = state.auctionLoading; +} + +function clearAuctionTimer() { + if (state.auctionTimer) clearTimeout(state.auctionTimer); + state.auctionTimer = null; +} + +function scheduleAuctionTransition(meta) { + clearAuctionTimer(); + if (state.activeView !== "auctionView") return; + let delay = 0; + if (["selection", "finalized"].includes(meta.phase) && !meta.available) { + delay = 10_000; + } else if (meta.next_transition_at) { + const transitionAt = new Date(meta.next_transition_at).getTime(); + if (Number.isFinite(transitionAt)) delay = Math.max(800, transitionAt - Date.now() + 500); + } + if (!delay) return; + state.auctionTimer = setTimeout(() => { + state.auctionTimer = null; + if (state.activeView === "auctionView") loadAuctionCenter(true); + }, Math.min(delay, 2_147_000_000)); +} + +function renderAuctionTable() { + const rows = currentAuctionRows(); + const columns = auctionColumns(); + const head = document.querySelector("#auctionTableHead"); + head.innerHTML = columns.map((column) => { + const sorted = column.sortKey === state.auctionSortKey; + const arrow = !column.sortKey ? "" : `${sorted ? (state.auctionSortDirection === "desc" ? "▼" : "▲") : "↕"}`; + return `${column.label}${arrow}`; + }).join(""); + const body = document.querySelector("#auctionTableBody"); + body.innerHTML = rows.map((row) => `${columns.map((column) => renderAuctionCell(row, column.key)).join("")}`).join(""); + bindStockRows(body); + const datasetCopy = { + focus: ["重点异动", "优先查看市场核心与显著预期差"], + onePrice: ["竞价一字", "竞价封于当日真实涨停价,不参与普通异动评分"], + watchlist: ["我的自选", "仅展示当前账号关注标的的竞价反馈"], + all: ["全部候选", "昨日涨停、炸板与热榜前20候选"], + }[state.auctionDataset] || ["竞价异动", ""]; + setText("auctionWorkspaceTitle", datasetCopy[0]); + setText("auctionWorkspaceSubtitle", datasetCopy[1]); + document.querySelector("#auctionExpectationControls").hidden = state.auctionDataset === "onePrice"; + const empty = document.querySelector("#auctionEmpty"); + const phase = state.auctionData?.meta?.phase || "archive"; + empty.textContent = phase === "selection" && !state.auctionData?.meta?.available + ? "正在等待 9:25 最终竞价数据" + : state.auctionDataset === "watchlist" + ? "当前账号还没有可观察的自选股" + : state.auctionDataset === "onePrice" + ? "当前没有竞价封于涨停价的股票" + : "没有符合条件的竞价候选"; + empty.hidden = rows.length > 0; +} + +function currentAuctionRows() { + const datasets = { + focus: state.auctionData?.focus_rows || [], + onePrice: state.auctionData?.one_price_rows || [], + watchlist: state.auctionData?.watchlist_rows || [], + all: state.auctionData?.rows || [], + }; + let rows = [...(datasets[state.auctionDataset] || [])]; + const filter = state.auctionFilter; + const labels = { above: "超预期", matched: "符合预期", below: "低于预期" }; + if (labels[filter]) rows = rows.filter((item) => item.expectation === labels[filter]); + if (state.auctionQuery) { + rows = rows.filter((item) => `${item.code} ${item.name} ${item.sector}`.toLocaleLowerCase("zh-CN").includes(state.auctionQuery)); + } + const key = state.auctionSortKey; + const direction = state.auctionSortDirection === "asc" ? 1 : -1; + if (key) { + rows.sort((left, right) => { + const leftValue = left[key]; + const rightValue = right[key]; + if (leftValue == null && rightValue == null) return 0; + if (leftValue == null) return 1; + if (rightValue == null) return -1; + const result = typeof leftValue === "number" || typeof rightValue === "number" + ? number(leftValue) - number(rightValue) + : String(leftValue).localeCompare(String(rightValue), "zh-CN", { numeric: true }); + return result * direction; + }); + } + return rows.slice(0, 300); +} + +function auctionColumns() { + const base = [ + { key: "stock", label: "股票" }, + { key: "context", label: "方向与来源" }, + { key: "identity", label: "市场身份" }, + ]; + const metrics = [ + { key: "score", label: "关注分", numeric: true, sortKey: "attention_score" }, + { key: "expectation", label: "预期判断" }, + { key: "change", label: "竞价涨幅(%)", numeric: true, sortKey: "change" }, + { key: "amount", label: "竞价额(百万)", numeric: true, sortKey: "amount_million" }, + { key: "volume", label: "量比", numeric: true, sortKey: "volume_ratio" }, + ]; + return state.auctionDataset === "onePrice" ? [...base, ...metrics.slice(2)] : [...base, ...metrics]; +} + +function renderAuctionCell(row, key) { + const unavailable = row.available === false; + const onePrice = Boolean(row.is_one_price); + const expectationTone = { "超预期": "above", "符合预期": "matched", "低于预期": "below" }; + if (key === "stock") return `${escapeHtml(row.name)}${escapeHtml(row.code)}`; + if (key === "context") return `${escapeHtml(row.sector || "其他")}${renderAuctionSources(row.source_label || (state.auctionDataset === "watchlist" ? "我的自选" : "全市场"))}`; + if (key === "identity") return `${renderAuctionCoreTags(row.core_tags)}`; + if (unavailable) return key === "expectation" + ? '暂无竞价' + : ``; + if (key === "score") return `${onePrice ? "" : formatNumber(row.attention_score, 1)}`; + if (key === "expectation") { + const tag = onePrice + ? '竞价一字' + : `${escapeHtml(row.expectation || "符合预期")}`; + return `${tag}`; + } + if (key === "change") return `${signed(row.change)}`; + if (key === "amount") return `${formatNumber(row.amount_million, 2)}`; + if (key === "volume") return `${formatNumber(row.volume_ratio, 2)}`; + return ""; +} + +function renderAuctionSources(value) { + const sources = String(value || "").split(/[·、/]/).map((item) => item.trim()).filter(Boolean).slice(0, 3); + return `${sources.map((source) => `${escapeHtml(source)}`).join("")}`; +} + +function renderAuctionCoreTags(tags) { + const values = Array.isArray(tags) ? tags : []; + return values.length + ? `${values.slice(0, 2).map((tag) => `${escapeHtml(tag)}`).join("")}` + : ''; +} + +function exportAuctionRows() { + const rows = currentAuctionRows(); + exportRows("集合竞价", rows, [ + ["股票代码", "code"], ["股票名称", "name"], ["行业", "sector"], ["来源", "source_label"], + ["市场身份", "core_tags"], ["关注分", "attention_score"], ["预期判断", "expectation"], + ["竞价涨幅%", "change"], ["竞价额百万", "amount_million"], ["量比", "volume_ratio"], + ]); +} + +/* PRESERVATION-SOURCE-END app.js:2217-2481 */ diff --git a/app/frontend/pages/dragon-tiger/page.js b/app/frontend/pages/dragon-tiger/page.js new file mode 100644 index 0000000..9a5d15c --- /dev/null +++ b/app/frontend/pages/dragon-tiger/page.js @@ -0,0 +1,375 @@ +window.XiaobaiPageModules.register("dragon_tiger", ["dragonView"], { + enter: ["loadDragonTiger"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:2660-3028 */ +function selectDragonViewMode(mode) { + state.dragonViewMode = mode === "profiles" ? "profiles" : "daily"; + document.querySelectorAll("[data-dragon-view-mode]").forEach((button) => { + const active = button.dataset.dragonViewMode === state.dragonViewMode; + button.classList.toggle("active", active); + button.setAttribute("aria-pressed", String(active)); + }); + if (state.dragonViewMode === "profiles") { + document.querySelector("#dragonDailyContent").hidden = true; + document.querySelector("#dragonEmptyState").hidden = true; + document.querySelector("#dragonProfilesContent").hidden = false; + if (state.hotMoneyProfiles) renderHotMoneyProfiles(); + else loadHotMoneyProfiles(); + } else { + document.querySelector("#dragonProfilesContent").hidden = true; + if (state.dragonTiger) renderDragonTiger(); + else loadDragonTiger(); + } +} + +async function loadHotMoneyProfiles(force = false) { + if (!force && state.hotMoneyProfiles) { + renderHotMoneyProfiles(); + return; + } + setStatus("正在加载游资档案"); + try { + const query = new URLSearchParams(); + if (force) query.set("force", "1"); + const suffix = query.size ? `?${query}` : ""; + state.hotMoneyProfiles = await apiRequest(`/api/dragon-tiger/profiles${suffix}`); + renderHotMoneyProfiles(); + const count = number(state.hotMoneyProfiles.summary?.profile_count); + setStatus(`游资档案已加载 · 共 ${count} 位`); + } catch (error) { + showToast(error.message || "游资档案加载失败"); + setStatus("游资档案加载失败"); + } +} + +function renderHotMoneyProfiles() { + const payload = state.hotMoneyProfiles; + if (!payload) return; + const profiles = payload.profiles || []; + const summary = payload.summary || {}; + const query = state.hotMoneyProfileQuery; + const visible = profiles.filter((profile) => { + if (!query) return true; + return [profile.name, profile.description, ...(profile.organizations || [])] + .join(" ") + .toLocaleLowerCase("zh-CN") + .includes(query); + }); + if (!visible.some((profile) => profile.id === state.selectedHotMoneyProfileId)) { + state.selectedHotMoneyProfileId = visible[0]?.id || ""; + } + const selected = visible.find((profile) => profile.id === state.selectedHotMoneyProfileId) || null; + + setText("dragonDateLabel", `收录 ${number(summary.profile_count)} 位`); + setText("hotMoneyProfileResultCount", query ? `${visible.length} / ${profiles.length} 位` : `${profiles.length} 位`); + document.querySelector("#hotMoneyProfileSummary").innerHTML = [ + ["收录游资", number(summary.profile_count)], + ["已有简介", number(summary.described_count)], + ["关联席位", number(summary.organization_count)], + ].map(([label, value]) => `${label}${value}`).join(""); + + const list = document.querySelector("#hotMoneyProfileList"); + list.innerHTML = visible.length ? visible.map((profile, index) => ` + `).join("") : ` +
+ + ${profiles.length ? "没有符合条件的游资档案" : "游资名录暂不可用"} +
`; + + const detail = document.querySelector("#hotMoneyProfileDetail"); + if (!selected) { + detail.innerHTML = ` +
+ + ${profiles.length ? "选择一位游资查看档案" : "暂无可展示的游资档案"} +
`; + } else { + const organizations = selected.organizations || []; + detail.innerHTML = ` +
+ ${escapeHtml(selected.name.slice(0, 2))} +
+ 游资档案 +

${escapeHtml(selected.name)}

+ ${organizations.length ? `关联 ${organizations.length} 个公开席位` : "暂无关联席位"} +
+
+
+

人物简介

+

${escapeHtml(selected.description || "名录暂未收录该游资的公开简介。")}

+
+
+
+

关联营业部

+ ${organizations.length} 个 +
+
+ ${organizations.length ? organizations.map((organization) => ` + ${escapeHtml(organization)} + `).join("") : '

名录暂未收录关联营业部。

'} +
+
+ ${payload.meta?.notice ? `

${escapeHtml(payload.meta.notice)}

` : ""}`; + } + refreshIcons(); +} + +async function loadDragonTiger(force = false) { + const requestedDate = elements.tradeDate.value; + if ( + !force + && ["success", "empty", "partial", "unavailable"].includes(state.dragonTiger?.meta?.status) + && (state.dragonTiger?.meta?.requested_date || state.dragonTiger?.meta?.trade_date) === requestedDate + ) { + renderDragonTiger(); + return; + } + setStatus("正在加载龙虎榜"); + try { + const query = new URLSearchParams({ trade_date: requestedDate }); + if (force) query.set("force", "1"); + const payload = await apiRequest(`/api/dragon-tiger?${query}`); + state.dragonTiger = payload; + renderDragonTiger(); + const statusLabel = payload.meta.status === "error" + ? "龙虎榜数据暂不可用" + : payload.meta.status === "empty" + ? "当日暂无公开游资明细" + : payload.meta.status === "partial" + ? "当日有龙虎榜,暂无命名游资明细" + : payload.meta.status === "unavailable" ? "龙虎榜数据暂不可用" : "龙虎榜明细"; + setStatus(`${statusLabel} · 龙虎榜已加载`); + } catch (error) { + showToast(error.message || "龙虎榜加载失败"); + setStatus("龙虎榜加载失败"); + } +} + +function renderDragonTiger() { + const payload = state.dragonTiger; + if (!payload) return; + const summary = payload.summary || {}; + if (state.dragonViewMode === "daily") setText("dragonDateLabel", `数据日期 ${payload.meta.trade_date}`); + const status = payload.meta?.status || "empty"; + const hasRecognizedTraders = (payload.traders || []).some((item) => item.identity_type === "trader" && item.recognized !== false); + const showEmptyState = !hasRecognizedTraders + && !(payload.unclassified_seats || []).length + && ["empty", "error", "unavailable"].includes(status); + const dailyVisible = state.dragonViewMode === "daily"; + document.querySelector("#dragonProfilesContent").hidden = dailyVisible; + document.querySelector("#dragonEmptyState").hidden = !dailyVisible || !showEmptyState; + document.querySelector("#dragonDailyContent").hidden = !dailyVisible || showEmptyState; + if (showEmptyState) { + const unavailable = ["error", "unavailable"].includes(status); + setText("dragonEmptyTitle", unavailable ? "龙虎榜数据暂不可用" : `${payload.meta?.trade_date || "该交易日"} 暂无龙虎榜明细`); + setText("dragonEmptyDescription", unavailable + ? "当前数据暂未完成更新,可稍后重新检查或查看前一交易日。" + : "龙虎榜明细通常在交易日盘后陆续披露,可稍后刷新或查看前一交易日。"); + } + document.querySelector("#dragonSummary").innerHTML = [ + ["上榜游资", `${number(summary.trader_count)} 位`, ""], + ["操作明细", `${number(summary.operation_count)} 条`, ""], + ["席位净买入", formatMoneyMillion(summary.seat_net_buy_million), changeClass(summary.seat_net_buy_million)], + ["活跃股票", `${number(summary.active_stock_count)} 只`, ""], + ].map(([label, value, className]) => `
${label}${value}
`).join(""); + + renderDragonTraderList(); + renderUnclassifiedSeats(); +} + +function renderDragonTraderList() { + const payload = state.dragonTiger; + if (!payload) return; + let traders = [...(payload.traders || [])].filter((item) => item.identity_type === "trader" && item.recognized !== false); + if (state.dragonFilter === "buy") traders = traders.filter((item) => number(item.net_buy_million) > 0); + if (state.dragonFilter === "sell") traders = traders.filter((item) => number(item.net_buy_million) < 0); + if (state.dragonFilter === "unclassified") traders = []; + if (state.dragonQuery) { + traders = traders.filter((item) => { + const searchable = [ + item.name, + ...(item.operations || []).flatMap((operation) => [operation.code, operation.name, operation.seat_name]), + ].join(" ").toLowerCase(); + return searchable.includes(state.dragonQuery); + }); + } + + const container = document.querySelector("#dragonTraderList"); + let emptyMessage = "没有符合当前条件的游资操作"; + if (!Array.isArray(payload.traders)) emptyMessage = "龙虎榜数据格式暂不可用,请稍后重试"; + else if (["error", "unavailable"].includes(payload.meta?.status)) emptyMessage = "龙虎榜数据暂不可用,请稍后重试"; + else if (payload.meta?.status === "empty") emptyMessage = "该交易日暂无游资每日明细"; + else if (payload.meta?.status === "partial") emptyMessage = `当日有 ${number(payload.summary?.official_stock_count)} 只股票上榜,但暂无可识别的游资明细`; + if (!traders.some((item) => item.id === state.selectedDragonTraderId)) { + state.selectedDragonTraderId = traders[0]?.id || ""; + } + const cardMarkup = traders.map((trader, index) => { + const description = trader.description || `${number(trader.stock_count)} 只股票,${number(trader.operation_count)} 笔操作`; + return ` + `; + }).join(""); + const hitZoneMarkup = traders.map((trader) => ` + + `).join(""); + container.innerHTML = traders.length + ? `${cardMarkup}
${hitZoneMarkup}
` + : emptyStateHtml(state.dragonFilter === "unclassified" ? "待归类席位请在下方管理" : emptyMessage, { className: "dragon-empty" }); + container.querySelectorAll("[data-dragon-card]").forEach((card) => { + card.addEventListener("animationend", () => card.classList.remove("dealing"), { once: true }); + }); + container.querySelectorAll("[data-dragon-trader]").forEach((hitZone) => { + const setHovered = (hovered) => { + container.querySelector(`[data-dragon-card="${CSS.escape(hitZone.dataset.dragonTrader)}"]`)?.classList.toggle("hovered", hovered); + }; + hitZone.addEventListener("pointerenter", () => setHovered(true)); + hitZone.addEventListener("pointerleave", () => setHovered(false)); + hitZone.addEventListener("focus", () => setHovered(true)); + hitZone.addEventListener("blur", () => setHovered(false)); + hitZone.addEventListener("click", () => { + state.selectedDragonTraderId = hitZone.dataset.dragonTrader; + container.querySelectorAll("[data-dragon-card]").forEach((card) => { + card.classList.toggle("selected", card.dataset.dragonCard === state.selectedDragonTraderId); + }); + container.querySelectorAll("[data-dragon-trader]").forEach((item) => { + item.setAttribute("aria-pressed", String(item.dataset.dragonTrader === state.selectedDragonTraderId)); + }); + renderDragonTraderDetail(traders.find((item) => item.id === state.selectedDragonTraderId)); + }); + }); + requestAnimationFrame(() => layoutDragonCards(container)); + renderDragonTraderDetail(traders.find((item) => item.id === state.selectedDragonTraderId)); +} + +function layoutDragonCards(container = document.querySelector("#dragonTraderList")) { + if (!container) return; + const cards = [...container.querySelectorAll(".dragon-trader-card")]; + const hitZones = [...container.querySelectorAll(".dragon-card-hit-zone")]; + if (!cards.length) return; + const compact = window.innerWidth <= 720; + const cardWidth = compact ? 148 : 176; + const available = Math.max(cardWidth, container.clientWidth - (compact ? 30 : 72)); + const spread = Math.min(available - cardWidth, compact ? 310 : 1050); + const step = cards.length > 1 ? Math.min(cardWidth + 14, spread / (cards.length - 1)) : 0; + const center = (cards.length - 1) / 2; + container.style.setProperty("--dragon-card-width", `${cardWidth}px`); + cards.forEach((card, index) => { + const x = (index - center) * step; + card.style.setProperty("--card-x", `${x.toFixed(2)}px`); + card.style.setProperty("--card-rotation", "0deg"); + card.style.setProperty("--card-y", "0px"); + card.style.zIndex = String(index + 1); + const hitZone = hitZones[index]; + if (hitZone) { + const zoneWidth = index === cards.length - 1 ? cardWidth : Math.max(18, step); + hitZone.style.left = `calc(50% + ${(x - cardWidth / 2).toFixed(2)}px)`; + hitZone.style.width = `${zoneWidth.toFixed(2)}px`; + } + }); +} + +function renderDragonTraderDetail(trader) { + const container = document.querySelector("#dragonTraderDetail"); + if (!trader) { + container.hidden = true; + renderEmptyState(container, "选择一位游资查看操作明细", { className: "dragon-empty" }); + return; + } + container.hidden = false; + container.innerHTML = ` +
+
当日操作明细

${escapeHtml(trader.name)}

${escapeHtml(trader.description || "按当日公开龙虎榜席位汇总")}

+
买入
${formatMoneyMillion(trader.buy_million)}
卖出
${formatMoneyMillion(trader.sell_million)}
净额
${formatMoneyMillion(trader.net_buy_million)}
+
+
+ + + + ${(trader.operations || []).map((operation, index) => ` + + + + + + + + + + + `).join("")} +
序号股票方向涨幅(%)买入(百万)卖出(百万)净额(百万)关联席位标签 / 上榜原因
${index + 1}${escapeHtml(operation.name)}${escapeHtml(operation.code)}${escapeHtml(operation.direction)}${operation.change == null ? "" : signed(operation.change)}${operation.buy_million == null ? "" : formatNumber(operation.buy_million, 2)}${operation.sell_million == null ? "" : formatNumber(operation.sell_million, 2)}${operation.net_buy_million == null ? "" : signed(operation.net_buy_million)}${escapeHtml(operation.seat_name)}${escapeHtml(operation.tag && operation.tag !== "--" ? operation.tag : operation.reason && operation.reason !== "--" ? operation.reason : "")}
+
`; + bindStockRows(container); + markAutoSortableHeaders(container); +} + +function renderUnclassifiedSeats() { + const seats = state.dragonTiger?.unclassified_seats || []; + const canManage = state.user?.role === "admin"; + document.querySelector("#dragonUnclassifiedSection").hidden = !canManage || seats.length === 0; + document.querySelector("#dragonUnclassifiedFilter").hidden = !canManage || seats.length === 0; + if (!seats.length && state.dragonFilter === "unclassified") { + state.dragonFilter = "all"; + document.querySelectorAll("[data-dragon-filter]").forEach((button) => { + button.classList.toggle("active", button.dataset.dragonFilter === "all"); + }); + renderDragonTraderList(); + } + setText("unclassifiedCount", `${seats.length} 个`); + const list = document.querySelector("#unclassifiedSeatList"); + list.innerHTML = seats.map((seat, index) => ` +
+ ${escapeHtml(seat.seat_name)} + ${number(seat.operation_count)} 笔 · ${number(seat.stock_count)} 股 + ${formatMoneyMillion(seat.net_buy_million)} + + +
+ `).join("") || emptyStateHtml("当前席位均已归类"); + list.querySelectorAll(".unclassified-seat-row").forEach((form) => { + form.addEventListener("submit", saveSeatAlias); + }); +} + +function dragonIdentityLabel(type) { + return { trader: "游资", institution: "机构", channel: "通道", unclassified: "待归类" }[type] || "席位"; +} + +async function saveSeatAlias(event) { + event.preventDefault(); + const form = event.currentTarget; + const seat = state.dragonTiger?.unclassified_seats?.[number(form.dataset.unclassifiedIndex)]; + const alias = form.querySelector("input").value.trim(); + if (!seat || !alias) { + showToast("请输入游资名"); + return; + } + const button = form.querySelector("button"); + button.disabled = true; + try { + await apiRequest("/api/seat-aliases", "POST", { seat_name: seat.seat_name, alias }); + state.dragonTiger = null; + await loadDragonTiger(); + showToast(`已将席位归类为 ${alias}`); + } catch (error) { + showToast(error.message); + button.disabled = false; + } +} + +/* PRESERVATION-SOURCE-END app.js:2660-3028 */ diff --git a/app/static/heaven-loading-v2.js b/app/frontend/pages/heaven/loading-v2.js similarity index 100% rename from app/static/heaven-loading-v2.js rename to app/frontend/pages/heaven/loading-v2.js diff --git a/app/static/wentian-v2.css b/app/frontend/pages/heaven/page.css similarity index 100% rename from app/static/wentian-v2.css rename to app/frontend/pages/heaven/page.css diff --git a/app/frontend/pages/heaven/page.js b/app/frontend/pages/heaven/page.js new file mode 100644 index 0000000..f873df4 --- /dev/null +++ b/app/frontend/pages/heaven/page.js @@ -0,0 +1,1847 @@ +window.XiaobaiPageModules.register("heaven", ["heavenView"], { + enter: ["loadHeaven"], + leave: ["stopHeaven"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:4828-6667 */ +async function loadHeavenSetup(force = false, sector = "", stockCode = "") { + const calendarDate = document.querySelector("#qiObservationDate")?.value || elements.tradeDate.value; + const requestedDate = calendarDate.replaceAll("-", ""); + const manualData = state.heavenManualData; + const calibrationKey = manualData ? JSON.stringify(manualData) : "auto"; + const requestedKey = `${requestedDate}:${sector}:${stockCode}:${calibrationKey}`; + if (!force && state.heavenSetup?.requestedKey === requestedKey) { + renderHeavenWorkspace(); + return; + } + const requestSequence = ++state.heavenRequestSequence; + const heavenView = document.querySelector("#heavenView"); + const loadButton = document.querySelector("#loadHeavenSelectionButton"); + const calibrationButtons = [ + document.querySelector("#applyHeavenCalibrationButton"), + document.querySelector("#resetHeavenCalibrationButton"), + ].filter(Boolean); + cancelHeavenPerformance(); + heavenView?.classList.add("heaven-data-loading"); + if (loadButton) loadButton.disabled = true; + calibrationButtons.forEach((button) => { button.disabled = true; }); + try { + if (state.heavenSetup?.requestedKey && state.heavenSetup.requestedKey !== requestedKey) { + state.personalField = null; + } + const query = new URLSearchParams({ + trade_date: calendarDate, + }); + if (sector) query.set("sector", sector); + if (stockCode) query.set("stock_code", stockCode); + if (manualData) query.set("manual_data", JSON.stringify(manualData)); + const payload = await apiRequest(`/api/heaven/setup?${query}`); + if ( + requestSequence !== state.heavenRequestSequence + || calendarDate !== document.querySelector("#qiObservationDate")?.value + ) return; + const previousFocus = state.heavenSetup + ? `${state.heavenSetup.chart?.sector || ""}:${state.heavenSetup.chart?.stock?.code || ""}` + : ""; + payload.requestedDate = requestedDate; + payload.requestedKey = requestedKey; + state.heavenSetup = payload; + state.heavenInterpretations.fortune = payload.daily_fortune_reading || ""; + state.heavenManualData = Object.keys(payload.chart?.manual_data || {}).length + ? payload.chart.manual_data + : null; + state.personalField = payload.personal_profile || null; + state.heavenPerformanceKey = `${requestedKey}:${requestSequence}`; + state.heavenPerformancePanels = new Set(); + state.heavenPerformanceActive = ""; + const nextFocus = `${payload.chart?.sector || ""}:${payload.chart?.stock?.code || ""}`; + if (previousFocus && previousFocus !== nextFocus) state.heavenInterpretations.trend = ""; + hideHeavenNotice(); + renderHeavenWorkspace(); + if (payload.chart.selection_notice) showHeavenNotice(payload.chart.selection_notice); + } catch (error) { + if (requestSequence !== state.heavenRequestSequence) return; + showHeavenNotice(error.message || "问天数据加载失败"); + showToast(error.message || "问天数据加载失败"); + } finally { + if (requestSequence === state.heavenRequestSequence) { + heavenView?.classList.remove("heaven-data-loading"); + if (loadButton) loadButton.disabled = false; + calibrationButtons.forEach((button) => { button.disabled = false; }); + } + } +} + +function loadHeavenSelection() { + const stockCode = document.querySelector("#heavenStockInput").value.trim(); + state.heavenManualData = null; + loadHeavenSetup(true, "", stockCode); +} + +function applyHeavenCalibration(event) { + event.preventDefault(); + const data = { ...(state.heavenManualData || {}) }; + delete data.note; + document.querySelectorAll("[data-heaven-manual-field]").forEach((input) => { + const current = String(input.value || "").trim(); + const original = String(input.dataset.originalValue || "").trim(); + if (!current) return; + if (current !== original || input.dataset.manual === "true") { + data[input.dataset.heavenManualField] = input.type === "number" ? Number(current) : current; + } + }); + const note = document.querySelector("#heavenCalibrationNote").value.trim(); + if (note) data.note = note; + if (!Object.keys(data).some((key) => key !== "note")) { + showToast("请先补充或修改至少一项量化数据"); + return; + } + state.heavenManualData = data; + loadHeavenSetup(true, "", document.querySelector("#heavenStockInput").value.trim()); +} + +function resetHeavenCalibration() { + state.heavenManualData = null; + document.querySelector("#heavenCalibrationNote").value = ""; + loadHeavenSetup(true, "", document.querySelector("#heavenStockInput").value.trim()); +} + +function selectHeavenPanel(panel, updateUrl = false) { + state.heavenPanel = panel; + if (state.heavenSetup) { + const calendarDate = state.heavenSetup.calendar_date || state.heavenSetup.trade_date; + const dateLabel = panel === "trend" + ? (calendarDate === state.heavenSetup.trade_date + ? `行情 ${displayCompactDate(state.heavenSetup.trade_date)}` + : `行情 ${displayCompactDate(state.heavenSetup.trade_date)} · 历法 ${displayCompactDate(calendarDate)}`) + : `历法 ${displayCompactDate(calendarDate)}`; + setText("heavenDataDate", dateLabel); + } + document.querySelectorAll("[data-heaven-panel]").forEach((button) => { + const active = button.dataset.heavenPanel === panel; + button.classList.toggle("active", active); + button.classList.toggle("on", active); + button.setAttribute("aria-current", active ? "page" : "false"); + }); + document.querySelectorAll(".heaven-panel").forEach((item) => { + item.classList.toggle("active-heaven-panel", item.id === `heaven${capitalize(panel)}Panel`); + }); + if ( + panel === "fortune" + && state.heavenSetup?.field + && state.heavenPerformancePanels.has("fortune") + ) { + requestAnimationFrame(() => renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false })); + } else { + stopQiFieldCanvas(); + } + if (panel === "heart") { + initializeHeartAtmosphere(); + setHeartLamp(state.heartStage); + } else { + stopHeartDust(); + } + if (panel !== "heart") requestAnimationFrame(() => queueHeavenPerformance(panel)); + if (updateUrl) { + const url = new URL(window.location.href); + url.searchParams.set("heaven", panel); + history.replaceState(null, "", url); + } +} + +function showHeartRitualCurtain() { + const curtain = document.querySelector("#heartRitualCurtain"); + if (!curtain || curtain.classList.contains("is-visible")) return; + if (state.heartCurtainTimer) clearTimeout(state.heartCurtainTimer); + document.querySelectorAll(".heart-stage.active-heart-stage .heart-rise").forEach((item) => item.classList.remove("is-visible")); + curtain.classList.remove("is-leaving"); + curtain.classList.add("is-visible"); + state.heartCurtainTimer = setTimeout(() => { + curtain.classList.add("is-leaving"); + activateHeartRises(document.querySelector(".heart-stage.active-heart-stage")); + state.heartCurtainTimer = setTimeout(() => { + curtain.classList.remove("is-visible", "is-leaving"); + state.heartCurtainTimer = null; + }, motionEnabled() ? 1450 : 10); + }, motionEnabled() ? 3000 : 20); +} + +function renderHeavenWorkspace() { + const setup = state.heavenSetup; + if (!setup) return; + initializeWentianV2Atmosphere(); + renderMarketHexagram(setup.chart); + renderFivePhaseField(setup.field); + renderPersonalFortune(); + renderHeartStage(); + selectHeavenPanel(state.heavenPanel); +} + +function buildWentianStars(id, count) { + const element = document.getElementById(id); + if (!element || element.children.length) return; + element.innerHTML = Array.from({ length: count }, () => { + const size = (Math.random() * 1.6 + 0.8).toFixed(1); + return ``; + }).join(""); +} + +function buildWentianBagua(svg) { + if (!svg || svg.children.length) return; + const trigrams = ["乾", "兑", "离", "震", "巽", "坎", "艮", "坤"]; + let characters = ""; + let ticks = ""; + for (let index = 0; index < 8; index += 1) { + const angle = (index * 45 - 90) * Math.PI / 180; + const x = 150 + 129 * Math.cos(angle); + const y = 150 + 129 * Math.sin(angle); + characters += `${trigrams[index]}`; + } + for (let index = 0; index < 24; index += 1) { + const angle = (index * 15 - 90) * Math.PI / 180; + ticks += ``; + } + svg.innerHTML = `${characters}${ticks}`; +} + +function buildWentianFortuneOrbit(svg) { + if (!svg || svg.children.length) return; + const sixQi = ["厥阴木", "少阴火", "少阳火", "太阴土", "阳明金", "太阳水"]; + const movements = ["木运", "火运", "土运", "金运", "水运"]; + const polarText = (items, radius, fontSize, offset = -90) => items.map((label, index) => { + const degrees = offset + index * 360 / items.length; + const angle = degrees * Math.PI / 180; + const x = 150 + radius * Math.cos(angle); + const y = 150 + radius * Math.sin(angle); + return `${label}`; + }).join(""); + const ticks = Array.from({ length: 30 }, (_, index) => { + const angle = (index * 12 - 90) * Math.PI / 180; + const inner = index % 5 === 0 ? 96 : 101; + return ``; + }).join(""); + svg.innerHTML = `${polarText(sixQi, 132, 8.5)}${ticks}${polarText(movements, 70, 10)}五运六气`; +} + +function initializeWentianV2Atmosphere() { + buildWentianStars("stars", 90); + buildWentianStars("fortuneStars", 100); + buildWentianStars("heartStars", 110); + buildWentianBagua(document.querySelector("#baguaSvg")); + buildWentianFortuneOrbit(document.querySelector("#fortuneBagua")); + buildWentianBagua(document.querySelector("#heartBagua")); +} + +function renderCompactHexagrams(hexagram) { + const original = document.querySelector("#heavenOriginalHexLines"); + const changed = document.querySelector("#heavenChangedHexLines"); + if (!original || !changed) return; + if (!hexagram?.lines?.length) { + original.innerHTML = ""; + changed.innerHTML = ""; + setText("heavenOriginalHexName", "待定"); + setText("heavenChangedHexName", "待定"); + setText("heavenOriginalHexDetail", "六爻尚未齐备"); + setText("heavenChangedHexDetail", "待动爻化变"); + return; + } + const values = hexagram.lines.map((line) => number(line.value)); + const changedValues = values.map((value) => value === 6 ? 7 : value === 9 ? 8 : value); + const lines = (items, showMoving) => [...items].reverse().map((value) => { + const moving = showMoving && [6, 9].includes(value); + return `
${value % 2 ? "" : ""}
`; + }).join(""); + original.innerHTML = lines(values, true); + changed.innerHTML = lines(changedValues, false); + setText("heavenOriginalHexName", hexagram.name || "--"); + setText("heavenChangedHexName", hexagram.transformed?.name || "--"); + setText("heavenOriginalHexDetail", `${hexagram.outer_trigram || "--"}上 · ${hexagram.inner_trigram || "--"}下`); + setText("heavenChangedHexDetail", `${hexagram.transformed?.outer_trigram || "--"}上 · ${hexagram.transformed?.inner_trigram || "--"}下`); +} + +function cancelHeavenPerformance() { + heavenPerformanceToken += 1; + state.heavenPerformanceActive = ""; + document.querySelectorAll("#heavenTrendPanel, #heavenFortunePanel").forEach((panel) => { + panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); + panel.classList.add("heaven-performance-complete"); + }); +} + +function queueHeavenPerformance(panel) { + if (!state.heavenSetup || !["trend", "fortune"].includes(panel)) return; + const performanceId = `${state.heavenPerformanceKey}:${panel}`; + if ( + state.heavenPerformancePanels.has(panel) + || state.heavenPerformanceActive === performanceId + || state.heavenPanel !== panel + ) return; + const token = ++heavenPerformanceToken; + state.heavenPerformanceActive = performanceId; + const runner = panel === "trend" + ? playTrendPerformance(state.heavenSetup.chart, token) + : playFortunePerformance(state.heavenSetup.field, token); + runner.then((completed) => { + if (!completed || token !== heavenPerformanceToken) return; + state.heavenPerformancePanels.add(panel); + state.heavenPerformanceActive = ""; + }); +} + +function heavenPerformanceDelay(duration, token) { + return new Promise((resolve) => { + setTimeout(() => resolve(token === heavenPerformanceToken), motionEnabled() ? duration : 0); + }); +} + +async function typeHeavenText(element, text, token, speed = 38) { + if (!element) return false; + if (!motionEnabled()) { + element.textContent = text; + return token === heavenPerformanceToken; + } + element.textContent = ""; + element.classList.add("heaven-typing"); + for (const character of text) { + if (token !== heavenPerformanceToken) return false; + element.append(document.createTextNode(character)); + if (!await heavenPerformanceDelay(speed, token)) return false; + } + element.classList.remove("heaven-typing"); + return true; +} + +function countHeavenNumber(element, target, token, duration = 1300, suffix = "") { + return new Promise((resolve) => { + if (!element || !motionEnabled()) { + if (element) element.textContent = `${target > 0 ? "+" : ""}${target}${suffix}`; + resolve(token === heavenPerformanceToken); + return; + } + const startedAt = performance.now(); + const step = (now) => { + if (token !== heavenPerformanceToken) { + resolve(false); + return; + } + const progress = Math.min(1, (now - startedAt) / duration); + const eased = 1 - (1 - progress) ** 3; + const value = Math.round(target * eased); + element.textContent = `${value > 0 ? "+" : ""}${value}${suffix}`; + if (progress < 1) requestAnimationFrame(step); + else resolve(true); + }; + requestAnimationFrame(step); + }); +} + +async function playTrendPerformance(chart, token) { + const panel = document.querySelector("#heavenTrendPanel"); + if (!panel || state.heavenPanel !== "trend") return false; + panel.classList.remove( + "heaven-performance-complete", + "performance-title-ready", + "performance-change-ready", + "performance-score-ready", + "performance-text-ready", + ); + panel.classList.add("heaven-performance-pending", "heaven-performance-running"); + panel.querySelectorAll(".talent-line-group, .hexagram-line-row, .talent-reading, .heaven-index-strip > *").forEach((item) => { + item.classList.remove("is-ready"); + }); + if (!chart?.available) { + panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); + panel.classList.add("heaven-performance-complete"); + return true; + } + + const guaci = chart.hexagram.text || ""; + const scoreElement = document.querySelector("#heavenMomentumScore"); + const guaciElement = document.querySelector("#marketHexagramText"); + if (scoreElement) scoreElement.textContent = "0"; + if (guaciElement) guaciElement.textContent = ""; + if (!await heavenPerformanceDelay(220, token)) return false; + + const groups = [...panel.querySelectorAll(".talent-line-group")].reverse(); + const readings = [...panel.querySelectorAll(".talent-reading")]; + for (let index = 0; index < groups.length; index += 1) { + const group = groups[index]; + group.classList.add("is-ready"); + if (!await heavenPerformanceDelay(280, token)) return false; + const rows = [...group.querySelectorAll(".hexagram-line-row")].reverse(); + for (const row of rows) { + row.classList.add("is-ready"); + if (!await heavenPerformanceDelay(560, token)) return false; + } + readings[index]?.classList.add("is-ready"); + if (!await heavenPerformanceDelay(220, token)) return false; + } + + panel.classList.add("performance-title-ready"); + if (!await heavenPerformanceDelay(650, token)) return false; + panel.classList.add("performance-change-ready"); + if (!await heavenPerformanceDelay(420, token)) return false; + panel.classList.add("performance-score-ready"); + if (!await countHeavenNumber(scoreElement, number(chart.momentum_score), token)) return false; + panel.querySelectorAll(".heaven-index-strip > *").forEach((item, index) => { + setTimeout(() => { + if (token === heavenPerformanceToken) item.classList.add("is-ready"); + }, motionEnabled() ? index * 90 : 0); + }); + if (!await heavenPerformanceDelay(620, token)) return false; + if (!await typeHeavenText(guaciElement, guaci, token, 30)) return false; + panel.classList.add("performance-text-ready"); + panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); + panel.classList.add("heaven-performance-complete"); + return true; +} + +async function playFortunePerformance(field, token) { + const panel = document.querySelector("#heavenFortunePanel"); + if (!panel || !field || state.heavenPanel !== "fortune") return false; + panel.classList.remove("heaven-performance-complete", "performance-climate-ready", "performance-use-ready"); + panel.classList.add("heaven-performance-pending", "heaven-performance-running"); + panel.querySelectorAll(".phase-balance-row, .qi-framework-layer, .human-field-grid > div, .personal-fortune-panel").forEach((item) => { + item.classList.remove("is-ready"); + }); + const climateTone = document.querySelector("#qiClimateTone"); + const climateText = climateTone?.textContent || ""; + if (climateTone) climateTone.textContent = ""; + renderQiFieldCanvas(field.balance || [], { intro: true }); + if (!await heavenPerformanceDelay(900, token)) return false; + panel.classList.add("performance-climate-ready"); + if (!await heavenPerformanceDelay(720, token)) return false; + if (!await typeHeavenText(climateTone, climateText, token, 58)) return false; + + const balanceRows = [...panel.querySelectorAll(".phase-balance-row")]; + for (const row of balanceRows) { + row.classList.add("is-ready"); + const percent = number(row.dataset.phasePercent); + if (!await countHeavenNumber(row.querySelector(":scope > b"), percent, token, 520, "%")) return false; + if (!await heavenPerformanceDelay(90, token)) return false; + } + const layers = [...panel.querySelectorAll(".qi-framework-layer")]; + for (const layer of layers) { + layer.classList.add("is-ready"); + if (!await heavenPerformanceDelay(250, token)) return false; + } + panel.querySelectorAll(".human-field-grid > div").forEach((item, index) => { + setTimeout(() => { + if (token === heavenPerformanceToken) item.classList.add("is-ready"); + }, motionEnabled() ? index * 150 : 0); + }); + if (!await heavenPerformanceDelay(820, token)) return false; + panel.querySelector(".personal-fortune-panel")?.classList.add("is-ready"); + panel.classList.add("performance-use-ready"); + drawQiUseConnections(true); + panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); + panel.classList.add("heaven-performance-complete"); + return true; +} + +function heavenSourcePhrase(item = {}) { + const stateLabel = item.realtime ? "当下之象" : "既成之象"; + const layerLabel = { + 指数: "天象合参", + 行业: "人势同观", + 个股: "地脉验真", + 用户补充: "人工验数", + }[item.layer] || "三才合参"; + return `${layerLabel} · ${stateLabel}`; +} + +function renderHeavenLineChecks(chart) { + const checks = [...(chart.data_checks || [])].sort((left, right) => number(right.line) - number(left.line)); + const container = document.querySelector("#heavenLineChecks"); + const status = document.querySelector("#heavenCalibrationStatus"); + const passedCount = checks.filter((item) => item.passed).length; + const manualCount = checks.filter((item) => item.status === "manual").length; + status.textContent = checks.length ? `${passedCount}/6 通过${manualCount ? ` · ${manualCount} 爻含补录` : ""}` : "等待载入"; + status.className = passedCount === 6 ? (manualCount ? "is-manual" : "is-passed") : "is-failed"; + if (!checks.length) { + renderEmptyState(container, "载入股票后查看六爻数据状态"); + return; + } + const lineValueLabel = { 6: "老阴 · 动", 7: "少阳 · 静", 8: "少阴 · 静", 9: "老阳 · 动" }; + container.innerHTML = checks.map((check) => { + const stateLabel = check.status === "manual" ? "补录通过" : check.passed ? "自动通过" : "未通过"; + const score = check.score === null || check.score === undefined ? "--" : signedScore(check.score); + const fields = (check.fields || []).map((field) => { + const rawValue = field.value === null || field.value === undefined ? "" : String(field.value); + const source = field.manual ? "用户补录" : rawValue ? "自动行情" : "等待补充"; + const common = `data-heaven-manual-field="${escapeHtml(field.key)}" data-original-value="${escapeHtml(rawValue)}" data-manual="${field.manual ? "true" : "false"}"`; + const control = field.type === "select" + ? `` + : field.type === "text" + ? `` + : ``; + return ``; + }).join(""); + const reasons = (check.reasons || []).map((reason) => `
  • ${escapeHtml(reason)}
  • `).join(""); + return `
    + + ${escapeHtml(stateLabel)} + ${escapeHtml(check.position)} · ${escapeHtml(check.layer)}${escapeHtml(check.formula)} + ${check.line_value ? escapeHtml(lineValueLabel[check.line_value] || check.line_value) : "待定"}得分 ${escapeHtml(score)} + + +
    + ${reasons ? `
      ${reasons}
    ` : `

    ${(check.evidence || []).map(escapeHtml).join(";") || "数据已通过安全门"}

    `} +
    ${fields}
    +
    +
    `; + }).join(""); + document.querySelector("#heavenCalibrationNote").value = chart.manual_data?.note || ""; + window.lucide?.createIcons(); +} + +function renderMarketHexagram(chart) { + const stockInput = document.querySelector("#heavenStockInput"); + if (document.activeElement !== stockInput) stockInput.value = chart.stock.code || ""; + const selectionRequired = Boolean(chart.selection_required); + const emptyState = document.querySelector("#heavenTrendEmpty"); + const trendLayout = document.querySelector("#heavenTrendPanel .heaven-trend-layout"); + const calibrationPanel = document.querySelector("#heavenCalibrationPanel"); + const stockIdentity = document.querySelector("#heavenStockIdentity"); + if (emptyState) emptyState.hidden = !selectionRequired; + if (trendLayout) trendLayout.hidden = selectionRequired; + if (calibrationPanel) calibrationPanel.hidden = selectionRequired; + if (stockIdentity) stockIdentity.hidden = selectionRequired; + if (selectionRequired) { + document.querySelector("#interpretTrendButton").disabled = true; + setText("heavenStockName", "--"); + setText("heavenStockSector", "--"); + renderHeavenInterpretation("trend", ""); + return; + } + setText("heavenStockName", chart.stock.name || "--"); + setText( + "heavenStockSector", + chart.sector || "--", + ); + setText("heavenStockTaxonomy", chart.sector_taxonomy === "sw_l2" ? "申万二级 ·" : "所属行业 ·"); + renderHeavenLineChecks(chart); + + const interpretButton = document.querySelector("#interpretTrendButton"); + const scoreMeter = document.querySelector(".trend-score-meter"); + const scoreNeedle = document.querySelector("#heavenMomentumNeedle"); + const renderTrendEvidence = () => { + const rows = chart.quality?.sources || []; + document.querySelector("#heavenTrendEvidence").innerHTML = rows.length + ? rows.map((item) => ` +
    + ${escapeHtml(item.lines)} · ${escapeHtml(item.layer)} + ${escapeHtml(heavenSourcePhrase(item))} + ${escapeHtml(item.detail || "")} +
    + `).join("") + : '

    暂无可核验的数据来源。

    '; + }; + renderTrendEvidence(); + if (!chart.available) { + interpretButton.disabled = true; + setText("marketHexagramName", "暂不成卦"); + setText("marketTransformedName", "--"); + setText("marketHexagramText", chart.quality?.principle || "六爻数据尚未齐备。"); + setText("marketMovementSummary", (chart.quality?.issues || []).join(";") || "等待有效行情数据"); + setText("heavenMomentumScore", "--"); + setText("heavenMomentumLabel", "数据未齐"); + renderCompactHexagrams(null); + scoreMeter?.setAttribute("aria-valuenow", "0"); + if (scoreNeedle) scoreNeedle.style.setProperty("--momentum-position", "50%"); + document.querySelector("#marketHexagramLines").innerHTML = ""; + const sourceRows = chart.quality?.sources || []; + document.querySelector("#threeTalentReadings").innerHTML = [ + ...(chart.quality?.issues || []).map((issue) => ` +
    未通过${escapeHtml(issue)}
    + `), + ...sourceRows.map((item) => ` +
    + ${escapeHtml(item.lines)} · ${escapeHtml(item.layer)} + ${escapeHtml(heavenSourcePhrase(item))} + ${escapeHtml(item.detail || "")} +
    + `), + ].join(""); + document.querySelector("#heavenIndexStrip").innerHTML = "

    天象尚未应时,待三才数据齐备后再观。

    "; + renderHeavenInterpretation("trend", ""); + return; + } + interpretButton.disabled = false; + + setText("marketHexagramName", `${chart.hexagram.outer_trigram}上${chart.hexagram.inner_trigram}下 · ${chart.hexagram.name}`); + setText("marketTransformedName", chart.hexagram.transformed.name); + renderCompactHexagrams(chart.hexagram); + setText("marketHexagramText", chart.hexagram.text); + setText("marketMovementSummary", `${chart.movement.label}。${chart.movement.explanation}`); + setText("heavenMomentumScore", `${chart.momentum_score > 0 ? "+" : ""}${chart.momentum_score}`); + setText("heavenMomentumLabel", chart.momentum_label); + const momentumPosition = clamp((number(chart.momentum_score) + 100) / 2, 0, 100); + scoreMeter?.setAttribute("aria-valuenow", String(number(chart.momentum_score))); + if (scoreNeedle) scoreNeedle.style.setProperty("--momentum-position", `${momentumPosition}%`); + renderMarketHexagramLines(chart.hexagram.lines); + document.querySelector("#threeTalentReadings").innerHTML = chart.pair_readings.map((item) => ` +
    + ${escapeHtml(item.level)}${escapeHtml(item.state)} +
    + 内 ${signedScore(item.inner)} + 外 ${signedScore(item.outer)} +
    +
    + `).join(""); + const indexContext = chart.index_context || {}; + document.querySelector("#heavenIndexStrip").innerHTML = (indexContext.indices || []).length + ? indexContext.indices.map((item) => ` +
    ${escapeHtml(item.name)}${signed(item.pct_chg)}%5日 ${signed(item.return_5d)}%
    + `).join("") + : `

    ${escapeHtml(indexContext.notice || "指数数据暂不可用")}

    `; + renderHeavenInterpretation("trend", state.heavenInterpretations.trend); +} + +function renderMarketHexagramLines(lines) { + const groups = [ + { talent: "天", caption: "指数 · 外显为上,内核为下", lines: [lines[5], lines[4]] }, + { talent: "人", caption: "行业 · 外显为上,内核为下", lines: [lines[3], lines[2]] }, + { talent: "地", caption: "个股 · 外显为上,内核为下", lines: [lines[1], lines[0]] }, + ]; + document.querySelector("#marketHexagramLines").innerHTML = groups.map((group, groupIndex) => ` +
    + +
    +

    ${group.caption}

    + ${group.lines.map((line) => ` +
    + ${escapeHtml(line.position_name)} + ${hexagramLineGraphic(line.value)} +
    + ${escapeHtml(line.role || line.line_name)} · ${line.value}${line.moving ? " 变" : ""} + ${(line.evidence || []).map(escapeHtml).join(";")} +
    +
    + `).join("")} +
    +
    + `).join(""); +} + +function stopQiFieldCanvas() { + if (qiFieldAnimationFrame) cancelAnimationFrame(qiFieldAnimationFrame); + qiFieldAnimationFrame = 0; +} + +function renderQiFieldCanvas(balance, options = {}) { + stopQiFieldCanvas(); + const canvas = document.querySelector("#qiFieldCanvas"); + const shell = canvas?.parentElement; + if (!canvas || !shell || !shell.clientWidth || !shell.clientHeight) return; + const context = canvas.getContext("2d"); + const ratio = Math.min(2, window.devicePixelRatio || 1); + const width = shell.clientWidth; + const height = shell.clientHeight; + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + const phaseColors = { 木: "#4a7c59", 火: "#b53a30", 土: "#b08a3e", 金: "#9c7c3c", 水: "#31505f" }; + const positions = { + 水: [0.50, 0.23], + 火: [0.50, 0.77], + 金: [0.28, 0.50], + 木: [0.72, 0.50], + 土: [0.50, 0.50], + }; + const introStartedAt = options.intro && motionEnabled() ? performance.now() : 0; + const items = balance.map((item, index) => ({ + ...item, + color: phaseColors[item.element] || "#6d685b", + x: positions[item.element]?.[0] || 0.5, + y: positions[item.element]?.[1] || 0.5, + phase: index * 1.7, + alpha: introStartedAt ? 0 : 1, + })); + const draw = (now = 0) => { + context.clearRect(0, 0, width, height); + context.globalCompositeOperation = "multiply"; + items.forEach((item, index) => { + const strength = Math.max(0.14, number(item.percent) / 100); + const introProgress = introStartedAt ? clamp((now - introStartedAt) / 2600, 0, 1) : 1; + const introEase = 1 - (1 - introProgress) ** 3; + const breath = motionEnabled() ? Math.sin(now * 0.00055 + item.phase) : 0; + const radius = Math.min(width, height) * (0.13 + Math.sqrt(strength) * 0.12) * (1 + breath * 0.06); + const targetAlpha = qiFieldSoloElement ? (qiFieldSoloElement === item.element ? 1 : 0.1) : 1; + item.alpha += (targetAlpha - item.alpha) * 0.06; + const targetX = width * item.x + (motionEnabled() ? Math.sin(now * (0.00012 + index * 0.000015) + item.phase) * 10 : 0); + const targetY = height * item.y + (motionEnabled() ? Math.cos(now * (0.0001 + index * 0.000013) + item.phase) * 8 : 0); + const centerX = width * 0.5; + const centerY = height * 0.47; + const x = centerX + (targetX - centerX) * introEase; + const y = centerY + (targetY - centerY) * introEase; + const gradient = context.createRadialGradient(x, y, 0, x, y, radius); + const rgb = item.color.match(/[a-f\d]{2}/gi).map((part) => parseInt(part, 16)); + const alpha = item.alpha * introEase; + gradient.addColorStop(0, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},${(0.28 + strength * 0.22) * alpha})`); + gradient.addColorStop(0.5, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},${(0.13 + strength * 0.12) * alpha})`); + gradient.addColorStop(1, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`); + context.fillStyle = gradient; + context.fillRect(x - radius, y - radius, radius * 2, radius * 2); + }); + context.globalCompositeOperation = "source-over"; + if (motionEnabled() && state.activeView === "heavenView" && state.heavenPanel === "fortune") { + qiFieldAnimationFrame = requestAnimationFrame(draw); + } + }; + draw(performance.now()); +} + +function wentianClimateVerdict(field) { + const balance = field?.balance || []; + const dominant = balance[0]?.element; + const secondary = balance[1]?.element; + const tertiary = balance[2]?.element; + const pair = [dominant, secondary].filter(Boolean).sort().join(""); + const primary = { + 木火: "风火相煽", 木土: "风湿相搏", 木金: "风燥相激", 木水: "风寒相薄", + 土火: "湿热交蒸", 火金: "燥热相煽", 水火: "寒热相争", 土金: "燥湿相搏", + 土水: "寒湿交织", 水金: "寒燥相参", + }[pair] || ({ 木: "风木疏展", 火: "热火升明", 土: "湿滞偏重", 金: "燥金肃降", 水: "寒水潜藏" }[dominant] || "气机交会"); + const following = { 木: "风象暗动", 火: "热象内蕴", 土: "湿滞内结", 金: "燥气相参", 水: "寒意潜行" }[tertiary] + || ({ 木: "风象相随", 火: "热象相随", 土: "湿象相随", 金: "燥象相随", 水: "寒象相随" }[secondary] || "诸气相参"); + return `${primary} · ${following}`; +} + +function renderFivePhaseField(field) { + if (!field) return; + setText("fortuneLunarDate", `${field.date} · ${field.lunar_date}`); + setText("fortunePillars", `${field.pillars.year}年 · ${field.pillars.month}月 · ${field.pillars.day}日`); + const metrics = [ + ["中运", field.movement.label, field.movement.basis], + ["司天", field.six_qi.sitian, "岁半以前主气候背景"], + ["在泉", field.six_qi.zaiquan, "岁半以后主气候背景"], + [field.six_qi.step_name, `主 ${field.six_qi.host_qi}`, `客 ${field.six_qi.guest_qi}`], + ["当前节气", field.solar_terms.current, field.solar_terms.current_at], + ["下一节气", field.solar_terms.next, field.solar_terms.next_at], + ]; + document.querySelector("#fortuneMetrics").innerHTML = metrics.map(([label, value, detail]) => ` +
    ${escapeHtml(label)}${escapeHtml(value)}${escapeHtml(detail)}
    + `).join(""); + const framework = field.framework || {}; + setText("qiFrameworkPrinciple", framework.principle || "--"); + const layerLabels = { year: "年运与岁气", current: "客主加临", day: "日辰触发" }; + document.querySelector("#qiFrameworkLayers").innerHTML = (framework.layers || []).map((layer) => ` +
    + ${escapeHtml(layerLabels[layer.id] || layer.label)} + ${escapeHtml(layer.dominant)}气 + ${escapeHtml(layer.summary)} +
    ${(layer.balance || []).map((item) => ``).join("")}
    +
    + `).join(""); + const human = field.human_field || {}; + const dominantPhase = (field.balance || [])[0]; + setText("qiClimateKeyword", wentianClimateVerdict(field)); + setText("qiClimateTone", (human.emotional_tendency || [])[0] || "留意当下身心反应"); + setText("humanFieldSummary", human.summary || "--"); + setText("humanEmotionList", (human.emotional_tendency || []).join(";") || "--"); + setText("humanBiasList", (human.decision_biases || []).join(";") || "--"); + setText("humanOperation", human.operation_tendency || "--"); + setText( + "humanBalanceActions", + [...(human.risk_reminders || []), ...(human.balancing_actions || [])].join(";") || "--", + ); + document.querySelector("#fivePhaseBalance").innerHTML = field.balance.map((item) => ` +
    + ${escapeHtml(item.element)} +
    ${escapeHtml(item.motion)} · ${escapeHtml(item.mind)}
    + ${number(item.percent)}% +
    + `).join(""); + document.querySelectorAll("#fivePhaseBalance .phase-balance-row").forEach((row) => { + const focusPhase = () => { qiFieldSoloElement = row.dataset.phaseElement || ""; }; + const clearPhase = () => { qiFieldSoloElement = ""; }; + row.addEventListener("mouseenter", focusPhase); + row.addEventListener("mouseleave", clearPhase); + row.addEventListener("focus", focusPhase); + row.addEventListener("blur", clearPhase); + row.addEventListener("click", () => { + qiFieldSoloElement = qiFieldSoloElement === row.dataset.phaseElement ? "" : row.dataset.phaseElement; + }); + }); + setText("phaseSectorTitle", "五行行业归属"); + setText("phaseSectorContext", "传统取象 · 手动归类优先"); + renderQiUseMap(field); + renderFortuneSectorCatalog(field); + renderSectorPhaseOverrides(state.heavenSetup?.sector_phase_overrides || []); + setText("fortuneNotice", field.notice); + renderHeavenInterpretation("fortune", state.heavenInterpretations.fortune); +} + +function renderFortuneSectorCatalog(field) { + const container = document.querySelector("#fortuneSectorGroups"); + if (!container) return; + const phaseOrder = new Map((field.balance || []).map((item, index) => [item.element, index])); + const canonical = { 木: 0, 火: 1, 土: 2, 金: 3, 水: 4 }; + const catalog = [...(field.sector_catalog || [])].sort((left, right) => ( + (canonical[left.element] ?? phaseOrder.get(left.element) ?? 99) + - (canonical[right.element] ?? phaseOrder.get(right.element) ?? 99) + )); + container.innerHTML = catalog.map((group) => ` +
    +
    ${escapeHtml(group.element)}属性${number(group.count || group.industries?.length)} 类
    +
      ${(group.industries || []).map((item) => `
    • ${escapeHtml(item.name)}
    • `).join("")}
    +
    + `).join("") || '

    行业五行归类尚未建立

    '; +} + +function renderQiUseMap(field) { + const sourceContainer = document.querySelector("#qiUseSources"); + const sectorContainer = document.querySelector("#phaseSectorList"); + if (!sourceContainer || !sectorContainer) return; + const balance = field.balance || []; + const phaseOrder = new Map(balance.map((item, index) => [item.element, index])); + const catalog = [...(field.sector_catalog || [])].sort( + (left, right) => (phaseOrder.get(left.element) ?? 99) - (phaseOrder.get(right.element) ?? 99), + ); + const catalogElements = new Set(catalog.map((item) => item.element)); + sourceContainer.innerHTML = balance.map((item) => ` +
    + ${escapeHtml(item.element)} + ${escapeHtml(item.motion)}${number(item.percent)}% +
    + `).join(""); + sectorContainer.innerHTML = catalog.length ? catalog.map((group) => { + const element = group.element; + const items = group.industries || []; + return ` +
    + + ${escapeHtml(element)}属性 + ${number(group.count)} 类 + + +
    +
      + ${items.map((item) => `
    • ${escapeHtml(item.name)}${item.classification_source === "manual" ? '手动' : ""}
    • `).join("")} +
    +
    +
    + `; + }).join("") : '

    行业五行归类尚未建立。

    '; + sectorContainer.querySelectorAll(".qi-sector-group").forEach((group) => { + group.addEventListener("toggle", () => requestAnimationFrame(() => drawQiUseConnections(false))); + }); + refreshIcons(); + requestAnimationFrame(() => drawQiUseConnections(false)); +} + +function drawQiUseConnections(animate = false) { + const map = document.querySelector("#qiUseMap"); + const svg = document.querySelector("#qiUseConnections"); + if (!map || !svg || !map.clientWidth || !map.clientHeight) return; + const bounds = map.getBoundingClientRect(); + svg.setAttribute("viewBox", `0 0 ${bounds.width} ${bounds.height}`); + svg.innerHTML = ""; + document.querySelectorAll("#phaseSectorList [data-qi-sector]").forEach((group) => { + const element = group.dataset.qiSector; + const source = document.querySelector(`#qiUseSources [data-qi-source="${CSS.escape(element)}"]`); + const target = group.querySelector("summary"); + if (!source || !target) return; + const from = source.getBoundingClientRect(); + const to = target.getBoundingClientRect(); + const x1 = from.right - bounds.left - 4; + const y1 = from.top + from.height / 2 - bounds.top; + const x2 = to.left - bounds.left + 2; + const y2 = to.top + to.height / 2 - bounds.top; + const bend = Math.max(46, (x2 - x1) * 0.42); + const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); + path.setAttribute("d", `M ${x1} ${y1} C ${x1 + bend} ${y1}, ${x2 - bend} ${y2}, ${x2} ${y2}`); + path.setAttribute("pathLength", "1"); + path.classList.add(`phase-stroke-${phaseClass(element)}`); + if (animate && motionEnabled()) path.classList.add("is-drawing"); + else path.classList.add("is-flowing"); + svg.appendChild(path); + if (animate && motionEnabled()) { + requestAnimationFrame(() => path.classList.add("is-visible")); + setTimeout(() => { + if (!path.isConnected) return; + path.classList.remove("is-drawing", "is-visible"); + path.classList.add("is-flowing"); + }, 1900); + } + }); +} + +function renderSectorPhaseOverrides(items) { + const container = document.querySelector("#sectorPhaseOverrides"); + const canManage = state.user?.role === "admin"; + container.innerHTML = items.length ? items.map((item) => ` +
    + ${escapeHtml(item.element)} + ${escapeHtml(item.name)} + ${canManage ? `` : ""} +
    + `).join("") : '

    暂无手动归类

    '; + container.querySelectorAll("[data-sector-phase-delete]").forEach((button) => { + button.addEventListener("click", () => deleteSectorPhaseOverride(button.dataset.sectorPhaseDelete)); + }); + refreshIcons(); +} + +async function saveSectorPhaseOverride(event) { + event.preventDefault(); + const name = document.querySelector("#sectorPhaseName").value.trim(); + const element = document.querySelector("#sectorPhaseElement").value; + if (!name) return; + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + try { + await apiRequest("/api/heaven/sector-phases", "POST", { name, element }); + document.querySelector("#sectorPhaseName").value = ""; + await loadHeavenSetup(true); + showToast(`已将 ${name} 归为${element}`); + } catch (error) { + showToast(error.message || "手动归类保存失败"); + } finally { + button.disabled = false; + } +} + +async function deleteSectorPhaseOverride(name) { + try { + await apiRequest(`/api/heaven/sector-phases/${encodeURIComponent(name)}`, "DELETE"); + await loadHeavenSetup(true); + showToast(`已删除 ${name} 的手动归类`); + } catch (error) { + showToast(error.message || "手动归类删除失败"); + } +} + +async function saveAccountBirthProfile(event) { + event.preventDefault(); + const birthDate = document.querySelector("#accountBirthDate").value; + const birthTime = document.querySelector("#accountBirthTime").value; + if (!birthDate || !birthTime) { + showToast("请填写完整出生日期和时间"); + return; + } + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + const originalText = button.textContent; + button.textContent = "正在排盘"; + try { + await apiRequest("/api/account/birth-profile", "POST", { + trade_date: document.querySelector("#qiObservationDate").value || elements.tradeDate.value, + birth_datetime: `${birthDate}T${birthTime}`, + gender: document.querySelector("#accountBirthGender").value, + }); + event.currentTarget.reset(); + setText("birthProfileStatus", "已加密保存"); + document.querySelector("#deleteBirthProfileButton").disabled = false; + state.heavenInterpretations.fortune = ""; + await loadHeavenSetup(true); + showToast("个人命理资料已保存到当前账号"); + } catch (error) { + showToast(error.message || "个人命理资料保存失败"); + } finally { + button.disabled = false; + button.textContent = originalText; + } +} + +async function deleteAccountBirthProfile() { + if (!window.confirm("确定删除当前账号保存的个人命理资料吗?")) return; + try { + await apiRequest("/api/account/birth-profile", "DELETE"); + state.personalField = null; + state.heavenInterpretations.fortune = ""; + setText("birthProfileStatus", "尚未设置"); + document.querySelector("#deleteBirthProfileButton").disabled = true; + renderPersonalFortune(); + showToast("个人命理资料已删除"); + } catch (error) { + showToast(error.message || "个人命理资料删除失败"); + } +} + +function renderPersonalFortune() { + const container = document.querySelector("#personalFortuneResult"); + const empty = document.querySelector("#personalProfileEmpty"); + const personal = state.personalField; + if (!personal) { + empty.hidden = false; + container.hidden = true; + container.innerHTML = ""; + return; + } + empty.hidden = true; + container.hidden = false; + const tenGods = personal.ten_god_tendency || { favorable: [], caution: [] }; + const elementTendency = personal.balance_tendency || { favorable: [], caution: [] }; + const preferenceTags = (items) => (items || []).map((item) => `${escapeHtml(item)}`).join("") || "--"; + container.innerHTML = ` +
    +
    + 日主 + ${escapeHtml(personal.day_master?.stem || "--")} + ${escapeHtml(personal.day_master?.element || "--")} + ${escapeHtml(personal.day_master?.strength || "")} +
    +
    +
    十神喜恶
    偏宜

    ${preferenceTags(tenGods.favorable)}

    偏慎

    ${preferenceTags(tenGods.caution)}

    +
    五行喜忌
    偏喜

    ${preferenceTags(elementTendency.favorable)}

    偏忌

    ${preferenceTags(elementTendency.caution)}

    +
    +
    `; +} + +function renderHexagramLines(containerId, lines, includeEvidence = false) { + const container = document.querySelector(`#${containerId}`); + container.innerHTML = [...lines].reverse().map((line) => ` +
    + ${escapeHtml(line.position_name)} + ${hexagramLineGraphic(line.value)} +
    + ${escapeHtml(line.role || line.line_name)} · ${line.value}${line.moving ? " 变" : ""} + ${includeEvidence ? `${(line.evidence || []).map(escapeHtml).join(";")}` : `${escapeHtml(line.text || "")}`} +
    +
    + `).join(""); +} + +function hexagramLineGraphic(value) { + const yang = value % 2 === 1; + return ` + + ${yang ? "" : ""}${[6, 9].includes(value) ? `${value === 9 ? "○" : "×"}` : ""} + + `; +} + +const HEAVEN_READING_META = { + trend: { panel: "观势", action: "解势", done: "查看解势", status: "势已成" }, + fortune: { panel: "观气", action: "解运", done: "已解运", status: "气已定" }, + heart: { panel: "观心", action: "我已察念,开始解卦", done: "查看解卦", status: "卦已解" }, +}; + +function heavenReadingMeta(mode = state.heavenReadingMode) { + return HEAVEN_READING_META[mode] || HEAVEN_READING_META.trend; +} + +function heavenReadingAnimationData() { + const field = state.heavenSetup?.field || {}; + return { + yearPillar: field.pillars?.year || "", + movement: field.movement?.label || "", + sixQi: { + sitian: field.six_qi?.sitian || "", + zaiquan: field.six_qi?.zaiquan || "", + step: number(field.six_qi?.step) || 1, + }, + }; +} + +function syncHeavenReadingAnimation() { + const canvas = document.querySelector("#heavenReadingCanvas"); + const shouldRun = state.heavenReadingLoading && state.heavenReadingTab === "current"; + if (!canvas || !window.HeavenLoadingCanvas) return; + if (!shouldRun) { + stopHeavenReadingAnimation(); + return; + } + if (!heavenReadingAnimation) heavenReadingAnimation = new window.HeavenLoadingCanvas(canvas); + const scene = state.heavenReadingMode === "fortune" ? "fortune" : "hexagram"; + heavenReadingAnimation.start(scene, heavenReadingAnimationData()); +} + +function stopHeavenReadingAnimation() { + heavenReadingAnimation?.stop(); +} + +function finishHeavenReadingAnimation() { + if (!elements.heavenReadingDialog.open || !heavenReadingAnimation?.running) { + stopHeavenReadingAnimation(); + return Promise.resolve(); + } + return heavenReadingAnimation.complete(); +} + +function openHeavenReading(mode, options = {}) { + state.heavenReadingMode = mode; + state.heavenReadingTab = "current"; + state.heavenReadingError = options.error || ""; + state.heavenReadingLoading = Object.hasOwn(options, "loading") + ? Boolean(options.loading) + : false; + renderHeavenReadingDialog(); + openModalDialog(elements.heavenReadingDialog); + requestAnimationFrame(() => { + syncHeavenReadingAnimation(); + document.querySelector("#closeHeavenReadingDialog").focus(); + }); +} + +async function openHeavenHistory(mode) { + state.heavenReadingMode = mode; + state.heavenReadingTab = "history"; + state.heavenReadingSelectedId = 0; + renderHeavenReadingDialog(); + openModalDialog(elements.heavenReadingDialog); + await loadHeavenReadingHistory(mode); +} + +function selectHeavenReadingTab(tab) { + state.heavenReadingTab = tab === "history" ? "history" : "current"; + renderHeavenReadingDialog(); + if (state.heavenReadingTab === "history") loadHeavenReadingHistory(state.heavenReadingMode); +} + +async function loadHeavenReadingHistory(mode) { + const list = document.querySelector("#heavenReadingHistoryList"); + renderEmptyState(list, "正在读取历史记录"); + try { + const query = new URLSearchParams({ mode, limit: "100" }); + const payload = await apiRequest(`/api/heaven/readings?${query}`); + state.heavenReadingHistory[mode] = payload.items || []; + if (!state.heavenReadingHistory[mode].some((item) => number(item.id) === state.heavenReadingSelectedId)) { + state.heavenReadingSelectedId = number(state.heavenReadingHistory[mode][0]?.id); + } + renderHeavenReadingHistory(); + } catch (error) { + renderEmptyState(list, error.message || "历史记录加载失败"); + } +} + +function renderHeavenReadingDialog() { + const meta = heavenReadingMeta(); + setText("heavenReadingEyebrow", `问天 · ${meta.panel}`); + setText("heavenReadingDialogTitle", state.heavenReadingTab === "history" ? "历史记录" : meta.status); + document.querySelectorAll("[data-heaven-reading-tab]").forEach((button) => { + const active = button.dataset.heavenReadingTab === state.heavenReadingTab; + button.classList.toggle("active", active); + button.setAttribute("aria-selected", String(active)); + }); + document.querySelector("#heavenReadingCurrent").hidden = state.heavenReadingTab !== "current"; + document.querySelector("#heavenReadingHistory").hidden = state.heavenReadingTab !== "history"; + if (state.heavenReadingTab === "current") { + renderHeavenReadingCurrent(); + } else { + stopHeavenReadingAnimation(); + renderHeavenReadingHistory(); + } + refreshIcons(); +} + +function renderHeavenReadingCurrent() { + const reading = state.heavenInterpretations[state.heavenReadingMode]; + const loading = document.querySelector("#heavenReadingLoading"); + const empty = document.querySelector("#heavenReadingEmpty"); + const result = document.querySelector("#heavenReadingResult"); + const error = document.querySelector("#heavenReadingError"); + loading.hidden = !state.heavenReadingLoading; + syncHeavenReadingAnimation(); + error.hidden = !state.heavenReadingError; + error.textContent = state.heavenReadingError; + result.hidden = state.heavenReadingLoading || !reading; + empty.hidden = state.heavenReadingLoading || Boolean(reading) || Boolean(state.heavenReadingError); + if (!reading || state.heavenReadingLoading) return; + setText("heavenReadingResultStatus", heavenReadingMeta().status); + setText("heavenReadingSubject", reading.subject || `${heavenReadingMeta().panel}解读`); + setText("heavenReadingSubjectDetail", reading.subject_detail || displayCompactDate(reading.context_date || "")); + setText("heavenReadingCreatedAt", reading.created_at ? formatTimestamp(reading.created_at) : "刚刚完成"); + document.querySelector("#heavenReadingAnswer").innerHTML = formatMentorAnswer(reading.answer || ""); +} + +function renderHeavenReadingHistory() { + const mode = state.heavenReadingMode; + const items = state.heavenReadingHistory[mode] || []; + setText("heavenReadingHistoryTitle", `${heavenReadingMeta(mode).panel}记录`); + setText("heavenReadingHistoryCount", `${items.length} 条`); + const list = document.querySelector("#heavenReadingHistoryList"); + list.innerHTML = items.map((item) => ` + + `).join("") || emptyStateHtml("暂无历史解读"); + const selected = items.find((item) => number(item.id) === state.heavenReadingSelectedId); + const detail = document.querySelector("#heavenReadingHistoryDetail"); + detail.innerHTML = selected ? ` +
    ${escapeHtml(heavenReadingMeta(mode).status)}

    ${escapeHtml(selected.subject)}

    +

    ${escapeHtml(selected.subject_detail || displayCompactDate(selected.context_date))}

    +
    ${formatMentorAnswer(selected.answer || "")}
    +
    + ` : emptyStateHtml("选择一条记录查看完整解读"); + refreshIcons(); +} + +function handleHeavenHistorySelection(event) { + const button = event.target.closest("[data-heaven-reading-id]"); + if (!button) return; + state.heavenReadingSelectedId = number(button.dataset.heavenReadingId); + renderHeavenReadingHistory(); +} + +async function handleHeavenHistoryAction(event) { + const button = event.target.closest("[data-delete-heaven-reading]"); + if (!button || !window.confirm("确定删除这条解读记录吗?")) return; + const id = number(button.dataset.deleteHeavenReading); + try { + await apiRequest(`/api/heaven/readings/${id}`, "DELETE"); + const mode = state.heavenReadingMode; + state.heavenReadingHistory[mode] = (state.heavenReadingHistory[mode] || []).filter((item) => number(item.id) !== id); + if (number(state.heavenInterpretations[mode]?.id) === id) { + state.heavenInterpretations[mode] = ""; + if (mode === "fortune" && state.heavenSetup) state.heavenSetup.daily_fortune_reading = null; + updateHeavenInterpretationControls(); + } + state.heavenReadingSelectedId = number(state.heavenReadingHistory[mode][0]?.id); + renderHeavenReadingHistory(); + } catch (error) { + showToast(error.message || "解读记录删除失败"); + } +} + +async function interpretHeaven(mode) { + const existing = state.heavenInterpretations[mode]; + if (existing) { + openHeavenReading(mode, { loading: false }); + return; + } + const button = document.querySelector(mode === "trend" ? "#interpretTrendButton" : mode === "fortune" ? "#interpretFortuneButton" : "#interpretHeartButton"); + if (button.disabled) return; + state.heavenReadingMode = mode; + state.heavenReadingLoading = true; + state.heavenReadingError = ""; + openHeavenReading(mode, { loading: true }); + updateHeavenInterpretationControls(); + hideHeavenNotice(); + try { + const payload = { + mode, + trade_date: document.querySelector("#qiObservationDate").value || elements.tradeDate.value, + sector: state.heavenSetup?.chart?.sector || "", + stock_code: state.heavenSetup?.chart?.stock?.code || "", + }; + if (mode === "trend" && state.heavenManualData) payload.manual_data = state.heavenManualData; + if (mode === "heart") payload.lines = state.heartLines; + const result = await apiRequest("/api/heaven/interpret", "POST", payload); + state.heavenInterpretations[mode] = result.reading || { + answer: result.answer, + subject: `${heavenReadingMeta(mode).panel}解读`, + context_date: payload.trade_date, + created_at: new Date().toISOString(), + }; + state.heavenReadingHistory[mode] = []; + await finishHeavenReadingAnimation(); + state.heavenReadingLoading = false; + renderHeavenReadingDialog(); + if (result.notice) showHeavenNotice(result.notice); + if (mode === "heart") { + if (await transitionHeartStage("interpretation")) await playHeartReadSequence(); + } else { + renderHeavenInterpretation(mode, state.heavenInterpretations[mode]); + } + } catch (error) { + stopHeavenReadingAnimation(); + state.heavenReadingLoading = false; + state.heavenReadingError = error.message || "问天解读失败"; + renderHeavenReadingDialog(); + showHeavenNotice(state.heavenReadingError); + showToast(state.heavenReadingError); + } finally { + state.heavenReadingLoading = false; + updateHeavenInterpretationControls(); + } +} + +function updateHeavenInterpretationControls() { + const loading = state.heavenReadingLoading; + const trendButton = document.querySelector("#interpretTrendButton"); + const fortuneButton = document.querySelector("#interpretFortuneButton"); + const heartButton = document.querySelector("#interpretHeartButton"); + trendButton.disabled = loading || !state.heavenSetup?.chart?.available; + fortuneButton.disabled = loading || !state.heavenSetup?.field; + heartButton.disabled = loading || state.heartLines.length !== 6; + trendButton.textContent = loading && state.heavenReadingMode === "trend" ? "正在观势" : state.heavenInterpretations.trend ? HEAVEN_READING_META.trend.done : HEAVEN_READING_META.trend.action; + fortuneButton.textContent = loading && state.heavenReadingMode === "fortune" ? "正在察运" : state.heavenInterpretations.fortune ? HEAVEN_READING_META.fortune.done : HEAVEN_READING_META.fortune.action; + heartButton.textContent = loading && state.heavenReadingMode === "heart" ? "正在解卦" : state.heavenInterpretations.heart ? HEAVEN_READING_META.heart.done : HEAVEN_READING_META.heart.action; + document.querySelector("#viewHeartReadingButton").disabled = !state.heavenInterpretations.heart; +} + +function renderHeavenInterpretation() { + updateHeavenInterpretationControls(); +} + +function initializeHeartAtmosphere() { + const whisperContainer = document.querySelector("#heartWhispers"); + if (whisperContainer && !whisperContainer.children.length) { + whisperContainer.innerHTML = HEART_WHISPERS.map(([text, x, y, index]) => ` + ${escapeHtml(text)} + `).join(""); + } + activateHeartRises(document.querySelector(".heart-stage.active-heart-stage")); +} + +function toggleHeartSound() { + heartSound.enabled = !heartSound.enabled; + const button = document.querySelector("#heartSoundToggle"); + button.setAttribute("aria-pressed", String(heartSound.enabled)); + button.setAttribute("aria-label", heartSound.enabled ? "关闭观心声音" : "开启观心声音"); + button.innerHTML = `${heartSound.enabled ? "有声" : "静音"}`; + if (heartSound.enabled) { + heartSound.ensure(); + heartSound.chime(520); + } + refreshIcons(); +} + +function setHeartLamp(stage) { + const lamp = document.querySelector("#heartLamp"); + if (lamp) lamp.dataset.heartStage = stage; +} + +function startHeartDust() { + stopHeartDust(); + const canvas = document.querySelector("#heartDustCanvas"); + const panel = document.querySelector("#heavenHeartPanel"); + if (!canvas || !panel || !panel.clientWidth || !panel.clientHeight) return; + const context = canvas.getContext("2d"); + const ratio = Math.min(2, window.devicePixelRatio || 1); + const width = panel.clientWidth; + const height = panel.clientHeight; + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + canvas.style.height = `${height}px`; + context.setTransform(ratio, 0, 0, ratio, 0, 0); + if (!heartDustParticles.length) { + heartDustParticles = Array.from({ length: 60 }, (_, index) => ({ + x: Math.random(), + y: Math.random(), + radius: 0.6 + Math.random() * 1.5, + alpha: 0.03 + Math.random() * 0.09, + vx: (Math.random() - 0.5) * 0.00006, + vy: -(0.00002 + Math.random() * 0.00008), + phase: Math.random() * Math.PI * 2, + gold: index % 2 === 0, + })); + } + const draw = (now) => { + context.clearRect(0, 0, width, height); + heartDustParticles.forEach((particle) => { + if (motionEnabled()) { + particle.x += particle.vx; + particle.y += particle.vy; + particle.phase += 0.006; + } + if (particle.y < -0.02) { + particle.y = 1.02; + particle.x = Math.random(); + } + if (particle.x < -0.02) particle.x = 1.02; + if (particle.x > 1.02) particle.x = -0.02; + const alpha = particle.alpha * (0.65 + 0.35 * Math.sin(particle.phase)); + context.beginPath(); + context.arc(particle.x * width, particle.y * height, particle.radius, 0, Math.PI * 2); + context.fillStyle = particle.gold ? `rgba(220,195,140,${alpha})` : `rgba(190,200,225,${alpha * 0.8})`; + context.fill(); + }); + if (motionEnabled() && state.activeView === "heavenView" && state.heavenPanel === "heart") { + heartDustAnimationFrame = requestAnimationFrame(draw); + } else { + heartDustAnimationFrame = 0; + } + }; + heartDustAnimationFrame = requestAnimationFrame(draw); +} + +function stopHeartDust() { + if (heartDustAnimationFrame) cancelAnimationFrame(heartDustAnimationFrame); + heartDustAnimationFrame = 0; +} + +function activateHeartRises(stage) { + if (!stage) return; + stage.querySelectorAll(".heart-rise").forEach((item) => { + item.classList.remove("is-visible"); + const delay = motionEnabled() ? number(item.dataset.heartDelay) : 0; + setTimeout(() => { + if (stage.classList.contains("active-heart-stage")) item.classList.add("is-visible"); + }, delay); + }); +} + +async function transitionHeartStage(nextStage) { + const token = ++state.heartStageToken; + state.heartRevealToken += 1; + const current = document.querySelector(".heart-stage.active-heart-stage"); + current?.classList.add("is-leaving"); + if (current && !await waitForHeartMotion(1050, token)) return false; + state.heartStage = nextStage; + renderHeartStage(); + return token === state.heartStageToken; +} + +function waitForHeartMotion(duration, token = state.heartStageToken) { + return new Promise((resolve) => { + setTimeout(() => resolve(token === state.heartStageToken), motionEnabled() ? duration : 0); + }); +} + +async function startHeartBreathing() { + if (state.heartTimer) clearInterval(state.heartTimer); + state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000; + state.heartBreathingEndsAt = 0; + document.querySelector("#beginCastingButton")?.classList.remove("is-ready"); + if (!await transitionHeartStage("breathing")) return; + state.heartBreathingEndsAt = Date.now() + HEART_BREATH_TOTAL_MS; + const ember = document.querySelector("#heartIncenseEmber"); + heartIncenseAnimation?.cancel(); + ember?.classList.remove("is-burning"); + if (ember) void ember.offsetWidth; + ember?.classList.add("is-burning"); + heartIncenseAnimation = ember?.animate( + [{ top: "0%" }, { top: "100%" }], + { + duration: HEART_BREATH_ACTIVE_MS, + delay: HEART_BREATH_PREPARE_MS, + easing: "linear", + fill: "forwards", + }, + ) || null; + updateBreathingDisplay(); + state.heartTimer = setInterval(() => { + state.heartSeconds = Math.max(0, Math.ceil((state.heartBreathingEndsAt - Date.now()) / 1000)); + updateBreathingDisplay(); + if (state.heartSeconds <= 0) finishHeartBreathing(); + }, 200); +} + +function finishHeartBreathing() { + if (state.heartTimer) clearInterval(state.heartTimer); + state.heartTimer = null; + state.heartBreathingEndsAt = 0; + state.heartSeconds = 0; + updateBreathingDisplay(); + const button = document.querySelector("#beginCastingButton"); + button.disabled = false; + button.classList.add("is-ready"); + heartSound.chime(520); +} + +function updateBreathingDisplay() { + const remainingMs = state.heartBreathingEndsAt + ? Math.max(0, state.heartBreathingEndsAt - Date.now()) + : Math.max(0, state.heartSeconds * 1000); + const elapsedMs = HEART_BREATH_TOTAL_MS - remainingMs; + const activeElapsedMs = Math.max(0, elapsedMs - HEART_BREATH_PREPARE_MS); + const cycleElapsedMs = activeElapsedMs % HEART_BREATH_CYCLE_MS; + const breathPhase = elapsedMs < HEART_BREATH_PREPARE_MS + ? "prepare" + : cycleElapsedMs < HEART_BREATH_INHALE_MS + ? "inhale" + : cycleElapsedMs < HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS + ? "hold" + : "exhale"; + const phase = state.heartSeconds <= 0 ? "settled" : breathPhase; + const scene = document.querySelector("#breathingScene"); + scene.dataset.phase = phase; + setText("breathingPhase", phase === "settled" ? "静" : phase === "prepare" ? "静" : phase === "inhale" ? "吸" : phase === "hold" ? "顿" : "呼"); + const prompt = state.heartSeconds <= 0 + ? "静心已成,可以起卦" + : phase === "prepare" + ? "放松片刻,准备呼吸" + : phase === "hold" + ? "停驻片刻,让念头自然沉下" + : activeElapsedMs < 18_000 + ? phase === "inhale" ? "缓慢吸气,放下对答案的预设" : "缓慢呼气,让预设随之松开" + : activeElapsedMs < 36_000 + ? phase === "inhale" ? "吸气,只留下真正想问的事" : "呼气,不急着寻找答案" + : phase === "inhale" ? "吸气,让心停在此刻" : "呼气,不追逐经过的念头"; + setText("breathingPrompt", prompt); +} + +async function beginHeartCasting() { + if (state.heartSeconds > 0) return; + state.heartLines = []; + state.heartThrows = []; + state.heartHexagram = null; + state.heavenInterpretations.heart = ""; + heartCastingBusy = false; + resetHeartCoins(); + await transitionHeartStage("casting"); +} + +function initializeHeartCoinHold() { + const button = document.querySelector("#tossCoinsButton"); + const coins = [...document.querySelectorAll(".heart-coin")]; + const cancelHold = (cancelled = true) => { + if (heartHoldTimer) clearTimeout(heartHoldTimer); + heartHoldTimer = null; + cancelAnimationFrame(heartHoldAnimationFrame); + heartHoldAnimationFrame = 0; + button.classList.remove("is-holding"); + button.style.setProperty("--hold-progress", "0turn"); + coins.forEach((coin) => coin.classList.remove("is-shaking")); + if (cancelled) heartHoldStartedAt = 0; + }; + button.addEventListener("pointerdown", (event) => { + if (button.disabled || heartCastingBusy || (event.button !== 0 && event.pointerType !== "touch")) return; + event.preventDefault(); + heartSound.ensure(); + heartHoldTriggered = false; + heartHoldStartedAt = performance.now(); + button.setPointerCapture?.(event.pointerId); + button.classList.add("is-holding"); + coins.forEach((coin) => coin.classList.add("is-shaking")); + const charge = () => { + if (!heartHoldStartedAt) return; + const progress = Math.min(1, (performance.now() - heartHoldStartedAt) / 1400); + button.style.setProperty("--hold-progress", `${progress}turn`); + if (progress < 1) heartHoldAnimationFrame = requestAnimationFrame(charge); + }; + heartHoldAnimationFrame = requestAnimationFrame(charge); + }); + button.addEventListener("pointerup", async () => { + if (!heartHoldStartedAt) return; + const heldFor = performance.now() - heartHoldStartedAt; + heartHoldStartedAt = 0; + cancelHold(false); + heartHoldTriggered = true; + if (heldFor < 550) await waitForMotion(550 - heldFor); + await tossHeartCoins(); + }); + button.addEventListener("pointercancel", () => cancelHold(true)); + button.addEventListener("click", (event) => { + if (heartHoldTriggered) { + heartHoldTriggered = false; + event.preventDefault(); + return; + } + if (event.detail === 0 && !heartCastingBusy) tossHeartCoins(); + }); +} + +async function tossHeartCoins() { + if (heartCastingBusy) return; + if (state.heartLines.length >= 6) { + heartCastingBusy = true; + await finalizeHeartHexagram(); + return; + } + const stageToken = state.heartStageToken; + const button = document.querySelector("#tossCoinsButton"); + heartCastingBusy = true; + button.disabled = true; + const random = new Uint32Array(3); + crypto.getRandomValues(random); + const coins = [...random].map((value) => value % 2 === 1); + await animateHeartCoins(coins); + if (stageToken !== state.heartStageToken || state.heartStage !== "casting") { + heartCastingBusy = false; + return; + } + const heads = coins.filter(Boolean).length; + const lineValue = 6 + heads; + state.heartLines.push(lineValue); + state.heartThrows.push(coins.map((head) => head ? "正" : "背")); + renderHeartCasting(); + if (state.heartLines.length === 6) { + await finalizeHeartHexagram(); + } else { + await waitForMotion(720); + heartCastingBusy = false; + button.disabled = false; + } +} + +async function animateHeartCoins(results) { + const coinElements = [...document.querySelectorAll(".heart-coin")]; + setText("castingPrompt", "铜钱离手"); + const animations = coinElements.map((coin, index) => { + coin.getAnimations().forEach((animation) => animation.cancel()); + const inner = coin.querySelector(".heart-coin-inner"); + inner.getAnimations().forEach((animation) => animation.cancel()); + const current = heartCoinRotations[index]; + const faceRotation = results[index] ? 0 : 180; + const delta = ((faceRotation - (current % 360)) + 360) % 360; + const target = current + 1440 + index * 360 + delta; + heartCoinRotations[index] = target; + const duration = motionEnabled() ? 1500 + index * 160 : 10; + const delay = motionEnabled() ? index * 150 : 0; + coin.dataset.face = results[index] ? "front" : "back"; + const spin = inner.animate( + [{ transform: `rotateY(${current}deg)` }, { transform: `rotateY(${target}deg)` }], + { duration, delay, easing: "cubic-bezier(.25,.55,.3,1)", fill: "forwards" }, + ); + const tilt = Math.random() * 10 - 5; + const flight = coin.animate([ + { transform: "translateY(0) rotateZ(0deg)" }, + { transform: `translateY(-30vh) rotateZ(${tilt}deg)`, offset: 0.42 }, + { transform: `translateY(0) rotateZ(${tilt}deg)`, offset: 0.78 }, + { transform: "translateY(-13px) rotateZ(0deg)", offset: 0.9 }, + { transform: "translateY(0) rotateZ(0deg)" }, + ], { duration, delay, easing: "cubic-bezier(.3,.6,.35,1)", fill: "forwards" }); + setTimeout(() => { + const ring = coin.querySelector(".heart-coin-ring"); + ring.classList.remove("is-bursting"); + void ring.offsetWidth; + ring.classList.add("is-bursting"); + heartSound.coin(); + }, delay + duration * 0.79); + return Promise.allSettled([spin.finished, flight.finished]); + }); + await Promise.all(animations); + setText("castingPrompt", "听其落定"); + await waitForMotion(420); +} + +async function finalizeHeartHexagram() { + const stageToken = state.heartStageToken; + const button = document.querySelector("#tossCoinsButton"); + button.disabled = true; + button.textContent = "正在成卦"; + try { + const payload = await apiRequest("/api/heaven/hexagram", "POST", { lines: state.heartLines }); + if (stageToken !== state.heartStageToken || state.heartStage !== "casting") return; + state.heartHexagram = payload.hexagram; + updateHeavenInterpretationControls(); + document.querySelector(".heart-hexagram-shell")?.classList.add("is-complete"); + setText("castingPrompt", "卦成了"); + heartSound.chime(660); + await waitForMotion(2200); + if (!await transitionHeartStage("reveal")) return; + await playHeartRevealSequence(); + } catch (error) { + showHeavenNotice(error.message || "成卦失败"); + button.disabled = false; + button.innerHTML = '按住
    重新成卦
    '; + heartCastingBusy = false; + } +} + +function renderHeartStage() { + document.querySelectorAll(".heart-stage").forEach((stage) => stage.classList.remove("active-heart-stage")); + const stageMap = { + intro: "heartIntro", + breathing: "heartBreathing", + casting: "heartCasting", + reveal: "heartReveal", + interpretation: "heartInterpretationStage", + }; + document.querySelectorAll(".heart-stage").forEach((stage) => stage.classList.remove("is-leaving")); + const activeStage = document.querySelector(`#${stageMap[state.heartStage]}`); + activeStage.classList.add("active-heart-stage"); + document.querySelectorAll("[data-heart-step]").forEach((step) => { + step.classList.toggle("active", step.dataset.heartStep === state.heartStage); + }); + setHeartLamp(state.heartStage); + activateHeartRises(activeStage); + if (state.heartStage === "breathing") { + document.querySelector("#beginCastingButton").disabled = state.heartSeconds > 0; + updateBreathingDisplay(); + } + if (state.heartStage === "casting") renderHeartCasting(); + if (state.heartStage === "reveal" && state.heartHexagram) renderHeartReveal(); + if (state.heartStage === "interpretation" && state.heartHexagram) renderHeartRead(); +} + +function renderHeartCasting() { + setText("castingProgress", `${state.heartLines.length} / 6`); + const latestThrow = state.heartThrows[state.heartThrows.length - 1] || ["静", "静", "静"]; + document.querySelectorAll(".heart-coin").forEach((coin, index) => { + coin.setAttribute("aria-label", latestThrow[index] === "静" ? `第 ${index + 1} 枚铜钱待掷` : `第 ${index + 1} 枚铜钱${latestThrow[index]}`); + }); + const nextPosition = LINE_POSITIONS_CLIENT[state.heartLines.length] || "成卦"; + setText( + "castingPrompt", + state.heartLines.length < 6 + ? `心中默念所问之事,然后掷出${nextPosition}` + : "六爻已具,正在成卦", + ); + const button = document.querySelector("#tossCoinsButton"); + button.innerHTML = state.heartLines.length < 6 + ? `按住
    摇${nextPosition}
    ` + : '正在
    成卦
    '; + button.disabled = heartCastingBusy || state.heartLines.length >= 6; + const rows = []; + for (let index = 5; index >= 0; index -= 1) { + const value = state.heartLines[index]; + rows.push(` +
    + ${LINE_POSITIONS_CLIENT[index]} + ${value ? hexagramLineGraphic(value) : ''} +
    ${value ? `${lineValueName(value)} · ${value}` : "未得"}
    +
    + `); + } + document.querySelector("#heartCastingLines").innerHTML = rows.join(""); +} + +function renderHeartReveal() { + const hexagram = state.heartHexagram; + setText("heartHexagramName", `${hexagram.outer_trigram}上${hexagram.inner_trigram}下 · ${hexagram.name}`); + setText("heartTransformedName", hexagram.transformed.name); + setText("heartHexagramText", hexagram.text); + renderHexagramLines("heartHexagramLines", hexagram.lines, false); + document.querySelector("#heartHexagramLines").querySelectorAll(".hexagram-line-row").forEach((row) => row.classList.add("heart-reveal-line")); + document.querySelector("#heartReveal").classList.remove("is-sequence-ready", "is-title-ready", "is-thought-typing", "is-thought-ready"); + const prompt = document.querySelector("#heartFirstThoughtPrompt"); + prompt.dataset.fullText = "看见卦象与爻辞后,心里升起的第一念是什么?"; + prompt.textContent = ""; + const button = document.querySelector("#interpretHeartButton"); + button.disabled = true; + button.classList.remove("is-ready"); +} + +async function playHeartRevealSequence() { + const token = ++state.heartRevealToken; + const stageToken = state.heartStageToken; + const stage = document.querySelector("#heartReveal"); + const lines = [...stage.querySelectorAll(".heart-reveal-line")].reverse(); + lines.forEach((line) => line.classList.remove("is-revealed")); + if (!await waitForHeartMotion(280, stageToken)) return; + for (const line of lines) { + if (token !== state.heartRevealToken || state.heartStage !== "reveal") return; + line.classList.add("is-revealed"); + if (!await waitForHeartMotion(520, stageToken)) return; + } + stage.classList.add("is-title-ready", "is-sequence-ready"); + heartSound.chime(520); + if (!await waitForHeartMotion(1200, stageToken)) return; + const prompt = document.querySelector("#heartFirstThoughtPrompt"); + stage.classList.add("is-thought-typing"); + if (!await typeHeartText(prompt, prompt.dataset.fullText, token, 72)) return; + stage.classList.add("is-thought-ready"); + if (!await waitForHeartMotion(2400, stageToken)) return; + const button = document.querySelector("#interpretHeartButton"); + button.disabled = false; + button.classList.add("is-ready"); +} + +function initializeHeartLineInspection() { + const container = document.querySelector("#heartLineTexts"); + container.addEventListener("click", (event) => { + const item = event.target.closest(".heart-line-text"); + if (!item) return; + const inspected = item.classList.toggle("is-inspected"); + item.setAttribute("aria-expanded", String(inspected)); + }); +} + +async function typeHeartText(element, text, token, speed = 72) { + if (!element) return false; + if (!motionEnabled()) { + element.textContent = text; + return true; + } + element.textContent = ""; + element.classList.add("heart-typing"); + for (const character of text) { + if (token !== state.heartRevealToken || state.heartStage !== "reveal") return false; + element.append(document.createTextNode(character)); + await new Promise((resolve) => setTimeout(resolve, speed)); + } + element.classList.remove("heart-typing"); + return true; +} + +function renderHeartRead() { + const hexagram = state.heartHexagram; + setText("heartReadTitle", hexagram.name); + setText("heartReadChange", hexagram.transformed.name === hexagram.name ? "六爻安静,无之卦" : `之卦 · ${hexagram.transformed.name}`); + setText("heartReadGuaci", hexagram.text); + document.querySelector("#heartReadLines").innerHTML = [...hexagram.lines].reverse().map((line) => ` +
    + ${escapeHtml(line.position_name)}${hexagramLineGraphic(line.value)} +
    + `).join(""); + document.querySelector("#heartReadTexts").innerHTML = hexagram.lines.map((line) => ` +
    + ${escapeHtml(line.line_name)}${line.moving ? " · 动" : ""}

    ${escapeHtml(line.text)}

    +
    + `).join(""); + renderHeavenInterpretation("heart", state.heavenInterpretations.heart); + const stage = document.querySelector("#heartInterpretationStage"); + stage.classList.remove("is-read-heading-ready", "is-read-complete"); +} + +async function playHeartReadSequence() { + const token = state.heartStageToken; + const stage = document.querySelector("#heartInterpretationStage"); + if (!await waitForHeartMotion(420, token)) return; + stage.classList.add("is-read-heading-ready"); + const lines = [...stage.querySelectorAll(".heart-read-line")].reverse(); + const texts = [...stage.querySelectorAll(".heart-read-text")]; + for (let index = 0; index < 6; index += 1) { + lines[index]?.classList.add("is-visible"); + texts[index]?.classList.add("is-visible"); + if (!await waitForHeartMotion(680, token)) return; + } + stage.classList.add("is-read-complete"); +} + +function resetHeartCoins() { + heartCoinRotations.fill(0); + document.querySelectorAll(".heart-coin").forEach((coin) => { + coin.getAnimations().forEach((animation) => animation.cancel()); + const inner = coin.querySelector(".heart-coin-inner"); + inner.getAnimations().forEach((animation) => animation.cancel()); + inner.style.transform = ""; + coin.style.transform = ""; + coin.dataset.face = ""; + coin.querySelector(".heart-coin-ring").classList.remove("is-bursting"); + }); + const shell = document.querySelector(".heart-hexagram-shell"); + shell?.classList.remove("is-complete"); +} + +async function resetHeartRitual() { + if (state.heartTimer) clearInterval(state.heartTimer); + state.heartTimer = null; + state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000; + state.heartBreathingEndsAt = 0; + state.heartLines = []; + state.heartThrows = []; + state.heartHexagram = null; + state.heavenInterpretations.heart = ""; + heartIncenseAnimation?.cancel(); + heartIncenseAnimation = null; + document.querySelector("#heartIncenseEmber")?.classList.remove("is-burning"); + updateHeavenInterpretationControls(); + state.heartRevealToken += 1; + heartCastingBusy = false; + resetHeartCoins(); + hideHeavenNotice(); + await transitionHeartStage("intro"); +} + +function showHeavenNotice(message) { + const notice = document.querySelector("#heavenNotice"); + notice.textContent = message; + notice.hidden = false; +} + +function hideHeavenNotice() { + document.querySelector("#heavenNotice").hidden = true; +} + +function phaseClass(element) { + return { 木: "wood", 火: "fire", 土: "earth", 金: "metal", 水: "water" }[element] || "earth"; +} + +function signedScore(value) { + const parsed = number(value); + return `${parsed > 0 ? "+" : ""}${formatNumber(parsed, 2)}`; +} + +function lineValueName(value) { + return { 6: "老阴", 7: "少阳", 8: "少阴", 9: "老阳" }[value] || ""; +} + +function capitalize(value) { + return value.charAt(0).toUpperCase() + value.slice(1); +} + +const LINE_POSITIONS_CLIENT = ["初爻", "二爻", "三爻", "四爻", "五爻", "上爻"]; + +/* PRESERVATION-SOURCE-END app.js:4828-6667 */ diff --git a/app/frontend/pages/ladder/page.js b/app/frontend/pages/ladder/page.js new file mode 100644 index 0000000..fe11fdf --- /dev/null +++ b/app/frontend/pages/ladder/page.js @@ -0,0 +1,96 @@ +window.XiaobaiPageModules.register("ladder", ["ladderView"]); + +/* PRESERVATION-SOURCE-BEGIN app.js:2125-2216 */ +function renderLadderMini(ladders) { + const container = document.querySelector("#ladderMini"); + const highest = ladders.length ? Math.max(...ladders.map((item) => number(item.level))) : 0; + setText("maxHeight", highest ? `最高 ${highest} 板` : "暂无"); + container.innerHTML = ladders.slice(0, 5).map((group) => { + const allNames = group.stocks.map((stock) => stock.name).filter(Boolean); + const visibleNames = allNames.slice(0, 3).join("、"); + const suffix = allNames.length > 3 ? ` 等 ${number(group.count)} 只` : ""; + return `
    +
    ${escapeHtml(group.label)}${number(group.count)} 只
    +

    ${escapeHtml(visibleNames || "--")}${suffix}

    +
    `; + }).join("") || emptyStateHtml("暂无梯队数据"); +} + +function renderSectorMini(sectors) { + document.querySelector("#sectorMini").innerHTML = sectors.slice(0, 7).map((sector) => ` +
    ${escapeHtml(sector.name)}${number(sector.count)}
    + `).join("") || emptyStateHtml("暂无板块数据"); +} + +function renderLadderBoard(ladders) { + const container = document.querySelector("#ladderBoard"); + const insights = document.querySelector("#ladderInsights"); + const ordered = [...ladders].sort((left, right) => number(right.level) - number(left.level)); + const maxLevel = ordered.length ? Math.max(...ordered.map((group) => number(group.level))) : 0; + const topVisibleLevel = Math.max(5, maxLevel); + const groupMap = new Map(ordered.map((group) => [number(group.level), group])); + const displayGroups = Array.from({ length: topVisibleLevel }, (_, index) => { + const level = topVisibleLevel - index; + return groupMap.get(level) || { level, label: level === 1 ? "首板" : level === 5 && maxLevel < 5 ? "5板+" : `${level}板`, count: 0, stocks: [] }; + }); + const total = ordered.reduce((sum, group) => sum + number(group.count), 0); + const spaceStocks = ordered.find((group) => number(group.level) === maxLevel)?.stocks || []; + const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); + const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); + setText("ladderDateRange", `数据日期 ${currentDate}`); + container.innerHTML = displayGroups.map((group) => { + const level = number(group.level); + const limit = level === 1 || level === 2 ? 8 : 99; + const expanded = state.expandedLadderLevels.has(level); + const groupStocks = [...(group.stocks || [])].sort((left, right) => { + if (state.ladderSortMode === "open") { + return number(left.open_times) - number(right.open_times) + || String(left.first_time || "99:99:99").localeCompare(String(right.first_time || "99:99:99")); + } + return String(left.first_time || "99:99:99").localeCompare(String(right.first_time || "99:99:99")); + }); + const stocks = expanded ? groupStocks : groupStocks.slice(0, limit); + const remaining = Math.max(0, groupStocks.length - stocks.length); + const label = group.label || (level === 1 ? "首板" : level === 5 && maxLevel < 5 ? "5板+" : `${level}板`); + const color = { 1: "#2563eb", 2: "#16a34a", 3: "#d97706", 4: "#e04536" }[level] || "#9ca3af"; + return ` +
    +
    ${escapeHtml(label)}
    ${number(group.count)} 只
    ${number(group.count) && level > 1 ? `
    ${escapeHtml(label)} · ${formatNumber(number(group.count) / Math.max(number(groupMap.get(level - 1)?.count), 1) * 100, 1)}%
    ` : ""}
    +
    ${stocks.length ? stocks.map((stock) => { + const onePrice = String(stock.first_time || "").startsWith("09:25") && number(stock.open_times) === 0; + const broken = number(stock.open_times) >= 6; + const amount = number(stock.seal_amount_million) ? `封单 ${formatNumber(stock.seal_amount_million, 0)} 万` : `成交 ${formatNumber(stock.amount_billion, 1)} 亿`; + return ``; + }).join("") : `
    ${level >= maxLevel ? `断层 · ${escapeHtml(label)}及以上空缺` : "该层暂时空缺"}
    `}${groupStocks.length > limit ? `` : ""}
    +
    `; + }).join(""); + const structureRows = displayGroups.filter((group) => number(group.count) || number(group.level) <= maxLevel + 1); + const maxCount = Math.max(1, ...structureRows.map((group) => number(group.count))); + const rateRows = (state.dashboard?.limit_performance || []).map((row) => ({ + label: `${row.label || (number(row.level) === 1 ? "昨日首板" : `昨日${number(row.level)}板`)} → 今日`, + value: clamp(number(row.advance_rate), 0, 100), + })); + const previousMax = Math.max(0, ...(state.dashboard?.yesterday_limits || []).map((row) => number(row.prior_streak))); + const spaceChange = previousMax && maxLevel < previousMax ? `较昨日 ${previousMax} 板 ↓ 空间压缩` : previousMax && maxLevel > previousMax ? `较昨日 ${previousMax} 板 ↑ 高度抬升` : "高度与昨日接近"; + const spaceNote = maxLevel >= 5 ? "高位梯队仍有辨识度,重点观察承接而非单看高度。" : maxLevel >= 3 ? "空间位于中段,梯队延续性比绝对高度更重要。" : "高度受到压缩,先观察首板向二板的结构修复。"; + const strongestGroup = structureRows.reduce((best, group) => number(group.count) > number(best?.count) ? group : best, structureRows[0]); + insights.innerHTML = ` +

    空间板

    市场高度
    ${maxLevel ? `${maxLevel} 板` : "--"}${escapeHtml(spaceChange)}

    ${spaceStocks.length ? spaceStocks.map((stock) => `${escapeHtml(stock.name)}(${escapeHtml(stock.sector || "其他")})`).join(" · ") : "暂无空间板"}

    ${spaceNote}

    +

    梯队结构

    完整度
    ${structureRows.map((group) => `
    ${escapeHtml(group.label || `${number(group.level)}板`)}${number(group.count) ? `${number(group.count)} 只` : "断层"}
    `).join("")}

    断层越少,梯队从低位向高位传导越连贯。当前腰部为 ${escapeHtml(strongestGroup?.label || "--")}

    +

    晋级率参考

    昨日梯队 → 今日
    ${rateRows.length ? rateRows.map((row) => `
    ${escapeHtml(row.label)}${formatNumber(row.value, 1)}%
    `).join("") : '
    暂无可比梯队
    '}
    数据来自“涨停表现”页 · 昨日梯队样本
    `; + container.querySelectorAll("[data-ladder-level]").forEach((button) => { + button.addEventListener("click", () => { + const level = number(button.dataset.ladderLevel); + if (state.expandedLadderLevels.has(level)) state.expandedLadderLevels.delete(level); + else state.expandedLadderLevels.add(level); + renderLadderBoard(state.dashboard?.ladders || []); + }); + }); + bindStockRows(container); + refreshIcons(); +} + +/* PRESERVATION-SOURCE-END app.js:2125-2216 */ diff --git a/app/frontend/pages/market/runtime.js b/app/frontend/pages/market/runtime.js new file mode 100644 index 0000000..f9b4153 --- /dev/null +++ b/app/frontend/pages/market/runtime.js @@ -0,0 +1,1333 @@ +/* PRESERVATION-SOURCE-BEGIN app.js:1916-1957 */ +function renderMarketBreadth(overview) { + const up = number(overview.up_count); + const down = number(overview.down_count); + const flat = Math.max(0, number(overview.flat_count)); + const total = Math.max(1, up + down + flat); + const upRate = up / total * 100; + const flatRate = flat / total * 100; + const downRate = down / total * 100; + const panel = document.querySelector(".market-breadth-panel"); + panel.classList.remove("breadth-enter"); + void panel.offsetWidth; + panel.classList.add("breadth-enter"); + setText("breadthDataTime", dashboardDataTimestamp(state.dashboard?.meta || {})); + animateMetric("breadthRatio", upRate, (value) => `${formatNumber(value, 1)}%`); + animateMetric("breadthUpCount", up, (value) => formatNumber(Math.round(value))); + animateMetric("breadthDownCount", down, (value) => formatNumber(Math.round(value))); + setText("breadthUpLegend", `${formatNumber(up)}(${formatNumber(upRate, 1)}%)`); + setText("breadthFlatLegend", `${formatNumber(flat)}(${formatNumber(flatRate, 1)}%)`); + setText("breadthDownLegend", `${formatNumber(down)}(${formatNumber(downRate, 1)}%)`); + document.querySelector("#breadthFlatLegendItem").hidden = flat === 0; + const limitUp = number(overview.limit_up_count); + const limitDown = number(overview.limit_down_count); + const breadthLabel = upRate < 20 ? "宽度极差" : upRate < 40 ? "宽度偏弱" : upRate < 55 ? "宽度均衡" : "宽度偏强"; + setText("breadthWarning", `△ ${breadthLabel},涨跌停 ${limitUp}:${limitDown}`); + const bars = [ + ["breadthUpBar", upRate], + ["breadthFlatBar", flatRate], + ["breadthDownBar", downRate], + ]; + bars.forEach(([id, width]) => { + const bar = document.getElementById(id); + const targetWidth = `${Math.max(width, width > 0 ? 0.8 : 0)}%`; + bar.style.transition = "none"; + bar.style.width = "0%"; + requestAnimationFrame(() => requestAnimationFrame(() => { + bar.style.transition = "width 760ms var(--ease-out)"; + bar.style.width = targetWidth; + })); + bar.title = `${formatNumber(width, 1)}%`; + }); +} + +/* PRESERVATION-SOURCE-END app.js:1916-1957 */ +/* PRESERVATION-SOURCE-BEGIN app.js:6893-7719 */ +function currentChartPalette() { + const style = getComputedStyle(document.documentElement); + const color = (token, fallback) => style.getPropertyValue(token).trim() || fallback; + return { + background: color("--chart-background", "#fbfcfd"), + grid: color("--chart-grid", "#e2e8ec"), + axis: color("--chart-axis", "#6c7983"), + zero: color("--chart-zero", "#aeb7c1"), + line: color("--chart-line", "#1d65c1"), + average: color("--chart-average", "#b7791f"), + up: color("--chart-up", "#c93f45"), + down: color("--chart-down", "#087a55"), + upVolume: color("--chart-up-volume", "rgba(201, 63, 69, .58)"), + downVolume: color("--chart-down-volume", "rgba(8, 122, 85, .58)"), + area: color("--chart-area", "rgba(37, 99, 235, .07)"), + alertArea: color("--chart-alert-area", "rgba(224, 69, 54, .05)"), + movingAverage: color("--chart-moving-average", "#d1d5db"), + repair: color("--chart-repair", "#f59e0b"), + ma10: color("--chart-ma-10", "#a76500"), + ma20: color("--chart-ma-20", "#626c78"), + }; +} + +function drawCandlestick(context, x, item, priceY, candleWidth, palette = currentChartPalette()) { + const rising = number(item.close) >= number(item.open); + const color = rising ? palette.up : palette.down; + const highY = priceY(item.high); + const lowY = priceY(item.low); + const openY = priceY(item.open); + const closeY = priceY(item.close); + const bodyTop = Math.min(openY, closeY); + const bodyBottom = Math.max(openY, closeY); + const bodyHeight = Math.max(1, bodyBottom - bodyTop); + + context.strokeStyle = color; + context.fillStyle = color; + context.lineWidth = 1; + context.beginPath(); + context.moveTo(x, highY); + context.lineTo(x, bodyTop); + context.moveTo(x, bodyBottom); + context.lineTo(x, lowY); + context.stroke(); + + const bodyLeft = x - candleWidth / 2; + if (rising) { + context.fillStyle = palette.background; + context.fillRect(bodyLeft, bodyTop, candleWidth, bodyHeight); + context.strokeStyle = color; + context.strokeRect(bodyLeft, bodyTop, candleWidth, bodyHeight); + } else { + context.fillStyle = color; + context.fillRect(bodyLeft, bodyTop, candleWidth, bodyHeight); + } + return color; +} + +function drawPriceChart(prices) { + const canvas = elements.priceChart; + if (!prices?.length) { + clearPriceChart("暂无日 K 数据"); + return; + } + const rect = canvas.getBoundingClientRect(); + const ratio = window.devicePixelRatio || 1; + const width = Math.max(320, rect.width); + const height = Math.max(220, rect.height); + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + + const left = 48; + const right = 12; + const top = 14; + const bottom = 22; + const volumeHeight = 54; + const gap = 12; + const priceBottom = height - bottom - volumeHeight - gap; + const plotWidth = width - left - right; + const highs = prices.map((item) => number(item.high)); + const lows = prices.map((item) => number(item.low)); + const maximum = Math.max(...highs); + const minimum = Math.min(...lows); + const range = Math.max(maximum - minimum, maximum * 0.01, 0.01); + const volumes = prices.map((item) => number(item.volume)); + const maxVolume = Math.max(...volumes, 1); + const priceY = (value) => top + (maximum - value) / range * (priceBottom - top); + const step = plotWidth / prices.length; + const candleWidth = clamp(step * 0.62, 2, 8); + + context.strokeStyle = palette.grid; + context.fillStyle = palette.axis; + context.font = "11px Microsoft YaHei"; + context.textAlign = "right"; + for (let line = 0; line <= 4; line += 1) { + const y = top + (priceBottom - top) * line / 4; + context.beginPath(); + context.moveTo(left, y); + context.lineTo(width - right, y); + context.stroke(); + context.fillText((maximum - range * line / 4).toFixed(2), left - 5, y + 4); + } + + prices.forEach((item, index) => { + const x = left + step * index + step / 2; + const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); + const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; + context.fillStyle = color; + context.globalAlpha = 0.75; + context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); + context.globalAlpha = 1; + }); + + context.textAlign = "center"; + context.fillStyle = palette.axis; + const labelIndexes = [0, Math.floor((prices.length - 1) / 2), prices.length - 1]; + labelIndexes.forEach((index) => { + const x = left + step * index + step / 2; + context.fillText(String(prices[index].trade_date).slice(5), x, height - 5); + }); +} + +function clearPriceChart(message) { + const canvas = elements.priceChart; + const context = canvas.getContext("2d"); + const rect = canvas.getBoundingClientRect(); + canvas.width = Math.max(320, Math.round(rect.width)); + canvas.height = Math.max(220, Math.round(rect.height)); + const palette = currentChartPalette(); + context.fillStyle = palette.background; + context.fillRect(0, 0, canvas.width, canvas.height); + context.fillStyle = palette.axis; + context.font = "13px Microsoft YaHei"; + context.textAlign = "center"; + context.fillText(message, canvas.width / 2, canvas.height / 2); +} + +function prepareStockPreviewCanvas() { + const canvas = elements.stockPreviewChart; + const rect = canvas.getBoundingClientRect(); + const ratio = window.devicePixelRatio || 1; + const width = Math.max(300, rect.width || 488); + const height = Math.max(210, rect.height || 232); + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + context.font = '11px -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", sans-serif'; + return { canvas, context, width, height, palette }; +} + +function drawPreviewGrid(context, width, top, bottom, left, right, maximum, range) { + const palette = currentChartPalette(); + context.strokeStyle = palette.grid; + context.fillStyle = palette.axis; + context.textAlign = "right"; + context.lineWidth = 1; + for (let line = 0; line <= 3; line += 1) { + const y = top + (bottom - top) * line / 3; + context.beginPath(); + context.moveTo(left, y); + context.lineTo(width - right, y); + context.stroke(); + context.fillText((maximum - range * line / 3).toFixed(2), left - 5, y + 4); + } +} + +function intradayMinuteOffset(value) { + const [hour, minute] = String(value || "").split(":").map((part) => number(part)); + const clockMinute = hour * 60 + minute; + const morningStart = 9 * 60 + 30; + const morningEnd = 11 * 60 + 30; + const afternoonStart = 13 * 60; + const afternoonEnd = 15 * 60; + if (clockMinute <= morningEnd) return clamp(clockMinute - morningStart, 0, 120); + if (clockMinute < afternoonStart) return 120; + return 120 + clamp(clockMinute - afternoonStart, 0, afternoonEnd - afternoonStart); +} + +function drawIntradayCanvas(canvas, points, dailyPrices = [], referenceClose = 0) { + const rect = canvas.getBoundingClientRect(); + const ratio = window.devicePixelRatio || 1; + const width = Math.max(300, rect.width || 488); + const height = Math.max(210, rect.height || 232); + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + context.font = '11px -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", sans-serif'; + const left = 45; + const right = 10; + const top = 12; + const volumeHeight = 38; + const bottom = 18; + const gap = 9; + const priceBottom = height - bottom - volumeHeight - gap; + const closes = points.map((point) => number(point.close)); + const previousClose = number(referenceClose || dailyPrices.at(-2)?.close || points[0]?.open || closes[0]); + const maximum = Math.max(...points.map((point) => number(point.high || point.close)), previousClose); + const minimum = Math.min(...points.map((point) => number(point.low || point.close)), previousClose); + const deviation = Math.max( + Math.abs(maximum - previousClose), + Math.abs(previousClose - minimum), + previousClose * 0.003, + 0.01, + ) * 1.08; + const chartMaximum = previousClose + deviation; + const chartMinimum = previousClose - deviation; + const range = Math.max(chartMaximum - chartMinimum, 0.01); + const plotWidth = width - left - right; + const priceY = (value) => top + (chartMaximum - value) / range * (priceBottom - top); + const pointX = (index) => left + plotWidth * intradayMinuteOffset(points[index]?.time) / 240; + drawPreviewGrid(context, width, top, priceBottom, left, right, chartMaximum, range); + + context.save(); + context.setLineDash([4, 4]); + context.strokeStyle = palette.zero; + context.beginPath(); + context.moveTo(left, priceY(previousClose)); + context.lineTo(width - right, priceY(previousClose)); + context.stroke(); + context.restore(); + context.fillStyle = palette.axis; + context.textAlign = "right"; + context.fillText("0.00%", width - right, priceY(previousClose) - 4); + + context.strokeStyle = palette.line; + context.lineWidth = 1.7; + context.beginPath(); + points.forEach((point, index) => { + const x = pointX(index); + const y = priceY(point.close); + if (index === 0) context.moveTo(x, y); + else context.lineTo(x, y); + }); + context.stroke(); + + const averages = points.map((point) => number(point.average)).filter((value) => value > 0); + if (averages.length) { + context.strokeStyle = palette.average; + context.lineWidth = 1.25; + context.beginPath(); + let averageStarted = false; + points.forEach((point, index) => { + const average = number(point.average); + if (average <= 0) return; + const x = pointX(index); + const y = priceY(average); + if (!averageStarted) { + context.moveTo(x, y); + averageStarted = true; + } else context.lineTo(x, y); + }); + context.stroke(); + } + + const maxVolume = Math.max(...points.map((point) => number(point.volume)), 1); + const barWidth = clamp(plotWidth / Math.max(points.length, 1) * 0.72, 1, 3); + points.forEach((point, index) => { + const x = pointX(index); + const barHeight = number(point.volume) / maxVolume * volumeHeight; + context.fillStyle = number(point.close) >= number(point.open) ? palette.upVolume : palette.downVolume; + context.fillRect(x - barWidth / 2, height - bottom - barHeight, barWidth, barHeight); + }); + + context.fillStyle = palette.axis; + context.textAlign = "center"; + [ + { offset: 0, label: "09:30" }, + { offset: 120, label: "11:30 / 13:00" }, + { offset: 240, label: "15:00" }, + ].forEach((marker) => { + context.fillText(marker.label, left + plotWidth * marker.offset / 240, height - 4); + }); + return { + latest: closes.at(-1), + maximum, + minimum, + }; +} + +function drawIntradayPreviewChart(points, dailyPrices, referenceClose = 0) { + const summary = drawIntradayCanvas(elements.stockPreviewChart, points, dailyPrices, referenceClose); + setText( + "stockPreviewSummary", + `分时 ${points.length} 点,最新 ${formatNumber(summary.latest, 2)},最高 ${formatNumber(summary.maximum, 2)},最低 ${formatNumber(summary.minimum, 2)}。`, + ); +} + +function drawDailyPreviewChart(prices) { + const { context, width, height, palette } = prepareStockPreviewCanvas(); + const visible = prices.slice(-45); + const visibleStart = prices.length - visible.length; + const left = 45; + const right = 10; + const top = 24; + const volumeHeight = 34; + const bottom = 18; + const gap = 8; + const priceBottom = height - bottom - volumeHeight - gap; + const maximum = Math.max(...visible.map((item) => number(item.high))); + const minimum = Math.min(...visible.map((item) => number(item.low))); + const padding = Math.max((maximum - minimum) * 0.05, maximum * 0.002, 0.01); + const chartMaximum = maximum + padding; + const chartMinimum = minimum - padding; + const range = Math.max(chartMaximum - chartMinimum, 0.01); + const plotWidth = width - left - right; + const step = plotWidth / Math.max(visible.length, 1); + const candleWidth = clamp(step * 0.58, 2, 7); + const priceY = (value) => top + (chartMaximum - value) / range * (priceBottom - top); + drawPreviewGrid(context, width, top, priceBottom, left, right, chartMaximum, range); + + const maxVolume = Math.max(...visible.map((item) => number(item.volume)), 1); + visible.forEach((item, index) => { + const x = left + step * index + step / 2; + const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); + const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; + context.fillStyle = color; + context.globalAlpha = 0.62; + context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); + context.globalAlpha = 1; + }); + + const movingAverages = [ + { days: 5, color: palette.line }, + { days: 10, color: palette.ma10 }, + { days: 20, color: palette.ma20 }, + ]; + movingAverages.forEach(({ days, color }) => { + context.strokeStyle = color; + context.lineWidth = 1.25; + context.beginPath(); + let started = false; + visible.forEach((_item, index) => { + const absoluteIndex = visibleStart + index; + if (absoluteIndex < days - 1) return; + const values = prices.slice(absoluteIndex - days + 1, absoluteIndex + 1); + const average = values.reduce((sum, item) => sum + number(item.close), 0) / days; + const x = left + step * index + step / 2; + const y = priceY(average); + if (!started) { + context.moveTo(x, y); + started = true; + } else context.lineTo(x, y); + }); + context.stroke(); + }); + + context.textAlign = "left"; + movingAverages.forEach(({ days, color }, index) => { + context.fillStyle = color; + context.fillText(`MA${days}`, left + index * 42, 12); + }); + context.fillStyle = palette.axis; + context.textAlign = "center"; + [0, Math.floor((visible.length - 1) / 2), visible.length - 1].forEach((index) => { + const x = left + step * index + step / 2; + context.fillText(String(visible[index]?.trade_date || "").slice(5), x, height - 4); + }); + const firstClose = number(visible[0]?.close); + const latestClose = number(visible.at(-1)?.close); + const periodChange = firstClose ? (latestClose / firstClose - 1) * 100 : 0; + setText( + "stockPreviewSummary", + `近 ${visible.length} 日涨跌 ${signed(periodChange)}%,区间最高 ${formatNumber(maximum, 2)},最低 ${formatNumber(minimum, 2)}。`, + ); +} + +function clearStockPreviewChart(message) { + const { context, width, height } = prepareStockPreviewCanvas(); + if (!message) return; + context.fillStyle = "#74808d"; + context.textAlign = "center"; + context.fillText(message, width / 2, height / 2); +} + +function bindStockRows(container) { + animateRows(container); + decorateStockPreviewTargets(container); + container.querySelectorAll("[data-code]").forEach((rowElement) => { + rowElement.addEventListener("click", (event) => { + const interactive = event.target.closest("button, a, input, select, textarea, summary"); + if (interactive && interactive !== rowElement) return; + openStock(rowElement.dataset.code, findStockFallback(rowElement.dataset.code)); + }); + }); +} + +function decorateStockPreviewTargets(container) { + container.querySelectorAll(".stock-code").forEach((trigger) => { + const code = stockCodeFromTrigger(trigger); + if (!code) return; + trigger.classList.add("stock-preview-trigger"); + trigger.tabIndex = 0; + trigger.setAttribute("role", "button"); + trigger.setAttribute("aria-label", `预览 ${code} 行情`); + trigger.title = "悬停预览行情,点击查看完整详情"; + }); +} + +function stockCodeFromTrigger(trigger) { + const candidate = trigger?.dataset?.stockPreviewCode + || trigger?.closest?.("[data-code]")?.dataset?.code + || trigger?.textContent?.trim(); + const matched = String(candidate || "").match(/\b(\d{6})\b/); + return matched ? matched[1] : ""; +} + +function marketPreviewTargetFromTrigger(trigger) { + if (trigger?.classList?.contains("market-preview-trigger")) { + const type = String(trigger.dataset.marketPreviewType || "").trim().toLowerCase(); + const id = String(trigger.dataset.marketPreviewId || "").trim().toUpperCase(); + if (type === "theme" && id) { + const item = (state.themeLibrary?.items || []).find((row) => String(row.code) === id) || {}; + return { + type, + id, + code: id, + name: item.name || trigger.textContent?.trim() || "--", + type_label: "题材", + change: item.change, + value: item.close, + }; + } + } + const code = stockCodeFromTrigger(trigger); + return code ? { type: "stock", id: code, code } : null; +} + +function previewTriggerFromEvent(event) { + return event.target.closest?.(".stock-preview-trigger, .market-preview-trigger"); +} + +function showMarketPreview(target, trigger) { + if (!target) return; + if (target.type === "stock") showStockPreview(target.id, trigger); + else showEntityPreview(target, trigger); +} + +function findStockFallback(code) { + const dashboardRows = [ + ...(state.dashboard?.limits || []), + ...(state.dashboard?.broken || []), + ...(state.dashboard?.down_limits || []), + ...(state.dashboard?.yesterday_limits || []), + ]; + const screenerRows = Object.values(state.screenerResultStore) + .flatMap((entry) => entry?.result?.candidates || []); + const dragonRows = (state.dragonTiger?.traders || []).flatMap((trader) => trader.operations || []); + const auctionRows = state.auctionData?.rows || []; + const themeRows = state.themeDetail?.members || []; + const popularityRows = state.popularityData?.combined || []; + const row = [...dashboardRows, ...screenerRows, ...dragonRows, ...auctionRows, ...themeRows, ...popularityRows, ...(state.watchlist || [])] + .find((item) => String(item.code) === String(code)); + if (!row) return { code, name: "--", sector: "其他" }; + return { + ...row, + code, + change: row.change ?? row.current_change ?? row.pct_chg ?? 0, + sector: row.sector || row.industry || "其他", + }; +} + +function supportsStockPreviewHover() { + return window.matchMedia("(hover: hover) and (pointer: fine)").matches + && window.innerWidth > 720; +} + +function handleStockPreviewPointerOver(event) { + if (!supportsStockPreviewHover()) return; + const trigger = previewTriggerFromEvent(event); + if (!trigger || trigger === event.relatedTarget?.closest?.(".stock-preview-trigger, .market-preview-trigger")) return; + const target = marketPreviewTargetFromTrigger(trigger); + if (!target) return; + cancelStockPreviewClose(); + clearTimeout(stockPreviewOpenTimer); + stockPreviewOpenTimer = setTimeout(() => showMarketPreview(target, trigger), STOCK_PREVIEW_DELAY); +} + +function handleStockPreviewPointerOut(event) { + if (!supportsStockPreviewHover()) return; + const trigger = previewTriggerFromEvent(event); + if (!trigger || trigger === event.relatedTarget?.closest?.(".stock-preview-trigger, .market-preview-trigger")) return; + clearTimeout(stockPreviewOpenTimer); + if (event.relatedTarget instanceof Node && elements.stockPreview.contains(event.relatedTarget)) return; + scheduleStockPreviewClose(); +} + +function handleStockPreviewFocus(event) { + if (!supportsStockPreviewHover()) return; + const trigger = event.target.closest?.(".stock-preview-trigger"); + if (!trigger) return; + const code = stockCodeFromTrigger(trigger); + if (!code) return; + clearTimeout(stockPreviewOpenTimer); + stockPreviewOpenTimer = setTimeout(() => showStockPreview(code, trigger), 120); +} + +function handleStockPreviewFocusOut(event) { + const trigger = event.target.closest?.(".stock-preview-trigger"); + if (!trigger) return; + if (event.relatedTarget instanceof Node && elements.stockPreview.contains(event.relatedTarget)) return; + clearTimeout(stockPreviewOpenTimer); + scheduleStockPreviewClose(); +} + +function handleMobileStockPreviewClick(event) { + if (window.innerWidth > 720) return; + const trigger = event.target.closest?.(".stock-preview-trigger"); + if (!trigger) return; + const code = stockCodeFromTrigger(trigger); + if (!code) return; + event.preventDefault(); + event.stopPropagation(); + showStockPreview(code, trigger); +} + +function handleStockPreviewKeydown(event) { + if (event.key === "Escape" && !elements.stockPreview.hidden) { + closeStockPreview(); + stockPreviewAnchor?.focus?.(); + return; + } + if (event.key !== "Enter") return; + const trigger = event.target.closest?.(".stock-preview-trigger"); + if (!trigger) return; + const code = stockCodeFromTrigger(trigger); + if (!code) return; + event.preventDefault(); + if (window.innerWidth <= 720) showStockPreview(code, trigger); + else openStock(code, findStockFallback(code)); +} + +function cancelStockPreviewClose() { + clearTimeout(stockPreviewCloseTimer); +} + +function scheduleStockPreviewClose() { + clearTimeout(stockPreviewCloseTimer); + stockPreviewCloseTimer = setTimeout(closeStockPreview, 160); +} + +async function showStockPreview(code, trigger) { + clearTimeout(stockPreviewOpenTimer); + cancelStockPreviewClose(); + if (!/^\d{6}$/.test(String(code))) return; + stockPreviewAnchor = trigger; + state.stockPreviewCode = String(code); + state.stockPreviewType = "stock"; + state.stockPreviewItem = null; + state.stockPreviewFallback = findStockFallback(code); + state.stockPreviewPayload = null; + state.stockPreviewChart = "daily"; + renderStockPreviewLoading(); + elements.stockPreview.hidden = false; + const mobile = window.innerWidth <= 720; + elements.stockPreviewBackdrop.hidden = !mobile; + document.body.classList.toggle("stock-preview-open", mobile); + requestAnimationFrame(repositionStockPreview); + + const cacheKey = `${code}:latest`; + const cached = stockPreviewCache.get(cacheKey); + if (cached && cached.expiresAt > Date.now()) { + renderStockPreview(cached.payload); + return; + } + if (cached) stockPreviewCache.delete(cacheKey); + stockPreviewAbortController?.abort(); + stockPreviewAbortController = new AbortController(); + try { + const payload = await apiRequest( + `/api/stock/${encodeURIComponent(code)}/preview`, + "GET", + null, + { signal: stockPreviewAbortController.signal }, + ); + if (state.stockPreviewCode !== String(code) || elements.stockPreview.hidden) return; + const cacheMs = payload.meta?.realtime ? LIVE_REFRESH_DEFAULT_MS : STOCK_PREVIEW_CACHE_MS; + stockPreviewCache.set(cacheKey, { payload, expiresAt: Date.now() + cacheMs }); + while (stockPreviewCache.size > 48) stockPreviewCache.delete(stockPreviewCache.keys().next().value); + renderStockPreview(payload); + } catch (error) { + if (error.name === "AbortError" || state.stockPreviewCode !== String(code)) return; + renderStockPreviewError(error.message || "行情预览加载失败"); + } +} + +async function showEntityPreview(item, trigger) { + const type = String(item?.type || "").trim().toLowerCase(); + const id = String(item?.id || item?.code || "").trim().toUpperCase(); + if (type !== "theme" || !id) return; + clearTimeout(stockPreviewOpenTimer); + cancelStockPreviewClose(); + stockPreviewAnchor = trigger; + state.stockPreviewCode = id; + state.stockPreviewType = type; + state.stockPreviewItem = { ...item, id, code: item.code || id, type, type_label: item.type_label || "题材" }; + state.stockPreviewFallback = { + code: item.code || id, + name: item.name || "--", + sector: item.type_label || "题材", + price: item.value, + change: item.change, + }; + state.stockPreviewPayload = null; + state.stockPreviewChart = "daily"; + renderStockPreviewLoading(); + elements.stockPreview.hidden = false; + const mobile = window.innerWidth <= 720; + elements.stockPreviewBackdrop.hidden = !mobile; + document.body.classList.toggle("stock-preview-open", mobile); + requestAnimationFrame(repositionStockPreview); + + const cacheKey = `${type}:${id}:latest`; + const cached = stockPreviewCache.get(cacheKey); + if (cached && cached.expiresAt > Date.now()) { + renderStockPreview(cached.payload); + return; + } + if (cached) stockPreviewCache.delete(cacheKey); + stockPreviewAbortController?.abort(); + stockPreviewAbortController = new AbortController(); + try { + const params = new URLSearchParams({ type, id, trade_date: todayString() }); + const detail = await apiRequest( + `/api/search/detail?${params}`, + "GET", + null, + { signal: stockPreviewAbortController.signal }, + ); + if (state.stockPreviewType !== type || state.stockPreviewCode !== id || elements.stockPreview.hidden) return; + const entity = detail.entity || {}; + const payload = { + stock: { + code: entity.code || id, + name: entity.name || item.name || "--", + industry: entity.type_label || item.type_label || "题材", + price: entity.value, + change: entity.change, + }, + prices: detail.series || [], + intraday: [], + meta: { + trade_date: detail.meta?.trade_date || "", + realtime: Boolean(detail.meta?.realtime), + intraday_status: "idle", + intraday_notice: "", + }, + }; + stockPreviewCache.set(cacheKey, { payload, expiresAt: Date.now() + STOCK_PREVIEW_CACHE_MS }); + while (stockPreviewCache.size > 48) stockPreviewCache.delete(stockPreviewCache.keys().next().value); + renderStockPreview(payload); + } catch (error) { + if (error.name === "AbortError" || state.stockPreviewType !== type || state.stockPreviewCode !== id) return; + renderStockPreviewError(error.message || "题材行情预览加载失败"); + } +} + +function renderStockPreviewLoading() { + const fallback = state.stockPreviewFallback || {}; + selectStockPreviewChart("daily"); + setText("stockPreviewCode", state.stockPreviewCode || "--"); + setText("stockPreviewName", fallback.name || "正在加载"); + setText("stockPreviewSector", fallback.sector || "--"); + setText("stockPreviewPrice", "--"); + setText("stockPreviewChange", "--"); + document.querySelector("#stockPreviewChange").className = ""; + setText("stockPreviewDate", "最新行情"); + setText("stockPreviewSource", "正在读取行情"); + setText("stockPreviewSummary", "等待行情数据"); + document.querySelector("#stockPreviewLoading").hidden = false; + clearStockPreviewChart(""); +} + +function renderStockPreview(payload) { + state.stockPreviewPayload = payload; + const fallback = state.stockPreviewFallback || {}; + const stock = payload.stock || {}; + const price = stock.price; + const change = stock.change; + setText("stockPreviewCode", stock.code || state.stockPreviewCode); + setText("stockPreviewName", stock.name && stock.name !== "--" ? stock.name : fallback.name || "--"); + setText("stockPreviewSector", stock.industry && stock.industry !== "其他" ? stock.industry : fallback.sector || "其他"); + setText("stockPreviewPrice", meaningfulNumber(price) ? formatNumber(price, 2) : "--"); + setText("stockPreviewChange", meaningfulNumber(change) ? `${signed(change)}%` : "--"); + document.querySelector("#stockPreviewChange").className = changeClass(change); + document.querySelector("#stockPreviewLoading").hidden = true; + selectStockPreviewChart("daily"); + requestAnimationFrame(repositionStockPreview); +} + +function renderStockPreviewError(message) { + document.querySelector("#stockPreviewLoading").hidden = true; + setText("stockPreviewSource", "行情加载失败"); + setText("stockPreviewSummary", message); + clearStockPreviewChart("加载失败"); +} + +function selectStockPreviewChart(chart) { + state.stockPreviewChart = chart === "daily" ? "daily" : "intraday"; + document.querySelectorAll("[data-preview-chart]").forEach((button) => { + const active = button.dataset.previewChart === state.stockPreviewChart; + button.classList.toggle("active", active); + button.setAttribute("aria-selected", String(active)); + }); + const payload = state.stockPreviewPayload; + if (!payload) return; + if (state.stockPreviewChart === "intraday") { + if (state.stockPreviewType !== "stock" && payload.meta?.intraday_status === "idle") { + payload.meta.intraday_status = "loading"; + setText("stockPreviewDate", "正在加载分时"); + setText("stockPreviewSource", "正在读取最新分时"); + setText("stockPreviewSummary", "等待分时行情数据"); + clearStockPreviewChart(""); + loadEntityPreviewIntraday(); + return; + } + if (state.stockPreviewType !== "stock" && payload.meta?.intraday_status === "loading") return; + setText("stockPreviewDate", payload.meta?.intraday_trade_date || payload.meta?.trade_date || "最新行情"); + setText( + "stockPreviewSource", + (payload.intraday || []).length ? "最新分时 · 1分钟" : "分时暂不可用", + ); + if ((payload.intraday || []).length) { + drawIntradayPreviewChart( + payload.intraday, + payload.prices || [], + payload.meta?.intraday_previous_close, + ); + } + else { + clearStockPreviewChart("分时数据不可用"); + setText("stockPreviewSummary", payload.meta?.intraday_notice || "该交易日暂无分时数据。"); + } + } else if ((payload.prices || []).length) { + setText("stockPreviewDate", payload.meta?.trade_date || "最新行情"); + setText("stockPreviewSource", `日 K 行情 · ${payload.prices.length} 个交易日`); + drawDailyPreviewChart(payload.prices); + } else { + setText("stockPreviewDate", payload.meta?.trade_date || "最新行情"); + setText("stockPreviewSource", "日 K 行情暂不可用"); + clearStockPreviewChart("暂无日K数据"); + setText("stockPreviewSummary", "该股票暂无可用的日K数据。"); + } +} + +async function loadEntityPreviewIntraday() { + const type = state.stockPreviewType; + const id = state.stockPreviewCode; + const payload = state.stockPreviewPayload; + if (type === "stock" || !id || !payload) return; + stockPreviewAbortController?.abort(); + stockPreviewAbortController = new AbortController(); + try { + const params = new URLSearchParams({ type, id }); + const intraday = await apiRequest( + `/api/chart/intraday?${params}`, + "GET", + null, + { signal: stockPreviewAbortController.signal }, + ); + if (state.stockPreviewType !== type || state.stockPreviewCode !== id || elements.stockPreview.hidden) return; + payload.intraday = intraday.points || []; + payload.meta.intraday_status = payload.intraday.length ? "available" : "empty"; + payload.meta.intraday_trade_date = intraday.meta?.trade_date || ""; + payload.meta.intraday_previous_close = intraday.meta?.previous_close || 0; + payload.meta.intraday_notice = payload.intraday.length ? "" : "该题材暂无可用分时数据。"; + if (state.stockPreviewChart === "intraday") selectStockPreviewChart("intraday"); + } catch (error) { + if (error.name === "AbortError" || state.stockPreviewType !== type || state.stockPreviewCode !== id) return; + payload.meta.intraday_status = "unavailable"; + payload.meta.intraday_notice = error.message || "题材分时行情暂不可用。"; + if (state.stockPreviewChart === "intraday") selectStockPreviewChart("intraday"); + } +} + +function closeStockPreview() { + clearTimeout(stockPreviewOpenTimer); + clearTimeout(stockPreviewCloseTimer); + stockPreviewAbortController?.abort(); + stockPreviewAbortController = null; + elements.stockPreview.hidden = true; + elements.stockPreviewBackdrop.hidden = true; + document.body.classList.remove("stock-preview-open"); + state.stockPreviewPayload = null; + state.stockPreviewCode = ""; + state.stockPreviewType = "stock"; + state.stockPreviewItem = null; +} + +function openStockDetailFromPreview() { + const code = state.stockPreviewCode; + const fallback = state.stockPreviewFallback; + const type = state.stockPreviewType; + const item = state.stockPreviewItem; + if (!code) return; + closeStockPreview(); + if (type === "stock") openStock(code, fallback); + else if (item) openEntityDetail(item); +} + +function repositionStockPreview() { + if (elements.stockPreview.hidden || window.innerWidth <= 720 || !stockPreviewAnchor?.isConnected) return; + const anchor = stockPreviewAnchor.getBoundingClientRect(); + const preview = elements.stockPreview.getBoundingClientRect(); + const gap = 12; + let left = anchor.right + gap; + if (left + preview.width > window.innerWidth - 8) left = anchor.left - preview.width - gap; + left = clamp(left, 8, Math.max(8, window.innerWidth - preview.width - 8)); + const top = clamp(anchor.top - 48, 64, Math.max(64, window.innerHeight - preview.height - 8)); + elements.stockPreview.style.left = `${Math.round(left)}px`; + elements.stockPreview.style.top = `${Math.round(top)}px`; +} + +/* PRESERVATION-SOURCE-END app.js:6893-7719 */ +/* PRESERVATION-SOURCE-BEGIN app.js:7969-8426 */ +function openGlobalSearch() { + if (!state.user) return; + toggleHeaderCommandMenu(false); + openModalDialog(elements.globalSearchDialog); + requestAnimationFrame(() => { + elements.globalSearchInput.focus(); + elements.globalSearchInput.select(); + }); +} + +function handleGlobalSearchShortcut(event) { + if (!event.ctrlKey || event.altKey || event.shiftKey || event.key.toLowerCase() !== "k") return; + if (!state.user) return; + if (event.defaultPrevented) { + showToast("Ctrl+K 已被其他功能占用,请点击顶部搜索按钮"); + return; + } + event.preventDefault(); + openGlobalSearch(); +} + +function closeGlobalSearch() { + clearTimeout(globalSearchTimer); + if (elements.globalSearchDialog.open) elements.globalSearchDialog.close(); +} + +function scheduleGlobalSearch() { + clearTimeout(globalSearchTimer); + const query = elements.globalSearchInput.value.trim(); + state.globalSearchActiveIndex = -1; + if (!query) { + state.globalSearchResults = []; + renderGlobalSearchEmpty("输入名称或代码开始搜索", "使用方向键选择,回车打开详情", "corner-down-left"); + return; + } + elements.globalSearchResults.innerHTML = '
    正在搜索
    '; + globalSearchTimer = setTimeout(() => runGlobalSearch(query), 160); +} + +async function runGlobalSearch(query) { + const requestSequence = ++state.globalSearchRequestSequence; + const params = new URLSearchParams({ q: query, trade_date: elements.tradeDate.value }); + try { + const payload = await apiRequest(`/api/search?${params}`); + if (requestSequence !== state.globalSearchRequestSequence || elements.globalSearchInput.value.trim() !== query) return; + renderGlobalSearchResults(payload.groups || {}); + } catch (error) { + if (requestSequence !== state.globalSearchRequestSequence) return; + state.globalSearchResults = []; + renderGlobalSearchEmpty(error.message || "搜索失败", "请稍后重试", "circle-alert"); + } +} + +function renderGlobalSearchResults(groups) { + const definitions = [ + ["stocks", "股票"], + ["sectors", "板块"], + ["themes", "题材"], + ["indices", "指数"], + ]; + const iconNames = { stock: "chart-candlestick", sector: "layout-grid", theme: "lightbulb", index: "chart-line" }; + const flattened = []; + const sections = []; + definitions.forEach(([key, label]) => { + const items = Array.isArray(groups[key]) ? groups[key] : []; + if (!items.length) return; + const rows = items.map((item) => { + const index = flattened.length; + flattened.push(item); + return ``; + }).join(""); + sections.push(`

    ${label}

    ${rows}
    `); + }); + state.globalSearchResults = flattened; + state.globalSearchActiveIndex = flattened.length ? 0 : -1; + if (!flattened.length) { + renderGlobalSearchEmpty("没有找到相关结果", "可尝试输入完整名称或六位股票代码", "search-x"); + return; + } + elements.globalSearchResults.innerHTML = sections.join(""); + updateGlobalSearchSelection(false); + refreshIcons(); +} + +function renderGlobalSearchEmpty(title, hint, iconName) { + elements.globalSearchResults.innerHTML = `

    ${escapeHtml(title)}

    ${escapeHtml(hint)}
    `; + refreshIcons(); +} + +function handleGlobalSearchInputKeydown(event) { + if (event.key === "Escape") { + event.preventDefault(); + closeGlobalSearch(); + return; + } + if (!["ArrowDown", "ArrowUp", "Enter"].includes(event.key)) return; + if (!state.globalSearchResults.length) return; + event.preventDefault(); + if (event.key === "Enter") { + openGlobalSearchResult(state.globalSearchActiveIndex); + return; + } + const direction = event.key === "ArrowDown" ? 1 : -1; + state.globalSearchActiveIndex = (state.globalSearchActiveIndex + direction + state.globalSearchResults.length) % state.globalSearchResults.length; + updateGlobalSearchSelection(true); +} + +function updateGlobalSearchSelection(scrollIntoView) { + elements.globalSearchResults.querySelectorAll("[data-search-result-index]").forEach((item) => { + const selected = number(item.dataset.searchResultIndex) === state.globalSearchActiveIndex; + item.classList.toggle("is-active", selected); + item.setAttribute("aria-selected", String(selected)); + if (selected && scrollIntoView) item.scrollIntoView({ block: "nearest" }); + }); +} + +function openGlobalSearchResult(index) { + const item = state.globalSearchResults[index]; + if (!item) return; + closeGlobalSearch(); + if (item.type === "stock") { + openStock(item.id, { code: item.code, name: item.name, sector: item.industry || "其他" }); + return; + } + openEntityDetail(item); +} + +async function openEntityDetail(item) { + state.entityDetailItem = item; + state.entityDetailPayload = null; + state.entityDetailIntraday = null; + state.entityDetailChartMode = "daily"; + const requestSequence = ++state.entityDetailRequestSequence; + syncDetailChartButtons("entity", "daily"); + setText("entityDetailCode", item.code || item.id || "--"); + setText("entityDetailName", item.name || "--"); + setText("entityDetailValue", "--"); + setText("entityDetailChange", "--"); + setText("entityDetailType", item.type_label || "--"); + setText("entityDetailDate", "正在加载行情"); + document.querySelector("#entityDetailChange").className = ""; + renderEmptyState("entityDetailMetrics", "正在加载交易数据"); + openModalDialog(elements.entityDetailDialog); + clearEntityDetailChart("正在加载日 K 数据"); + try { + const params = new URLSearchParams({ type: item.type, id: item.id, trade_date: elements.tradeDate.value }); + const payload = await apiRequest(`/api/search/detail?${params}`); + if (requestSequence !== state.entityDetailRequestSequence) return; + state.entityDetailPayload = payload; + const entity = payload.entity || {}; + setText("entityDetailCode", entity.code || item.code || "--"); + setText("entityDetailName", entity.name || item.name || "--"); + setText("entityDetailValue", meaningfulNumber(entity.value) && number(entity.value) !== 0 ? formatNumber(entity.value, 2) : "--"); + setText("entityDetailChange", `${signed(entity.change)}%`); + setText("entityDetailType", entity.type_label || item.type_label || "--"); + document.querySelector("#entityDetailChange").className = changeClass(entity.change); + renderEntityDetailMetrics(payload.metrics || []); + if (state.entityDetailChartMode === "daily") { + setText("entityDetailDate", `${payload.meta?.realtime ? "实时" : "收盘"} · ${payload.meta?.trade_date || "--"}`); + requestAnimationFrame(() => drawEntityDetailChart(payload.series || [])); + } + } catch (error) { + if (requestSequence !== state.entityDetailRequestSequence) return; + setText("entityDetailDate", "行情加载失败"); + renderEmptyState("entityDetailMetrics", error.message || "交易数据加载失败"); + if (state.entityDetailChartMode === "daily") clearEntityDetailChart(error.message || "行情加载失败"); + showToast(error.message || "详情加载失败"); + } +} + +async function selectEntityDetailChart(mode) { + const selected = mode === "intraday" ? "intraday" : "daily"; + state.entityDetailChartMode = selected; + syncDetailChartButtons("entity", selected); + if (selected === "daily") { + const payload = state.entityDetailPayload; + if (payload) { + setText("entityDetailDate", `${payload.meta?.realtime ? "实时" : "收盘"} · ${payload.meta?.trade_date || "--"}`); + requestAnimationFrame(() => drawEntityDetailChart(payload.series || [])); + } else clearEntityDetailChart("正在加载日 K 数据"); + return; + } + + if (state.entityDetailIntraday) { + renderEntityIntraday(state.entityDetailIntraday); + return; + } + const item = state.entityDetailItem; + if (!item) return; + const requestSequence = state.entityDetailRequestSequence; + setText("entityDetailDate", "正在加载分时"); + clearEntityDetailChart("正在加载分时数据"); + try { + const params = new URLSearchParams({ type: item.type, id: item.id }); + const payload = await apiRequest(`/api/chart/intraday?${params}`); + if (requestSequence !== state.entityDetailRequestSequence) return; + state.entityDetailIntraday = payload; + if (state.entityDetailChartMode === "intraday") renderEntityIntraday(payload); + } catch (error) { + if (requestSequence !== state.entityDetailRequestSequence || state.entityDetailChartMode !== "intraday") return; + setText("entityDetailDate", "分时暂不可用"); + clearEntityDetailChart(error.message || "分时行情暂不可用"); + } +} + +function renderEntityIntraday(payload) { + const points = payload.points || []; + if (!points.length) { + setText("entityDetailDate", "分时暂不可用"); + clearEntityDetailChart("分时行情暂不可用"); + return; + } + setText("entityDetailDate", `分时 · ${payload.meta?.trade_date || "--"}`); + requestAnimationFrame(() => { + if (state.entityDetailChartMode !== "intraday") return; + drawIntradayCanvas(elements.entityDetailChart, points, [], payload.meta?.previous_close); + }); +} + +function syncDetailChartButtons(scope, mode) { + const selector = scope === "stock" ? "[data-stock-detail-chart]" : "[data-entity-detail-chart]"; + const datasetKey = scope === "stock" ? "stockDetailChart" : "entityDetailChart"; + document.querySelectorAll(selector).forEach((button) => { + const active = button.dataset[datasetKey] === mode; + button.classList.toggle("active", active); + button.setAttribute("aria-pressed", String(active)); + }); +} + +function renderEntityDetailMetrics(metrics) { + const container = document.querySelector("#entityDetailMetrics"); + if (!metrics.length) { + renderEmptyState(container, "暂无交易数据"); + return; + } + container.innerHTML = metrics.map((metric) => { + const value = typeof metric.value === "number" ? formatNumber(metric.value, Number.isInteger(metric.value) ? 0 : 2) : String(metric.value ?? "--"); + const tone = metric.tone === "change" ? changeClass(metric.value) : ""; + return `
    ${escapeHtml(metric.label)}
    ${escapeHtml(value)}${escapeHtml(metric.unit || "")}
    `; + }).join(""); +} + +function drawEntityDetailChart(series, canvas = elements.entityDetailChart) { + const candles = (series || []).filter((item) => number(item.close) > 0).map((item) => { + const close = number(item.close); + const open = number(item.open) || close; + const high = Math.max(number(item.high) || close, open, close); + const low = Math.min(number(item.low) || close, open, close); + return { ...item, open, high, low, close }; + }); + if (!candles.length) { + clearEntityDetailChart("暂无日 K 数据", canvas); + return; + } + const rect = canvas.getBoundingClientRect(); + const ratio = window.devicePixelRatio || 1; + const width = Math.max(320, rect.width); + const height = Math.max(220, rect.height); + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + const left = 48; + const right = 12; + const top = 14; + const bottom = 22; + const volumeHeight = 54; + const gap = 12; + const priceBottom = height - bottom - volumeHeight - gap; + const plotWidth = width - left - right; + const maximum = Math.max(...candles.map((item) => item.high)); + const minimum = Math.min(...candles.map((item) => item.low)); + const range = Math.max(maximum - minimum, maximum * 0.01, 0.01); + const maxVolume = Math.max(...candles.map((item) => number(item.volume)), 1); + const priceY = (value) => top + (maximum - value) / range * (priceBottom - top); + const step = plotWidth / candles.length; + const candleWidth = clamp(step * 0.62, 2, 8); + context.strokeStyle = palette.grid; + context.fillStyle = palette.axis; + context.font = "11px Microsoft YaHei"; + context.textAlign = "right"; + for (let line = 0; line <= 4; line += 1) { + const lineY = top + (priceBottom - top) * line / 4; + context.beginPath(); + context.moveTo(left, lineY); + context.lineTo(width - right, lineY); + context.stroke(); + context.fillText((maximum - range * line / 4).toFixed(2), left - 6, lineY + 4); + } + + candles.forEach((item, index) => { + const x = left + step * index + step / 2; + const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); + const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; + context.fillStyle = color; + context.globalAlpha = 0.72; + context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); + context.globalAlpha = 1; + }); + + context.textAlign = "center"; + context.fillStyle = palette.axis; + [0, Math.floor((candles.length - 1) / 2), candles.length - 1].forEach((index) => { + const x = left + step * index + step / 2; + context.fillText(String(candles[index].trade_date || "").slice(5), x, height - 5); + }); +} + +function clearEntityDetailChart(message, canvas = elements.entityDetailChart) { + const rect = canvas.getBoundingClientRect(); + const width = Math.max(320, Math.round(rect.width || 680)); + const height = Math.max(220, Math.round(rect.height || 300)); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + context.fillStyle = palette.axis; + context.font = "13px Microsoft YaHei"; + context.textAlign = "center"; + context.fillText(message, width / 2, height / 2); +} + +function meaningfulNumber(value) { + return value !== null && value !== undefined && value !== "" && Number.isFinite(Number(value)); +} + +async function openStock(code, fallback = null) { + closeStockPreview(); + const pools = [state.dashboard?.limits || [], state.dashboard?.broken || [], state.dashboard?.down_limits || []]; + const row = pools.flat().find((item) => String(item.code) === String(code)) || fallback || { code, name: "--", sector: "其他" }; + state.activeStock = row; + state.stockDetail = null; + state.stockDetailIntraday = null; + state.stockDetailChartMode = "daily"; + const requestSequence = ++state.stockDetailRequestSequence; + syncDetailChartButtons("stock", "daily"); + setText("detailCode", row.code); + setText("detailName", row.name); + setText("detailPrice", formatNumber(row.price, 2)); + setText("detailChange", `${signed(row.change)}%`); + const changeElement = document.querySelector("#detailChange"); + changeElement.className = changeClass(row.change); + setText("detailStreak", row.status === "涨停" ? streakLabel(row.streak) : row.status || "--"); + setText("detailReason", row.reason || "--"); + setText("detailSector", row.sector || "其他"); + setText("detailFirst", row.first_time || "--"); + setText("detailLast", row.last_time || "--"); + setText("detailOpen", `${number(row.open_times)} 次`); + setText("detailTurnover", `${formatNumber(row.turnover_rate, 2)}%`); + setText("detailAmount", `${formatNumber(row.amount_billion, 2)} 亿`); + setText("detailSeal", `${formatNumber(row.seal_amount_million, 0)} 万`); + setText("chartSource", "正在加载行情"); + setText("flowNet", "--"); + setText("flowLarge", "--"); + setText("flowMedium", "--"); + setText("flowSmall", "--"); + document.querySelector("#reasonInput").value = row.reason || ""; + document.querySelector("#stockNoteContent").value = ""; + document.querySelector("#stockNotePlan").value = ""; + renderEmptyState("stockNotes", "正在加载笔记"); + updateWatchButton(); + openModalDialog(elements.stockDialog); + clearPriceChart("正在加载日 K 数据"); + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + const payload = await apiRequest(`/api/stock/${encodeURIComponent(code)}?${query}`); + if (requestSequence !== state.stockDetailRequestSequence) return; + state.stockDetail = payload; + const stock = payload.stock || {}; + state.activeStock = { ...row, name: stock.name || row.name, sector: stock.industry || row.sector }; + setText("detailName", stock.name || row.name); + setText("detailPrice", formatNumber(stock.price || row.price, 2)); + setText("detailChange", `${signed(stock.change ?? row.change)}%`); + renderMoneyflow(payload.moneyflow || {}); + renderStockNotes(payload.notes || []); + updateWatchButton(); + if (state.stockDetailChartMode === "daily") { + setText("chartSource", `日 K 行情 · ${payload.prices.length} 个交易日`); + requestAnimationFrame(() => drawPriceChart(payload.prices || [])); + } + } catch (error) { + if (requestSequence !== state.stockDetailRequestSequence) return; + setText("chartSource", "行情加载失败"); + if (state.stockDetailChartMode === "daily") clearPriceChart(error.message || "行情加载失败"); + showToast(error.message || "个股详情加载失败"); + } +} + +async function selectStockDetailChart(mode) { + const selected = mode === "intraday" ? "intraday" : "daily"; + state.stockDetailChartMode = selected; + syncDetailChartButtons("stock", selected); + if (selected === "daily") { + const prices = state.stockDetail?.prices || []; + setText("chartSource", prices.length ? `日 K 行情 · ${prices.length} 个交易日` : "正在加载行情"); + if (prices.length) requestAnimationFrame(() => drawPriceChart(prices)); + else clearPriceChart("正在加载日 K 数据"); + return; + } + + if (state.stockDetailIntraday) { + renderStockDetailIntraday(state.stockDetailIntraday); + return; + } + const code = String(state.activeStock?.code || ""); + if (!/^\d{6}$/.test(code)) return; + const requestSequence = state.stockDetailRequestSequence; + setText("chartSource", "正在加载分时"); + clearPriceChart("正在加载分时数据"); + try { + const params = new URLSearchParams({ type: "stock", id: code }); + const payload = await apiRequest(`/api/chart/intraday?${params}`); + if (requestSequence !== state.stockDetailRequestSequence) return; + state.stockDetailIntraday = payload; + if (state.stockDetailChartMode === "intraday") renderStockDetailIntraday(payload); + } catch (error) { + if (requestSequence !== state.stockDetailRequestSequence || state.stockDetailChartMode !== "intraday") return; + setText("chartSource", "分时暂不可用"); + clearPriceChart(error.message || "分时行情暂不可用"); + } +} + +function renderStockDetailIntraday(payload) { + const points = payload.points || []; + if (!points.length) { + setText("chartSource", "分时暂不可用"); + clearPriceChart("分时行情暂不可用"); + return; + } + setText("chartSource", `分时 · ${payload.meta?.trade_date || "--"}`); + requestAnimationFrame(() => { + if (state.stockDetailChartMode !== "intraday") return; + drawIntradayCanvas(elements.priceChart, points, [], payload.meta?.previous_close); + }); +} + +function openActiveStockInHeaven() { + const code = state.activeStock?.code; + if (!/^\d{6}$/.test(String(code || ""))) return; + elements.stockDialog.close(); + state.heavenPanel = "trend"; + state.heavenManualData = null; + const input = document.querySelector("#heavenStockInput"); + input.value = code; + openView("heavenView"); + selectHeavenPanel("trend", true); +} + +/* PRESERVATION-SOURCE-END app.js:7969-8426 */ diff --git a/app/frontend/pages/mentor/page.js b/app/frontend/pages/mentor/page.js new file mode 100644 index 0000000..eef97df --- /dev/null +++ b/app/frontend/pages/mentor/page.js @@ -0,0 +1,497 @@ +window.XiaobaiPageModules.register("mentor", ["mentorView"], { + enter: ["loadMentor"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:4337-4827 */ +async function loadMentorSetup(force = false) { + const requestedDate = elements.tradeDate.value.replaceAll("-", ""); + if (!force && state.mentorSetup?.requestedDate === requestedDate) { + renderMentorWorkspace(); + return; + } + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + const payload = await apiRequest(`/api/mentors/setup?${query}`); + payload.requestedDate = requestedDate; + if (!payload.preferences_configured) { + payload.mentors.sort((first, second) => { + if (Boolean(first.private) !== Boolean(second.private)) return first.private ? -1 : 1; + return String(first.name || "").localeCompare(String(second.name || ""), "zh-CN"); + }); + payload.mentors.forEach((mentor, index) => { mentor.sort_order = index; }); + } + state.mentorSetup = payload; + const selectedExists = payload.mentors.some((item) => item.id === state.selectedMentorId); + state.selectedMentorId = selectedExists ? state.selectedMentorId : payload.mentors[0]?.id || ""; + state.mentorMessages = await loadMentorMessages(); + renderMentorWorkspace(); + } catch (error) { + showMentorNotice(error.message || "问师模块加载失败"); + showToast(error.message || "问师模块加载失败"); + } +} + +function renderMentorWorkspace() { + const setup = state.mentorSetup; + if (!setup) return; + const selected = setup.mentors.find((item) => item.id === state.selectedMentorId) || null; + setText("mentorDataDate", `数据日期 ${displayCompactDate(setup.trade_date)}`); + setText("activeMentorName", selected?.name || "--"); + setText("mobileActiveMentorName", selected?.name || "选择思维模型"); + document.querySelector("#activeMentorBadges").innerHTML = selected ? renderMentorBadges(selected, true) : ""; + setText("activeMentorEvidence", selected?.evidence?.note || selected?.description || "--"); + document.querySelector("#activeMentorFocus").innerHTML = (selected?.focus || []).slice(0, 4) + .map((item) => `${escapeHtml(item)}`).join(""); + renderMentorDirectory(); + renderMentorMessages(); +} + +function renderMentorDirectory() { + const mentors = state.mentorSetup?.mentors || []; + const query = state.mentorQuery; + const filtered = mentors.filter((mentor) => { + if (state.mentorSortMode) return true; + if (state.mentorGrade !== "all" && mentor.evidence?.grade !== state.mentorGrade) return false; + if (!query) return true; + const haystack = [ + mentor.name, + mentor.description, + mentor.tagline, + mentor.evidence?.label, + mentor.evidence?.note, + ...(mentor.focus || []), + ].filter(Boolean).join(" ").toLocaleLowerCase("zh-CN"); + return haystack.includes(query); + }); + setText("mentorCount", filtered.length === mentors.length ? `${mentors.length} 位` : `${filtered.length} / ${mentors.length} 位`); + const sortToggle = document.querySelector("#mentorSortToggle"); + sortToggle.classList.toggle("active", state.mentorSortMode); + sortToggle.setAttribute("aria-pressed", String(state.mentorSortMode)); + sortToggle.querySelector("span").textContent = state.mentorSortMode ? "完成" : "整理"; + document.querySelector("#mentorSortHint").hidden = !state.mentorSortMode; + document.querySelector("#mentorSearchInput").disabled = state.mentorSortMode; + document.querySelectorAll("[data-mentor-grade]").forEach((button) => { + button.disabled = state.mentorSortMode; + }); + const container = document.querySelector("#mentorList"); + container.classList.toggle("is-sorting", state.mentorSortMode); + container.innerHTML = filtered.map((mentor) => { + const group = mentors.filter((item) => Boolean(item.pinned) === Boolean(mentor.pinned)); + const groupIndex = group.findIndex((item) => item.id === mentor.id); + return ` +
    + + + + ${state.mentorSortMode ? ` + + + ` : ""} + +
    + `; + }).join(""); + document.querySelector("#mentorListEmpty").hidden = filtered.length > 0; + document.querySelectorAll("[data-mentor-id]").forEach((button) => { + button.addEventListener("click", () => selectMentor(button.dataset.mentorId)); + }); + document.querySelectorAll("[data-mentor-pin]").forEach((button) => { + button.addEventListener("click", () => toggleMentorPin(button.dataset.mentorPin)); + }); + document.querySelectorAll("[data-mentor-move]").forEach((button) => { + button.addEventListener("click", () => moveMentor(button.dataset.mentorTarget, button.dataset.mentorMove)); + }); + document.querySelectorAll("[data-mentor-card]").forEach((card) => { + card.addEventListener("dragstart", handleMentorDragStart); + card.addEventListener("dragover", handleMentorDragOver); + card.addEventListener("drop", handleMentorDrop); + card.addEventListener("dragend", clearMentorDragState); + }); + refreshIcons(); +} + +function toggleMentorSortMode() { + state.mentorSortMode = !state.mentorSortMode; + if (state.mentorSortMode) { + state.mentorQuery = ""; + state.mentorGrade = "all"; + document.querySelector("#mentorSearchInput").value = ""; + document.querySelectorAll("[data-mentor-grade]").forEach((button) => { + button.classList.toggle("active", button.dataset.mentorGrade === "all"); + }); + } + renderMentorDirectory(); +} + +async function toggleMentorPin(mentorId) { + if (state.mentorSavingPreferences) return; + const mentors = state.mentorSetup?.mentors || []; + const index = mentors.findIndex((item) => item.id === mentorId); + if (index < 0) return; + const [mentor] = mentors.splice(index, 1); + mentor.pinned = !mentor.pinned; + if (mentor.pinned) { + mentors.unshift(mentor); + } else { + const firstUnpinned = mentors.findIndex((item) => !item.pinned); + mentors.splice(firstUnpinned < 0 ? mentors.length : firstUnpinned, 0, mentor); + } + normalizeMentorOrder(); + renderMentorWorkspace(); + await persistMentorPreferences(); +} + +async function moveMentor(mentorId, direction) { + if (state.mentorSavingPreferences) return; + const mentors = state.mentorSetup?.mentors || []; + const index = mentors.findIndex((item) => item.id === mentorId); + if (index < 0) return; + const step = direction === "up" ? -1 : 1; + const targetIndex = index + step; + if (targetIndex < 0 || targetIndex >= mentors.length) return; + if (Boolean(mentors[index].pinned) !== Boolean(mentors[targetIndex].pinned)) return; + [mentors[index], mentors[targetIndex]] = [mentors[targetIndex], mentors[index]]; + normalizeMentorOrder(); + renderMentorDirectory(); + await persistMentorPreferences(); +} + +function handleMentorDragStart(event) { + if (!state.mentorSortMode || state.mentorSavingPreferences) { + event.preventDefault(); + return; + } + state.mentorDragId = event.currentTarget.dataset.mentorCard || ""; + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", state.mentorDragId); + event.currentTarget.classList.add("is-dragging"); +} + +function handleMentorDragOver(event) { + const source = state.mentorSetup?.mentors.find((item) => item.id === state.mentorDragId); + const target = state.mentorSetup?.mentors.find((item) => item.id === event.currentTarget.dataset.mentorCard); + if (!source || !target || Boolean(source.pinned) !== Boolean(target.pinned)) return; + event.preventDefault(); + event.dataTransfer.dropEffect = "move"; + event.currentTarget.classList.add("is-drag-over"); +} + +async function handleMentorDrop(event) { + event.preventDefault(); + const sourceId = state.mentorDragId || event.dataTransfer.getData("text/plain"); + const targetId = event.currentTarget.dataset.mentorCard || ""; + clearMentorDragState(); + if (!sourceId || !targetId || sourceId === targetId) return; + const mentors = state.mentorSetup?.mentors || []; + const sourceIndex = mentors.findIndex((item) => item.id === sourceId); + const targetIndex = mentors.findIndex((item) => item.id === targetId); + if (sourceIndex < 0 || targetIndex < 0) return; + if (Boolean(mentors[sourceIndex].pinned) !== Boolean(mentors[targetIndex].pinned)) return; + const [mentor] = mentors.splice(sourceIndex, 1); + const insertionIndex = mentors.findIndex((item) => item.id === targetId); + mentors.splice(insertionIndex, 0, mentor); + normalizeMentorOrder(); + renderMentorDirectory(); + await persistMentorPreferences(); +} + +function clearMentorDragState() { + state.mentorDragId = ""; + document.querySelectorAll(".mentor-option.is-dragging, .mentor-option.is-drag-over").forEach((item) => { + item.classList.remove("is-dragging", "is-drag-over"); + }); +} + +function normalizeMentorOrder() { + (state.mentorSetup?.mentors || []).forEach((mentor, index) => { + mentor.sort_order = index; + }); +} + +async function persistMentorPreferences() { + const mentors = state.mentorSetup?.mentors || []; + state.mentorSavingPreferences = true; + renderMentorDirectory(); + try { + await apiRequest("/api/mentors/preferences", "POST", { + order: mentors.map((item) => item.id), + pinned: mentors.filter((item) => item.pinned).map((item) => item.id), + }); + } catch (error) { + showToast(error.message || "问师顺序保存失败"); + await loadMentorSetup(true); + } finally { + state.mentorSavingPreferences = false; + renderMentorDirectory(); + } +} + +function renderMentorBadges(mentor, expanded = false) { + const badges = []; + if (mentor.private) { + badges.push('仅自己'); + } + const grade = mentor.evidence?.grade; + if (grade) { + badges.push(`${escapeHtml(grade)}`); + } + return badges.join(""); +} + +function toggleMentorDirectory(open) { + const mobileOpen = Boolean(open) && window.innerWidth <= 720; + state.mentorDirectoryOpen = mobileOpen; + const sidebar = document.querySelector("#mentorView .mentor-sidebar"); + const backdrop = document.querySelector("#mentorDirectoryBackdrop"); + const toggle = document.querySelector("#mentorDirectoryToggle"); + sidebar.classList.toggle("is-open", mobileOpen); + backdrop.hidden = !mobileOpen; + toggle.setAttribute("aria-expanded", String(mobileOpen)); + document.body.classList.toggle("mentor-directory-open", mobileOpen); + if (mobileOpen) requestAnimationFrame(() => document.querySelector("#mentorSearchInput").focus()); +} + +async function selectMentor(mentorId) { + if (mentorId === state.selectedMentorId) { + toggleMentorDirectory(false); + return; + } + state.selectedMentorId = mentorId; + state.mentorMessages = []; + hideMentorNotice(); + renderMentorWorkspace(); + toggleMentorDirectory(false); + state.mentorMessages = await loadMentorMessages(); + renderMentorMessages(); +} + +function renderMentorMessages() { + const container = document.querySelector("#mentorMessages"); + const selected = state.mentorSetup?.mentors.find((item) => item.id === state.selectedMentorId); + if (!state.mentorMessages.length && !state.mentorLoading) { + container.innerHTML = ` +
    + + 向「${escapeHtml(selected?.name || "问师")}」请教 +

    ${escapeHtml(selected?.tagline || selected?.description || "选择一个问题开始对话")}

    +
    + `; + refreshIcons(); + } else { + container.innerHTML = state.mentorMessages.map((message) => ` +
    +
    ${message.role === "user" ? "我" : escapeHtml(selected?.name || "问师")}
    +
    ${message.role === "assistant" ? formatMentorAnswer(message.content) : escapeHtml(message.content)}
    + ${message.streaming ? '' : ""} + ${message.meta && !message.streaming ? `${escapeHtml(message.meta)}` : ""} +
    + `).join(""); + if (state.mentorLoading && !state.mentorMessages.some((message) => message.streaming)) { + container.insertAdjacentHTML("beforeend", ` +
    +
    ${escapeHtml(selected?.name || "问师")}
    +

    正在读取复盘数据并推演...

    +
    + `); + } + } + document.querySelector("#clearMentorChatButton").disabled = !state.mentorMessages.length || state.mentorLoading; + document.querySelector("#mentorQuestion").disabled = state.mentorLoading || !state.selectedMentorId; + document.querySelector("#sendMentorQuestion").disabled = state.mentorLoading || !state.selectedMentorId; + document.querySelector("#mentorSortToggle").disabled = state.mentorLoading; + requestAnimationFrame(() => { container.scrollTop = container.scrollHeight; }); +} + +async function sendMentorQuestion(event) { + event.preventDefault(); + if (state.mentorLoading || !state.selectedMentorId) return; + const input = document.querySelector("#mentorQuestion"); + const question = input.value.trim(); + if (!question) return; + const history = state.mentorMessages.slice(-6).map((item) => ({ + role: item.role, + content: item.content.slice(0, 3500), + })); + state.mentorMessages.push({ role: "user", content: question }); + const responseMessage = { role: "assistant", content: "", streaming: true, meta: "" }; + state.mentorMessages.push(responseMessage); + input.value = ""; + state.mentorLoading = true; + state.mentorController = new AbortController(); + hideMentorNotice(); + renderMentorMessages(); + renderMentorDirectory(); + setStatus("问师正在读取复盘数据"); + try { + await streamMentorRequest( + { + mentor_id: state.selectedMentorId, + trade_date: elements.tradeDate.value, + question, + history, + }, + state.mentorController.signal, + (chunk) => { + responseMessage.content += chunk; + scheduleMentorRender(); + }, + (meta) => { + responseMessage.meta = `${displayCompactDate(meta.data_trade_date || elements.tradeDate.value)} · 回答完成`; + if (meta.notice) showMentorNotice(meta.notice); + }, + ); + responseMessage.streaming = false; + setStatus("问师回答完成"); + } catch (error) { + responseMessage.streaming = false; + responseMessage.error = true; + if (!responseMessage.content) { + state.mentorMessages = state.mentorMessages.filter((item) => item !== responseMessage); + } + showMentorNotice(error.message || "问师回答失败"); + showToast(error.message || "问师回答失败"); + setStatus("问师回答失败"); + } finally { + state.mentorLoading = false; + state.mentorController = null; + renderMentorMessages(); + renderMentorDirectory(); + input.focus(); + } +} + +let mentorRenderFrame = 0; + +function scheduleMentorRender() { + if (mentorRenderFrame) return; + mentorRenderFrame = requestAnimationFrame(() => { + mentorRenderFrame = 0; + renderMentorMessages(); + }); +} + +async function streamMentorRequest(body, signal, onDelta, onMeta) { + await window.XiaobaiAPI.streamNdjson("/api/mentors/chat", { + method: "POST", + body, + signal, + errorMessage: "问师暂不可用", + onEvent: (event) => { + if (event.type === "delta") onDelta(String(event.content || "")); + if (event.type === "meta") onMeta(event); + }, + }); +} + +function useMentorQuickPrompt(prompt) { + const input = document.querySelector("#mentorQuestion"); + input.value = prompt || ""; + input.focus(); +} + +async function clearMentorConversation() { + if (!state.mentorMessages.length || !window.confirm("确定清空当前老师的对话记录吗?")) return; + try { + const query = new URLSearchParams({ + mentor_id: state.selectedMentorId, + trade_date: state.mentorSetup?.trade_date || elements.tradeDate.value, + }); + await apiRequest(`/api/mentors/messages?${query}`, "DELETE"); + state.mentorMessages = []; + hideMentorNotice(); + renderMentorMessages(); + } catch (error) { + showToast(error.message || "对话记录清空失败"); + } +} + +async function loadMentorMessages() { + if (!state.selectedMentorId) return []; + try { + const query = new URLSearchParams({ + mentor_id: state.selectedMentorId, + trade_date: state.mentorSetup?.trade_date || elements.tradeDate.value, + }); + const payload = await apiRequest(`/api/mentors/messages?${query}`); + return (payload.items || []).filter( + (item) => ["user", "assistant"].includes(item?.role) && typeof item.content === "string", + ).slice(-100); + } catch (error) { + showMentorNotice(error.message || "对话记录加载失败"); + return []; + } +} + +function showMentorNotice(message) { + const notice = document.querySelector("#mentorNotice"); + notice.textContent = message; + notice.hidden = false; +} + +function hideMentorNotice() { + document.querySelector("#mentorNotice").hidden = true; +} + +function formatMentorAnswer(content) { + const blocks = []; + let listType = ""; + let listItems = []; + const flushList = () => { + if (!listItems.length) return; + blocks.push(`<${listType} class="mentor-answer-list">${listItems.map((item) => `
  • ${item}
  • `).join("")}`); + listItems = []; + listType = ""; + }; + String(content || "").replace(/\r\n?/g, "\n").replace(/\n{3,}/g, "\n\n").split("\n").forEach((rawLine) => { + const line = rawLine.trim(); + if (!line) { + flushList(); + return; + } + const heading = line.match(/^#{1,3}\s+(.+)$/); + const bullet = line.match(/^[-*]\s+(.+)$/); + const ordered = line.match(/^\d+[.、]\s*(.+)$/); + if (heading) { + flushList(); + blocks.push(`${formatMentorInline(escapeHtml(heading[1]))}`); + } else if (/^-{3,}$/.test(line)) { + flushList(); + blocks.push(''); + } else if (line.startsWith("> ")) { + flushList(); + blocks.push(`${formatMentorInline(escapeHtml(line.slice(2)))}`); + } else if (bullet || ordered) { + const nextType = bullet ? "ul" : "ol"; + if (listType && listType !== nextType) flushList(); + listType = nextType; + listItems.push(formatMentorInline(escapeHtml((bullet || ordered)[1]))); + } else { + flushList(); + blocks.push(`

    ${formatMentorInline(escapeHtml(line))}

    `); + } + }); + flushList(); + return blocks.join(""); +} + +function formatMentorInline(content) { + return content.replace(/\*\*(.+?)\*\*/g, "$1"); +} + +/* PRESERVATION-SOURCE-END app.js:4337-4827 */ diff --git a/app/frontend/pages/pools/page.js b/app/frontend/pages/pools/page.js new file mode 100644 index 0000000..26cf1f8 --- /dev/null +++ b/app/frontend/pages/pools/page.js @@ -0,0 +1,409 @@ +window.XiaobaiPageModules.register("pools", [ + "limitPool", + "brokenView", + "downView", + "yesterdayView", + "performanceView", +]); + +/* PRESERVATION-SOURCE-BEGIN app.js:1517-1915 */ +function getVisibleStocks() { + if (!state.dashboard) return []; + let rows = [...(state.dashboard.limits || [])]; + if (state.filter === "1") rows = rows.filter((row) => number(row.streak) === 1); + if (state.filter === "2") rows = rows.filter((row) => number(row.streak) === 2); + if (state.filter === "3") rows = rows.filter((row) => number(row.streak) >= 3); + if (state.query) { + rows = rows.filter((row) => { + const haystack = `${row.code} ${row.name} ${row.sector} ${row.reason}`.toLowerCase(); + return haystack.includes(state.query); + }); + } + return rows.sort((left, right) => compareRows(left, right)); +} + +function renderLimitTable() { + if (!state.dashboard) return; + const rows = getVisibleStocks(); + const allRows = state.dashboard.limits || []; + const body = document.querySelector("#limitTableBody"); + body.innerHTML = rows.map((row, index) => ` + + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${streakLabel(row.streak)} + ${signed(row.change)} + ${formatNumber(row.price, 2)} + ${escapeHtml(row.sector || "其他")} + ${escapeHtml(row.first_time || "")} + ${escapeHtml(row.last_time || "")} + ${limitOpenState(row)} + ${formatNumber(row.turnover_rate, 2)} + ${formatNumber(row.amount_billion, 2)} + ${formatLimitSealAmount(row.seal_amount_million)} + ${escapeHtml(row.reason || "")} + + `).join(""); + bindStockRows(body); + setText("resultCount", `${rows.length} 只`); + setText("limitPoolSubtitle", `${allRows.length} 只 · 数据日期 ${displayCompactDate(state.dashboard.meta?.trade_date || elements.tradeDate.value)}`); + setText("limitAllCount", allRows.length); + setText("limitFirstCount", allRows.filter((row) => number(row.streak) === 1).length); + setText("limitSecondCount", allRows.filter((row) => number(row.streak) === 2).length); + setText("limitThreePlusCount", allRows.filter((row) => number(row.streak) >= 3).length); + document.querySelector("#emptyState").hidden = rows.length !== 0; + updateSortHeaders(); +} + +function limitOpenState(row) { + const openTimes = number(row.open_times); + const firstTime = String(row.first_time || ""); + if (firstTime.startsWith("09:25") && openTimes === 0) return '一字'; + if (openTimes >= 6) return `烂板×${openTimes}`; + return String(openTimes); +} + +function formatLimitSealAmount(value) { + const amount = number(value); + if (!amount) return ""; + return Math.round(amount).toLocaleString("zh-CN"); +} + +function renderBrokenTable(rows) { + const visibleRows = getVisibleBrokenRows(rows); + setText("brokenCount", `${rows.length} 只`); + setText("brokenMeta", ` · 触及涨停后未能封住 · 数据日期 ${displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value)}`); + const body = document.querySelector("#brokenTableBody"); + body.innerHTML = visibleRows.map((row, index) => ` + + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${signed(row.change)} + ${formatNumber(row.limitGap, 2)} + ${formatNumber(row.price, 2)} + ${escapeHtml(row.sector || "其他")} + ${escapeHtml(row.first_time || "")} + ${brokenOpenState(row)} + ${formatNumber(row.turnover_rate, 2)} + ${formatNumber(row.amount_billion, 2)} + ${escapeHtml(row.reason || "")} + + `).join(""); + bindStockRows(body); + document.querySelector("#brokenEmptyState").hidden = visibleRows.length !== 0; + updateBrokenSortHeaders(); +} + +function getVisibleBrokenRows(rows = state.dashboard?.broken || []) { + let visibleRows = rows.map((row) => ({ ...row, limitGap: brokenLimitGap(row) })); + if (state.brokenQuery) { + visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.brokenQuery)); + } + if (!state.brokenSortKey) return visibleRows; + return visibleRows.sort((left, right) => { + const result = number(left[state.brokenSortKey]) - number(right[state.brokenSortKey]); + return state.brokenSortDirection === "asc" ? result : -result; + }); +} + +function brokenLimitRate(row) { + const name = String(row.name || "").toUpperCase(); + const code = String(row.code || "").replace(/\D/g, ""); + if (name.includes("ST")) return 10; + if (/^(300|301|688|689)/.test(code)) return 20; + if (/^(4|8|92)/.test(code)) return 30; + return 10; +} + +function brokenLimitGap(row) { + return Math.max(0, brokenLimitRate(row) - number(row.change)); +} + +function brokenOpenState(row) { + const openTimes = number(row.open_times); + return openTimes >= 6 + ? `反复炸 ×${openTimes}` + : String(openTimes); +} + +function changeBrokenSort(key) { + if (state.brokenSortKey === key) state.brokenSortDirection = state.brokenSortDirection === "asc" ? "desc" : "asc"; + else { + state.brokenSortKey = key; + state.brokenSortDirection = "desc"; + } + renderBrokenTable(state.dashboard?.broken || []); +} + +function updateBrokenSortHeaders() { + document.querySelectorAll("#brokenTable th[data-broken-sort]").forEach((header) => { + header.classList.remove("sort-asc", "sort-desc", "sorted"); + header.setAttribute("aria-sort", "none"); + if (header.dataset.brokenSort === state.brokenSortKey) { + header.classList.add(state.brokenSortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); + header.setAttribute("aria-sort", state.brokenSortDirection === "asc" ? "ascending" : "descending"); + } + const arrow = header.querySelector(".arr"); + if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.brokenSortDirection === "asc" ? "▲" : "▼") : "↕"; + }); +} + +function renderDownTable(rows) { + const visibleRows = getVisibleDownRows(rows); + setText("downCount", `${rows.length} 只`); + setText("downMeta", ` · 观察退潮、高位风险与亏钱效应 · 数据日期 ${displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value)}`); + renderDownSectorCluster(rows); + const body = document.querySelector("#downTableBody"); + body.innerHTML = visibleRows.map((row, index) => ` + + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${signed(row.change)} + ${formatNumber(row.price, 2)} + ${escapeHtml(row.sector || "其他")} + ${formatNumber(row.turnover_rate, 2)} + ${formatNumber(row.amount_billion, 2)} + ${number(row.streak) > 0 ? number(row.streak) : ""} + ${escapeHtml(row.reason || "")} + + `).join(""); + bindStockRows(body); + document.querySelector("#downEmptyState").hidden = visibleRows.length !== 0; + updateDownSortHeaders(); +} + +function getVisibleDownRows(rows = state.dashboard?.down_limits || []) { + let visibleRows = [...rows]; + if (state.downQuery) { + visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.downQuery)); + } + if (!state.downSortKey) return visibleRows; + return visibleRows.sort((left, right) => { + const result = number(left[state.downSortKey]) - number(right[state.downSortKey]); + return state.downSortDirection === "asc" ? result : -result; + }); +} + +function renderDownSectorCluster(rows) { + const counts = new Map(); + rows.forEach((row) => { + const sector = String(row.sector || "其他").trim() || "其他"; + if (sector === "其他") return; + counts.set(sector, (counts.get(sector) || 0) + 1); + }); + const cluster = [...counts.entries()].sort((left, right) => right[1] - left[1])[0]; + const element = document.querySelector("#downSectorCluster"); + element.hidden = !cluster || cluster[1] < 2; + element.textContent = cluster && cluster[1] >= 2 ? `${cluster[0]}集中跌停 ×${cluster[1]}` : ""; +} + +function changeDownSort(key) { + if (state.downSortKey === key) state.downSortDirection = state.downSortDirection === "asc" ? "desc" : "asc"; + else { + state.downSortKey = key; + state.downSortDirection = "asc"; + } + renderDownTable(state.dashboard?.down_limits || []); +} + +function updateDownSortHeaders() { + document.querySelectorAll("#downTable th[data-down-sort]").forEach((header) => { + header.classList.remove("sort-asc", "sort-desc", "sorted"); + header.setAttribute("aria-sort", "none"); + if (header.dataset.downSort === state.downSortKey) { + header.classList.add(state.downSortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); + header.setAttribute("aria-sort", state.downSortDirection === "asc" ? "ascending" : "descending"); + } + const arrow = header.querySelector(".arr"); + if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.downSortDirection === "asc" ? "▲" : "▼") : "↕"; + }); +} + +function renderYesterdayTable(rows) { + const visibleRows = getVisibleYesterdayRows(rows); + const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); + const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); + setText("yesterdayCount", `${rows.length} 只`); + setText("yesterdayMeta", ` · 昨日 ${previousDate} → 今日 ${currentDate}`); + renderYesterdaySummary(rows); + const body = document.querySelector("#yesterdayTableBody"); + body.innerHTML = visibleRows.map((row, index) => ` + + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${number(row.prior_streak)} + ${signed(row.current_change)} + ${escapeHtml(row.outcome)} + ${number(row.current_streak) ? `${number(row.current_streak)}` : ""} + ${escapeHtml(row.sector || "其他")} + ${escapeHtml(row.reason || "")} + + `).join(""); + bindStockRows(body); + document.querySelector("#yesterdayEmptyState").hidden = visibleRows.length !== 0; + updateYesterdayControls(); +} + +function getVisibleYesterdayRows(rows = state.dashboard?.yesterday_limits || []) { + let visibleRows = rows.filter((row) => { + if (state.yesterdayFilter === "advance") return row.outcome === "晋级"; + if (state.yesterdayFilter === "positive") return number(row.current_change) > 0; + if (state.yesterdayFilter === "fail") return row.outcome === "断板"; + if (state.yesterdayFilter === "risk") return ["炸板", "跌停"].includes(row.outcome); + return true; + }); + if (state.yesterdayQuery) { + visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.yesterdayQuery)); + } + if (!state.yesterdaySortKey) return visibleRows; + return visibleRows.sort((left, right) => { + const result = number(left[state.yesterdaySortKey]) - number(right[state.yesterdaySortKey]); + return state.yesterdaySortDirection === "asc" ? result : -result; + }); +} + +function renderYesterdaySummary(rows) { + const total = rows.length; + const advance = rows.filter((row) => row.outcome === "晋级").length; + const positive = rows.filter((row) => number(row.current_change) > 0).length; + const fail = rows.filter((row) => row.outcome === "断板").length; + const risk = rows.filter((row) => ["炸板", "跌停"].includes(row.outcome)).length; + const rate = (value) => total ? value / total * 100 : 0; + setText("yesterdayAllCount", total); + setText("yesterdayAdvanceCount", advance); + setText("yesterdayAdvanceRate", `晋级率 ${formatNumber(rate(advance), 1)}%`); + setText("yesterdayPositiveCount", positive); + setText("yesterdayPositiveRate", `兑现率 ${formatNumber(rate(positive), 1)}%`); + setText("yesterdayFailCount", fail); + setText("yesterdayFailRate", `占 ${formatNumber(rate(fail), 1)}%`); + setText("yesterdayRiskCount", risk); + setText("yesterdayRiskRate", `亏钱效应 ${formatNumber(rate(risk), 1)}%`); +} + +function yesterdayOutcomeClass(outcome) { + return { "晋级": "advance", "断板": "fail", "炸板": "broken", "跌停": "down" }[outcome] || "fail"; +} + +function changeYesterdaySort(key) { + if (state.yesterdaySortKey === key) state.yesterdaySortDirection = state.yesterdaySortDirection === "asc" ? "desc" : "asc"; + else { + state.yesterdaySortKey = key; + state.yesterdaySortDirection = "desc"; + } + renderYesterdayTable(state.dashboard?.yesterday_limits || []); +} + +function updateYesterdayControls() { + document.querySelectorAll("[data-yesterday-filter]").forEach((button) => { + const active = button.dataset.yesterdayFilter === state.yesterdayFilter; + button.classList.toggle("active", active); + button.setAttribute("aria-pressed", String(active)); + }); + document.querySelectorAll("#yesterdayTable th[data-yesterday-sort]").forEach((header) => { + header.classList.remove("sort-asc", "sort-desc", "sorted"); + header.setAttribute("aria-sort", "none"); + if (header.dataset.yesterdaySort === state.yesterdaySortKey) { + header.classList.add(state.yesterdaySortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); + header.setAttribute("aria-sort", state.yesterdaySortDirection === "asc" ? "ascending" : "descending"); + } + const arrow = header.querySelector(".arr"); + if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.yesterdaySortDirection === "asc" ? "▲" : "▼") : "↕"; + }); +} + +function renderPerformance(rows) { + rows = normalizePerformanceRows(rows); + const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); + const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); + setText("performanceDateRange", `昨日 ${previousDate} → 今日 ${currentDate}`); + document.querySelector("#performanceCards").innerHTML = rows.map((row) => ` +
    +
    ${escapeHtml(row.label)} → 今日${performanceRateState(row.advance_rate).label}
    + ${formatNumber(row.advance_rate, 1)}% + 晋级 ${number(row.advanced)} / 共 ${number(row.count)} 只 + +
    + `).join("") || '
    暂无昨日涨停统计
    '; + renderPerformanceConclusion(rows); + renderMarketBreadth(state.dashboard?.overview || {}); +} + +function normalizePerformanceRows(rows) { + const groups = new Map(); + (rows || []).forEach((row) => { + const level = Math.max(1, number(row.level)); + const displayLevel = Math.min(level, 5); + const group = groups.get(displayLevel) || { + level: displayLevel, + label: displayLevel === 1 ? "昨日首板" : displayLevel === 5 ? "昨日5板+" : `昨日${displayLevel}板`, + count: 0, + advanced: 0, + positive: 0, + changeTotal: 0, + }; + const count = number(row.count); + group.count += count; + group.advanced += number(row.advanced); + group.positive += count * number(row.positive_rate) / 100; + group.changeTotal += count * number(row.average_change); + groups.set(displayLevel, group); + }); + return [...groups.values()] + .sort((left, right) => right.level - left.level) + .map((group) => ({ + level: group.level, + label: group.label, + count: group.count, + advanced: group.advanced, + advance_rate: group.count ? group.advanced / group.count * 100 : 0, + positive_rate: group.count ? group.positive / group.count * 100 : 0, + average_change: group.count ? group.changeTotal / group.count : 0, + })); +} + +function performanceRateState(rate) { + const value = number(rate); + if (value === 0) return { label: "失效", className: "is-neutral" }; + if (value < 20) return { label: "危险", className: "is-warning" }; + return { label: "活跃", className: "is-active" }; +} + +function renderPerformanceConclusion(rows) { + const container = document.querySelector("#performanceConclusion"); + if (!rows.length) { + container.innerHTML = '
    暂无昨日梯队数据,暂不生成结论
    '; + return; + } + const sorted = [...rows].sort((left, right) => number(right.level) - number(left.level)); + const highRows = sorted.filter((row) => number(row.level) >= 4); + const highAdvanced = highRows.reduce((total, row) => total + number(row.advanced), 0); + const highSamples = highRows.map((row) => escapeHtml(row.label)).join("、"); + const strongest = [...rows].sort((left, right) => ( + number(right.advance_rate) - number(left.advance_rate) || number(right.level) - number(left.level) + ))[0]; + const firstBoard = rows.find((row) => number(row.level) === 1); + const overview = state.dashboard?.overview || {}; + const phase = overview.sentiment_phase || "观察"; + const up = number(overview.up_count); + const down = number(overview.down_count); + const breadthRate = up + down > 0 ? up / (up + down) * 100 : 50; + const stance = breadthRate < 25 ? "宜守不宜攻" : breadthRate < 45 ? "控制仓位,聚焦核心" : "保持精选,跟随强势梯队"; + const highText = highRows.length + ? `高位晋级率${highAdvanced ? "仍有承接" : "全线失效"}:${highSamples}${highAdvanced ? `共晋级 ${highAdvanced} 只` : "今日均未晋级"};` + : "高位梯队暂无昨日样本,空间信号仍待确认;"; + const strongestText = strongest + ? `${escapeHtml(strongest.label)}晋级率最高,为 ${formatNumber(strongest.advance_rate, 1)}%(${number(strongest.advanced)} 只晋级 / 共 ${number(strongest.count)} 只);` + : "暂无相对占优梯队;"; + const firstBoardText = firstBoard + ? `首板基数 ${number(firstBoard.count)} 只,晋级率 ${formatNumber(firstBoard.advance_rate, 1)}%,低位接力${number(firstBoard.advance_rate) < 20 ? "胜率偏低" : "仍有活跃度"};` + : "首板梯队暂无有效样本;"; + container.innerHTML = ` +
    · ${highText}
    +
    · ${strongestText}
    +
    · ${firstBoardText}
    +
    · 结论:${stance},当前情绪周期「${escapeHtml(phase)}」。
    + `; +} + +/* PRESERVATION-SOURCE-END app.js:1517-1915 */ diff --git a/app/frontend/pages/popularity/page.js b/app/frontend/pages/popularity/page.js new file mode 100644 index 0000000..51bdf71 --- /dev/null +++ b/app/frontend/pages/popularity/page.js @@ -0,0 +1,82 @@ +window.XiaobaiPageModules.register("popularity", ["popularityView"], { + enter: ["loadPopularity"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:2584-2659 */ +async function loadPopularity(force = false) { + if (state.popularityLoading) return; + state.popularityLoading = true; + const button = document.querySelector("#popularityRefreshButton"); + button.disabled = true; + setText("popularityDateLabel", "正在读取人气榜"); + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + if (force) query.set("force", "1"); + state.popularityData = await apiRequest(`/api/popularity?${query}`); + renderPopularity(); + } catch (error) { + setText("popularityDateLabel", error.message || "人气榜暂不可用"); + document.querySelector("#popularityTableBody").innerHTML = ""; + document.querySelector("#popularityEmpty").hidden = false; + showToast(error.message || "人气榜加载失败"); + } finally { + state.popularityLoading = false; + button.disabled = false; + } +} + +function renderPopularity() { + const payload = state.popularityData; + if (!payload) return; + const summary = payload.summary || {}; + setText("popularityDateLabel", `${payload.meta?.carried_forward ? "最近有效榜单" : "榜单日期"} ${payload.meta?.trade_date || "--"}`); + const topNames = (rows) => (rows || []).slice(0, 3).map((item) => item.name).filter(Boolean).join(" · ") || "--"; + document.querySelector("#popularitySummary").innerHTML = [ + ["同花顺热度 Top3", topNames(payload.ths), `共 ${number(summary.ths_count)} 只上榜`], + ["东方财富热度 Top3", topNames(payload.dc), `共 ${number(summary.dc_count)} 只上榜`], + ["双榜共识", `${number(summary.dual_count)} 只`, "同时进入两榜,共识度更高"], + ].map(([label, value, detail], index) => `
    ${label}${escapeHtml(value)}${escapeHtml(detail)}
    `).join(""); + renderPopularityTable(); +} + +function renderPopularityTable() { + const source = state.popularitySource; + let rows = [...(state.popularityData?.[source] || [])]; + if (state.popularityQuery) { + rows = rows.filter((item) => `${item.code} ${item.name} ${(item.concepts || []).join(" ")}`.toLocaleLowerCase("zh-CN").includes(state.popularityQuery)); + } + const combined = source === "combined"; + const sourceName = source === "ths" ? "同花顺" : source === "dc" ? "东方财富" : "双榜综合"; + setText("popularityTableTitle", `${sourceName}榜`); + setText("popularityTableNote", combined ? "按双榜排名综合排序 · 已隐藏重复的榜单状态" : "按榜单名次排序 · 状态显示是否同时进入另一榜"); + const headers = [ + ["排名", "number num"], ["股票", ""], ["最新价(元)", "number num"], ["涨跌幅(%)", "number num"], + ...(source !== "dc" ? [["同花顺", "number num"]] : []), + ...(source !== "ths" ? [["东方财富", "number num"]] : []), + ["排名变化", "number num"], ["热门概念", ""], ...(!combined ? [["榜单状态", ""]] : []), + ]; + document.querySelector("#popularityTableHead").innerHTML = headers.map(([label, className]) => `${label}`).join(""); + const body = document.querySelector("#popularityTableBody"); + body.innerHTML = rows.map((row, index) => { + const thsRank = source === "ths" ? row.rank : row.ths_rank; + const dcRank = source === "dc" ? row.rank : row.dc_rank; + const move = row.rank_change; + const movement = move === null || move === undefined ? "新" : number(move) > 0 ? `↑${number(move)}` : number(move) < 0 ? `↓${Math.abs(number(move))}` : "持平"; + return ` + ${index + 1}${index < 3 ? '' : ""} +
    ${escapeHtml(row.name)}${escapeHtml(row.code)}
    + ${row.price == null ? "" : formatNumber(row.price, 2)} + ${row.change == null ? "" : signed(row.change)} + ${source !== "dc" ? `${thsRank ? number(thsRank) : ""}` : ""} + ${source !== "ths" ? `${dcRank ? number(dcRank) : ""}` : ""} + ${movement} + ${escapeHtml((row.concepts || []).slice(0, 3).join("、"))} + ${!combined ? `${row.dual_source ? "双榜共识" : "单榜入选"}` : ""} + `; + }).join(""); + bindStockRows(body); + markAutoSortableHeaders(body.closest("table")); + document.querySelector("#popularityEmpty").hidden = rows.length > 0; +} + +/* PRESERVATION-SOURCE-END app.js:2584-2659 */ diff --git a/app/frontend/pages/review/page.js b/app/frontend/pages/review/page.js new file mode 100644 index 0000000..801fd2e --- /dev/null +++ b/app/frontend/pages/review/page.js @@ -0,0 +1,699 @@ +window.XiaobaiPageModules.register("review", ["reviewWorkspaceView"], { + enter: ["loadReview"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:3029-3470 */ +async function loadReviewWorkspace() { + try { + const [watchlistPayload, notesPayload, tradesPayload] = await Promise.all([ + apiRequest(`/api/watchlist?trade_date=${encodeURIComponent(elements.tradeDate.value)}`), + apiRequest("/api/notes?scope=daily"), + apiRequest("/api/trades"), + ]); + state.watchlist = watchlistPayload.items || []; + state.notes = notesPayload.items || []; + state.tradeEntries = tradesPayload.items || []; + state.tradeSummary = tradesPayload.summary || {}; + setText("reviewDataDate", displayCompactDate(elements.tradeDate.value)); + renderWatchlist(); + renderNotesHistory(state.notes, document.querySelector("#notesHistory"), false); + setText("notesCount", `${state.notes.length} 条`); + renderTradeLog(); + populateJournalForm(); + } catch (error) { + showToast(error.message || "我的复盘加载失败"); + } +} + +function renderWatchlist() { + setText("watchlistCount", `${state.watchlist.length} 只`); + const body = document.querySelector("#watchlistTableBody"); + body.innerHTML = state.watchlist.map((item) => ` + + ${escapeHtml(item.name)}${escapeHtml(item.code)} + ${escapeHtml(item.sector || "其他")} + ${formatWatchMetric(item.change)} + ${formatWatchMetric(item.return_5d)} + ${item.attention_score == null ? "" : formatNumber(item.attention_score, 1)} + ${escapeHtml(item.remark || "尚未填写")} + + + `).join(""); + document.querySelector("#watchlistEmpty").hidden = state.watchlist.length > 0; + body.querySelectorAll("[data-watch-remark]").forEach((button) => { + button.addEventListener("click", () => { + const item = state.watchlist.find((row) => row.code === button.dataset.watchRemark); + openWatchlistDialog(item); + }); + }); + body.querySelectorAll("[data-watch-delete]").forEach((button) => { + button.addEventListener("click", () => removeWatchlist(button.dataset.watchDelete)); + }); + bindStockRows(body); +} + +function formatWatchMetric(value) { + if (value == null || !Number.isFinite(Number(value))) return ""; + return signed(value); +} + +function openWatchlistDialog(item = null) { + clearTimeout(watchlistSearchTimer); + state.watchlistSelection = item ? { + code: item.code, + name: item.name, + sector: item.sector || "其他", + color: item.color || "red", + } : null; + state.watchlistSearchResults = []; + setText("watchlistDialogTitle", item ? "编辑跟踪备注" : "添加自选"); + document.querySelector("#watchlistRemark").value = item?.remark || ""; + document.querySelector("#watchlistSearchInput").value = ""; + document.querySelector("#watchlistSearchResults").innerHTML = ""; + syncWatchlistSelection(Boolean(item)); + openModalDialog(elements.watchlistDialog); + requestAnimationFrame(() => (item ? document.querySelector("#watchlistRemark") : document.querySelector("#watchlistSearchInput")).focus()); +} + +function closeWatchlistDialog() { + clearTimeout(watchlistSearchTimer); + if (elements.watchlistDialog.open) elements.watchlistDialog.close(); +} + +function clearWatchlistSelection() { + state.watchlistSelection = null; + syncWatchlistSelection(false); + document.querySelector("#watchlistSearchInput").focus(); +} + +function syncWatchlistSelection(editing = false) { + const item = state.watchlistSelection; + document.querySelector("#watchlistSearchField").hidden = Boolean(item); + document.querySelector("#watchlistSelection").hidden = !item; + document.querySelector("#changeWatchlistSelection").hidden = editing; + document.querySelector("#saveWatchlist").disabled = !item; + if (!item) return; + setText("watchlistSelectionName", item.name || "--"); + setText("watchlistSelectionCode", item.code || "--"); + setText("watchlistSelectionSector", item.sector || "其他"); + refreshIcons(); +} + +function scheduleWatchlistSearch() { + clearTimeout(watchlistSearchTimer); + const query = document.querySelector("#watchlistSearchInput").value.trim(); + if (!query) { + document.querySelector("#watchlistSearchResults").innerHTML = ""; + return; + } + document.querySelector("#watchlistSearchResults").innerHTML = '
    正在查找股票
    '; + watchlistSearchTimer = setTimeout(() => runWatchlistSearch(query), 160); +} + +async function runWatchlistSearch(query) { + const sequence = ++state.watchlistSearchRequestSequence; + try { + const params = new URLSearchParams({ q: query, trade_date: elements.tradeDate.value }); + const payload = await apiRequest(`/api/search?${params}`); + if (sequence !== state.watchlistSearchRequestSequence) return; + state.watchlistSearchResults = payload.groups?.stocks || []; + document.querySelector("#watchlistSearchResults").innerHTML = state.watchlistSearchResults.map((item, index) => ` + + `).join("") || '
    没有找到匹配的股票
    '; + } catch (error) { + document.querySelector("#watchlistSearchResults").innerHTML = `
    ${escapeHtml(error.message || "搜索失败")}
    `; + } +} + +function handleWatchlistSearchResult(event) { + const button = event.target.closest("[data-watchlist-result]"); + if (!button) return; + const item = state.watchlistSearchResults[number(button.dataset.watchlistResult)]; + if (!item) return; + state.watchlistSelection = { + code: item.code, + name: item.name, + sector: item.industry || "其他", + color: "red", + }; + syncWatchlistSelection(false); +} + +async function saveWatchlistFromDialog(event) { + event.preventDefault(); + const item = state.watchlistSelection; + if (!item) return; + const button = document.querySelector("#saveWatchlist"); + button.disabled = true; + try { + await apiRequest("/api/watchlist", "POST", { + code: item.code, + name: item.name, + sector: item.sector || "其他", + color: item.color || "red", + remark: document.querySelector("#watchlistRemark").value.trim(), + }); + closeWatchlistDialog(); + await loadReviewWorkspace(); + showToast(state.watchlist.some((row) => row.code === item.code) ? "自选跟踪已保存" : "已加入自选"); + } catch (error) { + showToast(error.message || "自选保存失败"); + button.disabled = false; + } +} + +async function toggleActiveWatchlist() { + const stock = state.activeStock; + if (!stock?.code) return; + const isWatched = Boolean(state.stockDetail?.stock?.watchlist || state.watchlist.some((item) => item.code === stock.code)); + try { + if (isWatched) { + await apiRequest(`/api/watchlist/${stock.code}`, "DELETE"); + state.watchlist = state.watchlist.filter((item) => item.code !== stock.code); + if (state.stockDetail?.stock) state.stockDetail.stock.watchlist = null; + showToast("已移出自选"); + } else { + const payload = await apiRequest("/api/watchlist", "POST", { + code: stock.code, + name: stock.name || "--", + sector: stock.sector || "其他", + color: "red", + }); + state.watchlist = payload.items || state.watchlist; + if (state.stockDetail?.stock) state.stockDetail.stock.watchlist = state.watchlist.find((item) => item.code === stock.code); + showToast("已加入自选"); + } + updateWatchButton(); + renderWatchlist(); + } catch (error) { + showToast(error.message); + } +} + +function updateWatchButton() { + const code = state.activeStock?.code; + const watched = Boolean(state.stockDetail?.stock?.watchlist || state.watchlist.some((item) => item.code === code)); + setText("watchStockButton", watched ? "移出自选" : "加入自选"); +} + +async function removeWatchlist(code) { + try { + await apiRequest(`/api/watchlist/${code}`, "DELETE"); + state.watchlist = state.watchlist.filter((item) => item.code !== code); + renderWatchlist(); + showToast("已移出自选"); + } catch (error) { + showToast(error.message); + } +} + +async function saveJournal(event) { + event.preventDefault(); + try { + await apiRequest("/api/notes", "POST", { + trade_date: document.querySelector("#journalDate").value, + id: state.editingDailyNoteId || undefined, + summary: document.querySelector("#journalSummary").value, + content: document.querySelector("#journalContent").value, + plan: document.querySelector("#journalPlan").value, + }); + await loadReviewWorkspace(); + showToast("每日复盘已保存"); + } catch (error) { + showToast(error.message); + } +} + +function populateJournalForm() { + const selectedDate = document.querySelector("#journalDate").value.replaceAll("-", ""); + const note = state.notes.find((item) => String(item.trade_date).replaceAll("-", "") === selectedDate); + state.editingDailyNoteId = number(note?.id); + document.querySelector("#journalSummary").value = note?.summary || ""; + document.querySelector("#journalContent").value = note?.content || ""; + document.querySelector("#journalPlan").value = note?.plan || ""; +} + +function openTradeLogDialog() { + resetTradeLogForm(); + openModalDialog(elements.tradeLogDialog); + requestAnimationFrame(() => document.querySelector("#tradeLogCode").focus()); +} + +function closeTradeLogDialog() { + if (elements.tradeLogDialog.open) elements.tradeLogDialog.close(); + else resetTradeLogForm(); +} + +async function saveTradeLog(event) { + event.preventDefault(); + const button = document.querySelector("#saveTradeLog"); + button.disabled = true; + try { + const payload = await apiRequest("/api/trades", "POST", { + id: state.editingTradeId || undefined, + trade_date: document.querySelector("#tradeLogDate").value, + code: document.querySelector("#tradeLogCode").value.trim(), + name: document.querySelector("#tradeLogName").value.trim(), + action: document.querySelector("#tradeLogAction").value, + price: document.querySelector("#tradeLogPrice").value, + quantity: document.querySelector("#tradeLogQuantity").value, + position_pct: document.querySelector("#tradeLogPosition").value, + pnl_amount: document.querySelector("#tradeLogPnlAmount").value, + pnl_pct: document.querySelector("#tradeLogPnlPct").value, + emotion: document.querySelector("#tradeLogEmotion").value, + tags: document.querySelector("#tradeLogTags").value, + thesis: document.querySelector("#tradeLogThesis").value, + execution: document.querySelector("#tradeLogExecution").value, + }); + state.tradeEntries = payload.items || []; + state.tradeSummary = payload.summary || {}; + renderTradeLog(); + closeTradeLogDialog(); + showToast("交易记录已保存"); + } catch (error) { + showToast(error.message || "交易记录保存失败"); + } finally { + button.disabled = false; + } +} + +function resetTradeLogForm() { + state.editingTradeId = 0; + document.querySelector("#tradeLogForm").reset(); + document.querySelector("#tradeLogDate").value = elements.tradeDate.value || todayString(); + document.querySelector("#tradeLogQuantity").value = "0"; + document.querySelector("#tradeLogPosition").value = "0"; + setText("tradeLogDialogTitle", "交易日志"); + setText("saveTradeLog", "保存交易"); +} + +function editTradeLog(id) { + const item = state.tradeEntries.find((entry) => number(entry.id) === id); + if (!item) return; + state.editingTradeId = id; + document.querySelector("#tradeLogDate").value = displayCompactDate(item.trade_date); + document.querySelector("#tradeLogCode").value = item.code; + document.querySelector("#tradeLogName").value = item.name; + document.querySelector("#tradeLogAction").value = item.action; + document.querySelector("#tradeLogPrice").value = item.price; + document.querySelector("#tradeLogQuantity").value = item.quantity; + document.querySelector("#tradeLogPosition").value = item.position_pct; + document.querySelector("#tradeLogPnlAmount").value = item.pnl_amount ?? ""; + document.querySelector("#tradeLogPnlPct").value = item.pnl_pct ?? ""; + document.querySelector("#tradeLogEmotion").value = item.emotion; + document.querySelector("#tradeLogTags").value = (item.tags || []).join(", "); + document.querySelector("#tradeLogThesis").value = item.thesis || ""; + document.querySelector("#tradeLogExecution").value = item.execution || ""; + setText("tradeLogDialogTitle", "编辑交易日志"); + setText("saveTradeLog", "保存修改"); + openModalDialog(elements.tradeLogDialog); + requestAnimationFrame(() => document.querySelector("#tradeLogCode").focus()); +} + +async function handleTradeLogAction(event) { + const button = event.target.closest("[data-trade-action]"); + if (!button) return; + const id = number(button.dataset.tradeId); + if (button.dataset.tradeAction === "edit") { + editTradeLog(id); + return; + } + if (!window.confirm("确定删除这条交易记录吗?")) return; + try { + const payload = await apiRequest(`/api/trades/${id}`, "DELETE"); + state.tradeEntries = payload.items || []; + state.tradeSummary = payload.summary || {}; + if (state.editingTradeId === id) resetTradeLogForm(); + renderTradeLog(); + showToast("交易记录已删除"); + } catch (error) { + showToast(error.message || "交易记录删除失败"); + } +} + +function renderTradeLog() { + const summary = state.tradeSummary || {}; + setText("tradeLogCount", `${state.tradeEntries.length} 条`); + document.querySelector("#tradeLogSummary").innerHTML = [ + ["记录", `${number(summary.total)} 条`], + ["已实现", `${number(summary.realized)} 条`], + ["胜率", summary.win_rate == null ? "--" : `${formatNumber(summary.win_rate, 1)}%`], + ["累计盈亏", summary.pnl_amount == null ? "--" : `${number(summary.pnl_amount) > 0 ? "+" : ""}${formatNumber(summary.pnl_amount, 2)}`], + ["平均仓位", summary.average_position == null ? "--" : `${formatNumber(summary.average_position, 1)}%`], + ].map(([label, value]) => `
    ${label}${value}
    `).join(""); + document.querySelector("#tradeLogEmpty").hidden = state.tradeEntries.length > 0; + document.querySelector("#tradeLogTableBody").innerHTML = state.tradeEntries.map((item) => ` + + ${displayCompactDate(item.trade_date)} + ${escapeHtml(item.name)}${escapeHtml(item.code)} + ${escapeHtml(item.action_label)} + ${item.position_pct == null ? "" : formatNumber(item.position_pct, 1)} + ${item.pnl_pct == null ? "" : signed(item.pnl_pct)} + ${item.pnl_amount == null ? "" : signed(item.pnl_amount)} + ${escapeHtml(item.emotion_label)}
    ${(item.tags || []).map((tag) => `${escapeHtml(tag)}`).join("")}
    + ${escapeHtml(item.thesis || "")}${escapeHtml(item.execution || "尚未填写执行复核")} +
    + + `).join(""); + bindStockRows(document.querySelector("#tradeLogTableBody")); +} + +async function saveStockNote(event) { + event.preventDefault(); + if (!state.activeStock?.code) return; + try { + await apiRequest("/api/notes", "POST", { + code: state.activeStock.code, + stock_name: state.activeStock.name || "--", + trade_date: elements.tradeDate.value, + content: document.querySelector("#stockNoteContent").value, + plan: document.querySelector("#stockNotePlan").value, + }); + document.querySelector("#stockNoteContent").value = ""; + document.querySelector("#stockNotePlan").value = ""; + const payload = await apiRequest(`/api/notes?scope=stock&code=${encodeURIComponent(state.activeStock.code)}`); + state.stockDetail.notes = payload.items || []; + renderStockNotes(state.stockDetail.notes); + showToast("个股笔记已保存"); + } catch (error) { + showToast(error.message); + } +} + +async function saveReasonOverride(event) { + event.preventDefault(); + if (!state.activeStock?.code) return; + const reason = document.querySelector("#reasonInput").value.trim(); + try { + await apiRequest("/api/reasons", "POST", { + trade_date: elements.tradeDate.value, + code: state.activeStock.code, + reason, + }); + state.activeStock.reason = reason; + for (const key of ["limits", "broken", "down_limits"]) { + const row = state.dashboard?.[key]?.find((item) => item.code === state.activeStock.code); + if (row) row.reason = reason; + } + setText("detailReason", reason); + renderDashboard(); + showToast("事件逻辑已修订"); + } catch (error) { + showToast(error.message); + } +} + +function renderMoneyflow(flow) { + for (const [id, value] of [["flowNet", flow.net_million], ["flowLarge", flow.large_million], ["flowMedium", flow.medium_million], ["flowSmall", flow.small_million]]) { + const element = document.getElementById(id); + element.textContent = formatMoneyMillion(value); + element.className = changeClass(value); + } +} + +function renderStockNotes(notes) { + renderNotesHistory(notes, document.querySelector("#stockNotes"), true); +} + +function renderNotesHistory(notes, container, compact) { + container.innerHTML = notes.map((note) => ` +
    +
    ${note.stock_name ? `${escapeHtml(note.stock_name)}` : ""}
    + ${!compact ? `
    盘面

    ${escapeHtml(note.summary || "--")}

    ` : ""} +
    复盘

    ${escapeHtml(note.content || "--")}

    +
    计划

    ${escapeHtml(note.plan || "--")}

    + +
    + `).join("") || emptyStateHtml("暂无复盘记录"); + container.querySelectorAll("[data-note-delete]").forEach((button) => { + button.addEventListener("click", () => deleteNote(number(button.dataset.noteDelete), compact)); + }); +} + +async function deleteNote(noteId, compact) { + try { + await apiRequest(`/api/notes/${noteId}`, "DELETE"); + if (compact && state.activeStock) { + state.stockDetail.notes = state.stockDetail.notes.filter((note) => number(note.id) !== noteId); + renderStockNotes(state.stockDetail.notes); + } else { + await loadReviewWorkspace(); + } + showToast("笔记已删除"); + } catch (error) { + showToast(error.message); + } +} + +/* PRESERVATION-SOURCE-END app.js:3029-3470 */ +/* PRESERVATION-SOURCE-BEGIN app.js:7720-7968 */ +async function loadAlerts(openDialog = false) { + try { + const query = new URLSearchParams({ status: state.alertFilter, as_of: todayString() }); + const payload = await apiRequest(`/api/alerts?${query}`); + state.alerts = payload.items || []; + state.alertUnreadCount = number(payload.unread_count); + renderAlerts(); + if (openDialog) openModalDialog(elements.alertsDialog); + } catch (error) { + if (openDialog) showToast(error.message || "提醒加载失败"); + } +} + +function openAlerts() { + toggleHeaderCommandMenu(false); + toggleAccountDropdown(false); + document.querySelector("#alertDate").value ||= todayString(); + openModalDialog(elements.alertsDialog); + loadAlerts(); +} + +function openStockReminder() { + const stock = state.activeStock || {}; + document.querySelector("#alertTitle").value = `${stock.name || stock.code || "个股"}观察提醒`; + document.querySelector("#alertCode").value = stock.code || ""; + document.querySelector("#alertDate").value = todayString(); + if (elements.stockDialog.open) elements.stockDialog.close(); + openAlerts(); + document.querySelector("#alertContent").focus(); +} + +function selectAlertFilter(filter) { + state.alertFilter = filter === "unread" ? "unread" : "all"; + document.querySelectorAll("[data-alert-filter]").forEach((button) => { + button.classList.toggle("active", button.dataset.alertFilter === state.alertFilter); + }); + loadAlerts(); +} + +async function saveAlert(event) { + event.preventDefault(); + const button = event.currentTarget.querySelector("button[type='submit']"); + button.disabled = true; + try { + const payload = await apiRequest("/api/alerts", "POST", { + title: document.querySelector("#alertTitle").value.trim(), + remind_date: document.querySelector("#alertDate").value, + code: document.querySelector("#alertCode").value.trim(), + content: document.querySelector("#alertContent").value.trim(), + }); + event.currentTarget.reset(); + document.querySelector("#alertDate").value = todayString(); + state.alertFilter = "all"; + state.alerts = payload.items || []; + state.alertUnreadCount = number(payload.unread_count); + renderAlerts(); + showToast("提醒已保存"); + } catch (error) { + showToast(error.message || "提醒保存失败"); + } finally { + button.disabled = false; + } +} + +async function markAllAlertsRead() { + try { + await apiRequest("/api/alerts/read-all", "POST", { as_of: todayString() }); + await loadAlerts(); + } catch (error) { + showToast(error.message || "提醒状态更新失败"); + } +} + +async function handleAlertAction(event) { + const button = event.target.closest("[data-alert-action]"); + if (!button) return; + const id = number(button.dataset.alertId); + if (!id) return; + try { + if (button.dataset.alertAction === "delete") { + await apiRequest(`/api/alerts/${id}`, "DELETE"); + } else { + await apiRequest(`/api/alerts/${id}/read`, "POST", {}); + } + await loadAlerts(); + } catch (error) { + showToast(error.message || "提醒操作失败"); + } +} + +function renderAlerts() { + const badge = document.querySelector("#alertBadge"); + badge.hidden = state.alertUnreadCount <= 0; + badge.textContent = state.alertUnreadCount > 99 ? "99+" : String(state.alertUnreadCount); + document.querySelector("#alertButton").classList.toggle("has-alerts", state.alertUnreadCount > 0); + setText("alertListCount", `${state.alerts.length} 条`); + document.querySelectorAll("[data-alert-filter]").forEach((button) => { + button.classList.toggle("active", button.dataset.alertFilter === state.alertFilter); + }); + document.querySelector("#markAllAlertsRead").disabled = state.alertUnreadCount <= 0; + const container = document.querySelector("#alertList"); + container.innerHTML = state.alerts.map((item) => { + const upcoming = !item.due; + const kindLabel = item.kind === "manual" ? "自定提醒" : item.kind === "strategy_t5" ? "跟踪完成" : "策略反馈"; + return `
    +
    +
    +
    ${escapeHtml(kindLabel)}
    + ${escapeHtml(item.title)} + ${item.content ? `

    ${escapeHtml(item.content)}

    ` : ""} + ${item.code ? `` : ""} +
    +
    + ${!item.is_read && !upcoming ? `` : ""} + +
    +
    `; + }).join("") || emptyStateHtml("暂无提醒"); + bindStockRows(container); + refreshIcons(); +} + +async function openReviewAssistant() { + toggleHeaderCommandMenu(false); + toggleAccountDropdown(false); + openModalDialog(elements.assistantDialog); + updateAssistantControls(); + if (!hasMemberAccess()) { + document.querySelector("#closeAssistantDialog").focus(); + return; + } + try { + const payload = await apiRequest("/api/assistant/messages"); + state.assistantMessages = payload.items || []; + renderAssistantMessages(); + } catch (error) { + showToast(error.message || "对话记录加载失败"); + } + document.querySelector("#assistantQuestion").focus(); +} + +function useAssistantPrompt(prompt) { + const input = document.querySelector("#assistantQuestion"); + input.value = prompt; + input.focus(); +} + +async function sendAssistantQuestion(event) { + event.preventDefault(); + if (state.assistantLoading) return; + const input = document.querySelector("#assistantQuestion"); + const question = input.value.trim(); + if (!question) return; + input.value = ""; + state.assistantMessages.push({ role: "user", content: question, context_date: elements.tradeDate.value.replaceAll("-", "") }); + state.assistantMessages.push({ role: "assistant", content: "", streaming: true, context_date: elements.tradeDate.value.replaceAll("-", "") }); + state.assistantLoading = true; + state.assistantController = new AbortController(); + updateAssistantControls(); + renderAssistantMessages(); + try { + await streamAssistantRequest(question, state.assistantController.signal, (chunk) => { + const message = state.assistantMessages.at(-1); + if (message?.role === "assistant") message.content += chunk; + scheduleAssistantRender(); + }); + const message = state.assistantMessages.at(-1); + if (message) message.streaming = false; + setStatus("复盘助手回答完成"); + } catch (error) { + const message = state.assistantMessages.at(-1); + if (message?.role === "assistant") { + message.streaming = false; + message.error = true; + if (!message.content) message.content = error.name === "AbortError" ? "已停止生成。" : error.message || "回答失败,请稍后重试。"; + } + if (error.name !== "AbortError") showToast(error.message || "复盘助手回答失败"); + } finally { + state.assistantLoading = false; + state.assistantController = null; + updateAssistantControls(); + renderAssistantMessages(); + input.focus(); + } +} + +async function streamAssistantRequest(question, signal, onDelta) { + await window.XiaobaiAPI.streamNdjson("/api/assistant/chat", { + method: "POST", + body: { question, trade_date: elements.tradeDate.value }, + signal, + errorMessage: "复盘助手暂不可用", + onEvent: (event) => { + if (event.type === "delta") onDelta(String(event.content || "")); + }, + }); +} + +function stopAssistantResponse() { + state.assistantController?.abort(); +} + +async function clearAssistantConversation() { + if (state.assistantLoading || !state.assistantMessages.length) return; + if (!window.confirm("确定清空复盘助手的对话记录吗?")) return; + try { + await apiRequest("/api/assistant/messages", "DELETE"); + state.assistantMessages = []; + renderAssistantMessages(); + } catch (error) { + showToast(error.message || "对话记录清空失败"); + } +} + +function scheduleAssistantRender() { + if (assistantRenderFrame) return; + assistantRenderFrame = requestAnimationFrame(() => { + assistantRenderFrame = 0; + renderAssistantMessages(); + }); +} + +function renderAssistantMessages() { + const container = document.querySelector("#assistantMessages"); + container.innerHTML = state.assistantMessages.map((message) => ` +
    +
    ${message.role === "user" ? "我" : "复盘助手"}${message.context_date ? `` : ""}
    +
    ${message.role === "assistant" ? (message.content ? formatMentorAnswer(message.content) : '正在整理复盘数据') : escapeHtml(message.content)}
    + ${message.streaming ? '' : ""} +
    + `).join("") || emptyStateHtml("可以从市场、策略或自己的交易记录开始复盘"); + updateAssistantControls(); + requestAnimationFrame(() => { container.scrollTop = container.scrollHeight; }); +} + +function updateAssistantControls() { + const unlocked = hasMemberAccess(); + elements.assistantDialog.classList.toggle("member-locked", !unlocked); + document.querySelector("#assistantMemberGate").hidden = unlocked; + document.querySelector("#assistantMemberContent").setAttribute("aria-disabled", String(!unlocked)); + document.querySelector("#assistantQuestion").disabled = !unlocked || state.assistantLoading; + document.querySelector("#sendAssistant").disabled = !unlocked || state.assistantLoading; + document.querySelector("#stopAssistant").hidden = !unlocked || !state.assistantLoading; + document.querySelector("#clearAssistantMessages").disabled = !unlocked || state.assistantLoading || !state.assistantMessages.length; + document.querySelectorAll("[data-assistant-prompt]").forEach((button) => { + button.disabled = !unlocked || state.assistantLoading; + }); +} + +/* PRESERVATION-SOURCE-END app.js:7720-7968 */ diff --git a/app/frontend/pages/rotation/page.js b/app/frontend/pages/rotation/page.js new file mode 100644 index 0000000..0670b30 --- /dev/null +++ b/app/frontend/pages/rotation/page.js @@ -0,0 +1,173 @@ +window.XiaobaiPageModules.register("rotation", ["rotationView"], { + enter: ["loadRotation"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:1958-2124 */ +async function loadRotationHistory(force = false) { + if (!state.dashboard || state.rotationLoading) return; + const key = `${elements.tradeDate.value}:9`; + if (!force && state.rotationHistoryKey === key && state.rotationHistory) { + renderRotationHistory(); + return; + } + state.rotationLoading = true; + const container = document.querySelector("#rotationHistory"); + renderEmptyState(container, "正在读取轮动历史"); + try { + const query = new URLSearchParams({ + trade_date: elements.tradeDate.value, + }); + state.rotationHistory = await apiRequest(`/api/rotation/history?${query}`); + state.rotationHistoryKey = key; + renderRotationHistory(); + } catch (error) { + renderEmptyState(container, error.message || "轮动历史加载失败"); + showToast(error.message || "轮动历史加载失败"); + } finally { + state.rotationLoading = false; + } +} + +function renderRotationHistory() { + const rows = state.rotationHistory?.rows || []; + const selected = state.rotationSelectedSector; + const container = document.querySelector("#rotationHistory"); + const tracker = document.querySelector("#rotationTracker"); + if (!rows.length) { + renderEmptyState(container, "尚无连续交易日的板块数据"); + setText("rotationHistoryRange", "暂无轮动历史"); + tracker.hidden = true; + return; + } + const chronological = [...rows] + .sort((left, right) => String(left.trade_date).localeCompare(String(right.trade_date))) + .slice(-9); + const displayRows = state.rotationOrder === "latest" ? [...chronological].reverse() : chronological; + document.querySelectorAll("[data-rotation-order]").forEach((button) => { + button.classList.toggle("active", button.dataset.rotationOrder === state.rotationOrder); + }); + setText( + "rotationHistoryRange", + `最近 ${chronological.length} 个交易日 · ${displayCompactDate(chronological[0].trade_date)} → ${displayCompactDate(chronological[chronological.length - 1].trade_date)} · ${state.rotationOrder === "latest" ? "由近到远,左侧为最新交易日" : "由远到近,右侧为最新交易日"}`, + ); + setText("rotationSelectionHint", selected ? `已联动高亮 ${selected}` : "点击任意板块追踪其连续性"); + if (selected) { + const sequence = displayRows.map((day) => { + const sector = (day.sectors || []).find((item) => item.name === selected); + return { tradeDate: day.trade_date, sector }; + }); + const appearances = sequence.filter((item) => item.sector); + const bestRank = appearances.length ? Math.min(...appearances.map((item) => number(item.sector.rank))) : 0; + tracker.hidden = false; + const continuity = appearances.length >= 3 ? "主线候选" : appearances.length === 1 ? "单日异动,持续性待验证" : "间断活跃"; + tracker.innerHTML = ` +
    ${escapeHtml(selected)}近 9 日在榜 ${appearances.length} 天 · 最高排名 #${bestRank || "--"} · ${continuity}
    +
    + ${sequence.map((item) => item.sector + ? `#${number(item.sector.rank)}` + : `--`).join("")} +
    + `; + tracker.querySelector(".rotation-track-cancel").addEventListener("click", () => { + state.rotationSelectedSector = ""; + state.rotationSelectedDate = ""; + renderRotationHistory(); + loadRotationMembers(""); + }); + } else { + tracker.hidden = true; + tracker.innerHTML = ""; + } + container.classList.toggle("tracking", Boolean(selected)); + const latestTradeDate = chronological[chronological.length - 1].trade_date; + container.innerHTML = displayRows.map((day) => { + const hasSelected = selected && (day.sectors || []).some((sector) => sector.name === selected); + return ` +
    +
    ${(day.sectors || []).length} 个热点
    +
    ${(day.sectors || []).map((sector) => { + const strength = clamp(number(sector.strength), 0, 100); + const heatClass = strength >= 90 ? "heat-strong" : strength >= 70 ? "heat-warm" : "heat-mild"; + return ` + `; + }).join("")}
    +
    `; + }).join(""); + container.querySelectorAll("[data-rotation-sector]").forEach((button) => { + button.addEventListener("click", () => { + const clickedSector = button.dataset.rotationSector; + const clickedDate = button.dataset.rotationDate; + const isSameSelection = clickedSector === state.rotationSelectedSector + && clickedDate === state.rotationSelectedDate; + state.rotationSelectedSector = isSameSelection ? "" : clickedSector; + state.rotationSelectedDate = isSameSelection ? "" : clickedDate; + renderRotationHistory(); + loadRotationMembers(state.rotationSelectedSector); + }); + }); +} + +async function loadRotationMembers(sector, force = false) { + if (!sector) { + state.rotationMembers = null; + state.rotationMembersKey = ""; + renderRotationMembers(); + return; + } + const memberDate = state.rotationSelectedDate || elements.tradeDate.value; + const key = `${memberDate}:${sector}`; + if (!force && state.rotationMembersKey === key && state.rotationMembers) { + renderRotationMembers(); + return; + } + state.rotationMembersLoading = true; + renderRotationMembers(); + try { + const query = new URLSearchParams({ trade_date: memberDate, sector }); + state.rotationMembers = await apiRequest(`/api/rotation/members?${query}`); + state.rotationMembersKey = key; + } catch (error) { + state.rotationMembers = { error: error.message || "成分股加载失败", rows: [] }; + state.rotationMembersKey = key; + } finally { + state.rotationMembersLoading = false; + renderRotationMembers(); + } +} + +function renderRotationMembers() { + const body = document.querySelector("#rotationTableBody"); + const empty = document.querySelector("#rotationMembersEmpty"); + if (state.rotationMembersLoading) { + body.innerHTML = ""; + empty.textContent = `正在核验${state.rotationSelectedSector}成分股`; + empty.hidden = false; + return; + } + const payload = state.rotationMembers; + const rows = payload?.rows || []; + if (!state.rotationSelectedSector || !payload || payload.error || !rows.length) { + body.innerHTML = ""; + empty.textContent = payload?.error || (state.rotationSelectedSector ? "该板块暂无可用成分行情" : "点击上方任意板块查看成分股"); + empty.hidden = false; + setText("rotationDetailTitle", "板块成分股"); + setText("rotationDetailMeta", state.rotationSelectedSector || "--"); + return; + } + empty.hidden = true; + setText("rotationDetailTitle", `${payload.meta?.sector_name || state.rotationSelectedSector}成分股`); + setText("rotationDetailMeta", `${displayCompactDate(payload.meta?.trade_date)} · ${number(payload.meta?.quoted_count)} / ${number(payload.meta?.member_count)} 只`); + body.innerHTML = rows.map((row, index) => ` + ${index + 1}${escapeHtml(row.code)}${escapeHtml(row.name)} + ${row.quoted ? signed(row.change) : ""} + ${row.quoted ? formatNumber(row.open, 2) : ""}${row.quoted ? formatNumber(row.close, 2) : ""} + ${row.quoted ? formatNumber(row.amount_billion, 2) : ""}${row.quoted ? "正常交易" : "当日无行情"} + `).join(""); + animateRows(body); + bindStockRows(body); +} + +/* PRESERVATION-SOURCE-END app.js:1958-2124 */ diff --git a/app/static/pages/runtime.js b/app/frontend/pages/runtime.js similarity index 100% rename from app/static/pages/runtime.js rename to app/frontend/pages/runtime.js diff --git a/app/frontend/pages/screener/page.js b/app/frontend/pages/screener/page.js new file mode 100644 index 0000000..a958bc9 --- /dev/null +++ b/app/frontend/pages/screener/page.js @@ -0,0 +1,1082 @@ +window.XiaobaiPageModules.register("screener", ["screenerView"], { + enter: ["loadScreener"], +}); + +window.XiaobaiPageModules.register("screener", ["screenerTrackingView"]); + +/* PRESERVATION-SOURCE-BEGIN app.js:3490-4336 */ +function screenerStrategyKey(strategyId, strategyName) { + return strategyId != null && strategyId !== 0 ? `id:${strategyId}` : `name:${strategyName || ""}`; +} + +function currentScreenerStrategy(mode) { + if (mode === "curated") return activeCuratedStrategy(); + if (mode === "smart") return state.selectedStrategy; + return null; +} + +function screenerResultContext(mode, result, { regime, strategyId = null, strategyName = "" } = {}) { + const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; + return { + mode: normalizedMode, + regime: regime || result?.meta?.regime || state.selectedRegime, + strategyName: strategyName || result?.meta?.strategy_name || "", + strategyKey: screenerStrategyKey( + strategyId, + strategyName || result?.meta?.strategy_name || "", + ), + }; +} + +function screenerResultKey(context) { + if (!context) return ""; + if (context.mode === "quant") return "quant"; + if (context.mode === "curated") return JSON.stringify(["curated", context.strategyKey]); + return JSON.stringify(["smart", context.regime, context.strategyKey]); +} + +function selectedScreenerResultKey(mode) { + const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; + if (normalizedMode === "quant") return "quant"; + const strategy = currentScreenerStrategy(mode); + if (!strategy) return ""; + return screenerResultKey(screenerResultContext(normalizedMode, null, { + regime: state.selectedRegime, + strategyId: strategy.id, + strategyName: strategy.name, + })); +} + +function activeScreenerResultEntry(mode = state.screenerMode) { + const key = selectedScreenerResultKey(mode); + return key ? state.screenerResultStore[key] || null : null; +} + +function screenerResultMatchesSelection(mode) { + return Boolean(activeScreenerResultEntry(mode)); +} + +function activeScreenerResult(mode = state.screenerMode) { + return activeScreenerResultEntry(mode)?.result || null; +} + +function activeScreenerResultContext(mode = state.screenerMode) { + return activeScreenerResultEntry(mode)?.context || null; +} + +function storeScreenerResult( + mode, + result, + { regime, strategyId = null, strategyName = "" } = {}, + updateLatest = true, +) { + const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; + const context = result + ? screenerResultContext(normalizedMode, result, { regime, strategyId, strategyName }) + : null; + const key = screenerResultKey(context); + if (key && result) state.screenerResultStore[key] = { result, context }; + if (updateLatest) { + state.screenerResults[normalizedMode] = result || null; + state.screenerResultContexts[normalizedMode] = context; + } +} + +function setScreenerResult(mode, result, options = {}) { + storeScreenerResult(mode, result, options, true); +} + +function applyScreenerSetup(payload, requestKey) { + const dateChanged = Boolean(state.screenerSetupKey && state.screenerSetupKey !== requestKey); + if (dateChanged) { + state.screenerResults = { smart: null, curated: null, quant: null }; + state.screenerResultContexts = { smart: null, curated: null, quant: null }; + state.screenerResultStore = {}; + } + state.screenerSetup = payload; + state.screenerSetupKey = requestKey; + + const latestResults = { ...(payload.latest_results || {}) }; + if (!latestResults.smart && payload.latest_result) latestResults.smart = payload.latest_result; + const smartLatestMeta = latestResults.smart?.meta || {}; + const curatedLatestMeta = latestResults.curated?.meta || {}; + state.selectedRegime = payload.regime.id; + + const selectedId = state.selectedStrategy?.id; + const smartStrategies = payload.strategies.filter((item) => item.formula?.meta?.library !== "curated"); + const curatedStrategies = payload.strategies.filter((item) => item.formula?.meta?.library === "curated"); + const latestSmartStrategy = smartStrategies.find((item) => item.name === smartLatestMeta.strategy_name); + state.selectedStrategy = smartStrategies.find((item) => item.id === selectedId) + || latestSmartStrategy + || smartStrategies.find((item) => item.regimes.includes(state.selectedRegime)) + || smartStrategies[0] + || null; + + if (!curatedStrategies.some((item) => item.id === state.selectedCuratedStrategyId) || dateChanged) { + state.selectedCuratedStrategyId = curatedStrategies.find( + (item) => item.name === curatedLatestMeta.strategy_name, + )?.id || curatedStrategies[0]?.id || 0; + } + + for (const result of [...(payload.recent_results || [])].reverse()) { + const mode = ["smart", "curated", "quant"].includes(result.meta?.mode) + ? result.meta.mode + : "smart"; + const strategies = mode === "curated" ? curatedStrategies : smartStrategies; + const strategy = strategies.find((item) => item.name === result.meta?.strategy_name); + storeScreenerResult(mode, result, { + regime: result.meta?.regime || payload.regime.id, + strategyId: strategy?.id, + strategyName: result.meta?.strategy_name || strategy?.name || "", + }, false); + } + + for (const mode of ["smart", "curated", "quant"]) { + if (state.screenerResults[mode] || !latestResults[mode]) continue; + const result = latestResults[mode]; + const meta = result.meta || {}; + const strategy = mode === "curated" + ? curatedStrategies.find((item) => item.name === meta.strategy_name) + : mode === "smart" + ? smartStrategies.find((item) => item.name === meta.strategy_name) + : null; + setScreenerResult(mode, result, { + regime: meta.regime || payload.regime.id, + strategyId: strategy?.id, + strategyName: meta.strategy_name || strategy?.name || "", + }); + } + if (!state.quantScores.length) resetQuantBuilder(false); + renderScreenerSetup(); + renderScreenerResult(); +} + +async function loadScreenerSetup(force = false) { + const requestKey = elements.tradeDate.value.replaceAll("-", ""); + if (!force && state.screenerSetup && state.screenerSetupKey === requestKey) { + renderScreenerSetup(); + renderScreenerResult(); + return state.screenerSetup; + } + if (!force && state.screenerSetupPromise && state.screenerSetupRequestKey === requestKey) { + return state.screenerSetupPromise; + } + const request = (async () => { + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + const payload = await apiRequest(`/api/screener/setup?${query}`); + applyScreenerSetup(payload, requestKey); + await loadScreenerTracking(); + return payload; + } catch (error) { + showToast(error.message || "选股配置加载失败"); + return null; + } finally { + if (state.screenerSetupPromise === request) { + state.screenerSetupPromise = null; + state.screenerSetupRequestKey = ""; + } + } + })(); + state.screenerSetupRequestKey = requestKey; + state.screenerSetupPromise = request; + return request; +} + +function renderScreenerSetup() { + const setup = state.screenerSetup; + if (!setup) return; + setText("screenerDateLabel", `数据日期 ${displayCompactDate(setup.trade_date)}`); + setText("regimeLabel", setup.regime.label); + setText("regimeConfidence", `置信度 ${formatNumber(setup.regime.confidence, 0)}%`); + setText("regimeStepStatus", `${setup.regime.label} · 置信度 ${formatNumber(setup.regime.confidence, 0)}%`); + setText("regimeReason", setup.regime.reason); + const evidence = (setup.regime.evidence || []).filter(Boolean); + if (!evidence.some((item) => String(item).includes("情绪温度"))) { + const temperature = formatNumber(state.dashboard?.overview?.sentiment_score, 0); + const direction = state.dashboard?.overview?.sentiment_direction; + evidence.unshift(`情绪温度 ${temperature}${direction ? `,较前一交易日${direction}` : ""}`); + } + document.querySelector("#regimeEvidenceList").textContent = evidence.join(" · "); + setText("factorDateCount", `${number(setup.factor_data.date_count)} 日`); + setText("factorDateRange", setup.factor_data.ready + ? `${displayCompactDate(setup.factor_data.start_date)} 至 ${displayCompactDate(setup.factor_data.end_date)} · 竞价 ${number(setup.factor_data.auction_date_count)} 日` + : "尚未达到 21 个交易日"); + setText("factorTaskStatus", setup.factor_data.ready ? `已就绪 · ${number(setup.factor_data.date_count)} 日` : "需要同步"); + setText("compilerStatus", "策略生成已就绪"); + setText( + "screenerRunStatus", + activeScreenerResult("smart") ? `已有结果 · ${(activeScreenerResult("smart").candidates || []).length} 只` : "等待执行", + ); + setText("strategyCount", `${setup.strategies.filter((item) => item.formula?.meta?.library !== "curated").length} 套`); + updateBacktestTaskStatus(); + selectScreenerMobileView(state.screenerMobileView); + + const selector = document.querySelector("#regimeSelector"); + selector.innerHTML = setup.regimes.map((item) => ` + ${escapeHtml(item.label)} + `).join(""); + renderStrategyList(); + renderStrategySummary(); + renderScreenerMode(); + renderCuratedStrategyLibrary(); + renderQuantBuilder(); + renderScreenerProgress(); +} + +function renderStrategySummary() { + const strategy = state.selectedStrategy; + setText("activeStrategyHeading", strategy?.name || "--"); + setText("activeStrategyEditorHeading", strategy?.name || "--"); + setText("activeStrategyDescription", strategy?.description || "等待匹配当前市场阶段的策略。"); + setText("strategyStepStatus", strategy?.name || "等待匹配"); + document.querySelector("#activeStrategyRegimes").innerHTML = strategy + ? `${strategy.regimes.map((item) => `${escapeHtml(regimeLabel(item))}`).join("")}${strategy.builtin ? "内置" : "自定义"}` + : ""; +} + +function selectScreenerMode(mode) { + state.screenerMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; + localStorage.setItem("xiaobaiScreenerMode", state.screenerMode); + state.screenerMobileView = "strategy"; + renderScreenerMode(); + selectScreenerMobileView("strategy"); +} + +function renderScreenerMode() { + const mode = state.screenerMode || "smart"; + document.querySelectorAll("[data-screener-mode]").forEach((button) => { + const active = button.dataset.screenerMode === mode; + button.classList.toggle("active", active); + button.setAttribute("aria-selected", String(active)); + }); + document.querySelectorAll("[data-screener-panel]").forEach((panel) => { + panel.hidden = panel.dataset.screenerPanel !== mode; + }); + const results = document.querySelector("#screenerView .screener-results-view"); + const resultsSlot = document.querySelector(`[data-screener-results-slot="${mode}"]`); + if (results && resultsSlot && results.parentElement !== resultsSlot) resultsSlot.append(results); + const titles = { smart: "盘后候选结果", curated: "策略候选结果", quant: "自定义选股结果" }; + setText("screenerResultTitle", titles[mode]); + renderScreenerResult(); +} + +function curatedStrategies() { + return (state.screenerSetup?.strategies || []).filter((item) => item.formula?.meta?.library === "curated"); +} + +function activeCuratedStrategy() { + const strategies = curatedStrategies(); + return strategies.find((item) => item.id === state.selectedCuratedStrategyId) || strategies[0] || null; +} + +function curatedStrategySchool(strategy) { + const category = String(strategy?.formula?.meta?.category || ""); + if (["红利价值", "质量价值", "现金流价值", "成长质量", "小盘质量"].includes(category)) return "基本面"; + if (["行业轮动", "形态突破", "趋势追踪"].includes(category)) return "趋势"; + if (["短线竞价", "连板接力", "低吸反核"].includes(category)) return "短线"; + if (["动量反转"].includes(category)) return "动量"; + if (["元策略", "多因子"].includes(category)) return "量化"; + if (["业绩事件", "热度观察"].includes(category)) return "事件"; + if (["资金席位"].includes(category)) return "资金"; + if (/红利|价值|质量|成长|财务|现金流/.test(category)) return "基本面"; + if (/趋势|轮动|突破/.test(category)) return "趋势"; + if (/竞价|连板|龙头|反核|首阴|反包|打板/.test(category)) return "短线"; + if (/动量|反转/.test(category)) return "动量"; + if (/因子|量化|元策略/.test(category)) return "量化"; + if (/事件|热度|公告|业绩/.test(category)) return "事件"; + if (/席位|资金/.test(category)) return "资金"; + return "其他"; +} + +function curatedSchoolIcon(school) { + return { + 基本面: "circle-dollar-sign", 趋势: "trending-up", 短线: "zap", + 动量: "refresh-cw", 量化: "binary", 事件: "calendar-clock", 资金: "landmark", 其他: "boxes", + }[school] || "boxes"; +} + +function curatedStrategyRunState(strategy, result) { + const missingData = strategy?.missing_data || []; + if (!strategy?.data_ready || missingData.length) { + return { label: "数据不足", className: "missing", verifiedEmpty: false }; + } + if (!result) return { label: "等待盘后", className: "pending", verifiedEmpty: false }; + const count = (result.candidates || []).length; + if (count) return { label: `${count} 只候选`, className: "ready", verifiedEmpty: false }; + return { label: "暂无信号", className: "quiet", verifiedEmpty: true }; +} + +function renderCuratedStrategyLibrary() { + if (!state.screenerSetup) return; + const strategies = curatedStrategies(); + const categories = ["全部", ...new Set(strategies.map((item) => item.formula?.meta?.category || "其他"))]; + const schools = ["全部", "基本面", "趋势", "短线", "动量", "量化", "事件", "资金"]; + if (!categories.includes(state.curatedCategory)) state.curatedCategory = "全部"; + if (!schools.includes(state.curatedSchool)) state.curatedSchool = "全部"; + setText("curatedStrategyCount", `${strategies.length} 套`); + const categorySelect = document.querySelector("#curatedCategoryFilter"); + categorySelect.innerHTML = categories.map((category) => ` + + `).join(""); + document.querySelector("#curatedSchoolFilters").innerHTML = schools.map((school) => { + const count = school === "全部" ? strategies.length : strategies.filter((item) => curatedStrategySchool(item) === school).length; + return ``; + }).join(""); + document.querySelectorAll("[data-curated-view]").forEach((button) => { + const active = button.dataset.curatedView === state.curatedViewMode; + button.classList.toggle("active", active); + button.setAttribute("aria-pressed", String(active)); + }); + const query = state.curatedQuery; + const visible = strategies.filter((item) => { + const meta = item.formula?.meta || {}; + const categoryMatch = state.curatedCategory === "全部" || meta.category === state.curatedCategory; + const school = curatedStrategySchool(item); + const schoolMatch = state.curatedSchool === "全部" || school === state.curatedSchool; + const queryMatch = !query || `${item.name} ${item.description} ${meta.category} ${school} ${meta.suitable_environment} ${meta.failure_risk}`.toLocaleLowerCase("zh-CN").includes(query); + return categoryMatch && schoolMatch && queryMatch; + }); + const list = document.querySelector("#curatedStrategyList"); + list.classList.toggle("is-grid", state.curatedViewMode === "grid"); + list.innerHTML = visible.length ? visible.map((strategy) => { + const meta = strategy.formula?.meta || {}; + const school = curatedStrategySchool(strategy); + const rank = strategies.findIndex((item) => item.id === strategy.id) + 1; + const resultKey = screenerResultKey(screenerResultContext("curated", null, { + regime: strategy.regimes[0] || state.selectedRegime, + strategyId: strategy.id, + strategyName: strategy.name, + })); + const result = state.screenerResultStore[resultKey]?.result; + const runState = curatedStrategyRunState(strategy, result); + return `
    + + ${String(rank).padStart(2, "0")}${escapeHtml(strategy.name)}${escapeHtml(school)} · ${escapeHtml(meta.category || "策略")}${escapeHtml(runState.label)} + ${escapeHtml(meta.quality || "--")}${escapeHtml(meta.frequency || "--")}风险 ${escapeHtml(meta.risk || "--")} +
    `; + }).join("") : emptyStateHtml("没有符合条件的策略"); + renderCuratedStrategyDetail(); +} + +function renderCuratedStrategyDetail() { + const strategy = activeCuratedStrategy(); + if (!strategy) return; + const formula = strategy.formula || {}; + const meta = formula.meta || {}; + const result = activeScreenerResult("curated"); + const resultMeta = result?.meta || {}; + const health = resultMeta.health || {}; + const runState = curatedStrategyRunState(strategy, result); + setText("curatedStrategyCategory", meta.category || "精选策略"); + setText("curatedStrategyName", strategy.name); + setText("curatedStrategyDescription", strategy.description); + document.querySelector("#curatedStrategyBadges").innerHTML = [ + `质量 ${meta.quality || "--"}`, meta.frequency || "--", `风险 ${meta.risk || "--"}`, + meta.data_group || "行情因子", + ].map((value) => `${escapeHtml(value)}`).join(""); + setText("curatedSuitableEnvironment", meta.suitable_environment || "以策略条件为准"); + setText("curatedFailureRisk", meta.failure_risk || "策略可能随市场结构变化而失效"); + const filters = formula.filters || []; + setText("curatedFilterCount", `${filters.length} 项`); + document.querySelector("#curatedFilterList").innerHTML = filters.map((item) => ` +
    ${escapeHtml(factorLabel(item.field))}${escapeHtml(formatRuleValue(item))}
    + `).join(""); + const scores = formula.score || []; + const total = scores.reduce((sum, item) => sum + number(item.weight), 0) || 1; + setText("curatedWeightTotal", `${formatNumber(total * 100, 0)}%`); + document.querySelector("#curatedScoreList").innerHTML = scores.map((item) => { + const percent = number(item.weight) / total * 100; + return `
    ${escapeHtml(factorLabel(item.field))}${formatNumber(percent, 0)}%
    `; + }).join(""); + const candidateCount = (result?.candidates || []).length; + const statusLabel = runState.className === "ready" ? "运行正常" : runState.label; + const statusClass = runState.className; + let updatedLabel = "--"; + if (resultMeta.updated_at) { + const updated = new Date(resultMeta.updated_at); + if (!Number.isNaN(updated.getTime())) { + updatedLabel = `${String(updated.getMonth() + 1).padStart(2, "0")}-${String(updated.getDate()).padStart(2, "0")} ${updated.toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", hour12: false })}`; + } + } + document.querySelector("#curatedHealthMetrics").innerHTML = [ + ["运行状态", statusLabel, statusClass], + ["当日信号", result ? `${candidateCount} 只` : "--", ""], + ["字段覆盖", health.coverage != null ? `${formatNumber(health.coverage, 1)}%` : strategy.data_ready ? "数据已就绪" : "--", ""], + ["最近更新", updatedLabel, ""], + ].map(([label, value, className]) => `
    ${escapeHtml(label)}${escapeHtml(value)}
    `).join(""); + const status = document.querySelector("#curatedDataStatus"); + status.classList.toggle("missing", statusClass === "missing"); + status.innerHTML = strategy.data_ready + ? `${runState.verifiedEmpty ? "本日暂无信号" : "盘后自动更新"}${runState.verifiedEmpty ? `必需数据已完整,本日没有股票同时满足 ${filters.length} 项准入条件` : result ? health.required_field_count != null ? `已核验 ${number(health.required_field_count)} 项因子 · ${number(health.complete_rows)} 只股票` : "盘后定格结果已载入" : "等待当日行情定格后生成"}` + : `数据尚未完备${escapeHtml((strategy.missing_data || []).join("、") || "等待后台同步")}`; + refreshIcons(); +} + +function factorLabel(field) { + return state.screenerSetup?.factor_fields?.find((item) => item.id === field)?.label || field; +} + +function formatRuleValue(item) { + const operator = { between: "介于", ">=": "不低于", "<=": "不高于", ">": "高于", "<": "低于", "==": "等于" }[item.op] || item.op; + const value = Array.isArray(item.value) ? item.value.join(" ~ ") : item.value; + return `${operator} ${value}`; +} + +function groupedFactorOptions(selected = "") { + return (state.screenerSetup?.factor_groups || []).map((group) => ` + ${group.fields.map((field) => ``).join("")} + `).join(""); +} + +function quantId() { + return `${Date.now()}-${Math.random().toString(16).slice(2)}`; +} + +function resetQuantBuilder(render = true) { + state.quantFilters = [ + { id: quantId(), field: "amount_billion", op: ">=", value: "1" }, + { id: quantId(), field: "above_ma20", op: "==", value: "1" }, + ]; + state.quantScores = [ + { id: quantId(), field: "relative_strength", weight: 30, direction: "desc" }, + { id: quantId(), field: "sector_strength", weight: 25, direction: "desc" }, + { id: quantId(), field: "volume_ratio_5d", weight: 20, direction: "desc" }, + { id: quantId(), field: "amount_billion", weight: 15, direction: "desc" }, + { id: quantId(), field: "volatility_10d", weight: 10, direction: "asc" }, + ]; + if (render) renderQuantBuilder(); +} + +function addQuantFilter() { + const used = new Set(state.quantFilters.map((item) => item.field)); + const field = state.screenerSetup.factor_fields.find((item) => !used.has(item.id))?.id || "pct_chg"; + state.quantFilters.push({ id: quantId(), field, op: ">=", value: "0" }); + renderQuantBuilder(); +} + +function addQuantScore() { + const used = new Set(state.quantScores.map((item) => item.field)); + const field = state.screenerSetup.factor_fields.find((item) => !used.has(item.id))?.id || "pct_chg"; + state.quantScores.push({ id: quantId(), field, weight: 10, direction: "desc" }); + renderQuantBuilder(); +} + +function renderQuantBuilder() { + if (!state.screenerSetup) return; + document.querySelector("#quantFilterRows").innerHTML = state.quantFilters.map((item) => ` +
    + + + + +
    + `).join(""); + document.querySelector("#quantScoreRows").innerHTML = state.quantScores.map((item) => ` +
    + + + +
    + `).join(""); + renderQuantSummary(); + refreshIcons(); +} + +function handleQuantBuilderInput(event) { + const row = event.target.closest("[data-quant-filter], [data-quant-score]"); + const key = event.target.dataset.quantKey; + if (!row || !key) return; + const collection = row.dataset.quantFilter ? state.quantFilters : state.quantScores; + const id = row.dataset.quantFilter || row.dataset.quantScore; + const item = collection.find((entry) => entry.id === id); + if (!item) return; + item[key] = key === "weight" ? number(event.target.value) : event.target.value; + if (key === "weight") { + const output = event.target.closest(".quant-weight-control")?.querySelector("output"); + if (output) output.textContent = `${number(event.target.value)}%`; + } + renderQuantSummary(); +} + +function handleQuantBuilderClick(event) { + const button = event.target.closest("[data-quant-action]"); + if (!button) return; + const row = button.closest("[data-quant-filter], [data-quant-score]"); + const isFilter = Boolean(row?.dataset.quantFilter); + const id = row?.dataset.quantFilter || row?.dataset.quantScore; + const collection = isFilter ? state.quantFilters : state.quantScores; + const item = collection.find((entry) => entry.id === id); + if (button.dataset.quantAction === "remove") { + if (!isFilter && collection.length <= 1) { + showToast("至少保留一个评分因子"); + return; + } + const index = collection.findIndex((entry) => entry.id === id); + if (index >= 0) collection.splice(index, 1); + renderQuantBuilder(); + } else if (button.dataset.quantAction === "direction" && item) { + item.direction = button.dataset.direction; + renderQuantBuilder(); + } +} + +function buildQuantFormula() { + const filters = state.quantFilters.map((item) => { + let value; + if (item.op === "between") { + value = String(item.value).split(/[,,~~]/).map((part) => Number(part.trim())); + if (value.length !== 2 || value.some((part) => !Number.isFinite(part))) throw new Error(`${factorLabel(item.field)}需要两个有效区间值`); + if (value[0] > value[1]) value.reverse(); + } else { + value = Number(item.value); + if (!Number.isFinite(value)) throw new Error(`${factorLabel(item.field)}的条件值无效`); + } + return { field: item.field, op: item.op, value }; + }); + const score = state.quantScores.map((item) => { + const weight = number(item.weight) / 100; + if (weight <= 0 || weight > 1) throw new Error(`${factorLabel(item.field)}的权重应为1%至100%`); + return { field: item.field, weight, direction: item.direction }; + }); + return { + meta: { library: "custom", category: "量化公式", frequency: "按需", risk: "自定义", data_group: "组合因子" }, + universe: { + exclude_st: document.querySelector("#quantExcludeSt").checked, + listed_days_min: Math.max(0, Math.min(5000, number(document.querySelector("#quantListedDays").value))), + }, + filters, + score, + limit: Math.max(1, Math.min(50, number(document.querySelector("#quantLimit").value))), + min_score: Math.max(0, Math.min(1, number(document.querySelector("#quantMinScore").value) / 100)), + }; +} + +function formulaMissingData(formula) { + const health = state.screenerSetup?.factor_data?.health || {}; + const fields = new Set([...(formula.filters || []), ...(formula.score || [])].map((item) => item.field)); + const missing = []; + if (!state.screenerSetup?.factor_data?.ready) missing.push("基础行情"); + if (["pe_ttm", "pb", "ps_ttm", "dividend_yield_ttm", "total_mv_billion"].some((field) => fields.has(field)) && !health.valuation) missing.push("估值数据"); + if (["roe", "roa", "roic", "gross_margin", "netprofit_yoy", "revenue_yoy", "ocf_to_opincome"].some((field) => fields.has(field)) && !health.fundamental) missing.push("财务质量"); + if (fields.has("dividend_years") && !health.dividend_history) missing.push("历年分红"); + if (["auction_change", "auction_amount_million", "auction_turnover_rate", "auction_volume_ratio"].some((field) => fields.has(field)) && !health.auction) missing.push("竞价数据"); + return missing; +} + +function renderQuantSummary() { + if (!state.screenerSetup) return; + const total = state.quantScores.reduce((sum, item) => sum + number(item.weight), 0); + setText("quantWeightTotal", `${formatNumber(total, 0)}%`); + const bar = document.querySelector("#quantWeightBar"); + bar.style.width = `${Math.min(100, total)}%`; + bar.style.background = Math.abs(total - 100) < 0.01 ? "#2563eb" : "#d97706"; + const message = document.querySelector("#quantValidationMessage"); + try { + const formula = buildQuantFormula(); + const missing = formulaMissingData(formula); + message.classList.toggle("error", Boolean(missing.length)); + message.textContent = missing.length ? `需要先同步:${missing.join("、")}` : "公式有效,可执行并生成逐股贡献解释。"; + document.querySelector("#quantRunButton").disabled = Boolean(missing.length); + } catch (error) { + message.classList.add("error"); + message.textContent = error.message; + document.querySelector("#quantRunButton").disabled = true; + } +} + +function renderScreenerProgress() { + const hasSetup = Boolean(state.screenerSetup?.regime); + const hasStrategy = Boolean(state.selectedStrategy); + const hasResult = Boolean(activeScreenerResult("smart")); + const states = { + regime: hasSetup ? "complete" : "current", + strategy: hasStrategy ? "complete" : hasSetup ? "current" : "pending", + run: state.screenerRunning ? "current" : hasResult ? "complete" : hasStrategy ? "current" : "pending", + result: hasResult ? "current" : "pending", + }; + const steps = [...document.querySelectorAll("[data-screener-step]")]; + steps.forEach((step, index) => { + const status = states[step.dataset.screenerStep] || "pending"; + step.dataset.state = status; + if (status === "current") step.setAttribute("aria-current", "step"); + else step.removeAttribute("aria-current"); + const line = step.nextElementSibling; + if (line?.classList.contains("step-line")) line.classList.toggle("complete", status === "complete" && index < steps.length - 1); + }); +} + +function openStrategyDrawer(target = "editor") { + const drawer = document.querySelector("#strategyDrawer"); + openModalDialog(drawer); + requestAnimationFrame(() => { + const focusTarget = target === "library" + ? document.querySelector("#strategyList .strategy-item.active") || document.querySelector("#strategyList .strategy-item") + : document.querySelector("#strategyNameInput"); + focusTarget?.focus(); + }); +} + +function openCustomStrategyDrawer() { + if (!state.customStrategyDraft) { + state.customStrategyDraft = { + id: null, + builtin: false, + name: "自定义选股策略", + description: "", + regimes: [state.selectedRegime], + formula: buildQuantFormula(), + }; + } + populateStrategyEditor(state.customStrategyDraft); + renderStrategyList(); + openStrategyDrawer("editor"); +} + +function selectScreenerMobileView(view) { + state.screenerMobileView = view === "results" ? "results" : "strategy"; + const workspace = document.querySelector("#screenerView"); + workspace.classList.toggle("mobile-strategy", state.screenerMobileView === "strategy"); + workspace.classList.toggle("mobile-results", state.screenerMobileView === "results"); + document.querySelectorAll("[data-screener-mobile-view]").forEach((button) => { + const active = button.dataset.screenerMobileView === state.screenerMobileView; + button.classList.toggle("active", active); + button.setAttribute("aria-selected", String(active)); + }); +} + +function updateBacktestTaskStatus() { + setText("backtestTaskStatus", activeScreenerResult("smart") ? "结果已归档" : "等待盘后生成"); + renderScreenerProgress(); +} + +function selectRegime(regime) { + state.selectedRegime = regime; + const recommended = state.screenerSetup.strategies.find((item) => item.formula?.meta?.library !== "curated" && item.regimes.includes(regime)); + if (recommended) state.selectedStrategy = recommended; + renderScreenerSetup(); +} + +function renderStrategyList() { + const list = document.querySelector("#strategyList"); + const strategies = state.screenerSetup.strategies.filter((item) => !item.builtin && item.formula?.meta?.library !== "curated"); + list.innerHTML = strategies.map((strategy) => ` + + `).join("") || emptyStateHtml("暂无已保存的自定义公式"); + list.querySelectorAll("[data-strategy-id]").forEach((button) => { + button.addEventListener("click", () => { + state.customStrategyDraft = state.screenerSetup.strategies.find((item) => item.id === number(button.dataset.strategyId)); + populateStrategyEditor(state.customStrategyDraft); + renderStrategyList(); + }); + }); +} + +function populateStrategyEditor(strategy) { + const deleteButton = document.querySelector("#deleteStrategyButton"); + deleteButton.hidden = !strategy?.id || Boolean(strategy.builtin); + if (!strategy) { + setText("activeStrategyEditorHeading", "--"); + return; + } + setText("activeStrategyEditorHeading", strategy.name || "未命名策略"); + document.querySelector("#strategyNameInput").value = strategy.name || ""; + document.querySelector("#strategyDescriptionInput").value = strategy.description || ""; + document.querySelector("#strategyPrompt").value = strategy.builtin ? strategy.description || "" : document.querySelector("#strategyPrompt").value; + document.querySelector("#formulaEditor").value = JSON.stringify(strategy.formula, null, 2); +} + +async function compileStrategy() { + const prompt = document.querySelector("#strategyPrompt").value.trim(); + const button = document.querySelector("#compileStrategyButton"); + button.disabled = true; + setText("compilerStatus", "正在编译"); + setStatus("正在编译选股策略"); + try { + const payload = await apiRequest("/api/screener/compile", "POST", { + prompt, + regime: state.selectedRegime, + }); + const strategy = payload.strategy; + state.customStrategyDraft = { ...strategy, id: null, builtin: false }; + document.querySelector("#deleteStrategyButton").hidden = true; + document.querySelector("#strategyNameInput").value = strategy.name; + document.querySelector("#strategyDescriptionInput").value = strategy.description; + document.querySelector("#formulaEditor").value = JSON.stringify(strategy.formula, null, 2); + setText("compilerStatus", "策略生成完成"); + if (strategy.notice) showToast(strategy.notice); + setStatus("选股策略已编译"); + } catch (error) { + showToast(error.message); + setStatus("策略编译失败"); + setText("compilerStatus", "编译失败"); + } finally { + button.disabled = false; + } +} + +async function saveCurrentStrategy() { + try { + const formula = parseFormulaEditor(); + const payload = await apiRequest("/api/screener/strategies", "POST", { + name: document.querySelector("#strategyNameInput").value, + description: document.querySelector("#strategyDescriptionInput").value, + regimes: [state.selectedRegime], + formula, + }); + state.screenerSetup.strategies = payload.strategies; + state.customStrategyDraft = payload.strategies.find((item) => item.id === payload.id); + renderStrategyList(); + populateStrategyEditor(state.customStrategyDraft); + showToast("自定义策略已保存"); + } catch (error) { + showToast(error.message); + } +} + +async function deleteCurrentStrategy() { + const strategy = state.customStrategyDraft; + if (!strategy?.id || strategy.builtin) { + showToast("只能删除已保存的自定义策略"); + return; + } + if (!window.confirm(`确定删除策略“${strategy.name}”吗?此操作不可撤销。`)) return; + + const button = document.querySelector("#deleteStrategyButton"); + button.disabled = true; + try { + const payload = await apiRequest(`/api/screener/strategies/${strategy.id}`, "DELETE"); + state.screenerSetup.strategies = payload.strategies; + state.customStrategyDraft = null; + renderStrategyList(); + openCustomStrategyDrawer(); + showToast("自定义策略已删除"); + } catch (error) { + showToast(error.message || "策略删除失败"); + } finally { + button.disabled = false; + } +} + +async function runQuantStrategy() { + let formula; + try { + formula = buildQuantFormula(); + } catch (error) { + showToast(error.message); + return; + } + await executeScreenerFormula({ + mode: "quant", + formula, + strategyName: "自定义选股公式", + regime: state.selectedRegime, + runBacktest: document.querySelector("#quantBacktestToggle").checked, + button: document.querySelector("#quantRunButton"), + loadingText: "正在执行自定义公式并计算因子贡献", + }); +} + +function saveQuantAsStrategy() { + try { + const formula = buildQuantFormula(); + state.customStrategyDraft = { + id: null, + builtin: false, + name: "自定义选股策略", + description: "由自定义因子工作台生成,可在高级公式中继续调整。", + regimes: [state.selectedRegime], + formula, + }; + populateStrategyEditor(state.customStrategyDraft); + document.querySelector("#strategyPrompt").value = "自定义因子工作台生成的选股公式"; + openStrategyDrawer("editor"); + } catch (error) { + showToast(error.message); + } +} + +async function executeScreenerFormula({ mode, formula, strategyName, strategyId = null, regime, runBacktest, button, loadingText }) { + if (!state.screenerSetup?.factor_data?.ready) { + showToast("请先同步至少 21 个交易日的因子数据"); + return; + } + const missing = formulaMissingData(formula); + if (missing.length) { + showToast(`请先同步${missing.join("、")}`); + return; + } + const executionMode = ["smart", "curated", "quant"].includes(mode) ? mode : state.screenerMode; + button.disabled = true; + state.screenerRunning = true; + state.screenerRunningMode = executionMode; + if (executionMode === "smart") { + setText("screenerRunStatus", "正在计算"); + setText("backtestTaskStatus", runBacktest ? "正在回测" : "本次不执行"); + } + setLoading(true, loadingText, "screener"); + setStatus(`正在执行${strategyName}`); + try { + const payload = await apiRequest("/api/screener/run", "POST", { + trade_date: elements.tradeDate.value, + regime, + strategy_name: strategyName, + formula, + mode: executionMode, + run_backtest: runBacktest, + }); + setScreenerResult(executionMode, payload.result, { regime, strategyId, strategyName }); + renderScreenerResult(); + if (executionMode === "smart") setText("screenerRunStatus", `完成 · ${payload.result.candidates.length} 只`); + updateBacktestTaskStatus(); + if (window.innerWidth <= 720) selectScreenerMobileView("results"); + setStatus(`${strategyName}完成 · ${payload.result.candidates.length} 只候选`); + } catch (error) { + showToast(error.message); + setStatus("选股执行失败"); + if (executionMode === "smart") setText("screenerRunStatus", "执行失败"); + updateBacktestTaskStatus(); + } finally { + state.screenerRunning = false; + state.screenerRunningMode = ""; + setLoading(false); + button.disabled = false; + updateBacktestTaskStatus(); + } +} + +/* PRESERVATION-SOURCE-END app.js:3490-4336 */ +/* PRESERVATION-SOURCE-BEGIN app.js:6668-6892 */ +function renderScreenerResult() { + const mode = state.screenerMode || "smart"; + const result = activeScreenerResult(mode); + const context = activeScreenerResultContext(mode); + const source = document.querySelector("#screenerResultSource"); + const emptyMessages = { + smart: "当日盘后候选尚未生成", + curated: "所选策略的当日候选尚未生成", + quant: "尚未执行自定义选股", + }; + if (!result) { + setText("screenerResultCount", "0 只"); + source.hidden = true; + source.textContent = ""; + setText("screenerDisclaimer", "历史统计不代表未来收益"); + document.querySelector("#screenerTableBody").innerHTML = ""; + document.querySelector("#screenerEmpty").textContent = emptyMessages[mode]; + document.querySelector("#screenerEmpty").hidden = false; + renderBacktest(null); + if (mode === "smart") setText("screenerRunStatus", "等待执行"); + updateBacktestTaskStatus(); + renderScreenerProgress(); + return; + } + const candidates = result.candidates || []; + setText("screenerResultCount", `${candidates.length} 只`); + const modeLabels = { smart: "阶段选股", curated: "策略选股", quant: "自定义选股" }; + const sourceParts = [modeLabels[mode]]; + if (mode === "smart" && context?.regime) sourceParts.push(regimeLabel(context.regime)); + sourceParts.push(mode === "quant" ? "自定义因子权重" : context?.strategyName || result.meta?.strategy_name || "未命名策略"); + source.textContent = sourceParts.join(" · "); + source.hidden = false; + const meta = result.meta || {}; + setText( + "screenerDisclaimer", + meta.realtime + ? `盘中行情 · 历史样本截至 ${displayCompactDate(meta.history_cutoff)} · ${result.disclaimer}` + : `盘后数据 ${displayCompactDate(meta.trade_date)} · ${result.disclaimer}`, + ); + const empty = document.querySelector("#screenerEmpty"); + empty.textContent = mode === "curated" ? "暂无符合条件个股" : emptyMessages[mode]; + empty.hidden = candidates.length > 0; + const body = document.querySelector("#screenerTableBody"); + const runId = number(meta.run_id); + body.innerHTML = candidates.map((row, index) => ` + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)}${escapeHtml(row.sector)} + ${formatNumber(row.score_display, 1)} + ${row.historical_probability === null ? "" : formatNumber(row.historical_probability, 1)}${number(row.probability_samples)} 个样本 + ${signed(row.pct_chg)} + ${signed(row.return_5d)} + ${formatNumber(row.volume_ratio_5d, 2)}${formatNumber(row.sector_strength, 1)} + ${escapeHtml(row.reason)} + ${escapeHtml(row.risk_flags.join(";"))} + + `).join(""); + body.querySelectorAll("[data-screen-detail]").forEach((button) => { + button.addEventListener("click", () => { + const row = candidates.find((item) => item.code === button.dataset.screenDetail); + openStock(row.code, row); + }); + }); + body.querySelectorAll("[data-add-tracking]").forEach((button) => { + button.addEventListener("click", () => addCandidateToTracking(button.dataset.addTracking, button)); + }); + bindStockRows(body); + renderBacktest(result.backtest); + if (mode === "smart") setText("screenerRunStatus", `完成 · ${candidates.length} 只`); + updateBacktestTaskStatus(); + renderScreenerProgress(); +} + +async function loadScreenerTracking(force = false) { + if (state.screenerTracking && !force) { + renderScreenerTracking(); + return; + } + try { + state.screenerTracking = await apiRequest("/api/screener/tracking?limit=12"); + renderScreenerTracking(); + if (activeScreenerResult()) renderScreenerResult(); + } catch (error) { + showToast(error.message || "策略跟踪加载失败"); + } +} + +function isCandidateTracked(runId, code) { + if (!runId) return false; + return (state.screenerTracking?.batches || []).some((batch) => + number(batch.run_id) === number(runId) + && (batch.items || []).some((item) => item.code === code)); +} + +async function addCandidateToTracking(code, button) { + const runId = number(activeScreenerResult()?.meta?.run_id); + if (!runId) { + showToast("本次结果缺少选股批次,请重新执行后再加入跟踪"); + return; + } + button.disabled = true; + try { + const payload = await apiRequest("/api/screener/tracking", "POST", { run_id: runId, code }); + state.screenerTracking = payload.tracking; + renderScreenerTracking(); + renderScreenerResult(); + showToast(`${code} 已加入策略跟踪`); + } catch (error) { + button.disabled = false; + showToast(error.message || "加入跟踪失败"); + } +} + +async function refreshScreenerTracking() { + const button = document.querySelector("#refreshTrackingButton"); + button.disabled = true; + setStatus("正在更新策略跟踪"); + try { + const payload = await apiRequest("/api/screener/tracking/refresh", "POST", { + trade_date: elements.tradeDate.value, + }); + state.screenerTracking = payload.tracking; + renderScreenerTracking(); + if (payload.notice) showToast(payload.notice); + setStatus("策略跟踪已更新"); + } catch (error) { + showToast(error.message || "策略跟踪刷新失败"); + setStatus("策略跟踪刷新失败"); + } finally { + button.disabled = false; + } +} + +function renderScreenerTracking() { + const payload = state.screenerTracking || { batches: [], summary: {} }; + const batches = payload.batches || []; + const rows = batches.flatMap((batch) => (batch.items || []).map((item) => ({ + ...item, + run_id: batch.run_id, + selection_date: batch.selection_date, + strategy_name: batch.strategy_name, + }))); + setText("trackingBatchCount", `${batches.length} 批`); + const summary = payload.summary || {}; + document.querySelector("#trackingSummary").innerHTML = [ + ["跟踪标的", `${number(summary.total)} 只`], + ["已有 T+1", `${number(summary.observed)} 只`], + ["T+1 胜率", trackingPercent(summary.t1_win_rate)], + ["T+5 胜率", trackingPercent(summary.t5_win_rate)], + ["T+5 平均", trackingReturn(summary.average_t5)], + ].map(([label, value]) => `
    ${label}${value}
    `).join(""); + document.querySelector("#trackingEmpty").hidden = rows.length > 0; + document.querySelector("#trackingTableBody").innerHTML = rows.map((row) => ` + + ${displayCompactDate(row.selection_date)} + ${escapeHtml(row.strategy_name)} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${row.entry_price == null ? "" : formatNumber(row.entry_price, 2)} + ${["t1_open", "t1_close", "t3_close", "t5_close", "max_gain", "max_drawdown"].map((key) => `${trackingReturn(row[key], false)}`).join("")} + ${escapeHtml(row.status)} + + + `).join(""); + bindStockRows(document.querySelector("#trackingTableBody")); +} + +async function handleTrackingTableAction(event) { + const button = event.target.closest("[data-remove-tracking]"); + if (!button) return; + if (!window.confirm("确定停止跟踪这只股票吗?")) return; + button.disabled = true; + try { + const payload = await apiRequest(`/api/screener/tracking/${button.dataset.removeTracking}`, "DELETE"); + state.screenerTracking = payload.tracking; + renderScreenerTracking(); + if (activeScreenerResult()) renderScreenerResult(); + showToast("已移出策略跟踪"); + } catch (error) { + button.disabled = false; + showToast(error.message || "移除跟踪失败"); + } +} + +function trackingReturn(value, includeUnit = true) { + return value == null ? (includeUnit ? "--" : "") : `${signed(value)}${includeUnit ? "%" : ""}`; +} + +function trackingPercent(value) { + return value == null ? "--" : `${formatNumber(value, 1)}%`; +} + +function renderBacktest(backtest) { + const panel = document.querySelector("#backtestPanel"); + panel.hidden = !backtest; + if (!backtest) return; + setText("backtestDefinition", backtest.definition); + document.querySelector("#backtestMetrics").innerHTML = [ + ["历史样本", `${number(backtest.samples)} 个`], + ["条件胜率", `${formatNumber(backtest.win_rate, 1)}%`], + ["平均3日收益", `${signed(backtest.average_3d_return)}%`], + ["平均最大回撤", `${signed(backtest.average_drawdown)}%`], + ].map(([label, value]) => `
    ${label}${value}
    `).join(""); +} + +function parseFormulaEditor() { + try { + return JSON.parse(document.querySelector("#formulaEditor").value); + } catch { + throw new Error("受控公式不是有效的 JSON"); + } +} + +function exportScreenerResults() { + const modeLabels = { smart: "阶段选股", curated: "策略选股", quant: "量化选股" }; + exportRows(modeLabels[state.screenerMode] || "智能选股", activeScreenerResult()?.candidates || [], [ + ["股票代码", "code"], ["股票名称", "name"], ["板块", "sector"], ["综合分", "score_display"], + ["历史条件估计%", "historical_probability"], ["当日涨幅%", "pct_chg"], ["5日涨幅%", "return_5d"], + ["10日涨幅%", "return_10d"], ["量比", "volume_ratio_5d"], ["板块强度", "sector_strength"], + ["主要贡献", "reason"], ["风险标记", "risk_flags"], + ]); +} + +function regimeLabel(regime) { + return state.screenerSetup?.regimes?.find((item) => item.id === regime)?.label || regime; +} + +/* PRESERVATION-SOURCE-END app.js:6668-6892 */ diff --git a/app/frontend/pages/sentiment/page.js b/app/frontend/pages/sentiment/page.js new file mode 100644 index 0000000..e9d5c8d --- /dev/null +++ b/app/frontend/pages/sentiment/page.js @@ -0,0 +1,316 @@ +window.XiaobaiPageModules.register("sentiment", ["sentimentCycleView"], { + enter: ["loadSentiment"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:1207-1516 */ +async function loadSentimentHistory(force = false) { + if (!state.dashboard || state.sentimentLoading) return; + const key = `${elements.tradeDate.value}:${state.sentimentRange}`; + if (!force && state.sentimentHistoryKey === key && state.sentimentHistory) { + renderSentimentHistory(); + return; + } + state.sentimentLoading = true; + const notice = document.querySelector("#sentimentHistoryNotice"); + notice.hidden = true; + try { + const query = new URLSearchParams({ + trade_date: elements.tradeDate.value, + limit: String(state.sentimentRange), + }); + state.sentimentHistory = await apiRequest(`/api/sentiment/history?${query}`); + state.sentimentHistoryKey = key; + renderSentimentHistory(); + } catch (error) { + notice.textContent = error.message || "情绪周期数据加载失败"; + notice.hidden = false; + showToast(notice.textContent); + } finally { + state.sentimentLoading = false; + } +} + +function renderSentimentHistory() { + const payload = state.sentimentHistory; + if (!payload) return; + const rows = payload.rows || []; + const latest = rows[rows.length - 1]; + const body = document.querySelector("#sentimentHistoryBody"); + const empty = document.querySelector("#sentimentHistoryEmpty"); + empty.hidden = rows.length > 0; + body.innerHTML = [...rows].reverse().map((row) => { + return ` + + ${escapeHtml(displayCompactDate(row.trade_date))} + ${number(row.score)} + ${escapeHtml(row.phase)} + ${escapeHtml(row.direction)} + ${number(row.limit_up_count)} + ${number(row.first_board_count)} + ${number(row.second_board_count)} + ${number(row.three_plus_count)} + ${number(row.max_height)}板 + ${number(row.broken_count)} + ${number(row.limit_down_count)} + ${number(row.previous_limit_count)} + ${number(row.previous_positive_count)} + ${formatNumber(row.previous_positive_rate, 1)}% + + `; + }).join(""); + + if (!latest) { + setText("sentimentHistoryDateRange", "暂无历史数据"); + return; + } + setText( + "sentimentHistoryDateRange", + `${displayCompactDate(rows[0].trade_date)} 至 ${displayCompactDate(latest.trade_date)}`, + ); + setText("sentimentCycleScore", number(latest.score)); + setText("sentimentCycleLabel", latest.label); + setText("sentimentCycleDate", displayCompactDate(latest.trade_date)); + setText("sentimentCyclePhase", latest.phase); + setText("sentimentCycleDirection", latest.direction); + const dayChange = number(latest.day_change); + const confidence = sentimentPhaseConfidence(latest); + setText("sentimentPhaseConfidence", `置信度 ${confidence}%`); + setText("sentimentDayChange", `${dayChange > 0 ? "+" : ""}${formatNumber(dayChange, 1)}`); + setText("sentimentSealRate", `${formatNumber(latest.seal_rate, 1)}%`); + setText("sentimentLimitUp", number(latest.limit_up_count)); + setText("sentimentBroken", number(latest.broken_count)); + setText("sentimentPhaseAdvice", sentimentPhaseAdvice(latest.phase)); + setText("sentimentCurrentTag", `当前 ${number(latest.score)} · ${latest.phase}`); + setText("sentimentComponentSummary", `五维加权 → 温度 ${number(latest.score)}`); + setText("sentimentPeriodNote", `近 ${state.sentimentRange} 个交易日,当前展示 ${rows.length} 日`); + const changeElement = document.querySelector("#sentimentDayChange"); + changeElement.className = changeClass(dayChange); + setText("sentimentPreviousPositive", `${number(latest.previous_positive_count)} / ${number(latest.previous_limit_count)} 只`); + setText("sentimentPreviousAverage", `红盘率 ${formatNumber(latest.previous_positive_rate, 1)}% · 平均 ${signed(latest.average_previous_change)}%`); + setText("sentimentHistoryDays", `${number(payload.available_days)} 个交易日`); + setText("sentimentNormalization", `${latest.normalization} · 当前展示 ${rows.length} 日`); + const marker = document.querySelector("#sentimentCycleScoreMarker"); + marker.className = `sentiment-current-phase-badge ${sentimentPhaseClass(latest.phase)}`; + document.querySelector("#sentimentComponentList").innerHTML = Object.values(latest.components || {}).map((item) => ` +
    +
    + ${escapeHtml(item.label)} + + ${formatNumber(item.score, 1)} × ${number(item.weight)}% +
    + ${escapeHtml(item.summary)} +
    + `).join(""); + requestAnimationFrame(() => { + animateSentimentComponents(); + animateSentimentTrendChart(rows); + bindSentimentChartTooltip(rows); + }); + animateRows(body); +} + +function animateSentimentComponents() { + document.querySelectorAll("#sentimentComponentList [data-component-score]").forEach((bar, index) => { + const width = `${number(bar.dataset.componentScore)}%`; + if (!motionEnabled()) { + bar.style.width = width; + return; + } + setTimeout(() => { bar.style.width = width; }, index * 70); + }); +} + +function animateSentimentTrendChart(rows) { + if (sentimentChartAnimationFrame) cancelAnimationFrame(sentimentChartAnimationFrame); + if (!motionEnabled()) { + drawSentimentTrendChart(rows, 1); + return; + } + const startedAt = performance.now(); + const duration = 780; + const frame = (now) => { + const rawProgress = Math.min(1, (now - startedAt) / duration); + const progress = 1 - (1 - rawProgress) ** 3; + drawSentimentTrendChart(rows, progress); + if (rawProgress < 1) sentimentChartAnimationFrame = requestAnimationFrame(frame); + else sentimentChartAnimationFrame = null; + }; + sentimentChartAnimationFrame = requestAnimationFrame(frame); +} + +function drawSentimentTrendChart(rows, progress = 1) { + const canvas = document.querySelector("#sentimentTrendChart"); + if (!canvas || !rows.length || state.activeView !== "sentimentCycleView") return; + const rect = canvas.getBoundingClientRect(); + if (!rect.width) return; + const width = Math.max(320, rect.width); + const height = Math.max(220, rect.height); + const ratio = window.devicePixelRatio || 1; + canvas.width = Math.round(width * ratio); + canvas.height = Math.round(height * ratio); + const context = canvas.getContext("2d"); + const palette = currentChartPalette(); + context.setTransform(ratio, 0, 0, ratio, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = palette.background; + context.fillRect(0, 0, width, height); + const padding = { top: 18, right: 18, bottom: 34, left: 42 }; + const chartWidth = width - padding.left - padding.right; + const chartHeight = height - padding.top - padding.bottom; + const x = (index) => padding.left + (rows.length === 1 ? chartWidth / 2 : index / (rows.length - 1) * chartWidth); + const y = (score) => padding.top + (100 - clamp(score, 0, 100)) / 100 * chartHeight; + + context.font = '10px "Microsoft YaHei UI", sans-serif'; + context.textAlign = "right"; + context.textBaseline = "middle"; + for (let score = 0; score <= 100; score += 20) { + const lineY = y(score); + context.strokeStyle = score === 40 || score === 80 ? palette.zero : palette.grid; + context.lineWidth = 1; + context.beginPath(); + context.moveTo(padding.left, lineY); + context.lineTo(width - padding.right, lineY); + context.stroke(); + context.fillStyle = palette.axis; + context.fillText(String(score), padding.left - 8, lineY); + } + + context.save(); + context.beginPath(); + context.rect(padding.left - 6, padding.top - 8, (chartWidth + 12) * clamp(progress, 0, 1), chartHeight + 18); + context.clip(); + + const finalPhase = rows[rows.length - 1]?.phase; + let phaseStart = rows.length - 1; + while (phaseStart > 0 && rows[phaseStart - 1]?.phase === finalPhase) phaseStart -= 1; + if (["退潮", "冰点"].includes(finalPhase)) { + const startX = phaseStart === 0 ? padding.left : (x(phaseStart - 1) + x(phaseStart)) / 2; + context.fillStyle = palette.alertArea; + context.fillRect(startX, padding.top, width - padding.right - startX, chartHeight); + context.fillStyle = palette.up; + context.font = '10px "Microsoft YaHei UI", sans-serif'; + context.textAlign = "center"; + context.textBaseline = "top"; + context.fillText(finalPhase, (startX + width - padding.right) / 2, padding.top + 4); + } + + const movingAverage = rows.map((_row, index) => { + const start = Math.max(0, index - 4); + const sample = rows.slice(start, index + 1); + return sample.reduce((sum, item) => sum + number(item.score), 0) / sample.length; + }); + context.beginPath(); + movingAverage.forEach((score, index) => { + if (index === 0) context.moveTo(x(index), y(score)); + else context.lineTo(x(index), y(score)); + }); + context.strokeStyle = palette.movingAverage; + context.lineWidth = 1.5; + context.setLineDash([5, 4]); + context.stroke(); + context.setLineDash([]); + + context.beginPath(); + rows.forEach((row, index) => { + const pointX = x(index); + const pointY = y(row.score); + if (index === 0) context.moveTo(pointX, pointY); + else context.lineTo(pointX, pointY); + }); + context.lineTo(x(rows.length - 1), padding.top + chartHeight); + context.lineTo(x(0), padding.top + chartHeight); + context.closePath(); + context.fillStyle = palette.area; + context.fill(); + + context.beginPath(); + rows.forEach((row, index) => { + const pointX = x(index); + const pointY = y(row.score); + if (index === 0) context.moveTo(pointX, pointY); + else context.lineTo(pointX, pointY); + }); + context.strokeStyle = palette.line; + context.lineWidth = 2.5; + context.lineJoin = "round"; + context.lineCap = "round"; + context.stroke(); + + rows.forEach((row, index) => { + context.beginPath(); + context.arc(x(index), y(row.score), index === rows.length - 1 ? 4.5 : 3, 0, Math.PI * 2); + context.fillStyle = ["退潮", "冰点"].includes(row.phase) ? palette.up : row.phase === "修复" ? palette.repair : palette.line; + context.fill(); + context.strokeStyle = palette.background; + context.lineWidth = 1.5; + context.stroke(); + }); + context.restore(); + + const labelStep = Math.max(1, Math.ceil(rows.length / 6)); + context.textAlign = "center"; + context.textBaseline = "top"; + context.fillStyle = palette.axis; + rows.forEach((row, index) => { + if (index % labelStep !== 0 && index !== rows.length - 1) return; + const dateText = displayCompactDate(row.trade_date).slice(5); + context.fillText(dateText, x(index), height - padding.bottom + 10); + }); +} + +function bindSentimentChartTooltip(rows) { + const canvas = document.querySelector("#sentimentTrendChart"); + const tooltip = document.querySelector("#sentimentChartTooltip"); + if (!canvas || !tooltip || !rows.length) return; + canvas.onmousemove = (event) => { + const rect = canvas.getBoundingClientRect(); + const padding = { left: 42, right: 18 }; + const chartWidth = Math.max(1, rect.width - padding.left - padding.right); + const relativeX = clamp(event.clientX - rect.left - padding.left, 0, chartWidth); + const index = rows.length === 1 ? 0 : Math.round(relativeX / chartWidth * (rows.length - 1)); + const row = rows[index]; + tooltip.innerHTML = `${escapeHtml(displayCompactDate(row.trade_date))} · 温度 ${number(row.score)} · ${escapeHtml(row.phase)}`; + tooltip.hidden = false; + const targetLeft = padding.left + (rows.length === 1 ? chartWidth / 2 : index / (rows.length - 1) * chartWidth); + tooltip.style.left = `${clamp(targetLeft + 10, 8, rect.width - tooltip.offsetWidth - 8)}px`; + tooltip.style.top = `${clamp(event.clientY - rect.top - 34, 8, rect.height - 34)}px`; + }; + canvas.onmouseleave = () => { tooltip.hidden = true; }; +} + +function sentimentScoreClass(score) { + const value = number(score); + return value >= 60 ? "score-strong" : value < 40 ? "score-weak" : "score-neutral"; +} + +function sentimentPhaseClass(phase) { + return { + "冰点": "phase-ice", + "修复": "phase-repair", + "发酵": "phase-fermentation", + "高潮": "phase-climax", + "分化": "phase-divergence", + "退潮": "phase-retreat", + }[phase] || "phase-divergence"; +} + +function sentimentPhaseConfidence(row) { + const explicit = number(row?.confidence || row?.phase_confidence); + if (explicit > 0) return Math.round(clamp(explicit, 0, 100)); + const historyEvidence = Math.min(12, number(row?.history_days) * 0.6); + const movementEvidence = Math.min(18, Math.abs(number(row?.day_change)) * 0.8); + return Math.round(clamp(62 + historyEvidence + movementEvidence, 60, 92)); +} + +function sentimentPhaseAdvice(phase) { + return { + "冰点": "情绪处于极弱区,先观察风险释放,允许没有候选结果。", + "修复": "风险开始收敛,关注率先转强的核心,小仓验证修复强度。", + "发酵": "主线与梯队正在形成,优先跟随核心,避免偏离主线。", + "高潮": "情绪与一致性已处高位,聚焦核心并主动降低后排暴露。", + "分化": "强弱开始分层,关注承接与回流,淘汰失去辨识度的方向。", + "退潮": "情绪指标继续走弱。", + }[phase] || "市场结构尚未形成清晰阶段,保持观察并等待确认。"; +} + +/* PRESERVATION-SOURCE-END app.js:1207-1516 */ diff --git a/app/frontend/pages/themes/page.js b/app/frontend/pages/themes/page.js new file mode 100644 index 0000000..ab68431 --- /dev/null +++ b/app/frontend/pages/themes/page.js @@ -0,0 +1,108 @@ +window.XiaobaiPageModules.register("themes", ["themeLibraryView"], { + enter: ["loadThemes"], +}); + +/* PRESERVATION-SOURCE-BEGIN app.js:2482-2583 */ +async function loadThemeLibrary(force = false) { + if (state.themeLoading) return; + state.themeLoading = true; + const button = document.querySelector("#themeRefreshButton"); + button.disabled = true; + setText("themeDateLabel", "正在整理题材库"); + try { + const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); + if (force) query.set("force", "1"); + state.themeLibrary = await apiRequest(`/api/themes?${query}`); + renderThemeLibrary(); + const available = (state.themeLibrary.items || []).some((item) => item.code === state.selectedThemeCode); + if (!available) state.selectedThemeCode = ""; + const initialCode = state.selectedThemeCode || state.themeLibrary.items?.[0]?.code || ""; + if (initialCode) await selectTheme(initialCode, true); + } catch (error) { + setText("themeDateLabel", error.message || "题材数据暂不可用"); + renderEmptyState("themeDirectory", error.message || "题材数据加载失败"); + showToast(error.message || "题材数据加载失败"); + } finally { + state.themeLoading = false; + button.disabled = false; + } +} + +function renderThemeLibrary() { + const payload = state.themeLibrary; + if (!payload) return; + const summary = payload.summary || {}; + setText("themeDateLabel", `${payload.meta?.carried_forward ? "最近有效行情" : "行情日期"} ${payload.meta?.trade_date || "--"}`); + document.querySelector("#themeSummary").innerHTML = [ + ["收录题材", number(summary.theme_count), "个", ""], + ["当日上涨", number(summary.up_count), "个", "up"], + ["当日下跌", number(summary.down_count), "个", "down"], + ["人气题材", number(summary.hot_count), "个", "warning"], + ].map(([label, value, unit, tone]) => `
    ${label}${value}${unit}
    `).join(""); + renderThemeDirectory(); +} + +function renderThemeDirectory() { + let items = [...(state.themeLibrary?.items || [])]; + if (state.themeQuery) { + items = items.filter((item) => `${item.code} ${item.name}`.toLocaleLowerCase("zh-CN").includes(state.themeQuery)); + } + setText("themeResultCount", `${items.length} 个`); + document.querySelector("#themeDirectory").innerHTML = items.map((item, index) => { + const active = item.code === state.selectedThemeCode; + return ` + `; + }).join("") || emptyStateHtml("没有匹配的题材"); +} + +async function selectTheme(code, keepSelection = false) { + if (!code) return; + state.selectedThemeCode = code; + if (!keepSelection) renderThemeDirectory(); + document.querySelector("#themeDetailEmpty").hidden = false; + document.querySelector("#themeDetailContent").hidden = true; + setText("themeDetailEmpty", "正在读取题材详情"); + try { + const query = new URLSearchParams({ code, trade_date: elements.tradeDate.value }); + state.themeDetail = await apiRequest(`/api/themes/detail?${query}`); + renderThemeDetail(); + } catch (error) { + setText("themeDetailEmpty", error.message || "题材详情加载失败"); + showToast(error.message || "题材详情加载失败"); + } +} + +function renderThemeDetail() { + const payload = state.themeDetail; + if (!payload) return; + const theme = payload.theme || {}; + const summary = payload.summary || {}; + document.querySelector("#themeDetailEmpty").hidden = true; + document.querySelector("#themeDetailContent").hidden = false; + setText("themeDetailName", theme.name || "--"); + setText("themeDetailCode", `${theme.code || "--"} · ${payload.meta?.trade_date || "--"}`); + setText("themeDetailChange", `${signed(theme.change)}%`); + document.querySelector("#themeDetailChange").className = changeClass(theme.change); + document.querySelector("#themeDetailMetrics").innerHTML = [ + ["成分股", `${number(summary.member_count)} 只`, ""], + ["有行情", `${number(summary.quoted_count)} 只`, ""], + ["上涨", `${number(summary.up_count)} 只`, "up"], + ["下跌", `${number(summary.down_count)} 只`, "down"], + ["换手率", `${formatNumber(theme.turnover_rate, 2)}%`, ""], + ].map(([label, value, tone]) => `
    ${label}${value}
    `).join(""); + setText("themeMemberCount", `有行情 ${number(summary.quoted_count)} / ${number(summary.member_count)}`); + const body = document.querySelector("#themeMemberTableBody"); + body.innerHTML = (payload.members || []).map((row, index) => ` + ${index + 1} + ${escapeHtml(row.name)}${escapeHtml(row.code)} + ${row.has_quote ? signed(row.change) : ""} + ${row.has_quote ? formatNumber(row.price, 2) : ""}${row.has_quote ? formatNumber(row.amount_billion, 2) : ""}`).join(""); + bindStockRows(body); + renderThemeDirectory(); +} + +/* PRESERVATION-SOURCE-END app.js:2482-2583 */ diff --git a/app/static/shared/api.js b/app/frontend/shared/api.js similarity index 100% rename from app/static/shared/api.js rename to app/frontend/shared/api.js diff --git a/app/static/shared/components.js b/app/frontend/shared/components.js similarity index 100% rename from app/static/shared/components.js rename to app/frontend/shared/components.js diff --git a/app/frontend/shared/export.js b/app/frontend/shared/export.js new file mode 100644 index 0000000..6ff9ee1 --- /dev/null +++ b/app/frontend/shared/export.js @@ -0,0 +1,149 @@ +/* PRESERVATION-SOURCE-BEGIN app.js:8905-9051 */ +function exportStocks() { + exportRows("涨停池", getVisibleStocks(), [ + ["股票代码", "code"], ["股票名称", "name"], ["连板", "streak"], ["涨幅%", "change"], + ["价格", "price"], ["所属板块", "sector"], ["涨停原因", "reason"], ["首封", "first_time"], + ["最后封板", "last_time"], ["开板次数", "open_times"], ["换手率%", "turnover_rate"], + ["成交额亿", "amount_billion"], ["封单额万", "seal_amount_million"], + ]); +} + +function exportBroken() { + exportRows("炸板池", getVisibleBrokenRows(), [ + ["股票代码", "code"], ["股票名称", "name"], ["现价涨幅%", "change"], ["距涨停%", "limitGap"], + ["价格", "price"], ["所属板块", "sector"], ["首次触板", "first_time"], ["开板次数", "open_times"], + ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"], + ]); +} + +function exportDown() { + exportRows("跌停板", getVisibleDownRows(), [ + ["股票代码", "code"], ["股票名称", "name"], ["跌幅%", "change"], ["价格", "price"], + ["所属板块", "sector"], ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"], + ]); +} + +function exportYesterday() { + exportRows("昨日涨停", getVisibleYesterdayRows(), [ + ["股票代码", "code"], ["股票名称", "name"], ["昨日高度", "prior_streak"], + ["今日涨幅%", "current_change"], ["今日结果", "outcome"], ["当前高度", "current_streak"], + ["所属板块", "sector"], + ]); +} + +function exportLadder() { + const rows = (state.dashboard?.ladders || []).flatMap((group) => (group.stocks || []).map((stock) => ({ + level: group.label || group.level, + ...stock, + }))); + exportRows("市场天梯", rows, [ + ["梯队", "level"], ["股票代码", "code"], ["股票名称", "name"], ["所属板块", "sector"], + ["封板时间", "first_time"], ["开板次数", "open_times"], ["封单额万", "seal_amount_million"], ["成交额亿", "amount_billion"], + ]); +} + +function exportRotation() { + const sectorMap = new Map((state.dashboard?.sectors || []).map((sector) => [sector.name, sector])); + const rows = (state.dashboard?.sector_rotation || []).map((row) => ({ + ...row, + average_change: sectorMap.get(row.name)?.change ?? 0, + })); + exportRows("板块轮动", rows, [ + ["排名", "rank"], ["板块", "name"], ["趋势", "trend"], ["今日涨停", "count"], + ["昨日涨停", "previous_count"], ["变化", "delta"], ["强度", "strength"], + ["最高板", "max_streak"], ["平均涨幅%", "average_change"], + ["领涨股", "leader"], ["涨停股成交额亿", "amount_billion"], + ]); +} + +function exportSentimentHistory() { + const rows = state.sentimentHistory?.rows || []; + if (!rows.length) { + showToast("暂无可导出的情绪周期数据"); + return; + } + const exportRowsData = rows.map((row) => ({ + ...row, + breadth_score: row.components?.breadth?.score, + limit_ecology_score: row.components?.limit_ecology?.score, + profit_effect_score: row.components?.profit_effect?.score, + ladder_structure_score: row.components?.ladder_structure?.score, + liquidity_score: row.components?.liquidity?.score, + })); + exportRows("情绪周期", exportRowsData, [ + ["交易日", "trade_date"], ["情绪温度", "score"], ["周期阶段", "phase"], ["方向", "direction"], + ["涨停", "limit_up_count"], ["首板", "first_board_count"], ["二板", "second_board_count"], + ["三板以上", "three_plus_count"], ["连板高度", "max_height"], ["炸板", "broken_count"], + ["跌停", "limit_down_count"], ["昨日涨停", "previous_limit_count"], + ["昨日涨停红盘", "previous_positive_count"], ["昨日涨停红盘率%", "previous_positive_rate"], + ["市场宽度", "breadth_score"], ["涨停生态", "limit_ecology_score"], + ["赚钱效应", "profit_effect_score"], ["连板结构", "ladder_structure_score"], + ["成交活跃度", "liquidity_score"], + ]); +} + +function exportDragonTiger() { + const rows = (state.dragonTiger?.traders || []).flatMap((trader) => ( + (trader.operations || []).map((operation) => ({ + trader_name: trader.name, + identity_type: dragonIdentityLabel(trader.identity_type), + ...operation, + })) + )); + exportRows("游资龙虎榜", rows, [ + ["游资或席位", "trader_name"], ["身份", "identity_type"], ["股票代码", "code"], + ["股票名称", "name"], ["方向", "direction"], ["涨幅%", "change"], + ["买入百万元", "buy_million"], ["卖出百万元", "sell_million"], ["净额百万元", "net_buy_million"], + ["关联席位", "seat_name"], ["上榜原因", "reason"], + ]); +} + +function exportHotMoneyProfiles() { + const rows = state.hotMoneyProfiles?.profiles || []; + if (!rows.length) { + showToast("暂无可导出的游资档案"); + return; + } + downloadCsv( + `游资档案-${todayString()}.csv`, + ["游资名称", "简介", "关联营业部", "席位数量"], + rows.map((profile) => [ + profile.name, + profile.description, + (profile.organizations || []).join(";"), + number(profile.organization_count), + ]), + ); +} + +function commonReviewColumns() { + return [["股票代码", "code"], ["股票名称", "name"], ["状态", "status"], ["涨跌幅%", "change"], + ["价格", "price"], ["所属板块", "sector"], ["原因", "reason"], ["首次触板", "first_time"], + ["最后触板", "last_time"], ["开板次数", "open_times"], ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"]]; +} + +function exportRows(label, rows, columns) { + const headers = columns.map(([header]) => header); + const data = rows.map((row) => columns.map(([, key]) => row[key] ?? "")); + downloadCsv(`${label}-${state.dashboard.meta.trade_date}.csv`, headers, data); +} + +function downloadCsv(filename, headers, rows) { + const lines = [headers, ...rows].map((row) => row.map(csvCell).join(",")); + const blob = new Blob(["\ufeff", lines.join("\r\n")], { type: "text/csv;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const anchor = document.createElement("a"); + anchor.href = url; + anchor.download = filename; + anchor.click(); + URL.revokeObjectURL(url); + showToast(`已导出 ${rows.length} 条数据`); +} + +function csvCell(value) { + let text = String(value ?? ""); + if (/^[=+\-@]/.test(text)) text = `'${text}`; + return `"${text.replaceAll('"', '""')}"`; +} + +/* PRESERVATION-SOURCE-END app.js:8905-9051 */ diff --git a/app/static/shared/shell.js b/app/frontend/shared/shell.js similarity index 100% rename from app/static/shared/shell.js rename to app/frontend/shared/shell.js diff --git a/app/static/shared/state.js b/app/frontend/shared/state.js similarity index 100% rename from app/static/shared/state.js rename to app/frontend/shared/state.js diff --git a/app/static/shared/tokens.css b/app/frontend/shared/tokens.css similarity index 100% rename from app/static/shared/tokens.css rename to app/frontend/shared/tokens.css diff --git a/app/static/ui-core.js b/app/frontend/shared/ui-core.js similarity index 100% rename from app/static/ui-core.js rename to app/frontend/shared/ui-core.js diff --git a/app/static/design-system.css b/app/frontend/styles/design-system.css similarity index 100% rename from app/static/design-system.css rename to app/frontend/styles/design-system.css diff --git a/app/static/redesign-v2.css b/app/frontend/styles/redesign-v2.css similarity index 100% rename from app/static/redesign-v2.css rename to app/frontend/styles/redesign-v2.css diff --git a/app/static/renovation.css b/app/frontend/styles/renovation.css similarity index 100% rename from app/static/renovation.css rename to app/frontend/styles/renovation.css diff --git a/app/static/styles.css b/app/frontend/styles/styles.css similarity index 100% rename from app/static/styles.css rename to app/frontend/styles/styles.css diff --git a/app/static/theme.css b/app/frontend/styles/theme.css similarity index 100% rename from app/static/theme.css rename to app/frontend/styles/theme.css diff --git a/app/static/vendor/lucide.min.js b/app/frontend/vendor/lucide.min.js similarity index 100% rename from app/static/vendor/lucide.min.js rename to app/frontend/vendor/lucide.min.js diff --git a/app/playwright.config.js b/app/playwright.config.js index a5541d1..fa65813 100644 --- a/app/playwright.config.js +++ b/app/playwright.config.js @@ -13,9 +13,11 @@ module.exports = defineConfig({ trace: "retain-on-failure", }, webServer: { - command: "python -m http.server 8876 --bind 127.0.0.1 --directory static", + command: "python -m http.server 8876 --bind 127.0.0.1 --directory frontend", url: "http://127.0.0.1:8876/index.html", reuseExistingServer: true, timeout: 15_000, + stdout: "ignore", + stderr: "ignore", }, }); diff --git a/app/static/app.js b/app/static/app.js deleted file mode 100644 index 04e4f30..0000000 --- a/app/static/app.js +++ /dev/null @@ -1,9283 +0,0 @@ -const { - clamp, - displayCompactDate, - escapeHtml, - formatNumber, - formatTimestamp, - localDateString, - number, - parseLocalDate, - todayString, -} = window.XiaobaiUI; - -const { - emptyStateHtml, - renderEmptyState, -} = window.XiaobaiComponents; - -const HEART_BREATH_INHALE_MS = 3_000; -const HEART_BREATH_HOLD_MS = 2_000; -const HEART_BREATH_EXHALE_MS = 4_000; -const HEART_BREATH_PREPARE_MS = 1_000; -const HEART_BREATH_CYCLE_MS = HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS + HEART_BREATH_EXHALE_MS; -const HEART_BREATH_ACTIVE_MS = HEART_BREATH_CYCLE_MS * 5; -const HEART_BREATH_TOTAL_MS = HEART_BREATH_PREPARE_MS + HEART_BREATH_ACTIVE_MS; -const THEME_STORAGE_KEY = "xiaobaiTheme"; -let activeThemeTransition = null; -let themeSwitchSequence = 0; - -const state = window.XiaobaiState.create({ - session: { - user: null, - csrfToken: "", - authMode: "login", - started: false, - activeView: "sentimentCycleView", - dashboardLoading: false, - dashboardRequestSequence: 0, - dashboardRequestDate: "", - adminModels: [], - globalSearchResults: [], - globalSearchActiveIndex: -1, - globalSearchRequestSequence: 0, - }, - market: { - dashboard: null, - filter: "all", - query: "", - sortKey: "streak", - sortDirection: "desc", - brokenQuery: "", - brokenSortKey: "", - brokenSortDirection: "desc", - downQuery: "", - downSortKey: "", - downSortDirection: "asc", - yesterdayFilter: "all", - yesterdayQuery: "", - yesterdaySortKey: "", - yesterdaySortDirection: "desc", - dragonTiger: null, - dragonViewMode: "daily", - dragonFilter: "all", - dragonQuery: "", - selectedDragonTraderId: "", - hotMoneyProfiles: null, - hotMoneyProfileQuery: "", - selectedHotMoneyProfileId: "", - rotationHistory: null, - rotationHistoryKey: "", - rotationSelectedSector: "", - rotationSelectedDate: "", - rotationMembers: null, - rotationMembersKey: "", - rotationMembersLoading: false, - rotationOrder: localStorage.getItem("xiaobaiRotationOrder") === "latest" ? "latest" : "oldest", - rotationLoading: false, - auctionData: null, - auctionDataset: "focus", - auctionFilter: "all", - auctionQuery: "", - auctionSortKey: "attention_score", - auctionSortDirection: "desc", - auctionLoading: false, - auctionTimer: null, - themeLibrary: null, - themeQuery: "", - selectedThemeCode: "", - themeDetail: null, - themeLoading: false, - popularityData: null, - popularitySource: "combined", - popularityQuery: "", - popularityLoading: false, - expandedLadderLevels: new Set(), - ladderSortMode: "time", - sentimentHistory: null, - sentimentRange: 20, - sentimentHistoryKey: "", - sentimentLoading: false, - }, - details: { - stockDetail: null, - activeStock: null, - stockDetailChartMode: "daily", - stockDetailIntraday: null, - stockDetailRequestSequence: 0, - entityDetailItem: null, - entityDetailPayload: null, - entityDetailChartMode: "daily", - entityDetailIntraday: null, - entityDetailRequestSequence: 0, - stockPreviewCode: "", - stockPreviewType: "stock", - stockPreviewItem: null, - stockPreviewPayload: null, - stockPreviewChart: "daily", - stockPreviewFallback: null, - initialStockOpened: false, - }, - review: { - watchlist: [], - watchlistSelection: null, - watchlistSearchResults: [], - watchlistSearchRequestSequence: 0, - editingDailyNoteId: 0, - notes: [], - tradeEntries: [], - tradeSummary: {}, - editingTradeId: 0, - alerts: [], - alertFilter: "all", - alertUnreadCount: 0, - assistantMessages: [], - assistantLoading: false, - assistantController: null, - }, - screener: { - screenerSetup: null, - screenerSetupKey: "", - screenerSetupRequestKey: "", - screenerSetupPromise: null, - selectedRegime: "", - selectedStrategy: null, - customStrategyDraft: null, - screenerRunning: false, - screenerRunningMode: "", - screenerResults: { smart: null, curated: null, quant: null }, - screenerResultContexts: { smart: null, curated: null, quant: null }, - screenerResultStore: {}, - screenerTracking: null, - screenerMode: ["smart", "curated", "quant"].includes(localStorage.getItem("xiaobaiScreenerMode")) - ? localStorage.getItem("xiaobaiScreenerMode") - : "smart", - curatedCategory: "全部", - curatedSchool: "全部", - curatedQuery: "", - curatedViewMode: localStorage.getItem("xiaobaiCuratedViewMode") === "grid" ? "grid" : "list", - selectedCuratedStrategyId: 0, - quantFilters: [], - quantScores: [], - screenerMobileView: "strategy", - }, - mentor: { - mentorSetup: null, - selectedMentorId: "", - mentorMessages: [], - mentorLoading: false, - mentorQuery: "", - mentorGrade: "all", - mentorDirectoryOpen: false, - mentorSortMode: false, - mentorSavingPreferences: false, - mentorController: null, - }, - heaven: { - heavenSetup: null, - heavenManualData: null, - personalField: null, - heavenPanel: "trend", - heavenInterpretations: { trend: "", fortune: "", heart: "" }, - heavenReadingMode: "trend", - heavenReadingTab: "current", - heavenReadingHistory: { trend: [], fortune: [], heart: [] }, - heavenReadingSelectedId: 0, - heavenReadingLoading: false, - heavenReadingError: "", - heartStage: "intro", - heartTimer: null, - heartSeconds: HEART_BREATH_TOTAL_MS / 1000, - heartBreathingEndsAt: 0, - heartLines: [], - heartThrows: [], - heartHexagram: null, - heartCurtainTimer: null, - heartStageToken: 0, - heartRevealToken: 0, - heavenPerformanceKey: "", - heavenPerformancePanels: new Set(), - heavenPerformanceActive: "", - heavenRequestSequence: 0, - }, -}); - -window.XiaobaiAPI.configure({ - csrfToken: () => state.csrfToken, - onUnauthorized: () => showAuthGate("登录状态已失效,请重新登录。"), -}); - -const applicationShell = window.XiaobaiShell.create({ - state, - pages: window.XiaobaiPages, - motionEnabled, - animateRows, - refreshIcons, - tradeDate: () => displayCompactDate( - state.dashboard?.meta?.trade_date || document.querySelector("#tradeDate")?.value || "", - ), - onNavigate: (viewId) => openView(viewId), - onNavigationSync: () => toggleAccountDropdown(false), -}); - -const pageModules = window.XiaobaiPageModules.create({ - pages: window.XiaobaiPages, - actions: { - closeTransientUi: () => closeStockPreview(), - applyAccess: () => applyMembershipAccess(), - clearAuction: () => clearAuctionTimer(), - stopHeaven: () => { - stopQiFieldCanvas(); - stopHeartDust(); - cancelHeavenPerformance(); - }, - loadSentiment: () => loadSentimentHistory(), - loadRotation: () => loadRotationHistory(), - loadAuction: () => loadAuctionCenter(), - loadThemes: () => loadThemeLibrary(), - loadPopularity: () => loadPopularity(), - loadDragonTiger: () => loadDragonTiger(), - loadReview: () => loadReviewWorkspace(), - loadScreener: () => { - if (hasMemberAccess() && state.dashboard) loadScreenerSetup(); - }, - loadMentor: () => { - if (hasMemberAccess()) loadMentorSetup(); - }, - loadHeaven: () => { - if (!hasMemberAccess()) return; - loadHeavenSetup(false, "", document.querySelector("#heavenStockInput").value.trim()); - }, - }, -}); - -const elements = { - tradeDate: document.querySelector("#tradeDate"), - loading: document.querySelector("#loadingOverlay"), - toast: document.querySelector("#toast"), - stockDialog: document.querySelector("#stockDialog"), - tradeLogDialog: document.querySelector("#tradeLogDialog"), - watchlistDialog: document.querySelector("#watchlistDialog"), - alertsDialog: document.querySelector("#alertsDialog"), - assistantDialog: document.querySelector("#assistantDialog"), - heavenReadingDialog: document.querySelector("#heavenReadingDialog"), - globalSearchDialog: document.querySelector("#globalSearchDialog"), - globalSearchInput: document.querySelector("#globalSearchInput"), - globalSearchResults: document.querySelector("#globalSearchResults"), - entityDetailDialog: document.querySelector("#entityDetailDialog"), - entityDetailChart: document.querySelector("#entityDetailChart"), - settingsDialog: document.querySelector("#settingsDialog"), - adminDialog: document.querySelector("#adminDialog"), - priceChart: document.querySelector("#priceChart"), - stockPreview: document.querySelector("#stockPreview"), - stockPreviewBackdrop: document.querySelector("#stockPreviewBackdrop"), - stockPreviewChart: document.querySelector("#stockPreviewChart"), -}; - -function openModalDialog(dialog) { - applicationShell.openModalDialog(dialog); -} - -const metricAnimationFrames = new WeakMap(); -const stockPreviewCache = new Map(); -const STOCK_PREVIEW_DELAY = 380; -const STOCK_PREVIEW_CACHE_MS = 5 * 60 * 1000; -const LIVE_REFRESH_DEFAULT_MS = 10 * 1000; -let qiFieldAnimationFrame = 0; -let qiFieldSoloElement = ""; -let heavenPerformanceToken = 0; -let heavenReadingAnimation = null; -let heartHoldTimer = null; -let heartHoldTriggered = false; -let heartHoldStartedAt = 0; -let heartHoldAnimationFrame = 0; -let heartCastingBusy = false; -let heartDustAnimationFrame = 0; -let heartDustParticles = []; -let heartIncenseAnimation = null; -const heartCoinRotations = [0, 0, 0]; -let rowAnimationObserver = null; -let stockPreviewOpenTimer = null; -let stockPreviewCloseTimer = null; -let stockPreviewAbortController = null; -let stockPreviewAnchor = null; -let sentimentChartAnimationFrame = null; -let heavenResizeTimer = null; -let globalSearchTimer = null; -let watchlistSearchTimer = null; -let assistantRenderFrame = 0; - -const heartSound = { - enabled: false, - context: null, - ensure() { - if (!this.context) { - const AudioContextClass = window.AudioContext || window.webkitAudioContext; - if (!AudioContextClass) return null; - this.context = new AudioContextClass(); - } - if (this.context.state === "suspended") this.context.resume(); - return this.context; - }, - tone(frequency, duration, gain, type = "sine", delay = 0) { - if (!this.enabled) return; - const context = this.ensure(); - if (!context) return; - const start = context.currentTime + delay; - const oscillator = context.createOscillator(); - const volume = context.createGain(); - oscillator.type = type; - oscillator.frequency.value = frequency; - volume.gain.setValueAtTime(0.0001, start); - volume.gain.linearRampToValueAtTime(gain, start + 0.015); - volume.gain.exponentialRampToValueAtTime(0.0001, start + duration); - oscillator.connect(volume).connect(context.destination); - oscillator.start(start); - oscillator.stop(start + duration + 0.05); - }, - chime(frequency = 640) { - this.tone(frequency, 4.8, 0.12); - this.tone(frequency * 2.02, 3.6, 0.045); - this.tone(frequency * 3.96, 2.2, 0.018); - }, - coin(delay = 0) { - this.tone(2350 + Math.random() * 260, 0.28, 0.055, "triangle", delay); - this.tone(3250 + Math.random() * 260, 0.18, 0.025, "triangle", delay + 0.01); - }, -}; - -const HEART_WHISPERS = [ - ["应无所住,而生其心", 10, 12, 0], - ["不是风动,不是幡动,仁者心动", 89, 8, 1], - ["菩提本无树,明镜亦非台", 16, 52, 2], - ["本来无一物,何处惹尘埃", 84, 54, 3], - ["心外无物,心外无理", 22, 18, 4], - ["知行合一", 78, 30, 5], - ["此心光明,亦复何言", 90, 60, 6], -]; - -window.addEventListener("resize", () => { - clearTimeout(heavenResizeTimer); - heavenResizeTimer = setTimeout(() => { - if (state.activeView !== "heavenView") return; - if (state.heavenPanel === "fortune" && state.heavenSetup?.field) { - renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false }); - drawQiUseConnections(false); - } - if (state.heavenPanel === "heart") startHeartDust(); - }, 120); -}); - -document.addEventListener("DOMContentLoaded", initialize); - -function syncThemeControl() { - const theme = document.documentElement.dataset.theme === "dark" ? "dark" : "light"; - const button = document.querySelector("#themeToggle"); - if (!button) return; - const dark = theme === "dark"; - const label = dark ? "切换到日间模式" : "切换到夜间模式"; - button.title = label; - button.setAttribute("aria-label", label); - button.setAttribute("aria-pressed", String(dark)); - button.querySelector("i")?.setAttribute("data-lucide", dark ? "sun" : "moon"); -} - -function clearThemeTransitionEffects() { - document.querySelectorAll(".row-enter, .row-pending, .view-entering").forEach((element) => { - element.classList.remove("row-enter", "row-pending", "view-entering"); - element.style.removeProperty("--row-delay"); - }); -} - -function redrawThemeSensitiveVisuals() { - if (!elements.stockPreview.hidden && state.stockPreviewPayload) { - selectStockPreviewChart(state.stockPreviewChart); - } - if (elements.stockDialog.open) { - if (state.stockDetailChartMode === "intraday" && state.stockDetailIntraday?.points?.length) { - drawIntradayCanvas( - elements.priceChart, - state.stockDetailIntraday.points, - [], - state.stockDetailIntraday.meta?.previous_close, - ); - } else if (state.stockDetail?.prices) drawPriceChart(state.stockDetail.prices); - } - if (elements.entityDetailDialog.open) { - if (state.entityDetailChartMode === "intraday" && state.entityDetailIntraday?.points?.length) { - drawIntradayCanvas( - elements.entityDetailChart, - state.entityDetailIntraday.points, - [], - state.entityDetailIntraday.meta?.previous_close, - ); - } else if (state.entityDetailPayload?.series) { - drawEntityDetailChart(state.entityDetailPayload.series); - } - } - if (state.activeView === "sentimentCycleView" && state.sentimentHistory) { - drawSentimentTrendChart(state.sentimentHistory.rows || []); - } - if (state.activeView === "heavenView") { - if (state.heavenPanel === "fortune" && state.heavenSetup?.field) { - renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false }); - drawQiUseConnections(false); - } - if (state.heavenPanel === "heart") startHeartDust(); - } -} - -function commitTheme(normalized, persist) { - document.documentElement.dataset.theme = normalized; - document.documentElement.style.colorScheme = normalized; - if (persist) { - try { - localStorage.setItem(THEME_STORAGE_KEY, normalized); - } catch (_error) { - // The selected theme still applies for the current page when storage is unavailable. - } - } - syncThemeControl(); - refreshIcons(); - redrawThemeSensitiveVisuals(); -} - -function applyTheme(theme, persist = true) { - const normalized = theme === "dark" ? "dark" : "light"; - const root = document.documentElement; - if (root.dataset.theme === normalized) { - commitTheme(normalized, persist); - return; - } - const sequence = ++themeSwitchSequence; - activeThemeTransition?.skipTransition?.(); - clearThemeTransitionEffects(); - root.classList.add("theme-switching"); - - const update = () => commitTheme(normalized, persist); - const finish = () => { - if (sequence !== themeSwitchSequence) return; - clearThemeTransitionEffects(); - root.classList.remove("theme-switching"); - activeThemeTransition = null; - }; - const reducedMotion = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches; - if (!reducedMotion && typeof document.startViewTransition === "function") { - activeThemeTransition = document.startViewTransition(update); - activeThemeTransition.finished.then(finish, finish); - return; - } - update(); - requestAnimationFrame(() => requestAnimationFrame(finish)); -} - -function toggleTheme() { - applyTheme(document.documentElement.dataset.theme === "dark" ? "light" : "dark"); -} - -async function initialize() { - syncThemeControl(); - refreshIcons(); - applicationShell.initialize(); - elements.tradeDate.value = todayString(); - const initialUrl = new URL(window.location.href); - if (initialUrl.searchParams.has("date")) { - initialUrl.searchParams.delete("date"); - history.replaceState(null, "", initialUrl); - } - elements.tradeDate.max = todayString(); - document.querySelector("#journalDate").value = elements.tradeDate.value; - document.querySelector("#journalDate").max = todayString(); - document.querySelector("#tradeLogDate").value = elements.tradeDate.value; - document.querySelector("#tradeLogDate").max = todayString(); - document.querySelector("#backfillStart").value = todayString(); - document.querySelector("#backfillEnd").value = todayString(); - document.querySelector("#backfillStart").max = todayString(); - document.querySelector("#backfillEnd").max = todayString(); - document.querySelector("#qiObservationDate").value = elements.tradeDate.value; - document.querySelector("#qiObservationDate").max = todayString(); - document.querySelector("#accountBirthDate").max = todayString(); - document.querySelector("#alertDate").value = todayString(); - bindEvents(); - try { - const session = await apiRequest("/api/auth/me"); - if (!session.authenticated) { - if (session.registration_required) selectAuthMode("register"); - showAuthGate(); - return; - } - await applyAuthenticatedSession(session); - } catch (error) { - showAuthGate(error.message || "无法连接本地服务"); - } -} - -async function startAuthenticatedApp() { - if (state.started) return; - state.started = true; - const searchParams = new URLSearchParams(window.location.search); - const requestedHeavenPanel = searchParams.get("heaven"); - if (["trend", "fortune", "heart"].includes(requestedHeavenPanel)) { - state.heavenPanel = requestedHeavenPanel; - } - const requestedView = window.XiaobaiPages.resolve(searchParams.get("view")); - if ( - requestedView - && window.XiaobaiPages.has(requestedView) - && document.getElementById(requestedView)?.classList.contains("workspace-view") - ) { - openView(requestedView, false); - if (requestedView !== searchParams.get("view")) { - const url = new URL(window.location.href); - url.searchParams.set("view", requestedView); - history.replaceState(null, "", url); - } - } - loadDashboard(); - loadAlerts(); - if (new URLSearchParams(window.location.search).get("settings") === "1") { - setTimeout(openSettings, 0); - } -} - -function selectAuthMode(mode) { - state.authMode = mode === "register" ? "register" : "login"; - document.querySelectorAll("[data-auth-mode]").forEach((button) => { - button.classList.toggle("active", button.dataset.authMode === state.authMode); - }); - const registering = state.authMode === "register"; - document.querySelector("#authConfirmField").hidden = !registering; - document.querySelector("#authPasswordConfirm").required = registering; - document.querySelector("#authPassword").autocomplete = registering ? "new-password" : "current-password"; - document.querySelector("#authSubmitButton").textContent = registering ? "注册并进入" : "登录"; - document.querySelector("#authError").hidden = true; -} - -async function submitAuthForm(event) { - event.preventDefault(); - const username = document.querySelector("#authUsername").value.trim(); - const password = document.querySelector("#authPassword").value; - const errorElement = document.querySelector("#authError"); - if (state.authMode === "register" && password !== document.querySelector("#authPasswordConfirm").value) { - errorElement.textContent = "两次输入的密码不一致。"; - errorElement.hidden = false; - return; - } - const button = document.querySelector("#authSubmitButton"); - button.disabled = true; - try { - const session = await apiRequest(`/api/auth/${state.authMode}`, "POST", { username, password }); - document.querySelector("#authForm").reset(); - await applyAuthenticatedSession(session); - } catch (error) { - errorElement.textContent = error.message || "账号操作失败"; - errorElement.hidden = false; - } finally { - button.disabled = false; - } -} - -async function applyAuthenticatedSession(session) { - state.user = session.user; - state.csrfToken = session.csrf_token || ""; - setText("accountName", session.user?.username || "账号"); - const isAdmin = session.user?.role === "admin"; - updateAccountIdentityBadges(session.user?.membership || {}); - document.querySelector("#settingsButton").hidden = !isAdmin; - document.querySelector("#syncButton").hidden = !isAdmin; - document.querySelector("#reasonForm").hidden = !isAdmin; - document.querySelector("#sectorPhaseManager").hidden = !isAdmin; - document.querySelector("#authGate").hidden = true; - applyMembershipAccess(); - await startAuthenticatedApp(); -} - -function showAuthGate(message = "") { - state.user = null; - state.csrfToken = ""; - const gate = document.querySelector("#authGate"); - gate.hidden = false; - const errorElement = document.querySelector("#authError"); - errorElement.textContent = message; - errorElement.hidden = !message; - document.querySelector("#authUsername").focus(); -} - -async function logoutAccount() { - toggleAccountDropdown(false); - try { - await apiRequest("/api/auth/logout", "POST", {}); - } catch (error) { - showToast(error.message || "退出失败"); - return; - } - window.location.reload(); -} - -function bindEvents() { - document.querySelectorAll("[data-auth-mode]").forEach((button) => { - button.addEventListener("click", () => selectAuthMode(button.dataset.authMode)); - }); - document.querySelector("#authForm").addEventListener("submit", submitAuthForm); - document.querySelector("#refreshButton").addEventListener("click", async (event) => { - const button = event.currentTarget; - button.disabled = true; - try { - await loadDashboard(false, false, false); - } finally { - button.disabled = false; - } - }); - document.querySelector("#syncButton").addEventListener("click", startAdminRefresh); - elements.tradeDate.addEventListener("change", () => { - state.dashboardRequestSequence += 1; - state.heavenRequestSequence += 1; - state.heavenManualData = null; - document.querySelector("#qiObservationDate").value = elements.tradeDate.value; - loadDashboard(); - }); - document.querySelector("#prevDate").addEventListener("click", () => shiftDate(-1)); - document.querySelector("#nextDate").addEventListener("click", () => shiftDate(1)); - document.querySelector("#stockSearch").addEventListener("input", (event) => { - state.query = event.target.value.trim().toLowerCase(); - renderLimitTable(); - }); - document.querySelectorAll("[data-table-search]").forEach((input) => { - input.addEventListener("input", () => { - const query = input.value.trim().toLowerCase(); - const body = document.querySelector(`#${CSS.escape(input.dataset.tableSearch)}`); - body?.querySelectorAll("tr").forEach((row) => { - row.hidden = Boolean(query) && !row.textContent.toLowerCase().includes(query); - }); - }); - }); - - document.querySelectorAll("[data-filter]").forEach((button) => { - button.addEventListener("click", () => { - document.querySelectorAll("[data-filter]").forEach((item) => item.classList.remove("active")); - button.classList.add("active"); - state.filter = button.dataset.filter; - renderLimitTable(); - }); - }); - - document.querySelector("#globalSearchButton").addEventListener("click", openGlobalSearch); - document.querySelector("#themeToggle").addEventListener("click", toggleTheme); - document.querySelector("#alertButton").addEventListener("click", openAlerts); - document.querySelector("#assistantButton").addEventListener("click", openReviewAssistant); - document.querySelector("#closeAssistantDialog").addEventListener("click", () => elements.assistantDialog.close()); - document.querySelector("#assistantForm").addEventListener("submit", sendAssistantQuestion); - document.querySelector("#stopAssistant").addEventListener("click", stopAssistantResponse); - document.querySelector("#clearAssistantMessages").addEventListener("click", clearAssistantConversation); - document.querySelectorAll("[data-assistant-prompt]").forEach((button) => { - button.addEventListener("click", () => useAssistantPrompt(button.dataset.assistantPrompt)); - }); - document.querySelector("#closeAlertsDialog").addEventListener("click", () => elements.alertsDialog.close()); - document.querySelector("#alertForm").addEventListener("submit", saveAlert); - document.querySelector("#markAllAlertsRead").addEventListener("click", markAllAlertsRead); - document.querySelector("#alertList").addEventListener("click", handleAlertAction); - document.querySelectorAll("[data-alert-filter]").forEach((button) => { - button.addEventListener("click", () => selectAlertFilter(button.dataset.alertFilter)); - }); - document.querySelector("#closeGlobalSearch").addEventListener("click", closeGlobalSearch); - document.querySelector("#closeEntityDetail").addEventListener("click", () => elements.entityDetailDialog.close()); - document.querySelectorAll("[data-entity-detail-chart]").forEach((button) => { - button.addEventListener("click", () => selectEntityDetailChart(button.dataset.entityDetailChart)); - }); - elements.globalSearchDialog.addEventListener("click", (event) => { - if (event.target === elements.globalSearchDialog) closeGlobalSearch(); - }); - elements.globalSearchInput.addEventListener("input", scheduleGlobalSearch); - elements.globalSearchInput.addEventListener("keydown", handleGlobalSearchInputKeydown); - elements.globalSearchResults.addEventListener("click", (event) => { - const result = event.target.closest("[data-search-result-index]"); - if (result) openGlobalSearchResult(number(result.dataset.searchResultIndex)); - }); - document.addEventListener("click", (event) => { - if (!event.target.closest(".account-menu-shell")) toggleAccountDropdown(false); - }); - window.addEventListener("keydown", handleGlobalSearchShortcut); - document.addEventListener("keydown", (event) => { - if (event.key === "Escape") { - toggleAccountDropdown(false, true); - toggleMentorDirectory(false); - } - handleAccountMenuKeydown(event); - }); - window.addEventListener("resize", () => { - if (window.innerWidth > 720) toggleMentorDirectory(false); - if (!elements.stockPreview.hidden) closeStockPreview(); - if (state.activeView === "dragonView") layoutDragonCards(); - }); - document.querySelectorAll("[data-open-account]").forEach((button) => { - button.addEventListener("click", () => openSettings("membership")); - }); - document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => { - header.addEventListener("click", () => changeSort(header.dataset.sort)); - }); - document.querySelector("#brokenSearch").addEventListener("input", (event) => { - state.brokenQuery = event.target.value.trim().toLowerCase(); - renderBrokenTable(state.dashboard?.broken || []); - }); - document.querySelectorAll("#brokenTable th[data-broken-sort]").forEach((header) => { - header.addEventListener("click", () => changeBrokenSort(header.dataset.brokenSort)); - }); - document.querySelector("#downSearch").addEventListener("input", (event) => { - state.downQuery = event.target.value.trim().toLowerCase(); - renderDownTable(state.dashboard?.down_limits || []); - }); - document.querySelectorAll("#downTable th[data-down-sort]").forEach((header) => { - header.addEventListener("click", () => changeDownSort(header.dataset.downSort)); - }); - document.querySelector("#yesterdaySearch").addEventListener("input", (event) => { - state.yesterdayQuery = event.target.value.trim().toLowerCase(); - renderYesterdayTable(state.dashboard?.yesterday_limits || []); - }); - document.querySelectorAll("[data-yesterday-filter]").forEach((button) => { - button.addEventListener("click", () => { - state.yesterdayFilter = button.dataset.yesterdayFilter; - renderYesterdayTable(state.dashboard?.yesterday_limits || []); - }); - }); - document.querySelectorAll("#yesterdayTable th[data-yesterday-sort]").forEach((header) => { - header.addEventListener("click", () => changeYesterdaySort(header.dataset.yesterdaySort)); - }); - document.querySelectorAll("[data-ladder-sort]").forEach((button) => { - button.addEventListener("click", () => { - state.ladderSortMode = button.dataset.ladderSort === "open" ? "open" : "time"; - document.querySelectorAll("[data-ladder-sort]").forEach((item) => { - const active = item === button; - item.classList.toggle("active", active); - item.setAttribute("aria-pressed", String(active)); - }); - renderLadderBoard(state.dashboard?.ladders || []); - }); - }); - - document.querySelector("#exportButton").addEventListener("click", exportStocks); - document.querySelector("#brokenExportButton").addEventListener("click", exportBroken); - document.querySelector("#downExportButton").addEventListener("click", exportDown); - document.querySelector("#yesterdayExportButton").addEventListener("click", exportYesterday); - document.querySelector("#ladderExportButton").addEventListener("click", exportLadder); - document.querySelector("#rotationExportButton").addEventListener("click", exportRotation); - document.querySelectorAll("[data-rotation-order]").forEach((button) => { - button.addEventListener("click", () => { - state.rotationOrder = button.dataset.rotationOrder === "latest" ? "latest" : "oldest"; - localStorage.setItem("xiaobaiRotationOrder", state.rotationOrder); - renderRotationHistory(); - }); - }); - document.querySelector("#sentimentExportButton").addEventListener("click", exportSentimentHistory); - document.querySelectorAll("[data-sentiment-range]").forEach((button) => { - button.addEventListener("click", () => { - state.sentimentRange = number(button.dataset.sentimentRange) || 20; - document.querySelectorAll("[data-sentiment-range]").forEach((item) => { - item.classList.toggle("active", item === button); - }); - loadSentimentHistory(true); - }); - }); - document.querySelector("#settingsButton").addEventListener("click", () => openAdminSettings()); - document.querySelector("#accountButton").addEventListener("click", (event) => { - event.stopPropagation(); - toggleAccountDropdown(); - }); - document.querySelector("#accountVipBadge").addEventListener("click", () => openSettings("membership")); - document.querySelectorAll("[data-account-panel]").forEach((button) => { - button.addEventListener("click", () => openSettings(button.dataset.accountPanel)); - }); - document.querySelector("#switchAccountMenuButton").addEventListener("click", switchAccount); - document.querySelector("#logoutMenuButton").addEventListener("click", logoutAccount); - document.querySelector("#closeSettingsDialog").addEventListener("click", () => elements.settingsDialog.close()); - document.querySelector("#closeAdminDialog").addEventListener("click", () => elements.adminDialog.close()); - document.querySelector("#closeStockDialog").addEventListener("click", () => elements.stockDialog.close()); - document.querySelectorAll("[data-stock-detail-chart]").forEach((button) => { - button.addEventListener("click", () => selectStockDetailChart(button.dataset.stockDetailChart)); - }); - document.querySelector("#closeStockPreview").addEventListener("click", closeStockPreview); - elements.stockPreviewBackdrop.addEventListener("click", closeStockPreview); - document.querySelector("#openStockDetailFromPreview").addEventListener("click", openStockDetailFromPreview); - document.querySelectorAll("[data-preview-chart]").forEach((button) => { - button.addEventListener("click", () => selectStockPreviewChart(button.dataset.previewChart)); - }); - elements.stockPreview.addEventListener("pointerenter", cancelStockPreviewClose); - elements.stockPreview.addEventListener("pointerleave", scheduleStockPreviewClose); - document.addEventListener("pointerover", handleStockPreviewPointerOver); - document.addEventListener("pointerout", handleStockPreviewPointerOut); - document.addEventListener("focusin", handleStockPreviewFocus); - document.addEventListener("focusout", handleStockPreviewFocusOut); - document.addEventListener("click", handleMobileStockPreviewClick, true); - document.addEventListener("keydown", handleStockPreviewKeydown); - document.addEventListener("scroll", repositionStockPreview, true); - document.querySelector("#auctionRefreshButton").addEventListener("click", () => loadAuctionCenter(true)); - document.querySelector("#auctionExportButton").addEventListener("click", exportAuctionRows); - document.querySelector("#auctionSearch").addEventListener("input", (event) => { - state.auctionQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderAuctionTable(); - }); - document.querySelectorAll("[data-auction-dataset]").forEach((button) => { - button.addEventListener("click", () => { - state.auctionDataset = button.dataset.auctionDataset || "focus"; - state.auctionFilter = "all"; - state.auctionSortKey = state.auctionDataset === "onePrice" ? "amount_million" : "attention_score"; - state.auctionSortDirection = "desc"; - document.querySelectorAll("[data-auction-dataset]").forEach((item) => { - const active = item === button; - item.classList.toggle("active", active); - item.setAttribute("aria-selected", String(active)); - }); - document.querySelectorAll("[data-auction-filter]").forEach((item) => item.classList.toggle("active", item.dataset.auctionFilter === "all")); - renderAuctionTable(); - }); - }); - document.querySelectorAll("[data-auction-filter]").forEach((button) => { - button.addEventListener("click", () => { - state.auctionFilter = button.dataset.auctionFilter || "all"; - document.querySelectorAll("[data-auction-filter]").forEach((item) => item.classList.toggle("active", item === button)); - renderAuctionTable(); - }); - }); - document.querySelector("#auctionTable").addEventListener("click", (event) => { - const header = event.target.closest("th[data-auction-sort]"); - if (!header) return; - const key = header.dataset.auctionSort; - if (state.auctionSortKey === key) state.auctionSortDirection = state.auctionSortDirection === "asc" ? "desc" : "asc"; - else { - state.auctionSortKey = key; - state.auctionSortDirection = "desc"; - } - renderAuctionTable(); - }); - document.querySelector("#openStrategyDrawerButton").addEventListener("click", openCustomStrategyDrawer); - document.querySelector("#closeStrategyDrawerButton").addEventListener("click", () => document.querySelector("#strategyDrawer").close()); - document.querySelector("#strategyDrawer").addEventListener("click", (event) => { - if (event.target === event.currentTarget) event.currentTarget.close(); - }); - document.querySelector("#themeRefreshButton").addEventListener("click", () => loadThemeLibrary(true)); - document.querySelector("#themeSearch").addEventListener("input", (event) => { - state.themeQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderThemeDirectory(); - }); - document.querySelector("#themeDirectory").addEventListener("click", (event) => { - const button = event.target.closest("[data-theme-code]"); - if (button) selectTheme(button.dataset.themeCode); - }); - document.querySelector("#popularityRefreshButton").addEventListener("click", () => loadPopularity(true)); - document.querySelector("#popularitySearch").addEventListener("input", (event) => { - state.popularityQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderPopularityTable(); - }); - document.querySelectorAll("[data-popularity-source]").forEach((button) => { - button.addEventListener("click", () => { - state.popularitySource = button.dataset.popularitySource || "combined"; - document.querySelectorAll("[data-popularity-source]").forEach((item) => { - const active = item === button; - item.classList.toggle("active", active); - item.setAttribute("aria-selected", String(active)); - }); - renderPopularityTable(); - }); - }); - document.querySelector("#dragonRefreshButton").addEventListener("click", () => { - if (state.dragonViewMode === "profiles") loadHotMoneyProfiles(true); - else loadDragonTiger(true); - }); - document.querySelector("#dragonEmptyRefreshButton").addEventListener("click", () => loadDragonTiger(true)); - document.querySelector("#dragonPreviousButton").addEventListener("click", () => shiftDate(-1)); - document.querySelector("#dragonExportButton").addEventListener("click", () => { - if (state.dragonViewMode === "profiles") exportHotMoneyProfiles(); - else exportDragonTiger(); - }); - document.querySelectorAll("[data-dragon-view-mode]").forEach((button) => { - button.addEventListener("click", () => selectDragonViewMode(button.dataset.dragonViewMode)); - }); - document.querySelector("#dragonSearch").addEventListener("input", (event) => { - state.dragonQuery = event.target.value.trim().toLowerCase(); - renderDragonTraderList(); - }); - document.querySelectorAll("[data-dragon-filter]").forEach((button) => { - button.addEventListener("click", () => { - state.dragonFilter = button.dataset.dragonFilter; - document.querySelectorAll("[data-dragon-filter]").forEach((item) => { - item.classList.toggle("active", item === button); - }); - renderDragonTraderList(); - }); - }); - document.querySelector("#hotMoneyProfileSearch").addEventListener("input", (event) => { - state.hotMoneyProfileQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderHotMoneyProfiles(); - }); - document.querySelector("#hotMoneyProfileList").addEventListener("click", (event) => { - const button = event.target.closest("[data-hot-money-profile]"); - if (!button) return; - state.selectedHotMoneyProfileId = button.dataset.hotMoneyProfile; - renderHotMoneyProfiles(); - }); - document.querySelector("#journalForm").addEventListener("submit", saveJournal); - document.querySelector("#journalDate").addEventListener("change", populateJournalForm); - document.querySelector("#openWatchlistDialog").addEventListener("click", () => openWatchlistDialog()); - document.querySelector("#closeWatchlistDialog").addEventListener("click", closeWatchlistDialog); - document.querySelector("#cancelWatchlistEdit").addEventListener("click", closeWatchlistDialog); - document.querySelector("#changeWatchlistSelection").addEventListener("click", clearWatchlistSelection); - document.querySelector("#watchlistSearchInput").addEventListener("input", scheduleWatchlistSearch); - document.querySelector("#watchlistForm").addEventListener("submit", saveWatchlistFromDialog); - document.querySelector("#watchlistSearchResults").addEventListener("click", handleWatchlistSearchResult); - document.querySelector("#reviewHistoryToggle").addEventListener("click", (event) => { - const panel = document.querySelector("#reviewHistoryPanel"); - const expanded = event.currentTarget.getAttribute("aria-expanded") === "true"; - event.currentTarget.setAttribute("aria-expanded", String(!expanded)); - event.currentTarget.querySelector("span").textContent = expanded ? "历史复盘" : "收起历史"; - panel.hidden = expanded; - if (!expanded) panel.scrollIntoView({ behavior: "smooth", block: "nearest" }); - }); - document.querySelector("#openTradeLogDialog").addEventListener("click", openTradeLogDialog); - document.querySelector("#closeTradeLogDialog").addEventListener("click", closeTradeLogDialog); - document.querySelector("#tradeLogForm").addEventListener("submit", saveTradeLog); - document.querySelector("#cancelTradeEdit").addEventListener("click", closeTradeLogDialog); - elements.tradeLogDialog.addEventListener("close", resetTradeLogForm); - document.querySelector("#tradeLogTableBody").addEventListener("click", handleTradeLogAction); - document.querySelector("#stockNoteForm").addEventListener("submit", saveStockNote); - document.querySelector("#watchStockButton").addEventListener("click", toggleActiveWatchlist); - document.querySelector("#stockHeavenButton").addEventListener("click", openActiveStockInHeaven); - document.querySelector("#stockReminderButton").addEventListener("click", openStockReminder); - document.querySelector("#reasonForm").addEventListener("submit", saveReasonOverride); - document.querySelector("#backfillButton").addEventListener("click", backfillData); - document.querySelector("#openScreenerTrackingButton").addEventListener("click", async () => { - await loadScreenerTracking(true); - openView("screenerTrackingView"); - }); - document.querySelector("#closeScreenerTrackingButton").addEventListener("click", () => openView("screenerView")); - document.querySelector("#refreshTrackingButton").addEventListener("click", refreshScreenerTracking); - document.querySelector("#trackingTableBody").addEventListener("click", handleTrackingTableAction); - document.querySelectorAll("[data-screener-mobile-view]").forEach((button) => { - button.addEventListener("click", () => selectScreenerMobileView(button.dataset.screenerMobileView)); - }); - document.querySelector("#compileStrategyButton").addEventListener("click", compileStrategy); - document.querySelector("#saveStrategyButton").addEventListener("click", saveCurrentStrategy); - document.querySelector("#deleteStrategyButton").addEventListener("click", deleteCurrentStrategy); - document.querySelector("#screenerExportButton").addEventListener("click", exportScreenerResults); - document.querySelector("#runBacktestToggle").addEventListener("change", updateBacktestTaskStatus); - document.querySelectorAll("[data-screener-mode]").forEach((button) => { - button.addEventListener("click", () => selectScreenerMode(button.dataset.screenerMode)); - }); - document.querySelector("#curatedStrategyList").addEventListener("click", (event) => { - if (event.target.closest("button")) return; - const card = event.target.closest("[data-curated-strategy]"); - if (!card) return; - state.selectedCuratedStrategyId = number(card.dataset.curatedStrategy); - renderCuratedStrategyLibrary(); - renderScreenerResult(); - }); - document.querySelector("#curatedStrategySearch").addEventListener("input", (event) => { - state.curatedQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderCuratedStrategyLibrary(); - }); - document.querySelector("#curatedCategoryFilter").addEventListener("change", (event) => { - state.curatedCategory = event.target.value; - renderCuratedStrategyLibrary(); - }); - document.querySelector("#curatedSchoolFilters").addEventListener("click", (event) => { - const button = event.target.closest("[data-curated-school]"); - if (!button) return; - state.curatedSchool = button.dataset.curatedSchool; - renderCuratedStrategyLibrary(); - }); - document.querySelectorAll("[data-curated-view]").forEach((button) => { - button.addEventListener("click", () => { - state.curatedViewMode = button.dataset.curatedView === "grid" ? "grid" : "list"; - localStorage.setItem("xiaobaiCuratedViewMode", state.curatedViewMode); - renderCuratedStrategyLibrary(); - }); - }); - document.querySelector("#quantResetButton").addEventListener("click", resetQuantBuilder); - document.querySelector("#addQuantFilterButton").addEventListener("click", () => addQuantFilter()); - document.querySelector("#addQuantScoreButton").addEventListener("click", () => addQuantScore()); - document.querySelector("#quantFilterRows").addEventListener("input", handleQuantBuilderInput); - document.querySelector("#quantFilterRows").addEventListener("change", handleQuantBuilderInput); - document.querySelector("#quantFilterRows").addEventListener("click", handleQuantBuilderClick); - document.querySelector("#quantScoreRows").addEventListener("input", handleQuantBuilderInput); - document.querySelector("#quantScoreRows").addEventListener("change", handleQuantBuilderInput); - document.querySelector("#quantScoreRows").addEventListener("click", handleQuantBuilderClick); - ["quantListedDays", "quantLimit", "quantMinScore", "quantExcludeSt"].forEach((id) => { - document.querySelector(`#${id}`).addEventListener("input", renderQuantSummary); - document.querySelector(`#${id}`).addEventListener("change", renderQuantSummary); - }); - document.querySelector("#quantRunButton").addEventListener("click", runQuantStrategy); - document.querySelector("#quantSaveButton").addEventListener("click", saveQuantAsStrategy); - document.querySelector("#quantBacktestToggle").addEventListener("change", updateBacktestTaskStatus); - document.querySelector("#mentorChatForm").addEventListener("submit", sendMentorQuestion); - document.querySelector("#clearMentorChatButton").addEventListener("click", clearMentorConversation); - document.querySelector("#mentorDirectoryToggle").addEventListener("click", () => { - toggleMentorDirectory(!state.mentorDirectoryOpen); - }); - document.querySelector("#closeMentorDirectory").addEventListener("click", () => toggleMentorDirectory(false)); - document.querySelector("#mentorDirectoryBackdrop").addEventListener("click", () => toggleMentorDirectory(false)); - document.querySelector("#mentorSortToggle").addEventListener("click", toggleMentorSortMode); - document.querySelector("#mentorSearchInput").addEventListener("input", (event) => { - state.mentorQuery = event.target.value.trim().toLocaleLowerCase("zh-CN"); - renderMentorDirectory(); - }); - document.querySelectorAll("[data-mentor-grade]").forEach((button) => { - button.addEventListener("click", () => { - state.mentorGrade = button.dataset.mentorGrade || "all"; - document.querySelectorAll("[data-mentor-grade]").forEach((item) => { - item.classList.toggle("active", item === button); - }); - renderMentorDirectory(); - }); - }); - document.querySelectorAll("[data-mentor-prompt]").forEach((button) => { - button.addEventListener("click", () => useMentorQuickPrompt(button.dataset.mentorPrompt)); - }); - document.querySelectorAll("[data-heaven-panel]").forEach((button) => { - button.addEventListener("click", () => selectHeavenPanel(button.dataset.heavenPanel, true)); - }); - document.querySelector("#loadHeavenSelectionButton").addEventListener("click", loadHeavenSelection); - document.querySelector("#heavenCalibrationForm").addEventListener("submit", applyHeavenCalibration); - document.querySelector("#resetHeavenCalibrationButton").addEventListener("click", resetHeavenCalibration); - document.querySelector("#heavenStockInput").addEventListener("keydown", (event) => { - if (event.key === "Enter") { - event.preventDefault(); - loadHeavenSelection(); - } - }); - document.querySelector("#interpretTrendButton").addEventListener("click", () => interpretHeaven("trend")); - document.querySelector("#interpretFortuneButton").addEventListener("click", () => interpretHeaven("fortune")); - document.querySelector("#historyTrendButton").addEventListener("click", () => openHeavenHistory("trend")); - document.querySelector("#historyFortuneButton").addEventListener("click", () => openHeavenHistory("fortune")); - document.querySelector("#qiObservationDate").addEventListener("change", () => { - state.personalField = null; - state.heavenManualData = null; - state.heavenInterpretations.fortune = ""; - loadHeavenSetup( - true, - "", - document.querySelector("#heavenStockInput").value.trim(), - ); - }); - document.querySelector("#openPersonalSettingsButton").addEventListener("click", () => openSettings("profile")); - document.querySelector("#accountBirthForm").addEventListener("submit", saveAccountBirthProfile); - document.querySelector("#deleteBirthProfileButton").addEventListener("click", deleteAccountBirthProfile); - document.querySelector("#passwordForm").addEventListener("submit", changeAccountPassword); - document.querySelector("#sectorPhaseForm").addEventListener("submit", saveSectorPhaseOverride); - document.querySelector("#startBreathingButton").addEventListener("click", startHeartBreathing); - document.querySelector("#beginCastingButton").addEventListener("click", beginHeartCasting); - document.querySelector("#heartSoundToggle").addEventListener("click", toggleHeartSound); - document.querySelector("#historyHeartButton").addEventListener("click", () => openHeavenHistory("heart")); - initializeHeartCoinHold(); - initializeHeartLineInspection(); - document.querySelector("#interpretHeartButton").addEventListener("click", () => interpretHeaven("heart")); - document.querySelector("#viewHeartReadingButton").addEventListener("click", () => openHeavenReading("heart")); - document.querySelector("#restartHeartButton").addEventListener("click", resetHeartRitual); - document.querySelector("#closeHeavenReadingDialog").addEventListener("click", () => elements.heavenReadingDialog.close()); - elements.heavenReadingDialog.addEventListener("close", stopHeavenReadingAnimation); - document.querySelectorAll("[data-heaven-reading-tab]").forEach((button) => { - button.addEventListener("click", () => selectHeavenReadingTab(button.dataset.heavenReadingTab)); - }); - document.querySelector("#heavenReadingHistoryList").addEventListener("click", handleHeavenHistorySelection); - document.querySelector("#heavenReadingHistoryDetail").addEventListener("click", handleHeavenHistoryAction); - document.querySelectorAll("[data-heart-return]").forEach((button) => { - button.addEventListener("click", resetHeartRitual); - }); - document.querySelector("#adminSectionSelect").addEventListener("change", (event) => selectAdminPanel(event.target.value)); - document.querySelector("#systemMarketForm").addEventListener("submit", saveMarketSettings); - document.querySelector("#systemModelsForm").addEventListener("submit", saveModelPool); - document.querySelector("#membershipSettingsForm").addEventListener("submit", saveMembershipSettings); - document.querySelector("#addPlatformModel").addEventListener("click", addPlatformModel); - document.querySelector("#adminRefreshButton").addEventListener("click", startAdminRefresh); - window.addEventListener("resize", redrawThemeSensitiveVisuals); - initializeAutoTableSorting(); -} - -async function loadDashboard(force = false, background = false, showOverlay = true) { - const requestedDate = elements.tradeDate.value; - if (state.dashboardLoading && state.dashboardRequestDate === requestedDate) return; - state.dashboardLoading = true; - state.dashboardRequestDate = requestedDate; - const requestSequence = ++state.dashboardRequestSequence; - if (force) stockPreviewCache.clear(); - if (!background && showOverlay) { - setLoading(true, "正在加载市场数据"); - setStatus("正在加载市场数据"); - } else if (!background) { - setStatus("正在刷新行情"); - } - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - if (force) query.set("force", "1"); - const payload = await apiRequest(`/api/dashboard?${query}`); - if ( - requestSequence !== state.dashboardRequestSequence - || requestedDate !== elements.tradeDate.value - ) return; - applyDashboard(payload, background); - } catch (error) { - if (background) { - setStatus("实时刷新暂时中断,正在等待重试"); - } else { - showToast(error.message || "无法连接本地服务"); - setStatus("加载失败"); - } - } finally { - if (requestSequence === state.dashboardRequestSequence) { - state.dashboardLoading = false; - state.dashboardRequestDate = ""; - if (!background && showOverlay) setLoading(false); - updateDateButtons(); - } - } -} - -async function startAdminRefresh() { - const buttons = [document.querySelector("#syncButton"), document.querySelector("#adminRefreshButton")].filter(Boolean); - buttons.forEach((button) => { button.disabled = true; }); - try { - const payload = await apiRequest("/api/admin/refresh", "POST", { trade_date: elements.tradeDate.value }); - showToast(payload.message || "后台刷新已提交"); - setStatus("后台刷新运行中,当前页面保持不变"); - } catch (error) { - showToast(error.message || "后台刷新启动失败"); - } finally { - buttons.forEach((button) => { button.disabled = false; }); - } -} - -function applyDashboard(payload, background = false) { - state.dashboard = payload; - const selectedDate = payload.meta.requested_date || payload.meta.trade_date; - elements.tradeDate.value = selectedDate; - document.querySelector("#qiObservationDate").value = selectedDate; - document.querySelector("#journalDate").value = selectedDate; - renderDashboard(); - setStatus(`${dashboardSourceLabel(payload.meta)} · 数据已更新`); - if (!background) { - if (state.activeView === "dragonView") loadDragonTiger(); - if (state.activeView === "screenerView") loadScreenerSetup(); - if (state.activeView === "screenerTrackingView") loadScreenerTracking(true); - if (state.activeView === "mentorView") loadMentorSetup(true); - if (state.activeView === "heavenView") loadHeavenSetup(true); - if (state.activeView === "sentimentCycleView") loadSentimentHistory(true); - if (state.activeView === "rotationView") loadRotationHistory(true); - if (state.activeView === "auctionView") loadAuctionCenter(true); - if (state.activeView === "themeLibraryView") loadThemeLibrary(true); - if (state.activeView === "popularityView") loadPopularity(true); - } - const requestedStock = new URLSearchParams(window.location.search).get("stock"); - if (!state.initialStockOpened && /^\d{6}$/.test(requestedStock || "")) { - state.initialStockOpened = true; - openStock(requestedStock); - } -} - -function dashboardSourceLabel(meta = {}) { - if (meta.realtime && !["closed", "after_hours"].includes(String(meta.market_status || ""))) return "盘中行情"; - if (meta.carried_forward) return "最近收盘行情"; - if (meta.market_status === "historical") return "历史行情"; - return "收盘行情"; -} - -function renderDashboard() { - const { meta, overview, ladders, sectors } = state.dashboard; - animateMetric("tapeUp", overview.up_count, (value) => Math.round(value)); - animateMetric("tapeDown", overview.down_count, (value) => Math.round(value)); - setText("tapeLimit", `${overview.limit_up_count} / 跌停 ${overview.limit_down_count}`); - animateMetric("tapeAmount", overview.amount_billion, (value) => `${formatNumber(value, 1)} 亿`); - animateMetric("limitUpMetric", overview.limit_up_count, (value) => `${Math.round(value)} 家`); - animateMetric("limitDownMetric", overview.limit_down_count, (value) => `${Math.round(value)} 家`); - animateMetric("brokenMetric", overview.broken_count, (value) => `${Math.round(value)} 家`); - animateMetric("sealRateMetric", overview.seal_rate, (value) => `${formatNumber(value, 1)}%`); - animateMetric("amountMetric", overview.amount_billion, (value) => `${formatNumber(value, 1)} 亿`); - setText("dataDateMetric", dashboardDataTimestamp(meta)); - animateMetric("sentimentScore", overview.sentiment_score, (value) => Math.round(value)); - setText("sentimentText", sentimentLabel(overview.sentiment_score)); - updateSentimentGauge(overview.sentiment_score); - setText("updatedAt", `${dashboardSourceLabel(meta)} · 更新 ${formatTimestamp(meta.updated_at)}`); - - renderLimitTable(); - renderLadderMini(ladders || []); - renderSectorMini(sectors || []); - renderBrokenTable(state.dashboard.broken || []); - renderDownTable(state.dashboard.down_limits || []); - renderYesterdayTable(state.dashboard.yesterday_limits || []); - renderPerformance(state.dashboard.limit_performance || []); - renderLadderBoard(ladders || []); - renderRotationMembers(); -} - -async function loadSentimentHistory(force = false) { - if (!state.dashboard || state.sentimentLoading) return; - const key = `${elements.tradeDate.value}:${state.sentimentRange}`; - if (!force && state.sentimentHistoryKey === key && state.sentimentHistory) { - renderSentimentHistory(); - return; - } - state.sentimentLoading = true; - const notice = document.querySelector("#sentimentHistoryNotice"); - notice.hidden = true; - try { - const query = new URLSearchParams({ - trade_date: elements.tradeDate.value, - limit: String(state.sentimentRange), - }); - state.sentimentHistory = await apiRequest(`/api/sentiment/history?${query}`); - state.sentimentHistoryKey = key; - renderSentimentHistory(); - } catch (error) { - notice.textContent = error.message || "情绪周期数据加载失败"; - notice.hidden = false; - showToast(notice.textContent); - } finally { - state.sentimentLoading = false; - } -} - -function renderSentimentHistory() { - const payload = state.sentimentHistory; - if (!payload) return; - const rows = payload.rows || []; - const latest = rows[rows.length - 1]; - const body = document.querySelector("#sentimentHistoryBody"); - const empty = document.querySelector("#sentimentHistoryEmpty"); - empty.hidden = rows.length > 0; - body.innerHTML = [...rows].reverse().map((row) => { - return ` - - ${escapeHtml(displayCompactDate(row.trade_date))} - ${number(row.score)} - ${escapeHtml(row.phase)} - ${escapeHtml(row.direction)} - ${number(row.limit_up_count)} - ${number(row.first_board_count)} - ${number(row.second_board_count)} - ${number(row.three_plus_count)} - ${number(row.max_height)}板 - ${number(row.broken_count)} - ${number(row.limit_down_count)} - ${number(row.previous_limit_count)} - ${number(row.previous_positive_count)} - ${formatNumber(row.previous_positive_rate, 1)}% - - `; - }).join(""); - - if (!latest) { - setText("sentimentHistoryDateRange", "暂无历史数据"); - return; - } - setText( - "sentimentHistoryDateRange", - `${displayCompactDate(rows[0].trade_date)} 至 ${displayCompactDate(latest.trade_date)}`, - ); - setText("sentimentCycleScore", number(latest.score)); - setText("sentimentCycleLabel", latest.label); - setText("sentimentCycleDate", displayCompactDate(latest.trade_date)); - setText("sentimentCyclePhase", latest.phase); - setText("sentimentCycleDirection", latest.direction); - const dayChange = number(latest.day_change); - const confidence = sentimentPhaseConfidence(latest); - setText("sentimentPhaseConfidence", `置信度 ${confidence}%`); - setText("sentimentDayChange", `${dayChange > 0 ? "+" : ""}${formatNumber(dayChange, 1)}`); - setText("sentimentSealRate", `${formatNumber(latest.seal_rate, 1)}%`); - setText("sentimentLimitUp", number(latest.limit_up_count)); - setText("sentimentBroken", number(latest.broken_count)); - setText("sentimentPhaseAdvice", sentimentPhaseAdvice(latest.phase)); - setText("sentimentCurrentTag", `当前 ${number(latest.score)} · ${latest.phase}`); - setText("sentimentComponentSummary", `五维加权 → 温度 ${number(latest.score)}`); - setText("sentimentPeriodNote", `近 ${state.sentimentRange} 个交易日,当前展示 ${rows.length} 日`); - const changeElement = document.querySelector("#sentimentDayChange"); - changeElement.className = changeClass(dayChange); - setText("sentimentPreviousPositive", `${number(latest.previous_positive_count)} / ${number(latest.previous_limit_count)} 只`); - setText("sentimentPreviousAverage", `红盘率 ${formatNumber(latest.previous_positive_rate, 1)}% · 平均 ${signed(latest.average_previous_change)}%`); - setText("sentimentHistoryDays", `${number(payload.available_days)} 个交易日`); - setText("sentimentNormalization", `${latest.normalization} · 当前展示 ${rows.length} 日`); - const marker = document.querySelector("#sentimentCycleScoreMarker"); - marker.className = `sentiment-current-phase-badge ${sentimentPhaseClass(latest.phase)}`; - document.querySelector("#sentimentComponentList").innerHTML = Object.values(latest.components || {}).map((item) => ` -
    -
    - ${escapeHtml(item.label)} - - ${formatNumber(item.score, 1)} × ${number(item.weight)}% -
    - ${escapeHtml(item.summary)} -
    - `).join(""); - requestAnimationFrame(() => { - animateSentimentComponents(); - animateSentimentTrendChart(rows); - bindSentimentChartTooltip(rows); - }); - animateRows(body); -} - -function animateSentimentComponents() { - document.querySelectorAll("#sentimentComponentList [data-component-score]").forEach((bar, index) => { - const width = `${number(bar.dataset.componentScore)}%`; - if (!motionEnabled()) { - bar.style.width = width; - return; - } - setTimeout(() => { bar.style.width = width; }, index * 70); - }); -} - -function animateSentimentTrendChart(rows) { - if (sentimentChartAnimationFrame) cancelAnimationFrame(sentimentChartAnimationFrame); - if (!motionEnabled()) { - drawSentimentTrendChart(rows, 1); - return; - } - const startedAt = performance.now(); - const duration = 780; - const frame = (now) => { - const rawProgress = Math.min(1, (now - startedAt) / duration); - const progress = 1 - (1 - rawProgress) ** 3; - drawSentimentTrendChart(rows, progress); - if (rawProgress < 1) sentimentChartAnimationFrame = requestAnimationFrame(frame); - else sentimentChartAnimationFrame = null; - }; - sentimentChartAnimationFrame = requestAnimationFrame(frame); -} - -function drawSentimentTrendChart(rows, progress = 1) { - const canvas = document.querySelector("#sentimentTrendChart"); - if (!canvas || !rows.length || state.activeView !== "sentimentCycleView") return; - const rect = canvas.getBoundingClientRect(); - if (!rect.width) return; - const width = Math.max(320, rect.width); - const height = Math.max(220, rect.height); - const ratio = window.devicePixelRatio || 1; - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - context.clearRect(0, 0, width, height); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - const padding = { top: 18, right: 18, bottom: 34, left: 42 }; - const chartWidth = width - padding.left - padding.right; - const chartHeight = height - padding.top - padding.bottom; - const x = (index) => padding.left + (rows.length === 1 ? chartWidth / 2 : index / (rows.length - 1) * chartWidth); - const y = (score) => padding.top + (100 - clamp(score, 0, 100)) / 100 * chartHeight; - - context.font = '10px "Microsoft YaHei UI", sans-serif'; - context.textAlign = "right"; - context.textBaseline = "middle"; - for (let score = 0; score <= 100; score += 20) { - const lineY = y(score); - context.strokeStyle = score === 40 || score === 80 ? palette.zero : palette.grid; - context.lineWidth = 1; - context.beginPath(); - context.moveTo(padding.left, lineY); - context.lineTo(width - padding.right, lineY); - context.stroke(); - context.fillStyle = palette.axis; - context.fillText(String(score), padding.left - 8, lineY); - } - - context.save(); - context.beginPath(); - context.rect(padding.left - 6, padding.top - 8, (chartWidth + 12) * clamp(progress, 0, 1), chartHeight + 18); - context.clip(); - - const finalPhase = rows[rows.length - 1]?.phase; - let phaseStart = rows.length - 1; - while (phaseStart > 0 && rows[phaseStart - 1]?.phase === finalPhase) phaseStart -= 1; - if (["退潮", "冰点"].includes(finalPhase)) { - const startX = phaseStart === 0 ? padding.left : (x(phaseStart - 1) + x(phaseStart)) / 2; - context.fillStyle = palette.alertArea; - context.fillRect(startX, padding.top, width - padding.right - startX, chartHeight); - context.fillStyle = palette.up; - context.font = '10px "Microsoft YaHei UI", sans-serif'; - context.textAlign = "center"; - context.textBaseline = "top"; - context.fillText(finalPhase, (startX + width - padding.right) / 2, padding.top + 4); - } - - const movingAverage = rows.map((_row, index) => { - const start = Math.max(0, index - 4); - const sample = rows.slice(start, index + 1); - return sample.reduce((sum, item) => sum + number(item.score), 0) / sample.length; - }); - context.beginPath(); - movingAverage.forEach((score, index) => { - if (index === 0) context.moveTo(x(index), y(score)); - else context.lineTo(x(index), y(score)); - }); - context.strokeStyle = palette.movingAverage; - context.lineWidth = 1.5; - context.setLineDash([5, 4]); - context.stroke(); - context.setLineDash([]); - - context.beginPath(); - rows.forEach((row, index) => { - const pointX = x(index); - const pointY = y(row.score); - if (index === 0) context.moveTo(pointX, pointY); - else context.lineTo(pointX, pointY); - }); - context.lineTo(x(rows.length - 1), padding.top + chartHeight); - context.lineTo(x(0), padding.top + chartHeight); - context.closePath(); - context.fillStyle = palette.area; - context.fill(); - - context.beginPath(); - rows.forEach((row, index) => { - const pointX = x(index); - const pointY = y(row.score); - if (index === 0) context.moveTo(pointX, pointY); - else context.lineTo(pointX, pointY); - }); - context.strokeStyle = palette.line; - context.lineWidth = 2.5; - context.lineJoin = "round"; - context.lineCap = "round"; - context.stroke(); - - rows.forEach((row, index) => { - context.beginPath(); - context.arc(x(index), y(row.score), index === rows.length - 1 ? 4.5 : 3, 0, Math.PI * 2); - context.fillStyle = ["退潮", "冰点"].includes(row.phase) ? palette.up : row.phase === "修复" ? palette.repair : palette.line; - context.fill(); - context.strokeStyle = palette.background; - context.lineWidth = 1.5; - context.stroke(); - }); - context.restore(); - - const labelStep = Math.max(1, Math.ceil(rows.length / 6)); - context.textAlign = "center"; - context.textBaseline = "top"; - context.fillStyle = palette.axis; - rows.forEach((row, index) => { - if (index % labelStep !== 0 && index !== rows.length - 1) return; - const dateText = displayCompactDate(row.trade_date).slice(5); - context.fillText(dateText, x(index), height - padding.bottom + 10); - }); -} - -function bindSentimentChartTooltip(rows) { - const canvas = document.querySelector("#sentimentTrendChart"); - const tooltip = document.querySelector("#sentimentChartTooltip"); - if (!canvas || !tooltip || !rows.length) return; - canvas.onmousemove = (event) => { - const rect = canvas.getBoundingClientRect(); - const padding = { left: 42, right: 18 }; - const chartWidth = Math.max(1, rect.width - padding.left - padding.right); - const relativeX = clamp(event.clientX - rect.left - padding.left, 0, chartWidth); - const index = rows.length === 1 ? 0 : Math.round(relativeX / chartWidth * (rows.length - 1)); - const row = rows[index]; - tooltip.innerHTML = `${escapeHtml(displayCompactDate(row.trade_date))} · 温度 ${number(row.score)} · ${escapeHtml(row.phase)}`; - tooltip.hidden = false; - const targetLeft = padding.left + (rows.length === 1 ? chartWidth / 2 : index / (rows.length - 1) * chartWidth); - tooltip.style.left = `${clamp(targetLeft + 10, 8, rect.width - tooltip.offsetWidth - 8)}px`; - tooltip.style.top = `${clamp(event.clientY - rect.top - 34, 8, rect.height - 34)}px`; - }; - canvas.onmouseleave = () => { tooltip.hidden = true; }; -} - -function sentimentScoreClass(score) { - const value = number(score); - return value >= 60 ? "score-strong" : value < 40 ? "score-weak" : "score-neutral"; -} - -function sentimentPhaseClass(phase) { - return { - "冰点": "phase-ice", - "修复": "phase-repair", - "发酵": "phase-fermentation", - "高潮": "phase-climax", - "分化": "phase-divergence", - "退潮": "phase-retreat", - }[phase] || "phase-divergence"; -} - -function sentimentPhaseConfidence(row) { - const explicit = number(row?.confidence || row?.phase_confidence); - if (explicit > 0) return Math.round(clamp(explicit, 0, 100)); - const historyEvidence = Math.min(12, number(row?.history_days) * 0.6); - const movementEvidence = Math.min(18, Math.abs(number(row?.day_change)) * 0.8); - return Math.round(clamp(62 + historyEvidence + movementEvidence, 60, 92)); -} - -function sentimentPhaseAdvice(phase) { - return { - "冰点": "情绪处于极弱区,先观察风险释放,允许没有候选结果。", - "修复": "风险开始收敛,关注率先转强的核心,小仓验证修复强度。", - "发酵": "主线与梯队正在形成,优先跟随核心,避免偏离主线。", - "高潮": "情绪与一致性已处高位,聚焦核心并主动降低后排暴露。", - "分化": "强弱开始分层,关注承接与回流,淘汰失去辨识度的方向。", - "退潮": "情绪指标继续走弱。", - }[phase] || "市场结构尚未形成清晰阶段,保持观察并等待确认。"; -} - -function getVisibleStocks() { - if (!state.dashboard) return []; - let rows = [...(state.dashboard.limits || [])]; - if (state.filter === "1") rows = rows.filter((row) => number(row.streak) === 1); - if (state.filter === "2") rows = rows.filter((row) => number(row.streak) === 2); - if (state.filter === "3") rows = rows.filter((row) => number(row.streak) >= 3); - if (state.query) { - rows = rows.filter((row) => { - const haystack = `${row.code} ${row.name} ${row.sector} ${row.reason}`.toLowerCase(); - return haystack.includes(state.query); - }); - } - return rows.sort((left, right) => compareRows(left, right)); -} - -function renderLimitTable() { - if (!state.dashboard) return; - const rows = getVisibleStocks(); - const allRows = state.dashboard.limits || []; - const body = document.querySelector("#limitTableBody"); - body.innerHTML = rows.map((row, index) => ` - - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${streakLabel(row.streak)} - ${signed(row.change)} - ${formatNumber(row.price, 2)} - ${escapeHtml(row.sector || "其他")} - ${escapeHtml(row.first_time || "")} - ${escapeHtml(row.last_time || "")} - ${limitOpenState(row)} - ${formatNumber(row.turnover_rate, 2)} - ${formatNumber(row.amount_billion, 2)} - ${formatLimitSealAmount(row.seal_amount_million)} - ${escapeHtml(row.reason || "")} - - `).join(""); - bindStockRows(body); - setText("resultCount", `${rows.length} 只`); - setText("limitPoolSubtitle", `${allRows.length} 只 · 数据日期 ${displayCompactDate(state.dashboard.meta?.trade_date || elements.tradeDate.value)}`); - setText("limitAllCount", allRows.length); - setText("limitFirstCount", allRows.filter((row) => number(row.streak) === 1).length); - setText("limitSecondCount", allRows.filter((row) => number(row.streak) === 2).length); - setText("limitThreePlusCount", allRows.filter((row) => number(row.streak) >= 3).length); - document.querySelector("#emptyState").hidden = rows.length !== 0; - updateSortHeaders(); -} - -function limitOpenState(row) { - const openTimes = number(row.open_times); - const firstTime = String(row.first_time || ""); - if (firstTime.startsWith("09:25") && openTimes === 0) return '一字'; - if (openTimes >= 6) return `烂板×${openTimes}`; - return String(openTimes); -} - -function formatLimitSealAmount(value) { - const amount = number(value); - if (!amount) return ""; - return Math.round(amount).toLocaleString("zh-CN"); -} - -function renderBrokenTable(rows) { - const visibleRows = getVisibleBrokenRows(rows); - setText("brokenCount", `${rows.length} 只`); - setText("brokenMeta", ` · 触及涨停后未能封住 · 数据日期 ${displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value)}`); - const body = document.querySelector("#brokenTableBody"); - body.innerHTML = visibleRows.map((row, index) => ` - - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${signed(row.change)} - ${formatNumber(row.limitGap, 2)} - ${formatNumber(row.price, 2)} - ${escapeHtml(row.sector || "其他")} - ${escapeHtml(row.first_time || "")} - ${brokenOpenState(row)} - ${formatNumber(row.turnover_rate, 2)} - ${formatNumber(row.amount_billion, 2)} - ${escapeHtml(row.reason || "")} - - `).join(""); - bindStockRows(body); - document.querySelector("#brokenEmptyState").hidden = visibleRows.length !== 0; - updateBrokenSortHeaders(); -} - -function getVisibleBrokenRows(rows = state.dashboard?.broken || []) { - let visibleRows = rows.map((row) => ({ ...row, limitGap: brokenLimitGap(row) })); - if (state.brokenQuery) { - visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.brokenQuery)); - } - if (!state.brokenSortKey) return visibleRows; - return visibleRows.sort((left, right) => { - const result = number(left[state.brokenSortKey]) - number(right[state.brokenSortKey]); - return state.brokenSortDirection === "asc" ? result : -result; - }); -} - -function brokenLimitRate(row) { - const name = String(row.name || "").toUpperCase(); - const code = String(row.code || "").replace(/\D/g, ""); - if (name.includes("ST")) return 10; - if (/^(300|301|688|689)/.test(code)) return 20; - if (/^(4|8|92)/.test(code)) return 30; - return 10; -} - -function brokenLimitGap(row) { - return Math.max(0, brokenLimitRate(row) - number(row.change)); -} - -function brokenOpenState(row) { - const openTimes = number(row.open_times); - return openTimes >= 6 - ? `反复炸 ×${openTimes}` - : String(openTimes); -} - -function changeBrokenSort(key) { - if (state.brokenSortKey === key) state.brokenSortDirection = state.brokenSortDirection === "asc" ? "desc" : "asc"; - else { - state.brokenSortKey = key; - state.brokenSortDirection = "desc"; - } - renderBrokenTable(state.dashboard?.broken || []); -} - -function updateBrokenSortHeaders() { - document.querySelectorAll("#brokenTable th[data-broken-sort]").forEach((header) => { - header.classList.remove("sort-asc", "sort-desc", "sorted"); - header.setAttribute("aria-sort", "none"); - if (header.dataset.brokenSort === state.brokenSortKey) { - header.classList.add(state.brokenSortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); - header.setAttribute("aria-sort", state.brokenSortDirection === "asc" ? "ascending" : "descending"); - } - const arrow = header.querySelector(".arr"); - if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.brokenSortDirection === "asc" ? "▲" : "▼") : "↕"; - }); -} - -function renderDownTable(rows) { - const visibleRows = getVisibleDownRows(rows); - setText("downCount", `${rows.length} 只`); - setText("downMeta", ` · 观察退潮、高位风险与亏钱效应 · 数据日期 ${displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value)}`); - renderDownSectorCluster(rows); - const body = document.querySelector("#downTableBody"); - body.innerHTML = visibleRows.map((row, index) => ` - - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${signed(row.change)} - ${formatNumber(row.price, 2)} - ${escapeHtml(row.sector || "其他")} - ${formatNumber(row.turnover_rate, 2)} - ${formatNumber(row.amount_billion, 2)} - ${number(row.streak) > 0 ? number(row.streak) : ""} - ${escapeHtml(row.reason || "")} - - `).join(""); - bindStockRows(body); - document.querySelector("#downEmptyState").hidden = visibleRows.length !== 0; - updateDownSortHeaders(); -} - -function getVisibleDownRows(rows = state.dashboard?.down_limits || []) { - let visibleRows = [...rows]; - if (state.downQuery) { - visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.downQuery)); - } - if (!state.downSortKey) return visibleRows; - return visibleRows.sort((left, right) => { - const result = number(left[state.downSortKey]) - number(right[state.downSortKey]); - return state.downSortDirection === "asc" ? result : -result; - }); -} - -function renderDownSectorCluster(rows) { - const counts = new Map(); - rows.forEach((row) => { - const sector = String(row.sector || "其他").trim() || "其他"; - if (sector === "其他") return; - counts.set(sector, (counts.get(sector) || 0) + 1); - }); - const cluster = [...counts.entries()].sort((left, right) => right[1] - left[1])[0]; - const element = document.querySelector("#downSectorCluster"); - element.hidden = !cluster || cluster[1] < 2; - element.textContent = cluster && cluster[1] >= 2 ? `${cluster[0]}集中跌停 ×${cluster[1]}` : ""; -} - -function changeDownSort(key) { - if (state.downSortKey === key) state.downSortDirection = state.downSortDirection === "asc" ? "desc" : "asc"; - else { - state.downSortKey = key; - state.downSortDirection = "asc"; - } - renderDownTable(state.dashboard?.down_limits || []); -} - -function updateDownSortHeaders() { - document.querySelectorAll("#downTable th[data-down-sort]").forEach((header) => { - header.classList.remove("sort-asc", "sort-desc", "sorted"); - header.setAttribute("aria-sort", "none"); - if (header.dataset.downSort === state.downSortKey) { - header.classList.add(state.downSortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); - header.setAttribute("aria-sort", state.downSortDirection === "asc" ? "ascending" : "descending"); - } - const arrow = header.querySelector(".arr"); - if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.downSortDirection === "asc" ? "▲" : "▼") : "↕"; - }); -} - -function renderYesterdayTable(rows) { - const visibleRows = getVisibleYesterdayRows(rows); - const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); - const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); - setText("yesterdayCount", `${rows.length} 只`); - setText("yesterdayMeta", ` · 昨日 ${previousDate} → 今日 ${currentDate}`); - renderYesterdaySummary(rows); - const body = document.querySelector("#yesterdayTableBody"); - body.innerHTML = visibleRows.map((row, index) => ` - - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${number(row.prior_streak)} - ${signed(row.current_change)} - ${escapeHtml(row.outcome)} - ${number(row.current_streak) ? `${number(row.current_streak)}` : ""} - ${escapeHtml(row.sector || "其他")} - ${escapeHtml(row.reason || "")} - - `).join(""); - bindStockRows(body); - document.querySelector("#yesterdayEmptyState").hidden = visibleRows.length !== 0; - updateYesterdayControls(); -} - -function getVisibleYesterdayRows(rows = state.dashboard?.yesterday_limits || []) { - let visibleRows = rows.filter((row) => { - if (state.yesterdayFilter === "advance") return row.outcome === "晋级"; - if (state.yesterdayFilter === "positive") return number(row.current_change) > 0; - if (state.yesterdayFilter === "fail") return row.outcome === "断板"; - if (state.yesterdayFilter === "risk") return ["炸板", "跌停"].includes(row.outcome); - return true; - }); - if (state.yesterdayQuery) { - visibleRows = visibleRows.filter((row) => `${row.code} ${row.name} ${row.sector}`.toLowerCase().includes(state.yesterdayQuery)); - } - if (!state.yesterdaySortKey) return visibleRows; - return visibleRows.sort((left, right) => { - const result = number(left[state.yesterdaySortKey]) - number(right[state.yesterdaySortKey]); - return state.yesterdaySortDirection === "asc" ? result : -result; - }); -} - -function renderYesterdaySummary(rows) { - const total = rows.length; - const advance = rows.filter((row) => row.outcome === "晋级").length; - const positive = rows.filter((row) => number(row.current_change) > 0).length; - const fail = rows.filter((row) => row.outcome === "断板").length; - const risk = rows.filter((row) => ["炸板", "跌停"].includes(row.outcome)).length; - const rate = (value) => total ? value / total * 100 : 0; - setText("yesterdayAllCount", total); - setText("yesterdayAdvanceCount", advance); - setText("yesterdayAdvanceRate", `晋级率 ${formatNumber(rate(advance), 1)}%`); - setText("yesterdayPositiveCount", positive); - setText("yesterdayPositiveRate", `兑现率 ${formatNumber(rate(positive), 1)}%`); - setText("yesterdayFailCount", fail); - setText("yesterdayFailRate", `占 ${formatNumber(rate(fail), 1)}%`); - setText("yesterdayRiskCount", risk); - setText("yesterdayRiskRate", `亏钱效应 ${formatNumber(rate(risk), 1)}%`); -} - -function yesterdayOutcomeClass(outcome) { - return { "晋级": "advance", "断板": "fail", "炸板": "broken", "跌停": "down" }[outcome] || "fail"; -} - -function changeYesterdaySort(key) { - if (state.yesterdaySortKey === key) state.yesterdaySortDirection = state.yesterdaySortDirection === "asc" ? "desc" : "asc"; - else { - state.yesterdaySortKey = key; - state.yesterdaySortDirection = "desc"; - } - renderYesterdayTable(state.dashboard?.yesterday_limits || []); -} - -function updateYesterdayControls() { - document.querySelectorAll("[data-yesterday-filter]").forEach((button) => { - const active = button.dataset.yesterdayFilter === state.yesterdayFilter; - button.classList.toggle("active", active); - button.setAttribute("aria-pressed", String(active)); - }); - document.querySelectorAll("#yesterdayTable th[data-yesterday-sort]").forEach((header) => { - header.classList.remove("sort-asc", "sort-desc", "sorted"); - header.setAttribute("aria-sort", "none"); - if (header.dataset.yesterdaySort === state.yesterdaySortKey) { - header.classList.add(state.yesterdaySortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); - header.setAttribute("aria-sort", state.yesterdaySortDirection === "asc" ? "ascending" : "descending"); - } - const arrow = header.querySelector(".arr"); - if (arrow) arrow.textContent = header.classList.contains("sorted") ? (state.yesterdaySortDirection === "asc" ? "▲" : "▼") : "↕"; - }); -} - -function renderPerformance(rows) { - rows = normalizePerformanceRows(rows); - const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); - const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); - setText("performanceDateRange", `昨日 ${previousDate} → 今日 ${currentDate}`); - document.querySelector("#performanceCards").innerHTML = rows.map((row) => ` -
    -
    ${escapeHtml(row.label)} → 今日${performanceRateState(row.advance_rate).label}
    - ${formatNumber(row.advance_rate, 1)}% - 晋级 ${number(row.advanced)} / 共 ${number(row.count)} 只 - -
    - `).join("") || '
    暂无昨日涨停统计
    '; - renderPerformanceConclusion(rows); - renderMarketBreadth(state.dashboard?.overview || {}); -} - -function normalizePerformanceRows(rows) { - const groups = new Map(); - (rows || []).forEach((row) => { - const level = Math.max(1, number(row.level)); - const displayLevel = Math.min(level, 5); - const group = groups.get(displayLevel) || { - level: displayLevel, - label: displayLevel === 1 ? "昨日首板" : displayLevel === 5 ? "昨日5板+" : `昨日${displayLevel}板`, - count: 0, - advanced: 0, - positive: 0, - changeTotal: 0, - }; - const count = number(row.count); - group.count += count; - group.advanced += number(row.advanced); - group.positive += count * number(row.positive_rate) / 100; - group.changeTotal += count * number(row.average_change); - groups.set(displayLevel, group); - }); - return [...groups.values()] - .sort((left, right) => right.level - left.level) - .map((group) => ({ - level: group.level, - label: group.label, - count: group.count, - advanced: group.advanced, - advance_rate: group.count ? group.advanced / group.count * 100 : 0, - positive_rate: group.count ? group.positive / group.count * 100 : 0, - average_change: group.count ? group.changeTotal / group.count : 0, - })); -} - -function performanceRateState(rate) { - const value = number(rate); - if (value === 0) return { label: "失效", className: "is-neutral" }; - if (value < 20) return { label: "危险", className: "is-warning" }; - return { label: "活跃", className: "is-active" }; -} - -function renderPerformanceConclusion(rows) { - const container = document.querySelector("#performanceConclusion"); - if (!rows.length) { - container.innerHTML = '
    暂无昨日梯队数据,暂不生成结论
    '; - return; - } - const sorted = [...rows].sort((left, right) => number(right.level) - number(left.level)); - const highRows = sorted.filter((row) => number(row.level) >= 4); - const highAdvanced = highRows.reduce((total, row) => total + number(row.advanced), 0); - const highSamples = highRows.map((row) => escapeHtml(row.label)).join("、"); - const strongest = [...rows].sort((left, right) => ( - number(right.advance_rate) - number(left.advance_rate) || number(right.level) - number(left.level) - ))[0]; - const firstBoard = rows.find((row) => number(row.level) === 1); - const overview = state.dashboard?.overview || {}; - const phase = overview.sentiment_phase || "观察"; - const up = number(overview.up_count); - const down = number(overview.down_count); - const breadthRate = up + down > 0 ? up / (up + down) * 100 : 50; - const stance = breadthRate < 25 ? "宜守不宜攻" : breadthRate < 45 ? "控制仓位,聚焦核心" : "保持精选,跟随强势梯队"; - const highText = highRows.length - ? `高位晋级率${highAdvanced ? "仍有承接" : "全线失效"}:${highSamples}${highAdvanced ? `共晋级 ${highAdvanced} 只` : "今日均未晋级"};` - : "高位梯队暂无昨日样本,空间信号仍待确认;"; - const strongestText = strongest - ? `${escapeHtml(strongest.label)}晋级率最高,为 ${formatNumber(strongest.advance_rate, 1)}%(${number(strongest.advanced)} 只晋级 / 共 ${number(strongest.count)} 只);` - : "暂无相对占优梯队;"; - const firstBoardText = firstBoard - ? `首板基数 ${number(firstBoard.count)} 只,晋级率 ${formatNumber(firstBoard.advance_rate, 1)}%,低位接力${number(firstBoard.advance_rate) < 20 ? "胜率偏低" : "仍有活跃度"};` - : "首板梯队暂无有效样本;"; - container.innerHTML = ` -
    · ${highText}
    -
    · ${strongestText}
    -
    · ${firstBoardText}
    -
    · 结论:${stance},当前情绪周期「${escapeHtml(phase)}」。
    - `; -} - -function renderMarketBreadth(overview) { - const up = number(overview.up_count); - const down = number(overview.down_count); - const flat = Math.max(0, number(overview.flat_count)); - const total = Math.max(1, up + down + flat); - const upRate = up / total * 100; - const flatRate = flat / total * 100; - const downRate = down / total * 100; - const panel = document.querySelector(".market-breadth-panel"); - panel.classList.remove("breadth-enter"); - void panel.offsetWidth; - panel.classList.add("breadth-enter"); - setText("breadthDataTime", dashboardDataTimestamp(state.dashboard?.meta || {})); - animateMetric("breadthRatio", upRate, (value) => `${formatNumber(value, 1)}%`); - animateMetric("breadthUpCount", up, (value) => formatNumber(Math.round(value))); - animateMetric("breadthDownCount", down, (value) => formatNumber(Math.round(value))); - setText("breadthUpLegend", `${formatNumber(up)}(${formatNumber(upRate, 1)}%)`); - setText("breadthFlatLegend", `${formatNumber(flat)}(${formatNumber(flatRate, 1)}%)`); - setText("breadthDownLegend", `${formatNumber(down)}(${formatNumber(downRate, 1)}%)`); - document.querySelector("#breadthFlatLegendItem").hidden = flat === 0; - const limitUp = number(overview.limit_up_count); - const limitDown = number(overview.limit_down_count); - const breadthLabel = upRate < 20 ? "宽度极差" : upRate < 40 ? "宽度偏弱" : upRate < 55 ? "宽度均衡" : "宽度偏强"; - setText("breadthWarning", `△ ${breadthLabel},涨跌停 ${limitUp}:${limitDown}`); - const bars = [ - ["breadthUpBar", upRate], - ["breadthFlatBar", flatRate], - ["breadthDownBar", downRate], - ]; - bars.forEach(([id, width]) => { - const bar = document.getElementById(id); - const targetWidth = `${Math.max(width, width > 0 ? 0.8 : 0)}%`; - bar.style.transition = "none"; - bar.style.width = "0%"; - requestAnimationFrame(() => requestAnimationFrame(() => { - bar.style.transition = "width 760ms var(--ease-out)"; - bar.style.width = targetWidth; - })); - bar.title = `${formatNumber(width, 1)}%`; - }); -} - -async function loadRotationHistory(force = false) { - if (!state.dashboard || state.rotationLoading) return; - const key = `${elements.tradeDate.value}:9`; - if (!force && state.rotationHistoryKey === key && state.rotationHistory) { - renderRotationHistory(); - return; - } - state.rotationLoading = true; - const container = document.querySelector("#rotationHistory"); - renderEmptyState(container, "正在读取轮动历史"); - try { - const query = new URLSearchParams({ - trade_date: elements.tradeDate.value, - }); - state.rotationHistory = await apiRequest(`/api/rotation/history?${query}`); - state.rotationHistoryKey = key; - renderRotationHistory(); - } catch (error) { - renderEmptyState(container, error.message || "轮动历史加载失败"); - showToast(error.message || "轮动历史加载失败"); - } finally { - state.rotationLoading = false; - } -} - -function renderRotationHistory() { - const rows = state.rotationHistory?.rows || []; - const selected = state.rotationSelectedSector; - const container = document.querySelector("#rotationHistory"); - const tracker = document.querySelector("#rotationTracker"); - if (!rows.length) { - renderEmptyState(container, "尚无连续交易日的板块数据"); - setText("rotationHistoryRange", "暂无轮动历史"); - tracker.hidden = true; - return; - } - const chronological = [...rows] - .sort((left, right) => String(left.trade_date).localeCompare(String(right.trade_date))) - .slice(-9); - const displayRows = state.rotationOrder === "latest" ? [...chronological].reverse() : chronological; - document.querySelectorAll("[data-rotation-order]").forEach((button) => { - button.classList.toggle("active", button.dataset.rotationOrder === state.rotationOrder); - }); - setText( - "rotationHistoryRange", - `最近 ${chronological.length} 个交易日 · ${displayCompactDate(chronological[0].trade_date)} → ${displayCompactDate(chronological[chronological.length - 1].trade_date)} · ${state.rotationOrder === "latest" ? "由近到远,左侧为最新交易日" : "由远到近,右侧为最新交易日"}`, - ); - setText("rotationSelectionHint", selected ? `已联动高亮 ${selected}` : "点击任意板块追踪其连续性"); - if (selected) { - const sequence = displayRows.map((day) => { - const sector = (day.sectors || []).find((item) => item.name === selected); - return { tradeDate: day.trade_date, sector }; - }); - const appearances = sequence.filter((item) => item.sector); - const bestRank = appearances.length ? Math.min(...appearances.map((item) => number(item.sector.rank))) : 0; - tracker.hidden = false; - const continuity = appearances.length >= 3 ? "主线候选" : appearances.length === 1 ? "单日异动,持续性待验证" : "间断活跃"; - tracker.innerHTML = ` -
    ${escapeHtml(selected)}近 9 日在榜 ${appearances.length} 天 · 最高排名 #${bestRank || "--"} · ${continuity}
    -
    - ${sequence.map((item) => item.sector - ? `#${number(item.sector.rank)}` - : `--`).join("")} -
    - `; - tracker.querySelector(".rotation-track-cancel").addEventListener("click", () => { - state.rotationSelectedSector = ""; - state.rotationSelectedDate = ""; - renderRotationHistory(); - loadRotationMembers(""); - }); - } else { - tracker.hidden = true; - tracker.innerHTML = ""; - } - container.classList.toggle("tracking", Boolean(selected)); - const latestTradeDate = chronological[chronological.length - 1].trade_date; - container.innerHTML = displayRows.map((day) => { - const hasSelected = selected && (day.sectors || []).some((sector) => sector.name === selected); - return ` -
    -
    ${(day.sectors || []).length} 个热点
    -
    ${(day.sectors || []).map((sector) => { - const strength = clamp(number(sector.strength), 0, 100); - const heatClass = strength >= 90 ? "heat-strong" : strength >= 70 ? "heat-warm" : "heat-mild"; - return ` - `; - }).join("")}
    -
    `; - }).join(""); - container.querySelectorAll("[data-rotation-sector]").forEach((button) => { - button.addEventListener("click", () => { - const clickedSector = button.dataset.rotationSector; - const clickedDate = button.dataset.rotationDate; - const isSameSelection = clickedSector === state.rotationSelectedSector - && clickedDate === state.rotationSelectedDate; - state.rotationSelectedSector = isSameSelection ? "" : clickedSector; - state.rotationSelectedDate = isSameSelection ? "" : clickedDate; - renderRotationHistory(); - loadRotationMembers(state.rotationSelectedSector); - }); - }); -} - -async function loadRotationMembers(sector, force = false) { - if (!sector) { - state.rotationMembers = null; - state.rotationMembersKey = ""; - renderRotationMembers(); - return; - } - const memberDate = state.rotationSelectedDate || elements.tradeDate.value; - const key = `${memberDate}:${sector}`; - if (!force && state.rotationMembersKey === key && state.rotationMembers) { - renderRotationMembers(); - return; - } - state.rotationMembersLoading = true; - renderRotationMembers(); - try { - const query = new URLSearchParams({ trade_date: memberDate, sector }); - state.rotationMembers = await apiRequest(`/api/rotation/members?${query}`); - state.rotationMembersKey = key; - } catch (error) { - state.rotationMembers = { error: error.message || "成分股加载失败", rows: [] }; - state.rotationMembersKey = key; - } finally { - state.rotationMembersLoading = false; - renderRotationMembers(); - } -} - -function renderRotationMembers() { - const body = document.querySelector("#rotationTableBody"); - const empty = document.querySelector("#rotationMembersEmpty"); - if (state.rotationMembersLoading) { - body.innerHTML = ""; - empty.textContent = `正在核验${state.rotationSelectedSector}成分股`; - empty.hidden = false; - return; - } - const payload = state.rotationMembers; - const rows = payload?.rows || []; - if (!state.rotationSelectedSector || !payload || payload.error || !rows.length) { - body.innerHTML = ""; - empty.textContent = payload?.error || (state.rotationSelectedSector ? "该板块暂无可用成分行情" : "点击上方任意板块查看成分股"); - empty.hidden = false; - setText("rotationDetailTitle", "板块成分股"); - setText("rotationDetailMeta", state.rotationSelectedSector || "--"); - return; - } - empty.hidden = true; - setText("rotationDetailTitle", `${payload.meta?.sector_name || state.rotationSelectedSector}成分股`); - setText("rotationDetailMeta", `${displayCompactDate(payload.meta?.trade_date)} · ${number(payload.meta?.quoted_count)} / ${number(payload.meta?.member_count)} 只`); - body.innerHTML = rows.map((row, index) => ` - ${index + 1}${escapeHtml(row.code)}${escapeHtml(row.name)} - ${row.quoted ? signed(row.change) : ""} - ${row.quoted ? formatNumber(row.open, 2) : ""}${row.quoted ? formatNumber(row.close, 2) : ""} - ${row.quoted ? formatNumber(row.amount_billion, 2) : ""}${row.quoted ? "正常交易" : "当日无行情"} - `).join(""); - animateRows(body); - bindStockRows(body); -} - -function renderLadderMini(ladders) { - const container = document.querySelector("#ladderMini"); - const highest = ladders.length ? Math.max(...ladders.map((item) => number(item.level))) : 0; - setText("maxHeight", highest ? `最高 ${highest} 板` : "暂无"); - container.innerHTML = ladders.slice(0, 5).map((group) => { - const allNames = group.stocks.map((stock) => stock.name).filter(Boolean); - const visibleNames = allNames.slice(0, 3).join("、"); - const suffix = allNames.length > 3 ? ` 等 ${number(group.count)} 只` : ""; - return `
    -
    ${escapeHtml(group.label)}${number(group.count)} 只
    -

    ${escapeHtml(visibleNames || "--")}${suffix}

    -
    `; - }).join("") || emptyStateHtml("暂无梯队数据"); -} - -function renderSectorMini(sectors) { - document.querySelector("#sectorMini").innerHTML = sectors.slice(0, 7).map((sector) => ` -
    ${escapeHtml(sector.name)}${number(sector.count)}
    - `).join("") || emptyStateHtml("暂无板块数据"); -} - -function renderLadderBoard(ladders) { - const container = document.querySelector("#ladderBoard"); - const insights = document.querySelector("#ladderInsights"); - const ordered = [...ladders].sort((left, right) => number(right.level) - number(left.level)); - const maxLevel = ordered.length ? Math.max(...ordered.map((group) => number(group.level))) : 0; - const topVisibleLevel = Math.max(5, maxLevel); - const groupMap = new Map(ordered.map((group) => [number(group.level), group])); - const displayGroups = Array.from({ length: topVisibleLevel }, (_, index) => { - const level = topVisibleLevel - index; - return groupMap.get(level) || { level, label: level === 1 ? "首板" : level === 5 && maxLevel < 5 ? "5板+" : `${level}板`, count: 0, stocks: [] }; - }); - const total = ordered.reduce((sum, group) => sum + number(group.count), 0); - const spaceStocks = ordered.find((group) => number(group.level) === maxLevel)?.stocks || []; - const currentDate = displayCompactDate(state.dashboard?.meta?.trade_date || elements.tradeDate.value); - const previousDate = displayCompactDate(state.dashboard?.meta?.previous_trade_date || ""); - setText("ladderDateRange", `数据日期 ${currentDate}`); - container.innerHTML = displayGroups.map((group) => { - const level = number(group.level); - const limit = level === 1 || level === 2 ? 8 : 99; - const expanded = state.expandedLadderLevels.has(level); - const groupStocks = [...(group.stocks || [])].sort((left, right) => { - if (state.ladderSortMode === "open") { - return number(left.open_times) - number(right.open_times) - || String(left.first_time || "99:99:99").localeCompare(String(right.first_time || "99:99:99")); - } - return String(left.first_time || "99:99:99").localeCompare(String(right.first_time || "99:99:99")); - }); - const stocks = expanded ? groupStocks : groupStocks.slice(0, limit); - const remaining = Math.max(0, groupStocks.length - stocks.length); - const label = group.label || (level === 1 ? "首板" : level === 5 && maxLevel < 5 ? "5板+" : `${level}板`); - const color = { 1: "#2563eb", 2: "#16a34a", 3: "#d97706", 4: "#e04536" }[level] || "#9ca3af"; - return ` -
    -
    ${escapeHtml(label)}
    ${number(group.count)} 只
    ${number(group.count) && level > 1 ? `
    ${escapeHtml(label)} · ${formatNumber(number(group.count) / Math.max(number(groupMap.get(level - 1)?.count), 1) * 100, 1)}%
    ` : ""}
    -
    ${stocks.length ? stocks.map((stock) => { - const onePrice = String(stock.first_time || "").startsWith("09:25") && number(stock.open_times) === 0; - const broken = number(stock.open_times) >= 6; - const amount = number(stock.seal_amount_million) ? `封单 ${formatNumber(stock.seal_amount_million, 0)} 万` : `成交 ${formatNumber(stock.amount_billion, 1)} 亿`; - return ``; - }).join("") : `
    ${level >= maxLevel ? `断层 · ${escapeHtml(label)}及以上空缺` : "该层暂时空缺"}
    `}${groupStocks.length > limit ? `` : ""}
    -
    `; - }).join(""); - const structureRows = displayGroups.filter((group) => number(group.count) || number(group.level) <= maxLevel + 1); - const maxCount = Math.max(1, ...structureRows.map((group) => number(group.count))); - const rateRows = (state.dashboard?.limit_performance || []).map((row) => ({ - label: `${row.label || (number(row.level) === 1 ? "昨日首板" : `昨日${number(row.level)}板`)} → 今日`, - value: clamp(number(row.advance_rate), 0, 100), - })); - const previousMax = Math.max(0, ...(state.dashboard?.yesterday_limits || []).map((row) => number(row.prior_streak))); - const spaceChange = previousMax && maxLevel < previousMax ? `较昨日 ${previousMax} 板 ↓ 空间压缩` : previousMax && maxLevel > previousMax ? `较昨日 ${previousMax} 板 ↑ 高度抬升` : "高度与昨日接近"; - const spaceNote = maxLevel >= 5 ? "高位梯队仍有辨识度,重点观察承接而非单看高度。" : maxLevel >= 3 ? "空间位于中段,梯队延续性比绝对高度更重要。" : "高度受到压缩,先观察首板向二板的结构修复。"; - const strongestGroup = structureRows.reduce((best, group) => number(group.count) > number(best?.count) ? group : best, structureRows[0]); - insights.innerHTML = ` -

    空间板

    市场高度
    ${maxLevel ? `${maxLevel} 板` : "--"}${escapeHtml(spaceChange)}

    ${spaceStocks.length ? spaceStocks.map((stock) => `${escapeHtml(stock.name)}(${escapeHtml(stock.sector || "其他")})`).join(" · ") : "暂无空间板"}

    ${spaceNote}

    -

    梯队结构

    完整度
    ${structureRows.map((group) => `
    ${escapeHtml(group.label || `${number(group.level)}板`)}${number(group.count) ? `${number(group.count)} 只` : "断层"}
    `).join("")}

    断层越少,梯队从低位向高位传导越连贯。当前腰部为 ${escapeHtml(strongestGroup?.label || "--")}

    -

    晋级率参考

    昨日梯队 → 今日
    ${rateRows.length ? rateRows.map((row) => `
    ${escapeHtml(row.label)}${formatNumber(row.value, 1)}%
    `).join("") : '
    暂无可比梯队
    '}
    数据来自“涨停表现”页 · 昨日梯队样本
    `; - container.querySelectorAll("[data-ladder-level]").forEach((button) => { - button.addEventListener("click", () => { - const level = number(button.dataset.ladderLevel); - if (state.expandedLadderLevels.has(level)) state.expandedLadderLevels.delete(level); - else state.expandedLadderLevels.add(level); - renderLadderBoard(state.dashboard?.ladders || []); - }); - }); - bindStockRows(container); - refreshIcons(); -} - -async function loadAuctionCenter(force = false) { - if (state.auctionLoading) return; - state.auctionLoading = true; - const button = document.querySelector("#auctionRefreshButton"); - button.disabled = true; - setText("auctionDateLabel", "正在读取竞价数据"); - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - if (force) query.set("force", "1"); - state.auctionData = await apiRequest(`/api/auction?${query}`); - renderAuctionCenter(); - scheduleAuctionTransition(state.auctionData.meta || {}); - } catch (error) { - document.querySelector("#auctionSummary").innerHTML = ""; - document.querySelector("#auctionThemeCarry").innerHTML = ""; - document.querySelector("#auctionNewThemes").innerHTML = ""; - document.querySelector("#auctionAmountTrend").innerHTML = ""; - document.querySelector("#auctionAmountCompare").innerHTML = ""; - document.querySelector("#auctionTableBody").innerHTML = ""; - document.querySelector("#auctionEmpty").hidden = false; - setText("auctionDateLabel", error.message || "竞价数据暂不可用"); - showToast(error.message || "竞价数据加载失败"); - } finally { - state.auctionLoading = false; - button.disabled = false; - } -} - -function renderAuctionCenter() { - const payload = state.auctionData; - if (!payload) return; - const summary = payload.summary || {}; - renderAuctionPhase(payload.meta || {}); - setText( - "auctionDateLabel", - `${payload.meta?.carried_forward ? "最近有效竞价" : "竞价日期"} ${payload.meta?.trade_date || "--"}`, - ); - document.querySelector("#auctionSummary").innerHTML = [ - ["竞价覆盖", `${formatNumber(summary.stock_count, 0)} 只`, ""], - ["重点异动", `${formatNumber(summary.focus_count, 0)} 只`, "up"], - ["竞价一字", `${formatNumber(summary.one_price_count, 0)} 只`, ""], - ["竞价成交额", `${formatNumber(summary.amount_billion, 2)} 亿`, ""], - ].map(([label, value, tone]) => `
    ${label}${value}
    `).join(""); - setText("auctionFocusCount", number(summary.focus_count)); - setText("auctionAllCount", number(summary.candidate_count)); - setText("auctionOnePriceCount", number(summary.one_price_count)); - setText("auctionWatchlistCount", number(payload.watchlist_rows?.length)); - renderAuctionInsights(payload); - renderAuctionTable(); -} - -function renderAuctionInsights(payload) { - const themes = payload.themes || {}; - const carry = themes.carry || []; - const tone = { "强承接": "strong", "有承接": "steady", "分歧": "mixed", "承接弱": "weak" }; - setText("auctionThemeBaseline", `基于 ${payload.candidate_meta?.baseline_date || "--"}`); - document.querySelector("#auctionThemeCarry").innerHTML = carry.length - ? carry.map((item) => ` -
    - ${escapeHtml(item.name)} - ${escapeHtml(item.leader || "--")} · 昨日 ${number(item.prior_limit_count)} 只涨停 - ${escapeHtml(item.status)} - ${item.median_change == null ? "暂无有效候选" : `${signed(item.median_change)}%`}中位 -
    `).join("") - : '
    暂无昨日强势题材基线
    '; - - const newThemes = themes.new_themes || []; - document.querySelector("#auctionNewThemes").innerHTML = newThemes.length - ? newThemes.map((item) => `${escapeHtml(item.name)} ${number(item.stock_count)}`).join("") - : '尚未形成多股共振的新线索'; - - const history = payload.amount_history || []; - const maximum = Math.max(...history.map((item) => number(item.amount_billion)), 1); - const priorFive = history.slice(Math.max(0, history.length - 6), Math.max(0, history.length - 1)); - const fiveDayAverage = priorFive.length - ? priorFive.reduce((sum, item) => sum + number(item.amount_billion), 0) / priorFive.length - : null; - document.querySelector("#auctionAmountTrend").innerHTML = history.length - ? history.map((item, index) => { - const height = Math.max(8, number(item.amount_billion) / maximum * 100); - const current = index === history.length - 1 ? " current" : ""; - return `
    - ${escapeHtml(String(item.trade_date || "").slice(5))} -
    `; - }).join("") + (fiveDayAverage === null ? "" : `
    5日均 ${formatNumber(fiveDayAverage, 1)}
    `) - : '
    历史竞价量能尚未形成
    '; - setText("auctionAmountValue", `${formatNumber(payload.summary?.amount_billion, 2)} 亿`); - const comparison = [ - ["较昨日", payload.summary?.amount_change_previous], - ["较5日均值", payload.summary?.amount_change_5d], - ]; - document.querySelector("#auctionAmountCompare").innerHTML = comparison.map(([label, value]) => ` - ${label}${value == null ? "--" : `${signed(value)}%`} - `).join(""); -} - -function renderAuctionPhase(meta) { - const phase = meta.phase || "archive"; - const available = Boolean(meta.available); - const copy = { - pending: ["竞价尚未开始", "9:15 进入观察期,9:25 读取最终竞价结果。", "下一阶段 09:15"], - observing: ["竞价观察期", "此阶段先观察盘前变化,系统将在 9:25 自动读取最终结果。", "09:25 定格"], - selection: available - ? ["竞价筛选窗口", "最终竞价结果已经定格,请在 9:30 前完成筛选。", "有效至 09:30"] - : ["等待最终竞价", "9:25 数据尚未到达,系统正在自动重试。", "即将更新"], - finalized: ["今日竞价已定格", "9:30 后停止更新,仅保留用于复盘、回测与智能选股。", "已冻结"], - archive: ["历史竞价归档", "当前展示所选交易日的最终竞价结果。", "归档数据"], - }[phase] || ["竞价状态", "当前竞价状态待确认。", "--"]; - const notice = document.querySelector("#auctionPhaseNotice"); - notice.dataset.phase = phase; - setText("auctionPhaseTitle", copy[0]); - setText("auctionPhaseDetail", copy[1]); - setText("auctionPhaseTime", copy[2]); - const refresh = document.querySelector("#auctionRefreshButton"); - refresh.hidden = phase !== "selection"; - refresh.disabled = state.auctionLoading; -} - -function clearAuctionTimer() { - if (state.auctionTimer) clearTimeout(state.auctionTimer); - state.auctionTimer = null; -} - -function scheduleAuctionTransition(meta) { - clearAuctionTimer(); - if (state.activeView !== "auctionView") return; - let delay = 0; - if (["selection", "finalized"].includes(meta.phase) && !meta.available) { - delay = 10_000; - } else if (meta.next_transition_at) { - const transitionAt = new Date(meta.next_transition_at).getTime(); - if (Number.isFinite(transitionAt)) delay = Math.max(800, transitionAt - Date.now() + 500); - } - if (!delay) return; - state.auctionTimer = setTimeout(() => { - state.auctionTimer = null; - if (state.activeView === "auctionView") loadAuctionCenter(true); - }, Math.min(delay, 2_147_000_000)); -} - -function renderAuctionTable() { - const rows = currentAuctionRows(); - const columns = auctionColumns(); - const head = document.querySelector("#auctionTableHead"); - head.innerHTML = columns.map((column) => { - const sorted = column.sortKey === state.auctionSortKey; - const arrow = !column.sortKey ? "" : `${sorted ? (state.auctionSortDirection === "desc" ? "▼" : "▲") : "↕"}`; - return `${column.label}${arrow}`; - }).join(""); - const body = document.querySelector("#auctionTableBody"); - body.innerHTML = rows.map((row) => `${columns.map((column) => renderAuctionCell(row, column.key)).join("")}`).join(""); - bindStockRows(body); - const datasetCopy = { - focus: ["重点异动", "优先查看市场核心与显著预期差"], - onePrice: ["竞价一字", "竞价封于当日真实涨停价,不参与普通异动评分"], - watchlist: ["我的自选", "仅展示当前账号关注标的的竞价反馈"], - all: ["全部候选", "昨日涨停、炸板与热榜前20候选"], - }[state.auctionDataset] || ["竞价异动", ""]; - setText("auctionWorkspaceTitle", datasetCopy[0]); - setText("auctionWorkspaceSubtitle", datasetCopy[1]); - document.querySelector("#auctionExpectationControls").hidden = state.auctionDataset === "onePrice"; - const empty = document.querySelector("#auctionEmpty"); - const phase = state.auctionData?.meta?.phase || "archive"; - empty.textContent = phase === "selection" && !state.auctionData?.meta?.available - ? "正在等待 9:25 最终竞价数据" - : state.auctionDataset === "watchlist" - ? "当前账号还没有可观察的自选股" - : state.auctionDataset === "onePrice" - ? "当前没有竞价封于涨停价的股票" - : "没有符合条件的竞价候选"; - empty.hidden = rows.length > 0; -} - -function currentAuctionRows() { - const datasets = { - focus: state.auctionData?.focus_rows || [], - onePrice: state.auctionData?.one_price_rows || [], - watchlist: state.auctionData?.watchlist_rows || [], - all: state.auctionData?.rows || [], - }; - let rows = [...(datasets[state.auctionDataset] || [])]; - const filter = state.auctionFilter; - const labels = { above: "超预期", matched: "符合预期", below: "低于预期" }; - if (labels[filter]) rows = rows.filter((item) => item.expectation === labels[filter]); - if (state.auctionQuery) { - rows = rows.filter((item) => `${item.code} ${item.name} ${item.sector}`.toLocaleLowerCase("zh-CN").includes(state.auctionQuery)); - } - const key = state.auctionSortKey; - const direction = state.auctionSortDirection === "asc" ? 1 : -1; - if (key) { - rows.sort((left, right) => { - const leftValue = left[key]; - const rightValue = right[key]; - if (leftValue == null && rightValue == null) return 0; - if (leftValue == null) return 1; - if (rightValue == null) return -1; - const result = typeof leftValue === "number" || typeof rightValue === "number" - ? number(leftValue) - number(rightValue) - : String(leftValue).localeCompare(String(rightValue), "zh-CN", { numeric: true }); - return result * direction; - }); - } - return rows.slice(0, 300); -} - -function auctionColumns() { - const base = [ - { key: "stock", label: "股票" }, - { key: "context", label: "方向与来源" }, - { key: "identity", label: "市场身份" }, - ]; - const metrics = [ - { key: "score", label: "关注分", numeric: true, sortKey: "attention_score" }, - { key: "expectation", label: "预期判断" }, - { key: "change", label: "竞价涨幅(%)", numeric: true, sortKey: "change" }, - { key: "amount", label: "竞价额(百万)", numeric: true, sortKey: "amount_million" }, - { key: "volume", label: "量比", numeric: true, sortKey: "volume_ratio" }, - ]; - return state.auctionDataset === "onePrice" ? [...base, ...metrics.slice(2)] : [...base, ...metrics]; -} - -function renderAuctionCell(row, key) { - const unavailable = row.available === false; - const onePrice = Boolean(row.is_one_price); - const expectationTone = { "超预期": "above", "符合预期": "matched", "低于预期": "below" }; - if (key === "stock") return `${escapeHtml(row.name)}${escapeHtml(row.code)}`; - if (key === "context") return `${escapeHtml(row.sector || "其他")}${renderAuctionSources(row.source_label || (state.auctionDataset === "watchlist" ? "我的自选" : "全市场"))}`; - if (key === "identity") return `${renderAuctionCoreTags(row.core_tags)}`; - if (unavailable) return key === "expectation" - ? '暂无竞价' - : ``; - if (key === "score") return `${onePrice ? "" : formatNumber(row.attention_score, 1)}`; - if (key === "expectation") { - const tag = onePrice - ? '竞价一字' - : `${escapeHtml(row.expectation || "符合预期")}`; - return `${tag}`; - } - if (key === "change") return `${signed(row.change)}`; - if (key === "amount") return `${formatNumber(row.amount_million, 2)}`; - if (key === "volume") return `${formatNumber(row.volume_ratio, 2)}`; - return ""; -} - -function renderAuctionSources(value) { - const sources = String(value || "").split(/[·、/]/).map((item) => item.trim()).filter(Boolean).slice(0, 3); - return `${sources.map((source) => `${escapeHtml(source)}`).join("")}`; -} - -function renderAuctionCoreTags(tags) { - const values = Array.isArray(tags) ? tags : []; - return values.length - ? `${values.slice(0, 2).map((tag) => `${escapeHtml(tag)}`).join("")}` - : ''; -} - -function exportAuctionRows() { - const rows = currentAuctionRows(); - exportRows("集合竞价", rows, [ - ["股票代码", "code"], ["股票名称", "name"], ["行业", "sector"], ["来源", "source_label"], - ["市场身份", "core_tags"], ["关注分", "attention_score"], ["预期判断", "expectation"], - ["竞价涨幅%", "change"], ["竞价额百万", "amount_million"], ["量比", "volume_ratio"], - ]); -} - -async function loadThemeLibrary(force = false) { - if (state.themeLoading) return; - state.themeLoading = true; - const button = document.querySelector("#themeRefreshButton"); - button.disabled = true; - setText("themeDateLabel", "正在整理题材库"); - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - if (force) query.set("force", "1"); - state.themeLibrary = await apiRequest(`/api/themes?${query}`); - renderThemeLibrary(); - const available = (state.themeLibrary.items || []).some((item) => item.code === state.selectedThemeCode); - if (!available) state.selectedThemeCode = ""; - const initialCode = state.selectedThemeCode || state.themeLibrary.items?.[0]?.code || ""; - if (initialCode) await selectTheme(initialCode, true); - } catch (error) { - setText("themeDateLabel", error.message || "题材数据暂不可用"); - renderEmptyState("themeDirectory", error.message || "题材数据加载失败"); - showToast(error.message || "题材数据加载失败"); - } finally { - state.themeLoading = false; - button.disabled = false; - } -} - -function renderThemeLibrary() { - const payload = state.themeLibrary; - if (!payload) return; - const summary = payload.summary || {}; - setText("themeDateLabel", `${payload.meta?.carried_forward ? "最近有效行情" : "行情日期"} ${payload.meta?.trade_date || "--"}`); - document.querySelector("#themeSummary").innerHTML = [ - ["收录题材", number(summary.theme_count), "个", ""], - ["当日上涨", number(summary.up_count), "个", "up"], - ["当日下跌", number(summary.down_count), "个", "down"], - ["人气题材", number(summary.hot_count), "个", "warning"], - ].map(([label, value, unit, tone]) => `
    ${label}${value}${unit}
    `).join(""); - renderThemeDirectory(); -} - -function renderThemeDirectory() { - let items = [...(state.themeLibrary?.items || [])]; - if (state.themeQuery) { - items = items.filter((item) => `${item.code} ${item.name}`.toLocaleLowerCase("zh-CN").includes(state.themeQuery)); - } - setText("themeResultCount", `${items.length} 个`); - document.querySelector("#themeDirectory").innerHTML = items.map((item, index) => { - const active = item.code === state.selectedThemeCode; - return ` - `; - }).join("") || emptyStateHtml("没有匹配的题材"); -} - -async function selectTheme(code, keepSelection = false) { - if (!code) return; - state.selectedThemeCode = code; - if (!keepSelection) renderThemeDirectory(); - document.querySelector("#themeDetailEmpty").hidden = false; - document.querySelector("#themeDetailContent").hidden = true; - setText("themeDetailEmpty", "正在读取题材详情"); - try { - const query = new URLSearchParams({ code, trade_date: elements.tradeDate.value }); - state.themeDetail = await apiRequest(`/api/themes/detail?${query}`); - renderThemeDetail(); - } catch (error) { - setText("themeDetailEmpty", error.message || "题材详情加载失败"); - showToast(error.message || "题材详情加载失败"); - } -} - -function renderThemeDetail() { - const payload = state.themeDetail; - if (!payload) return; - const theme = payload.theme || {}; - const summary = payload.summary || {}; - document.querySelector("#themeDetailEmpty").hidden = true; - document.querySelector("#themeDetailContent").hidden = false; - setText("themeDetailName", theme.name || "--"); - setText("themeDetailCode", `${theme.code || "--"} · ${payload.meta?.trade_date || "--"}`); - setText("themeDetailChange", `${signed(theme.change)}%`); - document.querySelector("#themeDetailChange").className = changeClass(theme.change); - document.querySelector("#themeDetailMetrics").innerHTML = [ - ["成分股", `${number(summary.member_count)} 只`, ""], - ["有行情", `${number(summary.quoted_count)} 只`, ""], - ["上涨", `${number(summary.up_count)} 只`, "up"], - ["下跌", `${number(summary.down_count)} 只`, "down"], - ["换手率", `${formatNumber(theme.turnover_rate, 2)}%`, ""], - ].map(([label, value, tone]) => `
    ${label}${value}
    `).join(""); - setText("themeMemberCount", `有行情 ${number(summary.quoted_count)} / ${number(summary.member_count)}`); - const body = document.querySelector("#themeMemberTableBody"); - body.innerHTML = (payload.members || []).map((row, index) => ` - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${row.has_quote ? signed(row.change) : ""} - ${row.has_quote ? formatNumber(row.price, 2) : ""}${row.has_quote ? formatNumber(row.amount_billion, 2) : ""}`).join(""); - bindStockRows(body); - renderThemeDirectory(); -} - -async function loadPopularity(force = false) { - if (state.popularityLoading) return; - state.popularityLoading = true; - const button = document.querySelector("#popularityRefreshButton"); - button.disabled = true; - setText("popularityDateLabel", "正在读取人气榜"); - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - if (force) query.set("force", "1"); - state.popularityData = await apiRequest(`/api/popularity?${query}`); - renderPopularity(); - } catch (error) { - setText("popularityDateLabel", error.message || "人气榜暂不可用"); - document.querySelector("#popularityTableBody").innerHTML = ""; - document.querySelector("#popularityEmpty").hidden = false; - showToast(error.message || "人气榜加载失败"); - } finally { - state.popularityLoading = false; - button.disabled = false; - } -} - -function renderPopularity() { - const payload = state.popularityData; - if (!payload) return; - const summary = payload.summary || {}; - setText("popularityDateLabel", `${payload.meta?.carried_forward ? "最近有效榜单" : "榜单日期"} ${payload.meta?.trade_date || "--"}`); - const topNames = (rows) => (rows || []).slice(0, 3).map((item) => item.name).filter(Boolean).join(" · ") || "--"; - document.querySelector("#popularitySummary").innerHTML = [ - ["同花顺热度 Top3", topNames(payload.ths), `共 ${number(summary.ths_count)} 只上榜`], - ["东方财富热度 Top3", topNames(payload.dc), `共 ${number(summary.dc_count)} 只上榜`], - ["双榜共识", `${number(summary.dual_count)} 只`, "同时进入两榜,共识度更高"], - ].map(([label, value, detail], index) => `
    ${label}${escapeHtml(value)}${escapeHtml(detail)}
    `).join(""); - renderPopularityTable(); -} - -function renderPopularityTable() { - const source = state.popularitySource; - let rows = [...(state.popularityData?.[source] || [])]; - if (state.popularityQuery) { - rows = rows.filter((item) => `${item.code} ${item.name} ${(item.concepts || []).join(" ")}`.toLocaleLowerCase("zh-CN").includes(state.popularityQuery)); - } - const combined = source === "combined"; - const sourceName = source === "ths" ? "同花顺" : source === "dc" ? "东方财富" : "双榜综合"; - setText("popularityTableTitle", `${sourceName}榜`); - setText("popularityTableNote", combined ? "按双榜排名综合排序 · 已隐藏重复的榜单状态" : "按榜单名次排序 · 状态显示是否同时进入另一榜"); - const headers = [ - ["排名", "number num"], ["股票", ""], ["最新价(元)", "number num"], ["涨跌幅(%)", "number num"], - ...(source !== "dc" ? [["同花顺", "number num"]] : []), - ...(source !== "ths" ? [["东方财富", "number num"]] : []), - ["排名变化", "number num"], ["热门概念", ""], ...(!combined ? [["榜单状态", ""]] : []), - ]; - document.querySelector("#popularityTableHead").innerHTML = headers.map(([label, className]) => `${label}`).join(""); - const body = document.querySelector("#popularityTableBody"); - body.innerHTML = rows.map((row, index) => { - const thsRank = source === "ths" ? row.rank : row.ths_rank; - const dcRank = source === "dc" ? row.rank : row.dc_rank; - const move = row.rank_change; - const movement = move === null || move === undefined ? "新" : number(move) > 0 ? `↑${number(move)}` : number(move) < 0 ? `↓${Math.abs(number(move))}` : "持平"; - return ` - ${index + 1}${index < 3 ? '' : ""} -
    ${escapeHtml(row.name)}${escapeHtml(row.code)}
    - ${row.price == null ? "" : formatNumber(row.price, 2)} - ${row.change == null ? "" : signed(row.change)} - ${source !== "dc" ? `${thsRank ? number(thsRank) : ""}` : ""} - ${source !== "ths" ? `${dcRank ? number(dcRank) : ""}` : ""} - ${movement} - ${escapeHtml((row.concepts || []).slice(0, 3).join("、"))} - ${!combined ? `${row.dual_source ? "双榜共识" : "单榜入选"}` : ""} - `; - }).join(""); - bindStockRows(body); - markAutoSortableHeaders(body.closest("table")); - document.querySelector("#popularityEmpty").hidden = rows.length > 0; -} - -function selectDragonViewMode(mode) { - state.dragonViewMode = mode === "profiles" ? "profiles" : "daily"; - document.querySelectorAll("[data-dragon-view-mode]").forEach((button) => { - const active = button.dataset.dragonViewMode === state.dragonViewMode; - button.classList.toggle("active", active); - button.setAttribute("aria-pressed", String(active)); - }); - if (state.dragonViewMode === "profiles") { - document.querySelector("#dragonDailyContent").hidden = true; - document.querySelector("#dragonEmptyState").hidden = true; - document.querySelector("#dragonProfilesContent").hidden = false; - if (state.hotMoneyProfiles) renderHotMoneyProfiles(); - else loadHotMoneyProfiles(); - } else { - document.querySelector("#dragonProfilesContent").hidden = true; - if (state.dragonTiger) renderDragonTiger(); - else loadDragonTiger(); - } -} - -async function loadHotMoneyProfiles(force = false) { - if (!force && state.hotMoneyProfiles) { - renderHotMoneyProfiles(); - return; - } - setStatus("正在加载游资档案"); - try { - const query = new URLSearchParams(); - if (force) query.set("force", "1"); - const suffix = query.size ? `?${query}` : ""; - state.hotMoneyProfiles = await apiRequest(`/api/dragon-tiger/profiles${suffix}`); - renderHotMoneyProfiles(); - const count = number(state.hotMoneyProfiles.summary?.profile_count); - setStatus(`游资档案已加载 · 共 ${count} 位`); - } catch (error) { - showToast(error.message || "游资档案加载失败"); - setStatus("游资档案加载失败"); - } -} - -function renderHotMoneyProfiles() { - const payload = state.hotMoneyProfiles; - if (!payload) return; - const profiles = payload.profiles || []; - const summary = payload.summary || {}; - const query = state.hotMoneyProfileQuery; - const visible = profiles.filter((profile) => { - if (!query) return true; - return [profile.name, profile.description, ...(profile.organizations || [])] - .join(" ") - .toLocaleLowerCase("zh-CN") - .includes(query); - }); - if (!visible.some((profile) => profile.id === state.selectedHotMoneyProfileId)) { - state.selectedHotMoneyProfileId = visible[0]?.id || ""; - } - const selected = visible.find((profile) => profile.id === state.selectedHotMoneyProfileId) || null; - - setText("dragonDateLabel", `收录 ${number(summary.profile_count)} 位`); - setText("hotMoneyProfileResultCount", query ? `${visible.length} / ${profiles.length} 位` : `${profiles.length} 位`); - document.querySelector("#hotMoneyProfileSummary").innerHTML = [ - ["收录游资", number(summary.profile_count)], - ["已有简介", number(summary.described_count)], - ["关联席位", number(summary.organization_count)], - ].map(([label, value]) => `${label}${value}`).join(""); - - const list = document.querySelector("#hotMoneyProfileList"); - list.innerHTML = visible.length ? visible.map((profile, index) => ` - `).join("") : ` -
    - - ${profiles.length ? "没有符合条件的游资档案" : "游资名录暂不可用"} -
    `; - - const detail = document.querySelector("#hotMoneyProfileDetail"); - if (!selected) { - detail.innerHTML = ` -
    - - ${profiles.length ? "选择一位游资查看档案" : "暂无可展示的游资档案"} -
    `; - } else { - const organizations = selected.organizations || []; - detail.innerHTML = ` -
    - ${escapeHtml(selected.name.slice(0, 2))} -
    - 游资档案 -

    ${escapeHtml(selected.name)}

    - ${organizations.length ? `关联 ${organizations.length} 个公开席位` : "暂无关联席位"} -
    -
    -
    -

    人物简介

    -

    ${escapeHtml(selected.description || "名录暂未收录该游资的公开简介。")}

    -
    -
    -
    -

    关联营业部

    - ${organizations.length} 个 -
    -
    - ${organizations.length ? organizations.map((organization) => ` - ${escapeHtml(organization)} - `).join("") : '

    名录暂未收录关联营业部。

    '} -
    -
    - ${payload.meta?.notice ? `

    ${escapeHtml(payload.meta.notice)}

    ` : ""}`; - } - refreshIcons(); -} - -async function loadDragonTiger(force = false) { - const requestedDate = elements.tradeDate.value; - if ( - !force - && ["success", "empty", "partial", "unavailable"].includes(state.dragonTiger?.meta?.status) - && (state.dragonTiger?.meta?.requested_date || state.dragonTiger?.meta?.trade_date) === requestedDate - ) { - renderDragonTiger(); - return; - } - setStatus("正在加载龙虎榜"); - try { - const query = new URLSearchParams({ trade_date: requestedDate }); - if (force) query.set("force", "1"); - const payload = await apiRequest(`/api/dragon-tiger?${query}`); - state.dragonTiger = payload; - renderDragonTiger(); - const statusLabel = payload.meta.status === "error" - ? "龙虎榜数据暂不可用" - : payload.meta.status === "empty" - ? "当日暂无公开游资明细" - : payload.meta.status === "partial" - ? "当日有龙虎榜,暂无命名游资明细" - : payload.meta.status === "unavailable" ? "龙虎榜数据暂不可用" : "龙虎榜明细"; - setStatus(`${statusLabel} · 龙虎榜已加载`); - } catch (error) { - showToast(error.message || "龙虎榜加载失败"); - setStatus("龙虎榜加载失败"); - } -} - -function renderDragonTiger() { - const payload = state.dragonTiger; - if (!payload) return; - const summary = payload.summary || {}; - if (state.dragonViewMode === "daily") setText("dragonDateLabel", `数据日期 ${payload.meta.trade_date}`); - const status = payload.meta?.status || "empty"; - const hasRecognizedTraders = (payload.traders || []).some((item) => item.identity_type === "trader" && item.recognized !== false); - const showEmptyState = !hasRecognizedTraders - && !(payload.unclassified_seats || []).length - && ["empty", "error", "unavailable"].includes(status); - const dailyVisible = state.dragonViewMode === "daily"; - document.querySelector("#dragonProfilesContent").hidden = dailyVisible; - document.querySelector("#dragonEmptyState").hidden = !dailyVisible || !showEmptyState; - document.querySelector("#dragonDailyContent").hidden = !dailyVisible || showEmptyState; - if (showEmptyState) { - const unavailable = ["error", "unavailable"].includes(status); - setText("dragonEmptyTitle", unavailable ? "龙虎榜数据暂不可用" : `${payload.meta?.trade_date || "该交易日"} 暂无龙虎榜明细`); - setText("dragonEmptyDescription", unavailable - ? "当前数据暂未完成更新,可稍后重新检查或查看前一交易日。" - : "龙虎榜明细通常在交易日盘后陆续披露,可稍后刷新或查看前一交易日。"); - } - document.querySelector("#dragonSummary").innerHTML = [ - ["上榜游资", `${number(summary.trader_count)} 位`, ""], - ["操作明细", `${number(summary.operation_count)} 条`, ""], - ["席位净买入", formatMoneyMillion(summary.seat_net_buy_million), changeClass(summary.seat_net_buy_million)], - ["活跃股票", `${number(summary.active_stock_count)} 只`, ""], - ].map(([label, value, className]) => `
    ${label}${value}
    `).join(""); - - renderDragonTraderList(); - renderUnclassifiedSeats(); -} - -function renderDragonTraderList() { - const payload = state.dragonTiger; - if (!payload) return; - let traders = [...(payload.traders || [])].filter((item) => item.identity_type === "trader" && item.recognized !== false); - if (state.dragonFilter === "buy") traders = traders.filter((item) => number(item.net_buy_million) > 0); - if (state.dragonFilter === "sell") traders = traders.filter((item) => number(item.net_buy_million) < 0); - if (state.dragonFilter === "unclassified") traders = []; - if (state.dragonQuery) { - traders = traders.filter((item) => { - const searchable = [ - item.name, - ...(item.operations || []).flatMap((operation) => [operation.code, operation.name, operation.seat_name]), - ].join(" ").toLowerCase(); - return searchable.includes(state.dragonQuery); - }); - } - - const container = document.querySelector("#dragonTraderList"); - let emptyMessage = "没有符合当前条件的游资操作"; - if (!Array.isArray(payload.traders)) emptyMessage = "龙虎榜数据格式暂不可用,请稍后重试"; - else if (["error", "unavailable"].includes(payload.meta?.status)) emptyMessage = "龙虎榜数据暂不可用,请稍后重试"; - else if (payload.meta?.status === "empty") emptyMessage = "该交易日暂无游资每日明细"; - else if (payload.meta?.status === "partial") emptyMessage = `当日有 ${number(payload.summary?.official_stock_count)} 只股票上榜,但暂无可识别的游资明细`; - if (!traders.some((item) => item.id === state.selectedDragonTraderId)) { - state.selectedDragonTraderId = traders[0]?.id || ""; - } - const cardMarkup = traders.map((trader, index) => { - const description = trader.description || `${number(trader.stock_count)} 只股票,${number(trader.operation_count)} 笔操作`; - return ` - `; - }).join(""); - const hitZoneMarkup = traders.map((trader) => ` - - `).join(""); - container.innerHTML = traders.length - ? `${cardMarkup}
    ${hitZoneMarkup}
    ` - : emptyStateHtml(state.dragonFilter === "unclassified" ? "待归类席位请在下方管理" : emptyMessage, { className: "dragon-empty" }); - container.querySelectorAll("[data-dragon-card]").forEach((card) => { - card.addEventListener("animationend", () => card.classList.remove("dealing"), { once: true }); - }); - container.querySelectorAll("[data-dragon-trader]").forEach((hitZone) => { - const setHovered = (hovered) => { - container.querySelector(`[data-dragon-card="${CSS.escape(hitZone.dataset.dragonTrader)}"]`)?.classList.toggle("hovered", hovered); - }; - hitZone.addEventListener("pointerenter", () => setHovered(true)); - hitZone.addEventListener("pointerleave", () => setHovered(false)); - hitZone.addEventListener("focus", () => setHovered(true)); - hitZone.addEventListener("blur", () => setHovered(false)); - hitZone.addEventListener("click", () => { - state.selectedDragonTraderId = hitZone.dataset.dragonTrader; - container.querySelectorAll("[data-dragon-card]").forEach((card) => { - card.classList.toggle("selected", card.dataset.dragonCard === state.selectedDragonTraderId); - }); - container.querySelectorAll("[data-dragon-trader]").forEach((item) => { - item.setAttribute("aria-pressed", String(item.dataset.dragonTrader === state.selectedDragonTraderId)); - }); - renderDragonTraderDetail(traders.find((item) => item.id === state.selectedDragonTraderId)); - }); - }); - requestAnimationFrame(() => layoutDragonCards(container)); - renderDragonTraderDetail(traders.find((item) => item.id === state.selectedDragonTraderId)); -} - -function layoutDragonCards(container = document.querySelector("#dragonTraderList")) { - if (!container) return; - const cards = [...container.querySelectorAll(".dragon-trader-card")]; - const hitZones = [...container.querySelectorAll(".dragon-card-hit-zone")]; - if (!cards.length) return; - const compact = window.innerWidth <= 720; - const cardWidth = compact ? 148 : 176; - const available = Math.max(cardWidth, container.clientWidth - (compact ? 30 : 72)); - const spread = Math.min(available - cardWidth, compact ? 310 : 1050); - const step = cards.length > 1 ? Math.min(cardWidth + 14, spread / (cards.length - 1)) : 0; - const center = (cards.length - 1) / 2; - container.style.setProperty("--dragon-card-width", `${cardWidth}px`); - cards.forEach((card, index) => { - const x = (index - center) * step; - card.style.setProperty("--card-x", `${x.toFixed(2)}px`); - card.style.setProperty("--card-rotation", "0deg"); - card.style.setProperty("--card-y", "0px"); - card.style.zIndex = String(index + 1); - const hitZone = hitZones[index]; - if (hitZone) { - const zoneWidth = index === cards.length - 1 ? cardWidth : Math.max(18, step); - hitZone.style.left = `calc(50% + ${(x - cardWidth / 2).toFixed(2)}px)`; - hitZone.style.width = `${zoneWidth.toFixed(2)}px`; - } - }); -} - -function renderDragonTraderDetail(trader) { - const container = document.querySelector("#dragonTraderDetail"); - if (!trader) { - container.hidden = true; - renderEmptyState(container, "选择一位游资查看操作明细", { className: "dragon-empty" }); - return; - } - container.hidden = false; - container.innerHTML = ` -
    -
    当日操作明细

    ${escapeHtml(trader.name)}

    ${escapeHtml(trader.description || "按当日公开龙虎榜席位汇总")}

    -
    买入
    ${formatMoneyMillion(trader.buy_million)}
    卖出
    ${formatMoneyMillion(trader.sell_million)}
    净额
    ${formatMoneyMillion(trader.net_buy_million)}
    -
    -
    - - - - ${(trader.operations || []).map((operation, index) => ` - - - - - - - - - - - `).join("")} -
    序号股票方向涨幅(%)买入(百万)卖出(百万)净额(百万)关联席位标签 / 上榜原因
    ${index + 1}${escapeHtml(operation.name)}${escapeHtml(operation.code)}${escapeHtml(operation.direction)}${operation.change == null ? "" : signed(operation.change)}${operation.buy_million == null ? "" : formatNumber(operation.buy_million, 2)}${operation.sell_million == null ? "" : formatNumber(operation.sell_million, 2)}${operation.net_buy_million == null ? "" : signed(operation.net_buy_million)}${escapeHtml(operation.seat_name)}${escapeHtml(operation.tag && operation.tag !== "--" ? operation.tag : operation.reason && operation.reason !== "--" ? operation.reason : "")}
    -
    `; - bindStockRows(container); - markAutoSortableHeaders(container); -} - -function renderUnclassifiedSeats() { - const seats = state.dragonTiger?.unclassified_seats || []; - const canManage = state.user?.role === "admin"; - document.querySelector("#dragonUnclassifiedSection").hidden = !canManage || seats.length === 0; - document.querySelector("#dragonUnclassifiedFilter").hidden = !canManage || seats.length === 0; - if (!seats.length && state.dragonFilter === "unclassified") { - state.dragonFilter = "all"; - document.querySelectorAll("[data-dragon-filter]").forEach((button) => { - button.classList.toggle("active", button.dataset.dragonFilter === "all"); - }); - renderDragonTraderList(); - } - setText("unclassifiedCount", `${seats.length} 个`); - const list = document.querySelector("#unclassifiedSeatList"); - list.innerHTML = seats.map((seat, index) => ` -
    - ${escapeHtml(seat.seat_name)} - ${number(seat.operation_count)} 笔 · ${number(seat.stock_count)} 股 - ${formatMoneyMillion(seat.net_buy_million)} - - -
    - `).join("") || emptyStateHtml("当前席位均已归类"); - list.querySelectorAll(".unclassified-seat-row").forEach((form) => { - form.addEventListener("submit", saveSeatAlias); - }); -} - -function dragonIdentityLabel(type) { - return { trader: "游资", institution: "机构", channel: "通道", unclassified: "待归类" }[type] || "席位"; -} - -async function saveSeatAlias(event) { - event.preventDefault(); - const form = event.currentTarget; - const seat = state.dragonTiger?.unclassified_seats?.[number(form.dataset.unclassifiedIndex)]; - const alias = form.querySelector("input").value.trim(); - if (!seat || !alias) { - showToast("请输入游资名"); - return; - } - const button = form.querySelector("button"); - button.disabled = true; - try { - await apiRequest("/api/seat-aliases", "POST", { seat_name: seat.seat_name, alias }); - state.dragonTiger = null; - await loadDragonTiger(); - showToast(`已将席位归类为 ${alias}`); - } catch (error) { - showToast(error.message); - button.disabled = false; - } -} - -async function loadReviewWorkspace() { - try { - const [watchlistPayload, notesPayload, tradesPayload] = await Promise.all([ - apiRequest(`/api/watchlist?trade_date=${encodeURIComponent(elements.tradeDate.value)}`), - apiRequest("/api/notes?scope=daily"), - apiRequest("/api/trades"), - ]); - state.watchlist = watchlistPayload.items || []; - state.notes = notesPayload.items || []; - state.tradeEntries = tradesPayload.items || []; - state.tradeSummary = tradesPayload.summary || {}; - setText("reviewDataDate", displayCompactDate(elements.tradeDate.value)); - renderWatchlist(); - renderNotesHistory(state.notes, document.querySelector("#notesHistory"), false); - setText("notesCount", `${state.notes.length} 条`); - renderTradeLog(); - populateJournalForm(); - } catch (error) { - showToast(error.message || "我的复盘加载失败"); - } -} - -function renderWatchlist() { - setText("watchlistCount", `${state.watchlist.length} 只`); - const body = document.querySelector("#watchlistTableBody"); - body.innerHTML = state.watchlist.map((item) => ` - - ${escapeHtml(item.name)}${escapeHtml(item.code)} - ${escapeHtml(item.sector || "其他")} - ${formatWatchMetric(item.change)} - ${formatWatchMetric(item.return_5d)} - ${item.attention_score == null ? "" : formatNumber(item.attention_score, 1)} - ${escapeHtml(item.remark || "尚未填写")} - - - `).join(""); - document.querySelector("#watchlistEmpty").hidden = state.watchlist.length > 0; - body.querySelectorAll("[data-watch-remark]").forEach((button) => { - button.addEventListener("click", () => { - const item = state.watchlist.find((row) => row.code === button.dataset.watchRemark); - openWatchlistDialog(item); - }); - }); - body.querySelectorAll("[data-watch-delete]").forEach((button) => { - button.addEventListener("click", () => removeWatchlist(button.dataset.watchDelete)); - }); - bindStockRows(body); -} - -function formatWatchMetric(value) { - if (value == null || !Number.isFinite(Number(value))) return ""; - return signed(value); -} - -function openWatchlistDialog(item = null) { - clearTimeout(watchlistSearchTimer); - state.watchlistSelection = item ? { - code: item.code, - name: item.name, - sector: item.sector || "其他", - color: item.color || "red", - } : null; - state.watchlistSearchResults = []; - setText("watchlistDialogTitle", item ? "编辑跟踪备注" : "添加自选"); - document.querySelector("#watchlistRemark").value = item?.remark || ""; - document.querySelector("#watchlistSearchInput").value = ""; - document.querySelector("#watchlistSearchResults").innerHTML = ""; - syncWatchlistSelection(Boolean(item)); - openModalDialog(elements.watchlistDialog); - requestAnimationFrame(() => (item ? document.querySelector("#watchlistRemark") : document.querySelector("#watchlistSearchInput")).focus()); -} - -function closeWatchlistDialog() { - clearTimeout(watchlistSearchTimer); - if (elements.watchlistDialog.open) elements.watchlistDialog.close(); -} - -function clearWatchlistSelection() { - state.watchlistSelection = null; - syncWatchlistSelection(false); - document.querySelector("#watchlistSearchInput").focus(); -} - -function syncWatchlistSelection(editing = false) { - const item = state.watchlistSelection; - document.querySelector("#watchlistSearchField").hidden = Boolean(item); - document.querySelector("#watchlistSelection").hidden = !item; - document.querySelector("#changeWatchlistSelection").hidden = editing; - document.querySelector("#saveWatchlist").disabled = !item; - if (!item) return; - setText("watchlistSelectionName", item.name || "--"); - setText("watchlistSelectionCode", item.code || "--"); - setText("watchlistSelectionSector", item.sector || "其他"); - refreshIcons(); -} - -function scheduleWatchlistSearch() { - clearTimeout(watchlistSearchTimer); - const query = document.querySelector("#watchlistSearchInput").value.trim(); - if (!query) { - document.querySelector("#watchlistSearchResults").innerHTML = ""; - return; - } - document.querySelector("#watchlistSearchResults").innerHTML = '
    正在查找股票
    '; - watchlistSearchTimer = setTimeout(() => runWatchlistSearch(query), 160); -} - -async function runWatchlistSearch(query) { - const sequence = ++state.watchlistSearchRequestSequence; - try { - const params = new URLSearchParams({ q: query, trade_date: elements.tradeDate.value }); - const payload = await apiRequest(`/api/search?${params}`); - if (sequence !== state.watchlistSearchRequestSequence) return; - state.watchlistSearchResults = payload.groups?.stocks || []; - document.querySelector("#watchlistSearchResults").innerHTML = state.watchlistSearchResults.map((item, index) => ` - - `).join("") || '
    没有找到匹配的股票
    '; - } catch (error) { - document.querySelector("#watchlistSearchResults").innerHTML = `
    ${escapeHtml(error.message || "搜索失败")}
    `; - } -} - -function handleWatchlistSearchResult(event) { - const button = event.target.closest("[data-watchlist-result]"); - if (!button) return; - const item = state.watchlistSearchResults[number(button.dataset.watchlistResult)]; - if (!item) return; - state.watchlistSelection = { - code: item.code, - name: item.name, - sector: item.industry || "其他", - color: "red", - }; - syncWatchlistSelection(false); -} - -async function saveWatchlistFromDialog(event) { - event.preventDefault(); - const item = state.watchlistSelection; - if (!item) return; - const button = document.querySelector("#saveWatchlist"); - button.disabled = true; - try { - await apiRequest("/api/watchlist", "POST", { - code: item.code, - name: item.name, - sector: item.sector || "其他", - color: item.color || "red", - remark: document.querySelector("#watchlistRemark").value.trim(), - }); - closeWatchlistDialog(); - await loadReviewWorkspace(); - showToast(state.watchlist.some((row) => row.code === item.code) ? "自选跟踪已保存" : "已加入自选"); - } catch (error) { - showToast(error.message || "自选保存失败"); - button.disabled = false; - } -} - -async function toggleActiveWatchlist() { - const stock = state.activeStock; - if (!stock?.code) return; - const isWatched = Boolean(state.stockDetail?.stock?.watchlist || state.watchlist.some((item) => item.code === stock.code)); - try { - if (isWatched) { - await apiRequest(`/api/watchlist/${stock.code}`, "DELETE"); - state.watchlist = state.watchlist.filter((item) => item.code !== stock.code); - if (state.stockDetail?.stock) state.stockDetail.stock.watchlist = null; - showToast("已移出自选"); - } else { - const payload = await apiRequest("/api/watchlist", "POST", { - code: stock.code, - name: stock.name || "--", - sector: stock.sector || "其他", - color: "red", - }); - state.watchlist = payload.items || state.watchlist; - if (state.stockDetail?.stock) state.stockDetail.stock.watchlist = state.watchlist.find((item) => item.code === stock.code); - showToast("已加入自选"); - } - updateWatchButton(); - renderWatchlist(); - } catch (error) { - showToast(error.message); - } -} - -function updateWatchButton() { - const code = state.activeStock?.code; - const watched = Boolean(state.stockDetail?.stock?.watchlist || state.watchlist.some((item) => item.code === code)); - setText("watchStockButton", watched ? "移出自选" : "加入自选"); -} - -async function removeWatchlist(code) { - try { - await apiRequest(`/api/watchlist/${code}`, "DELETE"); - state.watchlist = state.watchlist.filter((item) => item.code !== code); - renderWatchlist(); - showToast("已移出自选"); - } catch (error) { - showToast(error.message); - } -} - -async function saveJournal(event) { - event.preventDefault(); - try { - await apiRequest("/api/notes", "POST", { - trade_date: document.querySelector("#journalDate").value, - id: state.editingDailyNoteId || undefined, - summary: document.querySelector("#journalSummary").value, - content: document.querySelector("#journalContent").value, - plan: document.querySelector("#journalPlan").value, - }); - await loadReviewWorkspace(); - showToast("每日复盘已保存"); - } catch (error) { - showToast(error.message); - } -} - -function populateJournalForm() { - const selectedDate = document.querySelector("#journalDate").value.replaceAll("-", ""); - const note = state.notes.find((item) => String(item.trade_date).replaceAll("-", "") === selectedDate); - state.editingDailyNoteId = number(note?.id); - document.querySelector("#journalSummary").value = note?.summary || ""; - document.querySelector("#journalContent").value = note?.content || ""; - document.querySelector("#journalPlan").value = note?.plan || ""; -} - -function openTradeLogDialog() { - resetTradeLogForm(); - openModalDialog(elements.tradeLogDialog); - requestAnimationFrame(() => document.querySelector("#tradeLogCode").focus()); -} - -function closeTradeLogDialog() { - if (elements.tradeLogDialog.open) elements.tradeLogDialog.close(); - else resetTradeLogForm(); -} - -async function saveTradeLog(event) { - event.preventDefault(); - const button = document.querySelector("#saveTradeLog"); - button.disabled = true; - try { - const payload = await apiRequest("/api/trades", "POST", { - id: state.editingTradeId || undefined, - trade_date: document.querySelector("#tradeLogDate").value, - code: document.querySelector("#tradeLogCode").value.trim(), - name: document.querySelector("#tradeLogName").value.trim(), - action: document.querySelector("#tradeLogAction").value, - price: document.querySelector("#tradeLogPrice").value, - quantity: document.querySelector("#tradeLogQuantity").value, - position_pct: document.querySelector("#tradeLogPosition").value, - pnl_amount: document.querySelector("#tradeLogPnlAmount").value, - pnl_pct: document.querySelector("#tradeLogPnlPct").value, - emotion: document.querySelector("#tradeLogEmotion").value, - tags: document.querySelector("#tradeLogTags").value, - thesis: document.querySelector("#tradeLogThesis").value, - execution: document.querySelector("#tradeLogExecution").value, - }); - state.tradeEntries = payload.items || []; - state.tradeSummary = payload.summary || {}; - renderTradeLog(); - closeTradeLogDialog(); - showToast("交易记录已保存"); - } catch (error) { - showToast(error.message || "交易记录保存失败"); - } finally { - button.disabled = false; - } -} - -function resetTradeLogForm() { - state.editingTradeId = 0; - document.querySelector("#tradeLogForm").reset(); - document.querySelector("#tradeLogDate").value = elements.tradeDate.value || todayString(); - document.querySelector("#tradeLogQuantity").value = "0"; - document.querySelector("#tradeLogPosition").value = "0"; - setText("tradeLogDialogTitle", "交易日志"); - setText("saveTradeLog", "保存交易"); -} - -function editTradeLog(id) { - const item = state.tradeEntries.find((entry) => number(entry.id) === id); - if (!item) return; - state.editingTradeId = id; - document.querySelector("#tradeLogDate").value = displayCompactDate(item.trade_date); - document.querySelector("#tradeLogCode").value = item.code; - document.querySelector("#tradeLogName").value = item.name; - document.querySelector("#tradeLogAction").value = item.action; - document.querySelector("#tradeLogPrice").value = item.price; - document.querySelector("#tradeLogQuantity").value = item.quantity; - document.querySelector("#tradeLogPosition").value = item.position_pct; - document.querySelector("#tradeLogPnlAmount").value = item.pnl_amount ?? ""; - document.querySelector("#tradeLogPnlPct").value = item.pnl_pct ?? ""; - document.querySelector("#tradeLogEmotion").value = item.emotion; - document.querySelector("#tradeLogTags").value = (item.tags || []).join(", "); - document.querySelector("#tradeLogThesis").value = item.thesis || ""; - document.querySelector("#tradeLogExecution").value = item.execution || ""; - setText("tradeLogDialogTitle", "编辑交易日志"); - setText("saveTradeLog", "保存修改"); - openModalDialog(elements.tradeLogDialog); - requestAnimationFrame(() => document.querySelector("#tradeLogCode").focus()); -} - -async function handleTradeLogAction(event) { - const button = event.target.closest("[data-trade-action]"); - if (!button) return; - const id = number(button.dataset.tradeId); - if (button.dataset.tradeAction === "edit") { - editTradeLog(id); - return; - } - if (!window.confirm("确定删除这条交易记录吗?")) return; - try { - const payload = await apiRequest(`/api/trades/${id}`, "DELETE"); - state.tradeEntries = payload.items || []; - state.tradeSummary = payload.summary || {}; - if (state.editingTradeId === id) resetTradeLogForm(); - renderTradeLog(); - showToast("交易记录已删除"); - } catch (error) { - showToast(error.message || "交易记录删除失败"); - } -} - -function renderTradeLog() { - const summary = state.tradeSummary || {}; - setText("tradeLogCount", `${state.tradeEntries.length} 条`); - document.querySelector("#tradeLogSummary").innerHTML = [ - ["记录", `${number(summary.total)} 条`], - ["已实现", `${number(summary.realized)} 条`], - ["胜率", summary.win_rate == null ? "--" : `${formatNumber(summary.win_rate, 1)}%`], - ["累计盈亏", summary.pnl_amount == null ? "--" : `${number(summary.pnl_amount) > 0 ? "+" : ""}${formatNumber(summary.pnl_amount, 2)}`], - ["平均仓位", summary.average_position == null ? "--" : `${formatNumber(summary.average_position, 1)}%`], - ].map(([label, value]) => `
    ${label}${value}
    `).join(""); - document.querySelector("#tradeLogEmpty").hidden = state.tradeEntries.length > 0; - document.querySelector("#tradeLogTableBody").innerHTML = state.tradeEntries.map((item) => ` - - ${displayCompactDate(item.trade_date)} - ${escapeHtml(item.name)}${escapeHtml(item.code)} - ${escapeHtml(item.action_label)} - ${item.position_pct == null ? "" : formatNumber(item.position_pct, 1)} - ${item.pnl_pct == null ? "" : signed(item.pnl_pct)} - ${item.pnl_amount == null ? "" : signed(item.pnl_amount)} - ${escapeHtml(item.emotion_label)}
    ${(item.tags || []).map((tag) => `${escapeHtml(tag)}`).join("")}
    - ${escapeHtml(item.thesis || "")}${escapeHtml(item.execution || "尚未填写执行复核")} -
    - - `).join(""); - bindStockRows(document.querySelector("#tradeLogTableBody")); -} - -async function saveStockNote(event) { - event.preventDefault(); - if (!state.activeStock?.code) return; - try { - await apiRequest("/api/notes", "POST", { - code: state.activeStock.code, - stock_name: state.activeStock.name || "--", - trade_date: elements.tradeDate.value, - content: document.querySelector("#stockNoteContent").value, - plan: document.querySelector("#stockNotePlan").value, - }); - document.querySelector("#stockNoteContent").value = ""; - document.querySelector("#stockNotePlan").value = ""; - const payload = await apiRequest(`/api/notes?scope=stock&code=${encodeURIComponent(state.activeStock.code)}`); - state.stockDetail.notes = payload.items || []; - renderStockNotes(state.stockDetail.notes); - showToast("个股笔记已保存"); - } catch (error) { - showToast(error.message); - } -} - -async function saveReasonOverride(event) { - event.preventDefault(); - if (!state.activeStock?.code) return; - const reason = document.querySelector("#reasonInput").value.trim(); - try { - await apiRequest("/api/reasons", "POST", { - trade_date: elements.tradeDate.value, - code: state.activeStock.code, - reason, - }); - state.activeStock.reason = reason; - for (const key of ["limits", "broken", "down_limits"]) { - const row = state.dashboard?.[key]?.find((item) => item.code === state.activeStock.code); - if (row) row.reason = reason; - } - setText("detailReason", reason); - renderDashboard(); - showToast("事件逻辑已修订"); - } catch (error) { - showToast(error.message); - } -} - -function renderMoneyflow(flow) { - for (const [id, value] of [["flowNet", flow.net_million], ["flowLarge", flow.large_million], ["flowMedium", flow.medium_million], ["flowSmall", flow.small_million]]) { - const element = document.getElementById(id); - element.textContent = formatMoneyMillion(value); - element.className = changeClass(value); - } -} - -function renderStockNotes(notes) { - renderNotesHistory(notes, document.querySelector("#stockNotes"), true); -} - -function renderNotesHistory(notes, container, compact) { - container.innerHTML = notes.map((note) => ` -
    -
    ${note.stock_name ? `${escapeHtml(note.stock_name)}` : ""}
    - ${!compact ? `
    盘面

    ${escapeHtml(note.summary || "--")}

    ` : ""} -
    复盘

    ${escapeHtml(note.content || "--")}

    -
    计划

    ${escapeHtml(note.plan || "--")}

    - -
    - `).join("") || emptyStateHtml("暂无复盘记录"); - container.querySelectorAll("[data-note-delete]").forEach((button) => { - button.addEventListener("click", () => deleteNote(number(button.dataset.noteDelete), compact)); - }); -} - -async function deleteNote(noteId, compact) { - try { - await apiRequest(`/api/notes/${noteId}`, "DELETE"); - if (compact && state.activeStock) { - state.stockDetail.notes = state.stockDetail.notes.filter((note) => number(note.id) !== noteId); - renderStockNotes(state.stockDetail.notes); - } else { - await loadReviewWorkspace(); - } - showToast("笔记已删除"); - } catch (error) { - showToast(error.message); - } -} - -async function backfillData() { - const button = document.querySelector("#backfillButton"); - button.disabled = true; - setLoading(true, "正在回补历史交易日"); - try { - const payload = await apiRequest("/api/backfill", "POST", { - start_date: document.querySelector("#backfillStart").value, - end_date: document.querySelector("#backfillEnd").value, - }); - showToast(`历史回补完成,共处理 ${payload.results.length} 个工作日`); - await openAdminSettings(true); - } catch (error) { - showToast(error.message); - } finally { - setLoading(false); - button.disabled = false; - } -} - -function screenerStrategyKey(strategyId, strategyName) { - return strategyId != null && strategyId !== 0 ? `id:${strategyId}` : `name:${strategyName || ""}`; -} - -function currentScreenerStrategy(mode) { - if (mode === "curated") return activeCuratedStrategy(); - if (mode === "smart") return state.selectedStrategy; - return null; -} - -function screenerResultContext(mode, result, { regime, strategyId = null, strategyName = "" } = {}) { - const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; - return { - mode: normalizedMode, - regime: regime || result?.meta?.regime || state.selectedRegime, - strategyName: strategyName || result?.meta?.strategy_name || "", - strategyKey: screenerStrategyKey( - strategyId, - strategyName || result?.meta?.strategy_name || "", - ), - }; -} - -function screenerResultKey(context) { - if (!context) return ""; - if (context.mode === "quant") return "quant"; - if (context.mode === "curated") return JSON.stringify(["curated", context.strategyKey]); - return JSON.stringify(["smart", context.regime, context.strategyKey]); -} - -function selectedScreenerResultKey(mode) { - const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; - if (normalizedMode === "quant") return "quant"; - const strategy = currentScreenerStrategy(mode); - if (!strategy) return ""; - return screenerResultKey(screenerResultContext(normalizedMode, null, { - regime: state.selectedRegime, - strategyId: strategy.id, - strategyName: strategy.name, - })); -} - -function activeScreenerResultEntry(mode = state.screenerMode) { - const key = selectedScreenerResultKey(mode); - return key ? state.screenerResultStore[key] || null : null; -} - -function screenerResultMatchesSelection(mode) { - return Boolean(activeScreenerResultEntry(mode)); -} - -function activeScreenerResult(mode = state.screenerMode) { - return activeScreenerResultEntry(mode)?.result || null; -} - -function activeScreenerResultContext(mode = state.screenerMode) { - return activeScreenerResultEntry(mode)?.context || null; -} - -function storeScreenerResult( - mode, - result, - { regime, strategyId = null, strategyName = "" } = {}, - updateLatest = true, -) { - const normalizedMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; - const context = result - ? screenerResultContext(normalizedMode, result, { regime, strategyId, strategyName }) - : null; - const key = screenerResultKey(context); - if (key && result) state.screenerResultStore[key] = { result, context }; - if (updateLatest) { - state.screenerResults[normalizedMode] = result || null; - state.screenerResultContexts[normalizedMode] = context; - } -} - -function setScreenerResult(mode, result, options = {}) { - storeScreenerResult(mode, result, options, true); -} - -function applyScreenerSetup(payload, requestKey) { - const dateChanged = Boolean(state.screenerSetupKey && state.screenerSetupKey !== requestKey); - if (dateChanged) { - state.screenerResults = { smart: null, curated: null, quant: null }; - state.screenerResultContexts = { smart: null, curated: null, quant: null }; - state.screenerResultStore = {}; - } - state.screenerSetup = payload; - state.screenerSetupKey = requestKey; - - const latestResults = { ...(payload.latest_results || {}) }; - if (!latestResults.smart && payload.latest_result) latestResults.smart = payload.latest_result; - const smartLatestMeta = latestResults.smart?.meta || {}; - const curatedLatestMeta = latestResults.curated?.meta || {}; - state.selectedRegime = payload.regime.id; - - const selectedId = state.selectedStrategy?.id; - const smartStrategies = payload.strategies.filter((item) => item.formula?.meta?.library !== "curated"); - const curatedStrategies = payload.strategies.filter((item) => item.formula?.meta?.library === "curated"); - const latestSmartStrategy = smartStrategies.find((item) => item.name === smartLatestMeta.strategy_name); - state.selectedStrategy = smartStrategies.find((item) => item.id === selectedId) - || latestSmartStrategy - || smartStrategies.find((item) => item.regimes.includes(state.selectedRegime)) - || smartStrategies[0] - || null; - - if (!curatedStrategies.some((item) => item.id === state.selectedCuratedStrategyId) || dateChanged) { - state.selectedCuratedStrategyId = curatedStrategies.find( - (item) => item.name === curatedLatestMeta.strategy_name, - )?.id || curatedStrategies[0]?.id || 0; - } - - for (const result of [...(payload.recent_results || [])].reverse()) { - const mode = ["smart", "curated", "quant"].includes(result.meta?.mode) - ? result.meta.mode - : "smart"; - const strategies = mode === "curated" ? curatedStrategies : smartStrategies; - const strategy = strategies.find((item) => item.name === result.meta?.strategy_name); - storeScreenerResult(mode, result, { - regime: result.meta?.regime || payload.regime.id, - strategyId: strategy?.id, - strategyName: result.meta?.strategy_name || strategy?.name || "", - }, false); - } - - for (const mode of ["smart", "curated", "quant"]) { - if (state.screenerResults[mode] || !latestResults[mode]) continue; - const result = latestResults[mode]; - const meta = result.meta || {}; - const strategy = mode === "curated" - ? curatedStrategies.find((item) => item.name === meta.strategy_name) - : mode === "smart" - ? smartStrategies.find((item) => item.name === meta.strategy_name) - : null; - setScreenerResult(mode, result, { - regime: meta.regime || payload.regime.id, - strategyId: strategy?.id, - strategyName: meta.strategy_name || strategy?.name || "", - }); - } - if (!state.quantScores.length) resetQuantBuilder(false); - renderScreenerSetup(); - renderScreenerResult(); -} - -async function loadScreenerSetup(force = false) { - const requestKey = elements.tradeDate.value.replaceAll("-", ""); - if (!force && state.screenerSetup && state.screenerSetupKey === requestKey) { - renderScreenerSetup(); - renderScreenerResult(); - return state.screenerSetup; - } - if (!force && state.screenerSetupPromise && state.screenerSetupRequestKey === requestKey) { - return state.screenerSetupPromise; - } - const request = (async () => { - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - const payload = await apiRequest(`/api/screener/setup?${query}`); - applyScreenerSetup(payload, requestKey); - await loadScreenerTracking(); - return payload; - } catch (error) { - showToast(error.message || "选股配置加载失败"); - return null; - } finally { - if (state.screenerSetupPromise === request) { - state.screenerSetupPromise = null; - state.screenerSetupRequestKey = ""; - } - } - })(); - state.screenerSetupRequestKey = requestKey; - state.screenerSetupPromise = request; - return request; -} - -function renderScreenerSetup() { - const setup = state.screenerSetup; - if (!setup) return; - setText("screenerDateLabel", `数据日期 ${displayCompactDate(setup.trade_date)}`); - setText("regimeLabel", setup.regime.label); - setText("regimeConfidence", `置信度 ${formatNumber(setup.regime.confidence, 0)}%`); - setText("regimeStepStatus", `${setup.regime.label} · 置信度 ${formatNumber(setup.regime.confidence, 0)}%`); - setText("regimeReason", setup.regime.reason); - const evidence = (setup.regime.evidence || []).filter(Boolean); - if (!evidence.some((item) => String(item).includes("情绪温度"))) { - const temperature = formatNumber(state.dashboard?.overview?.sentiment_score, 0); - const direction = state.dashboard?.overview?.sentiment_direction; - evidence.unshift(`情绪温度 ${temperature}${direction ? `,较前一交易日${direction}` : ""}`); - } - document.querySelector("#regimeEvidenceList").textContent = evidence.join(" · "); - setText("factorDateCount", `${number(setup.factor_data.date_count)} 日`); - setText("factorDateRange", setup.factor_data.ready - ? `${displayCompactDate(setup.factor_data.start_date)} 至 ${displayCompactDate(setup.factor_data.end_date)} · 竞价 ${number(setup.factor_data.auction_date_count)} 日` - : "尚未达到 21 个交易日"); - setText("factorTaskStatus", setup.factor_data.ready ? `已就绪 · ${number(setup.factor_data.date_count)} 日` : "需要同步"); - setText("compilerStatus", "策略生成已就绪"); - setText( - "screenerRunStatus", - activeScreenerResult("smart") ? `已有结果 · ${(activeScreenerResult("smart").candidates || []).length} 只` : "等待执行", - ); - setText("strategyCount", `${setup.strategies.filter((item) => item.formula?.meta?.library !== "curated").length} 套`); - updateBacktestTaskStatus(); - selectScreenerMobileView(state.screenerMobileView); - - const selector = document.querySelector("#regimeSelector"); - selector.innerHTML = setup.regimes.map((item) => ` - ${escapeHtml(item.label)} - `).join(""); - renderStrategyList(); - renderStrategySummary(); - renderScreenerMode(); - renderCuratedStrategyLibrary(); - renderQuantBuilder(); - renderScreenerProgress(); -} - -function renderStrategySummary() { - const strategy = state.selectedStrategy; - setText("activeStrategyHeading", strategy?.name || "--"); - setText("activeStrategyEditorHeading", strategy?.name || "--"); - setText("activeStrategyDescription", strategy?.description || "等待匹配当前市场阶段的策略。"); - setText("strategyStepStatus", strategy?.name || "等待匹配"); - document.querySelector("#activeStrategyRegimes").innerHTML = strategy - ? `${strategy.regimes.map((item) => `${escapeHtml(regimeLabel(item))}`).join("")}${strategy.builtin ? "内置" : "自定义"}` - : ""; -} - -function selectScreenerMode(mode) { - state.screenerMode = ["smart", "curated", "quant"].includes(mode) ? mode : "smart"; - localStorage.setItem("xiaobaiScreenerMode", state.screenerMode); - state.screenerMobileView = "strategy"; - renderScreenerMode(); - selectScreenerMobileView("strategy"); -} - -function renderScreenerMode() { - const mode = state.screenerMode || "smart"; - document.querySelectorAll("[data-screener-mode]").forEach((button) => { - const active = button.dataset.screenerMode === mode; - button.classList.toggle("active", active); - button.setAttribute("aria-selected", String(active)); - }); - document.querySelectorAll("[data-screener-panel]").forEach((panel) => { - panel.hidden = panel.dataset.screenerPanel !== mode; - }); - const results = document.querySelector("#screenerView .screener-results-view"); - const resultsSlot = document.querySelector(`[data-screener-results-slot="${mode}"]`); - if (results && resultsSlot && results.parentElement !== resultsSlot) resultsSlot.append(results); - const titles = { smart: "盘后候选结果", curated: "策略候选结果", quant: "自定义选股结果" }; - setText("screenerResultTitle", titles[mode]); - renderScreenerResult(); -} - -function curatedStrategies() { - return (state.screenerSetup?.strategies || []).filter((item) => item.formula?.meta?.library === "curated"); -} - -function activeCuratedStrategy() { - const strategies = curatedStrategies(); - return strategies.find((item) => item.id === state.selectedCuratedStrategyId) || strategies[0] || null; -} - -function curatedStrategySchool(strategy) { - const category = String(strategy?.formula?.meta?.category || ""); - if (["红利价值", "质量价值", "现金流价值", "成长质量", "小盘质量"].includes(category)) return "基本面"; - if (["行业轮动", "形态突破", "趋势追踪"].includes(category)) return "趋势"; - if (["短线竞价", "连板接力", "低吸反核"].includes(category)) return "短线"; - if (["动量反转"].includes(category)) return "动量"; - if (["元策略", "多因子"].includes(category)) return "量化"; - if (["业绩事件", "热度观察"].includes(category)) return "事件"; - if (["资金席位"].includes(category)) return "资金"; - if (/红利|价值|质量|成长|财务|现金流/.test(category)) return "基本面"; - if (/趋势|轮动|突破/.test(category)) return "趋势"; - if (/竞价|连板|龙头|反核|首阴|反包|打板/.test(category)) return "短线"; - if (/动量|反转/.test(category)) return "动量"; - if (/因子|量化|元策略/.test(category)) return "量化"; - if (/事件|热度|公告|业绩/.test(category)) return "事件"; - if (/席位|资金/.test(category)) return "资金"; - return "其他"; -} - -function curatedSchoolIcon(school) { - return { - 基本面: "circle-dollar-sign", 趋势: "trending-up", 短线: "zap", - 动量: "refresh-cw", 量化: "binary", 事件: "calendar-clock", 资金: "landmark", 其他: "boxes", - }[school] || "boxes"; -} - -function curatedStrategyRunState(strategy, result) { - const missingData = strategy?.missing_data || []; - if (!strategy?.data_ready || missingData.length) { - return { label: "数据不足", className: "missing", verifiedEmpty: false }; - } - if (!result) return { label: "等待盘后", className: "pending", verifiedEmpty: false }; - const count = (result.candidates || []).length; - if (count) return { label: `${count} 只候选`, className: "ready", verifiedEmpty: false }; - return { label: "暂无信号", className: "quiet", verifiedEmpty: true }; -} - -function renderCuratedStrategyLibrary() { - if (!state.screenerSetup) return; - const strategies = curatedStrategies(); - const categories = ["全部", ...new Set(strategies.map((item) => item.formula?.meta?.category || "其他"))]; - const schools = ["全部", "基本面", "趋势", "短线", "动量", "量化", "事件", "资金"]; - if (!categories.includes(state.curatedCategory)) state.curatedCategory = "全部"; - if (!schools.includes(state.curatedSchool)) state.curatedSchool = "全部"; - setText("curatedStrategyCount", `${strategies.length} 套`); - const categorySelect = document.querySelector("#curatedCategoryFilter"); - categorySelect.innerHTML = categories.map((category) => ` - - `).join(""); - document.querySelector("#curatedSchoolFilters").innerHTML = schools.map((school) => { - const count = school === "全部" ? strategies.length : strategies.filter((item) => curatedStrategySchool(item) === school).length; - return ``; - }).join(""); - document.querySelectorAll("[data-curated-view]").forEach((button) => { - const active = button.dataset.curatedView === state.curatedViewMode; - button.classList.toggle("active", active); - button.setAttribute("aria-pressed", String(active)); - }); - const query = state.curatedQuery; - const visible = strategies.filter((item) => { - const meta = item.formula?.meta || {}; - const categoryMatch = state.curatedCategory === "全部" || meta.category === state.curatedCategory; - const school = curatedStrategySchool(item); - const schoolMatch = state.curatedSchool === "全部" || school === state.curatedSchool; - const queryMatch = !query || `${item.name} ${item.description} ${meta.category} ${school} ${meta.suitable_environment} ${meta.failure_risk}`.toLocaleLowerCase("zh-CN").includes(query); - return categoryMatch && schoolMatch && queryMatch; - }); - const list = document.querySelector("#curatedStrategyList"); - list.classList.toggle("is-grid", state.curatedViewMode === "grid"); - list.innerHTML = visible.length ? visible.map((strategy) => { - const meta = strategy.formula?.meta || {}; - const school = curatedStrategySchool(strategy); - const rank = strategies.findIndex((item) => item.id === strategy.id) + 1; - const resultKey = screenerResultKey(screenerResultContext("curated", null, { - regime: strategy.regimes[0] || state.selectedRegime, - strategyId: strategy.id, - strategyName: strategy.name, - })); - const result = state.screenerResultStore[resultKey]?.result; - const runState = curatedStrategyRunState(strategy, result); - return `
    - - ${String(rank).padStart(2, "0")}${escapeHtml(strategy.name)}${escapeHtml(school)} · ${escapeHtml(meta.category || "策略")}${escapeHtml(runState.label)} - ${escapeHtml(meta.quality || "--")}${escapeHtml(meta.frequency || "--")}风险 ${escapeHtml(meta.risk || "--")} -
    `; - }).join("") : emptyStateHtml("没有符合条件的策略"); - renderCuratedStrategyDetail(); -} - -function renderCuratedStrategyDetail() { - const strategy = activeCuratedStrategy(); - if (!strategy) return; - const formula = strategy.formula || {}; - const meta = formula.meta || {}; - const result = activeScreenerResult("curated"); - const resultMeta = result?.meta || {}; - const health = resultMeta.health || {}; - const runState = curatedStrategyRunState(strategy, result); - setText("curatedStrategyCategory", meta.category || "精选策略"); - setText("curatedStrategyName", strategy.name); - setText("curatedStrategyDescription", strategy.description); - document.querySelector("#curatedStrategyBadges").innerHTML = [ - `质量 ${meta.quality || "--"}`, meta.frequency || "--", `风险 ${meta.risk || "--"}`, - meta.data_group || "行情因子", - ].map((value) => `${escapeHtml(value)}`).join(""); - setText("curatedSuitableEnvironment", meta.suitable_environment || "以策略条件为准"); - setText("curatedFailureRisk", meta.failure_risk || "策略可能随市场结构变化而失效"); - const filters = formula.filters || []; - setText("curatedFilterCount", `${filters.length} 项`); - document.querySelector("#curatedFilterList").innerHTML = filters.map((item) => ` -
    ${escapeHtml(factorLabel(item.field))}${escapeHtml(formatRuleValue(item))}
    - `).join(""); - const scores = formula.score || []; - const total = scores.reduce((sum, item) => sum + number(item.weight), 0) || 1; - setText("curatedWeightTotal", `${formatNumber(total * 100, 0)}%`); - document.querySelector("#curatedScoreList").innerHTML = scores.map((item) => { - const percent = number(item.weight) / total * 100; - return `
    ${escapeHtml(factorLabel(item.field))}${formatNumber(percent, 0)}%
    `; - }).join(""); - const candidateCount = (result?.candidates || []).length; - const statusLabel = runState.className === "ready" ? "运行正常" : runState.label; - const statusClass = runState.className; - let updatedLabel = "--"; - if (resultMeta.updated_at) { - const updated = new Date(resultMeta.updated_at); - if (!Number.isNaN(updated.getTime())) { - updatedLabel = `${String(updated.getMonth() + 1).padStart(2, "0")}-${String(updated.getDate()).padStart(2, "0")} ${updated.toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", hour12: false })}`; - } - } - document.querySelector("#curatedHealthMetrics").innerHTML = [ - ["运行状态", statusLabel, statusClass], - ["当日信号", result ? `${candidateCount} 只` : "--", ""], - ["字段覆盖", health.coverage != null ? `${formatNumber(health.coverage, 1)}%` : strategy.data_ready ? "数据已就绪" : "--", ""], - ["最近更新", updatedLabel, ""], - ].map(([label, value, className]) => `
    ${escapeHtml(label)}${escapeHtml(value)}
    `).join(""); - const status = document.querySelector("#curatedDataStatus"); - status.classList.toggle("missing", statusClass === "missing"); - status.innerHTML = strategy.data_ready - ? `${runState.verifiedEmpty ? "本日暂无信号" : "盘后自动更新"}${runState.verifiedEmpty ? `必需数据已完整,本日没有股票同时满足 ${filters.length} 项准入条件` : result ? health.required_field_count != null ? `已核验 ${number(health.required_field_count)} 项因子 · ${number(health.complete_rows)} 只股票` : "盘后定格结果已载入" : "等待当日行情定格后生成"}` - : `数据尚未完备${escapeHtml((strategy.missing_data || []).join("、") || "等待后台同步")}`; - refreshIcons(); -} - -function factorLabel(field) { - return state.screenerSetup?.factor_fields?.find((item) => item.id === field)?.label || field; -} - -function formatRuleValue(item) { - const operator = { between: "介于", ">=": "不低于", "<=": "不高于", ">": "高于", "<": "低于", "==": "等于" }[item.op] || item.op; - const value = Array.isArray(item.value) ? item.value.join(" ~ ") : item.value; - return `${operator} ${value}`; -} - -function groupedFactorOptions(selected = "") { - return (state.screenerSetup?.factor_groups || []).map((group) => ` - ${group.fields.map((field) => ``).join("")} - `).join(""); -} - -function quantId() { - return `${Date.now()}-${Math.random().toString(16).slice(2)}`; -} - -function resetQuantBuilder(render = true) { - state.quantFilters = [ - { id: quantId(), field: "amount_billion", op: ">=", value: "1" }, - { id: quantId(), field: "above_ma20", op: "==", value: "1" }, - ]; - state.quantScores = [ - { id: quantId(), field: "relative_strength", weight: 30, direction: "desc" }, - { id: quantId(), field: "sector_strength", weight: 25, direction: "desc" }, - { id: quantId(), field: "volume_ratio_5d", weight: 20, direction: "desc" }, - { id: quantId(), field: "amount_billion", weight: 15, direction: "desc" }, - { id: quantId(), field: "volatility_10d", weight: 10, direction: "asc" }, - ]; - if (render) renderQuantBuilder(); -} - -function addQuantFilter() { - const used = new Set(state.quantFilters.map((item) => item.field)); - const field = state.screenerSetup.factor_fields.find((item) => !used.has(item.id))?.id || "pct_chg"; - state.quantFilters.push({ id: quantId(), field, op: ">=", value: "0" }); - renderQuantBuilder(); -} - -function addQuantScore() { - const used = new Set(state.quantScores.map((item) => item.field)); - const field = state.screenerSetup.factor_fields.find((item) => !used.has(item.id))?.id || "pct_chg"; - state.quantScores.push({ id: quantId(), field, weight: 10, direction: "desc" }); - renderQuantBuilder(); -} - -function renderQuantBuilder() { - if (!state.screenerSetup) return; - document.querySelector("#quantFilterRows").innerHTML = state.quantFilters.map((item) => ` -
    - - - - -
    - `).join(""); - document.querySelector("#quantScoreRows").innerHTML = state.quantScores.map((item) => ` -
    - - - -
    - `).join(""); - renderQuantSummary(); - refreshIcons(); -} - -function handleQuantBuilderInput(event) { - const row = event.target.closest("[data-quant-filter], [data-quant-score]"); - const key = event.target.dataset.quantKey; - if (!row || !key) return; - const collection = row.dataset.quantFilter ? state.quantFilters : state.quantScores; - const id = row.dataset.quantFilter || row.dataset.quantScore; - const item = collection.find((entry) => entry.id === id); - if (!item) return; - item[key] = key === "weight" ? number(event.target.value) : event.target.value; - if (key === "weight") { - const output = event.target.closest(".quant-weight-control")?.querySelector("output"); - if (output) output.textContent = `${number(event.target.value)}%`; - } - renderQuantSummary(); -} - -function handleQuantBuilderClick(event) { - const button = event.target.closest("[data-quant-action]"); - if (!button) return; - const row = button.closest("[data-quant-filter], [data-quant-score]"); - const isFilter = Boolean(row?.dataset.quantFilter); - const id = row?.dataset.quantFilter || row?.dataset.quantScore; - const collection = isFilter ? state.quantFilters : state.quantScores; - const item = collection.find((entry) => entry.id === id); - if (button.dataset.quantAction === "remove") { - if (!isFilter && collection.length <= 1) { - showToast("至少保留一个评分因子"); - return; - } - const index = collection.findIndex((entry) => entry.id === id); - if (index >= 0) collection.splice(index, 1); - renderQuantBuilder(); - } else if (button.dataset.quantAction === "direction" && item) { - item.direction = button.dataset.direction; - renderQuantBuilder(); - } -} - -function buildQuantFormula() { - const filters = state.quantFilters.map((item) => { - let value; - if (item.op === "between") { - value = String(item.value).split(/[,,~~]/).map((part) => Number(part.trim())); - if (value.length !== 2 || value.some((part) => !Number.isFinite(part))) throw new Error(`${factorLabel(item.field)}需要两个有效区间值`); - if (value[0] > value[1]) value.reverse(); - } else { - value = Number(item.value); - if (!Number.isFinite(value)) throw new Error(`${factorLabel(item.field)}的条件值无效`); - } - return { field: item.field, op: item.op, value }; - }); - const score = state.quantScores.map((item) => { - const weight = number(item.weight) / 100; - if (weight <= 0 || weight > 1) throw new Error(`${factorLabel(item.field)}的权重应为1%至100%`); - return { field: item.field, weight, direction: item.direction }; - }); - return { - meta: { library: "custom", category: "量化公式", frequency: "按需", risk: "自定义", data_group: "组合因子" }, - universe: { - exclude_st: document.querySelector("#quantExcludeSt").checked, - listed_days_min: Math.max(0, Math.min(5000, number(document.querySelector("#quantListedDays").value))), - }, - filters, - score, - limit: Math.max(1, Math.min(50, number(document.querySelector("#quantLimit").value))), - min_score: Math.max(0, Math.min(1, number(document.querySelector("#quantMinScore").value) / 100)), - }; -} - -function formulaMissingData(formula) { - const health = state.screenerSetup?.factor_data?.health || {}; - const fields = new Set([...(formula.filters || []), ...(formula.score || [])].map((item) => item.field)); - const missing = []; - if (!state.screenerSetup?.factor_data?.ready) missing.push("基础行情"); - if (["pe_ttm", "pb", "ps_ttm", "dividend_yield_ttm", "total_mv_billion"].some((field) => fields.has(field)) && !health.valuation) missing.push("估值数据"); - if (["roe", "roa", "roic", "gross_margin", "netprofit_yoy", "revenue_yoy", "ocf_to_opincome"].some((field) => fields.has(field)) && !health.fundamental) missing.push("财务质量"); - if (fields.has("dividend_years") && !health.dividend_history) missing.push("历年分红"); - if (["auction_change", "auction_amount_million", "auction_turnover_rate", "auction_volume_ratio"].some((field) => fields.has(field)) && !health.auction) missing.push("竞价数据"); - return missing; -} - -function renderQuantSummary() { - if (!state.screenerSetup) return; - const total = state.quantScores.reduce((sum, item) => sum + number(item.weight), 0); - setText("quantWeightTotal", `${formatNumber(total, 0)}%`); - const bar = document.querySelector("#quantWeightBar"); - bar.style.width = `${Math.min(100, total)}%`; - bar.style.background = Math.abs(total - 100) < 0.01 ? "#2563eb" : "#d97706"; - const message = document.querySelector("#quantValidationMessage"); - try { - const formula = buildQuantFormula(); - const missing = formulaMissingData(formula); - message.classList.toggle("error", Boolean(missing.length)); - message.textContent = missing.length ? `需要先同步:${missing.join("、")}` : "公式有效,可执行并生成逐股贡献解释。"; - document.querySelector("#quantRunButton").disabled = Boolean(missing.length); - } catch (error) { - message.classList.add("error"); - message.textContent = error.message; - document.querySelector("#quantRunButton").disabled = true; - } -} - -function renderScreenerProgress() { - const hasSetup = Boolean(state.screenerSetup?.regime); - const hasStrategy = Boolean(state.selectedStrategy); - const hasResult = Boolean(activeScreenerResult("smart")); - const states = { - regime: hasSetup ? "complete" : "current", - strategy: hasStrategy ? "complete" : hasSetup ? "current" : "pending", - run: state.screenerRunning ? "current" : hasResult ? "complete" : hasStrategy ? "current" : "pending", - result: hasResult ? "current" : "pending", - }; - const steps = [...document.querySelectorAll("[data-screener-step]")]; - steps.forEach((step, index) => { - const status = states[step.dataset.screenerStep] || "pending"; - step.dataset.state = status; - if (status === "current") step.setAttribute("aria-current", "step"); - else step.removeAttribute("aria-current"); - const line = step.nextElementSibling; - if (line?.classList.contains("step-line")) line.classList.toggle("complete", status === "complete" && index < steps.length - 1); - }); -} - -function openStrategyDrawer(target = "editor") { - const drawer = document.querySelector("#strategyDrawer"); - openModalDialog(drawer); - requestAnimationFrame(() => { - const focusTarget = target === "library" - ? document.querySelector("#strategyList .strategy-item.active") || document.querySelector("#strategyList .strategy-item") - : document.querySelector("#strategyNameInput"); - focusTarget?.focus(); - }); -} - -function openCustomStrategyDrawer() { - if (!state.customStrategyDraft) { - state.customStrategyDraft = { - id: null, - builtin: false, - name: "自定义选股策略", - description: "", - regimes: [state.selectedRegime], - formula: buildQuantFormula(), - }; - } - populateStrategyEditor(state.customStrategyDraft); - renderStrategyList(); - openStrategyDrawer("editor"); -} - -function selectScreenerMobileView(view) { - state.screenerMobileView = view === "results" ? "results" : "strategy"; - const workspace = document.querySelector("#screenerView"); - workspace.classList.toggle("mobile-strategy", state.screenerMobileView === "strategy"); - workspace.classList.toggle("mobile-results", state.screenerMobileView === "results"); - document.querySelectorAll("[data-screener-mobile-view]").forEach((button) => { - const active = button.dataset.screenerMobileView === state.screenerMobileView; - button.classList.toggle("active", active); - button.setAttribute("aria-selected", String(active)); - }); -} - -function updateBacktestTaskStatus() { - setText("backtestTaskStatus", activeScreenerResult("smart") ? "结果已归档" : "等待盘后生成"); - renderScreenerProgress(); -} - -function selectRegime(regime) { - state.selectedRegime = regime; - const recommended = state.screenerSetup.strategies.find((item) => item.formula?.meta?.library !== "curated" && item.regimes.includes(regime)); - if (recommended) state.selectedStrategy = recommended; - renderScreenerSetup(); -} - -function renderStrategyList() { - const list = document.querySelector("#strategyList"); - const strategies = state.screenerSetup.strategies.filter((item) => !item.builtin && item.formula?.meta?.library !== "curated"); - list.innerHTML = strategies.map((strategy) => ` - - `).join("") || emptyStateHtml("暂无已保存的自定义公式"); - list.querySelectorAll("[data-strategy-id]").forEach((button) => { - button.addEventListener("click", () => { - state.customStrategyDraft = state.screenerSetup.strategies.find((item) => item.id === number(button.dataset.strategyId)); - populateStrategyEditor(state.customStrategyDraft); - renderStrategyList(); - }); - }); -} - -function populateStrategyEditor(strategy) { - const deleteButton = document.querySelector("#deleteStrategyButton"); - deleteButton.hidden = !strategy?.id || Boolean(strategy.builtin); - if (!strategy) { - setText("activeStrategyEditorHeading", "--"); - return; - } - setText("activeStrategyEditorHeading", strategy.name || "未命名策略"); - document.querySelector("#strategyNameInput").value = strategy.name || ""; - document.querySelector("#strategyDescriptionInput").value = strategy.description || ""; - document.querySelector("#strategyPrompt").value = strategy.builtin ? strategy.description || "" : document.querySelector("#strategyPrompt").value; - document.querySelector("#formulaEditor").value = JSON.stringify(strategy.formula, null, 2); -} - -async function compileStrategy() { - const prompt = document.querySelector("#strategyPrompt").value.trim(); - const button = document.querySelector("#compileStrategyButton"); - button.disabled = true; - setText("compilerStatus", "正在编译"); - setStatus("正在编译选股策略"); - try { - const payload = await apiRequest("/api/screener/compile", "POST", { - prompt, - regime: state.selectedRegime, - }); - const strategy = payload.strategy; - state.customStrategyDraft = { ...strategy, id: null, builtin: false }; - document.querySelector("#deleteStrategyButton").hidden = true; - document.querySelector("#strategyNameInput").value = strategy.name; - document.querySelector("#strategyDescriptionInput").value = strategy.description; - document.querySelector("#formulaEditor").value = JSON.stringify(strategy.formula, null, 2); - setText("compilerStatus", "策略生成完成"); - if (strategy.notice) showToast(strategy.notice); - setStatus("选股策略已编译"); - } catch (error) { - showToast(error.message); - setStatus("策略编译失败"); - setText("compilerStatus", "编译失败"); - } finally { - button.disabled = false; - } -} - -async function saveCurrentStrategy() { - try { - const formula = parseFormulaEditor(); - const payload = await apiRequest("/api/screener/strategies", "POST", { - name: document.querySelector("#strategyNameInput").value, - description: document.querySelector("#strategyDescriptionInput").value, - regimes: [state.selectedRegime], - formula, - }); - state.screenerSetup.strategies = payload.strategies; - state.customStrategyDraft = payload.strategies.find((item) => item.id === payload.id); - renderStrategyList(); - populateStrategyEditor(state.customStrategyDraft); - showToast("自定义策略已保存"); - } catch (error) { - showToast(error.message); - } -} - -async function deleteCurrentStrategy() { - const strategy = state.customStrategyDraft; - if (!strategy?.id || strategy.builtin) { - showToast("只能删除已保存的自定义策略"); - return; - } - if (!window.confirm(`确定删除策略“${strategy.name}”吗?此操作不可撤销。`)) return; - - const button = document.querySelector("#deleteStrategyButton"); - button.disabled = true; - try { - const payload = await apiRequest(`/api/screener/strategies/${strategy.id}`, "DELETE"); - state.screenerSetup.strategies = payload.strategies; - state.customStrategyDraft = null; - renderStrategyList(); - openCustomStrategyDrawer(); - showToast("自定义策略已删除"); - } catch (error) { - showToast(error.message || "策略删除失败"); - } finally { - button.disabled = false; - } -} - -async function runQuantStrategy() { - let formula; - try { - formula = buildQuantFormula(); - } catch (error) { - showToast(error.message); - return; - } - await executeScreenerFormula({ - mode: "quant", - formula, - strategyName: "自定义选股公式", - regime: state.selectedRegime, - runBacktest: document.querySelector("#quantBacktestToggle").checked, - button: document.querySelector("#quantRunButton"), - loadingText: "正在执行自定义公式并计算因子贡献", - }); -} - -function saveQuantAsStrategy() { - try { - const formula = buildQuantFormula(); - state.customStrategyDraft = { - id: null, - builtin: false, - name: "自定义选股策略", - description: "由自定义因子工作台生成,可在高级公式中继续调整。", - regimes: [state.selectedRegime], - formula, - }; - populateStrategyEditor(state.customStrategyDraft); - document.querySelector("#strategyPrompt").value = "自定义因子工作台生成的选股公式"; - openStrategyDrawer("editor"); - } catch (error) { - showToast(error.message); - } -} - -async function executeScreenerFormula({ mode, formula, strategyName, strategyId = null, regime, runBacktest, button, loadingText }) { - if (!state.screenerSetup?.factor_data?.ready) { - showToast("请先同步至少 21 个交易日的因子数据"); - return; - } - const missing = formulaMissingData(formula); - if (missing.length) { - showToast(`请先同步${missing.join("、")}`); - return; - } - const executionMode = ["smart", "curated", "quant"].includes(mode) ? mode : state.screenerMode; - button.disabled = true; - state.screenerRunning = true; - state.screenerRunningMode = executionMode; - if (executionMode === "smart") { - setText("screenerRunStatus", "正在计算"); - setText("backtestTaskStatus", runBacktest ? "正在回测" : "本次不执行"); - } - setLoading(true, loadingText, "screener"); - setStatus(`正在执行${strategyName}`); - try { - const payload = await apiRequest("/api/screener/run", "POST", { - trade_date: elements.tradeDate.value, - regime, - strategy_name: strategyName, - formula, - mode: executionMode, - run_backtest: runBacktest, - }); - setScreenerResult(executionMode, payload.result, { regime, strategyId, strategyName }); - renderScreenerResult(); - if (executionMode === "smart") setText("screenerRunStatus", `完成 · ${payload.result.candidates.length} 只`); - updateBacktestTaskStatus(); - if (window.innerWidth <= 720) selectScreenerMobileView("results"); - setStatus(`${strategyName}完成 · ${payload.result.candidates.length} 只候选`); - } catch (error) { - showToast(error.message); - setStatus("选股执行失败"); - if (executionMode === "smart") setText("screenerRunStatus", "执行失败"); - updateBacktestTaskStatus(); - } finally { - state.screenerRunning = false; - state.screenerRunningMode = ""; - setLoading(false); - button.disabled = false; - updateBacktestTaskStatus(); - } -} - -async function loadMentorSetup(force = false) { - const requestedDate = elements.tradeDate.value.replaceAll("-", ""); - if (!force && state.mentorSetup?.requestedDate === requestedDate) { - renderMentorWorkspace(); - return; - } - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - const payload = await apiRequest(`/api/mentors/setup?${query}`); - payload.requestedDate = requestedDate; - if (!payload.preferences_configured) { - payload.mentors.sort((first, second) => { - if (Boolean(first.private) !== Boolean(second.private)) return first.private ? -1 : 1; - return String(first.name || "").localeCompare(String(second.name || ""), "zh-CN"); - }); - payload.mentors.forEach((mentor, index) => { mentor.sort_order = index; }); - } - state.mentorSetup = payload; - const selectedExists = payload.mentors.some((item) => item.id === state.selectedMentorId); - state.selectedMentorId = selectedExists ? state.selectedMentorId : payload.mentors[0]?.id || ""; - state.mentorMessages = await loadMentorMessages(); - renderMentorWorkspace(); - } catch (error) { - showMentorNotice(error.message || "问师模块加载失败"); - showToast(error.message || "问师模块加载失败"); - } -} - -function renderMentorWorkspace() { - const setup = state.mentorSetup; - if (!setup) return; - const selected = setup.mentors.find((item) => item.id === state.selectedMentorId) || null; - setText("mentorDataDate", `数据日期 ${displayCompactDate(setup.trade_date)}`); - setText("activeMentorName", selected?.name || "--"); - setText("mobileActiveMentorName", selected?.name || "选择思维模型"); - document.querySelector("#activeMentorBadges").innerHTML = selected ? renderMentorBadges(selected, true) : ""; - setText("activeMentorEvidence", selected?.evidence?.note || selected?.description || "--"); - document.querySelector("#activeMentorFocus").innerHTML = (selected?.focus || []).slice(0, 4) - .map((item) => `${escapeHtml(item)}`).join(""); - renderMentorDirectory(); - renderMentorMessages(); -} - -function renderMentorDirectory() { - const mentors = state.mentorSetup?.mentors || []; - const query = state.mentorQuery; - const filtered = mentors.filter((mentor) => { - if (state.mentorSortMode) return true; - if (state.mentorGrade !== "all" && mentor.evidence?.grade !== state.mentorGrade) return false; - if (!query) return true; - const haystack = [ - mentor.name, - mentor.description, - mentor.tagline, - mentor.evidence?.label, - mentor.evidence?.note, - ...(mentor.focus || []), - ].filter(Boolean).join(" ").toLocaleLowerCase("zh-CN"); - return haystack.includes(query); - }); - setText("mentorCount", filtered.length === mentors.length ? `${mentors.length} 位` : `${filtered.length} / ${mentors.length} 位`); - const sortToggle = document.querySelector("#mentorSortToggle"); - sortToggle.classList.toggle("active", state.mentorSortMode); - sortToggle.setAttribute("aria-pressed", String(state.mentorSortMode)); - sortToggle.querySelector("span").textContent = state.mentorSortMode ? "完成" : "整理"; - document.querySelector("#mentorSortHint").hidden = !state.mentorSortMode; - document.querySelector("#mentorSearchInput").disabled = state.mentorSortMode; - document.querySelectorAll("[data-mentor-grade]").forEach((button) => { - button.disabled = state.mentorSortMode; - }); - const container = document.querySelector("#mentorList"); - container.classList.toggle("is-sorting", state.mentorSortMode); - container.innerHTML = filtered.map((mentor) => { - const group = mentors.filter((item) => Boolean(item.pinned) === Boolean(mentor.pinned)); - const groupIndex = group.findIndex((item) => item.id === mentor.id); - return ` -
    - - - - ${state.mentorSortMode ? ` - - - ` : ""} - -
    - `; - }).join(""); - document.querySelector("#mentorListEmpty").hidden = filtered.length > 0; - document.querySelectorAll("[data-mentor-id]").forEach((button) => { - button.addEventListener("click", () => selectMentor(button.dataset.mentorId)); - }); - document.querySelectorAll("[data-mentor-pin]").forEach((button) => { - button.addEventListener("click", () => toggleMentorPin(button.dataset.mentorPin)); - }); - document.querySelectorAll("[data-mentor-move]").forEach((button) => { - button.addEventListener("click", () => moveMentor(button.dataset.mentorTarget, button.dataset.mentorMove)); - }); - document.querySelectorAll("[data-mentor-card]").forEach((card) => { - card.addEventListener("dragstart", handleMentorDragStart); - card.addEventListener("dragover", handleMentorDragOver); - card.addEventListener("drop", handleMentorDrop); - card.addEventListener("dragend", clearMentorDragState); - }); - refreshIcons(); -} - -function toggleMentorSortMode() { - state.mentorSortMode = !state.mentorSortMode; - if (state.mentorSortMode) { - state.mentorQuery = ""; - state.mentorGrade = "all"; - document.querySelector("#mentorSearchInput").value = ""; - document.querySelectorAll("[data-mentor-grade]").forEach((button) => { - button.classList.toggle("active", button.dataset.mentorGrade === "all"); - }); - } - renderMentorDirectory(); -} - -async function toggleMentorPin(mentorId) { - if (state.mentorSavingPreferences) return; - const mentors = state.mentorSetup?.mentors || []; - const index = mentors.findIndex((item) => item.id === mentorId); - if (index < 0) return; - const [mentor] = mentors.splice(index, 1); - mentor.pinned = !mentor.pinned; - if (mentor.pinned) { - mentors.unshift(mentor); - } else { - const firstUnpinned = mentors.findIndex((item) => !item.pinned); - mentors.splice(firstUnpinned < 0 ? mentors.length : firstUnpinned, 0, mentor); - } - normalizeMentorOrder(); - renderMentorWorkspace(); - await persistMentorPreferences(); -} - -async function moveMentor(mentorId, direction) { - if (state.mentorSavingPreferences) return; - const mentors = state.mentorSetup?.mentors || []; - const index = mentors.findIndex((item) => item.id === mentorId); - if (index < 0) return; - const step = direction === "up" ? -1 : 1; - const targetIndex = index + step; - if (targetIndex < 0 || targetIndex >= mentors.length) return; - if (Boolean(mentors[index].pinned) !== Boolean(mentors[targetIndex].pinned)) return; - [mentors[index], mentors[targetIndex]] = [mentors[targetIndex], mentors[index]]; - normalizeMentorOrder(); - renderMentorDirectory(); - await persistMentorPreferences(); -} - -function handleMentorDragStart(event) { - if (!state.mentorSortMode || state.mentorSavingPreferences) { - event.preventDefault(); - return; - } - state.mentorDragId = event.currentTarget.dataset.mentorCard || ""; - event.dataTransfer.effectAllowed = "move"; - event.dataTransfer.setData("text/plain", state.mentorDragId); - event.currentTarget.classList.add("is-dragging"); -} - -function handleMentorDragOver(event) { - const source = state.mentorSetup?.mentors.find((item) => item.id === state.mentorDragId); - const target = state.mentorSetup?.mentors.find((item) => item.id === event.currentTarget.dataset.mentorCard); - if (!source || !target || Boolean(source.pinned) !== Boolean(target.pinned)) return; - event.preventDefault(); - event.dataTransfer.dropEffect = "move"; - event.currentTarget.classList.add("is-drag-over"); -} - -async function handleMentorDrop(event) { - event.preventDefault(); - const sourceId = state.mentorDragId || event.dataTransfer.getData("text/plain"); - const targetId = event.currentTarget.dataset.mentorCard || ""; - clearMentorDragState(); - if (!sourceId || !targetId || sourceId === targetId) return; - const mentors = state.mentorSetup?.mentors || []; - const sourceIndex = mentors.findIndex((item) => item.id === sourceId); - const targetIndex = mentors.findIndex((item) => item.id === targetId); - if (sourceIndex < 0 || targetIndex < 0) return; - if (Boolean(mentors[sourceIndex].pinned) !== Boolean(mentors[targetIndex].pinned)) return; - const [mentor] = mentors.splice(sourceIndex, 1); - const insertionIndex = mentors.findIndex((item) => item.id === targetId); - mentors.splice(insertionIndex, 0, mentor); - normalizeMentorOrder(); - renderMentorDirectory(); - await persistMentorPreferences(); -} - -function clearMentorDragState() { - state.mentorDragId = ""; - document.querySelectorAll(".mentor-option.is-dragging, .mentor-option.is-drag-over").forEach((item) => { - item.classList.remove("is-dragging", "is-drag-over"); - }); -} - -function normalizeMentorOrder() { - (state.mentorSetup?.mentors || []).forEach((mentor, index) => { - mentor.sort_order = index; - }); -} - -async function persistMentorPreferences() { - const mentors = state.mentorSetup?.mentors || []; - state.mentorSavingPreferences = true; - renderMentorDirectory(); - try { - await apiRequest("/api/mentors/preferences", "POST", { - order: mentors.map((item) => item.id), - pinned: mentors.filter((item) => item.pinned).map((item) => item.id), - }); - } catch (error) { - showToast(error.message || "问师顺序保存失败"); - await loadMentorSetup(true); - } finally { - state.mentorSavingPreferences = false; - renderMentorDirectory(); - } -} - -function renderMentorBadges(mentor, expanded = false) { - const badges = []; - if (mentor.private) { - badges.push('仅自己'); - } - const grade = mentor.evidence?.grade; - if (grade) { - badges.push(`${escapeHtml(grade)}`); - } - return badges.join(""); -} - -function toggleMentorDirectory(open) { - const mobileOpen = Boolean(open) && window.innerWidth <= 720; - state.mentorDirectoryOpen = mobileOpen; - const sidebar = document.querySelector("#mentorView .mentor-sidebar"); - const backdrop = document.querySelector("#mentorDirectoryBackdrop"); - const toggle = document.querySelector("#mentorDirectoryToggle"); - sidebar.classList.toggle("is-open", mobileOpen); - backdrop.hidden = !mobileOpen; - toggle.setAttribute("aria-expanded", String(mobileOpen)); - document.body.classList.toggle("mentor-directory-open", mobileOpen); - if (mobileOpen) requestAnimationFrame(() => document.querySelector("#mentorSearchInput").focus()); -} - -async function selectMentor(mentorId) { - if (mentorId === state.selectedMentorId) { - toggleMentorDirectory(false); - return; - } - state.selectedMentorId = mentorId; - state.mentorMessages = []; - hideMentorNotice(); - renderMentorWorkspace(); - toggleMentorDirectory(false); - state.mentorMessages = await loadMentorMessages(); - renderMentorMessages(); -} - -function renderMentorMessages() { - const container = document.querySelector("#mentorMessages"); - const selected = state.mentorSetup?.mentors.find((item) => item.id === state.selectedMentorId); - if (!state.mentorMessages.length && !state.mentorLoading) { - container.innerHTML = ` -
    - - 向「${escapeHtml(selected?.name || "问师")}」请教 -

    ${escapeHtml(selected?.tagline || selected?.description || "选择一个问题开始对话")}

    -
    - `; - refreshIcons(); - } else { - container.innerHTML = state.mentorMessages.map((message) => ` -
    -
    ${message.role === "user" ? "我" : escapeHtml(selected?.name || "问师")}
    -
    ${message.role === "assistant" ? formatMentorAnswer(message.content) : escapeHtml(message.content)}
    - ${message.streaming ? '' : ""} - ${message.meta && !message.streaming ? `${escapeHtml(message.meta)}` : ""} -
    - `).join(""); - if (state.mentorLoading && !state.mentorMessages.some((message) => message.streaming)) { - container.insertAdjacentHTML("beforeend", ` -
    -
    ${escapeHtml(selected?.name || "问师")}
    -

    正在读取复盘数据并推演...

    -
    - `); - } - } - document.querySelector("#clearMentorChatButton").disabled = !state.mentorMessages.length || state.mentorLoading; - document.querySelector("#mentorQuestion").disabled = state.mentorLoading || !state.selectedMentorId; - document.querySelector("#sendMentorQuestion").disabled = state.mentorLoading || !state.selectedMentorId; - document.querySelector("#mentorSortToggle").disabled = state.mentorLoading; - requestAnimationFrame(() => { container.scrollTop = container.scrollHeight; }); -} - -async function sendMentorQuestion(event) { - event.preventDefault(); - if (state.mentorLoading || !state.selectedMentorId) return; - const input = document.querySelector("#mentorQuestion"); - const question = input.value.trim(); - if (!question) return; - const history = state.mentorMessages.slice(-6).map((item) => ({ - role: item.role, - content: item.content.slice(0, 3500), - })); - state.mentorMessages.push({ role: "user", content: question }); - const responseMessage = { role: "assistant", content: "", streaming: true, meta: "" }; - state.mentorMessages.push(responseMessage); - input.value = ""; - state.mentorLoading = true; - state.mentorController = new AbortController(); - hideMentorNotice(); - renderMentorMessages(); - renderMentorDirectory(); - setStatus("问师正在读取复盘数据"); - try { - await streamMentorRequest( - { - mentor_id: state.selectedMentorId, - trade_date: elements.tradeDate.value, - question, - history, - }, - state.mentorController.signal, - (chunk) => { - responseMessage.content += chunk; - scheduleMentorRender(); - }, - (meta) => { - responseMessage.meta = `${displayCompactDate(meta.data_trade_date || elements.tradeDate.value)} · 回答完成`; - if (meta.notice) showMentorNotice(meta.notice); - }, - ); - responseMessage.streaming = false; - setStatus("问师回答完成"); - } catch (error) { - responseMessage.streaming = false; - responseMessage.error = true; - if (!responseMessage.content) { - state.mentorMessages = state.mentorMessages.filter((item) => item !== responseMessage); - } - showMentorNotice(error.message || "问师回答失败"); - showToast(error.message || "问师回答失败"); - setStatus("问师回答失败"); - } finally { - state.mentorLoading = false; - state.mentorController = null; - renderMentorMessages(); - renderMentorDirectory(); - input.focus(); - } -} - -let mentorRenderFrame = 0; - -function scheduleMentorRender() { - if (mentorRenderFrame) return; - mentorRenderFrame = requestAnimationFrame(() => { - mentorRenderFrame = 0; - renderMentorMessages(); - }); -} - -async function streamMentorRequest(body, signal, onDelta, onMeta) { - await window.XiaobaiAPI.streamNdjson("/api/mentors/chat", { - method: "POST", - body, - signal, - errorMessage: "问师暂不可用", - onEvent: (event) => { - if (event.type === "delta") onDelta(String(event.content || "")); - if (event.type === "meta") onMeta(event); - }, - }); -} - -function useMentorQuickPrompt(prompt) { - const input = document.querySelector("#mentorQuestion"); - input.value = prompt || ""; - input.focus(); -} - -async function clearMentorConversation() { - if (!state.mentorMessages.length || !window.confirm("确定清空当前老师的对话记录吗?")) return; - try { - const query = new URLSearchParams({ - mentor_id: state.selectedMentorId, - trade_date: state.mentorSetup?.trade_date || elements.tradeDate.value, - }); - await apiRequest(`/api/mentors/messages?${query}`, "DELETE"); - state.mentorMessages = []; - hideMentorNotice(); - renderMentorMessages(); - } catch (error) { - showToast(error.message || "对话记录清空失败"); - } -} - -async function loadMentorMessages() { - if (!state.selectedMentorId) return []; - try { - const query = new URLSearchParams({ - mentor_id: state.selectedMentorId, - trade_date: state.mentorSetup?.trade_date || elements.tradeDate.value, - }); - const payload = await apiRequest(`/api/mentors/messages?${query}`); - return (payload.items || []).filter( - (item) => ["user", "assistant"].includes(item?.role) && typeof item.content === "string", - ).slice(-100); - } catch (error) { - showMentorNotice(error.message || "对话记录加载失败"); - return []; - } -} - -function showMentorNotice(message) { - const notice = document.querySelector("#mentorNotice"); - notice.textContent = message; - notice.hidden = false; -} - -function hideMentorNotice() { - document.querySelector("#mentorNotice").hidden = true; -} - -function formatMentorAnswer(content) { - const blocks = []; - let listType = ""; - let listItems = []; - const flushList = () => { - if (!listItems.length) return; - blocks.push(`<${listType} class="mentor-answer-list">${listItems.map((item) => `
  • ${item}
  • `).join("")}`); - listItems = []; - listType = ""; - }; - String(content || "").replace(/\r\n?/g, "\n").replace(/\n{3,}/g, "\n\n").split("\n").forEach((rawLine) => { - const line = rawLine.trim(); - if (!line) { - flushList(); - return; - } - const heading = line.match(/^#{1,3}\s+(.+)$/); - const bullet = line.match(/^[-*]\s+(.+)$/); - const ordered = line.match(/^\d+[.、]\s*(.+)$/); - if (heading) { - flushList(); - blocks.push(`${formatMentorInline(escapeHtml(heading[1]))}`); - } else if (/^-{3,}$/.test(line)) { - flushList(); - blocks.push(''); - } else if (line.startsWith("> ")) { - flushList(); - blocks.push(`${formatMentorInline(escapeHtml(line.slice(2)))}`); - } else if (bullet || ordered) { - const nextType = bullet ? "ul" : "ol"; - if (listType && listType !== nextType) flushList(); - listType = nextType; - listItems.push(formatMentorInline(escapeHtml((bullet || ordered)[1]))); - } else { - flushList(); - blocks.push(`

    ${formatMentorInline(escapeHtml(line))}

    `); - } - }); - flushList(); - return blocks.join(""); -} - -function formatMentorInline(content) { - return content.replace(/\*\*(.+?)\*\*/g, "$1"); -} - -async function loadHeavenSetup(force = false, sector = "", stockCode = "") { - const calendarDate = document.querySelector("#qiObservationDate")?.value || elements.tradeDate.value; - const requestedDate = calendarDate.replaceAll("-", ""); - const manualData = state.heavenManualData; - const calibrationKey = manualData ? JSON.stringify(manualData) : "auto"; - const requestedKey = `${requestedDate}:${sector}:${stockCode}:${calibrationKey}`; - if (!force && state.heavenSetup?.requestedKey === requestedKey) { - renderHeavenWorkspace(); - return; - } - const requestSequence = ++state.heavenRequestSequence; - const heavenView = document.querySelector("#heavenView"); - const loadButton = document.querySelector("#loadHeavenSelectionButton"); - const calibrationButtons = [ - document.querySelector("#applyHeavenCalibrationButton"), - document.querySelector("#resetHeavenCalibrationButton"), - ].filter(Boolean); - cancelHeavenPerformance(); - heavenView?.classList.add("heaven-data-loading"); - if (loadButton) loadButton.disabled = true; - calibrationButtons.forEach((button) => { button.disabled = true; }); - try { - if (state.heavenSetup?.requestedKey && state.heavenSetup.requestedKey !== requestedKey) { - state.personalField = null; - } - const query = new URLSearchParams({ - trade_date: calendarDate, - }); - if (sector) query.set("sector", sector); - if (stockCode) query.set("stock_code", stockCode); - if (manualData) query.set("manual_data", JSON.stringify(manualData)); - const payload = await apiRequest(`/api/heaven/setup?${query}`); - if ( - requestSequence !== state.heavenRequestSequence - || calendarDate !== document.querySelector("#qiObservationDate")?.value - ) return; - const previousFocus = state.heavenSetup - ? `${state.heavenSetup.chart?.sector || ""}:${state.heavenSetup.chart?.stock?.code || ""}` - : ""; - payload.requestedDate = requestedDate; - payload.requestedKey = requestedKey; - state.heavenSetup = payload; - state.heavenInterpretations.fortune = payload.daily_fortune_reading || ""; - state.heavenManualData = Object.keys(payload.chart?.manual_data || {}).length - ? payload.chart.manual_data - : null; - state.personalField = payload.personal_profile || null; - state.heavenPerformanceKey = `${requestedKey}:${requestSequence}`; - state.heavenPerformancePanels = new Set(); - state.heavenPerformanceActive = ""; - const nextFocus = `${payload.chart?.sector || ""}:${payload.chart?.stock?.code || ""}`; - if (previousFocus && previousFocus !== nextFocus) state.heavenInterpretations.trend = ""; - hideHeavenNotice(); - renderHeavenWorkspace(); - if (payload.chart.selection_notice) showHeavenNotice(payload.chart.selection_notice); - } catch (error) { - if (requestSequence !== state.heavenRequestSequence) return; - showHeavenNotice(error.message || "问天数据加载失败"); - showToast(error.message || "问天数据加载失败"); - } finally { - if (requestSequence === state.heavenRequestSequence) { - heavenView?.classList.remove("heaven-data-loading"); - if (loadButton) loadButton.disabled = false; - calibrationButtons.forEach((button) => { button.disabled = false; }); - } - } -} - -function loadHeavenSelection() { - const stockCode = document.querySelector("#heavenStockInput").value.trim(); - state.heavenManualData = null; - loadHeavenSetup(true, "", stockCode); -} - -function applyHeavenCalibration(event) { - event.preventDefault(); - const data = { ...(state.heavenManualData || {}) }; - delete data.note; - document.querySelectorAll("[data-heaven-manual-field]").forEach((input) => { - const current = String(input.value || "").trim(); - const original = String(input.dataset.originalValue || "").trim(); - if (!current) return; - if (current !== original || input.dataset.manual === "true") { - data[input.dataset.heavenManualField] = input.type === "number" ? Number(current) : current; - } - }); - const note = document.querySelector("#heavenCalibrationNote").value.trim(); - if (note) data.note = note; - if (!Object.keys(data).some((key) => key !== "note")) { - showToast("请先补充或修改至少一项量化数据"); - return; - } - state.heavenManualData = data; - loadHeavenSetup(true, "", document.querySelector("#heavenStockInput").value.trim()); -} - -function resetHeavenCalibration() { - state.heavenManualData = null; - document.querySelector("#heavenCalibrationNote").value = ""; - loadHeavenSetup(true, "", document.querySelector("#heavenStockInput").value.trim()); -} - -function selectHeavenPanel(panel, updateUrl = false) { - state.heavenPanel = panel; - if (state.heavenSetup) { - const calendarDate = state.heavenSetup.calendar_date || state.heavenSetup.trade_date; - const dateLabel = panel === "trend" - ? (calendarDate === state.heavenSetup.trade_date - ? `行情 ${displayCompactDate(state.heavenSetup.trade_date)}` - : `行情 ${displayCompactDate(state.heavenSetup.trade_date)} · 历法 ${displayCompactDate(calendarDate)}`) - : `历法 ${displayCompactDate(calendarDate)}`; - setText("heavenDataDate", dateLabel); - } - document.querySelectorAll("[data-heaven-panel]").forEach((button) => { - const active = button.dataset.heavenPanel === panel; - button.classList.toggle("active", active); - button.classList.toggle("on", active); - button.setAttribute("aria-current", active ? "page" : "false"); - }); - document.querySelectorAll(".heaven-panel").forEach((item) => { - item.classList.toggle("active-heaven-panel", item.id === `heaven${capitalize(panel)}Panel`); - }); - if ( - panel === "fortune" - && state.heavenSetup?.field - && state.heavenPerformancePanels.has("fortune") - ) { - requestAnimationFrame(() => renderQiFieldCanvas(state.heavenSetup.field.balance || [], { intro: false })); - } else { - stopQiFieldCanvas(); - } - if (panel === "heart") { - initializeHeartAtmosphere(); - setHeartLamp(state.heartStage); - } else { - stopHeartDust(); - } - if (panel !== "heart") requestAnimationFrame(() => queueHeavenPerformance(panel)); - if (updateUrl) { - const url = new URL(window.location.href); - url.searchParams.set("heaven", panel); - history.replaceState(null, "", url); - } -} - -function showHeartRitualCurtain() { - const curtain = document.querySelector("#heartRitualCurtain"); - if (!curtain || curtain.classList.contains("is-visible")) return; - if (state.heartCurtainTimer) clearTimeout(state.heartCurtainTimer); - document.querySelectorAll(".heart-stage.active-heart-stage .heart-rise").forEach((item) => item.classList.remove("is-visible")); - curtain.classList.remove("is-leaving"); - curtain.classList.add("is-visible"); - state.heartCurtainTimer = setTimeout(() => { - curtain.classList.add("is-leaving"); - activateHeartRises(document.querySelector(".heart-stage.active-heart-stage")); - state.heartCurtainTimer = setTimeout(() => { - curtain.classList.remove("is-visible", "is-leaving"); - state.heartCurtainTimer = null; - }, motionEnabled() ? 1450 : 10); - }, motionEnabled() ? 3000 : 20); -} - -function renderHeavenWorkspace() { - const setup = state.heavenSetup; - if (!setup) return; - initializeWentianV2Atmosphere(); - renderMarketHexagram(setup.chart); - renderFivePhaseField(setup.field); - renderPersonalFortune(); - renderHeartStage(); - selectHeavenPanel(state.heavenPanel); -} - -function buildWentianStars(id, count) { - const element = document.getElementById(id); - if (!element || element.children.length) return; - element.innerHTML = Array.from({ length: count }, () => { - const size = (Math.random() * 1.6 + 0.8).toFixed(1); - return ``; - }).join(""); -} - -function buildWentianBagua(svg) { - if (!svg || svg.children.length) return; - const trigrams = ["乾", "兑", "离", "震", "巽", "坎", "艮", "坤"]; - let characters = ""; - let ticks = ""; - for (let index = 0; index < 8; index += 1) { - const angle = (index * 45 - 90) * Math.PI / 180; - const x = 150 + 129 * Math.cos(angle); - const y = 150 + 129 * Math.sin(angle); - characters += `${trigrams[index]}`; - } - for (let index = 0; index < 24; index += 1) { - const angle = (index * 15 - 90) * Math.PI / 180; - ticks += ``; - } - svg.innerHTML = `${characters}${ticks}`; -} - -function buildWentianFortuneOrbit(svg) { - if (!svg || svg.children.length) return; - const sixQi = ["厥阴木", "少阴火", "少阳火", "太阴土", "阳明金", "太阳水"]; - const movements = ["木运", "火运", "土运", "金运", "水运"]; - const polarText = (items, radius, fontSize, offset = -90) => items.map((label, index) => { - const degrees = offset + index * 360 / items.length; - const angle = degrees * Math.PI / 180; - const x = 150 + radius * Math.cos(angle); - const y = 150 + radius * Math.sin(angle); - return `${label}`; - }).join(""); - const ticks = Array.from({ length: 30 }, (_, index) => { - const angle = (index * 12 - 90) * Math.PI / 180; - const inner = index % 5 === 0 ? 96 : 101; - return ``; - }).join(""); - svg.innerHTML = `${polarText(sixQi, 132, 8.5)}${ticks}${polarText(movements, 70, 10)}五运六气`; -} - -function initializeWentianV2Atmosphere() { - buildWentianStars("stars", 90); - buildWentianStars("fortuneStars", 100); - buildWentianStars("heartStars", 110); - buildWentianBagua(document.querySelector("#baguaSvg")); - buildWentianFortuneOrbit(document.querySelector("#fortuneBagua")); - buildWentianBagua(document.querySelector("#heartBagua")); -} - -function renderCompactHexagrams(hexagram) { - const original = document.querySelector("#heavenOriginalHexLines"); - const changed = document.querySelector("#heavenChangedHexLines"); - if (!original || !changed) return; - if (!hexagram?.lines?.length) { - original.innerHTML = ""; - changed.innerHTML = ""; - setText("heavenOriginalHexName", "待定"); - setText("heavenChangedHexName", "待定"); - setText("heavenOriginalHexDetail", "六爻尚未齐备"); - setText("heavenChangedHexDetail", "待动爻化变"); - return; - } - const values = hexagram.lines.map((line) => number(line.value)); - const changedValues = values.map((value) => value === 6 ? 7 : value === 9 ? 8 : value); - const lines = (items, showMoving) => [...items].reverse().map((value) => { - const moving = showMoving && [6, 9].includes(value); - return `
    ${value % 2 ? "" : ""}
    `; - }).join(""); - original.innerHTML = lines(values, true); - changed.innerHTML = lines(changedValues, false); - setText("heavenOriginalHexName", hexagram.name || "--"); - setText("heavenChangedHexName", hexagram.transformed?.name || "--"); - setText("heavenOriginalHexDetail", `${hexagram.outer_trigram || "--"}上 · ${hexagram.inner_trigram || "--"}下`); - setText("heavenChangedHexDetail", `${hexagram.transformed?.outer_trigram || "--"}上 · ${hexagram.transformed?.inner_trigram || "--"}下`); -} - -function cancelHeavenPerformance() { - heavenPerformanceToken += 1; - state.heavenPerformanceActive = ""; - document.querySelectorAll("#heavenTrendPanel, #heavenFortunePanel").forEach((panel) => { - panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); - panel.classList.add("heaven-performance-complete"); - }); -} - -function queueHeavenPerformance(panel) { - if (!state.heavenSetup || !["trend", "fortune"].includes(panel)) return; - const performanceId = `${state.heavenPerformanceKey}:${panel}`; - if ( - state.heavenPerformancePanels.has(panel) - || state.heavenPerformanceActive === performanceId - || state.heavenPanel !== panel - ) return; - const token = ++heavenPerformanceToken; - state.heavenPerformanceActive = performanceId; - const runner = panel === "trend" - ? playTrendPerformance(state.heavenSetup.chart, token) - : playFortunePerformance(state.heavenSetup.field, token); - runner.then((completed) => { - if (!completed || token !== heavenPerformanceToken) return; - state.heavenPerformancePanels.add(panel); - state.heavenPerformanceActive = ""; - }); -} - -function heavenPerformanceDelay(duration, token) { - return new Promise((resolve) => { - setTimeout(() => resolve(token === heavenPerformanceToken), motionEnabled() ? duration : 0); - }); -} - -async function typeHeavenText(element, text, token, speed = 38) { - if (!element) return false; - if (!motionEnabled()) { - element.textContent = text; - return token === heavenPerformanceToken; - } - element.textContent = ""; - element.classList.add("heaven-typing"); - for (const character of text) { - if (token !== heavenPerformanceToken) return false; - element.append(document.createTextNode(character)); - if (!await heavenPerformanceDelay(speed, token)) return false; - } - element.classList.remove("heaven-typing"); - return true; -} - -function countHeavenNumber(element, target, token, duration = 1300, suffix = "") { - return new Promise((resolve) => { - if (!element || !motionEnabled()) { - if (element) element.textContent = `${target > 0 ? "+" : ""}${target}${suffix}`; - resolve(token === heavenPerformanceToken); - return; - } - const startedAt = performance.now(); - const step = (now) => { - if (token !== heavenPerformanceToken) { - resolve(false); - return; - } - const progress = Math.min(1, (now - startedAt) / duration); - const eased = 1 - (1 - progress) ** 3; - const value = Math.round(target * eased); - element.textContent = `${value > 0 ? "+" : ""}${value}${suffix}`; - if (progress < 1) requestAnimationFrame(step); - else resolve(true); - }; - requestAnimationFrame(step); - }); -} - -async function playTrendPerformance(chart, token) { - const panel = document.querySelector("#heavenTrendPanel"); - if (!panel || state.heavenPanel !== "trend") return false; - panel.classList.remove( - "heaven-performance-complete", - "performance-title-ready", - "performance-change-ready", - "performance-score-ready", - "performance-text-ready", - ); - panel.classList.add("heaven-performance-pending", "heaven-performance-running"); - panel.querySelectorAll(".talent-line-group, .hexagram-line-row, .talent-reading, .heaven-index-strip > *").forEach((item) => { - item.classList.remove("is-ready"); - }); - if (!chart?.available) { - panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); - panel.classList.add("heaven-performance-complete"); - return true; - } - - const guaci = chart.hexagram.text || ""; - const scoreElement = document.querySelector("#heavenMomentumScore"); - const guaciElement = document.querySelector("#marketHexagramText"); - if (scoreElement) scoreElement.textContent = "0"; - if (guaciElement) guaciElement.textContent = ""; - if (!await heavenPerformanceDelay(220, token)) return false; - - const groups = [...panel.querySelectorAll(".talent-line-group")].reverse(); - const readings = [...panel.querySelectorAll(".talent-reading")]; - for (let index = 0; index < groups.length; index += 1) { - const group = groups[index]; - group.classList.add("is-ready"); - if (!await heavenPerformanceDelay(280, token)) return false; - const rows = [...group.querySelectorAll(".hexagram-line-row")].reverse(); - for (const row of rows) { - row.classList.add("is-ready"); - if (!await heavenPerformanceDelay(560, token)) return false; - } - readings[index]?.classList.add("is-ready"); - if (!await heavenPerformanceDelay(220, token)) return false; - } - - panel.classList.add("performance-title-ready"); - if (!await heavenPerformanceDelay(650, token)) return false; - panel.classList.add("performance-change-ready"); - if (!await heavenPerformanceDelay(420, token)) return false; - panel.classList.add("performance-score-ready"); - if (!await countHeavenNumber(scoreElement, number(chart.momentum_score), token)) return false; - panel.querySelectorAll(".heaven-index-strip > *").forEach((item, index) => { - setTimeout(() => { - if (token === heavenPerformanceToken) item.classList.add("is-ready"); - }, motionEnabled() ? index * 90 : 0); - }); - if (!await heavenPerformanceDelay(620, token)) return false; - if (!await typeHeavenText(guaciElement, guaci, token, 30)) return false; - panel.classList.add("performance-text-ready"); - panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); - panel.classList.add("heaven-performance-complete"); - return true; -} - -async function playFortunePerformance(field, token) { - const panel = document.querySelector("#heavenFortunePanel"); - if (!panel || !field || state.heavenPanel !== "fortune") return false; - panel.classList.remove("heaven-performance-complete", "performance-climate-ready", "performance-use-ready"); - panel.classList.add("heaven-performance-pending", "heaven-performance-running"); - panel.querySelectorAll(".phase-balance-row, .qi-framework-layer, .human-field-grid > div, .personal-fortune-panel").forEach((item) => { - item.classList.remove("is-ready"); - }); - const climateTone = document.querySelector("#qiClimateTone"); - const climateText = climateTone?.textContent || ""; - if (climateTone) climateTone.textContent = ""; - renderQiFieldCanvas(field.balance || [], { intro: true }); - if (!await heavenPerformanceDelay(900, token)) return false; - panel.classList.add("performance-climate-ready"); - if (!await heavenPerformanceDelay(720, token)) return false; - if (!await typeHeavenText(climateTone, climateText, token, 58)) return false; - - const balanceRows = [...panel.querySelectorAll(".phase-balance-row")]; - for (const row of balanceRows) { - row.classList.add("is-ready"); - const percent = number(row.dataset.phasePercent); - if (!await countHeavenNumber(row.querySelector(":scope > b"), percent, token, 520, "%")) return false; - if (!await heavenPerformanceDelay(90, token)) return false; - } - const layers = [...panel.querySelectorAll(".qi-framework-layer")]; - for (const layer of layers) { - layer.classList.add("is-ready"); - if (!await heavenPerformanceDelay(250, token)) return false; - } - panel.querySelectorAll(".human-field-grid > div").forEach((item, index) => { - setTimeout(() => { - if (token === heavenPerformanceToken) item.classList.add("is-ready"); - }, motionEnabled() ? index * 150 : 0); - }); - if (!await heavenPerformanceDelay(820, token)) return false; - panel.querySelector(".personal-fortune-panel")?.classList.add("is-ready"); - panel.classList.add("performance-use-ready"); - drawQiUseConnections(true); - panel.classList.remove("heaven-performance-pending", "heaven-performance-running"); - panel.classList.add("heaven-performance-complete"); - return true; -} - -function heavenSourcePhrase(item = {}) { - const stateLabel = item.realtime ? "当下之象" : "既成之象"; - const layerLabel = { - 指数: "天象合参", - 行业: "人势同观", - 个股: "地脉验真", - 用户补充: "人工验数", - }[item.layer] || "三才合参"; - return `${layerLabel} · ${stateLabel}`; -} - -function renderHeavenLineChecks(chart) { - const checks = [...(chart.data_checks || [])].sort((left, right) => number(right.line) - number(left.line)); - const container = document.querySelector("#heavenLineChecks"); - const status = document.querySelector("#heavenCalibrationStatus"); - const passedCount = checks.filter((item) => item.passed).length; - const manualCount = checks.filter((item) => item.status === "manual").length; - status.textContent = checks.length ? `${passedCount}/6 通过${manualCount ? ` · ${manualCount} 爻含补录` : ""}` : "等待载入"; - status.className = passedCount === 6 ? (manualCount ? "is-manual" : "is-passed") : "is-failed"; - if (!checks.length) { - renderEmptyState(container, "载入股票后查看六爻数据状态"); - return; - } - const lineValueLabel = { 6: "老阴 · 动", 7: "少阳 · 静", 8: "少阴 · 静", 9: "老阳 · 动" }; - container.innerHTML = checks.map((check) => { - const stateLabel = check.status === "manual" ? "补录通过" : check.passed ? "自动通过" : "未通过"; - const score = check.score === null || check.score === undefined ? "--" : signedScore(check.score); - const fields = (check.fields || []).map((field) => { - const rawValue = field.value === null || field.value === undefined ? "" : String(field.value); - const source = field.manual ? "用户补录" : rawValue ? "自动行情" : "等待补充"; - const common = `data-heaven-manual-field="${escapeHtml(field.key)}" data-original-value="${escapeHtml(rawValue)}" data-manual="${field.manual ? "true" : "false"}"`; - const control = field.type === "select" - ? `` - : field.type === "text" - ? `` - : ``; - return ``; - }).join(""); - const reasons = (check.reasons || []).map((reason) => `
  • ${escapeHtml(reason)}
  • `).join(""); - return `
    - - ${escapeHtml(stateLabel)} - ${escapeHtml(check.position)} · ${escapeHtml(check.layer)}${escapeHtml(check.formula)} - ${check.line_value ? escapeHtml(lineValueLabel[check.line_value] || check.line_value) : "待定"}得分 ${escapeHtml(score)} - - -
    - ${reasons ? `
      ${reasons}
    ` : `

    ${(check.evidence || []).map(escapeHtml).join(";") || "数据已通过安全门"}

    `} -
    ${fields}
    -
    -
    `; - }).join(""); - document.querySelector("#heavenCalibrationNote").value = chart.manual_data?.note || ""; - window.lucide?.createIcons(); -} - -function renderMarketHexagram(chart) { - const stockInput = document.querySelector("#heavenStockInput"); - if (document.activeElement !== stockInput) stockInput.value = chart.stock.code || ""; - const selectionRequired = Boolean(chart.selection_required); - const emptyState = document.querySelector("#heavenTrendEmpty"); - const trendLayout = document.querySelector("#heavenTrendPanel .heaven-trend-layout"); - const calibrationPanel = document.querySelector("#heavenCalibrationPanel"); - const stockIdentity = document.querySelector("#heavenStockIdentity"); - if (emptyState) emptyState.hidden = !selectionRequired; - if (trendLayout) trendLayout.hidden = selectionRequired; - if (calibrationPanel) calibrationPanel.hidden = selectionRequired; - if (stockIdentity) stockIdentity.hidden = selectionRequired; - if (selectionRequired) { - document.querySelector("#interpretTrendButton").disabled = true; - setText("heavenStockName", "--"); - setText("heavenStockSector", "--"); - renderHeavenInterpretation("trend", ""); - return; - } - setText("heavenStockName", chart.stock.name || "--"); - setText( - "heavenStockSector", - chart.sector || "--", - ); - setText("heavenStockTaxonomy", chart.sector_taxonomy === "sw_l2" ? "申万二级 ·" : "所属行业 ·"); - renderHeavenLineChecks(chart); - - const interpretButton = document.querySelector("#interpretTrendButton"); - const scoreMeter = document.querySelector(".trend-score-meter"); - const scoreNeedle = document.querySelector("#heavenMomentumNeedle"); - const renderTrendEvidence = () => { - const rows = chart.quality?.sources || []; - document.querySelector("#heavenTrendEvidence").innerHTML = rows.length - ? rows.map((item) => ` -
    - ${escapeHtml(item.lines)} · ${escapeHtml(item.layer)} - ${escapeHtml(heavenSourcePhrase(item))} - ${escapeHtml(item.detail || "")} -
    - `).join("") - : '

    暂无可核验的数据来源。

    '; - }; - renderTrendEvidence(); - if (!chart.available) { - interpretButton.disabled = true; - setText("marketHexagramName", "暂不成卦"); - setText("marketTransformedName", "--"); - setText("marketHexagramText", chart.quality?.principle || "六爻数据尚未齐备。"); - setText("marketMovementSummary", (chart.quality?.issues || []).join(";") || "等待有效行情数据"); - setText("heavenMomentumScore", "--"); - setText("heavenMomentumLabel", "数据未齐"); - renderCompactHexagrams(null); - scoreMeter?.setAttribute("aria-valuenow", "0"); - if (scoreNeedle) scoreNeedle.style.setProperty("--momentum-position", "50%"); - document.querySelector("#marketHexagramLines").innerHTML = ""; - const sourceRows = chart.quality?.sources || []; - document.querySelector("#threeTalentReadings").innerHTML = [ - ...(chart.quality?.issues || []).map((issue) => ` -
    未通过${escapeHtml(issue)}
    - `), - ...sourceRows.map((item) => ` -
    - ${escapeHtml(item.lines)} · ${escapeHtml(item.layer)} - ${escapeHtml(heavenSourcePhrase(item))} - ${escapeHtml(item.detail || "")} -
    - `), - ].join(""); - document.querySelector("#heavenIndexStrip").innerHTML = "

    天象尚未应时,待三才数据齐备后再观。

    "; - renderHeavenInterpretation("trend", ""); - return; - } - interpretButton.disabled = false; - - setText("marketHexagramName", `${chart.hexagram.outer_trigram}上${chart.hexagram.inner_trigram}下 · ${chart.hexagram.name}`); - setText("marketTransformedName", chart.hexagram.transformed.name); - renderCompactHexagrams(chart.hexagram); - setText("marketHexagramText", chart.hexagram.text); - setText("marketMovementSummary", `${chart.movement.label}。${chart.movement.explanation}`); - setText("heavenMomentumScore", `${chart.momentum_score > 0 ? "+" : ""}${chart.momentum_score}`); - setText("heavenMomentumLabel", chart.momentum_label); - const momentumPosition = clamp((number(chart.momentum_score) + 100) / 2, 0, 100); - scoreMeter?.setAttribute("aria-valuenow", String(number(chart.momentum_score))); - if (scoreNeedle) scoreNeedle.style.setProperty("--momentum-position", `${momentumPosition}%`); - renderMarketHexagramLines(chart.hexagram.lines); - document.querySelector("#threeTalentReadings").innerHTML = chart.pair_readings.map((item) => ` -
    - ${escapeHtml(item.level)}${escapeHtml(item.state)} -
    - 内 ${signedScore(item.inner)} - 外 ${signedScore(item.outer)} -
    -
    - `).join(""); - const indexContext = chart.index_context || {}; - document.querySelector("#heavenIndexStrip").innerHTML = (indexContext.indices || []).length - ? indexContext.indices.map((item) => ` -
    ${escapeHtml(item.name)}${signed(item.pct_chg)}%5日 ${signed(item.return_5d)}%
    - `).join("") - : `

    ${escapeHtml(indexContext.notice || "指数数据暂不可用")}

    `; - renderHeavenInterpretation("trend", state.heavenInterpretations.trend); -} - -function renderMarketHexagramLines(lines) { - const groups = [ - { talent: "天", caption: "指数 · 外显为上,内核为下", lines: [lines[5], lines[4]] }, - { talent: "人", caption: "行业 · 外显为上,内核为下", lines: [lines[3], lines[2]] }, - { talent: "地", caption: "个股 · 外显为上,内核为下", lines: [lines[1], lines[0]] }, - ]; - document.querySelector("#marketHexagramLines").innerHTML = groups.map((group, groupIndex) => ` -
    - -
    -

    ${group.caption}

    - ${group.lines.map((line) => ` -
    - ${escapeHtml(line.position_name)} - ${hexagramLineGraphic(line.value)} -
    - ${escapeHtml(line.role || line.line_name)} · ${line.value}${line.moving ? " 变" : ""} - ${(line.evidence || []).map(escapeHtml).join(";")} -
    -
    - `).join("")} -
    -
    - `).join(""); -} - -function stopQiFieldCanvas() { - if (qiFieldAnimationFrame) cancelAnimationFrame(qiFieldAnimationFrame); - qiFieldAnimationFrame = 0; -} - -function renderQiFieldCanvas(balance, options = {}) { - stopQiFieldCanvas(); - const canvas = document.querySelector("#qiFieldCanvas"); - const shell = canvas?.parentElement; - if (!canvas || !shell || !shell.clientWidth || !shell.clientHeight) return; - const context = canvas.getContext("2d"); - const ratio = Math.min(2, window.devicePixelRatio || 1); - const width = shell.clientWidth; - const height = shell.clientHeight; - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - const phaseColors = { 木: "#4a7c59", 火: "#b53a30", 土: "#b08a3e", 金: "#9c7c3c", 水: "#31505f" }; - const positions = { - 水: [0.50, 0.23], - 火: [0.50, 0.77], - 金: [0.28, 0.50], - 木: [0.72, 0.50], - 土: [0.50, 0.50], - }; - const introStartedAt = options.intro && motionEnabled() ? performance.now() : 0; - const items = balance.map((item, index) => ({ - ...item, - color: phaseColors[item.element] || "#6d685b", - x: positions[item.element]?.[0] || 0.5, - y: positions[item.element]?.[1] || 0.5, - phase: index * 1.7, - alpha: introStartedAt ? 0 : 1, - })); - const draw = (now = 0) => { - context.clearRect(0, 0, width, height); - context.globalCompositeOperation = "multiply"; - items.forEach((item, index) => { - const strength = Math.max(0.14, number(item.percent) / 100); - const introProgress = introStartedAt ? clamp((now - introStartedAt) / 2600, 0, 1) : 1; - const introEase = 1 - (1 - introProgress) ** 3; - const breath = motionEnabled() ? Math.sin(now * 0.00055 + item.phase) : 0; - const radius = Math.min(width, height) * (0.13 + Math.sqrt(strength) * 0.12) * (1 + breath * 0.06); - const targetAlpha = qiFieldSoloElement ? (qiFieldSoloElement === item.element ? 1 : 0.1) : 1; - item.alpha += (targetAlpha - item.alpha) * 0.06; - const targetX = width * item.x + (motionEnabled() ? Math.sin(now * (0.00012 + index * 0.000015) + item.phase) * 10 : 0); - const targetY = height * item.y + (motionEnabled() ? Math.cos(now * (0.0001 + index * 0.000013) + item.phase) * 8 : 0); - const centerX = width * 0.5; - const centerY = height * 0.47; - const x = centerX + (targetX - centerX) * introEase; - const y = centerY + (targetY - centerY) * introEase; - const gradient = context.createRadialGradient(x, y, 0, x, y, radius); - const rgb = item.color.match(/[a-f\d]{2}/gi).map((part) => parseInt(part, 16)); - const alpha = item.alpha * introEase; - gradient.addColorStop(0, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},${(0.28 + strength * 0.22) * alpha})`); - gradient.addColorStop(0.5, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},${(0.13 + strength * 0.12) * alpha})`); - gradient.addColorStop(1, `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`); - context.fillStyle = gradient; - context.fillRect(x - radius, y - radius, radius * 2, radius * 2); - }); - context.globalCompositeOperation = "source-over"; - if (motionEnabled() && state.activeView === "heavenView" && state.heavenPanel === "fortune") { - qiFieldAnimationFrame = requestAnimationFrame(draw); - } - }; - draw(performance.now()); -} - -function wentianClimateVerdict(field) { - const balance = field?.balance || []; - const dominant = balance[0]?.element; - const secondary = balance[1]?.element; - const tertiary = balance[2]?.element; - const pair = [dominant, secondary].filter(Boolean).sort().join(""); - const primary = { - 木火: "风火相煽", 木土: "风湿相搏", 木金: "风燥相激", 木水: "风寒相薄", - 土火: "湿热交蒸", 火金: "燥热相煽", 水火: "寒热相争", 土金: "燥湿相搏", - 土水: "寒湿交织", 水金: "寒燥相参", - }[pair] || ({ 木: "风木疏展", 火: "热火升明", 土: "湿滞偏重", 金: "燥金肃降", 水: "寒水潜藏" }[dominant] || "气机交会"); - const following = { 木: "风象暗动", 火: "热象内蕴", 土: "湿滞内结", 金: "燥气相参", 水: "寒意潜行" }[tertiary] - || ({ 木: "风象相随", 火: "热象相随", 土: "湿象相随", 金: "燥象相随", 水: "寒象相随" }[secondary] || "诸气相参"); - return `${primary} · ${following}`; -} - -function renderFivePhaseField(field) { - if (!field) return; - setText("fortuneLunarDate", `${field.date} · ${field.lunar_date}`); - setText("fortunePillars", `${field.pillars.year}年 · ${field.pillars.month}月 · ${field.pillars.day}日`); - const metrics = [ - ["中运", field.movement.label, field.movement.basis], - ["司天", field.six_qi.sitian, "岁半以前主气候背景"], - ["在泉", field.six_qi.zaiquan, "岁半以后主气候背景"], - [field.six_qi.step_name, `主 ${field.six_qi.host_qi}`, `客 ${field.six_qi.guest_qi}`], - ["当前节气", field.solar_terms.current, field.solar_terms.current_at], - ["下一节气", field.solar_terms.next, field.solar_terms.next_at], - ]; - document.querySelector("#fortuneMetrics").innerHTML = metrics.map(([label, value, detail]) => ` -
    ${escapeHtml(label)}${escapeHtml(value)}${escapeHtml(detail)}
    - `).join(""); - const framework = field.framework || {}; - setText("qiFrameworkPrinciple", framework.principle || "--"); - const layerLabels = { year: "年运与岁气", current: "客主加临", day: "日辰触发" }; - document.querySelector("#qiFrameworkLayers").innerHTML = (framework.layers || []).map((layer) => ` -
    - ${escapeHtml(layerLabels[layer.id] || layer.label)} - ${escapeHtml(layer.dominant)}气 - ${escapeHtml(layer.summary)} -
    ${(layer.balance || []).map((item) => ``).join("")}
    -
    - `).join(""); - const human = field.human_field || {}; - const dominantPhase = (field.balance || [])[0]; - setText("qiClimateKeyword", wentianClimateVerdict(field)); - setText("qiClimateTone", (human.emotional_tendency || [])[0] || "留意当下身心反应"); - setText("humanFieldSummary", human.summary || "--"); - setText("humanEmotionList", (human.emotional_tendency || []).join(";") || "--"); - setText("humanBiasList", (human.decision_biases || []).join(";") || "--"); - setText("humanOperation", human.operation_tendency || "--"); - setText( - "humanBalanceActions", - [...(human.risk_reminders || []), ...(human.balancing_actions || [])].join(";") || "--", - ); - document.querySelector("#fivePhaseBalance").innerHTML = field.balance.map((item) => ` -
    - ${escapeHtml(item.element)} -
    ${escapeHtml(item.motion)} · ${escapeHtml(item.mind)}
    - ${number(item.percent)}% -
    - `).join(""); - document.querySelectorAll("#fivePhaseBalance .phase-balance-row").forEach((row) => { - const focusPhase = () => { qiFieldSoloElement = row.dataset.phaseElement || ""; }; - const clearPhase = () => { qiFieldSoloElement = ""; }; - row.addEventListener("mouseenter", focusPhase); - row.addEventListener("mouseleave", clearPhase); - row.addEventListener("focus", focusPhase); - row.addEventListener("blur", clearPhase); - row.addEventListener("click", () => { - qiFieldSoloElement = qiFieldSoloElement === row.dataset.phaseElement ? "" : row.dataset.phaseElement; - }); - }); - setText("phaseSectorTitle", "五行行业归属"); - setText("phaseSectorContext", "传统取象 · 手动归类优先"); - renderQiUseMap(field); - renderFortuneSectorCatalog(field); - renderSectorPhaseOverrides(state.heavenSetup?.sector_phase_overrides || []); - setText("fortuneNotice", field.notice); - renderHeavenInterpretation("fortune", state.heavenInterpretations.fortune); -} - -function renderFortuneSectorCatalog(field) { - const container = document.querySelector("#fortuneSectorGroups"); - if (!container) return; - const phaseOrder = new Map((field.balance || []).map((item, index) => [item.element, index])); - const canonical = { 木: 0, 火: 1, 土: 2, 金: 3, 水: 4 }; - const catalog = [...(field.sector_catalog || [])].sort((left, right) => ( - (canonical[left.element] ?? phaseOrder.get(left.element) ?? 99) - - (canonical[right.element] ?? phaseOrder.get(right.element) ?? 99) - )); - container.innerHTML = catalog.map((group) => ` -
    -
    ${escapeHtml(group.element)}属性${number(group.count || group.industries?.length)} 类
    -
      ${(group.industries || []).map((item) => `
    • ${escapeHtml(item.name)}
    • `).join("")}
    -
    - `).join("") || '

    行业五行归类尚未建立

    '; -} - -function renderQiUseMap(field) { - const sourceContainer = document.querySelector("#qiUseSources"); - const sectorContainer = document.querySelector("#phaseSectorList"); - if (!sourceContainer || !sectorContainer) return; - const balance = field.balance || []; - const phaseOrder = new Map(balance.map((item, index) => [item.element, index])); - const catalog = [...(field.sector_catalog || [])].sort( - (left, right) => (phaseOrder.get(left.element) ?? 99) - (phaseOrder.get(right.element) ?? 99), - ); - const catalogElements = new Set(catalog.map((item) => item.element)); - sourceContainer.innerHTML = balance.map((item) => ` -
    - ${escapeHtml(item.element)} - ${escapeHtml(item.motion)}${number(item.percent)}% -
    - `).join(""); - sectorContainer.innerHTML = catalog.length ? catalog.map((group) => { - const element = group.element; - const items = group.industries || []; - return ` -
    - - ${escapeHtml(element)}属性 - ${number(group.count)} 类 - - -
    -
      - ${items.map((item) => `
    • ${escapeHtml(item.name)}${item.classification_source === "manual" ? '手动' : ""}
    • `).join("")} -
    -
    -
    - `; - }).join("") : '

    行业五行归类尚未建立。

    '; - sectorContainer.querySelectorAll(".qi-sector-group").forEach((group) => { - group.addEventListener("toggle", () => requestAnimationFrame(() => drawQiUseConnections(false))); - }); - refreshIcons(); - requestAnimationFrame(() => drawQiUseConnections(false)); -} - -function drawQiUseConnections(animate = false) { - const map = document.querySelector("#qiUseMap"); - const svg = document.querySelector("#qiUseConnections"); - if (!map || !svg || !map.clientWidth || !map.clientHeight) return; - const bounds = map.getBoundingClientRect(); - svg.setAttribute("viewBox", `0 0 ${bounds.width} ${bounds.height}`); - svg.innerHTML = ""; - document.querySelectorAll("#phaseSectorList [data-qi-sector]").forEach((group) => { - const element = group.dataset.qiSector; - const source = document.querySelector(`#qiUseSources [data-qi-source="${CSS.escape(element)}"]`); - const target = group.querySelector("summary"); - if (!source || !target) return; - const from = source.getBoundingClientRect(); - const to = target.getBoundingClientRect(); - const x1 = from.right - bounds.left - 4; - const y1 = from.top + from.height / 2 - bounds.top; - const x2 = to.left - bounds.left + 2; - const y2 = to.top + to.height / 2 - bounds.top; - const bend = Math.max(46, (x2 - x1) * 0.42); - const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); - path.setAttribute("d", `M ${x1} ${y1} C ${x1 + bend} ${y1}, ${x2 - bend} ${y2}, ${x2} ${y2}`); - path.setAttribute("pathLength", "1"); - path.classList.add(`phase-stroke-${phaseClass(element)}`); - if (animate && motionEnabled()) path.classList.add("is-drawing"); - else path.classList.add("is-flowing"); - svg.appendChild(path); - if (animate && motionEnabled()) { - requestAnimationFrame(() => path.classList.add("is-visible")); - setTimeout(() => { - if (!path.isConnected) return; - path.classList.remove("is-drawing", "is-visible"); - path.classList.add("is-flowing"); - }, 1900); - } - }); -} - -function renderSectorPhaseOverrides(items) { - const container = document.querySelector("#sectorPhaseOverrides"); - const canManage = state.user?.role === "admin"; - container.innerHTML = items.length ? items.map((item) => ` -
    - ${escapeHtml(item.element)} - ${escapeHtml(item.name)} - ${canManage ? `` : ""} -
    - `).join("") : '

    暂无手动归类

    '; - container.querySelectorAll("[data-sector-phase-delete]").forEach((button) => { - button.addEventListener("click", () => deleteSectorPhaseOverride(button.dataset.sectorPhaseDelete)); - }); - refreshIcons(); -} - -async function saveSectorPhaseOverride(event) { - event.preventDefault(); - const name = document.querySelector("#sectorPhaseName").value.trim(); - const element = document.querySelector("#sectorPhaseElement").value; - if (!name) return; - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - try { - await apiRequest("/api/heaven/sector-phases", "POST", { name, element }); - document.querySelector("#sectorPhaseName").value = ""; - await loadHeavenSetup(true); - showToast(`已将 ${name} 归为${element}`); - } catch (error) { - showToast(error.message || "手动归类保存失败"); - } finally { - button.disabled = false; - } -} - -async function deleteSectorPhaseOverride(name) { - try { - await apiRequest(`/api/heaven/sector-phases/${encodeURIComponent(name)}`, "DELETE"); - await loadHeavenSetup(true); - showToast(`已删除 ${name} 的手动归类`); - } catch (error) { - showToast(error.message || "手动归类删除失败"); - } -} - -async function saveAccountBirthProfile(event) { - event.preventDefault(); - const birthDate = document.querySelector("#accountBirthDate").value; - const birthTime = document.querySelector("#accountBirthTime").value; - if (!birthDate || !birthTime) { - showToast("请填写完整出生日期和时间"); - return; - } - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - const originalText = button.textContent; - button.textContent = "正在排盘"; - try { - await apiRequest("/api/account/birth-profile", "POST", { - trade_date: document.querySelector("#qiObservationDate").value || elements.tradeDate.value, - birth_datetime: `${birthDate}T${birthTime}`, - gender: document.querySelector("#accountBirthGender").value, - }); - event.currentTarget.reset(); - setText("birthProfileStatus", "已加密保存"); - document.querySelector("#deleteBirthProfileButton").disabled = false; - state.heavenInterpretations.fortune = ""; - await loadHeavenSetup(true); - showToast("个人命理资料已保存到当前账号"); - } catch (error) { - showToast(error.message || "个人命理资料保存失败"); - } finally { - button.disabled = false; - button.textContent = originalText; - } -} - -async function deleteAccountBirthProfile() { - if (!window.confirm("确定删除当前账号保存的个人命理资料吗?")) return; - try { - await apiRequest("/api/account/birth-profile", "DELETE"); - state.personalField = null; - state.heavenInterpretations.fortune = ""; - setText("birthProfileStatus", "尚未设置"); - document.querySelector("#deleteBirthProfileButton").disabled = true; - renderPersonalFortune(); - showToast("个人命理资料已删除"); - } catch (error) { - showToast(error.message || "个人命理资料删除失败"); - } -} - -function renderPersonalFortune() { - const container = document.querySelector("#personalFortuneResult"); - const empty = document.querySelector("#personalProfileEmpty"); - const personal = state.personalField; - if (!personal) { - empty.hidden = false; - container.hidden = true; - container.innerHTML = ""; - return; - } - empty.hidden = true; - container.hidden = false; - const tenGods = personal.ten_god_tendency || { favorable: [], caution: [] }; - const elementTendency = personal.balance_tendency || { favorable: [], caution: [] }; - const preferenceTags = (items) => (items || []).map((item) => `${escapeHtml(item)}`).join("") || "--"; - container.innerHTML = ` -
    -
    - 日主 - ${escapeHtml(personal.day_master?.stem || "--")} - ${escapeHtml(personal.day_master?.element || "--")} - ${escapeHtml(personal.day_master?.strength || "")} -
    -
    -
    十神喜恶
    偏宜

    ${preferenceTags(tenGods.favorable)}

    偏慎

    ${preferenceTags(tenGods.caution)}

    -
    五行喜忌
    偏喜

    ${preferenceTags(elementTendency.favorable)}

    偏忌

    ${preferenceTags(elementTendency.caution)}

    -
    -
    `; -} - -function renderHexagramLines(containerId, lines, includeEvidence = false) { - const container = document.querySelector(`#${containerId}`); - container.innerHTML = [...lines].reverse().map((line) => ` -
    - ${escapeHtml(line.position_name)} - ${hexagramLineGraphic(line.value)} -
    - ${escapeHtml(line.role || line.line_name)} · ${line.value}${line.moving ? " 变" : ""} - ${includeEvidence ? `${(line.evidence || []).map(escapeHtml).join(";")}` : `${escapeHtml(line.text || "")}`} -
    -
    - `).join(""); -} - -function hexagramLineGraphic(value) { - const yang = value % 2 === 1; - return ` - - ${yang ? "" : ""}${[6, 9].includes(value) ? `${value === 9 ? "○" : "×"}` : ""} - - `; -} - -const HEAVEN_READING_META = { - trend: { panel: "观势", action: "解势", done: "查看解势", status: "势已成" }, - fortune: { panel: "观气", action: "解运", done: "已解运", status: "气已定" }, - heart: { panel: "观心", action: "我已察念,开始解卦", done: "查看解卦", status: "卦已解" }, -}; - -function heavenReadingMeta(mode = state.heavenReadingMode) { - return HEAVEN_READING_META[mode] || HEAVEN_READING_META.trend; -} - -function heavenReadingAnimationData() { - const field = state.heavenSetup?.field || {}; - return { - yearPillar: field.pillars?.year || "", - movement: field.movement?.label || "", - sixQi: { - sitian: field.six_qi?.sitian || "", - zaiquan: field.six_qi?.zaiquan || "", - step: number(field.six_qi?.step) || 1, - }, - }; -} - -function syncHeavenReadingAnimation() { - const canvas = document.querySelector("#heavenReadingCanvas"); - const shouldRun = state.heavenReadingLoading && state.heavenReadingTab === "current"; - if (!canvas || !window.HeavenLoadingCanvas) return; - if (!shouldRun) { - stopHeavenReadingAnimation(); - return; - } - if (!heavenReadingAnimation) heavenReadingAnimation = new window.HeavenLoadingCanvas(canvas); - const scene = state.heavenReadingMode === "fortune" ? "fortune" : "hexagram"; - heavenReadingAnimation.start(scene, heavenReadingAnimationData()); -} - -function stopHeavenReadingAnimation() { - heavenReadingAnimation?.stop(); -} - -function finishHeavenReadingAnimation() { - if (!elements.heavenReadingDialog.open || !heavenReadingAnimation?.running) { - stopHeavenReadingAnimation(); - return Promise.resolve(); - } - return heavenReadingAnimation.complete(); -} - -function openHeavenReading(mode, options = {}) { - state.heavenReadingMode = mode; - state.heavenReadingTab = "current"; - state.heavenReadingError = options.error || ""; - state.heavenReadingLoading = Object.hasOwn(options, "loading") - ? Boolean(options.loading) - : false; - renderHeavenReadingDialog(); - openModalDialog(elements.heavenReadingDialog); - requestAnimationFrame(() => { - syncHeavenReadingAnimation(); - document.querySelector("#closeHeavenReadingDialog").focus(); - }); -} - -async function openHeavenHistory(mode) { - state.heavenReadingMode = mode; - state.heavenReadingTab = "history"; - state.heavenReadingSelectedId = 0; - renderHeavenReadingDialog(); - openModalDialog(elements.heavenReadingDialog); - await loadHeavenReadingHistory(mode); -} - -function selectHeavenReadingTab(tab) { - state.heavenReadingTab = tab === "history" ? "history" : "current"; - renderHeavenReadingDialog(); - if (state.heavenReadingTab === "history") loadHeavenReadingHistory(state.heavenReadingMode); -} - -async function loadHeavenReadingHistory(mode) { - const list = document.querySelector("#heavenReadingHistoryList"); - renderEmptyState(list, "正在读取历史记录"); - try { - const query = new URLSearchParams({ mode, limit: "100" }); - const payload = await apiRequest(`/api/heaven/readings?${query}`); - state.heavenReadingHistory[mode] = payload.items || []; - if (!state.heavenReadingHistory[mode].some((item) => number(item.id) === state.heavenReadingSelectedId)) { - state.heavenReadingSelectedId = number(state.heavenReadingHistory[mode][0]?.id); - } - renderHeavenReadingHistory(); - } catch (error) { - renderEmptyState(list, error.message || "历史记录加载失败"); - } -} - -function renderHeavenReadingDialog() { - const meta = heavenReadingMeta(); - setText("heavenReadingEyebrow", `问天 · ${meta.panel}`); - setText("heavenReadingDialogTitle", state.heavenReadingTab === "history" ? "历史记录" : meta.status); - document.querySelectorAll("[data-heaven-reading-tab]").forEach((button) => { - const active = button.dataset.heavenReadingTab === state.heavenReadingTab; - button.classList.toggle("active", active); - button.setAttribute("aria-selected", String(active)); - }); - document.querySelector("#heavenReadingCurrent").hidden = state.heavenReadingTab !== "current"; - document.querySelector("#heavenReadingHistory").hidden = state.heavenReadingTab !== "history"; - if (state.heavenReadingTab === "current") { - renderHeavenReadingCurrent(); - } else { - stopHeavenReadingAnimation(); - renderHeavenReadingHistory(); - } - refreshIcons(); -} - -function renderHeavenReadingCurrent() { - const reading = state.heavenInterpretations[state.heavenReadingMode]; - const loading = document.querySelector("#heavenReadingLoading"); - const empty = document.querySelector("#heavenReadingEmpty"); - const result = document.querySelector("#heavenReadingResult"); - const error = document.querySelector("#heavenReadingError"); - loading.hidden = !state.heavenReadingLoading; - syncHeavenReadingAnimation(); - error.hidden = !state.heavenReadingError; - error.textContent = state.heavenReadingError; - result.hidden = state.heavenReadingLoading || !reading; - empty.hidden = state.heavenReadingLoading || Boolean(reading) || Boolean(state.heavenReadingError); - if (!reading || state.heavenReadingLoading) return; - setText("heavenReadingResultStatus", heavenReadingMeta().status); - setText("heavenReadingSubject", reading.subject || `${heavenReadingMeta().panel}解读`); - setText("heavenReadingSubjectDetail", reading.subject_detail || displayCompactDate(reading.context_date || "")); - setText("heavenReadingCreatedAt", reading.created_at ? formatTimestamp(reading.created_at) : "刚刚完成"); - document.querySelector("#heavenReadingAnswer").innerHTML = formatMentorAnswer(reading.answer || ""); -} - -function renderHeavenReadingHistory() { - const mode = state.heavenReadingMode; - const items = state.heavenReadingHistory[mode] || []; - setText("heavenReadingHistoryTitle", `${heavenReadingMeta(mode).panel}记录`); - setText("heavenReadingHistoryCount", `${items.length} 条`); - const list = document.querySelector("#heavenReadingHistoryList"); - list.innerHTML = items.map((item) => ` - - `).join("") || emptyStateHtml("暂无历史解读"); - const selected = items.find((item) => number(item.id) === state.heavenReadingSelectedId); - const detail = document.querySelector("#heavenReadingHistoryDetail"); - detail.innerHTML = selected ? ` -
    ${escapeHtml(heavenReadingMeta(mode).status)}

    ${escapeHtml(selected.subject)}

    -

    ${escapeHtml(selected.subject_detail || displayCompactDate(selected.context_date))}

    -
    ${formatMentorAnswer(selected.answer || "")}
    -
    - ` : emptyStateHtml("选择一条记录查看完整解读"); - refreshIcons(); -} - -function handleHeavenHistorySelection(event) { - const button = event.target.closest("[data-heaven-reading-id]"); - if (!button) return; - state.heavenReadingSelectedId = number(button.dataset.heavenReadingId); - renderHeavenReadingHistory(); -} - -async function handleHeavenHistoryAction(event) { - const button = event.target.closest("[data-delete-heaven-reading]"); - if (!button || !window.confirm("确定删除这条解读记录吗?")) return; - const id = number(button.dataset.deleteHeavenReading); - try { - await apiRequest(`/api/heaven/readings/${id}`, "DELETE"); - const mode = state.heavenReadingMode; - state.heavenReadingHistory[mode] = (state.heavenReadingHistory[mode] || []).filter((item) => number(item.id) !== id); - if (number(state.heavenInterpretations[mode]?.id) === id) { - state.heavenInterpretations[mode] = ""; - if (mode === "fortune" && state.heavenSetup) state.heavenSetup.daily_fortune_reading = null; - updateHeavenInterpretationControls(); - } - state.heavenReadingSelectedId = number(state.heavenReadingHistory[mode][0]?.id); - renderHeavenReadingHistory(); - } catch (error) { - showToast(error.message || "解读记录删除失败"); - } -} - -async function interpretHeaven(mode) { - const existing = state.heavenInterpretations[mode]; - if (existing) { - openHeavenReading(mode, { loading: false }); - return; - } - const button = document.querySelector(mode === "trend" ? "#interpretTrendButton" : mode === "fortune" ? "#interpretFortuneButton" : "#interpretHeartButton"); - if (button.disabled) return; - state.heavenReadingMode = mode; - state.heavenReadingLoading = true; - state.heavenReadingError = ""; - openHeavenReading(mode, { loading: true }); - updateHeavenInterpretationControls(); - hideHeavenNotice(); - try { - const payload = { - mode, - trade_date: document.querySelector("#qiObservationDate").value || elements.tradeDate.value, - sector: state.heavenSetup?.chart?.sector || "", - stock_code: state.heavenSetup?.chart?.stock?.code || "", - }; - if (mode === "trend" && state.heavenManualData) payload.manual_data = state.heavenManualData; - if (mode === "heart") payload.lines = state.heartLines; - const result = await apiRequest("/api/heaven/interpret", "POST", payload); - state.heavenInterpretations[mode] = result.reading || { - answer: result.answer, - subject: `${heavenReadingMeta(mode).panel}解读`, - context_date: payload.trade_date, - created_at: new Date().toISOString(), - }; - state.heavenReadingHistory[mode] = []; - await finishHeavenReadingAnimation(); - state.heavenReadingLoading = false; - renderHeavenReadingDialog(); - if (result.notice) showHeavenNotice(result.notice); - if (mode === "heart") { - if (await transitionHeartStage("interpretation")) await playHeartReadSequence(); - } else { - renderHeavenInterpretation(mode, state.heavenInterpretations[mode]); - } - } catch (error) { - stopHeavenReadingAnimation(); - state.heavenReadingLoading = false; - state.heavenReadingError = error.message || "问天解读失败"; - renderHeavenReadingDialog(); - showHeavenNotice(state.heavenReadingError); - showToast(state.heavenReadingError); - } finally { - state.heavenReadingLoading = false; - updateHeavenInterpretationControls(); - } -} - -function updateHeavenInterpretationControls() { - const loading = state.heavenReadingLoading; - const trendButton = document.querySelector("#interpretTrendButton"); - const fortuneButton = document.querySelector("#interpretFortuneButton"); - const heartButton = document.querySelector("#interpretHeartButton"); - trendButton.disabled = loading || !state.heavenSetup?.chart?.available; - fortuneButton.disabled = loading || !state.heavenSetup?.field; - heartButton.disabled = loading || state.heartLines.length !== 6; - trendButton.textContent = loading && state.heavenReadingMode === "trend" ? "正在观势" : state.heavenInterpretations.trend ? HEAVEN_READING_META.trend.done : HEAVEN_READING_META.trend.action; - fortuneButton.textContent = loading && state.heavenReadingMode === "fortune" ? "正在察运" : state.heavenInterpretations.fortune ? HEAVEN_READING_META.fortune.done : HEAVEN_READING_META.fortune.action; - heartButton.textContent = loading && state.heavenReadingMode === "heart" ? "正在解卦" : state.heavenInterpretations.heart ? HEAVEN_READING_META.heart.done : HEAVEN_READING_META.heart.action; - document.querySelector("#viewHeartReadingButton").disabled = !state.heavenInterpretations.heart; -} - -function renderHeavenInterpretation() { - updateHeavenInterpretationControls(); -} - -function initializeHeartAtmosphere() { - const whisperContainer = document.querySelector("#heartWhispers"); - if (whisperContainer && !whisperContainer.children.length) { - whisperContainer.innerHTML = HEART_WHISPERS.map(([text, x, y, index]) => ` - ${escapeHtml(text)} - `).join(""); - } - activateHeartRises(document.querySelector(".heart-stage.active-heart-stage")); -} - -function toggleHeartSound() { - heartSound.enabled = !heartSound.enabled; - const button = document.querySelector("#heartSoundToggle"); - button.setAttribute("aria-pressed", String(heartSound.enabled)); - button.setAttribute("aria-label", heartSound.enabled ? "关闭观心声音" : "开启观心声音"); - button.innerHTML = `${heartSound.enabled ? "有声" : "静音"}`; - if (heartSound.enabled) { - heartSound.ensure(); - heartSound.chime(520); - } - refreshIcons(); -} - -function setHeartLamp(stage) { - const lamp = document.querySelector("#heartLamp"); - if (lamp) lamp.dataset.heartStage = stage; -} - -function startHeartDust() { - stopHeartDust(); - const canvas = document.querySelector("#heartDustCanvas"); - const panel = document.querySelector("#heavenHeartPanel"); - if (!canvas || !panel || !panel.clientWidth || !panel.clientHeight) return; - const context = canvas.getContext("2d"); - const ratio = Math.min(2, window.devicePixelRatio || 1); - const width = panel.clientWidth; - const height = panel.clientHeight; - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - canvas.style.height = `${height}px`; - context.setTransform(ratio, 0, 0, ratio, 0, 0); - if (!heartDustParticles.length) { - heartDustParticles = Array.from({ length: 60 }, (_, index) => ({ - x: Math.random(), - y: Math.random(), - radius: 0.6 + Math.random() * 1.5, - alpha: 0.03 + Math.random() * 0.09, - vx: (Math.random() - 0.5) * 0.00006, - vy: -(0.00002 + Math.random() * 0.00008), - phase: Math.random() * Math.PI * 2, - gold: index % 2 === 0, - })); - } - const draw = (now) => { - context.clearRect(0, 0, width, height); - heartDustParticles.forEach((particle) => { - if (motionEnabled()) { - particle.x += particle.vx; - particle.y += particle.vy; - particle.phase += 0.006; - } - if (particle.y < -0.02) { - particle.y = 1.02; - particle.x = Math.random(); - } - if (particle.x < -0.02) particle.x = 1.02; - if (particle.x > 1.02) particle.x = -0.02; - const alpha = particle.alpha * (0.65 + 0.35 * Math.sin(particle.phase)); - context.beginPath(); - context.arc(particle.x * width, particle.y * height, particle.radius, 0, Math.PI * 2); - context.fillStyle = particle.gold ? `rgba(220,195,140,${alpha})` : `rgba(190,200,225,${alpha * 0.8})`; - context.fill(); - }); - if (motionEnabled() && state.activeView === "heavenView" && state.heavenPanel === "heart") { - heartDustAnimationFrame = requestAnimationFrame(draw); - } else { - heartDustAnimationFrame = 0; - } - }; - heartDustAnimationFrame = requestAnimationFrame(draw); -} - -function stopHeartDust() { - if (heartDustAnimationFrame) cancelAnimationFrame(heartDustAnimationFrame); - heartDustAnimationFrame = 0; -} - -function activateHeartRises(stage) { - if (!stage) return; - stage.querySelectorAll(".heart-rise").forEach((item) => { - item.classList.remove("is-visible"); - const delay = motionEnabled() ? number(item.dataset.heartDelay) : 0; - setTimeout(() => { - if (stage.classList.contains("active-heart-stage")) item.classList.add("is-visible"); - }, delay); - }); -} - -async function transitionHeartStage(nextStage) { - const token = ++state.heartStageToken; - state.heartRevealToken += 1; - const current = document.querySelector(".heart-stage.active-heart-stage"); - current?.classList.add("is-leaving"); - if (current && !await waitForHeartMotion(1050, token)) return false; - state.heartStage = nextStage; - renderHeartStage(); - return token === state.heartStageToken; -} - -function waitForHeartMotion(duration, token = state.heartStageToken) { - return new Promise((resolve) => { - setTimeout(() => resolve(token === state.heartStageToken), motionEnabled() ? duration : 0); - }); -} - -async function startHeartBreathing() { - if (state.heartTimer) clearInterval(state.heartTimer); - state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000; - state.heartBreathingEndsAt = 0; - document.querySelector("#beginCastingButton")?.classList.remove("is-ready"); - if (!await transitionHeartStage("breathing")) return; - state.heartBreathingEndsAt = Date.now() + HEART_BREATH_TOTAL_MS; - const ember = document.querySelector("#heartIncenseEmber"); - heartIncenseAnimation?.cancel(); - ember?.classList.remove("is-burning"); - if (ember) void ember.offsetWidth; - ember?.classList.add("is-burning"); - heartIncenseAnimation = ember?.animate( - [{ top: "0%" }, { top: "100%" }], - { - duration: HEART_BREATH_ACTIVE_MS, - delay: HEART_BREATH_PREPARE_MS, - easing: "linear", - fill: "forwards", - }, - ) || null; - updateBreathingDisplay(); - state.heartTimer = setInterval(() => { - state.heartSeconds = Math.max(0, Math.ceil((state.heartBreathingEndsAt - Date.now()) / 1000)); - updateBreathingDisplay(); - if (state.heartSeconds <= 0) finishHeartBreathing(); - }, 200); -} - -function finishHeartBreathing() { - if (state.heartTimer) clearInterval(state.heartTimer); - state.heartTimer = null; - state.heartBreathingEndsAt = 0; - state.heartSeconds = 0; - updateBreathingDisplay(); - const button = document.querySelector("#beginCastingButton"); - button.disabled = false; - button.classList.add("is-ready"); - heartSound.chime(520); -} - -function updateBreathingDisplay() { - const remainingMs = state.heartBreathingEndsAt - ? Math.max(0, state.heartBreathingEndsAt - Date.now()) - : Math.max(0, state.heartSeconds * 1000); - const elapsedMs = HEART_BREATH_TOTAL_MS - remainingMs; - const activeElapsedMs = Math.max(0, elapsedMs - HEART_BREATH_PREPARE_MS); - const cycleElapsedMs = activeElapsedMs % HEART_BREATH_CYCLE_MS; - const breathPhase = elapsedMs < HEART_BREATH_PREPARE_MS - ? "prepare" - : cycleElapsedMs < HEART_BREATH_INHALE_MS - ? "inhale" - : cycleElapsedMs < HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS - ? "hold" - : "exhale"; - const phase = state.heartSeconds <= 0 ? "settled" : breathPhase; - const scene = document.querySelector("#breathingScene"); - scene.dataset.phase = phase; - setText("breathingPhase", phase === "settled" ? "静" : phase === "prepare" ? "静" : phase === "inhale" ? "吸" : phase === "hold" ? "顿" : "呼"); - const prompt = state.heartSeconds <= 0 - ? "静心已成,可以起卦" - : phase === "prepare" - ? "放松片刻,准备呼吸" - : phase === "hold" - ? "停驻片刻,让念头自然沉下" - : activeElapsedMs < 18_000 - ? phase === "inhale" ? "缓慢吸气,放下对答案的预设" : "缓慢呼气,让预设随之松开" - : activeElapsedMs < 36_000 - ? phase === "inhale" ? "吸气,只留下真正想问的事" : "呼气,不急着寻找答案" - : phase === "inhale" ? "吸气,让心停在此刻" : "呼气,不追逐经过的念头"; - setText("breathingPrompt", prompt); -} - -async function beginHeartCasting() { - if (state.heartSeconds > 0) return; - state.heartLines = []; - state.heartThrows = []; - state.heartHexagram = null; - state.heavenInterpretations.heart = ""; - heartCastingBusy = false; - resetHeartCoins(); - await transitionHeartStage("casting"); -} - -function initializeHeartCoinHold() { - const button = document.querySelector("#tossCoinsButton"); - const coins = [...document.querySelectorAll(".heart-coin")]; - const cancelHold = (cancelled = true) => { - if (heartHoldTimer) clearTimeout(heartHoldTimer); - heartHoldTimer = null; - cancelAnimationFrame(heartHoldAnimationFrame); - heartHoldAnimationFrame = 0; - button.classList.remove("is-holding"); - button.style.setProperty("--hold-progress", "0turn"); - coins.forEach((coin) => coin.classList.remove("is-shaking")); - if (cancelled) heartHoldStartedAt = 0; - }; - button.addEventListener("pointerdown", (event) => { - if (button.disabled || heartCastingBusy || (event.button !== 0 && event.pointerType !== "touch")) return; - event.preventDefault(); - heartSound.ensure(); - heartHoldTriggered = false; - heartHoldStartedAt = performance.now(); - button.setPointerCapture?.(event.pointerId); - button.classList.add("is-holding"); - coins.forEach((coin) => coin.classList.add("is-shaking")); - const charge = () => { - if (!heartHoldStartedAt) return; - const progress = Math.min(1, (performance.now() - heartHoldStartedAt) / 1400); - button.style.setProperty("--hold-progress", `${progress}turn`); - if (progress < 1) heartHoldAnimationFrame = requestAnimationFrame(charge); - }; - heartHoldAnimationFrame = requestAnimationFrame(charge); - }); - button.addEventListener("pointerup", async () => { - if (!heartHoldStartedAt) return; - const heldFor = performance.now() - heartHoldStartedAt; - heartHoldStartedAt = 0; - cancelHold(false); - heartHoldTriggered = true; - if (heldFor < 550) await waitForMotion(550 - heldFor); - await tossHeartCoins(); - }); - button.addEventListener("pointercancel", () => cancelHold(true)); - button.addEventListener("click", (event) => { - if (heartHoldTriggered) { - heartHoldTriggered = false; - event.preventDefault(); - return; - } - if (event.detail === 0 && !heartCastingBusy) tossHeartCoins(); - }); -} - -async function tossHeartCoins() { - if (heartCastingBusy) return; - if (state.heartLines.length >= 6) { - heartCastingBusy = true; - await finalizeHeartHexagram(); - return; - } - const stageToken = state.heartStageToken; - const button = document.querySelector("#tossCoinsButton"); - heartCastingBusy = true; - button.disabled = true; - const random = new Uint32Array(3); - crypto.getRandomValues(random); - const coins = [...random].map((value) => value % 2 === 1); - await animateHeartCoins(coins); - if (stageToken !== state.heartStageToken || state.heartStage !== "casting") { - heartCastingBusy = false; - return; - } - const heads = coins.filter(Boolean).length; - const lineValue = 6 + heads; - state.heartLines.push(lineValue); - state.heartThrows.push(coins.map((head) => head ? "正" : "背")); - renderHeartCasting(); - if (state.heartLines.length === 6) { - await finalizeHeartHexagram(); - } else { - await waitForMotion(720); - heartCastingBusy = false; - button.disabled = false; - } -} - -async function animateHeartCoins(results) { - const coinElements = [...document.querySelectorAll(".heart-coin")]; - setText("castingPrompt", "铜钱离手"); - const animations = coinElements.map((coin, index) => { - coin.getAnimations().forEach((animation) => animation.cancel()); - const inner = coin.querySelector(".heart-coin-inner"); - inner.getAnimations().forEach((animation) => animation.cancel()); - const current = heartCoinRotations[index]; - const faceRotation = results[index] ? 0 : 180; - const delta = ((faceRotation - (current % 360)) + 360) % 360; - const target = current + 1440 + index * 360 + delta; - heartCoinRotations[index] = target; - const duration = motionEnabled() ? 1500 + index * 160 : 10; - const delay = motionEnabled() ? index * 150 : 0; - coin.dataset.face = results[index] ? "front" : "back"; - const spin = inner.animate( - [{ transform: `rotateY(${current}deg)` }, { transform: `rotateY(${target}deg)` }], - { duration, delay, easing: "cubic-bezier(.25,.55,.3,1)", fill: "forwards" }, - ); - const tilt = Math.random() * 10 - 5; - const flight = coin.animate([ - { transform: "translateY(0) rotateZ(0deg)" }, - { transform: `translateY(-30vh) rotateZ(${tilt}deg)`, offset: 0.42 }, - { transform: `translateY(0) rotateZ(${tilt}deg)`, offset: 0.78 }, - { transform: "translateY(-13px) rotateZ(0deg)", offset: 0.9 }, - { transform: "translateY(0) rotateZ(0deg)" }, - ], { duration, delay, easing: "cubic-bezier(.3,.6,.35,1)", fill: "forwards" }); - setTimeout(() => { - const ring = coin.querySelector(".heart-coin-ring"); - ring.classList.remove("is-bursting"); - void ring.offsetWidth; - ring.classList.add("is-bursting"); - heartSound.coin(); - }, delay + duration * 0.79); - return Promise.allSettled([spin.finished, flight.finished]); - }); - await Promise.all(animations); - setText("castingPrompt", "听其落定"); - await waitForMotion(420); -} - -async function finalizeHeartHexagram() { - const stageToken = state.heartStageToken; - const button = document.querySelector("#tossCoinsButton"); - button.disabled = true; - button.textContent = "正在成卦"; - try { - const payload = await apiRequest("/api/heaven/hexagram", "POST", { lines: state.heartLines }); - if (stageToken !== state.heartStageToken || state.heartStage !== "casting") return; - state.heartHexagram = payload.hexagram; - updateHeavenInterpretationControls(); - document.querySelector(".heart-hexagram-shell")?.classList.add("is-complete"); - setText("castingPrompt", "卦成了"); - heartSound.chime(660); - await waitForMotion(2200); - if (!await transitionHeartStage("reveal")) return; - await playHeartRevealSequence(); - } catch (error) { - showHeavenNotice(error.message || "成卦失败"); - button.disabled = false; - button.innerHTML = '按住
    重新成卦
    '; - heartCastingBusy = false; - } -} - -function renderHeartStage() { - document.querySelectorAll(".heart-stage").forEach((stage) => stage.classList.remove("active-heart-stage")); - const stageMap = { - intro: "heartIntro", - breathing: "heartBreathing", - casting: "heartCasting", - reveal: "heartReveal", - interpretation: "heartInterpretationStage", - }; - document.querySelectorAll(".heart-stage").forEach((stage) => stage.classList.remove("is-leaving")); - const activeStage = document.querySelector(`#${stageMap[state.heartStage]}`); - activeStage.classList.add("active-heart-stage"); - document.querySelectorAll("[data-heart-step]").forEach((step) => { - step.classList.toggle("active", step.dataset.heartStep === state.heartStage); - }); - setHeartLamp(state.heartStage); - activateHeartRises(activeStage); - if (state.heartStage === "breathing") { - document.querySelector("#beginCastingButton").disabled = state.heartSeconds > 0; - updateBreathingDisplay(); - } - if (state.heartStage === "casting") renderHeartCasting(); - if (state.heartStage === "reveal" && state.heartHexagram) renderHeartReveal(); - if (state.heartStage === "interpretation" && state.heartHexagram) renderHeartRead(); -} - -function renderHeartCasting() { - setText("castingProgress", `${state.heartLines.length} / 6`); - const latestThrow = state.heartThrows[state.heartThrows.length - 1] || ["静", "静", "静"]; - document.querySelectorAll(".heart-coin").forEach((coin, index) => { - coin.setAttribute("aria-label", latestThrow[index] === "静" ? `第 ${index + 1} 枚铜钱待掷` : `第 ${index + 1} 枚铜钱${latestThrow[index]}`); - }); - const nextPosition = LINE_POSITIONS_CLIENT[state.heartLines.length] || "成卦"; - setText( - "castingPrompt", - state.heartLines.length < 6 - ? `心中默念所问之事,然后掷出${nextPosition}` - : "六爻已具,正在成卦", - ); - const button = document.querySelector("#tossCoinsButton"); - button.innerHTML = state.heartLines.length < 6 - ? `按住
    摇${nextPosition}
    ` - : '正在
    成卦
    '; - button.disabled = heartCastingBusy || state.heartLines.length >= 6; - const rows = []; - for (let index = 5; index >= 0; index -= 1) { - const value = state.heartLines[index]; - rows.push(` -
    - ${LINE_POSITIONS_CLIENT[index]} - ${value ? hexagramLineGraphic(value) : ''} -
    ${value ? `${lineValueName(value)} · ${value}` : "未得"}
    -
    - `); - } - document.querySelector("#heartCastingLines").innerHTML = rows.join(""); -} - -function renderHeartReveal() { - const hexagram = state.heartHexagram; - setText("heartHexagramName", `${hexagram.outer_trigram}上${hexagram.inner_trigram}下 · ${hexagram.name}`); - setText("heartTransformedName", hexagram.transformed.name); - setText("heartHexagramText", hexagram.text); - renderHexagramLines("heartHexagramLines", hexagram.lines, false); - document.querySelector("#heartHexagramLines").querySelectorAll(".hexagram-line-row").forEach((row) => row.classList.add("heart-reveal-line")); - document.querySelector("#heartReveal").classList.remove("is-sequence-ready", "is-title-ready", "is-thought-typing", "is-thought-ready"); - const prompt = document.querySelector("#heartFirstThoughtPrompt"); - prompt.dataset.fullText = "看见卦象与爻辞后,心里升起的第一念是什么?"; - prompt.textContent = ""; - const button = document.querySelector("#interpretHeartButton"); - button.disabled = true; - button.classList.remove("is-ready"); -} - -async function playHeartRevealSequence() { - const token = ++state.heartRevealToken; - const stageToken = state.heartStageToken; - const stage = document.querySelector("#heartReveal"); - const lines = [...stage.querySelectorAll(".heart-reveal-line")].reverse(); - lines.forEach((line) => line.classList.remove("is-revealed")); - if (!await waitForHeartMotion(280, stageToken)) return; - for (const line of lines) { - if (token !== state.heartRevealToken || state.heartStage !== "reveal") return; - line.classList.add("is-revealed"); - if (!await waitForHeartMotion(520, stageToken)) return; - } - stage.classList.add("is-title-ready", "is-sequence-ready"); - heartSound.chime(520); - if (!await waitForHeartMotion(1200, stageToken)) return; - const prompt = document.querySelector("#heartFirstThoughtPrompt"); - stage.classList.add("is-thought-typing"); - if (!await typeHeartText(prompt, prompt.dataset.fullText, token, 72)) return; - stage.classList.add("is-thought-ready"); - if (!await waitForHeartMotion(2400, stageToken)) return; - const button = document.querySelector("#interpretHeartButton"); - button.disabled = false; - button.classList.add("is-ready"); -} - -function initializeHeartLineInspection() { - const container = document.querySelector("#heartLineTexts"); - container.addEventListener("click", (event) => { - const item = event.target.closest(".heart-line-text"); - if (!item) return; - const inspected = item.classList.toggle("is-inspected"); - item.setAttribute("aria-expanded", String(inspected)); - }); -} - -async function typeHeartText(element, text, token, speed = 72) { - if (!element) return false; - if (!motionEnabled()) { - element.textContent = text; - return true; - } - element.textContent = ""; - element.classList.add("heart-typing"); - for (const character of text) { - if (token !== state.heartRevealToken || state.heartStage !== "reveal") return false; - element.append(document.createTextNode(character)); - await new Promise((resolve) => setTimeout(resolve, speed)); - } - element.classList.remove("heart-typing"); - return true; -} - -function renderHeartRead() { - const hexagram = state.heartHexagram; - setText("heartReadTitle", hexagram.name); - setText("heartReadChange", hexagram.transformed.name === hexagram.name ? "六爻安静,无之卦" : `之卦 · ${hexagram.transformed.name}`); - setText("heartReadGuaci", hexagram.text); - document.querySelector("#heartReadLines").innerHTML = [...hexagram.lines].reverse().map((line) => ` -
    - ${escapeHtml(line.position_name)}${hexagramLineGraphic(line.value)} -
    - `).join(""); - document.querySelector("#heartReadTexts").innerHTML = hexagram.lines.map((line) => ` -
    - ${escapeHtml(line.line_name)}${line.moving ? " · 动" : ""}

    ${escapeHtml(line.text)}

    -
    - `).join(""); - renderHeavenInterpretation("heart", state.heavenInterpretations.heart); - const stage = document.querySelector("#heartInterpretationStage"); - stage.classList.remove("is-read-heading-ready", "is-read-complete"); -} - -async function playHeartReadSequence() { - const token = state.heartStageToken; - const stage = document.querySelector("#heartInterpretationStage"); - if (!await waitForHeartMotion(420, token)) return; - stage.classList.add("is-read-heading-ready"); - const lines = [...stage.querySelectorAll(".heart-read-line")].reverse(); - const texts = [...stage.querySelectorAll(".heart-read-text")]; - for (let index = 0; index < 6; index += 1) { - lines[index]?.classList.add("is-visible"); - texts[index]?.classList.add("is-visible"); - if (!await waitForHeartMotion(680, token)) return; - } - stage.classList.add("is-read-complete"); -} - -function resetHeartCoins() { - heartCoinRotations.fill(0); - document.querySelectorAll(".heart-coin").forEach((coin) => { - coin.getAnimations().forEach((animation) => animation.cancel()); - const inner = coin.querySelector(".heart-coin-inner"); - inner.getAnimations().forEach((animation) => animation.cancel()); - inner.style.transform = ""; - coin.style.transform = ""; - coin.dataset.face = ""; - coin.querySelector(".heart-coin-ring").classList.remove("is-bursting"); - }); - const shell = document.querySelector(".heart-hexagram-shell"); - shell?.classList.remove("is-complete"); -} - -async function resetHeartRitual() { - if (state.heartTimer) clearInterval(state.heartTimer); - state.heartTimer = null; - state.heartSeconds = HEART_BREATH_TOTAL_MS / 1000; - state.heartBreathingEndsAt = 0; - state.heartLines = []; - state.heartThrows = []; - state.heartHexagram = null; - state.heavenInterpretations.heart = ""; - heartIncenseAnimation?.cancel(); - heartIncenseAnimation = null; - document.querySelector("#heartIncenseEmber")?.classList.remove("is-burning"); - updateHeavenInterpretationControls(); - state.heartRevealToken += 1; - heartCastingBusy = false; - resetHeartCoins(); - hideHeavenNotice(); - await transitionHeartStage("intro"); -} - -function showHeavenNotice(message) { - const notice = document.querySelector("#heavenNotice"); - notice.textContent = message; - notice.hidden = false; -} - -function hideHeavenNotice() { - document.querySelector("#heavenNotice").hidden = true; -} - -function phaseClass(element) { - return { 木: "wood", 火: "fire", 土: "earth", 金: "metal", 水: "water" }[element] || "earth"; -} - -function signedScore(value) { - const parsed = number(value); - return `${parsed > 0 ? "+" : ""}${formatNumber(parsed, 2)}`; -} - -function lineValueName(value) { - return { 6: "老阴", 7: "少阳", 8: "少阴", 9: "老阳" }[value] || ""; -} - -function capitalize(value) { - return value.charAt(0).toUpperCase() + value.slice(1); -} - -const LINE_POSITIONS_CLIENT = ["初爻", "二爻", "三爻", "四爻", "五爻", "上爻"]; - -function renderScreenerResult() { - const mode = state.screenerMode || "smart"; - const result = activeScreenerResult(mode); - const context = activeScreenerResultContext(mode); - const source = document.querySelector("#screenerResultSource"); - const emptyMessages = { - smart: "当日盘后候选尚未生成", - curated: "所选策略的当日候选尚未生成", - quant: "尚未执行自定义选股", - }; - if (!result) { - setText("screenerResultCount", "0 只"); - source.hidden = true; - source.textContent = ""; - setText("screenerDisclaimer", "历史统计不代表未来收益"); - document.querySelector("#screenerTableBody").innerHTML = ""; - document.querySelector("#screenerEmpty").textContent = emptyMessages[mode]; - document.querySelector("#screenerEmpty").hidden = false; - renderBacktest(null); - if (mode === "smart") setText("screenerRunStatus", "等待执行"); - updateBacktestTaskStatus(); - renderScreenerProgress(); - return; - } - const candidates = result.candidates || []; - setText("screenerResultCount", `${candidates.length} 只`); - const modeLabels = { smart: "阶段选股", curated: "策略选股", quant: "自定义选股" }; - const sourceParts = [modeLabels[mode]]; - if (mode === "smart" && context?.regime) sourceParts.push(regimeLabel(context.regime)); - sourceParts.push(mode === "quant" ? "自定义因子权重" : context?.strategyName || result.meta?.strategy_name || "未命名策略"); - source.textContent = sourceParts.join(" · "); - source.hidden = false; - const meta = result.meta || {}; - setText( - "screenerDisclaimer", - meta.realtime - ? `盘中行情 · 历史样本截至 ${displayCompactDate(meta.history_cutoff)} · ${result.disclaimer}` - : `盘后数据 ${displayCompactDate(meta.trade_date)} · ${result.disclaimer}`, - ); - const empty = document.querySelector("#screenerEmpty"); - empty.textContent = mode === "curated" ? "暂无符合条件个股" : emptyMessages[mode]; - empty.hidden = candidates.length > 0; - const body = document.querySelector("#screenerTableBody"); - const runId = number(meta.run_id); - body.innerHTML = candidates.map((row, index) => ` - ${index + 1} - ${escapeHtml(row.name)}${escapeHtml(row.code)}${escapeHtml(row.sector)} - ${formatNumber(row.score_display, 1)} - ${row.historical_probability === null ? "" : formatNumber(row.historical_probability, 1)}${number(row.probability_samples)} 个样本 - ${signed(row.pct_chg)} - ${signed(row.return_5d)} - ${formatNumber(row.volume_ratio_5d, 2)}${formatNumber(row.sector_strength, 1)} - ${escapeHtml(row.reason)} - ${escapeHtml(row.risk_flags.join(";"))} - - `).join(""); - body.querySelectorAll("[data-screen-detail]").forEach((button) => { - button.addEventListener("click", () => { - const row = candidates.find((item) => item.code === button.dataset.screenDetail); - openStock(row.code, row); - }); - }); - body.querySelectorAll("[data-add-tracking]").forEach((button) => { - button.addEventListener("click", () => addCandidateToTracking(button.dataset.addTracking, button)); - }); - bindStockRows(body); - renderBacktest(result.backtest); - if (mode === "smart") setText("screenerRunStatus", `完成 · ${candidates.length} 只`); - updateBacktestTaskStatus(); - renderScreenerProgress(); -} - -async function loadScreenerTracking(force = false) { - if (state.screenerTracking && !force) { - renderScreenerTracking(); - return; - } - try { - state.screenerTracking = await apiRequest("/api/screener/tracking?limit=12"); - renderScreenerTracking(); - if (activeScreenerResult()) renderScreenerResult(); - } catch (error) { - showToast(error.message || "策略跟踪加载失败"); - } -} - -function isCandidateTracked(runId, code) { - if (!runId) return false; - return (state.screenerTracking?.batches || []).some((batch) => - number(batch.run_id) === number(runId) - && (batch.items || []).some((item) => item.code === code)); -} - -async function addCandidateToTracking(code, button) { - const runId = number(activeScreenerResult()?.meta?.run_id); - if (!runId) { - showToast("本次结果缺少选股批次,请重新执行后再加入跟踪"); - return; - } - button.disabled = true; - try { - const payload = await apiRequest("/api/screener/tracking", "POST", { run_id: runId, code }); - state.screenerTracking = payload.tracking; - renderScreenerTracking(); - renderScreenerResult(); - showToast(`${code} 已加入策略跟踪`); - } catch (error) { - button.disabled = false; - showToast(error.message || "加入跟踪失败"); - } -} - -async function refreshScreenerTracking() { - const button = document.querySelector("#refreshTrackingButton"); - button.disabled = true; - setStatus("正在更新策略跟踪"); - try { - const payload = await apiRequest("/api/screener/tracking/refresh", "POST", { - trade_date: elements.tradeDate.value, - }); - state.screenerTracking = payload.tracking; - renderScreenerTracking(); - if (payload.notice) showToast(payload.notice); - setStatus("策略跟踪已更新"); - } catch (error) { - showToast(error.message || "策略跟踪刷新失败"); - setStatus("策略跟踪刷新失败"); - } finally { - button.disabled = false; - } -} - -function renderScreenerTracking() { - const payload = state.screenerTracking || { batches: [], summary: {} }; - const batches = payload.batches || []; - const rows = batches.flatMap((batch) => (batch.items || []).map((item) => ({ - ...item, - run_id: batch.run_id, - selection_date: batch.selection_date, - strategy_name: batch.strategy_name, - }))); - setText("trackingBatchCount", `${batches.length} 批`); - const summary = payload.summary || {}; - document.querySelector("#trackingSummary").innerHTML = [ - ["跟踪标的", `${number(summary.total)} 只`], - ["已有 T+1", `${number(summary.observed)} 只`], - ["T+1 胜率", trackingPercent(summary.t1_win_rate)], - ["T+5 胜率", trackingPercent(summary.t5_win_rate)], - ["T+5 平均", trackingReturn(summary.average_t5)], - ].map(([label, value]) => `
    ${label}${value}
    `).join(""); - document.querySelector("#trackingEmpty").hidden = rows.length > 0; - document.querySelector("#trackingTableBody").innerHTML = rows.map((row) => ` - - ${displayCompactDate(row.selection_date)} - ${escapeHtml(row.strategy_name)} - ${escapeHtml(row.name)}${escapeHtml(row.code)} - ${row.entry_price == null ? "" : formatNumber(row.entry_price, 2)} - ${["t1_open", "t1_close", "t3_close", "t5_close", "max_gain", "max_drawdown"].map((key) => `${trackingReturn(row[key], false)}`).join("")} - ${escapeHtml(row.status)} - - - `).join(""); - bindStockRows(document.querySelector("#trackingTableBody")); -} - -async function handleTrackingTableAction(event) { - const button = event.target.closest("[data-remove-tracking]"); - if (!button) return; - if (!window.confirm("确定停止跟踪这只股票吗?")) return; - button.disabled = true; - try { - const payload = await apiRequest(`/api/screener/tracking/${button.dataset.removeTracking}`, "DELETE"); - state.screenerTracking = payload.tracking; - renderScreenerTracking(); - if (activeScreenerResult()) renderScreenerResult(); - showToast("已移出策略跟踪"); - } catch (error) { - button.disabled = false; - showToast(error.message || "移除跟踪失败"); - } -} - -function trackingReturn(value, includeUnit = true) { - return value == null ? (includeUnit ? "--" : "") : `${signed(value)}${includeUnit ? "%" : ""}`; -} - -function trackingPercent(value) { - return value == null ? "--" : `${formatNumber(value, 1)}%`; -} - -function renderBacktest(backtest) { - const panel = document.querySelector("#backtestPanel"); - panel.hidden = !backtest; - if (!backtest) return; - setText("backtestDefinition", backtest.definition); - document.querySelector("#backtestMetrics").innerHTML = [ - ["历史样本", `${number(backtest.samples)} 个`], - ["条件胜率", `${formatNumber(backtest.win_rate, 1)}%`], - ["平均3日收益", `${signed(backtest.average_3d_return)}%`], - ["平均最大回撤", `${signed(backtest.average_drawdown)}%`], - ].map(([label, value]) => `
    ${label}${value}
    `).join(""); -} - -function parseFormulaEditor() { - try { - return JSON.parse(document.querySelector("#formulaEditor").value); - } catch { - throw new Error("受控公式不是有效的 JSON"); - } -} - -function exportScreenerResults() { - const modeLabels = { smart: "阶段选股", curated: "策略选股", quant: "量化选股" }; - exportRows(modeLabels[state.screenerMode] || "智能选股", activeScreenerResult()?.candidates || [], [ - ["股票代码", "code"], ["股票名称", "name"], ["板块", "sector"], ["综合分", "score_display"], - ["历史条件估计%", "historical_probability"], ["当日涨幅%", "pct_chg"], ["5日涨幅%", "return_5d"], - ["10日涨幅%", "return_10d"], ["量比", "volume_ratio_5d"], ["板块强度", "sector_strength"], - ["主要贡献", "reason"], ["风险标记", "risk_flags"], - ]); -} - -function regimeLabel(regime) { - return state.screenerSetup?.regimes?.find((item) => item.id === regime)?.label || regime; -} - -function currentChartPalette() { - const style = getComputedStyle(document.documentElement); - const color = (token, fallback) => style.getPropertyValue(token).trim() || fallback; - return { - background: color("--chart-background", "#fbfcfd"), - grid: color("--chart-grid", "#e2e8ec"), - axis: color("--chart-axis", "#6c7983"), - zero: color("--chart-zero", "#aeb7c1"), - line: color("--chart-line", "#1d65c1"), - average: color("--chart-average", "#b7791f"), - up: color("--chart-up", "#c93f45"), - down: color("--chart-down", "#087a55"), - upVolume: color("--chart-up-volume", "rgba(201, 63, 69, .58)"), - downVolume: color("--chart-down-volume", "rgba(8, 122, 85, .58)"), - area: color("--chart-area", "rgba(37, 99, 235, .07)"), - alertArea: color("--chart-alert-area", "rgba(224, 69, 54, .05)"), - movingAverage: color("--chart-moving-average", "#d1d5db"), - repair: color("--chart-repair", "#f59e0b"), - ma10: color("--chart-ma-10", "#a76500"), - ma20: color("--chart-ma-20", "#626c78"), - }; -} - -function drawCandlestick(context, x, item, priceY, candleWidth, palette = currentChartPalette()) { - const rising = number(item.close) >= number(item.open); - const color = rising ? palette.up : palette.down; - const highY = priceY(item.high); - const lowY = priceY(item.low); - const openY = priceY(item.open); - const closeY = priceY(item.close); - const bodyTop = Math.min(openY, closeY); - const bodyBottom = Math.max(openY, closeY); - const bodyHeight = Math.max(1, bodyBottom - bodyTop); - - context.strokeStyle = color; - context.fillStyle = color; - context.lineWidth = 1; - context.beginPath(); - context.moveTo(x, highY); - context.lineTo(x, bodyTop); - context.moveTo(x, bodyBottom); - context.lineTo(x, lowY); - context.stroke(); - - const bodyLeft = x - candleWidth / 2; - if (rising) { - context.fillStyle = palette.background; - context.fillRect(bodyLeft, bodyTop, candleWidth, bodyHeight); - context.strokeStyle = color; - context.strokeRect(bodyLeft, bodyTop, candleWidth, bodyHeight); - } else { - context.fillStyle = color; - context.fillRect(bodyLeft, bodyTop, candleWidth, bodyHeight); - } - return color; -} - -function drawPriceChart(prices) { - const canvas = elements.priceChart; - if (!prices?.length) { - clearPriceChart("暂无日 K 数据"); - return; - } - const rect = canvas.getBoundingClientRect(); - const ratio = window.devicePixelRatio || 1; - const width = Math.max(320, rect.width); - const height = Math.max(220, rect.height); - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - context.clearRect(0, 0, width, height); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - - const left = 48; - const right = 12; - const top = 14; - const bottom = 22; - const volumeHeight = 54; - const gap = 12; - const priceBottom = height - bottom - volumeHeight - gap; - const plotWidth = width - left - right; - const highs = prices.map((item) => number(item.high)); - const lows = prices.map((item) => number(item.low)); - const maximum = Math.max(...highs); - const minimum = Math.min(...lows); - const range = Math.max(maximum - minimum, maximum * 0.01, 0.01); - const volumes = prices.map((item) => number(item.volume)); - const maxVolume = Math.max(...volumes, 1); - const priceY = (value) => top + (maximum - value) / range * (priceBottom - top); - const step = plotWidth / prices.length; - const candleWidth = clamp(step * 0.62, 2, 8); - - context.strokeStyle = palette.grid; - context.fillStyle = palette.axis; - context.font = "11px Microsoft YaHei"; - context.textAlign = "right"; - for (let line = 0; line <= 4; line += 1) { - const y = top + (priceBottom - top) * line / 4; - context.beginPath(); - context.moveTo(left, y); - context.lineTo(width - right, y); - context.stroke(); - context.fillText((maximum - range * line / 4).toFixed(2), left - 5, y + 4); - } - - prices.forEach((item, index) => { - const x = left + step * index + step / 2; - const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); - const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; - context.fillStyle = color; - context.globalAlpha = 0.75; - context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); - context.globalAlpha = 1; - }); - - context.textAlign = "center"; - context.fillStyle = palette.axis; - const labelIndexes = [0, Math.floor((prices.length - 1) / 2), prices.length - 1]; - labelIndexes.forEach((index) => { - const x = left + step * index + step / 2; - context.fillText(String(prices[index].trade_date).slice(5), x, height - 5); - }); -} - -function clearPriceChart(message) { - const canvas = elements.priceChart; - const context = canvas.getContext("2d"); - const rect = canvas.getBoundingClientRect(); - canvas.width = Math.max(320, Math.round(rect.width)); - canvas.height = Math.max(220, Math.round(rect.height)); - const palette = currentChartPalette(); - context.fillStyle = palette.background; - context.fillRect(0, 0, canvas.width, canvas.height); - context.fillStyle = palette.axis; - context.font = "13px Microsoft YaHei"; - context.textAlign = "center"; - context.fillText(message, canvas.width / 2, canvas.height / 2); -} - -function prepareStockPreviewCanvas() { - const canvas = elements.stockPreviewChart; - const rect = canvas.getBoundingClientRect(); - const ratio = window.devicePixelRatio || 1; - const width = Math.max(300, rect.width || 488); - const height = Math.max(210, rect.height || 232); - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - context.clearRect(0, 0, width, height); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - context.font = '11px -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", sans-serif'; - return { canvas, context, width, height, palette }; -} - -function drawPreviewGrid(context, width, top, bottom, left, right, maximum, range) { - const palette = currentChartPalette(); - context.strokeStyle = palette.grid; - context.fillStyle = palette.axis; - context.textAlign = "right"; - context.lineWidth = 1; - for (let line = 0; line <= 3; line += 1) { - const y = top + (bottom - top) * line / 3; - context.beginPath(); - context.moveTo(left, y); - context.lineTo(width - right, y); - context.stroke(); - context.fillText((maximum - range * line / 3).toFixed(2), left - 5, y + 4); - } -} - -function intradayMinuteOffset(value) { - const [hour, minute] = String(value || "").split(":").map((part) => number(part)); - const clockMinute = hour * 60 + minute; - const morningStart = 9 * 60 + 30; - const morningEnd = 11 * 60 + 30; - const afternoonStart = 13 * 60; - const afternoonEnd = 15 * 60; - if (clockMinute <= morningEnd) return clamp(clockMinute - morningStart, 0, 120); - if (clockMinute < afternoonStart) return 120; - return 120 + clamp(clockMinute - afternoonStart, 0, afternoonEnd - afternoonStart); -} - -function drawIntradayCanvas(canvas, points, dailyPrices = [], referenceClose = 0) { - const rect = canvas.getBoundingClientRect(); - const ratio = window.devicePixelRatio || 1; - const width = Math.max(300, rect.width || 488); - const height = Math.max(210, rect.height || 232); - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - context.clearRect(0, 0, width, height); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - context.font = '11px -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", sans-serif'; - const left = 45; - const right = 10; - const top = 12; - const volumeHeight = 38; - const bottom = 18; - const gap = 9; - const priceBottom = height - bottom - volumeHeight - gap; - const closes = points.map((point) => number(point.close)); - const previousClose = number(referenceClose || dailyPrices.at(-2)?.close || points[0]?.open || closes[0]); - const maximum = Math.max(...points.map((point) => number(point.high || point.close)), previousClose); - const minimum = Math.min(...points.map((point) => number(point.low || point.close)), previousClose); - const deviation = Math.max( - Math.abs(maximum - previousClose), - Math.abs(previousClose - minimum), - previousClose * 0.003, - 0.01, - ) * 1.08; - const chartMaximum = previousClose + deviation; - const chartMinimum = previousClose - deviation; - const range = Math.max(chartMaximum - chartMinimum, 0.01); - const plotWidth = width - left - right; - const priceY = (value) => top + (chartMaximum - value) / range * (priceBottom - top); - const pointX = (index) => left + plotWidth * intradayMinuteOffset(points[index]?.time) / 240; - drawPreviewGrid(context, width, top, priceBottom, left, right, chartMaximum, range); - - context.save(); - context.setLineDash([4, 4]); - context.strokeStyle = palette.zero; - context.beginPath(); - context.moveTo(left, priceY(previousClose)); - context.lineTo(width - right, priceY(previousClose)); - context.stroke(); - context.restore(); - context.fillStyle = palette.axis; - context.textAlign = "right"; - context.fillText("0.00%", width - right, priceY(previousClose) - 4); - - context.strokeStyle = palette.line; - context.lineWidth = 1.7; - context.beginPath(); - points.forEach((point, index) => { - const x = pointX(index); - const y = priceY(point.close); - if (index === 0) context.moveTo(x, y); - else context.lineTo(x, y); - }); - context.stroke(); - - const averages = points.map((point) => number(point.average)).filter((value) => value > 0); - if (averages.length) { - context.strokeStyle = palette.average; - context.lineWidth = 1.25; - context.beginPath(); - let averageStarted = false; - points.forEach((point, index) => { - const average = number(point.average); - if (average <= 0) return; - const x = pointX(index); - const y = priceY(average); - if (!averageStarted) { - context.moveTo(x, y); - averageStarted = true; - } else context.lineTo(x, y); - }); - context.stroke(); - } - - const maxVolume = Math.max(...points.map((point) => number(point.volume)), 1); - const barWidth = clamp(plotWidth / Math.max(points.length, 1) * 0.72, 1, 3); - points.forEach((point, index) => { - const x = pointX(index); - const barHeight = number(point.volume) / maxVolume * volumeHeight; - context.fillStyle = number(point.close) >= number(point.open) ? palette.upVolume : palette.downVolume; - context.fillRect(x - barWidth / 2, height - bottom - barHeight, barWidth, barHeight); - }); - - context.fillStyle = palette.axis; - context.textAlign = "center"; - [ - { offset: 0, label: "09:30" }, - { offset: 120, label: "11:30 / 13:00" }, - { offset: 240, label: "15:00" }, - ].forEach((marker) => { - context.fillText(marker.label, left + plotWidth * marker.offset / 240, height - 4); - }); - return { - latest: closes.at(-1), - maximum, - minimum, - }; -} - -function drawIntradayPreviewChart(points, dailyPrices, referenceClose = 0) { - const summary = drawIntradayCanvas(elements.stockPreviewChart, points, dailyPrices, referenceClose); - setText( - "stockPreviewSummary", - `分时 ${points.length} 点,最新 ${formatNumber(summary.latest, 2)},最高 ${formatNumber(summary.maximum, 2)},最低 ${formatNumber(summary.minimum, 2)}。`, - ); -} - -function drawDailyPreviewChart(prices) { - const { context, width, height, palette } = prepareStockPreviewCanvas(); - const visible = prices.slice(-45); - const visibleStart = prices.length - visible.length; - const left = 45; - const right = 10; - const top = 24; - const volumeHeight = 34; - const bottom = 18; - const gap = 8; - const priceBottom = height - bottom - volumeHeight - gap; - const maximum = Math.max(...visible.map((item) => number(item.high))); - const minimum = Math.min(...visible.map((item) => number(item.low))); - const padding = Math.max((maximum - minimum) * 0.05, maximum * 0.002, 0.01); - const chartMaximum = maximum + padding; - const chartMinimum = minimum - padding; - const range = Math.max(chartMaximum - chartMinimum, 0.01); - const plotWidth = width - left - right; - const step = plotWidth / Math.max(visible.length, 1); - const candleWidth = clamp(step * 0.58, 2, 7); - const priceY = (value) => top + (chartMaximum - value) / range * (priceBottom - top); - drawPreviewGrid(context, width, top, priceBottom, left, right, chartMaximum, range); - - const maxVolume = Math.max(...visible.map((item) => number(item.volume)), 1); - visible.forEach((item, index) => { - const x = left + step * index + step / 2; - const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); - const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; - context.fillStyle = color; - context.globalAlpha = 0.62; - context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); - context.globalAlpha = 1; - }); - - const movingAverages = [ - { days: 5, color: palette.line }, - { days: 10, color: palette.ma10 }, - { days: 20, color: palette.ma20 }, - ]; - movingAverages.forEach(({ days, color }) => { - context.strokeStyle = color; - context.lineWidth = 1.25; - context.beginPath(); - let started = false; - visible.forEach((_item, index) => { - const absoluteIndex = visibleStart + index; - if (absoluteIndex < days - 1) return; - const values = prices.slice(absoluteIndex - days + 1, absoluteIndex + 1); - const average = values.reduce((sum, item) => sum + number(item.close), 0) / days; - const x = left + step * index + step / 2; - const y = priceY(average); - if (!started) { - context.moveTo(x, y); - started = true; - } else context.lineTo(x, y); - }); - context.stroke(); - }); - - context.textAlign = "left"; - movingAverages.forEach(({ days, color }, index) => { - context.fillStyle = color; - context.fillText(`MA${days}`, left + index * 42, 12); - }); - context.fillStyle = palette.axis; - context.textAlign = "center"; - [0, Math.floor((visible.length - 1) / 2), visible.length - 1].forEach((index) => { - const x = left + step * index + step / 2; - context.fillText(String(visible[index]?.trade_date || "").slice(5), x, height - 4); - }); - const firstClose = number(visible[0]?.close); - const latestClose = number(visible.at(-1)?.close); - const periodChange = firstClose ? (latestClose / firstClose - 1) * 100 : 0; - setText( - "stockPreviewSummary", - `近 ${visible.length} 日涨跌 ${signed(periodChange)}%,区间最高 ${formatNumber(maximum, 2)},最低 ${formatNumber(minimum, 2)}。`, - ); -} - -function clearStockPreviewChart(message) { - const { context, width, height } = prepareStockPreviewCanvas(); - if (!message) return; - context.fillStyle = "#74808d"; - context.textAlign = "center"; - context.fillText(message, width / 2, height / 2); -} - -function bindStockRows(container) { - animateRows(container); - decorateStockPreviewTargets(container); - container.querySelectorAll("[data-code]").forEach((rowElement) => { - rowElement.addEventListener("click", (event) => { - const interactive = event.target.closest("button, a, input, select, textarea, summary"); - if (interactive && interactive !== rowElement) return; - openStock(rowElement.dataset.code, findStockFallback(rowElement.dataset.code)); - }); - }); -} - -function decorateStockPreviewTargets(container) { - container.querySelectorAll(".stock-code").forEach((trigger) => { - const code = stockCodeFromTrigger(trigger); - if (!code) return; - trigger.classList.add("stock-preview-trigger"); - trigger.tabIndex = 0; - trigger.setAttribute("role", "button"); - trigger.setAttribute("aria-label", `预览 ${code} 行情`); - trigger.title = "悬停预览行情,点击查看完整详情"; - }); -} - -function stockCodeFromTrigger(trigger) { - const candidate = trigger?.dataset?.stockPreviewCode - || trigger?.closest?.("[data-code]")?.dataset?.code - || trigger?.textContent?.trim(); - const matched = String(candidate || "").match(/\b(\d{6})\b/); - return matched ? matched[1] : ""; -} - -function marketPreviewTargetFromTrigger(trigger) { - if (trigger?.classList?.contains("market-preview-trigger")) { - const type = String(trigger.dataset.marketPreviewType || "").trim().toLowerCase(); - const id = String(trigger.dataset.marketPreviewId || "").trim().toUpperCase(); - if (type === "theme" && id) { - const item = (state.themeLibrary?.items || []).find((row) => String(row.code) === id) || {}; - return { - type, - id, - code: id, - name: item.name || trigger.textContent?.trim() || "--", - type_label: "题材", - change: item.change, - value: item.close, - }; - } - } - const code = stockCodeFromTrigger(trigger); - return code ? { type: "stock", id: code, code } : null; -} - -function previewTriggerFromEvent(event) { - return event.target.closest?.(".stock-preview-trigger, .market-preview-trigger"); -} - -function showMarketPreview(target, trigger) { - if (!target) return; - if (target.type === "stock") showStockPreview(target.id, trigger); - else showEntityPreview(target, trigger); -} - -function findStockFallback(code) { - const dashboardRows = [ - ...(state.dashboard?.limits || []), - ...(state.dashboard?.broken || []), - ...(state.dashboard?.down_limits || []), - ...(state.dashboard?.yesterday_limits || []), - ]; - const screenerRows = Object.values(state.screenerResultStore) - .flatMap((entry) => entry?.result?.candidates || []); - const dragonRows = (state.dragonTiger?.traders || []).flatMap((trader) => trader.operations || []); - const auctionRows = state.auctionData?.rows || []; - const themeRows = state.themeDetail?.members || []; - const popularityRows = state.popularityData?.combined || []; - const row = [...dashboardRows, ...screenerRows, ...dragonRows, ...auctionRows, ...themeRows, ...popularityRows, ...(state.watchlist || [])] - .find((item) => String(item.code) === String(code)); - if (!row) return { code, name: "--", sector: "其他" }; - return { - ...row, - code, - change: row.change ?? row.current_change ?? row.pct_chg ?? 0, - sector: row.sector || row.industry || "其他", - }; -} - -function supportsStockPreviewHover() { - return window.matchMedia("(hover: hover) and (pointer: fine)").matches - && window.innerWidth > 720; -} - -function handleStockPreviewPointerOver(event) { - if (!supportsStockPreviewHover()) return; - const trigger = previewTriggerFromEvent(event); - if (!trigger || trigger === event.relatedTarget?.closest?.(".stock-preview-trigger, .market-preview-trigger")) return; - const target = marketPreviewTargetFromTrigger(trigger); - if (!target) return; - cancelStockPreviewClose(); - clearTimeout(stockPreviewOpenTimer); - stockPreviewOpenTimer = setTimeout(() => showMarketPreview(target, trigger), STOCK_PREVIEW_DELAY); -} - -function handleStockPreviewPointerOut(event) { - if (!supportsStockPreviewHover()) return; - const trigger = previewTriggerFromEvent(event); - if (!trigger || trigger === event.relatedTarget?.closest?.(".stock-preview-trigger, .market-preview-trigger")) return; - clearTimeout(stockPreviewOpenTimer); - if (event.relatedTarget instanceof Node && elements.stockPreview.contains(event.relatedTarget)) return; - scheduleStockPreviewClose(); -} - -function handleStockPreviewFocus(event) { - if (!supportsStockPreviewHover()) return; - const trigger = event.target.closest?.(".stock-preview-trigger"); - if (!trigger) return; - const code = stockCodeFromTrigger(trigger); - if (!code) return; - clearTimeout(stockPreviewOpenTimer); - stockPreviewOpenTimer = setTimeout(() => showStockPreview(code, trigger), 120); -} - -function handleStockPreviewFocusOut(event) { - const trigger = event.target.closest?.(".stock-preview-trigger"); - if (!trigger) return; - if (event.relatedTarget instanceof Node && elements.stockPreview.contains(event.relatedTarget)) return; - clearTimeout(stockPreviewOpenTimer); - scheduleStockPreviewClose(); -} - -function handleMobileStockPreviewClick(event) { - if (window.innerWidth > 720) return; - const trigger = event.target.closest?.(".stock-preview-trigger"); - if (!trigger) return; - const code = stockCodeFromTrigger(trigger); - if (!code) return; - event.preventDefault(); - event.stopPropagation(); - showStockPreview(code, trigger); -} - -function handleStockPreviewKeydown(event) { - if (event.key === "Escape" && !elements.stockPreview.hidden) { - closeStockPreview(); - stockPreviewAnchor?.focus?.(); - return; - } - if (event.key !== "Enter") return; - const trigger = event.target.closest?.(".stock-preview-trigger"); - if (!trigger) return; - const code = stockCodeFromTrigger(trigger); - if (!code) return; - event.preventDefault(); - if (window.innerWidth <= 720) showStockPreview(code, trigger); - else openStock(code, findStockFallback(code)); -} - -function cancelStockPreviewClose() { - clearTimeout(stockPreviewCloseTimer); -} - -function scheduleStockPreviewClose() { - clearTimeout(stockPreviewCloseTimer); - stockPreviewCloseTimer = setTimeout(closeStockPreview, 160); -} - -async function showStockPreview(code, trigger) { - clearTimeout(stockPreviewOpenTimer); - cancelStockPreviewClose(); - if (!/^\d{6}$/.test(String(code))) return; - stockPreviewAnchor = trigger; - state.stockPreviewCode = String(code); - state.stockPreviewType = "stock"; - state.stockPreviewItem = null; - state.stockPreviewFallback = findStockFallback(code); - state.stockPreviewPayload = null; - state.stockPreviewChart = "daily"; - renderStockPreviewLoading(); - elements.stockPreview.hidden = false; - const mobile = window.innerWidth <= 720; - elements.stockPreviewBackdrop.hidden = !mobile; - document.body.classList.toggle("stock-preview-open", mobile); - requestAnimationFrame(repositionStockPreview); - - const cacheKey = `${code}:latest`; - const cached = stockPreviewCache.get(cacheKey); - if (cached && cached.expiresAt > Date.now()) { - renderStockPreview(cached.payload); - return; - } - if (cached) stockPreviewCache.delete(cacheKey); - stockPreviewAbortController?.abort(); - stockPreviewAbortController = new AbortController(); - try { - const payload = await apiRequest( - `/api/stock/${encodeURIComponent(code)}/preview`, - "GET", - null, - { signal: stockPreviewAbortController.signal }, - ); - if (state.stockPreviewCode !== String(code) || elements.stockPreview.hidden) return; - const cacheMs = payload.meta?.realtime ? LIVE_REFRESH_DEFAULT_MS : STOCK_PREVIEW_CACHE_MS; - stockPreviewCache.set(cacheKey, { payload, expiresAt: Date.now() + cacheMs }); - while (stockPreviewCache.size > 48) stockPreviewCache.delete(stockPreviewCache.keys().next().value); - renderStockPreview(payload); - } catch (error) { - if (error.name === "AbortError" || state.stockPreviewCode !== String(code)) return; - renderStockPreviewError(error.message || "行情预览加载失败"); - } -} - -async function showEntityPreview(item, trigger) { - const type = String(item?.type || "").trim().toLowerCase(); - const id = String(item?.id || item?.code || "").trim().toUpperCase(); - if (type !== "theme" || !id) return; - clearTimeout(stockPreviewOpenTimer); - cancelStockPreviewClose(); - stockPreviewAnchor = trigger; - state.stockPreviewCode = id; - state.stockPreviewType = type; - state.stockPreviewItem = { ...item, id, code: item.code || id, type, type_label: item.type_label || "题材" }; - state.stockPreviewFallback = { - code: item.code || id, - name: item.name || "--", - sector: item.type_label || "题材", - price: item.value, - change: item.change, - }; - state.stockPreviewPayload = null; - state.stockPreviewChart = "daily"; - renderStockPreviewLoading(); - elements.stockPreview.hidden = false; - const mobile = window.innerWidth <= 720; - elements.stockPreviewBackdrop.hidden = !mobile; - document.body.classList.toggle("stock-preview-open", mobile); - requestAnimationFrame(repositionStockPreview); - - const cacheKey = `${type}:${id}:latest`; - const cached = stockPreviewCache.get(cacheKey); - if (cached && cached.expiresAt > Date.now()) { - renderStockPreview(cached.payload); - return; - } - if (cached) stockPreviewCache.delete(cacheKey); - stockPreviewAbortController?.abort(); - stockPreviewAbortController = new AbortController(); - try { - const params = new URLSearchParams({ type, id, trade_date: todayString() }); - const detail = await apiRequest( - `/api/search/detail?${params}`, - "GET", - null, - { signal: stockPreviewAbortController.signal }, - ); - if (state.stockPreviewType !== type || state.stockPreviewCode !== id || elements.stockPreview.hidden) return; - const entity = detail.entity || {}; - const payload = { - stock: { - code: entity.code || id, - name: entity.name || item.name || "--", - industry: entity.type_label || item.type_label || "题材", - price: entity.value, - change: entity.change, - }, - prices: detail.series || [], - intraday: [], - meta: { - trade_date: detail.meta?.trade_date || "", - realtime: Boolean(detail.meta?.realtime), - intraday_status: "idle", - intraday_notice: "", - }, - }; - stockPreviewCache.set(cacheKey, { payload, expiresAt: Date.now() + STOCK_PREVIEW_CACHE_MS }); - while (stockPreviewCache.size > 48) stockPreviewCache.delete(stockPreviewCache.keys().next().value); - renderStockPreview(payload); - } catch (error) { - if (error.name === "AbortError" || state.stockPreviewType !== type || state.stockPreviewCode !== id) return; - renderStockPreviewError(error.message || "题材行情预览加载失败"); - } -} - -function renderStockPreviewLoading() { - const fallback = state.stockPreviewFallback || {}; - selectStockPreviewChart("daily"); - setText("stockPreviewCode", state.stockPreviewCode || "--"); - setText("stockPreviewName", fallback.name || "正在加载"); - setText("stockPreviewSector", fallback.sector || "--"); - setText("stockPreviewPrice", "--"); - setText("stockPreviewChange", "--"); - document.querySelector("#stockPreviewChange").className = ""; - setText("stockPreviewDate", "最新行情"); - setText("stockPreviewSource", "正在读取行情"); - setText("stockPreviewSummary", "等待行情数据"); - document.querySelector("#stockPreviewLoading").hidden = false; - clearStockPreviewChart(""); -} - -function renderStockPreview(payload) { - state.stockPreviewPayload = payload; - const fallback = state.stockPreviewFallback || {}; - const stock = payload.stock || {}; - const price = stock.price; - const change = stock.change; - setText("stockPreviewCode", stock.code || state.stockPreviewCode); - setText("stockPreviewName", stock.name && stock.name !== "--" ? stock.name : fallback.name || "--"); - setText("stockPreviewSector", stock.industry && stock.industry !== "其他" ? stock.industry : fallback.sector || "其他"); - setText("stockPreviewPrice", meaningfulNumber(price) ? formatNumber(price, 2) : "--"); - setText("stockPreviewChange", meaningfulNumber(change) ? `${signed(change)}%` : "--"); - document.querySelector("#stockPreviewChange").className = changeClass(change); - document.querySelector("#stockPreviewLoading").hidden = true; - selectStockPreviewChart("daily"); - requestAnimationFrame(repositionStockPreview); -} - -function renderStockPreviewError(message) { - document.querySelector("#stockPreviewLoading").hidden = true; - setText("stockPreviewSource", "行情加载失败"); - setText("stockPreviewSummary", message); - clearStockPreviewChart("加载失败"); -} - -function selectStockPreviewChart(chart) { - state.stockPreviewChart = chart === "daily" ? "daily" : "intraday"; - document.querySelectorAll("[data-preview-chart]").forEach((button) => { - const active = button.dataset.previewChart === state.stockPreviewChart; - button.classList.toggle("active", active); - button.setAttribute("aria-selected", String(active)); - }); - const payload = state.stockPreviewPayload; - if (!payload) return; - if (state.stockPreviewChart === "intraday") { - if (state.stockPreviewType !== "stock" && payload.meta?.intraday_status === "idle") { - payload.meta.intraday_status = "loading"; - setText("stockPreviewDate", "正在加载分时"); - setText("stockPreviewSource", "正在读取最新分时"); - setText("stockPreviewSummary", "等待分时行情数据"); - clearStockPreviewChart(""); - loadEntityPreviewIntraday(); - return; - } - if (state.stockPreviewType !== "stock" && payload.meta?.intraday_status === "loading") return; - setText("stockPreviewDate", payload.meta?.intraday_trade_date || payload.meta?.trade_date || "最新行情"); - setText( - "stockPreviewSource", - (payload.intraday || []).length ? "最新分时 · 1分钟" : "分时暂不可用", - ); - if ((payload.intraday || []).length) { - drawIntradayPreviewChart( - payload.intraday, - payload.prices || [], - payload.meta?.intraday_previous_close, - ); - } - else { - clearStockPreviewChart("分时数据不可用"); - setText("stockPreviewSummary", payload.meta?.intraday_notice || "该交易日暂无分时数据。"); - } - } else if ((payload.prices || []).length) { - setText("stockPreviewDate", payload.meta?.trade_date || "最新行情"); - setText("stockPreviewSource", `日 K 行情 · ${payload.prices.length} 个交易日`); - drawDailyPreviewChart(payload.prices); - } else { - setText("stockPreviewDate", payload.meta?.trade_date || "最新行情"); - setText("stockPreviewSource", "日 K 行情暂不可用"); - clearStockPreviewChart("暂无日K数据"); - setText("stockPreviewSummary", "该股票暂无可用的日K数据。"); - } -} - -async function loadEntityPreviewIntraday() { - const type = state.stockPreviewType; - const id = state.stockPreviewCode; - const payload = state.stockPreviewPayload; - if (type === "stock" || !id || !payload) return; - stockPreviewAbortController?.abort(); - stockPreviewAbortController = new AbortController(); - try { - const params = new URLSearchParams({ type, id }); - const intraday = await apiRequest( - `/api/chart/intraday?${params}`, - "GET", - null, - { signal: stockPreviewAbortController.signal }, - ); - if (state.stockPreviewType !== type || state.stockPreviewCode !== id || elements.stockPreview.hidden) return; - payload.intraday = intraday.points || []; - payload.meta.intraday_status = payload.intraday.length ? "available" : "empty"; - payload.meta.intraday_trade_date = intraday.meta?.trade_date || ""; - payload.meta.intraday_previous_close = intraday.meta?.previous_close || 0; - payload.meta.intraday_notice = payload.intraday.length ? "" : "该题材暂无可用分时数据。"; - if (state.stockPreviewChart === "intraday") selectStockPreviewChart("intraday"); - } catch (error) { - if (error.name === "AbortError" || state.stockPreviewType !== type || state.stockPreviewCode !== id) return; - payload.meta.intraday_status = "unavailable"; - payload.meta.intraday_notice = error.message || "题材分时行情暂不可用。"; - if (state.stockPreviewChart === "intraday") selectStockPreviewChart("intraday"); - } -} - -function closeStockPreview() { - clearTimeout(stockPreviewOpenTimer); - clearTimeout(stockPreviewCloseTimer); - stockPreviewAbortController?.abort(); - stockPreviewAbortController = null; - elements.stockPreview.hidden = true; - elements.stockPreviewBackdrop.hidden = true; - document.body.classList.remove("stock-preview-open"); - state.stockPreviewPayload = null; - state.stockPreviewCode = ""; - state.stockPreviewType = "stock"; - state.stockPreviewItem = null; -} - -function openStockDetailFromPreview() { - const code = state.stockPreviewCode; - const fallback = state.stockPreviewFallback; - const type = state.stockPreviewType; - const item = state.stockPreviewItem; - if (!code) return; - closeStockPreview(); - if (type === "stock") openStock(code, fallback); - else if (item) openEntityDetail(item); -} - -function repositionStockPreview() { - if (elements.stockPreview.hidden || window.innerWidth <= 720 || !stockPreviewAnchor?.isConnected) return; - const anchor = stockPreviewAnchor.getBoundingClientRect(); - const preview = elements.stockPreview.getBoundingClientRect(); - const gap = 12; - let left = anchor.right + gap; - if (left + preview.width > window.innerWidth - 8) left = anchor.left - preview.width - gap; - left = clamp(left, 8, Math.max(8, window.innerWidth - preview.width - 8)); - const top = clamp(anchor.top - 48, 64, Math.max(64, window.innerHeight - preview.height - 8)); - elements.stockPreview.style.left = `${Math.round(left)}px`; - elements.stockPreview.style.top = `${Math.round(top)}px`; -} - -async function loadAlerts(openDialog = false) { - try { - const query = new URLSearchParams({ status: state.alertFilter, as_of: todayString() }); - const payload = await apiRequest(`/api/alerts?${query}`); - state.alerts = payload.items || []; - state.alertUnreadCount = number(payload.unread_count); - renderAlerts(); - if (openDialog) openModalDialog(elements.alertsDialog); - } catch (error) { - if (openDialog) showToast(error.message || "提醒加载失败"); - } -} - -function openAlerts() { - toggleHeaderCommandMenu(false); - toggleAccountDropdown(false); - document.querySelector("#alertDate").value ||= todayString(); - openModalDialog(elements.alertsDialog); - loadAlerts(); -} - -function openStockReminder() { - const stock = state.activeStock || {}; - document.querySelector("#alertTitle").value = `${stock.name || stock.code || "个股"}观察提醒`; - document.querySelector("#alertCode").value = stock.code || ""; - document.querySelector("#alertDate").value = todayString(); - if (elements.stockDialog.open) elements.stockDialog.close(); - openAlerts(); - document.querySelector("#alertContent").focus(); -} - -function selectAlertFilter(filter) { - state.alertFilter = filter === "unread" ? "unread" : "all"; - document.querySelectorAll("[data-alert-filter]").forEach((button) => { - button.classList.toggle("active", button.dataset.alertFilter === state.alertFilter); - }); - loadAlerts(); -} - -async function saveAlert(event) { - event.preventDefault(); - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - try { - const payload = await apiRequest("/api/alerts", "POST", { - title: document.querySelector("#alertTitle").value.trim(), - remind_date: document.querySelector("#alertDate").value, - code: document.querySelector("#alertCode").value.trim(), - content: document.querySelector("#alertContent").value.trim(), - }); - event.currentTarget.reset(); - document.querySelector("#alertDate").value = todayString(); - state.alertFilter = "all"; - state.alerts = payload.items || []; - state.alertUnreadCount = number(payload.unread_count); - renderAlerts(); - showToast("提醒已保存"); - } catch (error) { - showToast(error.message || "提醒保存失败"); - } finally { - button.disabled = false; - } -} - -async function markAllAlertsRead() { - try { - await apiRequest("/api/alerts/read-all", "POST", { as_of: todayString() }); - await loadAlerts(); - } catch (error) { - showToast(error.message || "提醒状态更新失败"); - } -} - -async function handleAlertAction(event) { - const button = event.target.closest("[data-alert-action]"); - if (!button) return; - const id = number(button.dataset.alertId); - if (!id) return; - try { - if (button.dataset.alertAction === "delete") { - await apiRequest(`/api/alerts/${id}`, "DELETE"); - } else { - await apiRequest(`/api/alerts/${id}/read`, "POST", {}); - } - await loadAlerts(); - } catch (error) { - showToast(error.message || "提醒操作失败"); - } -} - -function renderAlerts() { - const badge = document.querySelector("#alertBadge"); - badge.hidden = state.alertUnreadCount <= 0; - badge.textContent = state.alertUnreadCount > 99 ? "99+" : String(state.alertUnreadCount); - document.querySelector("#alertButton").classList.toggle("has-alerts", state.alertUnreadCount > 0); - setText("alertListCount", `${state.alerts.length} 条`); - document.querySelectorAll("[data-alert-filter]").forEach((button) => { - button.classList.toggle("active", button.dataset.alertFilter === state.alertFilter); - }); - document.querySelector("#markAllAlertsRead").disabled = state.alertUnreadCount <= 0; - const container = document.querySelector("#alertList"); - container.innerHTML = state.alerts.map((item) => { - const upcoming = !item.due; - const kindLabel = item.kind === "manual" ? "自定提醒" : item.kind === "strategy_t5" ? "跟踪完成" : "策略反馈"; - return `
    -
    -
    -
    ${escapeHtml(kindLabel)}
    - ${escapeHtml(item.title)} - ${item.content ? `

    ${escapeHtml(item.content)}

    ` : ""} - ${item.code ? `` : ""} -
    -
    - ${!item.is_read && !upcoming ? `` : ""} - -
    -
    `; - }).join("") || emptyStateHtml("暂无提醒"); - bindStockRows(container); - refreshIcons(); -} - -async function openReviewAssistant() { - toggleHeaderCommandMenu(false); - toggleAccountDropdown(false); - openModalDialog(elements.assistantDialog); - updateAssistantControls(); - if (!hasMemberAccess()) { - document.querySelector("#closeAssistantDialog").focus(); - return; - } - try { - const payload = await apiRequest("/api/assistant/messages"); - state.assistantMessages = payload.items || []; - renderAssistantMessages(); - } catch (error) { - showToast(error.message || "对话记录加载失败"); - } - document.querySelector("#assistantQuestion").focus(); -} - -function useAssistantPrompt(prompt) { - const input = document.querySelector("#assistantQuestion"); - input.value = prompt; - input.focus(); -} - -async function sendAssistantQuestion(event) { - event.preventDefault(); - if (state.assistantLoading) return; - const input = document.querySelector("#assistantQuestion"); - const question = input.value.trim(); - if (!question) return; - input.value = ""; - state.assistantMessages.push({ role: "user", content: question, context_date: elements.tradeDate.value.replaceAll("-", "") }); - state.assistantMessages.push({ role: "assistant", content: "", streaming: true, context_date: elements.tradeDate.value.replaceAll("-", "") }); - state.assistantLoading = true; - state.assistantController = new AbortController(); - updateAssistantControls(); - renderAssistantMessages(); - try { - await streamAssistantRequest(question, state.assistantController.signal, (chunk) => { - const message = state.assistantMessages.at(-1); - if (message?.role === "assistant") message.content += chunk; - scheduleAssistantRender(); - }); - const message = state.assistantMessages.at(-1); - if (message) message.streaming = false; - setStatus("复盘助手回答完成"); - } catch (error) { - const message = state.assistantMessages.at(-1); - if (message?.role === "assistant") { - message.streaming = false; - message.error = true; - if (!message.content) message.content = error.name === "AbortError" ? "已停止生成。" : error.message || "回答失败,请稍后重试。"; - } - if (error.name !== "AbortError") showToast(error.message || "复盘助手回答失败"); - } finally { - state.assistantLoading = false; - state.assistantController = null; - updateAssistantControls(); - renderAssistantMessages(); - input.focus(); - } -} - -async function streamAssistantRequest(question, signal, onDelta) { - await window.XiaobaiAPI.streamNdjson("/api/assistant/chat", { - method: "POST", - body: { question, trade_date: elements.tradeDate.value }, - signal, - errorMessage: "复盘助手暂不可用", - onEvent: (event) => { - if (event.type === "delta") onDelta(String(event.content || "")); - }, - }); -} - -function stopAssistantResponse() { - state.assistantController?.abort(); -} - -async function clearAssistantConversation() { - if (state.assistantLoading || !state.assistantMessages.length) return; - if (!window.confirm("确定清空复盘助手的对话记录吗?")) return; - try { - await apiRequest("/api/assistant/messages", "DELETE"); - state.assistantMessages = []; - renderAssistantMessages(); - } catch (error) { - showToast(error.message || "对话记录清空失败"); - } -} - -function scheduleAssistantRender() { - if (assistantRenderFrame) return; - assistantRenderFrame = requestAnimationFrame(() => { - assistantRenderFrame = 0; - renderAssistantMessages(); - }); -} - -function renderAssistantMessages() { - const container = document.querySelector("#assistantMessages"); - container.innerHTML = state.assistantMessages.map((message) => ` -
    -
    ${message.role === "user" ? "我" : "复盘助手"}${message.context_date ? `` : ""}
    -
    ${message.role === "assistant" ? (message.content ? formatMentorAnswer(message.content) : '正在整理复盘数据') : escapeHtml(message.content)}
    - ${message.streaming ? '' : ""} -
    - `).join("") || emptyStateHtml("可以从市场、策略或自己的交易记录开始复盘"); - updateAssistantControls(); - requestAnimationFrame(() => { container.scrollTop = container.scrollHeight; }); -} - -function updateAssistantControls() { - const unlocked = hasMemberAccess(); - elements.assistantDialog.classList.toggle("member-locked", !unlocked); - document.querySelector("#assistantMemberGate").hidden = unlocked; - document.querySelector("#assistantMemberContent").setAttribute("aria-disabled", String(!unlocked)); - document.querySelector("#assistantQuestion").disabled = !unlocked || state.assistantLoading; - document.querySelector("#sendAssistant").disabled = !unlocked || state.assistantLoading; - document.querySelector("#stopAssistant").hidden = !unlocked || !state.assistantLoading; - document.querySelector("#clearAssistantMessages").disabled = !unlocked || state.assistantLoading || !state.assistantMessages.length; - document.querySelectorAll("[data-assistant-prompt]").forEach((button) => { - button.disabled = !unlocked || state.assistantLoading; - }); -} - -function openGlobalSearch() { - if (!state.user) return; - toggleHeaderCommandMenu(false); - openModalDialog(elements.globalSearchDialog); - requestAnimationFrame(() => { - elements.globalSearchInput.focus(); - elements.globalSearchInput.select(); - }); -} - -function handleGlobalSearchShortcut(event) { - if (!event.ctrlKey || event.altKey || event.shiftKey || event.key.toLowerCase() !== "k") return; - if (!state.user) return; - if (event.defaultPrevented) { - showToast("Ctrl+K 已被其他功能占用,请点击顶部搜索按钮"); - return; - } - event.preventDefault(); - openGlobalSearch(); -} - -function closeGlobalSearch() { - clearTimeout(globalSearchTimer); - if (elements.globalSearchDialog.open) elements.globalSearchDialog.close(); -} - -function scheduleGlobalSearch() { - clearTimeout(globalSearchTimer); - const query = elements.globalSearchInput.value.trim(); - state.globalSearchActiveIndex = -1; - if (!query) { - state.globalSearchResults = []; - renderGlobalSearchEmpty("输入名称或代码开始搜索", "使用方向键选择,回车打开详情", "corner-down-left"); - return; - } - elements.globalSearchResults.innerHTML = '
    正在搜索
    '; - globalSearchTimer = setTimeout(() => runGlobalSearch(query), 160); -} - -async function runGlobalSearch(query) { - const requestSequence = ++state.globalSearchRequestSequence; - const params = new URLSearchParams({ q: query, trade_date: elements.tradeDate.value }); - try { - const payload = await apiRequest(`/api/search?${params}`); - if (requestSequence !== state.globalSearchRequestSequence || elements.globalSearchInput.value.trim() !== query) return; - renderGlobalSearchResults(payload.groups || {}); - } catch (error) { - if (requestSequence !== state.globalSearchRequestSequence) return; - state.globalSearchResults = []; - renderGlobalSearchEmpty(error.message || "搜索失败", "请稍后重试", "circle-alert"); - } -} - -function renderGlobalSearchResults(groups) { - const definitions = [ - ["stocks", "股票"], - ["sectors", "板块"], - ["themes", "题材"], - ["indices", "指数"], - ]; - const iconNames = { stock: "chart-candlestick", sector: "layout-grid", theme: "lightbulb", index: "chart-line" }; - const flattened = []; - const sections = []; - definitions.forEach(([key, label]) => { - const items = Array.isArray(groups[key]) ? groups[key] : []; - if (!items.length) return; - const rows = items.map((item) => { - const index = flattened.length; - flattened.push(item); - return ``; - }).join(""); - sections.push(`

    ${label}

    ${rows}
    `); - }); - state.globalSearchResults = flattened; - state.globalSearchActiveIndex = flattened.length ? 0 : -1; - if (!flattened.length) { - renderGlobalSearchEmpty("没有找到相关结果", "可尝试输入完整名称或六位股票代码", "search-x"); - return; - } - elements.globalSearchResults.innerHTML = sections.join(""); - updateGlobalSearchSelection(false); - refreshIcons(); -} - -function renderGlobalSearchEmpty(title, hint, iconName) { - elements.globalSearchResults.innerHTML = `

    ${escapeHtml(title)}

    ${escapeHtml(hint)}
    `; - refreshIcons(); -} - -function handleGlobalSearchInputKeydown(event) { - if (event.key === "Escape") { - event.preventDefault(); - closeGlobalSearch(); - return; - } - if (!["ArrowDown", "ArrowUp", "Enter"].includes(event.key)) return; - if (!state.globalSearchResults.length) return; - event.preventDefault(); - if (event.key === "Enter") { - openGlobalSearchResult(state.globalSearchActiveIndex); - return; - } - const direction = event.key === "ArrowDown" ? 1 : -1; - state.globalSearchActiveIndex = (state.globalSearchActiveIndex + direction + state.globalSearchResults.length) % state.globalSearchResults.length; - updateGlobalSearchSelection(true); -} - -function updateGlobalSearchSelection(scrollIntoView) { - elements.globalSearchResults.querySelectorAll("[data-search-result-index]").forEach((item) => { - const selected = number(item.dataset.searchResultIndex) === state.globalSearchActiveIndex; - item.classList.toggle("is-active", selected); - item.setAttribute("aria-selected", String(selected)); - if (selected && scrollIntoView) item.scrollIntoView({ block: "nearest" }); - }); -} - -function openGlobalSearchResult(index) { - const item = state.globalSearchResults[index]; - if (!item) return; - closeGlobalSearch(); - if (item.type === "stock") { - openStock(item.id, { code: item.code, name: item.name, sector: item.industry || "其他" }); - return; - } - openEntityDetail(item); -} - -async function openEntityDetail(item) { - state.entityDetailItem = item; - state.entityDetailPayload = null; - state.entityDetailIntraday = null; - state.entityDetailChartMode = "daily"; - const requestSequence = ++state.entityDetailRequestSequence; - syncDetailChartButtons("entity", "daily"); - setText("entityDetailCode", item.code || item.id || "--"); - setText("entityDetailName", item.name || "--"); - setText("entityDetailValue", "--"); - setText("entityDetailChange", "--"); - setText("entityDetailType", item.type_label || "--"); - setText("entityDetailDate", "正在加载行情"); - document.querySelector("#entityDetailChange").className = ""; - renderEmptyState("entityDetailMetrics", "正在加载交易数据"); - openModalDialog(elements.entityDetailDialog); - clearEntityDetailChart("正在加载日 K 数据"); - try { - const params = new URLSearchParams({ type: item.type, id: item.id, trade_date: elements.tradeDate.value }); - const payload = await apiRequest(`/api/search/detail?${params}`); - if (requestSequence !== state.entityDetailRequestSequence) return; - state.entityDetailPayload = payload; - const entity = payload.entity || {}; - setText("entityDetailCode", entity.code || item.code || "--"); - setText("entityDetailName", entity.name || item.name || "--"); - setText("entityDetailValue", meaningfulNumber(entity.value) && number(entity.value) !== 0 ? formatNumber(entity.value, 2) : "--"); - setText("entityDetailChange", `${signed(entity.change)}%`); - setText("entityDetailType", entity.type_label || item.type_label || "--"); - document.querySelector("#entityDetailChange").className = changeClass(entity.change); - renderEntityDetailMetrics(payload.metrics || []); - if (state.entityDetailChartMode === "daily") { - setText("entityDetailDate", `${payload.meta?.realtime ? "实时" : "收盘"} · ${payload.meta?.trade_date || "--"}`); - requestAnimationFrame(() => drawEntityDetailChart(payload.series || [])); - } - } catch (error) { - if (requestSequence !== state.entityDetailRequestSequence) return; - setText("entityDetailDate", "行情加载失败"); - renderEmptyState("entityDetailMetrics", error.message || "交易数据加载失败"); - if (state.entityDetailChartMode === "daily") clearEntityDetailChart(error.message || "行情加载失败"); - showToast(error.message || "详情加载失败"); - } -} - -async function selectEntityDetailChart(mode) { - const selected = mode === "intraday" ? "intraday" : "daily"; - state.entityDetailChartMode = selected; - syncDetailChartButtons("entity", selected); - if (selected === "daily") { - const payload = state.entityDetailPayload; - if (payload) { - setText("entityDetailDate", `${payload.meta?.realtime ? "实时" : "收盘"} · ${payload.meta?.trade_date || "--"}`); - requestAnimationFrame(() => drawEntityDetailChart(payload.series || [])); - } else clearEntityDetailChart("正在加载日 K 数据"); - return; - } - - if (state.entityDetailIntraday) { - renderEntityIntraday(state.entityDetailIntraday); - return; - } - const item = state.entityDetailItem; - if (!item) return; - const requestSequence = state.entityDetailRequestSequence; - setText("entityDetailDate", "正在加载分时"); - clearEntityDetailChart("正在加载分时数据"); - try { - const params = new URLSearchParams({ type: item.type, id: item.id }); - const payload = await apiRequest(`/api/chart/intraday?${params}`); - if (requestSequence !== state.entityDetailRequestSequence) return; - state.entityDetailIntraday = payload; - if (state.entityDetailChartMode === "intraday") renderEntityIntraday(payload); - } catch (error) { - if (requestSequence !== state.entityDetailRequestSequence || state.entityDetailChartMode !== "intraday") return; - setText("entityDetailDate", "分时暂不可用"); - clearEntityDetailChart(error.message || "分时行情暂不可用"); - } -} - -function renderEntityIntraday(payload) { - const points = payload.points || []; - if (!points.length) { - setText("entityDetailDate", "分时暂不可用"); - clearEntityDetailChart("分时行情暂不可用"); - return; - } - setText("entityDetailDate", `分时 · ${payload.meta?.trade_date || "--"}`); - requestAnimationFrame(() => { - if (state.entityDetailChartMode !== "intraday") return; - drawIntradayCanvas(elements.entityDetailChart, points, [], payload.meta?.previous_close); - }); -} - -function syncDetailChartButtons(scope, mode) { - const selector = scope === "stock" ? "[data-stock-detail-chart]" : "[data-entity-detail-chart]"; - const datasetKey = scope === "stock" ? "stockDetailChart" : "entityDetailChart"; - document.querySelectorAll(selector).forEach((button) => { - const active = button.dataset[datasetKey] === mode; - button.classList.toggle("active", active); - button.setAttribute("aria-pressed", String(active)); - }); -} - -function renderEntityDetailMetrics(metrics) { - const container = document.querySelector("#entityDetailMetrics"); - if (!metrics.length) { - renderEmptyState(container, "暂无交易数据"); - return; - } - container.innerHTML = metrics.map((metric) => { - const value = typeof metric.value === "number" ? formatNumber(metric.value, Number.isInteger(metric.value) ? 0 : 2) : String(metric.value ?? "--"); - const tone = metric.tone === "change" ? changeClass(metric.value) : ""; - return `
    ${escapeHtml(metric.label)}
    ${escapeHtml(value)}${escapeHtml(metric.unit || "")}
    `; - }).join(""); -} - -function drawEntityDetailChart(series, canvas = elements.entityDetailChart) { - const candles = (series || []).filter((item) => number(item.close) > 0).map((item) => { - const close = number(item.close); - const open = number(item.open) || close; - const high = Math.max(number(item.high) || close, open, close); - const low = Math.min(number(item.low) || close, open, close); - return { ...item, open, high, low, close }; - }); - if (!candles.length) { - clearEntityDetailChart("暂无日 K 数据", canvas); - return; - } - const rect = canvas.getBoundingClientRect(); - const ratio = window.devicePixelRatio || 1; - const width = Math.max(320, rect.width); - const height = Math.max(220, rect.height); - canvas.width = Math.round(width * ratio); - canvas.height = Math.round(height * ratio); - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.setTransform(ratio, 0, 0, ratio, 0, 0); - context.clearRect(0, 0, width, height); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - const left = 48; - const right = 12; - const top = 14; - const bottom = 22; - const volumeHeight = 54; - const gap = 12; - const priceBottom = height - bottom - volumeHeight - gap; - const plotWidth = width - left - right; - const maximum = Math.max(...candles.map((item) => item.high)); - const minimum = Math.min(...candles.map((item) => item.low)); - const range = Math.max(maximum - minimum, maximum * 0.01, 0.01); - const maxVolume = Math.max(...candles.map((item) => number(item.volume)), 1); - const priceY = (value) => top + (maximum - value) / range * (priceBottom - top); - const step = plotWidth / candles.length; - const candleWidth = clamp(step * 0.62, 2, 8); - context.strokeStyle = palette.grid; - context.fillStyle = palette.axis; - context.font = "11px Microsoft YaHei"; - context.textAlign = "right"; - for (let line = 0; line <= 4; line += 1) { - const lineY = top + (priceBottom - top) * line / 4; - context.beginPath(); - context.moveTo(left, lineY); - context.lineTo(width - right, lineY); - context.stroke(); - context.fillText((maximum - range * line / 4).toFixed(2), left - 6, lineY + 4); - } - - candles.forEach((item, index) => { - const x = left + step * index + step / 2; - const color = drawCandlestick(context, x, item, priceY, candleWidth, palette); - const volumeBarHeight = number(item.volume) / maxVolume * volumeHeight; - context.fillStyle = color; - context.globalAlpha = 0.72; - context.fillRect(x - candleWidth / 2, height - bottom - volumeBarHeight, candleWidth, volumeBarHeight); - context.globalAlpha = 1; - }); - - context.textAlign = "center"; - context.fillStyle = palette.axis; - [0, Math.floor((candles.length - 1) / 2), candles.length - 1].forEach((index) => { - const x = left + step * index + step / 2; - context.fillText(String(candles[index].trade_date || "").slice(5), x, height - 5); - }); -} - -function clearEntityDetailChart(message, canvas = elements.entityDetailChart) { - const rect = canvas.getBoundingClientRect(); - const width = Math.max(320, Math.round(rect.width || 680)); - const height = Math.max(220, Math.round(rect.height || 300)); - canvas.width = width; - canvas.height = height; - const context = canvas.getContext("2d"); - const palette = currentChartPalette(); - context.fillStyle = palette.background; - context.fillRect(0, 0, width, height); - context.fillStyle = palette.axis; - context.font = "13px Microsoft YaHei"; - context.textAlign = "center"; - context.fillText(message, width / 2, height / 2); -} - -function meaningfulNumber(value) { - return value !== null && value !== undefined && value !== "" && Number.isFinite(Number(value)); -} - -async function openStock(code, fallback = null) { - closeStockPreview(); - const pools = [state.dashboard?.limits || [], state.dashboard?.broken || [], state.dashboard?.down_limits || []]; - const row = pools.flat().find((item) => String(item.code) === String(code)) || fallback || { code, name: "--", sector: "其他" }; - state.activeStock = row; - state.stockDetail = null; - state.stockDetailIntraday = null; - state.stockDetailChartMode = "daily"; - const requestSequence = ++state.stockDetailRequestSequence; - syncDetailChartButtons("stock", "daily"); - setText("detailCode", row.code); - setText("detailName", row.name); - setText("detailPrice", formatNumber(row.price, 2)); - setText("detailChange", `${signed(row.change)}%`); - const changeElement = document.querySelector("#detailChange"); - changeElement.className = changeClass(row.change); - setText("detailStreak", row.status === "涨停" ? streakLabel(row.streak) : row.status || "--"); - setText("detailReason", row.reason || "--"); - setText("detailSector", row.sector || "其他"); - setText("detailFirst", row.first_time || "--"); - setText("detailLast", row.last_time || "--"); - setText("detailOpen", `${number(row.open_times)} 次`); - setText("detailTurnover", `${formatNumber(row.turnover_rate, 2)}%`); - setText("detailAmount", `${formatNumber(row.amount_billion, 2)} 亿`); - setText("detailSeal", `${formatNumber(row.seal_amount_million, 0)} 万`); - setText("chartSource", "正在加载行情"); - setText("flowNet", "--"); - setText("flowLarge", "--"); - setText("flowMedium", "--"); - setText("flowSmall", "--"); - document.querySelector("#reasonInput").value = row.reason || ""; - document.querySelector("#stockNoteContent").value = ""; - document.querySelector("#stockNotePlan").value = ""; - renderEmptyState("stockNotes", "正在加载笔记"); - updateWatchButton(); - openModalDialog(elements.stockDialog); - clearPriceChart("正在加载日 K 数据"); - try { - const query = new URLSearchParams({ trade_date: elements.tradeDate.value }); - const payload = await apiRequest(`/api/stock/${encodeURIComponent(code)}?${query}`); - if (requestSequence !== state.stockDetailRequestSequence) return; - state.stockDetail = payload; - const stock = payload.stock || {}; - state.activeStock = { ...row, name: stock.name || row.name, sector: stock.industry || row.sector }; - setText("detailName", stock.name || row.name); - setText("detailPrice", formatNumber(stock.price || row.price, 2)); - setText("detailChange", `${signed(stock.change ?? row.change)}%`); - renderMoneyflow(payload.moneyflow || {}); - renderStockNotes(payload.notes || []); - updateWatchButton(); - if (state.stockDetailChartMode === "daily") { - setText("chartSource", `日 K 行情 · ${payload.prices.length} 个交易日`); - requestAnimationFrame(() => drawPriceChart(payload.prices || [])); - } - } catch (error) { - if (requestSequence !== state.stockDetailRequestSequence) return; - setText("chartSource", "行情加载失败"); - if (state.stockDetailChartMode === "daily") clearPriceChart(error.message || "行情加载失败"); - showToast(error.message || "个股详情加载失败"); - } -} - -async function selectStockDetailChart(mode) { - const selected = mode === "intraday" ? "intraday" : "daily"; - state.stockDetailChartMode = selected; - syncDetailChartButtons("stock", selected); - if (selected === "daily") { - const prices = state.stockDetail?.prices || []; - setText("chartSource", prices.length ? `日 K 行情 · ${prices.length} 个交易日` : "正在加载行情"); - if (prices.length) requestAnimationFrame(() => drawPriceChart(prices)); - else clearPriceChart("正在加载日 K 数据"); - return; - } - - if (state.stockDetailIntraday) { - renderStockDetailIntraday(state.stockDetailIntraday); - return; - } - const code = String(state.activeStock?.code || ""); - if (!/^\d{6}$/.test(code)) return; - const requestSequence = state.stockDetailRequestSequence; - setText("chartSource", "正在加载分时"); - clearPriceChart("正在加载分时数据"); - try { - const params = new URLSearchParams({ type: "stock", id: code }); - const payload = await apiRequest(`/api/chart/intraday?${params}`); - if (requestSequence !== state.stockDetailRequestSequence) return; - state.stockDetailIntraday = payload; - if (state.stockDetailChartMode === "intraday") renderStockDetailIntraday(payload); - } catch (error) { - if (requestSequence !== state.stockDetailRequestSequence || state.stockDetailChartMode !== "intraday") return; - setText("chartSource", "分时暂不可用"); - clearPriceChart(error.message || "分时行情暂不可用"); - } -} - -function renderStockDetailIntraday(payload) { - const points = payload.points || []; - if (!points.length) { - setText("chartSource", "分时暂不可用"); - clearPriceChart("分时行情暂不可用"); - return; - } - setText("chartSource", `分时 · ${payload.meta?.trade_date || "--"}`); - requestAnimationFrame(() => { - if (state.stockDetailChartMode !== "intraday") return; - drawIntradayCanvas(elements.priceChart, points, [], payload.meta?.previous_close); - }); -} - -function openActiveStockInHeaven() { - const code = state.activeStock?.code; - if (!/^\d{6}$/.test(String(code || ""))) return; - elements.stockDialog.close(); - state.heavenPanel = "trend"; - state.heavenManualData = null; - const input = document.querySelector("#heavenStockInput"); - input.value = code; - openView("heavenView"); - selectHeavenPanel("trend", true); -} - -function hasMemberAccess() { - return state.user?.role === "admin" || Boolean(state.user?.membership?.active); -} - -function updateAccountIdentityBadges(membership = {}) { - const isAdmin = state.user?.role === "admin" || Boolean(membership.is_admin); - const subscribed = Boolean(membership.subscribed); - document.querySelector("#accountAdminBadge").hidden = !isAdmin; - const vipBadge = document.querySelector("#accountVipBadge"); - vipBadge.hidden = false; - vipBadge.classList.toggle("is-nonmember", !subscribed); - setText("accountVipLabel", subscribed ? "会员" : "非会员"); - vipBadge.title = subscribed ? "查看会员状态" : "查看会员权益"; -} - -function applyMembershipAccess() { - const unlocked = hasMemberAccess(); - document.querySelectorAll(".member-feature-view").forEach((view) => { - view.classList.toggle("member-locked", !unlocked); - const gate = view.querySelector(".member-gate"); - if (gate) gate.hidden = unlocked; - view.querySelectorAll("button, input, textarea, select").forEach((control) => { - if (control.closest(".member-gate") || control.hasAttribute("data-member-navigation")) return; - control.disabled = !unlocked; - }); - }); - const assistantButton = document.querySelector("#assistantButton"); - assistantButton.classList.toggle("member-locked-control", !unlocked); - assistantButton.title = unlocked ? "复盘助手" : "复盘助手(会员可用)"; - updateAssistantControls(); -} - -function openView(viewId, updateHash = true) { - if (!applicationShell.page(viewId) || !pageModules.has(viewId)) return; - const previousView = state.activeView; - pageModules.beforeMount(viewId, previousView); - if (!applicationShell.mount(viewId, { updateUrl: updateHash })) return; - pageModules.afterMount(viewId, previousView); -} - -function initializeAutoTableSorting() { - markAutoSortableHeaders(document); - document.addEventListener("click", (event) => { - const header = event.target.closest?.("th[data-auto-sort]"); - if (!header || header.closest("#limitTable")) return; - const table = header.closest("table"); - const body = table?.tBodies?.[0]; - if (!body || body.rows.length < 2) return; - const direction = header.classList.contains("sort-asc") ? "desc" : "asc"; - table.querySelectorAll("th.sort-asc, th.sort-desc").forEach((item) => { - item.classList.remove("sort-asc", "sort-desc", "sorted"); - item.removeAttribute("aria-sort"); - const arrow = item.querySelector(".arr"); - if (arrow) arrow.textContent = "↕"; - }); - header.classList.add(`sort-${direction}`, "sorted"); - header.setAttribute("aria-sort", direction === "asc" ? "ascending" : "descending"); - const activeArrow = header.querySelector(".arr"); - if (activeArrow) activeArrow.textContent = direction === "asc" ? "▲" : "▼"; - const columnIndex = header.cellIndex; - const rows = [...body.rows].map((row, index) => ({ row, index })); - rows.sort((left, right) => { - const leftValue = autoSortValue(left.row.cells[columnIndex]); - const rightValue = autoSortValue(right.row.cells[columnIndex]); - let result; - if (leftValue.kind === "number" && rightValue.kind === "number") result = leftValue.value - rightValue.value; - else result = String(leftValue.value).localeCompare(String(rightValue.value), "zh-CN", { numeric: true, sensitivity: "base" }); - if (result === 0) result = left.index - right.index; - return direction === "asc" ? result : -result; - }); - rows.forEach(({ row }) => body.appendChild(row)); - const firstHeader = [...header.parentElement.cells][0]?.textContent.trim(); - if (["#", "排名"].includes(firstHeader)) { - [...body.rows].forEach((row, index) => { - if (row.cells[0]) row.cells[0].textContent = String(index + 1); - }); - } - }); -} - -function markAutoSortableHeaders(root) { - root.querySelectorAll?.(".data-table:not(#limitTable) thead th").forEach((header) => { - if (header.closest("#brokenTable, #downTable, #yesterdayTable, #rotationTable")) return; - if (number(header.colSpan) > 1) return; - const label = header.textContent.trim(); - if (!label || ["#", "操作"].includes(label)) return; - header.dataset.autoSort = "true"; - header.classList.add("sortable"); - if (!header.querySelector(".arr")) header.insertAdjacentHTML("beforeend", ''); - header.title = `${label}:点击排序`; - }); -} - -function autoSortValue(cell) { - const text = String(cell?.dataset?.sortValue || cell?.textContent || "").trim(); - if (!text || text === "--" || text.includes("样本不足")) return { kind: "text", value: "\uffff" }; - const boardMatch = text.match(/(\d+)\s*板/); - if (boardMatch) return { kind: "number", value: Number(boardMatch[1]) }; - const normalized = text.replaceAll(",", "").replace(/[+%]/g, ""); - const numericMatch = normalized.match(/^-?\d+(?:\.\d+)?/); - if (numericMatch) { - let value = Number(numericMatch[0]); - if (text.includes("亿")) value *= 10000; - return { kind: "number", value }; - } - return { kind: "text", value: text }; -} - -function changeSort(key) { - if (state.sortKey === key) state.sortDirection = state.sortDirection === "asc" ? "desc" : "asc"; - else { - state.sortKey = key; - state.sortDirection = ["name", "code", "sector", "first_time", "last_time"].includes(key) ? "asc" : "desc"; - } - renderLimitTable(); -} - -function compareRows(left, right) { - const leftValue = left[state.sortKey] ?? ""; - const rightValue = right[state.sortKey] ?? ""; - let result = typeof leftValue === "number" || typeof rightValue === "number" - ? number(leftValue) - number(rightValue) - : String(leftValue).localeCompare(String(rightValue), "zh-CN", { numeric: true }); - if (result === 0 && state.sortKey !== "first_time") result = String(left.first_time || "").localeCompare(String(right.first_time || "")); - return state.sortDirection === "asc" ? result : -result; -} - -function updateSortHeaders() { - document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => { - header.classList.remove("sort-asc", "sort-desc", "sorted"); - const active = header.dataset.sort === state.sortKey; - if (active) header.classList.add(state.sortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted"); - const arrow = header.querySelector(".arr"); - if (arrow) arrow.textContent = active ? (state.sortDirection === "asc" ? "▲" : "▼") : "↕"; - }); -} - -function shiftDate(delta) { - const current = parseLocalDate(elements.tradeDate.value); - current.setDate(current.getDate() + delta); - const next = localDateString(current); - if (next > todayString()) return; - elements.tradeDate.value = next; - state.heavenManualData = null; - document.querySelector("#qiObservationDate").value = next; - loadDashboard(); -} - -function updateDateButtons() { - document.querySelector("#nextDate").disabled = elements.tradeDate.value >= todayString(); -} - -function selectAccountPanel(panel) { - const selected = ["profile", "membership", "password"].includes(panel) ? panel : "profile"; - const titles = { profile: "个人资料", membership: "会员状态", password: "修改密码" }; - setText("accountDialogTitle", titles[selected]); - document.querySelectorAll("[data-account-panel-content]").forEach((section) => { - section.hidden = section.dataset.accountPanelContent !== selected; - }); - document.querySelector("#connectionStatus").hidden = selected !== "membership"; - return selected; -} - -async function openSettings(panel = "profile") { - selectAccountPanel(panel); - toggleAccountDropdown(false); - toggleHeaderCommandMenu(false); - const status = document.querySelector("#connectionStatus"); - status.className = "connection-status"; - status.textContent = "正在读取账号状态"; - openModalDialog(elements.settingsDialog); - try { - const payload = await apiRequest("/api/account/status"); - const access = payload.llm_access || {}; - const membership = access.membership || {}; - if (state.user) { - state.user.membership = membership; - updateAccountIdentityBadges(membership); - applyMembershipAccess(); - } - status.textContent = membership.active ? "账户权益已同步" : "账户信息已同步"; - status.classList.toggle("connected", true); - setText("membershipBadge", membership.subscribed ? "会员有效" : membership.is_admin ? "管理员权限" : "普通用户"); - setText("membershipStateValue", membership.subscribed ? "已开通" : membership.is_admin ? "管理员可用" : "未开通"); - setText("membershipRemainingValue", membership.subscribed && membership.expires_at - ? `${number(membership.remaining_days)} 天` - : membership.is_admin || membership.subscribed ? "长期有效" : "--"); - setText("membershipDetail", membership.subscribed - ? `${membership.plan || "会员"}${membership.expires_at ? ` · 有效至 ${membershipDateDisplay(membership.expires_at, true)}` : " · 长期有效"}` - : membership.is_admin - ? "管理员拥有智能功能管理权限,但不会因此显示为已开通会员。" - : "开通会员后可使用智能选股、问师、问天、复盘助手等智能功能。"); - setText("membershipQuotaHint", `会员默认每日智能分析额度 ${number(access.daily_limit)} 次,由管理员统一设置。`); - setText("membershipUsage", membership.active - ? `今日已用 ${number(access.used_today)} 次` - : "今日智能分析:--"); - setText("membershipUsageSummary", membership.active ? `${number(access.used_today)} / ${number(access.daily_limit)}` : "--"); - setText("membershipRemainingUsage", membership.is_admin ? "不限" : membership.active ? `${number(access.remaining_calls)} 次` : "--"); - const birth = payload.birth_profile || {}; - if (birth.birth_datetime) { - const [birthDate, birthTime] = String(birth.birth_datetime).split("T"); - document.querySelector("#accountBirthDate").value = birthDate || ""; - document.querySelector("#accountBirthTime").value = (birthTime || "").slice(0, 5); - document.querySelector("#accountBirthGender").value = birth.gender || "unspecified"; - } - setText("birthProfileStatus", payload.birth_profile_configured ? "已加密保存" : "尚未设置"); - document.querySelector("#deleteBirthProfileButton").disabled = !payload.birth_profile_configured; - } catch (error) { - status.hidden = false; - status.textContent = "账户状态暂时无法同步"; - showToast(error.message || "账号信息加载失败"); - } -} - -async function changeAccountPassword(event) { - event.preventDefault(); - const form = event.currentTarget; - const button = form.querySelector("button[type='submit']"); - button.disabled = true; - try { - await apiRequest("/api/account/password", "POST", { - current_password: document.querySelector("#currentPassword").value, - new_password: document.querySelector("#newPassword").value, - confirm_password: document.querySelector("#confirmPassword").value, - }); - form.reset(); - showToast("密码已更新"); - } catch (error) { - showToast(error.message || "密码更新失败"); - } finally { - button.disabled = false; - } -} - -async function switchAccount() { - const button = document.querySelector("#switchAccountMenuButton"); - button.disabled = true; - toggleAccountDropdown(false); - try { - await apiRequest("/api/auth/logout", "POST", {}); - window.location.reload(); - } catch (error) { - showToast(error.message || "切换账号失败"); - button.disabled = false; - } -} - -async function openAdminSettings(refreshOnly = false) { - if (state.user?.role !== "admin") return; - if (!refreshOnly) openModalDialog(elements.adminDialog); - const status = document.querySelector("#adminConnectionStatus"); - status.textContent = "正在读取系统状态"; - try { - const payload = await apiRequest("/api/admin/settings"); - const data = payload.data || {}; - const ifind = data.ifind || {}; - const llm = payload.llm || {}; - const membership = payload.membership || {}; - status.textContent = `Tushare ${data.configured ? "已配置" : "未配置"} · iFinD ${ifind.configured ? "已配置" : "未配置"} · ${number(data.snapshot_dates)} 个交易日`; - status.classList.toggle("connected", Boolean(data.configured)); - setText("systemDataStatus", data.background_refresh_enabled ? "后台刷新已启用" : "后台刷新已暂停"); - document.querySelector("#systemTokenInput").value = ""; - document.querySelector("#systemIfindTokenInput").value = ""; - document.querySelector("#systemBackgroundRefresh").checked = Boolean(data.background_refresh_enabled); - document.querySelector("#memberDailyLimit").value = number(membership.member_daily_limit) || 50; - renderModelPool(llm.models || [], llm.primary_model_id || "", llm.fallback_model_id || ""); - renderAdminUsers(payload.users || []); - } catch (error) { - status.textContent = error.message || "系统配置读取失败"; - } -} - -function selectAdminPanel(panel) { - const selected = ["market", "models", "members"].includes(panel) ? panel : "market"; - document.querySelector("#adminSectionSelect").value = selected; - document.querySelectorAll("[data-admin-panel]").forEach((item) => { - item.hidden = item.dataset.adminPanel !== selected; - }); -} - -function renderModelPool(models, primaryId = "", fallbackId = "") { - state.adminModels = models.map((item) => ({ ...item, api_key: item.api_key || "" })); - const container = document.querySelector("#modelPoolList"); - container.innerHTML = state.adminModels.map((item, index) => ` -
    -
    ${escapeHtml(item.name || `模型 ${index + 1}`)}${item.configured ? "已保存密钥" : "待配置"}
    -
    - - - - -
    -
    未测试
    -
    - `).join("") || emptyStateHtml("模型池为空,请先添加模型"); - updateModelRoleOptions(primaryId, fallbackId); - container.querySelectorAll("[data-test-model]").forEach((button) => button.addEventListener("click", () => testPlatformModel(button.closest("[data-model-id]")))); - container.querySelectorAll("[data-delete-model]").forEach((button) => button.addEventListener("click", () => deletePlatformModel(button.closest("[data-model-id]")))); - container.querySelectorAll("[data-model-field='name']").forEach((input) => input.addEventListener("input", updateModelRoleLabels)); - refreshIcons(); -} - -function collectModelPool() { - const saved = new Map(state.adminModels.map((item) => [item.id, item])); - return [...document.querySelectorAll("#modelPoolList [data-model-id]")].map((row) => ({ - id: row.dataset.modelId, - name: row.querySelector("[data-model-field='name']").value.trim(), - base_url: row.querySelector("[data-model-field='base_url']").value.trim(), - model: row.querySelector("[data-model-field='model']").value.trim(), - api_key: row.querySelector("[data-model-field='api_key']").value.trim(), - configured: Boolean(saved.get(row.dataset.modelId)?.configured), - })); -} - -function updateModelRoleOptions(primaryId = document.querySelector("#platformPrimaryModelSelect").value, fallbackId = document.querySelector("#platformFallbackModelSelect").value) { - const models = collectModelPool(); - const options = models.map((item) => ``).join(""); - const primary = document.querySelector("#platformPrimaryModelSelect"); - const fallback = document.querySelector("#platformFallbackModelSelect"); - primary.innerHTML = models.length ? options : ''; - fallback.innerHTML = `${options}`; - primary.value = models.some((item) => item.id === primaryId) ? primaryId : models[0]?.id || ""; - fallback.value = models.some((item) => item.id === fallbackId) && fallbackId !== primary.value ? fallbackId : ""; -} - -function updateModelRoleLabels() { - updateModelRoleOptions(); -} - -function addPlatformModel() { - const models = collectModelPool(); - const id = `model-${Date.now()}-${Math.floor(Math.random() * 10000)}`; - models.push({ id, name: `模型 ${models.length + 1}`, base_url: "https://api.openai.com/v1", model: "", api_key: "", configured: false }); - renderModelPool(models, document.querySelector("#platformPrimaryModelSelect").value || id, document.querySelector("#platformFallbackModelSelect").value); - document.querySelector(`[data-model-id="${CSS.escape(id)}"] [data-model-field="name"]`)?.focus(); -} - -function deletePlatformModel(row) { - if (!row) return; - const id = row.dataset.modelId; - const primary = document.querySelector("#platformPrimaryModelSelect").value; - const fallback = document.querySelector("#platformFallbackModelSelect").value; - if (id === primary || id === fallback) { - showToast("请先为主模型或辅助模型选择其他模型,再删除当前模型"); - return; - } - const models = collectModelPool().filter((item) => item.id !== id); - renderModelPool(models, primary, fallback); -} - -function renderAdminUsers(users) { - const container = document.querySelector("#adminUsersList"); - container.innerHTML = users.map((user) => { - const admin = user.role === "admin"; - const member = Boolean(user.membership_subscribed); - const identityLabels = [admin ? "管理员" : "", member ? "会员有效" : "普通用户"].filter(Boolean).join(" · "); - const expiry = member - ? (user.membership_expires_at ? `有效至 ${membershipDateDisplay(user.membership_expires_at)}` : "永久有效") - : user.membership_status === "suspended" - ? "会员已停用" - : user.membership_status === "active" && user.membership_expires_at - ? `已于 ${membershipDateDisplay(user.membership_expires_at)} 到期` - : "尚未开通"; - return `
    -
    ${escapeHtml(user.username)}${escapeHtml(identityLabels)}${escapeHtml(expiry)}
    -
    今日调用 ${number(user.used_today)}
    -
    - - - -
    当前到期${escapeHtml(expiry)}
    - -
    -
    `; - }).join("") || emptyStateHtml("暂无注册用户"); - container.querySelectorAll(".membership-form").forEach((form) => form.addEventListener("submit", saveMembership)); -} - -async function saveMembership(event) { - event.preventDefault(); - const form = event.currentTarget; - const data = Object.fromEntries(new FormData(form).entries()); - const button = form.querySelector("button[type='submit']"); - button.disabled = true; - try { - const payload = await apiRequest("/api/admin/membership", "POST", data); - renderAdminUsers(payload.users || []); - showToast("会员状态已更新"); - } catch (error) { - showToast(error.message || "会员状态保存失败"); - } finally { - button.disabled = false; - } -} - -async function saveMarketSettings(event) { - event.preventDefault(); - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - try { - await apiRequest("/api/admin/settings", "POST", { - tushare_token: document.querySelector("#systemTokenInput").value.trim(), - ifind_refresh_token: document.querySelector("#systemIfindTokenInput").value.trim(), - background_refresh_enabled: document.querySelector("#systemBackgroundRefresh").checked, - }); - document.querySelector("#systemTokenInput").value = ""; - document.querySelector("#systemIfindTokenInput").value = ""; - showToast("行情配置已保存"); - await openAdminSettings(true); - } catch (error) { - showToast(error.message || "系统配置保存失败"); - } finally { - button.disabled = false; - } -} - -async function saveModelPool(event) { - event.preventDefault(); - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - try { - await apiRequest("/api/admin/settings", "POST", { - models: collectModelPool(), - primary_model_id: document.querySelector("#platformPrimaryModelSelect").value, - fallback_model_id: document.querySelector("#platformFallbackModelSelect").value, - }); - showToast("模型池已保存"); - await openAdminSettings(true); - } catch (error) { - showToast(error.message || "模型池保存失败"); - } finally { - button.disabled = false; - } -} - -async function saveMembershipSettings(event) { - event.preventDefault(); - const button = event.currentTarget.querySelector("button[type='submit']"); - button.disabled = true; - try { - await apiRequest("/api/admin/settings", "POST", { - member_daily_limit: number(document.querySelector("#memberDailyLimit").value), - }); - showToast("会员调用额度已保存"); - await openAdminSettings(true); - } catch (error) { - showToast(error.message || "会员调用额度保存失败"); - } finally { - button.disabled = false; - } -} - -async function testPlatformModel(row) { - if (!row) return; - const button = row.querySelector("[data-test-model]"); - const status = row.querySelector(".model-test-status"); - const profile = collectModelPool().find((item) => item.id === row.dataset.modelId) || {}; - button.disabled = true; - status.textContent = "连接中"; - try { - const payload = await apiRequest("/api/admin/settings/test", "POST", { model_id: row.dataset.modelId, profile }); - status.textContent = `已连通 · ${number(payload.result.latency_ms)} ms`; - status.className = "model-test-status success"; - } catch (error) { - status.textContent = error.message; - status.className = "model-test-status failure"; - } finally { - button.disabled = false; - } -} - -function membershipDateDisplay(value) { - if (!value) return ""; - const parsed = new Date(value); - if (Number.isNaN(parsed.getTime())) return String(value).slice(0, 10); - return new Intl.DateTimeFormat("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit" }).format(parsed); -} - -function exportStocks() { - exportRows("涨停池", getVisibleStocks(), [ - ["股票代码", "code"], ["股票名称", "name"], ["连板", "streak"], ["涨幅%", "change"], - ["价格", "price"], ["所属板块", "sector"], ["涨停原因", "reason"], ["首封", "first_time"], - ["最后封板", "last_time"], ["开板次数", "open_times"], ["换手率%", "turnover_rate"], - ["成交额亿", "amount_billion"], ["封单额万", "seal_amount_million"], - ]); -} - -function exportBroken() { - exportRows("炸板池", getVisibleBrokenRows(), [ - ["股票代码", "code"], ["股票名称", "name"], ["现价涨幅%", "change"], ["距涨停%", "limitGap"], - ["价格", "price"], ["所属板块", "sector"], ["首次触板", "first_time"], ["开板次数", "open_times"], - ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"], - ]); -} - -function exportDown() { - exportRows("跌停板", getVisibleDownRows(), [ - ["股票代码", "code"], ["股票名称", "name"], ["跌幅%", "change"], ["价格", "price"], - ["所属板块", "sector"], ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"], - ]); -} - -function exportYesterday() { - exportRows("昨日涨停", getVisibleYesterdayRows(), [ - ["股票代码", "code"], ["股票名称", "name"], ["昨日高度", "prior_streak"], - ["今日涨幅%", "current_change"], ["今日结果", "outcome"], ["当前高度", "current_streak"], - ["所属板块", "sector"], - ]); -} - -function exportLadder() { - const rows = (state.dashboard?.ladders || []).flatMap((group) => (group.stocks || []).map((stock) => ({ - level: group.label || group.level, - ...stock, - }))); - exportRows("市场天梯", rows, [ - ["梯队", "level"], ["股票代码", "code"], ["股票名称", "name"], ["所属板块", "sector"], - ["封板时间", "first_time"], ["开板次数", "open_times"], ["封单额万", "seal_amount_million"], ["成交额亿", "amount_billion"], - ]); -} - -function exportRotation() { - const sectorMap = new Map((state.dashboard?.sectors || []).map((sector) => [sector.name, sector])); - const rows = (state.dashboard?.sector_rotation || []).map((row) => ({ - ...row, - average_change: sectorMap.get(row.name)?.change ?? 0, - })); - exportRows("板块轮动", rows, [ - ["排名", "rank"], ["板块", "name"], ["趋势", "trend"], ["今日涨停", "count"], - ["昨日涨停", "previous_count"], ["变化", "delta"], ["强度", "strength"], - ["最高板", "max_streak"], ["平均涨幅%", "average_change"], - ["领涨股", "leader"], ["涨停股成交额亿", "amount_billion"], - ]); -} - -function exportSentimentHistory() { - const rows = state.sentimentHistory?.rows || []; - if (!rows.length) { - showToast("暂无可导出的情绪周期数据"); - return; - } - const exportRowsData = rows.map((row) => ({ - ...row, - breadth_score: row.components?.breadth?.score, - limit_ecology_score: row.components?.limit_ecology?.score, - profit_effect_score: row.components?.profit_effect?.score, - ladder_structure_score: row.components?.ladder_structure?.score, - liquidity_score: row.components?.liquidity?.score, - })); - exportRows("情绪周期", exportRowsData, [ - ["交易日", "trade_date"], ["情绪温度", "score"], ["周期阶段", "phase"], ["方向", "direction"], - ["涨停", "limit_up_count"], ["首板", "first_board_count"], ["二板", "second_board_count"], - ["三板以上", "three_plus_count"], ["连板高度", "max_height"], ["炸板", "broken_count"], - ["跌停", "limit_down_count"], ["昨日涨停", "previous_limit_count"], - ["昨日涨停红盘", "previous_positive_count"], ["昨日涨停红盘率%", "previous_positive_rate"], - ["市场宽度", "breadth_score"], ["涨停生态", "limit_ecology_score"], - ["赚钱效应", "profit_effect_score"], ["连板结构", "ladder_structure_score"], - ["成交活跃度", "liquidity_score"], - ]); -} - -function exportDragonTiger() { - const rows = (state.dragonTiger?.traders || []).flatMap((trader) => ( - (trader.operations || []).map((operation) => ({ - trader_name: trader.name, - identity_type: dragonIdentityLabel(trader.identity_type), - ...operation, - })) - )); - exportRows("游资龙虎榜", rows, [ - ["游资或席位", "trader_name"], ["身份", "identity_type"], ["股票代码", "code"], - ["股票名称", "name"], ["方向", "direction"], ["涨幅%", "change"], - ["买入百万元", "buy_million"], ["卖出百万元", "sell_million"], ["净额百万元", "net_buy_million"], - ["关联席位", "seat_name"], ["上榜原因", "reason"], - ]); -} - -function exportHotMoneyProfiles() { - const rows = state.hotMoneyProfiles?.profiles || []; - if (!rows.length) { - showToast("暂无可导出的游资档案"); - return; - } - downloadCsv( - `游资档案-${todayString()}.csv`, - ["游资名称", "简介", "关联营业部", "席位数量"], - rows.map((profile) => [ - profile.name, - profile.description, - (profile.organizations || []).join(";"), - number(profile.organization_count), - ]), - ); -} - -function commonReviewColumns() { - return [["股票代码", "code"], ["股票名称", "name"], ["状态", "status"], ["涨跌幅%", "change"], - ["价格", "price"], ["所属板块", "sector"], ["原因", "reason"], ["首次触板", "first_time"], - ["最后触板", "last_time"], ["开板次数", "open_times"], ["换手率%", "turnover_rate"], ["成交额亿", "amount_billion"]]; -} - -function exportRows(label, rows, columns) { - const headers = columns.map(([header]) => header); - const data = rows.map((row) => columns.map(([, key]) => row[key] ?? "")); - downloadCsv(`${label}-${state.dashboard.meta.trade_date}.csv`, headers, data); -} - -function downloadCsv(filename, headers, rows) { - const lines = [headers, ...rows].map((row) => row.map(csvCell).join(",")); - const blob = new Blob(["\ufeff", lines.join("\r\n")], { type: "text/csv;charset=utf-8" }); - const url = URL.createObjectURL(blob); - const anchor = document.createElement("a"); - anchor.href = url; - anchor.download = filename; - anchor.click(); - URL.revokeObjectURL(url); - showToast(`已导出 ${rows.length} 条数据`); -} - -function csvCell(value) { - let text = String(value ?? ""); - if (/^[=+\-@]/.test(text)) text = `'${text}`; - return `"${text.replaceAll('"', '""')}"`; -} - -function outcomeClass(outcome) { - return { "晋级": "outcome-advance", "炸板": "outcome-broken", "跌停": "outcome-down", "断板": "outcome-open" }[outcome] || "outcome-open"; -} - -function trendClass(trend) { - return { "升温": "trend-hot", "降温": "trend-cool", "新进": "trend-new", "持平": "trend-flat" }[trend] || "trend-flat"; -} - -function changeClass(value) { - return number(value) > 0 ? "up" : number(value) < 0 ? "down" : ""; -} - -function sentimentLabel(score) { - const value = number(score); - if (value >= 80) return "情绪高涨"; - if (value >= 60) return "情绪偏强"; - if (value >= 40) return "情绪中性"; - if (value >= 20) return "情绪偏弱"; - return "情绪冰点"; -} - -function streakLabel(streak) { - const value = Math.max(1, number(streak)); - return value === 1 ? "首板" : `${value}板`; -} - -function signed(value) { - const parsed = number(value); - return `${parsed > 0 ? "+" : ""}${formatNumber(parsed, 2)}`; -} - -function dashboardDataTimestamp(meta = {}) { - const tradeDate = displayCompactDate(meta.trade_date); - if (tradeDate === "--") return "--"; - const intraday = tradeDate === todayString() && Boolean(meta.realtime) && !["closed", "after_hours"].includes(String(meta.market_status || "")); - if (intraday) { - const updated = new Date(meta.updated_at); - if (!Number.isNaN(updated.getTime())) { - const dateText = `${updated.getFullYear()}-${String(updated.getMonth() + 1).padStart(2, "0")}-${String(updated.getDate()).padStart(2, "0")}`; - const timeText = updated.toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", hour12: false }); - return `${dateText} ${timeText}`; - } - } - return `${tradeDate} 15:00`; -} - -function formatMoneyMillion(value) { - const parsed = number(value); - const sign = parsed > 0 ? "+" : ""; - if (Math.abs(parsed) >= 100) return `${sign}${formatNumber(parsed / 100, 2)} 亿`; - return `${sign}${formatNumber(parsed * 100, 0)} 万`; -} - -async function apiRequest(url, method = "GET", body = null, requestOptions = {}) { - return window.XiaobaiAPI.request(url, method, body, requestOptions); -} - -function setLoading(loading, text = "正在加载复盘数据", context = "default") { - elements.loading.hidden = !loading; - elements.loading.dataset.context = loading ? context : "default"; - setText("loadingTitle", text); - setText( - "loadingHint", - context === "screener" - ? "正在完成因子筛选、候选排序与历史样本回测,这通常需要一点时间" - : "请稍候", - ); -} - -function setStatus(text) { - applicationShell.setStatus(text); -} - -let toastTimer; -function showToast(message) { - clearTimeout(toastTimer); - elements.toast.textContent = message; - elements.toast.hidden = false; - toastTimer = setTimeout(() => { elements.toast.hidden = true; }, 3600); -} - -function setText(id, value) { - const element = document.getElementById(id); - if (element) element.textContent = value; -} - -function motionEnabled() { - return !window.matchMedia("(prefers-reduced-motion: reduce)").matches; -} - -function refreshIcons() { - if (!window.lucide?.createIcons) return; - window.lucide.createIcons({ attrs: { "aria-hidden": "true" } }); -} - -function toggleHeaderCommandMenu(force) { - applicationShell.toggleHeaderCommandMenu(force); -} - -function toggleAccountDropdown(force, returnFocus = false) { - const menu = document.querySelector("#accountDropdown"); - const button = document.querySelector("#accountButton"); - if (!menu || !button) return; - const open = typeof force === "boolean" ? force : menu.hidden; - menu.hidden = !open; - button.setAttribute("aria-expanded", String(open)); - document.querySelector(".account-menu-shell")?.classList.toggle("is-open", open); - if (open) { - setText("accountMenuName", state.user?.username || "当前账号"); - const membership = state.user?.membership || {}; - setText("accountMenuRole", state.user?.role === "admin" ? (membership.subscribed ? "管理员 · 会员" : "管理员") : membership.subscribed ? "会员用户" : "普通用户"); - } else if (returnFocus) { - button.focus(); - } -} - -function handleAccountMenuKeydown(event) { - const menu = document.querySelector("#accountDropdown"); - if (!menu) return; - if (menu.hidden) { - if (document.activeElement?.id === "accountButton" && event.key === "ArrowDown") { - event.preventDefault(); - toggleAccountDropdown(true); - menu.querySelector('[role="menuitem"]')?.focus(); - } - return; - } - const items = [...menu.querySelectorAll('[role="menuitem"]:not(:disabled)')]; - if (!items.length) return; - const current = items.indexOf(document.activeElement); - if (event.key === "ArrowDown" || event.key === "ArrowUp") { - event.preventDefault(); - const offset = event.key === "ArrowDown" ? 1 : -1; - items[(current + offset + items.length) % items.length].focus(); - } else if (event.key === "Home" || event.key === "End") { - event.preventDefault(); - items[event.key === "Home" ? 0 : items.length - 1].focus(); - } -} - -function updateSentimentGauge(rawScore) { - const gauge = document.querySelector("#sentimentGauge"); - if (!gauge) return; - const score = clamp(rawScore, 0, 100); - const previous = Number(gauge.dataset.score); - gauge.dataset.score = String(score); - gauge.style.setProperty("--score", score); - if (!motionEnabled() || !Number.isFinite(previous) || Math.abs(previous - score) < 15) return; - gauge.classList.remove("sentiment-pulse"); - void gauge.offsetWidth; - gauge.classList.add("sentiment-pulse"); - gauge.addEventListener("animationend", () => gauge.classList.remove("sentiment-pulse"), { once: true }); -} - -function animateMetric(id, rawValue, formatter = (value) => value) { - const element = document.getElementById(id); - const target = Number(rawValue); - if (!element || !Number.isFinite(target)) { - setText(id, formatter(rawValue)); - return; - } - const storedValue = Number(element.dataset.metricValue); - const previous = Number.isFinite(storedValue) ? storedValue : 0; - element.dataset.metricValue = String(target); - const existingFrame = metricAnimationFrames.get(element); - if (existingFrame) cancelAnimationFrame(existingFrame); - if (!motionEnabled() || previous === target) { - element.textContent = formatter(target); - return; - } - element.classList.remove("metric-changed"); - void element.offsetWidth; - element.classList.add("metric-changed"); - const startedAt = performance.now(); - const duration = 560; - const update = (now) => { - const progress = Math.min(1, (now - startedAt) / duration); - const eased = 1 - (1 - progress) ** 3; - element.textContent = formatter(previous + (target - previous) * eased); - if (progress < 1) { - metricAnimationFrames.set(element, requestAnimationFrame(update)); - } else { - element.textContent = formatter(target); - metricAnimationFrames.delete(element); - setTimeout(() => element.classList.remove("metric-changed"), 80); - } - }; - metricAnimationFrames.set(element, requestAnimationFrame(update)); -} - -function animateRows(container) { - if (!container) return; - const rows = [...container.children].filter((item) => item.matches("tr, [data-code]")); - if (!motionEnabled()) { - rows.forEach((row) => row.classList.remove("row-pending", "row-enter")); - return; - } - const unseenRows = rows.filter((row) => row.dataset.motionSeen !== "1"); - unseenRows.slice(0, 12).forEach((row, index) => { - row.dataset.motionSeen = "1"; - row.classList.remove("row-pending", "row-enter"); - row.style.setProperty("--row-delay", `${index * 24}ms`); - requestAnimationFrame(() => row.classList.add("row-enter")); - row.addEventListener("animationend", () => row.classList.remove("row-enter"), { once: true }); - }); - if (!("IntersectionObserver" in window)) { - unseenRows.slice(12).forEach((row) => { row.dataset.motionSeen = "1"; }); - return; - } - if (!rowAnimationObserver) { - rowAnimationObserver = new IntersectionObserver((entries) => { - entries.forEach((entry) => { - if (!entry.isIntersecting) return; - const row = entry.target; - rowAnimationObserver.unobserve(row); - row.dataset.motionSeen = "1"; - row.classList.remove("row-pending"); - row.style.setProperty("--row-delay", "0ms"); - requestAnimationFrame(() => row.classList.add("row-enter")); - row.addEventListener("animationend", () => row.classList.remove("row-enter"), { once: true }); - }); - }, { threshold: 0.08, rootMargin: "0px 0px 40px 0px" }); - } - unseenRows.slice(12).forEach((row) => { - row.classList.add("row-pending"); - rowAnimationObserver.observe(row); - }); -} - -function waitForMotion(duration) { - return new Promise((resolve) => setTimeout(resolve, motionEnabled() ? duration : 0)); -} diff --git a/app/static/pages/auction/page.js b/app/static/pages/auction/page.js deleted file mode 100644 index b25237b..0000000 --- a/app/static/pages/auction/page.js +++ /dev/null @@ -1,4 +0,0 @@ -window.XiaobaiPageModules.register("auction", ["auctionView"], { - enter: ["loadAuction"], - leave: ["clearAuction"], -}); diff --git a/app/static/pages/dragon-tiger/page.js b/app/static/pages/dragon-tiger/page.js deleted file mode 100644 index 855e400..0000000 --- a/app/static/pages/dragon-tiger/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("dragon_tiger", ["dragonView"], { - enter: ["loadDragonTiger"], -}); diff --git a/app/static/pages/heaven/page.js b/app/static/pages/heaven/page.js deleted file mode 100644 index 077f384..0000000 --- a/app/static/pages/heaven/page.js +++ /dev/null @@ -1,4 +0,0 @@ -window.XiaobaiPageModules.register("heaven", ["heavenView"], { - enter: ["loadHeaven"], - leave: ["stopHeaven"], -}); diff --git a/app/static/pages/ladder/page.js b/app/static/pages/ladder/page.js deleted file mode 100644 index 9fa95aa..0000000 --- a/app/static/pages/ladder/page.js +++ /dev/null @@ -1 +0,0 @@ -window.XiaobaiPageModules.register("ladder", ["ladderView"]); diff --git a/app/static/pages/mentor/page.js b/app/static/pages/mentor/page.js deleted file mode 100644 index 1802db8..0000000 --- a/app/static/pages/mentor/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("mentor", ["mentorView"], { - enter: ["loadMentor"], -}); diff --git a/app/static/pages/pools/page.js b/app/static/pages/pools/page.js deleted file mode 100644 index c0676ee..0000000 --- a/app/static/pages/pools/page.js +++ /dev/null @@ -1,7 +0,0 @@ -window.XiaobaiPageModules.register("pools", [ - "limitPool", - "brokenView", - "downView", - "yesterdayView", - "performanceView", -]); diff --git a/app/static/pages/popularity/page.js b/app/static/pages/popularity/page.js deleted file mode 100644 index 5179da6..0000000 --- a/app/static/pages/popularity/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("popularity", ["popularityView"], { - enter: ["loadPopularity"], -}); diff --git a/app/static/pages/review/page.js b/app/static/pages/review/page.js deleted file mode 100644 index 23da3fa..0000000 --- a/app/static/pages/review/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("review", ["reviewWorkspaceView"], { - enter: ["loadReview"], -}); diff --git a/app/static/pages/rotation/page.js b/app/static/pages/rotation/page.js deleted file mode 100644 index 605255c..0000000 --- a/app/static/pages/rotation/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("rotation", ["rotationView"], { - enter: ["loadRotation"], -}); diff --git a/app/static/pages/screener/page.js b/app/static/pages/screener/page.js deleted file mode 100644 index 9314221..0000000 --- a/app/static/pages/screener/page.js +++ /dev/null @@ -1,5 +0,0 @@ -window.XiaobaiPageModules.register("screener", ["screenerView"], { - enter: ["loadScreener"], -}); - -window.XiaobaiPageModules.register("screener", ["screenerTrackingView"]); diff --git a/app/static/pages/sentiment/page.js b/app/static/pages/sentiment/page.js deleted file mode 100644 index e1b6689..0000000 --- a/app/static/pages/sentiment/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("sentiment", ["sentimentCycleView"], { - enter: ["loadSentiment"], -}); diff --git a/app/static/pages/themes/page.js b/app/static/pages/themes/page.js deleted file mode 100644 index fd249f2..0000000 --- a/app/static/pages/themes/page.js +++ /dev/null @@ -1,3 +0,0 @@ -window.XiaobaiPageModules.register("themes", ["themeLibraryView"], { - enter: ["loadThemes"], -}); diff --git a/app/tests/__init__.py b/app/tests/__init__.py new file mode 100644 index 0000000..f435180 --- /dev/null +++ b/app/tests/__init__.py @@ -0,0 +1 @@ +"""Test support package for the preserved application.""" diff --git a/app/tests/preservation_helpers.py b/app/tests/preservation_helpers.py new file mode 100644 index 0000000..9bd25f5 --- /dev/null +++ b/app/tests/preservation_helpers.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +import hashlib +import re +from pathlib import Path + + +APP_ROOT = Path(__file__).resolve().parents[1] +ORIGINAL_ROOT = APP_ROOT.parent +FRONTEND_ROOT = APP_ROOT / "frontend" +ORIGINAL_STATIC = ORIGINAL_ROOT / "static" + +SOURCE_RANGE = re.compile( + r"/\* PRESERVATION-SOURCE-BEGIN app\.js:(\d+)-(\d+) \*/\n" + r"(.*?)" + r"/\* PRESERVATION-SOURCE-END app\.js:\1-\2 \*/\n?", + re.DOTALL, +) + + +def sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def reassembled_frontend_runtime() -> str: + chunks: dict[tuple[int, int], str] = {} + for path in FRONTEND_ROOT.rglob("*.js"): + for match in SOURCE_RANGE.finditer(path.read_text(encoding="utf-8")): + source_range = (int(match.group(1)), int(match.group(2))) + if source_range in chunks: + raise AssertionError(f"duplicate app.js source range: {source_range}") + chunks[source_range] = match.group(3) + + assembled: list[str] = [] + next_line = 1 + for (start, end), content in sorted(chunks.items()): + if start != next_line: + raise AssertionError( + f"app.js source coverage gap: expected line {next_line}, got {start}" + ) + if len(content.splitlines(keepends=True)) != end - start + 1: + raise AssertionError(f"app.js line count changed in range {start}-{end}") + assembled.append(content) + next_line = end + 1 + + original_line_count = len( + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8").splitlines() + ) + if next_line != original_line_count + 1: + raise AssertionError( + f"app.js source coverage ended at {next_line - 1}, expected {original_line_count}" + ) + return "".join(assembled) + + +def assert_moved_asset_matches( + testcase, + original_relative: str, + frontend_relative: str | None = None, +) -> None: + target_relative = frontend_relative or original_relative + testcase.assertEqual( + sha256(FRONTEND_ROOT / target_relative), + sha256(ORIGINAL_STATIC / original_relative), + original_relative, + ) + + +def assert_page_prefix_matches(testcase, page_relative: str) -> None: + original = (ORIGINAL_STATIC / page_relative).read_text(encoding="utf-8") + migrated = (FRONTEND_ROOT / page_relative).read_text(encoding="utf-8") + testcase.assertTrue( + migrated.startswith(original.rstrip("\n") + "\n\n"), + page_relative, + ) diff --git a/app/tests/test_css_governance.py b/app/tests/test_css_governance.py index c730ebd..eefc0dd 100644 --- a/app/tests/test_css_governance.py +++ b/app/tests/test_css_governance.py @@ -6,14 +6,14 @@ from pathlib import Path ROOT = Path(__file__).resolve().parents[1] -STATIC = ROOT / "static" +STATIC = ROOT / "frontend" TOKENS = STATIC / "shared" / "tokens.css" LEGACY_STYLESHEETS = ( - "styles.css", - "renovation.css", - "redesign-v2.css", - "design-system.css", - "theme.css", + "styles/styles.css", + "styles/renovation.css", + "styles/redesign-v2.css", + "styles/design-system.css", + "styles/theme.css", ) @@ -26,12 +26,12 @@ class CssGovernanceTests(unittest.TestCase): def test_token_layer_loads_before_application_styles(self) -> None: expected_order = ( "/shared/tokens.css", - "/styles.css", - "/renovation.css", - "/redesign-v2.css", - "/design-system.css", - "/theme.css", - "/wentian-v2.css", + "/styles/styles.css", + "/styles/renovation.css", + "/styles/redesign-v2.css", + "/styles/design-system.css", + "/styles/theme.css", + "/pages/heaven/page.css", ) positions = [self.html.index(path) for path in expected_order] self.assertEqual(positions, sorted(positions)) @@ -63,7 +63,7 @@ class CssGovernanceTests(unittest.TestCase): def test_wentian_tokens_remain_isolated(self) -> None: self.assertNotRegex(self.tokens, r"--wt-[a-z0-9-]+\s*:") - wentian = (STATIC / "wentian-v2.css").read_text(encoding="utf-8") + wentian = (STATIC / "pages" / "heaven" / "page.css").read_text(encoding="utf-8") self.assertRegex(wentian, r"--wt-[a-z0-9-]+\s*:") def test_compatibility_aliases_cover_historical_layers(self) -> None: diff --git a/app/tests/test_frontend_boundaries.py b/app/tests/test_frontend_boundaries.py index 3841765..272b09e 100644 --- a/app/tests/test_frontend_boundaries.py +++ b/app/tests/test_frontend_boundaries.py @@ -5,9 +5,11 @@ import re import unittest from pathlib import Path +from tests.preservation_helpers import reassembled_frontend_runtime + ROOT = Path(__file__).resolve().parents[1] -STATIC = ROOT / "static" +STATIC = ROOT / "frontend" class FrontendBoundaryTests(unittest.TestCase): @@ -22,7 +24,7 @@ class FrontendBoundaryTests(unittest.TestCase): def test_shared_dependencies_load_before_application(self) -> None: html = (STATIC / "index.html").read_text(encoding="utf-8") - ui_position = html.index('/ui-core.js') + ui_position = html.index('/shared/ui-core.js') components_position = html.index('/shared/components.js') pages_position = html.index('/pages.config.js') runtime_position = html.index('/pages/runtime.js') @@ -40,7 +42,7 @@ class FrontendBoundaryTests(unittest.TestCase): self.assertLess(shell_position, app_position) def test_application_state_is_created_through_shared_boundary(self) -> None: - app = (STATIC / "app.js").read_text(encoding="utf-8") + app = reassembled_frontend_runtime() self.assertIn("const state = window.XiaobaiState.create({", app) self.assertNotIn("const state = {", app) @@ -70,7 +72,7 @@ class FrontendBoundaryTests(unittest.TestCase): self.assertEqual(actual, expected) def test_shell_owns_navigation_and_page_mounting(self) -> None: - app = (STATIC / "app.js").read_text(encoding="utf-8") + app = reassembled_frontend_runtime() shell = (STATIC / "shared" / "shell.js").read_text(encoding="utf-8") self.assertNotIn("function syncNavigationState", app) self.assertNotIn("function initializeApplicationShell", app) @@ -109,7 +111,7 @@ class FrontendBoundaryTests(unittest.TestCase): self.assertEqual(actual, expected) def test_page_lifecycle_is_owned_outside_application_monolith(self) -> None: - app = (STATIC / "app.js").read_text(encoding="utf-8") + app = reassembled_frontend_runtime() runtime = (STATIC / "pages" / "runtime.js").read_text(encoding="utf-8") start = app.index("function openView(") end = app.index("\nfunction initializeAutoTableSorting", start) @@ -122,7 +124,7 @@ class FrontendBoundaryTests(unittest.TestCase): def test_shared_empty_state_component_is_used_by_multiple_features(self) -> None: components = (STATIC / "shared" / "components.js").read_text(encoding="utf-8") - app = (STATIC / "app.js").read_text(encoding="utf-8") + app = reassembled_frontend_runtime() self.assertIn("function emptyStateHtml(message, options = {})", components) self.assertIn("function renderEmptyState(target, message, options = {})", components) self.assertGreaterEqual(app.count("renderEmptyState("), 8) diff --git a/app/tests/test_frontend_contract.py b/app/tests/test_frontend_contract.py index 63d43cd..acb4618 100644 --- a/app/tests/test_frontend_contract.py +++ b/app/tests/test_frontend_contract.py @@ -5,8 +5,10 @@ import unittest from html.parser import HTMLParser from pathlib import Path +from tests.preservation_helpers import reassembled_frontend_runtime -STATIC_DIR = Path(__file__).resolve().parents[1] / "static" + +STATIC_DIR = Path(__file__).resolve().parents[1] / "frontend" class IdCollector(HTMLParser): @@ -22,11 +24,11 @@ class FrontendContractTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.html = (STATIC_DIR / "index.html").read_text(encoding="utf-8") - cls.script = (STATIC_DIR / "app.js").read_text(encoding="utf-8") + cls.script = reassembled_frontend_runtime() cls.shell = (STATIC_DIR / "shared" / "shell.js").read_text(encoding="utf-8") - cls.ui_core = (STATIC_DIR / "ui-core.js").read_text(encoding="utf-8") - cls.design_system = (STATIC_DIR / "design-system.css").read_text(encoding="utf-8") - cls.theme = (STATIC_DIR / "theme.css").read_text(encoding="utf-8") + cls.ui_core = (STATIC_DIR / "shared" / "ui-core.js").read_text(encoding="utf-8") + cls.design_system = (STATIC_DIR / "styles" / "design-system.css").read_text(encoding="utf-8") + cls.theme = (STATIC_DIR / "styles" / "theme.css").read_text(encoding="utf-8") cls.tokens = (STATIC_DIR / "shared" / "tokens.css").read_text(encoding="utf-8") collector = IdCollector() collector.feed(cls.html) @@ -158,7 +160,7 @@ class FrontendContractTests(unittest.TestCase): self.assertIn("必需数据已完整,本日没有股票同时满足", self.script) def test_dialogs_and_dark_table_hover_have_shared_safety_constraints(self): - redesign = (STATIC_DIR / "redesign-v2.css").read_text(encoding="utf-8") + redesign = (STATIC_DIR / "styles" / "redesign-v2.css").read_text(encoding="utf-8") self.assertIn(".settings-dialog:not(.heaven-reading-dialog)[open] { margin: auto; }", redesign) self.assertIn("max-height: min(760px, calc(100dvh - 28px));", redesign) self.assertIn('#reviewWorkspaceView .data-table tbody tr:hover td', self.theme) @@ -166,8 +168,8 @@ class FrontendContractTests(unittest.TestCase): self.assertIn('#screenerView .screener-result-frame tbody tr:hover td:last-child', self.theme) def test_global_toast_has_one_owner_and_cannot_stretch_between_insets(self): - styles = (STATIC_DIR / "styles.css").read_text(encoding="utf-8") - wentian = (STATIC_DIR / "wentian-v2.css").read_text(encoding="utf-8") + styles = (STATIC_DIR / "styles" / "styles.css").read_text(encoding="utf-8") + wentian = (STATIC_DIR / "pages" / "heaven" / "page.css").read_text(encoding="utf-8") self.assertIn("#toast.toast {", styles) self.assertIn("top: auto;", styles) self.assertIn("left: auto;", styles) @@ -183,7 +185,7 @@ class FrontendContractTests(unittest.TestCase): def test_shared_ui_core_loads_before_application(self): self.assertLess( - self.html.index('\n', + "", + ) + restored = restored.replace( + ' \n', + "", + ) + self.assertEqual( + restored, + (ORIGINAL_STATIC / "index.html").read_text(encoding="utf-8"), + ) + + def test_complete_stylesheet_stack_is_byte_identical_after_relocation(self) -> None: + for original, migrated in ( + ("shared/tokens.css", "shared/tokens.css"), + ("styles.css", "styles/styles.css"), + ("renovation.css", "styles/renovation.css"), + ("redesign-v2.css", "styles/redesign-v2.css"), + ("design-system.css", "styles/design-system.css"), + ("theme.css", "styles/theme.css"), + ("wentian-v2.css", "pages/heaven/page.css"), + ): + with self.subTest(asset=original): + assert_moved_asset_matches(self, original, migrated) + + def test_shared_vendor_and_animation_assets_are_byte_identical(self) -> None: + for original, migrated in ( + ("ui-core.js", "shared/ui-core.js"), + ("heaven-loading-v2.js", "pages/heaven/loading-v2.js"), + ("heaven-loading.js", "heaven-loading.js"), + ("vendor/lucide.min.js", "vendor/lucide.min.js"), + ("pages.config.js", "pages.config.js"), + ("pages/runtime.js", "pages/runtime.js"), + ("shared/api.js", "shared/api.js"), + ("shared/components.js", "shared/components.js"), + ("shared/shell.js", "shared/shell.js"), + ("shared/state.js", "shared/state.js"), + ): + with self.subTest(asset=original): + assert_moved_asset_matches(self, original, migrated) + + def test_original_page_registration_prefixes_are_preserved(self) -> None: + for path in sorted((ORIGINAL_STATIC / "pages").glob("*/page.js")): + relative = path.relative_to(ORIGINAL_STATIC).as_posix() + with self.subTest(page=relative): + assert_page_prefix_matches(self, relative) + + def test_frontend_is_the_only_served_static_root(self) -> None: + self.assertEqual(STATIC_DIR, APP_DIR / "frontend") + self.assertFalse((APP_DIR / "static").exists()) + + def test_shared_api_remains_the_only_fetch_exit(self) -> None: + consumers = [] + for path in FRONTEND_ROOT.rglob("*.js"): + if "vendor" in path.parts: + continue + if re.search(r"\bfetch\s*\(", path.read_text(encoding="utf-8")): + consumers.append(path.relative_to(FRONTEND_ROOT).as_posix()) + self.assertEqual(consumers, ["shared/api.js"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/app/tests/test_preservation_slice_ladder_rotation.py b/app/tests/test_preservation_slice_ladder_rotation.py index 63e6205..7b3507b 100644 --- a/app/tests/test_preservation_slice_ladder_rotation.py +++ b/app/tests/test_preservation_slice_ladder_rotation.py @@ -5,6 +5,13 @@ import hashlib import unittest from pathlib import Path +from tests.preservation_helpers import ( + ORIGINAL_STATIC, + assert_moved_asset_matches, + assert_page_prefix_matches, + reassembled_frontend_runtime, +) + APP_ROOT = Path(__file__).resolve().parents[1] ORIGINAL_ROOT = APP_ROOT.parent @@ -73,19 +80,17 @@ class LadderRotationSliceSourceEquivalenceTests(unittest.TestCase): ) def test_api_and_frontend_assets_are_unchanged(self) -> None: - for relative in ( - "config/api.config.json", - "static/index.html", - "static/app.js", - "static/styles.css", - "static/pages/ladder/page.js", - "static/pages/rotation/page.js", - ): - self.assertEqual( - sha256(APP_ROOT / relative), - sha256(ORIGINAL_ROOT / relative), - relative, - ) + self.assertEqual( + sha256(APP_ROOT / "config/api.config.json"), + sha256(ORIGINAL_ROOT / "config/api.config.json"), + ) + self.assertEqual( + reassembled_frontend_runtime(), + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8"), + ) + assert_moved_asset_matches(self, "styles.css", "styles/styles.css") + for page in ("pages/ladder/page.js", "pages/rotation/page.js"): + assert_page_prefix_matches(self, page) if __name__ == "__main__": diff --git a/app/tests/test_preservation_slice_market.py b/app/tests/test_preservation_slice_market.py index 827d9af..7f35382 100644 --- a/app/tests/test_preservation_slice_market.py +++ b/app/tests/test_preservation_slice_market.py @@ -13,6 +13,11 @@ from backend.data import realtime from backend.data.providers import ifind_client as canonical_ifind from backend.data.providers import tushare_client as canonical_tushare from backend.features.market import charts +from tests.preservation_helpers import ( + ORIGINAL_STATIC, + assert_moved_asset_matches, + reassembled_frontend_runtime, +) APP_ROOT = Path(__file__).resolve().parents[1] @@ -146,21 +151,19 @@ class MarketSliceSourceEquivalenceTests(unittest.TestCase): top_level_definitions(APP_ROOT / "backend/features/market/charts.py"), ) - def test_unchanged_frontend_assets_match_the_original(self) -> None: - for relative in ( - "index.html", - "app.js", - "styles.css", - "renovation.css", - "redesign-v2.css", - "theme.css", - "wentian-v2.css", + def test_relocated_frontend_preserves_original_market_runtime_and_styles(self) -> None: + self.assertEqual( + reassembled_frontend_runtime(), + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8"), + ) + for original, migrated in ( + ("styles.css", "styles/styles.css"), + ("renovation.css", "styles/renovation.css"), + ("redesign-v2.css", "styles/redesign-v2.css"), + ("theme.css", "styles/theme.css"), + ("wentian-v2.css", "pages/heaven/page.css"), ): - self.assertEqual( - sha256(APP_ROOT / "static" / relative), - sha256(ORIGINAL_ROOT / "static" / relative), - relative, - ) + assert_moved_asset_matches(self, original, migrated) if __name__ == "__main__": diff --git a/app/tests/test_preservation_slice_market_insights.py b/app/tests/test_preservation_slice_market_insights.py index 0b15008..47ed798 100644 --- a/app/tests/test_preservation_slice_market_insights.py +++ b/app/tests/test_preservation_slice_market_insights.py @@ -7,6 +7,12 @@ from pathlib import Path import market_insights from backend.features.market import insights as canonical_insights +from tests.preservation_helpers import ( + ORIGINAL_STATIC, + assert_moved_asset_matches, + assert_page_prefix_matches, + reassembled_frontend_runtime, +) APP_ROOT = Path(__file__).resolve().parents[1] @@ -174,21 +180,22 @@ class MarketInsightsSliceSourceEquivalenceTests(unittest.TestCase): self.assertEqual(migrated[name], original[name], name) def test_api_and_frontend_assets_are_unchanged(self) -> None: - for relative in ( - "config/api.config.json", - "static/index.html", - "static/app.js", - "static/styles.css", - "static/pages/auction/page.js", - "static/pages/themes/page.js", - "static/pages/popularity/page.js", - "static/pages/dragon-tiger/page.js", + self.assertEqual( + sha256(APP_ROOT / "config/api.config.json"), + sha256(ORIGINAL_ROOT / "config/api.config.json"), + ) + self.assertEqual( + reassembled_frontend_runtime(), + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8"), + ) + assert_moved_asset_matches(self, "styles.css", "styles/styles.css") + for page in ( + "pages/auction/page.js", + "pages/themes/page.js", + "pages/popularity/page.js", + "pages/dragon-tiger/page.js", ): - self.assertEqual( - sha256(APP_ROOT / relative), - sha256(ORIGINAL_ROOT / relative), - relative, - ) + assert_page_prefix_matches(self, page) if __name__ == "__main__": diff --git a/app/tests/test_preservation_slice_screener.py b/app/tests/test_preservation_slice_screener.py index 8f14fdf..2748856 100644 --- a/app/tests/test_preservation_slice_screener.py +++ b/app/tests/test_preservation_slice_screener.py @@ -11,6 +11,12 @@ import screener import strategy_tracking from backend.features.screener import compiler, engine, strategies, tracking from backend.features.screener import service as screener_service +from tests.preservation_helpers import ( + ORIGINAL_STATIC, + assert_moved_asset_matches, + assert_page_prefix_matches, + reassembled_frontend_runtime, +) APP_ROOT = Path(__file__).resolve().parents[1] @@ -182,17 +188,12 @@ class ScreenerSliceSourceEquivalenceTests(unittest.TestCase): ) def test_screener_frontend_assets_are_unchanged(self) -> None: - for relative in ( - "static/index.html", - "static/app.js", - "static/styles.css", - "static/pages/screener/page.js", - ): - self.assertEqual( - sha256(APP_ROOT / relative), - sha256(ORIGINAL_ROOT / relative), - relative, - ) + self.assertEqual( + reassembled_frontend_runtime(), + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8"), + ) + assert_moved_asset_matches(self, "styles.css", "styles/styles.css") + assert_page_prefix_matches(self, "pages/screener/page.js") if __name__ == "__main__": diff --git a/app/tests/test_preservation_slice_sentiment_pools.py b/app/tests/test_preservation_slice_sentiment_pools.py index 69aec93..5a08ac0 100644 --- a/app/tests/test_preservation_slice_sentiment_pools.py +++ b/app/tests/test_preservation_slice_sentiment_pools.py @@ -7,6 +7,12 @@ from pathlib import Path import sentiment_engine from backend.features.sentiment import engine as canonical_engine +from tests.preservation_helpers import ( + ORIGINAL_STATIC, + assert_moved_asset_matches, + assert_page_prefix_matches, + reassembled_frontend_runtime, +) APP_ROOT = Path(__file__).resolve().parents[1] @@ -95,19 +101,17 @@ class SentimentPoolSliceSourceEquivalenceTests(unittest.TestCase): self.assertIs(sentiment_engine, canonical_engine) def test_api_and_frontend_assets_are_unchanged(self) -> None: - for relative in ( - "config/api.config.json", - "static/index.html", - "static/app.js", - "static/styles.css", - "static/pages/sentiment/page.js", - "static/pages/pools/page.js", - ): - self.assertEqual( - sha256(APP_ROOT / relative), - sha256(ORIGINAL_ROOT / relative), - relative, - ) + self.assertEqual( + sha256(APP_ROOT / "config/api.config.json"), + sha256(ORIGINAL_ROOT / "config/api.config.json"), + ) + self.assertEqual( + reassembled_frontend_runtime(), + (ORIGINAL_STATIC / "app.js").read_text(encoding="utf-8"), + ) + assert_moved_asset_matches(self, "styles.css", "styles/styles.css") + for page in ("pages/sentiment/page.js", "pages/pools/page.js"): + assert_page_prefix_matches(self, page) if __name__ == "__main__": diff --git a/app/tools/build_architecture_inventory.py b/app/tools/build_architecture_inventory.py index 7e1e80b..3ead445 100644 --- a/app/tools/build_architecture_inventory.py +++ b/app/tools/build_architecture_inventory.py @@ -75,13 +75,15 @@ def code_hotspots() -> list[dict[str, Any]]: "screener.py", "market_insights.py", "tushare_client.py", - "static/index.html", - "static/app.js", - "static/styles.css", - "static/redesign-v2.css", - "static/renovation.css", - "static/theme.css", - "static/wentian-v2.css", + "frontend/index.html", + "frontend/app.js", + "frontend/styles/styles.css", + "frontend/styles/redesign-v2.css", + "frontend/styles/renovation.css", + "frontend/styles/theme.css", + "frontend/pages/heaven/page.css", + "frontend/pages/heaven/page.js", + "frontend/pages/market/runtime.js", ] rows = [] for name in candidates: @@ -97,7 +99,7 @@ def code_hotspots() -> list[dict[str, Any]]: def build() -> dict[str, Any]: - html = source("static/index.html") + html = source("frontend/index.html") server = source("server.py") database = source("database.py") pages = page_inventory(html) diff --git a/app/tools/compare_preservation_databases.py b/app/tools/compare_preservation_databases.py index efb0d67..e72f17b 100644 --- a/app/tools/compare_preservation_databases.py +++ b/app/tools/compare_preservation_databases.py @@ -27,9 +27,21 @@ def schema(connection: sqlite3.Connection) -> list[dict[str, Any]]: return [dict(row) for row in rows] -def table_rows(connection: sqlite3.Connection, table: str) -> list[dict[str, Any]]: +def table_rows( + connection: sqlite3.Connection, + table: str, + excluded_columns: set[str] | None = None, +) -> list[dict[str, Any]]: quoted = '"' + table.replace('"', '""') + '"' - rows = [dict(row) for row in connection.execute(f"SELECT * FROM {quoted}").fetchall()] + excluded_columns = excluded_columns or set() + rows = [ + { + key: value + for key, value in dict(row).items() + if key not in excluded_columns + } + for row in connection.execute(f"SELECT * FROM {quoted}").fetchall() + ] return sorted(rows, key=lambda row: json.dumps(row, ensure_ascii=False, sort_keys=True, default=str)) @@ -38,9 +50,23 @@ def main() -> None: parser.add_argument("--original", type=Path, required=True) parser.add_argument("--migrated", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) + parser.add_argument( + "--exclude-column", + action="append", + default=[], + metavar="TABLE.COLUMN", + help="exclude a nondeterministic column from one table comparison", + ) parser.add_argument("tables", nargs="+") args = parser.parse_args() + excluded_by_table: dict[str, set[str]] = {} + for item in args.exclude_column: + table, separator, column = item.partition(".") + if not separator or not table or not column: + parser.error("--exclude-column must use TABLE.COLUMN") + excluded_by_table.setdefault(table, set()).add(column) + original = sqlite3.connect(args.original) migrated = sqlite3.connect(args.migrated) original.row_factory = sqlite3.Row @@ -51,8 +77,9 @@ def main() -> None: tables = [] all_equal = original_schema == migrated_schema for table in args.tables: - original_rows = table_rows(original, table) - migrated_rows = table_rows(migrated, table) + excluded_columns = excluded_by_table.get(table, set()) + original_rows = table_rows(original, table, excluded_columns) + migrated_rows = table_rows(migrated, table, excluded_columns) equal = original_rows == migrated_rows all_equal = all_equal and equal tables.append( @@ -63,6 +90,7 @@ def main() -> None: "original_sha256": digest(original_rows), "migrated_sha256": digest(migrated_rows), "equal": equal, + "excluded_columns": sorted(excluded_columns), } ) result = { diff --git a/app/tools/split_frontend_runtime.py b/app/tools/split_frontend_runtime.py new file mode 100644 index 0000000..e61e199 --- /dev/null +++ b/app/tools/split_frontend_runtime.py @@ -0,0 +1,184 @@ +from __future__ import annotations + +import hashlib +import json +import re +from pathlib import Path + + +REPOSITORY_ROOT = Path(__file__).resolve().parents[2] +ORIGINAL_STATIC = REPOSITORY_ROOT / "static" +FRONTEND_ROOT = REPOSITORY_ROOT / "app" / "frontend" +EVIDENCE_PATH = ( + REPOSITORY_ROOT + / "docs" + / "migration" + / "evidence" + / "slice-10" + / "frontend-source-map.json" +) +EXPECTED_SOURCE_SHA256 = "c020d0bc68f8a96b352a0ffa62c913a0ea3f5ca0afc41f70969f833e447166a6" + +RUNTIME_RANGES: dict[str, list[tuple[int, int]]] = { + "pages/sentiment/page.js": [(1207, 1516)], + "pages/pools/page.js": [(1517, 1915)], + "pages/market/runtime.js": [(1916, 1957), (6893, 7719), (7969, 8426)], + "pages/rotation/page.js": [(1958, 2124)], + "pages/ladder/page.js": [(2125, 2216)], + "pages/auction/page.js": [(2217, 2481)], + "pages/themes/page.js": [(2482, 2583)], + "pages/popularity/page.js": [(2584, 2659)], + "pages/dragon-tiger/page.js": [(2660, 3028)], + "pages/review/page.js": [(3029, 3470), (7720, 7968)], + "pages/screener/page.js": [(3490, 4336), (6668, 6892)], + "pages/mentor/page.js": [(4337, 4827)], + "pages/heaven/page.js": [(4828, 6667)], + "shared/export.js": [(8905, 9051)], +} + + +def digest(content: str) -> str: + return hashlib.sha256(content.encode("utf-8")).hexdigest() + + +def marker(start: int, end: int, kind: str) -> str: + return f"/* PRESERVATION-SOURCE-{kind} app.js:{start}-{end} */" + + +def wrapped_chunk(lines: list[str], start: int, end: int) -> str: + content = "".join(lines[start - 1 : end]) + return f"{marker(start, end, 'BEGIN')}\n{content}{marker(start, end, 'END')}\n" + + +def complement_ranges(total: int, moved: set[int]) -> list[tuple[int, int]]: + ranges: list[tuple[int, int]] = [] + start = 0 + for number in range(1, total + 1): + if number in moved: + if start: + ranges.append((start, number - 1)) + start = 0 + elif not start: + start = number + if start: + ranges.append((start, total)) + return ranges + + +def original_prefix(relative: str) -> str: + source = ORIGINAL_STATIC / relative + if not source.is_file(): + return "" + return source.read_text(encoding="utf-8").rstrip("\n") + "\n\n" + + +def extract_written_chunks(paths: list[Path]) -> dict[tuple[int, int], str]: + pattern = re.compile( + r"/\* PRESERVATION-SOURCE-BEGIN app\.js:(\d+)-(\d+) \*/\n" + r"(.*?)" + r"/\* PRESERVATION-SOURCE-END app\.js:\1-\2 \*/\n?", + re.DOTALL, + ) + chunks: dict[tuple[int, int], str] = {} + for path in paths: + content = path.read_text(encoding="utf-8") + for match in pattern.finditer(content): + key = (int(match.group(1)), int(match.group(2))) + if key in chunks: + raise RuntimeError(f"Duplicate preserved range {key}") + chunks[key] = match.group(3) + return chunks + + +def main() -> None: + source_path = ORIGINAL_STATIC / "app.js" + target_path = FRONTEND_ROOT / "app.js" + source_bytes = source_path.read_bytes() + source_sha256 = hashlib.sha256(source_bytes).hexdigest() + if source_sha256 != EXPECTED_SOURCE_SHA256: + raise RuntimeError( + f"Original app.js changed: expected {EXPECTED_SOURCE_SHA256}, got {source_sha256}" + ) + if not target_path.is_file(): + raise RuntimeError(f"Missing target runtime: {target_path}") + if hashlib.sha256(target_path.read_bytes()).hexdigest() != EXPECTED_SOURCE_SHA256: + raise RuntimeError("Target app.js is not the exact pre-split original") + + source = source_bytes.decode("utf-8") + lines = source.splitlines(keepends=True) + moved_lines: set[int] = set() + for ranges in RUNTIME_RANGES.values(): + for start, end in ranges: + overlap = moved_lines.intersection(range(start, end + 1)) + if overlap: + raise RuntimeError(f"Overlapping source ranges at line {min(overlap)}") + moved_lines.update(range(start, end + 1)) + + core_ranges = complement_ranges(len(lines), moved_lines) + target_path.write_text( + "\n".join(wrapped_chunk(lines, start, end).rstrip("\n") for start, end in core_ranges) + + "\n", + encoding="utf-8", + ) + + written_paths = [target_path] + for relative, ranges in RUNTIME_RANGES.items(): + path = FRONTEND_ROOT / relative + path.parent.mkdir(parents=True, exist_ok=True) + chunks = "\n".join( + wrapped_chunk(lines, start, end).rstrip("\n") for start, end in ranges + ) + path.write_text(original_prefix(relative) + chunks + "\n", encoding="utf-8") + written_paths.append(path) + + extracted = extract_written_chunks(written_paths) + expected_ranges = { + source_range for ranges in RUNTIME_RANGES.values() for source_range in ranges + } | set(core_ranges) + if set(extracted) != expected_ranges: + raise RuntimeError("Written source ranges do not cover the original runtime exactly") + + reassembled = [""] * len(lines) + for (start, end), content in extracted.items(): + chunk_lines = content.splitlines(keepends=True) + if len(chunk_lines) != end - start + 1: + raise RuntimeError(f"Line count changed in preserved range {start}-{end}") + reassembled[start - 1 : end] = chunk_lines + reassembled_source = "".join(reassembled) + if reassembled_source != source: + raise RuntimeError("Split runtime cannot be reassembled byte-for-byte") + + manifest = { + "source": "static/app.js", + "source_sha256": source_sha256, + "source_line_count": len(lines), + "reassembled_sha256": digest(reassembled_source), + "all_source_lines_preserved": True, + "core": { + "target": "app/frontend/app.js", + "ranges": [{"start": start, "end": end} for start, end in core_ranges], + }, + "modules": [ + { + "target": f"app/frontend/{relative}", + "ranges": [ + { + "start": start, + "end": end, + "sha256": digest("".join(lines[start - 1 : end])), + } + for start, end in ranges + ], + } + for relative, ranges in RUNTIME_RANGES.items() + ], + } + EVIDENCE_PATH.parent.mkdir(parents=True, exist_ok=True) + EVIDENCE_PATH.write_text( + json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + print(json.dumps(manifest, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/docs/migration/evidence/slice-10/README.md b/docs/migration/evidence/slice-10/README.md new file mode 100644 index 0000000..4ad541f --- /dev/null +++ b/docs/migration/evidence/slice-10/README.md @@ -0,0 +1,66 @@ +# 切片 10:前端 Shell、页面、样式与移动端职责归位 + +> 基线:`38de3de`(切片 09) +> 回档标签:`xiaobai-preservation-slice-10-20260731` +> 结论:源码、静态资产、API、数据库、桌面/移动页面及动画差分通过;最终视觉仍等待全站人工验收 + +## 1. 原实现归位 + +本切片只移动和拆分原版前端源码,没有从`next/`取用代码,也没有重写页面、样式、动画、交互或响应式规则。 + +| 原位置 | 新位置 | 处理方式 | +|---|---|---| +| `static/index.html` | `app/frontend/index.html` | 原 DOM 骨架,仅调整静态资源路径和拆分脚本加载顺序 | +| `static/app.js` | `app/frontend/app.js`、`pages/*/page.js`、`pages/market/runtime.js`、`shared/export.js` | 按连续源码行机械拆分 | +| `static/styles.css`等公共样式 | `app/frontend/styles/` | 字节级移动 | +| `static/wentian-v2.css` | `app/frontend/pages/heaven/page.css` | 字节级移动 | +| `static/ui-core.js` | `app/frontend/shared/ui-core.js` | 字节级移动 | +| `static/heaven-loading-v2.js` | `app/frontend/pages/heaven/loading-v2.js` | 字节级移动 | +| `static/pages/`、`shared/`、`vendor/` | `app/frontend/`同职责目录 | 字节级移动 | + +`app/backend/bootstrap/config.py`现在只把静态根目录从`app/static/`切换到`app/frontend/`。原`app/static/`已不再存在,避免形成两套可被误改的前端实现。 + +## 2. 源码与静态资产等价 + +- 原`static/app.js`共 9,283 行,SHA-256 为`c020d0bc68f8a96b352a0ffa62c913a0ea3f5ca0afc41f70969f833e447166a6`。 +- 所有拆分文件中的保真源码片段按原行号重组后,SHA-256仍为同一值,9,283行无遗漏、无重排、无内容变化。 +- 七层原版样式、问天样式、加载动画、共享脚本、页面注册脚本及Lucide供应商文件在移动后保持字节一致。 +- `index.html`的差异仅限资源新路径和两个机械拆分脚本入口;反向替换后与原版逐字符一致。 +- 浏览器请求仍只有`shared/api.js`一个`fetch`出口。 +- 完整行号映射见`frontend-source-map.json`;拆分工具为`app/tools/split_frontend_runtime.py`,可重复验证但不用于运行时构建。 + +## 3. API 与数据库差分 + +- 同一管理员账号和同一固定日期下,对原版与迁移版执行21个全站只读请求。 +- 请求覆盖账号、行情、情绪、轮动、竞价、题材、人气、龙虎榜、选股、问师、问天、复盘与提醒;状态码和规范化业务JSON全部一致。 +- 两个数据库副本均包含62个schema对象,schema哈希一致。 +- 21张关键表的记录数、顺序和规范化内容逐行一致;`screener_strategies`仅排除每次初始化可能更新的`updated_at`。 +- 完整结果见`api-requests.json`、`api-diff.json`和`database-diff.json`,两份差分文件的`all_equal`均为`true`。 + +## 4. 真实浏览器差分 + +- 1920×1080日间模式检查情绪周期、集合竞价、智能选股、观势、观气、观心介绍及观心呼吸。 +- 1920×1080夜间模式检查情绪周期的背景、字体、表格、几何和横向溢出。 +- 390×844检查情绪周期与观势:移动Shell、底部五入口、页面纵向滚动、无横向溢出及问天特效均一致。 +- 观势星空节点90个、观气100个、观心110个;三页八卦节点均为2个。 +- 观势与观气保留`wt-tw`和`wt-spin`动画;观心呼吸保留`heart-incense-burn`、`heart-incense-glow`及动态波纹。 +- 观气五行行业为5组且默认折叠;观心介绍到呼吸流程可正常进入。 +- 原版和迁移版检查流程均未产生新增控制台error或warn。 +- 动画帧、焦点框和动态状态文字属于采样瞬时状态,因此截图文件哈希不要求相同;可见布局几何、计算样式、节点、动画名称和交互结果必须一致,本次均通过。 +- 两个服务使用相同主机名、不同端口时会共享并覆盖登录Cookie;曾导致迁移版切页被误判为失效。逐服务重新登录后行为一致,该问题属于并行验收环境限制,不是产品回归。 +- 机器可读记录见`browser-acceptance.json`,截图均保存在本目录。 + +## 5. 自动验证与保留边界 + +| 验证 | 结果 | +|---|---:| +| 前端专项测试 | 85项通过 | +| 原版`python -m unittest discover -s tests -q` | 231项通过 | +| 迁移版`python -m unittest discover -s tests -q` | 294项通过 | +| `npx.cmd playwright test --reporter=dot` | 45项通过(2.3分钟) | +| 全部拆分后JavaScript执行`node --check` | 通过 | +| `git diff --check` | 通过 | + +- `demo_data.py`、`frontend/heaven-loading.js`、五个疑似无引用前端函数和`wencai_saved_queries`继续保留到切片11逐项审计。 +- 没有修改`next/`、正式数据库、Docker/NAS或`8765`服务。 +- 自动差分只能证明已检查范围一致;依据迁移总纲,未经用户最终人工确认不得宣称全站视觉已经完全等价。 diff --git a/docs/migration/evidence/slice-10/api-diff.json b/docs/migration/evidence/slice-10/api-diff.json new file mode 100644 index 0000000..aee58c5 --- /dev/null +++ b/docs/migration/evidence/slice-10/api-diff.json @@ -0,0 +1,236 @@ +{ + "all_equal": true, + "endpoints": [ + { + "name": "当前账号", + "method": "GET", + "endpoint": "/api/auth/me", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "33e0c08463d5f14a142840f894d92985135c6ce2bee22c93c4dde34dc433cf5b", + "migrated_sha256": "33e0c08463d5f14a142840f894d92985135c6ce2bee22c93c4dde34dc433cf5b", + "equal": true, + "first_difference": null + }, + { + "name": "账号状态", + "method": "GET", + "endpoint": "/api/account/status", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "a1f81967a58dae0947191fe1a7465c87e70403339e36897329de94c541272e05", + "migrated_sha256": "a1f81967a58dae0947191fe1a7465c87e70403339e36897329de94c541272e05", + "equal": true, + "first_difference": null + }, + { + "name": "全市场总览", + "method": "GET", + "endpoint": "/api/dashboard?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "565730fb75cec6f6758321074dfeba7bff19db6611476d511f9bc7257a5870f5", + "migrated_sha256": "565730fb75cec6f6758321074dfeba7bff19db6611476d511f9bc7257a5870f5", + "equal": true, + "first_difference": null + }, + { + "name": "情绪周期历史", + "method": "GET", + "endpoint": "/api/sentiment/history?trade_date=2026-07-30&limit=9", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "1a577fb859a2fd06749169e1d0f08f78b51c5217b55506c7903487a956b6192b", + "migrated_sha256": "1a577fb859a2fd06749169e1d0f08f78b51c5217b55506c7903487a956b6192b", + "equal": true, + "first_difference": null + }, + { + "name": "板块轮动历史", + "method": "GET", + "endpoint": "/api/rotation/history?trade_date=2026-07-30&limit=9", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "eaf3ac41f479c0f57f161546f197c1321721b4a8390486a916232fe6ea1d3d37", + "migrated_sha256": "eaf3ac41f479c0f57f161546f197c1321721b4a8390486a916232fe6ea1d3d37", + "equal": true, + "first_difference": null + }, + { + "name": "集合竞价", + "method": "GET", + "endpoint": "/api/auction?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "bd75b100485c0afa0cdddc73d1880160eea8c0b8c91f556245c665d591285ed6", + "migrated_sha256": "bd75b100485c0afa0cdddc73d1880160eea8c0b8c91f556245c665d591285ed6", + "equal": true, + "first_difference": null + }, + { + "name": "题材库", + "method": "GET", + "endpoint": "/api/themes?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "f45e218d9bff5191445fe45b03fc62f3d9c440b8353404ae4b54901c20929552", + "migrated_sha256": "f45e218d9bff5191445fe45b03fc62f3d9c440b8353404ae4b54901c20929552", + "equal": true, + "first_difference": null + }, + { + "name": "人气热榜", + "method": "GET", + "endpoint": "/api/popularity?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "69987a80f02ac02bf9ff49b3a0a99782385f1933c643c9e3dbb5a75a1e20dd29", + "migrated_sha256": "69987a80f02ac02bf9ff49b3a0a99782385f1933c643c9e3dbb5a75a1e20dd29", + "equal": true, + "first_difference": null + }, + { + "name": "龙虎榜", + "method": "GET", + "endpoint": "/api/dragon-tiger?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "173baf4e1f0b56678aef3f74276f29af49271ea34c89c0c18283bfe27f5cf2a6", + "migrated_sha256": "173baf4e1f0b56678aef3f74276f29af49271ea34c89c0c18283bfe27f5cf2a6", + "equal": true, + "first_difference": null + }, + { + "name": "游资档案", + "method": "GET", + "endpoint": "/api/dragon-tiger/profiles", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "dfb1e534c018ec12fd8d8ee0e7fe0f234e73dc7715d7f0a948f74ef8d12d779a", + "migrated_sha256": "dfb1e534c018ec12fd8d8ee0e7fe0f234e73dc7715d7f0a948f74ef8d12d779a", + "equal": true, + "first_difference": null + }, + { + "name": "智能选股工作区", + "method": "GET", + "endpoint": "/api/screener/setup?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "e33a10e94accda4948c2af53887ea97736697f588ee1a92f561aa5c4bb28c2fd", + "migrated_sha256": "e33a10e94accda4948c2af53887ea97736697f588ee1a92f561aa5c4bb28c2fd", + "equal": true, + "first_difference": null + }, + { + "name": "策略持续跟踪", + "method": "GET", + "endpoint": "/api/screener/tracking?limit=12", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "f4476f53152b6a2ce01f2918da5999246cfd0ad7d0b71e80fdea8fa59c7456c2", + "migrated_sha256": "f4476f53152b6a2ce01f2918da5999246cfd0ad7d0b71e80fdea8fa59c7456c2", + "equal": true, + "first_difference": null + }, + { + "name": "问师模型库", + "method": "GET", + "endpoint": "/api/mentors/setup?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "0ff7794fe45f49ab980221fa855b64c70d5c9b83c78ef86edc041e713490b626", + "migrated_sha256": "0ff7794fe45f49ab980221fa855b64c70d5c9b83c78ef86edc041e713490b626", + "equal": true, + "first_difference": null + }, + { + "name": "问师历史", + "method": "GET", + "endpoint": "/api/mentors/messages?mentor_id=kobe92-perspective&trade_date=20260730", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "eef46741adfc3a9f76294d3b78f37a45f113092ac9d44ee77c7a038a88ff09a1", + "migrated_sha256": "eef46741adfc3a9f76294d3b78f37a45f113092ac9d44ee77c7a038a88ff09a1", + "equal": true, + "first_difference": null + }, + { + "name": "问天初始化", + "method": "GET", + "endpoint": "/api/heaven/setup?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "c814c2004c7dd672c397887725af000c150693a50900bb0ce1aa94599af1a3c8", + "migrated_sha256": "c814c2004c7dd672c397887725af000c150693a50900bb0ce1aa94599af1a3c8", + "equal": true, + "first_difference": null + }, + { + "name": "问天历史", + "method": "GET", + "endpoint": "/api/heaven/readings?mode=trend&limit=20", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "2aa83ea177bd5cb2351ac4f3a60fdcd17e02cfc14b5753e157e515f03fc2c6c1", + "migrated_sha256": "2aa83ea177bd5cb2351ac4f3a60fdcd17e02cfc14b5753e157e515f03fc2c6c1", + "equal": true, + "first_difference": null + }, + { + "name": "自选追踪", + "method": "GET", + "endpoint": "/api/watchlist?trade_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "29c001cc6859312fd90082d0fb83818d263827e28ec21157b94c415b71c45078", + "migrated_sha256": "29c001cc6859312fd90082d0fb83818d263827e28ec21157b94c415b71c45078", + "equal": true, + "first_difference": null + }, + { + "name": "全部复盘笔记", + "method": "GET", + "endpoint": "/api/notes?scope=all", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "a2a1f08610d017de0e46080a1268f72b734eeb80f9cada311d7e03eb1416656a", + "migrated_sha256": "a2a1f08610d017de0e46080a1268f72b734eeb80f9cada311d7e03eb1416656a", + "equal": true, + "first_difference": null + }, + { + "name": "交易日志", + "method": "GET", + "endpoint": "/api/trades?end_date=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "77287b34046e22748e94e61ead841e157f6b63f08de1b2fe61f5d715b2e989a4", + "migrated_sha256": "77287b34046e22748e94e61ead841e157f6b63f08de1b2fe61f5d715b2e989a4", + "equal": true, + "first_difference": null + }, + { + "name": "提醒中心", + "method": "GET", + "endpoint": "/api/alerts?status=all&as_of=2026-07-30", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "495a1f83ed661913807899e0955ef1b89193c30bc9a5be0587f7f03d60411d95", + "migrated_sha256": "495a1f83ed661913807899e0955ef1b89193c30bc9a5be0587f7f03d60411d95", + "equal": true, + "first_difference": null + }, + { + "name": "复盘助手历史", + "method": "GET", + "endpoint": "/api/assistant/messages", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "eef46741adfc3a9f76294d3b78f37a45f113092ac9d44ee77c7a038a88ff09a1", + "migrated_sha256": "eef46741adfc3a9f76294d3b78f37a45f113092ac9d44ee77c7a038a88ff09a1", + "equal": true, + "first_difference": null + } + ] +} diff --git a/docs/migration/evidence/slice-10/api-requests.json b/docs/migration/evidence/slice-10/api-requests.json new file mode 100644 index 0000000..dcf28c1 --- /dev/null +++ b/docs/migration/evidence/slice-10/api-requests.json @@ -0,0 +1,29 @@ +[ + {"name": "当前账号", "method": "GET", "endpoint": "/api/auth/me", "exclude_paths": ["$.csrf_token"]}, + {"name": "账号状态", "method": "GET", "endpoint": "/api/account/status"}, + {"name": "全市场总览", "method": "GET", "endpoint": "/api/dashboard?trade_date=2026-07-30"}, + {"name": "情绪周期历史", "method": "GET", "endpoint": "/api/sentiment/history?trade_date=2026-07-30&limit=9"}, + {"name": "板块轮动历史", "method": "GET", "endpoint": "/api/rotation/history?trade_date=2026-07-30&limit=9"}, + {"name": "集合竞价", "method": "GET", "endpoint": "/api/auction?trade_date=2026-07-30", "exclude_paths": ["$.meta.updated_at"]}, + {"name": "题材库", "method": "GET", "endpoint": "/api/themes?trade_date=2026-07-30"}, + {"name": "人气热榜", "method": "GET", "endpoint": "/api/popularity?trade_date=2026-07-30"}, + {"name": "龙虎榜", "method": "GET", "endpoint": "/api/dragon-tiger?trade_date=2026-07-30"}, + {"name": "游资档案", "method": "GET", "endpoint": "/api/dragon-tiger/profiles"}, + { + "name": "智能选股工作区", + "method": "GET", + "endpoint": "/api/screener/setup?trade_date=2026-07-30", + "sort_lists": {"$.strategies": "id"}, + "exclude_paths": ["$.strategies[].updated_at"] + }, + {"name": "策略持续跟踪", "method": "GET", "endpoint": "/api/screener/tracking?limit=12"}, + {"name": "问师模型库", "method": "GET", "endpoint": "/api/mentors/setup?trade_date=2026-07-30"}, + {"name": "问师历史", "method": "GET", "endpoint": "/api/mentors/messages?mentor_id=kobe92-perspective&trade_date=20260730"}, + {"name": "问天初始化", "method": "GET", "endpoint": "/api/heaven/setup?trade_date=2026-07-30"}, + {"name": "问天历史", "method": "GET", "endpoint": "/api/heaven/readings?mode=trend&limit=20"}, + {"name": "自选追踪", "method": "GET", "endpoint": "/api/watchlist?trade_date=2026-07-30"}, + {"name": "全部复盘笔记", "method": "GET", "endpoint": "/api/notes?scope=all"}, + {"name": "交易日志", "method": "GET", "endpoint": "/api/trades?end_date=2026-07-30"}, + {"name": "提醒中心", "method": "GET", "endpoint": "/api/alerts?status=all&as_of=2026-07-30"}, + {"name": "复盘助手历史", "method": "GET", "endpoint": "/api/assistant/messages"} +] diff --git a/docs/migration/evidence/slice-10/browser-acceptance.json b/docs/migration/evidence/slice-10/browser-acceptance.json new file mode 100644 index 0000000..c37e3cb --- /dev/null +++ b/docs/migration/evidence/slice-10/browser-acceptance.json @@ -0,0 +1,93 @@ +{ + "schema_version": 1, + "tested_at": "2026-07-31T12:00:00+08:00", + "result": "passed", + "environments": { + "original": "temporary_original_runtime", + "migrated": "temporary_app_runtime", + "account": "administrator", + "database": "isolated_copies" + }, + "viewports": [ + { + "width": 1920, + "height": 1080, + "theme": "light", + "views": [ + "sentiment", + "auction", + "screener", + "heaven_trend", + "heaven_fortune", + "heaven_heart_intro", + "heaven_heart_breath" + ], + "equal": true + }, + { + "width": 1920, + "height": 1080, + "theme": "dark", + "views": [ + "sentiment" + ], + "equal": true + }, + { + "width": 390, + "height": 844, + "theme": "light", + "views": [ + "sentiment", + "heaven_trend" + ], + "equal": true + } + ], + "heaven_animation_contract": { + "trend_star_nodes": 90, + "fortune_star_nodes": 100, + "heart_star_nodes": 110, + "bagua_nodes_per_view": 2, + "trend_and_fortune_animations": [ + "wt-tw", + "wt-spin" + ], + "heart_breath_animations": [ + "heart-incense-burn", + "heart-incense-glow" + ], + "fortune_industry_groups": 5, + "fortune_industries_collapsed_by_default": true, + "equal": true + }, + "mobile_contract": { + "primary_navigation_items": 5, + "horizontal_overflow": false, + "vertical_page_scroll": true, + "heaven_trend_geometry": { + "active": { + "height": 723, + "width": 374, + "x": 8, + "y": 50 + }, + "header": { + "width": 390, + "height": 50 + }, + "bottom_navigation": { + "width": 390, + "height": 58 + } + }, + "equal": true + }, + "console": { + "new_errors": 0, + "new_warnings": 0 + }, + "screenshot_policy": "Dynamic animation frames, focus outlines, and live status text may change pixel hashes. Acceptance compares visible geometry, computed styles, DOM state, animation names, interaction results, and overflow behavior.", + "known_test_environment_constraint": "Original and migrated services on the same hostname share cookies across ports. Each service must be logged in separately immediately before comparison.", + "all_equal": true +} diff --git a/docs/migration/evidence/slice-10/database-diff.json b/docs/migration/evidence/slice-10/database-diff.json new file mode 100644 index 0000000..e32d16a --- /dev/null +++ b/docs/migration/evidence/slice-10/database-diff.json @@ -0,0 +1,202 @@ +{ + "all_equal": true, + "schema": { + "object_count": 62, + "original_sha256": "60a4e044f0ddb6502e44b45f65bedc1a0a31d4bd596f386d4ccfe153a6c8ddd1", + "migrated_sha256": "60a4e044f0ddb6502e44b45f65bedc1a0a31d4bd596f386d4ccfe153a6c8ddd1", + "equal": true + }, + "tables": [ + { + "table": "users", + "original_count": 3, + "migrated_count": 3, + "original_sha256": "4a0f135bef8ebae454693d3f40e1157d84d814d18d849f33e2e760ed1d8a7f89", + "migrated_sha256": "4a0f135bef8ebae454693d3f40e1157d84d814d18d849f33e2e760ed1d8a7f89", + "equal": true, + "excluded_columns": [] + }, + { + "table": "system_settings", + "original_count": 1, + "migrated_count": 1, + "original_sha256": "86d333a5c7feaf7111cd79b2db29513326a9b0d3781607f78bf633579e2ca8e9", + "migrated_sha256": "86d333a5c7feaf7111cd79b2db29513326a9b0d3781607f78bf633579e2ca8e9", + "equal": true, + "excluded_columns": [] + }, + { + "table": "watchlist", + "original_count": 6, + "migrated_count": 6, + "original_sha256": "070161f5cdcc33addf289f11cb0ae54bfc0d669a39426fc33398b64512dba2fe", + "migrated_sha256": "070161f5cdcc33addf289f11cb0ae54bfc0d669a39426fc33398b64512dba2fe", + "equal": true, + "excluded_columns": [] + }, + { + "table": "review_notes", + "original_count": 3, + "migrated_count": 3, + "original_sha256": "86ed485c2ce922e3434f8ac742d38431ef430b5c22024cacb6f64f0e8e71ee98", + "migrated_sha256": "86ed485c2ce922e3434f8ac742d38431ef430b5c22024cacb6f64f0e8e71ee98", + "equal": true, + "excluded_columns": [] + }, + { + "table": "trade_entries", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + }, + { + "table": "alerts", + "original_count": 2, + "migrated_count": 2, + "original_sha256": "40b1ee5678b32f29ae356c1b30958e66138d34afd2aa6b8364fa02c23df66553", + "migrated_sha256": "40b1ee5678b32f29ae356c1b30958e66138d34afd2aa6b8364fa02c23df66553", + "equal": true, + "excluded_columns": [] + }, + { + "table": "assistant_messages", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + }, + { + "table": "mentor_messages", + "original_count": 28, + "migrated_count": 28, + "original_sha256": "b906b776d575ff6fe459b2aa0e8b396267feed36d3d85f7edd7947b284482aeb", + "migrated_sha256": "b906b776d575ff6fe459b2aa0e8b396267feed36d3d85f7edd7947b284482aeb", + "equal": true, + "excluded_columns": [] + }, + { + "table": "mentor_preferences", + "original_count": 45, + "migrated_count": 45, + "original_sha256": "c19c7d05e6745e4f1787d1eed5f39d7e555ec24f8e490b585c19158edc2505ec", + "migrated_sha256": "c19c7d05e6745e4f1787d1eed5f39d7e555ec24f8e490b585c19158edc2505ec", + "equal": true, + "excluded_columns": [] + }, + { + "table": "heaven_readings", + "original_count": 31, + "migrated_count": 31, + "original_sha256": "e6cfc86f010fb182d7522bb99e5d268e826f93896035172120df51a011590951", + "migrated_sha256": "e6cfc86f010fb182d7522bb99e5d268e826f93896035172120df51a011590951", + "equal": true, + "excluded_columns": [] + }, + { + "table": "user_birth_profiles", + "original_count": 1, + "migrated_count": 1, + "original_sha256": "2a74d4b2edd3a730a46f17fb6ab3926575c42662c1d968643b0d54586ab68b13", + "migrated_sha256": "2a74d4b2edd3a730a46f17fb6ab3926575c42662c1d968643b0d54586ab68b13", + "equal": true, + "excluded_columns": [] + }, + { + "table": "sector_phase_overrides", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + }, + { + "table": "screener_strategies", + "original_count": 36, + "migrated_count": 36, + "original_sha256": "872846dcb746446bda37723e63db737a2a0cf0540eb6a1da264012248887f4c5", + "migrated_sha256": "872846dcb746446bda37723e63db737a2a0cf0540eb6a1da264012248887f4c5", + "equal": true, + "excluded_columns": [ + "updated_at" + ] + }, + { + "table": "screener_runs", + "original_count": 250, + "migrated_count": 250, + "original_sha256": "9f58ff2f85e5b85878153f7694161620d77cb9b0f351754f2974a8a0cc8ad8fb", + "migrated_sha256": "9f58ff2f85e5b85878153f7694161620d77cb9b0f351754f2974a8a0cc8ad8fb", + "equal": true, + "excluded_columns": [] + }, + { + "table": "strategy_tracks", + "original_count": 16, + "migrated_count": 16, + "original_sha256": "f0639b1386b69c92fd815f929864b3b2457a6bf4ca515bee2dca87e9ea29e8c4", + "migrated_sha256": "f0639b1386b69c92fd815f929864b3b2457a6bf4ca515bee2dca87e9ea29e8c4", + "equal": true, + "excluded_columns": [] + }, + { + "table": "auction_factors", + "original_count": 511914, + "migrated_count": 511914, + "original_sha256": "3d0470787adaf7c4cf5f15f5ad9fa1d67c8fcd4807285ac264eeacdcf5054cd1", + "migrated_sha256": "3d0470787adaf7c4cf5f15f5ad9fa1d67c8fcd4807285ac264eeacdcf5054cd1", + "equal": true, + "excluded_columns": [] + }, + { + "table": "popularity_factors", + "original_count": 232, + "migrated_count": 232, + "original_sha256": "3f4c61a13ceaa1ed9ecb28f86241a8a478a6757d6a44b46f432f73c0226bba7f", + "migrated_sha256": "3f4c61a13ceaa1ed9ecb28f86241a8a478a6757d6a44b46f432f73c0226bba7f", + "equal": true, + "excluded_columns": [] + }, + { + "table": "seat_aliases", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + }, + { + "table": "reason_overrides", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + }, + { + "table": "llm_usage", + "original_count": 72, + "migrated_count": 72, + "original_sha256": "03a070316a125cef904bbfb2bb06b06e792242d5713142e70354402c741393c3", + "migrated_sha256": "03a070316a125cef904bbfb2bb06b06e792242d5713142e70354402c741393c3", + "equal": true, + "excluded_columns": [] + }, + { + "table": "wencai_saved_queries", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true, + "excluded_columns": [] + } + ] +} diff --git a/docs/migration/evidence/slice-10/frontend-migrated-auction-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-migrated-auction-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..e35ebf724c0c16aae6bb8167f197271794cc1302 GIT binary patch literal 24303 zcmeHu2UuH2_OEaOH%t_&sR_hj8$*zV1g4l2z_E=WM2HR!A{M5JE;_`GBHB6_kVH$s zkw5}rB4iK(V~W5S0RdTvCYmXx_h#Bt5<9z_-Tij=z5o8#-}e|vb9CpNDd%_RPB~}p zUiaP*;JvG+S4;syLI8k}-~-s}1AGn;K6F_4@F8L0!@?pW!bgt1ckI~FqsJspik)~* zT0%xfT0%-nR^hagtelFxl+*|3KTuIsJA3ZzDJ2apjWb%O&zwE;OCdrcA|l6*91}lw zO#F4;==+FD(6`B^>eHgH91~2}uz6)35w)-A^s;P}a6` z8M$yoCEy3Ck90os|A|%)fw~6j2IbY(Eg)}~35t{x5(L1(UjTX=ekoG;u!w*O1q$jD z5`cB!@Sy{O$^_vTCh&dBUuya4zSM{CA4(5@dO_R8uLJCVYe87~v)bXkUcd=~0tbKx zfdC`GN`dHww*~LheFXLq*hgR=fqew_5!gpyAAx-Y_7T`e;GIL@piGHp3|7-dKClA} zc;-sCQ3)Sw{xyDfL1q^5Y+%#h``7qHj6T9&=ZRzHukoD^levyb^BJnY#vklw{I|g| z@uSnM5HR>CHXruspZ+`jA_b^tN3lQ-5Rih8>levK?wP8w+aF(|+)exT(3k&0n}jI% zhLF<;_j_6cQIY0(fQ*AwodF!aJ%q)**ZVP!PO~nXT=*J4g!J=fTAZdbX#a_ z>3d@`Ei!EAi;h7rF5Ub^sO$9*o!aZJdMzarwuyOd7g|Hp75kl-vGLo1a6Nah;>O19 zr+~vzKG`>Vv|UKrjrMhos&+ZAV+pQQ`Sc$^>xqi~jxqPT{zfr=_v!?5`jF@+ zvfumz+5c#=km7GW?cSw7_c)s@Cc`bH2tDI7Mt3A@g~;9{Cioe}c#v^qkKDmUe&iM(BXQ|4ps~)Oz-4^tE@j3!HwBw zra98@Vm0juBqyv#7u0pF3$k8$wqL2IMNmw8bS-TU0P#s(eSVfa=E(N1A6IC(2bWqI zn!hZ?Po6nH=c)ZnOVULXxp?Y{dTlWWT@jyu$Eh%Wss2G_?%Ag=%We4ir?OoaG9L9f zPk6V9iI_}jXYxFT$rU>lM5UbijuzPsqp~bBQ`(5_&>mpRYAmvC-Q9G07PZn}XMS8R z{iS-{Kt00w1qWypQ<$yN^01=#`u0`$9-!HE*WKWtG=n-{hJ0k}$sG&NtL4hz%Z*#1 z^A3A}sA64}>-F+RO!zo9v0j=v%MJdVA7jGU>2z7@XKH3zkMR3XS5BbD$SCBwp57() z!c@XX{nCNiO>+TH{hfGYxCmh>!W`T~O9BBNBS%YGvDsTU?99isGD&mI%vX)*JD_GJ ztKWd5YhWV99DnS-G;2If%pGU2!_&sBAIW6iXYTyW)3zrU5R2+wuqpsIn>M~hC0dPKZ5Q9JMIAI32DV~>!baJX z@|rPxYq#X4xw$!a#-QSuopWdyniC)%rBya^Zg`l;NFul&XPyJAJIDtI${Asv5??=ug{*w(^4tcgsC%UoBj7 z2Kr;&Nv|n*+z_X8+3j05n|0UJ(aL%PU; zDZw?fF+)gjWz9TgCqa#D`ICQlnh<(3yojbhcH30XnJ;<|0&xGYOmc@pa>19nUsEME zexvVO1Axv>bG5sj0VNy7(H%e3JGL-Iwyw0*jL`Q0rm>wrK!cAns3y+@+>|>%xMAoCU7;zjUxH`1 zHyKm(Jg=V`HizQ>dZ0n)28*ou?*Ui=g9~1JfL4c$>Ff8)_5ey+txd02_5d|*VcOuC zC*$s^FSTqV&?-V;bbS`udL`O+lBBU@=*p6g$D-n;zc(eD{@(#+_zbQkPpWlHEVQev^vJvO-vy znLNYcaHKCfx`zp7A96BT!`mu#MjQoB@b03n^X8!UY;a+cY7)kXwC3Vj0ezqSHL`7b z{ff`ipe)ta7QX@22-@YLp!xqtq8c|(?lS-n9>GE+d(3sEE<2m0S!@o>_dg1%O zH`g6>0B@(Y2Y1P7c(pIt7!KNg-~r%#@b@JD(`iQ*FQFn!R~^s3p&u0il&g6Bn)3}` zmj_`Ro$^XV8aXB{h{;;8gb7%7aaSR7t|nX!+~R9TmG#|Bmg-Vv?*W+p*-`T5M%4qO zjD({Lxy&xdno(arFQ9!=yr1t7#*$6The=hjcNZ7uHZw7&hrFA;Zo zeQs^n(NU9U8*0bj1N024H`vn%VTn3Kg<7S6X>5IK=P~N}gpFWL!^=#q3 zm3e8cQLt($YCy47s>mUaPgc2lGfz7%rB}&l>bg_jstXiq#dd9%Moq80E-F^8oJiF< z&|ZRqps};s=BiqY<}VzGfrNaRa)?@UiI_ZNDi-w2$2CCgScx23l^~d0D55Y+iFQR= z-SU^O{R^A@@b~00S-h0_jLEppgi`BN1F$&wl5KXRQu%=zp(OVC30wQeWCof$Ne_F0 zgc2F#_?{#~1MvG}At%!3q}8)TVtE5Kd@{cxuOKN1$BS*DIEXMjWgOC+X^wU*lV&ov z&&n7kF$ts@_|?``)ZQ)$#3%J#oPB+c#dQ;dQLNw=cM)h+MjyWOYT;$W2#JOvD zL@enE$3vMsRgd(@EMxml7hBdo^xd6~aQ@VP?n0Kek^&;p_&RxoH!wmynvXo&83`17 z?61zB(8>qm`kBtqn+X}p{cw=6X{uSct1WLGbgO~ph<0-h^=Hbk>oT2zvE@MX_wjMr z=dul|3?z+rUo)bne4NT})$?v+$?Wh|h|8?;>qR3M0;2e*?oHc3J%~nP5ySx&bTZE^<#q+3f@Gu0NaYL! z$U%J&=td~t5?a=EhFX9llOrpqNwR02X@nTJ+Ms+n9)Yjm703Gc~cwFrrDgR~nbDwd;kvTcBlydAI06w4YN$z5E1ZyhL zC47z;w)cX%C9d(~I*?M#n6z@&3olQY9I&=2e~e8aFY5NKB9%RAJgY6u9D0aY%;So{ zoKsy9L@nKuPFcus7R3r#3day0pUVT4QoDF!!i24?42+H+ccge|f$mIX$%M^0W(MaG z$U~h5Pn;Fhj32Md!N>*VfeToSX7KZy3mzEd$eimRi={zB8Aaya@$|59H;LfNv&6Ft zH_4Frc>Hj#Swnb+OoPWax>@z&w_3e9an#}jD;BdO_(>~dW?`~+-X^3o3D4>v^e+%9 z)I9Dp%t1*s3ZcuF+`v1+#Bl$*jg3 zm!mQxr=q#;95<&30#QqSIpW5)d|#qTFNJZB9!vC0a_`Gz2HMbpueL!(W%Y*ak?>t3 zQGb4LUP8Jb$VsxFkcUc0A5n!2r<~umksMtsm8SMLA%+!}_+(Y>o^9)K1~&i7&@g2? zQOeRsB!#$xeeBhNt~^5njuNJbWHNymgvS$4nBYzn{BgJxeKWp#(P>7_j_Z+M-zqq0 z_U#{~{x_~w8aDB3OtzyB{egHy!E-TIUe zb-8co)u#u}{3|NFZFx+~n`!Te?6=y_{*|2n(=rDPEbzHrkv7L7expa#0Y|=nQ_1vB z|N2!r!)t8-amrLhA!6z@PeVLJ&}*sRO%2RpE}Sd(Nek|eQruNuwKu+S#UEBY&x(X>(&AUQFF(aaxP?bt!Z|N9KF}NT%>_1wTB02H`p<8 zJy;bKqrNo&0g~O+)gKL2R@mu}8aU84qLsch!;>U;2U+Lt`|1G?!LwQo)3@q)=($lgoO~olL3@b95oIX` zU|2HQ<$j>{g?}Lviw<14o0Ix4iaUE zR8`g0HK_DmlxgjBS;+9S;@6FgCmKT7{lqgp40yIzCS4D3Hz)qHjQ-O-Q72cM z8R18fV*z7iiXZsWQrGo6G-rO+X{FgKNtye-*_l^^bdEO}Gwy!9 z(2fSxi1k!1&k__V)9GKn=M`Bv9?LP6RVg1n?RlM9F*(c+hr+gq2eA5y} z842!N6?iQ(8TgNjt{9g4&t@Fe&uxFyGk&ZJmSCF&(eBR-m!U*X72@Kuk!l_FV{1h= z;$tW5oxF<*Tb*=2>vkFRUV0Gm_59<_tCzGmRQ6w8pJ-HA8$5ft@#L1zgZ!6(KQISX zaroi5+|Lz%<%&d>Ket@`HWGU#eu$WRXCkb;ynNtQ9|u;f8_2s}_?Oj)J${wP*N09L z2_bpfF=qO+Prgb?{H-P-T>X>2u`?UBzsa9U{5P1Jus|-g)l$#z+N*baPIni+-vDrz zH~oKzEmF-a(mz}gX(dG3ZpdlBE?tNeT1MqsUlMM;R1~4~Nkk8cn{tb0K~WON@1bnQE&24`nzKm-3M@;N9M_eqWtb*UgkFL3%kbE?re;0Ks#S^&>?{?+$;~bnqD} z>MX&dOBETIZJ7H0E6o|HnFRl5+nvYg3YyV4X6i+ zTQykBOz0P|iR}T~CC8IksEcUXA}AZ4-kWGV;%%bMF>Cd!HTG>REjjt*tD9hbAJO<)GCx+Lo^_%SW;iwgp72mkrF%;*J+r((|%NI!eVU z=+i&V9oJ~~+wejwNv4!YBAIl!Q%hw-M}Qr9fZ$$A*SGg;FsJl8yOxG!LT^&XdMl7v z6+7I^k+_{P>3b-H!MMrZ*^5Z*qwz*if+%M+BY^#pOF=7$5m|^WV9I!>%-2xwBpRwfm~Py?=GfM}{dvad9ahkCYpY zNqYQprv&lO4#}CGQ{SavW7vnrdiab9jVnlzy?c#eYvr4qgWEJv^s9ImAe(FT@H&{ z&6@TPv}gMBrD=Mzd?JCUJa$PWo`Nb^5qNLfQYQtg6--USP6r|MBH$$S+uxSl|0ouM zKXhoHX8|7~(A?&oDLfUQdk?hWaL#iNz?P1FDsbExvS{CNX16}q-f8^fvi)TY;hovQ z9y~sPs`-ZI65eVv^W8;qjmmCS(;gsT4}iXhnc4#^@*DR6%bvM=fLMvrW}_0&9-w~@ z(Dwr^@u|xqE>U#bL>$4EoUB1&h)~bWpg#Q2(ym-uV`@`Lo?O}X^|?e&bJ@Y9@Ba~u zZ_=%JdjOo~9^jVSZg|2CSoG%Y`3h?iT<#aj zWX+z2p~axn^3NvDSvBZ+n`56N#+Eo5HS zeCk#taQ8mG&k`1V!@{D>Xk=2O?)=Yo(?$)8$@(i&VeN|!?($y>zHTJaXp7!{?tRq$ z6TKxyFGS@q3jZ?8v@-m$b?;>f*~=2ACMP#9w2}MEkNRh(4K{Gg!$xNj)`ZKcx0MZn z$3H-liG_{UDu3fu1s{8t4%)!o^b49VIHdKpf(MAB$hk7p2aR-xd{m@3 z*g#_}5#*}<@=h6g{nP$pvO8h92%2Wb0t2n4Ng2(@XGj-n$2TLhFb+|Prti;~bzo9X zJL*NRg--bOJb`8@T1d@*4N^S6`x@(6Zv(R8mx_a|I>d`O5Z)MO!f$$&R}leK9D~-p zpz>>3nAOhtaH@OX@Ng1JHSiqiFt#+{OPQPhWH^4e?M#*v%(Uj^nHyQ=-gg%g9v5>x zQs&PQl?g;u*9Erc=-p7omrDi-T8Sw5?L@SiwM`mB-}hMWke zoAO&BISR_Sok0jIEL|^P&GClTJ(KKbqd2czVEWg-mbdGW(C|?gPcj!yBc{^Dsa5Zl zHv1PTUdyn5I`$aZCObfrmP zO5*E32y~0by=loCa%e=<&-usXtevFa$gTgc3n;P*_3p{N5wLb>L|+;?3$E4XnoSCh z2gQH!j@uUMLubtP08_@%E1lWGa&03uEWxtsN8Nw&3<3Zj^~uJIer;Dn?fG8ctcNrEhPD81@%to z%Q_^dOSNul$?2eB$GjpKvuZ-ZZ&+R<30ycI$(8Pj-brLK z);+0W7@w_dxYWmt;*w`O{43q5V-6C=uidU>UjiD5z+ZY~@@6}9O6B~VC@;9MN)#`O zIQIe$*@Qy!jHFX9pKo)IZ~rNhl0gDOOk@&PqT~V_?5nlgsv;nvhKg3it{ate4>++o zPueVf6z(xFW8{zfGSgQHle`%1Y_;tX%MG5;;7EJS@YX1&oD`9wmTDu~-wN~yFoSKa zdQXN+#w-Zj^hJhk3grBjSJ|#>I~_eOTHFz|>%23z1Yy=HT~Id(BNTER!a`N?y~#(1 z@wsQqvM#F58Y4g##=EOHLU+0sicpGd$E2Hm3?N;p^meP3?pB)R?MB-gClDP0oyHPX zQf@V>S0^>S^vC+@Xn{@G8bMr1J3L*_Liqkze9XAg;e3*GF9JA67{&* zRg9r$TdU)9JK{@;Ds2&afWeMuXB%Cnt6^jxOPzDQaYVHi+SmrD(RBfLwp^ylgaY<2 z$jh$Gg9sp3a0pOe@R}Agu|u6?Vgv`4V0(aLRQH6m_Cvf&@%XN2pKJHg1Ou`2Pi>ND z#tz+NmXz-*yA{ISflSwf%`S_Hq_({Jf}W-7>ksS1k#X@&N`0FF4l)Tg<4>0T32SPo zVm$9kr`jZF@rxmc%-WuOj4nloYFiVVL@87k zL=0*+jGQZtZE~SH6EP?(x}mMob97}vUB?3KBb|l_kcMSJ`j$~-&vKY0eP9k@Vp&2w zN6c2?jQVQS!cAI#{(8Ox7HF=SvuWM+J^`s+K8mf*GDEn7tiGD~i3xYg;(?zV2Y zQ$lb$*|r8KF+|R-Et*+q*wqx3W^mbPIlmr=wFX?KvT%0^i^PU_PzmR<33+Zidw|Q| z1*R(xL~JuIjt?8dK#~H}$o#?#0c>_SxPaz!Dwcs^bP~=`&*6u7KR3?#Wb`nhb1%It z{nf4z$s^jn)h(9T#I}SkKW$4-U@)punOjLGXmG^kEP<0lLpCTpqQx#IK$=2WDKCDO z5HvG`*eD~R0*R27MLInTRLhdS3LYaoX=5`I>-*~Aaf~pm7lN3^UNC=RD&yEBlE8#6 zbZ6S2jlE&o+@i^*{CMu&>WsN-VlZ2>z#CpjWsp^#xLaLTT1Ch^+gYPO%goTZf?j3v zUR4iJ=>C~&d2yM3)}`8lo&;7*QJz(kNj#N62g4Aq%{|J;W!RULSNp8d9H$oekAY1; z=;Jv!+&JKazn#wCZEHVyJL+1-xb(;xSQOTGpO^|ZkPS6Fuf>qEyO)_7TW5JWg6Ljy zC6^^W#=D17wVk*Ves!V#RPB#G=V~3Q!^U*O!}xib2;-*Vo|Myip~^~rr%+;^i>7iUna$O%z zrx#HUqpBd*3oCHl@W`pI+&MUraG6ml^Qoj+sBz)Be(DvcK%Vt=4-b-EJf3398|Yp< zX*b|)zi=&bj%(=z)N4zX^o~TT@sEQpaPr~a?gmpivkswAQhX~enk4~)ARN6K2?(22 zi|TymasRL>DtQ4qMXs5`lc`ER$A%nBjlM~^`tm`GX&d|&4V7TM@WMpGjB9L8qk(IS zJVzr-(}s#{OFae@lQJc}`*<<#*+IPP>VaB!+pTtbyS;?vM5AV>rScLoqRFm%fC1rW znlc};+q1qs^0!_69bZfohm+R7$Yvu8Tl|^O`EhY$8-Ge}hlg5ot)ksdMRstF;#9~_ z10^=@HvHI~hi=yw?e_rrpT|_Mb9U2$_yuILG7717YR6SNr)pppLpMg;HD=018NOJ& zQSD6a_&qmIg;_Tjm4)&3!SKJD@!nX6v(i_?n5Ns|g(EFt)lMYG*yD`Xe%%AJl|Od( zEzXe=G^SQDNpI!M87HL!R$i7?_XS-mEq}?kkaFNo&C0!%%l4PooS1BK4Szh9;p)>= znRC9J!tK?0E2lTA>(tIkZd~`~YBmn01R2=**ig!TmkWC4%giMyB+d1aos!t4{t~1US^s@AdEK&g`rGU%uPV2Qe@X#~;ry zbwU6Qv{~5v>rtHIhTm^(wS&M@5mXV$8|7fjeX5Y&h|;LG${8-Pvf(u{Qhe4w_-Zst zurcS0(ZmFTe4nGM*Q%vGxftt+e6f)Du;V{I?Cs__IsT3N=GEtq-X-H^Xz*XXB@&=H zqcp3gw+F!Tc4XxtuOsW19$)XXXfP;#`I;WJyabrl{p2skv_swck|U)U-?hSC2BsqK zmjjCUY{N5Oxs0#}%VqEkDQNx^SVcU=jYF)GeYmt_JHDdvWI~QW<|g?I4m8Uf^Q@d1 zU^91dfg3S9MC}R(7U&m2VXPhNnx^T?uqAa9^Aao(%(M}xGIrecw!lnRNP3;88d3qj z!S5^w->x5f>?(?PA|3X~v_ynl10yUgRu z3NpmG9kgWZtJkp>l_9m#Jsi@c#LLVN&%9V7cj*(cyy?F{5db(?8BL2`or~>>-2+t4 zmH*ncrho5R?NQ9lX^X{0u`7ZXX<9hDQQ!RWbw{!LCttoxhMaN5nJ!Jcxg-L@A5YBe z@E8*}nuiZelCCF#6(^2{wFhmbJP)=(V!_uS!F^%t%r$ZkH6@y8jy2mBkUs9;y%zBg&3YX(UH^M~Tiq%%-eA;%Z+KNvwria{BUOA?3(E4(n;UeO3ao>oTh!dYplcM-15T8$)!*cT@+tG z^3Lz=7&)F!>)x+?A9k0tCnK4;#7Yl}0>K8T*9!I@NL|Q>H%M!^mDYQ&Afnymq|cV- zB31DT5H5-j2~#B_8MqCE1*^YRKI2^NH;ka7lXl2V8Bf0r_hhAr_H?)P^yS8#&sL?G zEb9&#flYKuE0RJ_Z)`i0`{-}BP71mK@6K5Z0PruTi@zH4{^H`@G1SWNN$CF0oWwe1 zT*70jcT)xm5^sDU`jq|Xe4xdz@s~GmevQm+v}Wk@#ea<@WMyS!NQ-Gy^L682V-w++ z7~!+qH#}3TI}Cn}KmFl{TiE?V{&z8v(9N>B+c7ZPfzW0*a3Q8C1YzM1{-V?E|J_Gm hAAx-Y_7T`eU>|{f1ojcwM_?a;eFXkn2#D?V{2$w2NNfNA literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-1920x1080.png b/docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7e22fc1f4ccbf354cc4d4e9d32150c26592422 GIT binary patch literal 136137 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ØH_poJ(GqM>j05n@YHI&z?th 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⇥PQ6}R)awqFd0aVH`iULJc1lq{Wl(RVi#6&k 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 literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-390x844.png b/docs/migration/evidence/slice-10/frontend-migrated-dark-sentiment-390x844.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c8a840e32563838bee84dd7259c6f2d3052afb GIT binary patch literal 35544 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 BD=h#3 literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-heaven-heart-breath-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-migrated-heaven-heart-breath-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8edb411f2b269fed09906ce3b195fb7009d549 GIT binary patch literal 71914 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 *1Igs9`h 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 H`n&%EGLJBn literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-390x844.png b/docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-390x844.png new file mode 100644 index 0000000000000000000000000000000000000000..81581d5d7417ecd3bb0d30127197c24ed837ff0f GIT binary patch literal 31554 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
    x;U~@Svqrh~Hd=0azhdygqLaoPiP6Fut@JUeY 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 literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-migrated-heaven-trend-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..45fdc51cfcca2847d9a0d498504b829d9c0fcf0b GIT binary patch literal 72587 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 literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-migrated-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-migrated-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..438b6ac72259b578e702f1e4216afd0460ffe5ee GIT binary patch literal 129058 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%0DF%A*po5l518k45&g5*%OlD2w=} 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 z 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 QC^P@3gXPAAsF#?EnA( literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-auction-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-auction-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b7eadb59d513ffc5d642abe3a501486bf5f31c GIT binary patch literal 142536 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≦%|3&RmwZSh#Chq|{W? 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 AbN~PV literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-heaven-fortune-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-heaven-fortune-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..af8b182d36e1c10043a257e77e07513360e54e6f GIT binary patch literal 99067 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 gq1X%wce7 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 J)81bP{y!Z_`hfrd literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-heaven-heart-intro-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-heaven-heart-intro-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..16a753d5e8a143fc14c9485708de9ceec4791874 GIT binary patch literal 79183 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 NQt{u=Yj%F_{C_F^hNb`j literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-heaven-trend-390x844.png b/docs/migration/evidence/slice-10/frontend-original-heaven-trend-390x844.png new file mode 100644 index 0000000000000000000000000000000000000000..c2df7bcc996fa223b248bcb5c6c5125db64067d1 GIT binary patch literal 31351 zcmd?Q1yq$=*C@Pcq-0B%beD7^NVjy0bT>#NAuZkADQvn!y1N_cMncNsf6()KJnwtX z{lEKv{pD@xq zp`@Xuxt|0I0RaIC5eWkc34;b78=vNX`{%A51V)6Bg$jg$A_GB#p-&CXeq6Gs$pkVKR|AiP77#ijgDT^X3hOquRW_0!`9IG$c-69AD=l~6d z0fU}`=4wQ>j6_9YMTPzk{1CRBakvAW-+`8FldbC=nLf-@c<@PS);(!^|EM^;sx6H# zCIUGu@CKW*E2OnNYr|P0K6bsimPb>Npjk=$)I;i8;LJHgnX4dU(re69*EDWqzl?a> z=*H&wxse+-vptc8%B{BT!}twHw{#|DedMA-KE$>UlP16`{>Xd@H;BNgL zh^czelFHbY(HEG!u2DSb3}NHxm3C04!hsK+;m; z_MSrJAH>pmCagXLK(ze;F!c*v4oGV|=QVbF-4b%At}6SyJUJh&p6oRa2gGf~G6n6; zBWCMo3vEXPM#q8kDQRlBOO)EHi|((Qm(L?$moGt^7qpx$+#i3#{kN%$YgeY~W~)l1 zwiZ3LxcHar@Ds%+re~uNhOr{8Rx(^UpdAUJL=!W zwBYx!s??UreSv>pd8@&?|Acz^YHj<+8vMC}ZF;R;O(x{EXR{yXKc%&iN}#9khG`5C zbxArm_-SVn>{NTacM*jwa2G#m!P=nv+%R08F~?wh#N{r9Ac(Co#MoL3wz2)ioga(& z`uxXgT7pjk>R@A!60y$N?JEWaA}d@cU&JhYndt#0&h2{5?oSiA$_RlcTso&F;C zB)*P4o*}teEJRYnwwYo3SiqVG^E&TpiTO`yLfh~fv;O`=1R;ivCbLA<^PfGH#5sAR zHc^gkQjcr<4`GSZE$=`sFAnFgtD2S{npzfg6%|oD5tMeZkzxoR=x#6pae<(lHu)L@ zsc2Uo{}Sm!Kz`S7?xojKv9*$Othdy0DDR@Mj%wj%Cc@1r!?`JwVVQFmp#As`H1uzx zY{B(szfr58S40)<_O2EdETO~Fsjdz+m$AHRtt~=KjkX$q(Aq7m{hg#;y=YVNz`nc# zbzVL!`legpnXz*RvQ9{{ehp05SLs$_eik~+nd*A3^2w2xs6TvQe|hYVU8? zx|U!G!|JO=AAgequZMwkX1K;~qSUTh;h@eBDt_CJf2`o|L@Ww)HkTW=4Vl>qxQygs5`|9bH0RKtqD9pGC1dI9kG-!I zejHNg&0(0KOPwz8YiZsoZ!-}%{wW)OB2$a&BDVBI_)0Z=drX@;-AjJlMYj7@S7VDS z=TmCtU?l^v9FbV5QDkg<9`CX+<5>8GQeK1A>puk`pYH=-jMC97^p)&|pa%U;@g8Lv zdadsg9#oAGvM==&B+JWhZ`<(w4c;AcTF7cfRF~=z3GN1v!{NV<+a$-Dyr z!u?1&-dVk5`wj&B)vd8IybR6dDPyv;6lS7ohjNhKt_ym532^*Y5PXQ&0%^Dpq{RqRR%*m;gE({LYDI+p8CTBqde=4}b6KYWLhlj_w{91Q(! zXt&w3+;VY`4?3u^g?oosOtb2y>oBLNr`24rBoA|zFLg)l4rF$`6S%xYZJhJ=b>kI* z-^A30DuFOxg&S3IzSD76A02hTcDA3OTDRaRX-~U`so_hvG?6CGhjKN1Pj#yy-K3pQ zG_`0eOea{mQ#ui&dxhD;@<|##VjnnedN%Oo9i>`6`K(pSgdByv2>zvdSxs9ZvsH@^-_p4)>JYGD)=n$-I7JY< zIr;GV_RrG9xhr~~@YLcOY77*3%Y{c;jkdjNtP}Ekw#&)YMD@`BWi$7|fvoUN+o*f} zv|Ny5ROSrm4&=Jwl4>CDb9$i17IMsi**bh`osv_Sz?)=ASymQ5VrCV|W#v)FB?wj7 zfL&2LZlK@bjc_Q-W^ft*WQ;FOi!9O=-cMq+@>OUgTA?+?4gZCl0-Ge2+Wbe(_Nx_5 zYdOMc_HotFz$VZK6zx28xtn*c0do9tH8r2g5*;3$>rz5wf_DyteS(A80tv6zO_~tu z)SjG-_I@dH?2kTGcq%9naH>uTPfA3ELxCBcFrxxJuGA+-gprf%!xrLXZ!Vp*EHPon8B!@(gcTRKYZGHYZV1mHh3LZ^ zcA~4CqfCmG6s(?%>3P`4ir0qh^CrxJ>o+aC807_93%aWEq=l9uDHmAvX~N!n1iPg9 zrBZs({;hoDt*0!upXy(8QVw3v+=0@cWPUpP+6SR;eYggLeFu_txiHWv^wPVXdT<9) zARcyKFPnm-=HpC#NRk7gyKgO+78eyJ6mXM!@1a-{YC9Upq-hC3&*JTRFem8=6IL3i zd}5W*CPE_@?LcR3s4X|6s2#Dx<9^Zm6~y&IKpXP-E!~=6*a1ta4hr5U!d6N-*^idH zF)8VlmD%+qw(x$}k8I@q7A(|<%Jk#5ah@cLik>ch2Mmly$Q@{!5->Cz@6utCGLVkq zOjFL1T&!NxE_>We^heTN;gjt!B9fK{Z#x`7W@eT)Uj6&J8lDle`qBEhN7K^~kA0o~ zUEi_kJ__sTdVUAH5qsplSMLdOdc|>v1w(Vv<5Y4ItW=;oOSzwf*%?A3#@)uB4_zGuxYb+#XR3dD?x$@JlQ&Q6+ zGVJz&EhZzmiMJDF`xPL)(Cshr9y?a$pVPT6@coTFj=heG?m#nS-*w(S$6otwBUvCN zeX3qOa=MU0sg^*A3?y)fw3M=BvSM=8*@85qm07O#DNYAfF=-yN@E%7pqin}I;_at2 zi@i0#;+3J~Ihvs|w)m07S`^^dn%y{AkXA9xe<_6jyFM~q&?orx}6 zyOoAb#>w^0rS!Mb;=|s585E+JM~>frW)D21^54%C@?&@_)qVG$Q~d-mX@n2EY;FG9 z4%M%xa;2{G%v5Ov4I@Z?uyDFHzsxboC1p0Ym;!l8sLr+-zPH)t6;&Zppm?8JUtLc6 zDB$=AV+*`&@H{+Ll!`C#n{#1b;-%}GlBw2sw`E?tQRoydAa6$Ub%@aA=@Rq<0_JdF zqvym9*DuyQR8`90TQ!y}N#5R|(L#P0;KJ}FZSvU6usP#63~sGzeo2BSC+c-)aqH;S z$ZXx<<||%eMJd}xTm1~FJrh=T4XsfkOTo-fu5FTE;=^U6deiAw*O$l87Z4Ba)7%9` z&`X0why+dyBi6f{mZeaK0;)Az*P7Gktc_HX3XnP&y(mnmJ3Mfzt_fO6ViO4<>-ezB zG%HJr>=Rwf*H%#E^RtXwOhg_#ZcaOd5TXQq!mh?78nSoaNX|Iu2 zy^#E2;XKvz_|o@wcQF{l-x+?!ofkpG(5*! zyUNWTqY!!`gZZS{Pw}O!#YLtxb%9@Wk26CXcB2M%6f9e-&(sOe@%V>c_a^5YH-?vi zu9}ygV%d+8#tt`*M4brK;a)MLa)>|F44kq>Q_HEs5uN1ST^Cf(PC;SEAq$=L=75S~=f2j}DFx?ttC%f5Erw{9 zkO1UrtVhSO-w0sX>cY*t2se}rdd>CY9^K5ZzBQ?}h{S|8XtK}m(c`TIhh_Xm)F~0N@H*r4( z_YS+;*$j0TmL)CTVv<-B7IVTbgFW+fas}lS#HTFUr=g+~EY`nKoiXQOx&h(YVs%Tn z17(fVH!O}rEgxD9z|2FqG6gU*j4%0wm&d^K-*?V7xxab_lBx%bp*USPMhMEQKRUFh z;9|lav8kfkNTC(3tNrA`LG`G2WtJf#_jPA@&~pUq@N=DvVUK}pg*(vk>k#@^+>pwT z3D>cUPjkJgC>hL}$Qa4c!lvxAUKkPK6to+$(ep4+K3btL_9&cfY9ew?DU_l-q$ong|k zwJSkbIM}d5dYrxin>yw02&Wy{_RJ<45Y6*WzDgWvZ<+@|_bsE4~gKKYoq!F-!2N%RBy*STR=kLbXet;iU!0Vg9ev^23VQk)|MAX_Hn^t%GlU8Ji;# zK)X(rZdfroMC&?%zP)Q-O45!uCX#T*o+mKbi@kIe&cJ}!rjPpSy1YRIEjveU_~ohj zQbwn5mNm^x{~%cf1E3#B>j~e}5B%R~>TAnNb-&j$APWuK?W>gg`~@SFM6bM(d2T+~531jCzTlfzFgv2JcUuq6SfoMR#{D-~ zKgLXhIAOWe1PMkC8TK6s`OrLkSWKVsC8$It_zGwkv4}>xXgIi13f-)EM>-!fE*Q4n ze#uqnjcsW}(ttD{x*|lf4}QGp$|k9gmNKFWMpj#^cdMeaM8N#X23MtAKums ziBWZHghfQj=ZNMH9 z89=45oN*3wS#}i#NwtZ-y(z6lHPl*}t$`ZOYmZLS$a`V1L5_{xh=X%c8Z}PP1VY`Z zg0FXc)#Z}1KoVocF z(yPpp6(E&7X^uSzBs>EvJ~=xdo#Hltet;Ga_5-vPpfR(?$>4ry zGNrWVKl?$iPznKH1GvIA1;YkoaWV-5tfQ3&vg$o^ZEeM;`Xi z`7}=$*cx_kbAAYD59UTFbLQh7K(vKKe@ZdP3~aB;aZx$RNhQjK3OU~NOtZE`(_iW_ zRg&E|Po_vGreoN-^it_Up95q;cSOBh%1O63B+|PID+&OmN`^^Oc4 zO%`Fm$9p9d>W2yq>`EaXR1b7%02V-TFrlK@#pVwUg$T?Gz#~D0ra>SrH{h8yC(-%3 zN6B5Pry{Ad1P^k5uu+BVL-tLJ)*w%9IHI!J#x|-gH(dunHp^cK7<`XW_oMqw4!lD6 zo#oA(w`WJX#%m0(S^s_wmd&soG{9gn?wp=(dIIrYo{kLg3fwtII6_|RHMBccFW@{# zFXVyz#y=j}l5p)*G#&}NVWSc2SnQ;+awR2w;glQc$m;jA^@!~pH12+Bw81G*6>U!v z%q#IE;#CdtrcurmBaG48YWESl(~)YAhDUCJK#;PaS7=n)5PjBQ+=M$a{xn3bgzlEk zY}?4j`xf-XZ|-rHcpc8@ip4f&c}ff(rJ3dOxDHgqdx>Y==G}6gC&}wUib4k==@j8_ zKXRii%O48kkZmf#0e*hW#+!Maz0ygQE_E1_0#{G@)-<>pPFcIRCMJSXgQfvnY9*$| z{7f-&#}kl4K45;dto- zE?r^}8!LuqmGCr_#i8W5(BeVR6Qt8R+U?LQT)WbY1E|p16aF4)qlMv(etpH|fe3X^ zt^~Ei_ZDR`5V$RcsjGLDIV|zSC`CkkY}Dd#tEU7GjWbjB#mdF|Si9Vsv&;x=Z&h1t z+3RKeu+dPpK7SUWsI23v?Rmp72j6Zw0SS8=s*0rfKI8jGv3Thb0Tm9k_=^6=dl`nV zJ9Zz+Nl3<-1W{xX%AZIOaN+N=bPsa*5?_UFS;zMaAiXsNdp#tZ&#{V(BCKyGmm^3x z8xsDTy+t0W9bT-%*RC^4|jSO>Pcc2dJ6njxvHH!m-yh6_@ZjNxAVPD5#<{rBn zd4Yq4Y@@PJfh*sW@au~q8B;4?lFO|)?F@Xlhc*{hQuPG%;@S1p_(ruKn|8Lu)wsx6 zZ4i{ANxiseW)ryU*30o~F3^4SPyKz(NVY$02^woyU%MP_u(igg3A)jllP75CVk|?E z&W@2LRq{CR6h{;nRB2FY5S{cyEO`LbXjfgzD<6Oj6U9*5_Etf>3qCfO z|K{j5{N_|s_~z^d*A4!IQ?17S>3o3df}T29d%5CC_L=+;L1F(TzJ-p~JSQdjtd0JoprBk?1>xM32jt)@^-$EMs7^U`i_7&bpG~H7 zbE{2{J>W~TgAhP%?m(Ks}Ofe56!*AShS zvAhBE1emxUzv%JWV{4TYG=%44u(1y79}Ydz&i6EqJ8>7Z$t@@!nt}Kn$b|5b6ZCE% z()Y$oX;8z9-C^kclWq8YGeaLnGv3q9sXGv*Zb*0pXJ!40Sw$noRXhn`UVA)V97y5z z_Mfjen_b%)Lh>GN_^t5Clo)wppow?}^%{m1rDK^fjDEB6)Jj7431>_)WO5N055#?oWqr7xX3AJ}#3KA?1LTB2Gz zBVnDDv?uv>SZ=+eZcmmpq<}7$;UhUJ-KjKAPP@#S#tAm_|zq^v_kz}{IST?QS znIp7MX>Tq_V8u^0?=vyXCcu-9?bRd=*zvfkg#GL%qU75~QK-nrc05%uH#-nOgzf_v zv7cri4x^hY;H)8PE_}+yh8`^vB{ZdY3i|Q!_-te63I3X3>M4}z53$qeDatA=GC6u{ zXAaBFa`MuScg-p6zeCNZnEoPy1!KqUl@g!lT96;YS9*sj>09JfZAILtC9{3{i<7D;gPQ45 z0}o25DAG4yu}51AjFe4S-E2E6Cc{pQVHk&W48ICc*Ka`$=vCL@L`6xfUe)6Uxr!Y- za*ava;S8=~H)?G$nXFJsY2e@~`cKVFH(6vYa0LXf)cadP*=LSjGs*vyE?pS>S(eh5 zP-WO4J0u{;Wt@EeSI4bxOsQ$8O~c#hD)MQVH`Raa`uo77J-C9dB9ymyg?%`#|4^sS zwB{8wbg#PJtp)vdW)BY5Aw2Qxlil-V0ZPFN{X0-~=AiMX1ZL%K?>kW7JL0E(+k<2q z-(GgzflQyq4ee8x;=VotdV5i{DuBOyN9r3pyLIpv3Jb-BC$|0fX<{z)U>p?^b# z<`>An%u=~ml${ekT=)>xz7Z{YZ0ruCNKfh%2GPvS1wuSkAh!Ekhxp!T{6o`kdX@5@ zd}Y9&!bzqU+iw_W*sAy=@XN^oT%P-|Xd@WshhIfTa_`d70YD z9kd#(wIAVPMS${%kp41io3Xkke^eAc2;o_N8Eg66d=}uNhK}%;Cy<@vDu7szRjSO1 zNex8}UD8$|)ySi8MlXN%4l4=GcgZj&04Je50+zXOG84Bq>Ksh3v_ z?jb7}KG=1~7f9QD%Qya+mZ^IQVSv}C2*h)=8Z)s;^&$cjUt(PGxPFjJuh_4v@V<9$ za&TCcIYy1EqjHYvO=ThwlitURY9*AOaughSb`%Hh(N)}{dgQs#3+N6qH~_7{oEim1 zAsSOnP@vcpIi)MPrddDMr>r`RthPTLbB)ftq}31OT-Lpx-&wu$*a~k$wk?;|!5jgY z3vgEBT~hb3ZzB(3DTD(MsgL~dU$14vgnovpJ(dZ4d4U+#jNOg_&iCQzy|Yi-^Ze(~ z|Dk|Yk)B69VcEyI3W&tJoawuLM;xUP+)waI4$N=0xwT)@UogZeWveYAYmCf)eeA%Y zwj?{mkIp3*T$gP`GEPa>U9%zez`lWV&SwXyft;nL<|Mk^*T8+ITN+!GGd;p)&rrA@ zjZT(yl4lI6eX;$M-YDcuG~2k6+ab}}Ke+BhQ&Y>BD4!ygi_az%oFT*bC|-a1IBNBo zZoJQPvKXos@xw4zl2dvTGcYauYUk%OjZ5|&CB#=Qn_0-D-1*4hsgtfILSeGe4PL9P z$-spP?%K_ejVdsWMgp2*W7ElC_a2rwIv&-I*yfJQ zc%k@b~!j=!Cx1W4m?h zDsm5q`$+DSi&gg_9*{P4i}{gM7?t@MP12O`Q0Xn#S5Q-o`K`9U+Xz)b;-T`yzJlFK zKGmMbGK+`y#bDt7^=v3A?JM!4Yg#Px3DCj3hYpS~RuI_(+Clb)@d&BrU+sQW8m{-x z_>@AqF{T~1FXg2&;aYvwLY~uXCBJr9ZBP3#syy^R+rg||fA(h=EyDaU^@9P{@7urx zX-Zj&18g6Dq5Q9QL^9)`dlH0m{)2=Fsl;o>qX$1m(cS!K`+uLrJn?ZG5JDE5>U}~0 zNY>8ko_AeP*SLMvK4W1T{XLNu{~ul{upu=E^l5@~f`cVNu~|Z55)5MjU%``=1>N(P zH1uLZ(fRpv{Z6!x*c-xj&{aa$7>PT-BS9215giZw@>HtC-!I3b#z%0X;j~7ng+{1m zK2ZCS3c~_)`G288?|0-9O)*jqAKx0@{!B~%gDnlEDN0(TzNDLgM>BMVX6rwzN)FiO z91|{^wJuE{9AYo!Oka69vgus_a^j1Dmv z5cU7{$A4ubESupZ|B>Apm3bg4hN&VezattJ#d?TTE4uo@v*6ph)c(t@)X_T-#B+au zEBy|nb30=(qN^)FC>K*=B8F%8(s3kURESd8;+E>-{b44rgWT@xIYDPRRay3^Tkw(HI#* z?Uvldkxl&;YscZgKE=bO#k#Fsj-~VbgfGQlZ*v}L$rT=WRy)S}*C!S1pF}zRfy_Y- zReM|!qr_i;RTNd03f4>^SwvkZ&GC|G?R*SO<((sZ2-i&_YN3`M@B7#JNhv3ccs%I zEBu9w;*z4knDmS3{`u^e%^907p-Tnw%j_H_T^dOar{m#rV{G}pH(nI}9HW}^pDQ$D z77zFD^!|6>l}WeHXY3>{Lrc6-oe{kQElZs%EWeXH0)til>I3)b-fRDd!x};Q?}Dul%yd#Q170_&!yMuML=ht?YvFZK$#V znDmko8P?9>)OK*a75hulY~WI-AX+^Rww{Ohtx=xuB}?$GBmN5@uYYL5JlpUYHKVI& z!^j}L+6H=-*Y2^#eQ*PhQA%ztvVhGTceyz$UhRV0jD zwt{?9`xHSR;b$RN0qLQqH{_4Q^^gTOuB|lq>8wu@a_H%W9nEl3>R9y1=~8@*jESF~ zv~eiic_n5zd-RHc|2b>=CA$H4tNf+{)kj*a6Ri_(fp>~eVjtb2kWpD^Dggm0hHod5=e>EEOQp|1mb2kz!yjYQ!snw#o@>Ig*-E3@-vK>m>)w zhW<^$@l6k>ykB$l)>ct2ODAn)ao)-{8FA5xU1~Px(578*a*f~ zsn~MT6n!w8S*qGsqhvWMEMoFDdC{6!>K7s$R~iKalBoZTzjO>Yn9jl_hmirT0uW!LRfwTR}Xq(kn`f za=Q$jxtO@Nt!zA*poUwI6nwsx>qoVPB^UVdYPn|l`bLY6_p;l8G~fb4Ue>s#i#p7P z7+VrF4>&-;88PEl(jz^!r#IFCF?F%{fq~Mx3#OJO1x}-mVFo1HPDW5`Ol>;q#>`2@ z^PlC##^r#dcBa?hk%4i)bvlpt(6lI>HY|gsY}JrUdhd?V=yq?rW%^v7l>}{wA-GG6PG@iV z^FHp0EJw`8Gjq81HJK=f9bMnh_3-X=^c3~r4Zh>IAT7Pm5If$b=j?6uIx=-yk`~FD zfg80?3}Ej-w)|y}Li*TJ?O4|>H6@cusCepeRs>5-I;3D+k`Y}K-O8&ozAR+d!Cwi2 zTN^Z1JTEboP%HABD&?M^sS-6hHeGW+doVK6utM$XcS6>A3+eAUEi{h4ylZ237Lu?!azE%HVL47{IZrM+^qj77PPIAVJD$%^UY-t#Nk|cFMc|unCTBIYG}|wAT$x$r?+@uU2VUNL4RR+4gSM+!W*`9QpGXFPN^EQ`q`Mq_1 zk!DK~2Jx;z#alkz7RIdDwhx#M9P9m9mF#mU*Jzpu+RDxC%QABpdOx`4zaTycp=M1n zmo@&9!>9B1c%3kz<;$;9cFEqMe}X>qzk%4FwekNACNKw{kcP}|3Jg8LKT;}?E*UV4 z5;T`vK3;e+;n+QoGBc6~c^8J8!Chh!9=-xq>SlILa(bvS_^N5&d^B%ba0W;F^QP|E zVCJ>%u7Zwb8;|n$!qnUn{9@g2x{)#b%>z*10`d4+D)xLN?%1i99xL-}9wmE1LsKK6ejF#4{mzVhh4?Up##Ds!mhOODoX z^rV6T*|Ff}WoZ|ux|O9~@aMUK6sph($;CpkmRt7l1%kyDocC}NYGm`?2h}rQhkxgB_cA&%=GhK1xWTq)a{0Lv9pm`Id!@+_pHLskh4d-F zJ>fuC3}VfC+JR=XM>Yr8O2pxLlUju)Dq^uf>p)7mAOnVOvPX?$3EbECbBP2MCbl+q z{yP(3_;Z&Qk5Q}L{?yxZ`Y(##`IPTKg?AwI(!YP*V9}Zp`|bT^n5bCKCs?sa9mxXc z@EU}YeXv8a{Cu(z*?KB@+HCmlnoQU>a3QGJetT7$#5x5ota0{=+dGGDe;}tj+x|4! zYo~6ObPnJAy0kVV^i>z*gaH}(vt!DccQuJ}PZJ|&z9I%UwFu9t0tf&9kdTOh56dB2 zqWMt;Y}S9DSN0OsipQ&&$AzR!VtJ;6VMf`LO!F?K(5=>f`o^lnF!Ifue-XXkyCfCW5jKMe?EY(hF^0M#AGGZyROLCv&bN&j)}6?ubmVs}y_ry}y?j=|o9h~(SX#}M^6(A5C&@$N zlr`MY$XdwK0{s(bqy?_vzOW({~`C(5IUTzuYtra4>H+CcySyP>S@h;ZTb@ zSX!hko-EoD=w`4w{vOfg&l>yL-@A3EdL*18ozpuEn{N_5TUI>x=yPpoSdM{^(M*fk z18Rn8Qdg^4%4zD>^_yOMaM-)yliZ)4ms-hwR%t;@ z1_ZaTFv_NlR)cU3%>Yf5zQ}*~+nb~EFmB=~vAx2I^!PJVm~+HdtWSsug0JW02XCr< zZ((1AdOTRr!?t@$5;mbH6k_;4HDv3wlpM8_%u_?2SVDwg^deaf*#M1yiyb*WCHP6D z4moPihLJ`cv4k!G+J&YvvN0zXxI_Z5*dUfZkG z9Zku2`2F*q%ch_Wr?q3Q;f(s{U*%K372GB$Q3?Z4QiCRHJ4W&fVNDRj8(+i41c$J( z%?F2O|6W%2*Hr9(Xg;8Hwsfl^PE=7;R7gy8Y+0Ygv_n*ZiGnbA-59Q0B~kN(HhEvN zN)Z_iQ*~JnY))X)@haVrX>$r{wNlR~we6_d5s+TGDnVGP0|QW9*{FxIB}v#d`Yw7Y zoN7)6i>!cEXDQu1Sd|X3IC`n9VNMJ+)@@7U4ul0~R^)MH#W>}SPgnk7jpc$QPAxaq zb%%qKD72BN2|hUvi;OHQG?}PrIXrS@GTix`hc8)JiJna9P^*hiJ5$X5WW{>2N3yK@ zeBA)`*rUj^BQJtvfk9Uk{=;J@6|mCo{9@lhJfm~Zk%UH-pQ0kc&_F|lBK;6Mp7skP z9I!G*SgPZ-rZ$GF1i2+LN=(m|s0tVi^ScACo8~+NY|Q`H5?Vztx-vP;l0kOq3Rxc$ zsah!FvUPA>QxPMHX5L}>yBShYTu(h!P7jOz%I zPT+FVAZ%~~sy+#mP91p&E=$r@4s}u;9gD?8IhqT}tVi0(#mbWfEL3>E6f9=(WY4~b zg&w84rqnXydWirQP2WS_KOmVYfx{HeT)2O2=`tN82}#{gi7wz@~f55_#=8 zx*iJDm*viON7|L)*z_4z9h)MP!&>W7QjX<2Zg6dqFm`e`<}sypA8a3w(ka3*+U(o6 zo@Dht#BeO0J*W|u-$$*W)|D;>E5c%Q3peT?{oQoP1OIcHUFU;w>>zN2Jj`bM=kMn&hf{Yq&PuL@YXd8 zW)x12)=Uow!)MCNgTWU#B)b!yAFIn^&I+NvJR_D8NIOal=YF_|{#jBm1ZVUM&jK^P z9dQlmr`Uzj0oN&?Z`lv?{P&`PA?g3)L(0-`a&Fg5`6xH#VXoc?#(4ZfCdvyPWX4du zwQx!>-}d@X%rZt_$@Hcn93y&B5Q~QGdi^3s>S))f#k}2nJZMt*lVqFAKMWD#{YQY0 znA5Kut6s2wcxooHPyHwL2oq%ggyVmI$ggGj2}S!~oEYk=%LR4sqOUjX;Ha}q0{N^h z`&(Zc9;f?5pZ_nRbm)w(s7hS53XlT-5D*a~(JWqr9OL~GQtoqdsY*%gz?hqWgWb~E zf5MYakN?`27VIcm8`(7HEURZ-$(v+en34z;{-t6{T=F4kYj;V>0|Cu()+olYQAiRN z+RB;m0B52Px0mj*d2(D12@WTI85wZv2xU4->m;g#Lc(r&rTd*3JxK!&;S8O|@zf|< z_G1ta!5ge0`uycp6oPORf>P9e$9WTXd5f^{C7WF@mHUKF-1E>7F+@MbXC!e#Laja1 zz>ECuhGk!GUnAJ(!IaO)e1hL-%)cE6V^%iz<%S52xr9ftC&aMT!?E)2bS;Ntkwn>W z2qQvx#|XNp?U5FtOL&M0{Bs>s){{sUl(OObu3KER%QJBb7rY9Jon;+wFr8UbTO-%; z_=U&yMDz<%Sz9(b>GE=V%nq{btty5Ga3!D-N!@u{v~GIYy4o=8$jCMp{woH^r{6^V zSLp;9;CVOx85ZikZQ5-kUbQv*F8XvVT*u>0Mv9=82u%N}6v^XgAd{k!!<=(L0WB9; zqQfN@ueVbF{hSZ0rdFCpOpzvtQ4vb|jWA6%x`LotHo7#eql^?9EVw;D`hghIb1)bR zlRg$VVwbG1Y6R-bN3`aK=%|Xlu`)PBpf8Q+BZx`|Bl~FJD;vor-NHb1wRk0gbN)67 zo{zkZy<1uNV07>^l6Yn9mPzqkzidegg7D`uE+Q=?k~{E&@!IX=ZY|D80a)J2;jG;v z0bKzdhcBYaIX{q0_v!1mu-?w)g$*6>1?jSYani?m4}i-CzlwPNsl?=A zp=4`q;5;>A>tl1PRr!eXvv+Z?sRuqb$F^M^pT8G~Qu=W`844DYPN->?lcDqS7X&Ixg98SIpIG|nKg`=@xfT6sogtnavA=JMYC$(6sV z{Quh7EFdi8{}Ps0tcQ>r4-a{3tWPWd;)!@yusKX<027xzXH~$b7xv&ED}7I6fR19D zCJdQj#zn3clftlHoKCzTTB|9NeLV3wteEq(1ZJWzVV5ZFDl3x0oGm#jo zOxC;L9(qScL2tUQU}{qR;b<2Ab{bKB|I zgwhu7n!{%mORixWXGENuZ#PV`Ej(W4kWKy};n`r=8Xp_6KGrv)I4>!td*z!qKfZ`5 z=iDc<2!zSD1D4}AA^q!e{JjPK<3R(eFTl9P>jEj}0JZ z|B?Nf>1&YM&kcxxz8X-@iE$=WcW9uqqAlDtJy!9HoD!cvkdh6?}Xvm&< zy?NCxp18o+F{-S#kC;0Ite{NsOmZ8A^I`a$Ws|U4s=X-;ubTCTB$VF-Z<=*c zCm6o`V1WqxNki8Q`^kY7z3GOr02YgD5n(B7qU0=p)ow(V26IYQN+#MJsMs6}EAVTW z(5c~$W8>J9V@+qp(UDlD607j|8(;fvDBv{16k<7+!4>D~6tdpCf%Ux%rInHbE^!p` zn%Udi`Au+hx2QduBWJ4=s3^S>&mhR-a+`wPIh9Fr9kY@^WfM~*HR@r)H(z@Y4m$n= zY7*$(P0V>t96sQv*;Bl@xg~lm%BG%wbbKj`!IX_iMx!`wU8%Jk(*5r6G2m6aVfW$H zQG+KxG}#oezBKdtN~+jw>7=RGZei9P7>gMYnFrj|ce50vcJwc6?CkE@ClCoykR5<6 z4WG5_16xM6${JKbqz>jo3)maivmQxRfOO)enM&KV) zXhGxin+!bdpy8d_XIHzim%y65@Zw#2y5ux?RS^w#C+vP6%skVFqWaL7f4Sw^Y^+_~ zts|B(U?!gjBZd~7K)FCGup;fhmkir}*y=9Zvgo@t1{~nDvBKoLOSiP;HaJg#!EP&P zzgH2xvj1xq>7TABiOmt630`Rbp_1oxT)MxESpTV##iPMq2vF)2CITxPQ!V4`O&^Y$ zth4ucN&p3vh;38t41s-!7z^AcWgVh-1g_=hg8}2E>KQz^xR?C{e@ZYGT&8xI>g@QG z(zH}7mcX^!n4Un524Y^f0&5N#U1-uZ%lfdrW#CJH156ADshMZ@hd=$fr5O<-lx$s( z#p>&Y$%~?6`oyRTLvW~5G`Cn4$hV>nb{k^69U7&r^LosSwH2@ww^A6!cR0GyETbBX zlAf zo|V_-(l{xf*7C&8gH~HD>9eVBdhs{wyLVrvyhJAP+f=9m+s%U@W5@<3mPn`j9-z;;mV>19$fmu^01(R&OiJ zyoHuXvk=&<AeV@RG1z$K^C)srwZ6Sq&i(;C!T39l0}O>@Ia?L*JqIC18Q3y} zijBMOy|XxN`*Skp-DX97LN=7-A_gyQ{hJAdYO6-uk<;CoZLrmD^9rC7eB{FX9jJB= z_oxbUoiSdLZlAGCwjhh{qz^;*>DQcIbeo9v%%KLtr%A^NlsU?l!E!?*zGoF(kabcW zCAB=3zkNJpaRr}x39U{a+NXexC#xS&wk@|r{`5t=PU`a8kuv*i{#lLniDv_Op$|mc zii)?mv|qh8(QR|9nkrL_2*siG#l}&o(mvNoUl#F~BxrxJMFd5?qvT54OSaA84=0l> zKw;=^u6N=RmVP1$OFY{gk?ah4frO8PjnIFKVi)*mJ-RuK@kEl)N~8t{7Rs3m^Hx;z z#>!qUm|J$d-^bq0(q(a??=n!xzLD3Ws`6TS08^<89W6#8<2g6cS#+C_;}U;Qe4AMz zN?2NsUvh&;flINMqA3r=@$rUGZ3jX}BL#Bgd-VwhV1(bFk$HmX7x{@(TdySqiVmLbnMF;{n(>jcBk>a)W0nj@1GbWc?Wan!X-Z75G4cz;P-ASL$W@C5LhV5ox4Bq=t|#X^`%rOF|`wmR3qSB?e&_y1PSiKtj4f zO2GRLa_@8XKJWYaJ@5Pbhs|f7+2^da_Bm&-{atH)Pb6fH>S?h2>*o(foKwC*8dWYP zb6Ey#97ciXl6!{nWlsxssa@Np4BcD*4*|;XQsJeBKiB(7(^B|e*y;P5Xpa`nLV7Y+ z(L=2VmW=l;j%XbwjNvR_9E5?a(lFpsZ(-*?6!6ub&8|x=E4|{S1!?mSrPY-I6oGFJ zw%|yTbj8agX85ksMcqX2<>Z=1K05GOZ>S*mx&E3oc=Ch0z(tAMhQ^b@2zfjPB1j$g zu-%qn7bn3dp<>wpU^=YmeNg=IkE<^O7mSi&MJ8>$3WucB zt9!Ca8*5a(nUIN)n%0UO!HIdGmj3Jq-e^{Em{u3PhheMkV!w1zV8NX*61C2=9M*&= z)7fHuR+;{SAU2m|DoR;GQaWnT-XAEaY7h=NkyuG8B{oFVMFtPDV#DsSAc0rHgb9gV z1Xo-`2@0yI$*^Elws;OsQGE7F|TzAyen82kbw4re+BaSCOzCKzcvu<~Jks9nZ zKBUgGYnqp^=R!$2s`P>Y4c1w+OJFLW>WS)HoQRug=8#B1K8-o0KZ+hAur^NDw3X(& zw>eXMbXa;+YyvARi&@Hhan9`>7`(f+rqQLy6FF~Y>ESk5(|vo+-q)@KMGgfoHWhD7 zb6oMRNwQZ?WaCPd7o8iXxlwXh5$#@Kel&3J7B@F#8VP~Fmee^q;W8zaGHAyS5%R%qe8kuqzHNVo%6N8T6i%$P>Sole2oY_AEj^0g_Sm2Gm(ICW!W(V+EE6gmLh4?5IDbXV%)+*Nbfq%g)3aYoc4E?F_6sqk^ zEmmcSwBal+pm9FNnd9;nERjPkMMLK8K-=|W$ZLJ=u0%Jy)Tp1iYAZzpvJ<5KZ*!i} zuKn?-vof!=zx?qni(BM&XgBklx-ZdW9lLPpv|i#yYeduPQ#w?I<%{{mR!n3 zy}lFI({+2^LSlfBsg;^;RmrO?T_sFPt-?CjUm)M^8=`oAR{H92Ug2oU20B6_!{k3M z`D`W>nFi&JE>F2y)t<87^xTZ)tUfPCMP7v#z`)M;HVIq~ccY%O2jc~SSW@(SBb?RA z=QzX2b!t1?ch*l+7R>k|a5u>3NqA%U>o!Y!*2D2}oD~-i+is84WnWeo>`;EvEwbgl zGJsAkB9tFyang78>Q12=7hAt+sokfs&d%0pYLD2tmfdK7s@1Q~FtY=#>iK?wu>ox$ zW@eI`Q%r++On~tO{ND3$=QHACHoH+u$g-*KDn($1UJlz8R6Qs(L6zrMZw#LaLBrxB( z+jkvCYCK@W`cfqH5od_EEi0~jjgvVus?lp|UYZQ66Fm>M!9eSl_}n%UJ~KVXg(UIW zFum865XR!1Ln<8S_8Oh#EjP?8@-d^MRj!MzLx#B?hT|BYkk+AN!zk7&!MiQ~m#0f| z(5jw_*49^*9TXzqu!NYmhk`1@+`|q+tKXeIJ3&fFzvKJ0#5AU7@nd~*LZoh2)l`c& z`q;5z1}AF<4c#?1r!WHyQsqR?6WWT=t z=va_2;9BNthcITSs%~6gt<5BnHYDl!zKHv-lOAh#1%<7g3S9H7ck=lnFC(;3fFAK; zn5&)Y<1j0=z5Os8L(OF3i*n%i_um{jL3lIGr?P9{FW#>D(~C3umT&jvSR%{VQYhG6 zmSU-;FOy!_R|4`D@VAE@GO97#v*PvExt?_wIZpNiBkOjFyBccOzRIyTf=4Hto&riy z_3iEmrHuvufnqjhvK0|l`4NOydF|_V%{Q@^dmIQ`tFEi^pIhjyl8fs{Htsrs0=b1oKC&^UW-8%` zqg*T-VvMwFFi<5|!RQhdC8$k~U${%_wwuWA=%(T&OL%aUS5bpP z_s)|Y_#wH&K-wo&9i{KOA)xyh;ehZdgd@D)^@O$PS$B}nG4BI02KM>L$ax~dh8e|< zs!3j3;@I>o9i}k3h*%Lg^x!om5z5Z8w{?b+opBbh;9n_ffk?#Z8nQ#eO=Q*~S5i8D zaHLBTJ|Lt;tV$h9h6E*Y!-vWcLJL6P!avYOCSGKqzYAG;aLs%2cUa(eniEyGCLg2v z!BHQ`s}GdhK@(R8=|=#$YY5F|8F648wo44PUYq_Y^4G3z!O9FrCfUcfrl{NV~`?#fzo@_BSi_j#>w`_7tn@7kRM;};?* z9A(m8ciSlA2<+ar_3rV>>Cv}UzqX~EK#-YdGF2cpb(Gjh))!W6&dD)i{g)`U`)b-! z`HO{FFXeCXynV85u6IhspA$=?m?$!xveuN6&{EHX~Co|%`b46gG;2mpQ* z@O2ZvTjFJjDu%SFGnhwPY(eInFrrhQEQKFm%FgO7E?>D~{gdj=$h%n$A*8bs-N~7QU7Cz|5TGQ8!@{Xw&c@fsD{sD&|0pRS|3m76~V4AdlB^!}g)NCnIPd|g?M z`NjQwUDbG1U4-akNa^eSo?-vr(}VnlM)+8XwP_T8myI_3jc|erH2o zkvTWepVKbxMi!))c$WX|$fYLxTvLFzYneS<4bDLPZ1UaogI(`3jDU$!IUQ9N2D6GJ zn9N}m;ZW-u)fetADT;4X;e~~B_^$h;vTW=p2P;_aO+ktEtj~EWs>X2XL*LF!*y5F3 z%02DSk)jG_4t+|D&kdq-uuWakRt|E+zT4aBUYI;kPUP)1}M(YXC2($n2z z*q=m2Yv3M`xORPSS6{$WEc$~dVr#T~ z9S^5=yUyQziljFA(D5sW&OcIj3>>~t>~U3o0Mf2?*4;-gMV9rQH%k%xL|$q{{*5*C zv&4x24&-`4EZlLS(mhFpI|4h@a(7)2`iJ_@QUERH_4$zY; z3qZip#|S=Rh9x;u!aPWbf`Q}kJhXj(jfLPIMOCH43*OtH``NDoyJi-vuhhI+kY1@P zzQe~szb%g|6+naCPOWootInOzeT6k<29LXgak$|U@nqs!1n>RO-=s_JJj}tIj9H^1~BkS@txc**WwZR81U<03*s?GFzlLU>nuNfTA%lI3id^ zI0|ni7ypic)S6%_UP`U@fwovy1VBn?svCNgq0TO z?xfp>&5=;bw|9-&7n6A`!PSl%uOZ>##)8)s?f*OSEzrc=LF3`YPfy9VLQC(o6YrFK zMtpGU=?6;aG#jyImnB+TmqY=u-9LP4sU+X2bEjrwq0ot)|G|puKwgo}z&l8I z7^!}d4DS$Q1i}Gp{zM}K2*jno|L*C2=Fb^JVVJUk+|osLB;>d3zeg;ckamsp|+!81*v7! zDSlTlV)fk`V_dc8-{87NrxlW@!Hf0(>00Rn#Nrhmm;)3L$5*Z)<)_Y=S8$$j9%Vfzzm2K46*`R*&&UW zFs7acycE(!*!G7aW$9uP&4;#zlGKg!gjJ=5H>Iy?iUZ>h|MaDQ#&Lt3g$2OEEbA&N z5OIuv0x?`Zv=tP*6x3w+5i`gIa#+JO(scP6W~#eIuZ>FbXoUw zAuPX+12phC+Rh-WF?qsogIe$cQcO=wyzt}fRte|_&4)4|aYwtQ@XblPK@Pzl%Ll`h zyK1Ye=fnvW)kZY*DMDIVZ6+|aFDnsux6c|#L|fg}J0gg#|MlI=nL5hU2UHOG|ADfg zmF4&MA(~d08j{-m=a74+evxHDX${^&=VqBNIkuV1MYNlL426#<8w)cpbz-0RAagLG z3&>NEW&Qa36zIQP)OUT~&TBM$k0Mu{XmwL-U>siaIMX~)9e=Lngj=^ zv%@a8sqbdMHVaa~7SU?~UyA%UV}DWX&(T+ZU+o`*-DChOG0^rdQJJ?BRasx-GEmhT z$WBNq(pg`8uA3Ak*)pQC%Osjj#hKgYa&}C_n~^s4u?0U{P6cY zq;Grj)&I0*TKs`2`n4%#ele?&_xjXPt|pa3ObZk`WeZm>FpF@g~#p=%YnexBhq3hxF~T7*vePPeYP|)v3-o)D;K4+bw}S1xveL4 zgddB18B88-uAk~}kYgs(Op>l*1J(wHN-^&QFZ@uiqqr!us!ylg%wG|PeyBYO?^*m& zG&ai^p9}kW^woYt)}iOqqWr`3si8S<(AWJ}I@UX}J)mm5UwWQ0??hZpRvIc}A19_y zv&QQ=%J}Sd>RoamPffI0c$p7-d}=u2B|upw{YTx=xkLtP7Hj?SF6?y3e9;k*!4&YlPuVUJ=~F(9-|aN|kK|JB^)`L#wnG-za%G+mlV>DF5PuPdA{lw{ zex9%B)xYW7^mk9ZAJVda+3r7)%jj=Od$E79U5V&FRc89dHpq!WT8judbxHr3Tyeil z+RZd#cnofvH~ne-5C5h!$1gp!zu4|Sk?Yr4eDkaAij_ZJ&&4k~_aJYAn@M|BRC#he zjRC*()Oy!BxO-h>jJ5?C$2+UMfXXtum^*S09%Q;zpco zL(xgEab4Q*u9-cdK+U^WejK#6^&2-`Q)dn>Fn#HtbV9!+JeZ!5dj_22pbg^k7sSVDYuZ&BPzm%D z4D$wX-&v`mcIg$#A1M6upAyN(wAc8SN`BK!g5z=R?~)tl<`firnX_^~TVR(2cw;)9 zx!FFVKrggdNoSt`-;v$aF!}vn5G*wfH^kE?fB@S`Zry6C_<0{><=!UqwJU916aWK= ziVGHtOS~m>eYS~E(ov{h<7GadR%yi9y6>wGPE0Gq+_r`~t{N#{g3|?+bQBCkUzH89 zno^nAAb9H70wrsD7c}s{Sb2LCOz|hX(zCXc*B9ja996f(yq?k z=Qw5%RKUB@VOBBHVGA-X`>$nj)Q$?+ET0Qx4%R zMU8#dyrjJqo)XD6TH-<1+OCI6Dj2k#M)NeXExe}0bqq!(G11w@+cL=4Gtrmp;_B+F za93@JfrLvAe*{^YPA{)N)-T>q;uNo`oD~a=AFGY!#}aj-;Hv5pGst*?*905GItI7y zfH|VO#muXwKjz9yzd`MAv+StD!|?ijA|>`ZT3XXQtk%tRTKxU8f& zfk@ABFisvLa()4{f%l z3B>GJYhGCUcAeNe4rHthm><`X$OUWkyY!LoGy~51`R&&1l!p;cwyW z%$wIaiE-Pj1?95$4-__#6oVUn+`!|h^_E!9=H^Ay?8t#oD&FVBoyhE7y9yx;jH4nahaJfiCu#9cR8E zYOia&ySEQ5RA7Uxh7&r|MG5%~8DZ@n6AWe~@@Q?)nKE`8}QknytAprw%=7QhLQr zq0KPgon5(=OvDKbwYf>nA()D{r-z!+Ug6G3G`)=O=TD;Q7Qc9~V zFH%(%GjLZ?cpZti7DR31_YOE+sj*#Z^=aBIR=sx$5n1UR~hTTo8~#XfK$r4md*E+3SyO;$u{(yL)zMG zt*1lAM>J77dnE(2*iO+nMg6wSI`_WqFCNDi$W4SJOfa=02Oq2J>pRUn;KY z2-C&s6nogWau2a)r^xt1H+9aJk6v0RvPyGtMFpqIZAL3us%`0y^AFGsInwJ zHiIMJ(S`eYRY92}Z@lYCcM)*i(-AjkR-T=QTyr69Cq%ZK+n8qvUU<9;Z$!HX4FhYO zcMDe~sq8%%= z32)ws*lbD8yeB4u=SX)4I$(=Nx0}8rtXko1;IBR)89Dyh~ocHwFpaVT)e9D+m*(1}Uh>!KoJ3b3F+e{F}AA&_F@wp|FhNcmSi09{P$| zdDmS_&cj%2UKn)$+dSF=k&92qb`3e-n^^k?BpUs4l{}6hrH$+e+3rg;ylh)tf@7hT zQm?#z`^VNM`2uNnWj>nH@*;w#mJhDHF8K*wEowN?DNjNFqQyk4_!>|LHn*|WJEbv#|#a|6n@9|$zD2k8O!}br;l>+j`f_0H635? zzQFuOk&f1u=G2!kZL_|=li9Xu$$FdH-MQ3-zgnlBAJYBS-W!=WlpHqH&L>eDsDZo5 z%)hvzw7^l>wW34sSYX8iWf%O`R)#_J{Pvc?h{QGviwP*L_n8>XBVC$`}Jmq4-ne`)& zN(bF5O7`bvw$>}@6|r{?FqS-LRW?$mN?1_XU5$g7IRWXF$L#&Exv ztcQ+-dvL8LrDT5=AVz^$q23jnK(PBcVSc9_eSdV-m#DA!*V6FaKw#6IBP-6L25Y{k zsvKM{c=~1!;qE=a_@<3Da_=3>nifLKo{EGdK|_@k$NWy`Oj7@9C;AjByOniAN$jz8 z=i|FIYvZX|Ft{h5yC9dG;|7Z2~tDGBSv|x_XU&Vy#g50$2wy zTX+20NR@r0BCPIqSynsK`!RW@!VPi9$RxfM8iF@{;-B5x?AcsB<6|^Ida4h-oOs3> z26?{DEarUG^>nkSN*9n8@wmFM#2vK!u(!YX&o#xXV$(3fJLC=|y!%@t+>Qoln%kgA z<a znG!{i>S)-Rd|`?Onbc{L6G~kipax+!>6XyEop(QI(bH^S)8xQ8%Y{KgRHwx4oi2Y< z1;2G;pq0|I?3IIU(qfFls7ED}xa16Gk+yC6IDeqjWFVY+oWeKxzQaOpw_C5a* z_HJEH(5&*K#Xb>-qzB=V$39J%X(5B@Wl0O4%Fiba_SazgvF!Yx4=+jGX@y=k8u<^l zttsx?Cow>`y6=@@M}{0|H{SgCb7-DV=bn%iTBlbBZxmHY7VxMJas#;s{4xDs(H0jb literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-heaven-trend-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-heaven-trend-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..769014e31aab9ab12f8e77eba13393b1640bc1cd GIT binary patch literal 72460 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 literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..d79a397871644e939ceb4f8ce9b69ebf7f360a21 GIT binary patch literal 129054 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 l?d%#;slT`k@Kbx+C-4M;?VJi_@% literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-original-screener-light-1920x1080.png b/docs/migration/evidence/slice-10/frontend-original-screener-light-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..738fcd11df9bf18aa84a847faa926edbc9c1ac85 GIT binary patch literal 92826 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 ovs`jgyd&~So()D|WTiCCNe3jhEB literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-10/frontend-source-map.json b/docs/migration/evidence/slice-10/frontend-source-map.json new file mode 100644 index 0000000..262782e --- /dev/null +++ b/docs/migration/evidence/slice-10/frontend-source-map.json @@ -0,0 +1,190 @@ +{ + "source": "static/app.js", + "source_sha256": "c020d0bc68f8a96b352a0ffa62c913a0ea3f5ca0afc41f70969f833e447166a6", + "source_line_count": 9283, + "reassembled_sha256": "c020d0bc68f8a96b352a0ffa62c913a0ea3f5ca0afc41f70969f833e447166a6", + "all_source_lines_preserved": true, + "core": { + "target": "app/frontend/app.js", + "ranges": [ + { + "start": 1, + "end": 1206 + }, + { + "start": 3471, + "end": 3489 + }, + { + "start": 8427, + "end": 8904 + }, + { + "start": 9052, + "end": 9283 + } + ] + }, + "modules": [ + { + "target": "app/frontend/pages/sentiment/page.js", + "ranges": [ + { + "start": 1207, + "end": 1516, + "sha256": "70a884362b3f97ceb28e2f3a83a70ce26e61c79e23bfeee62b301b9068f2b69c" + } + ] + }, + { + "target": "app/frontend/pages/pools/page.js", + "ranges": [ + { + "start": 1517, + "end": 1915, + "sha256": "ff8623609c1ef6eb793deaef2b627746727a4768962711d1712e35833b4f58c3" + } + ] + }, + { + "target": "app/frontend/pages/market/runtime.js", + "ranges": [ + { + "start": 1916, + "end": 1957, + "sha256": "703dafd0417926df8572a885ffa32a79ee16346019f0e14fcee9e03ad1f1baf7" + }, + { + "start": 6893, + "end": 7719, + "sha256": "a670986ac2099a181f5f348cd48bc4777da0d4709b3ac79239067ff5666261fb" + }, + { + "start": 7969, + "end": 8426, + "sha256": "467409c2cfc06ee96bb7f422be55f79920c3a9936229b2234dd8f78b537e7f26" + } + ] + }, + { + "target": "app/frontend/pages/rotation/page.js", + "ranges": [ + { + "start": 1958, + "end": 2124, + "sha256": "33f536213db33be0934527f13527712a9d521b5f89a5784b42887c5bf8631f2f" + } + ] + }, + { + "target": "app/frontend/pages/ladder/page.js", + "ranges": [ + { + "start": 2125, + "end": 2216, + "sha256": "2be84071921910acbec2328f1f10dd8565420ea03a1930ff255040bf99d679a8" + } + ] + }, + { + "target": "app/frontend/pages/auction/page.js", + "ranges": [ + { + "start": 2217, + "end": 2481, + "sha256": "7f16901ae8769b9570693211022538feb02f2cda4bffe6fa95ba6ce60c10b012" + } + ] + }, + { + "target": "app/frontend/pages/themes/page.js", + "ranges": [ + { + "start": 2482, + "end": 2583, + "sha256": "c134d762bda669483f0c094efae9281919b68b2ffb83c9457670bc9013ce1515" + } + ] + }, + { + "target": "app/frontend/pages/popularity/page.js", + "ranges": [ + { + "start": 2584, + "end": 2659, + "sha256": "db72e42385e4a4bd4314ab471b27c1bb804f13650ee463f0843d783b0ba50bff" + } + ] + }, + { + "target": "app/frontend/pages/dragon-tiger/page.js", + "ranges": [ + { + "start": 2660, + "end": 3028, + "sha256": "b33ccad80ce997bddd75e4025eec35aa246fa5e9f5ca9ccd5f17e587885274cd" + } + ] + }, + { + "target": "app/frontend/pages/review/page.js", + "ranges": [ + { + "start": 3029, + "end": 3470, + "sha256": "10dba1966b32941cb28ac46d1cb1b20ae74ea271fd7be22a23b46d290ece80ef" + }, + { + "start": 7720, + "end": 7968, + "sha256": "3af64079f997fabbf0ff4023088eb62f94c0091a823bd6d65c1f9e485d1c5ad8" + } + ] + }, + { + "target": "app/frontend/pages/screener/page.js", + "ranges": [ + { + "start": 3490, + "end": 4336, + "sha256": "76dfdd5610453f0abb5899baba9d751b5f597450ec656bf10580ce91447a68b9" + }, + { + "start": 6668, + "end": 6892, + "sha256": "a7d0fa98b07516169a8e46c2ae2f6efbaeab651887c479919210835f0877533e" + } + ] + }, + { + "target": "app/frontend/pages/mentor/page.js", + "ranges": [ + { + "start": 4337, + "end": 4827, + "sha256": "b2067c062fb6cb539dd6402074d02f1ae65903957106d7ebf8d63bc5487f244c" + } + ] + }, + { + "target": "app/frontend/pages/heaven/page.js", + "ranges": [ + { + "start": 4828, + "end": 6667, + "sha256": "57bd47c239c4ee9302c7cd7a1f86a5d0932df6065148a34bafe0c49bef644cb1" + } + ] + }, + { + "target": "app/frontend/shared/export.js", + "ranges": [ + { + "start": 8905, + "end": 9051, + "sha256": "17b867189087615a4414da4f9db3862306e05cb527c25c794beb9c4c74b583ab" + } + ] + } + ] +} diff --git a/docs/migration/保真迁移状态.json b/docs/migration/保真迁移状态.json index 1cf0da8..a70cc0b 100644 --- a/docs/migration/保真迁移状态.json +++ b/docs/migration/保真迁移状态.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "updated_at": "2026-07-31T11:52:29+08:00", + "updated_at": "2026-07-31T12:30:00+08:00", "status": "active", "migration_mode": "behavior_preserving_source_migration", "source_of_truth": "current_original_webapp_runtime_and_source", @@ -9,10 +9,10 @@ "failed_roots": [ "next" ], - "current_slice": "slice-10-frontend-shell-pages-components-css-mobile", - "last_completed_slice": "slice-09-review-watchlist-notes-journal-alerts-assistant", - "last_checkpoint": "xiaobai-preservation-slice-09-20260731", - "next_action": "capture_frontend_asset_dependency_map_then_relocate_original_shell_pages_components_css_and_mobile_responsibilities_without_runtime_changes", + "current_slice": "slice-11-uncertain-code-audit-final-acceptance-handoff", + "last_completed_slice": "slice-10-frontend-shell-pages-components-css-mobile", + "last_checkpoint": "xiaobai-preservation-slice-10-20260731", + "next_action": "commit_and_push_slice_10_then_audit_each_uncertain_asset_with_independent_evidence_and_retain_any_asset_not_proven_safe_to_remove", "authoritative_documents": [ "AGENTS.md", "docs/migration/原版保真迁移总纲.md", diff --git a/docs/migration/保真迁移账本.md b/docs/migration/保真迁移账本.md index 01c50d7..f19d339 100644 --- a/docs/migration/保真迁移账本.md +++ b/docs/migration/保真迁移账本.md @@ -1,6 +1,6 @@ # 小白复盘保真迁移账本 -> 当前状态:正式迁移,切片09“复盘、自选、交易日志、提醒与复盘助手”已完成 +> 当前状态:正式迁移,切片10“前端Shell、页面、样式与移动端职责归位”已完成 本账本是上下文恢复和人工审计的连续记录。任何迁移提交必须在同一提交中更新本文件及 `保真迁移状态.json`。 @@ -28,6 +28,8 @@ | 2026-07-31 | `xiaobai-preservation-slice-06-20260731` | 智能选股、自定义选股与策略持续跟踪原实现归位 | 自动、API、数据库与浏览器差分通过,进入切片07 | | 2026-07-31 | `xiaobai-preservation-slice-07-20260731` | 问师、模型Skill与LLM流式链路原实现归位 | 自动、API、数据库、Skill与浏览器差分通过,进入切片08 | | 2026-07-31 | `xiaobai-preservation-slice-08-20260731` | 问天、观势、观气与观心原实现归位 | 自动、API、数据库、动画与浏览器差分通过,进入切片09 | +| 2026-07-31 | `xiaobai-preservation-slice-09-20260731` | 复盘、自选、交易日志、提醒与复盘助手原实现归位 | 自动、API、数据库、账户隔离与浏览器差分通过,进入切片10 | +| 2026-07-31 | `xiaobai-preservation-slice-10-20260731` | 前端Shell、页面、CSS、动画与移动端职责归位 | 源码重组、自动、API、数据库、桌面、夜间、移动端与动画差分通过,进入切片11 | ## 资产处置登记 @@ -64,6 +66,10 @@ | `assistant_agent.py`与复盘服务 | 业务服务 | 我的复盘、自选、交易日志与复盘助手 | 机械移动并保留兼容别名 | `app/backend/features/review/` | Agent文件哈希、8个服务方法AST、5个真实API及会员/非会员页面等价 | 已移动 | | 复盘、自选、交易日志与助手消息方法 | 持久化 | 用户私有复盘数据 | 按职责机械移动并保持Mixin原接口 | `app/backend/features/review/repository.py` | 13个方法AST一致;相关表逐行一致;浏览器账户隔离通过 | 已移动 | | 提醒编排与提醒持久化方法 | 业务服务/持久化 | 提醒中心与策略跟踪提醒 | 按职责机械移动 | `app/backend/features/alerts/` | 5个服务方法、6个Repository方法AST及真实API一致 | 已移动 | +| `static/app.js` | 前端总运行时 | 全站页面、状态、交互与动画 | 按原连续行机械拆分 | `app/frontend/app.js`、`pages/*/page.js`、`pages/market/runtime.js`、`shared/export.js` | 9,283行重组SHA-256与原版一致;85项前端专项测试通过 | 已移动 | +| `static/index.html` | 前端DOM骨架 | 全站 | 只调整资源路径和拆分脚本加载 | `app/frontend/index.html` | 反向替换路径与脚本后逐字符一致;浏览器差分通过 | 已移动 | +| `static/styles.css`等七层样式 | 视觉运行资产 | 全部页面、主题和移动端 | 字节级移动 | `app/frontend/styles/`、`app/frontend/pages/heaven/page.css`、`app/frontend/shared/tokens.css` | 逐文件SHA-256一致;桌面、夜间和移动端计算样式一致 | 已移动 | +| `static/ui-core.js`、页面/共享脚本和供应商资产 | 前端共享/第三方资产 | Shell、页面注册、通用组件与图标 | 字节级移动 | `app/frontend/shared/`、`pages/`、`vendor/` | 逐文件SHA-256一致;45项Playwright和真实浏览器差分通过 | 已移动 | 处置只允许:`原样保留`、`移动`、`合并重复`、`待定`、`确认废弃`。 @@ -171,6 +177,18 @@ - 回档:标签`xiaobai-preservation-slice-09-20260731`。 - 完整证据:`docs/migration/evidence/slice-09/README.md`。 +已完成切片:`slice-10-frontend-shell-pages-components-css-mobile`。 + +- 原版基线:提交`38de3de`,即切片09回档点。 +- 迁移范围:完整前端DOM、9,283行运行时、页面脚本、共享脚本、七层CSS、问天加载动画、供应商资产及移动端规则。 +- 兼容边界:运行时只切换静态根目录和资源路径;原DOM、样式、动画及JS源码内容不重写。 +- 源码证明:原`app.js`与全部拆分片段重组后的SHA-256均为`c020d0bc68f8a96b352a0ffa62c913a0ea3f5ca0afc41f70969f833e447166a6`。 +- API与数据库:21个全站只读API全部一致;62个schema对象和21张关键表逐行一致。 +- 验收:85项前端专项、原版231项、迁移版294项Python测试、45项Playwright(2.3分钟),以及1920×1080日间/夜间、390×844移动端和问天动画真实浏览器差分通过。 +- 验收限制:同主机不同端口共享登录Cookie,双服务比较必须逐服务重新登录;动态动画帧、焦点和状态文字不以截图文件哈希作为唯一标准。 +- 回档:标签`xiaobai-preservation-slice-10-20260731`。 +- 完整证据:`docs/migration/evidence/slice-10/README.md`。 + ## 决策记录 | 日期 | 决策 | 原因 |