Files
HIS/患者首页处理/数据可视化网页端/app/static/index.html
2026-05-27 00:21:16 +08:00

342 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>患者首页复核工作台</title>
<link rel="stylesheet" href="/static/styles.css">
</head>
<body>
<section id="loginView" class="login-view">
<form id="loginForm" class="login-panel">
<div class="login-mark"></div>
<h1>患者首页复核工作台</h1>
<p>登录后进入复核、抽查与数据回写工作区</p>
<label>
<span>用户名</span>
<input id="loginUsername" autocomplete="username" value="admin" placeholder="用户名">
</label>
<label>
<span>密码</span>
<input id="loginPassword" type="password" autocomplete="current-password" placeholder="密码">
</label>
<button id="loginBtn" type="submit">登录</button>
<div id="loginMessage" class="login-message"></div>
</form>
</section>
<div id="appShell" class="app-shell is-hidden">
<header class="topbar">
<div class="brand">
<span class="mark"></span>
<div>
<h1>患者首页复核工作台</h1>
<p>PDF 预览 · 复核定位 · PostgreSQL 回写</p>
</div>
</div>
<nav class="top-nav" aria-label="工作台导航">
<button class="nav-button is-active" type="button" data-page="overview">概览</button>
<button class="nav-button" type="button" data-page="review">复核</button>
<button class="nav-button" type="button" data-page="audit">抽查</button>
<button class="nav-button" type="button" data-page="auditHistory">抽查一览</button>
<button class="nav-button" type="button" data-page="settings">设置</button>
</nav>
<div class="status-grid" id="statusGrid">
<div class="status-card"><span>数据库</span><strong id="dbState">检查中</strong></div>
<div class="status-card"><span>待复核总数</span><strong id="dbTotal">--</strong></div>
<div class="status-card"><span>需复核</span><strong id="dbNeedsReview">--</strong></div>
<div class="status-card"><span>AI已通过</span><strong id="dbAiPassed">--</strong></div>
<div class="status-card"><span>AI建议复核</span><strong id="dbAiPending">--</strong></div>
<div class="status-card"><span>已人工复核</span><strong id="dbReviewed">--</strong></div>
</div>
<div class="session-box">
<span id="currentUserLabel">未登录</span>
<button id="logoutBtn" type="button">退出</button>
</div>
</header>
<main id="overviewPage" class="page-view overview-page">
<section class="metric-grid" id="overviewMetrics"></section>
<section class="page-band">
<div class="section-head">
<h2>待处理概况</h2>
<button id="overviewRefreshBtn" type="button">刷新</button>
</div>
<div id="overviewQueues" class="queue-summary"></div>
</section>
<section class="page-band">
<div class="section-head">
<h2>最近人工修改</h2>
</div>
<div id="overviewRecentLogs" class="data-table-wrap"></div>
</section>
</main>
<main id="reviewPage" class="workspace page-view is-hidden">
<aside class="record-panel">
<div class="panel-tools">
<input id="searchInput" type="search" placeholder="搜索住院号、病案号、姓名、诊断">
<select id="statusFilter">
<option value="review_all">全部数据</option>
<option value="needs_review">需复核</option>
<option value="ai_passed">AI已通过</option>
<option value="AI已处理-不OK">AI建议复核</option>
<option value="reviewed">已人工复核</option>
</select>
<div id="aiActions" class="ai-actions is-hidden">
<button id="aiCurrentBtn" type="button">AI当前项</button>
<button id="aiFiveBtn" type="button">AI后5项</button>
<button id="aiAllBtn" type="button">AI后全部</button>
</div>
<div id="aiProgressPanel" class="ai-progress is-hidden">
<div class="ai-progress-head">
<strong id="aiProgressTitle">AI处理中</strong>
<span id="aiProgressText">0/0</span>
</div>
<div class="ai-progress-track"><span id="aiProgressBar"></span></div>
<div id="aiProgressMeta" class="ai-progress-meta">等待开始</div>
<button id="aiCancelBtn" type="button">中止AI</button>
</div>
<button id="approveAiNoIssueBtn" class="bulk-action is-hidden" type="button">通过所有AI已通过</button>
</div>
<div class="record-list" id="recordList" tabindex="0"></div>
</aside>
<section class="pdf-panel">
<div class="pdf-toolbar">
<div>
<strong id="pdfTitle">未选择病例</strong>
<span id="pdfSubtitle"></span>
</div>
<div class="pdf-zoom-controls" aria-label="PDF缩放">
<button id="pdfZoomOutBtn" type="button" title="缩小 PDF"></button>
<span id="pdfZoomLabel">110%</span>
<button id="pdfZoomInBtn" type="button" title="放大 PDF">+</button>
<button id="pdfZoomResetBtn" type="button" title="重置 PDF 缩放">1:1</button>
</div>
</div>
<div class="viewer" id="pdfView">
<iframe id="pdfFrame" title="患者首页 PDF" tabindex="-1"></iframe>
</div>
<div class="review-strip" id="reviewStrip"></div>
</section>
<aside class="detail-panel">
<div class="detail-head">
<div>
<h2 id="detailTitle">摘录信息</h2>
<p id="detailMeta">选择左侧记录后开始复核</p>
</div>
<div class="detail-actions">
<button id="saveBtn" type="button" disabled>复核并保存</button>
</div>
</div>
<div id="targetSummary" class="target-summary"></div>
<form id="detailForm" class="detail-form structured-form"></form>
<details class="review-log-panel collapsible-panel" open>
<summary class="section-head compact">
<h2>修改记录</h2>
<span id="changeLogCount">0 条</span>
</summary>
<div id="changeLogTable" class="data-table-wrap"></div>
</details>
<details class="review-log-panel collapsible-panel ai-question-panel">
<summary class="section-head compact">
<h2>AI提问问题</h2>
<span id="aiQuestionCount">0 条</span>
</summary>
<div id="aiQuestionTable" class="data-table-wrap"></div>
</details>
<div class="save-message" id="saveMessage"></div>
</aside>
</main>
<main id="auditPage" class="page-view audit-page is-hidden">
<section class="page-band audit-toolbar">
<label>
<span>抽查来源</span>
<select id="auditSource">
<option value="reviewed">已人工复核</option>
<option value="auto_pass">自动通过</option>
</select>
</label>
<label>
<span>抽取数量</span>
<input id="auditCount" type="number" min="1" max="50" value="5">
</label>
<button id="auditSampleBtn" type="button">随机抽取</button>
<span id="auditMessage" class="inline-message"></span>
</section>
<section class="audit-layout">
<aside class="record-panel">
<div class="record-list" id="auditSampleList"></div>
</aside>
<section class="pdf-panel">
<div class="pdf-toolbar">
<div>
<strong id="auditPdfTitle">未选择抽查记录</strong>
<span id="auditPdfSubtitle"></span>
</div>
<div class="pdf-zoom-controls" aria-label="抽查PDF缩放">
<button id="auditPdfZoomOutBtn" type="button" title="缩小 PDF"></button>
<span id="auditPdfZoomLabel">110%</span>
<button id="auditPdfZoomInBtn" type="button" title="放大 PDF">+</button>
<button id="auditPdfZoomResetBtn" type="button" title="重置 PDF 缩放">1:1</button>
</div>
</div>
<div class="viewer" id="auditPdfView">
<iframe id="auditPdfFrame" title="抽查 PDF" tabindex="-1"></iframe>
</div>
<div class="review-strip" id="auditReviewStrip"></div>
</section>
<aside class="detail-panel">
<div class="detail-head audit-detail-head">
<div>
<h2 id="auditDetailTitle">抽查信息</h2>
<p id="auditDetailMeta">随机抽取后开始抽查</p>
</div>
<div class="audit-save-actions">
<button id="auditPassBtn" type="button">归类通过并保存</button>
<button id="auditFailBtn" class="danger" type="button">归类异常并保存</button>
<button id="auditUnsureBtn" type="button">归类不确定并保存</button>
</div>
</div>
<div id="auditTargetSummary" class="target-summary"></div>
<form id="auditDetailForm" class="detail-form structured-form"></form>
<div class="manual-note">
<label for="auditNotes">抽查人工备注</label>
<textarea id="auditNotes" rows="3" placeholder="填写抽查判断、修改原因或后续处理说明"></textarea>
</div>
<section class="review-log-panel">
<div class="section-head compact">
<h2>修改记录</h2>
<span id="auditChangeLogCount">0 条</span>
</div>
<div id="auditChangeLogTable" class="data-table-wrap"></div>
</section>
</aside>
</section>
</main>
<main id="auditHistoryPage" class="page-view audit-history-page is-hidden">
<section class="page-band">
<div class="section-head">
<h2>抽查一览</h2>
<button id="auditHistoryRefreshBtn" type="button">刷新抽查记录</button>
</div>
<div id="auditHistoryTable" class="data-table-wrap"></div>
</section>
</main>
<main id="settingsPage" class="page-view settings-page is-hidden">
<section class="settings-grid">
<section class="page-band settings-wide">
<div class="section-head">
<h2>用户与权限</h2>
<span id="settingsUserCount">0 个用户</span>
</div>
<form id="userForm" class="settings-form">
<input id="newUsername" autocomplete="off" placeholder="新用户名">
<input id="newPassword" type="password" autocomplete="new-password" placeholder="密码">
<div id="newUserPermissions" class="permission-grid"></div>
<button type="submit">新建用户</button>
</form>
<div id="userList" class="user-list"></div>
</section>
<section class="page-band">
<h2>数据库与目录</h2>
<div id="settingsStatus" class="settings-list"></div>
</section>
<section class="page-band">
<h2>系统设置</h2>
<div class="settings-list">
<div>
<span>状态检查</span>
<form id="systemSettingsForm" class="status-check-form">
<input id="statusCheckTime" type="time" value="03:00" aria-label="每日状态检查时间">
<button id="saveSystemSettingsBtn" type="submit">保存时间</button>
<button id="statusCheckBtn" type="button">立即检查</button>
</form>
</div>
<div><span>检查计划</span><strong id="statusCheckMeta">尚未检查</strong></div>
<div><span>复核工作台</span><strong>默认显示全部复核数据,仅使用 PDF 预览</strong></div>
<div><span>保存动作</span><strong>写入字段、修改日志、reviewed 状态</strong></div>
<div>
<span>提交已复核</span>
<button id="submitReviewedBtn" type="button">一键提交已人工复核项目</button>
</div>
<div><span>抽查来源</span><strong>reviewed / auto_pass</strong></div>
<div><span>日志表</span><strong>复核和抽查日志并入主表 JSONB</strong></div>
</div>
</section>
<section class="page-band settings-ai">
<div class="section-head ai-section-head">
<div class="ai-title-row">
<h2>AI设置</h2>
<label class="toggle-field ai-enable-toggle"><input id="kimiEnabled" type="checkbox">启用AI核验</label>
</div>
<span id="kimiMeta">未检查</span>
</div>
<form id="kimiSettingsForm" class="ai-settings-form">
<label>
<span>默认模型</span>
<select id="kimiModel" aria-label="默认模型">
<option value="kimi-k2.5">kimi-k2.5</option>
<option value="kimi-k2.6">kimi-k2.6</option>
<option value="moonshot-v1-32k-vision-preview">moonshot-v1-32k-vision-preview</option>
<option value="moonshot-v1-128k-vision-preview">moonshot-v1-128k-vision-preview</option>
</select>
</label>
<label>
<span>API Key</span>
<input id="kimiApiKey" type="password" autocomplete="new-password" placeholder="留空不变">
</label>
<label>
<span>并发</span>
<input id="kimiConcurrency" type="number" min="1" max="6" value="3" aria-label="AI并发数">
</label>
<label class="toggle-field"><input id="kimiThinkingEnabled" type="checkbox">Thinking</label>
<button id="saveKimiSettingsBtn" type="submit">保存AI</button>
</form>
<div class="ai-action-table">
<table>
<thead>
<tr>
<th>复核页按钮</th>
<th>使用方式</th>
<th>隐私模式</th>
<th>当前效果</th>
</tr>
</thead>
<tbody>
<tr>
<td>AI当前项</td>
<td><select id="aiActionModeCurrent" data-ai-action-mode="current"></select></td>
<td><label class="ai-privacy-toggle"><input id="aiActionPrivacyCurrent" type="checkbox" data-ai-action-privacy="current">开启</label></td>
<td id="aiActionPreviewCurrent">--</td>
</tr>
<tr>
<td>AI后5项</td>
<td><select id="aiActionModeFive" data-ai-action-mode="five"></select></td>
<td><label class="ai-privacy-toggle"><input id="aiActionPrivacyFive" type="checkbox" data-ai-action-privacy="five">开启</label></td>
<td id="aiActionPreviewFive">--</td>
</tr>
<tr>
<td>AI后全部</td>
<td><select id="aiActionModeAll" data-ai-action-mode="all"></select></td>
<td><label class="ai-privacy-toggle"><input id="aiActionPrivacyAll" type="checkbox" data-ai-action-privacy="all">开启</label></td>
<td id="aiActionPreviewAll">--</td>
</tr>
</tbody>
</table>
</div>
<div id="aiPrivacyNote" class="ai-privacy-note">隐私模式全部开启AI上传内容会排除基本信息、地址联系人、整页截图和PDF全文摘录。</div>
</section>
</section>
</main>
</div>
<script src="/static/app.js"></script>
</body>
</html>