383 lines
19 KiB
HTML
383 lines
19 KiB
HTML
<!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/app.css">
|
||
</head>
|
||
<body>
|
||
<header class="topbar">
|
||
<div class="top-title">
|
||
<div class="eyebrow">HIS LIST REVIEW</div>
|
||
<h1>患者目录图片集群人工复核及抽查</h1>
|
||
</div>
|
||
<span id="saveState" class="save-state"></span>
|
||
<div class="top-actions">
|
||
<nav class="top-nav">
|
||
<button class="nav-button active" type="button" data-view="overview">概览</button>
|
||
<button class="nav-button" type="button" data-view="review">复核</button>
|
||
<button class="nav-button" type="button" data-view="audit">抽查</button>
|
||
<button class="nav-button" type="button" data-view="auditHistory">抽查一览</button>
|
||
<button class="nav-button" type="button" data-view="settings">设置</button>
|
||
</nav>
|
||
<span id="pgState" class="pg-state"></span>
|
||
<button id="pgTestButton" class="ghost-button" type="button">测试PG</button>
|
||
<button id="pgSyncButton" class="ghost-button" type="button">提交待同步</button>
|
||
<form method="post" action="/logout">
|
||
<button class="ghost-button" type="submit">退出</button>
|
||
</form>
|
||
</div>
|
||
</header>
|
||
|
||
<main id="overviewView" class="page-view overview-view">
|
||
<section class="overview-grid" id="overviewGrid"></section>
|
||
<section class="overview-panel">
|
||
<h2>复核工作台</h2>
|
||
<div id="overviewBatches" class="batch-grid"></div>
|
||
</section>
|
||
<section class="overview-panel">
|
||
<h2>抽查一览工作台</h2>
|
||
<div id="overviewAudit" class="batch-grid"></div>
|
||
</section>
|
||
</main>
|
||
|
||
<main id="reviewView" class="workspace page-view hidden">
|
||
<aside class="queue-panel" id="queuePanel" tabindex="0">
|
||
<section class="stats-grid" id="statsGrid"></section>
|
||
<div class="filters">
|
||
<label class="inline-field review-filter-field">
|
||
<span class="field-prefix">数据源:</span>
|
||
<select id="batchFilter"></select>
|
||
</label>
|
||
<input type="hidden" id="statusFilter" value="pending">
|
||
<div class="review-status-row">
|
||
<div class="inline-field review-filter-field">
|
||
<span class="field-prefix">状态:</span>
|
||
<div id="statusSegment" class="status-segment" aria-label="复核状态">
|
||
<button type="button" class="status-pill active" data-status="pending">待处理</button>
|
||
</div>
|
||
</div>
|
||
<label class="inline-field review-filter-field">
|
||
<span class="field-prefix">其他:</span>
|
||
<select id="moreStatusFilter" aria-label="其他复核状态">
|
||
<option value="">其他状态</option>
|
||
<option value="confirming">待确认</option>
|
||
<option value="done">人工复核通过</option>
|
||
<option value="all">全部</option>
|
||
</select>
|
||
</label>
|
||
</div>
|
||
<label class="inline-field review-filter-field">
|
||
<span class="field-prefix">排序:</span>
|
||
<select id="sortFilter">
|
||
<option value="source">默认顺序</option>
|
||
<option value="updated_desc">最近修订优先</option>
|
||
</select>
|
||
</label>
|
||
<label class="inline-field review-filter-field">
|
||
<span class="field-prefix">搜索:</span>
|
||
<input id="searchInput" placeholder="姓名/住院号/科室">
|
||
</label>
|
||
<div class="ai-action-panel review-ai-panel">
|
||
<div class="ai-action-title"><span class="ai-badge">AI</span><span>辅助修改</span></div>
|
||
<div class="ai-action-buttons">
|
||
<button type="button" id="kimiCurrentButton" class="secondary-button ai-button">修改当前项</button>
|
||
<button type="button" id="kimiFiveButton" class="secondary-button ai-button">修改下5项</button>
|
||
<button type="button" id="kimiRemainingButton" class="secondary-button ai-button">修改下所有项</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="queueList" class="queue-list"></div>
|
||
</aside>
|
||
|
||
<section class="image-panel">
|
||
<div class="index-note">核对与同步都以住院号作为唯一定位依据,姓名和科室只作辅助参考</div>
|
||
<div class="record-strip">
|
||
<div>
|
||
<div id="recordTitle" class="record-title">未选择记录</div>
|
||
<div id="recordMeta" class="record-meta"></div>
|
||
</div>
|
||
<a id="fullImageLink" class="ghost-button" target="_blank" rel="noreferrer">原图</a>
|
||
</div>
|
||
<div class="crop-frame" id="cropFrame">
|
||
<img id="cropImage" alt="裁剪截图" draggable="false">
|
||
</div>
|
||
<div class="zoom-actions">
|
||
<button id="zoomOutButton" class="ghost-button" type="button">缩小</button>
|
||
<button id="zoomResetButton" class="ghost-button" type="button">恢复尺寸</button>
|
||
<button id="zoomInButton" class="ghost-button" type="button">放大</button>
|
||
<span id="zoomLabel" class="queue-meta">100%</span>
|
||
</div>
|
||
<div id="tipsBox" class="tips-box"></div>
|
||
</section>
|
||
|
||
<section class="edit-panel">
|
||
<form id="editForm" class="edit-form">
|
||
<div class="form-grid">
|
||
<label>姓名<input name="姓名"></label>
|
||
<label>性别<input name="性别"></label>
|
||
<label>年龄<input name="年龄"></label>
|
||
<label>住院号<input name="住院号"></label>
|
||
</div>
|
||
<label>诊断<textarea name="诊断" rows="4"></textarea></label>
|
||
<div class="form-grid">
|
||
<label>入院时间<input name="入院时间"></label>
|
||
<label>最后书写时间<input name="最后书写时间"></label>
|
||
<label>住院天数<input name="住院天数"></label>
|
||
<label>出院时间<input name="出院时间"></label>
|
||
</div>
|
||
<label>手术后天数(格式为 空 或 后X天)<input name="手术后天数"></label>
|
||
<div id="reviewChangeLog" class="change-log review-change-log"></div>
|
||
<label>复核备注<textarea id="manualNote" rows="3"></textarea></label>
|
||
<div class="button-row review-actions">
|
||
<button type="submit" class="primary-button">保存确认</button>
|
||
<button type="button" id="resetButton" class="secondary-button">还原 OCR</button>
|
||
<button type="button" id="deleteButton" class="danger-button">删除修订</button>
|
||
</div>
|
||
</form>
|
||
</section>
|
||
</main>
|
||
|
||
<main id="auditView" class="page-view hidden audit-view">
|
||
<section class="audit-toolbar">
|
||
<label class="inline-field">
|
||
<span class="field-prefix">数据源:</span>
|
||
<select id="auditSource">
|
||
<option value="manual_review_passed">已处理-人工复核通过项</option>
|
||
<option value="db_auto_passed">数据库-自动复核通过</option>
|
||
</select>
|
||
</label>
|
||
<label class="inline-field">
|
||
<span class="field-prefix">数量:</span>
|
||
<input id="auditCount" type="number" min="1" max="20" value="5">
|
||
</label>
|
||
<button id="auditSampleButton" class="primary-button" type="button">随机抽取</button>
|
||
<div class="ai-action-panel audit-ai-panel">
|
||
<div class="ai-action-title"><span class="ai-badge">AI</span><span>智能抽查</span></div>
|
||
<div class="ai-action-buttons">
|
||
<button id="auditKimiButton" class="secondary-button ai-button" type="button">AI抽查当前项</button>
|
||
<button id="auditKimiAllButton" class="secondary-button ai-button" type="button">AI抽查所有项</button>
|
||
</div>
|
||
</div>
|
||
<span id="auditState" class="save-state"></span>
|
||
</section>
|
||
<section class="audit-layout">
|
||
<div id="auditList" class="queue-list"></div>
|
||
<div class="audit-detail">
|
||
<div class="record-strip">
|
||
<div>
|
||
<div id="auditTitle" class="record-title">未选择抽查记录</div>
|
||
<div id="auditMeta" class="record-meta"></div>
|
||
</div>
|
||
<a id="auditFullImageLink" class="ghost-button" target="_blank" rel="noreferrer">原图</a>
|
||
</div>
|
||
<div class="crop-frame audit-frame" id="auditFrame">
|
||
<div class="audit-image-stage">
|
||
<img id="auditImage" alt="抽查截图" draggable="false">
|
||
</div>
|
||
</div>
|
||
<div class="zoom-actions">
|
||
<button id="auditZoomOutButton" class="ghost-button" type="button">缩小</button>
|
||
<button id="auditZoomResetButton" class="ghost-button" type="button">恢复尺寸</button>
|
||
<button id="auditZoomInButton" class="ghost-button" type="button">放大</button>
|
||
<span id="auditZoomLabel" class="queue-meta">100%</span>
|
||
</div>
|
||
<section class="model-label ai-result-section">
|
||
<span>AI结论与建议</span>
|
||
<div id="auditModelResult" class="model-result"></div>
|
||
</section>
|
||
<details id="auditPromptDetails" class="ai-full-output ai-prompt-output">
|
||
<summary>询问提示词</summary>
|
||
<pre id="auditPromptText"></pre>
|
||
</details>
|
||
<details id="auditRawOutputDetails" class="ai-full-output">
|
||
<summary>AI完整输出</summary>
|
||
<pre id="auditRawOutput"></pre>
|
||
</details>
|
||
<textarea id="auditPrompt" class="hidden" readonly></textarea>
|
||
</div>
|
||
<aside class="audit-side">
|
||
<h2>患者信息修订</h2>
|
||
<div id="auditPatientInfo" class="audit-edit-grid"></div>
|
||
<div id="auditTipsBox" class="tips-box"></div>
|
||
<div id="auditChangeLog" class="change-log"></div>
|
||
<input id="auditMachineVerdict" type="hidden" value="">
|
||
<div class="audit-verdict-grid">
|
||
<span>AI核验判断</span>
|
||
<strong id="auditMachineVerdictText">未判断</strong>
|
||
<span>人工核验判断</span>
|
||
<strong id="auditManualVerdictText">未选择</strong>
|
||
</div>
|
||
<label>人工反馈<textarea id="auditManualFeedback" rows="4"></textarea></label>
|
||
<div class="settings-label">人工核验判断</div>
|
||
<div class="button-row">
|
||
<button id="auditPassButton" class="primary-button" type="button">人工核验通过</button>
|
||
<button id="auditFailButton" class="danger-button" type="button">人工核验异常</button>
|
||
<button id="auditUnsureButton" class="secondary-button" type="button">暂不确定</button>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
</main>
|
||
|
||
<main id="auditHistoryView" class="page-view hidden audit-view audit-history-view">
|
||
<section class="audit-toolbar audit-history-toolbar">
|
||
<button id="auditHistoryRefreshButton" class="primary-button" type="button">刷新抽查记录</button>
|
||
<span id="auditHistoryState" class="save-state"></span>
|
||
</section>
|
||
<section class="audit-layout audit-history-layout">
|
||
<aside class="audit-history-left">
|
||
<div class="audit-history-filters">
|
||
<label class="inline-field">
|
||
<span class="field-prefix">数据源:</span>
|
||
<select id="auditHistorySourceFilter">
|
||
<option value="">全部抽查源</option>
|
||
<option value="manual_review_passed">已处理-人工复核通过项</option>
|
||
<option value="db_auto_passed">数据库-自动复核通过</option>
|
||
</select>
|
||
</label>
|
||
<label class="inline-field">
|
||
<span class="field-prefix">状态:</span>
|
||
<select id="auditHistoryStatusFilter">
|
||
<option value="">全部状态</option>
|
||
<option value="manual_pending">未人工核验</option>
|
||
<option value="manual_passed">人工核验通过</option>
|
||
<option value="manual_failed">人工核验异常</option>
|
||
<option value="manual_unsure">暂不确定</option>
|
||
<option value="ai_failed">AI核验异常</option>
|
||
</select>
|
||
</label>
|
||
<label class="inline-field">
|
||
<span class="field-prefix">排序:</span>
|
||
<select id="auditHistorySortFilter">
|
||
<option value="checked_desc">最近抽查优先</option>
|
||
<option value="checked_asc">最早抽查优先</option>
|
||
</select>
|
||
</label>
|
||
<label class="inline-field">
|
||
<span class="field-prefix">搜索:</span>
|
||
<input id="auditHistorySearchInput" placeholder="姓名/住院号/科室">
|
||
</label>
|
||
</div>
|
||
<div id="auditHistoryList" class="queue-list"></div>
|
||
</aside>
|
||
<div class="audit-detail">
|
||
<div class="record-strip">
|
||
<div>
|
||
<div id="auditHistoryTitle" class="record-title">未选择抽查记录</div>
|
||
<div id="auditHistoryMeta" class="record-meta"></div>
|
||
</div>
|
||
<a id="auditHistoryFullImageLink" class="ghost-button" target="_blank" rel="noreferrer">原图</a>
|
||
</div>
|
||
<div class="crop-frame audit-frame" id="auditHistoryFrame">
|
||
<div class="audit-image-stage">
|
||
<img id="auditHistoryImage" alt="抽查截图" draggable="false">
|
||
</div>
|
||
</div>
|
||
<div class="zoom-actions">
|
||
<button id="auditHistoryZoomOutButton" class="ghost-button" type="button">缩小</button>
|
||
<button id="auditHistoryZoomResetButton" class="ghost-button" type="button">恢复尺寸</button>
|
||
<button id="auditHistoryZoomInButton" class="ghost-button" type="button">放大</button>
|
||
<span id="auditHistoryZoomLabel" class="queue-meta">100%</span>
|
||
</div>
|
||
<section class="model-label">
|
||
<span>AI结论与建议</span>
|
||
<div id="auditHistoryAiResult" class="model-result"></div>
|
||
</section>
|
||
<details class="ai-full-output">
|
||
<summary>AI完整输出</summary>
|
||
<pre id="auditHistoryRawOutput"></pre>
|
||
</details>
|
||
</div>
|
||
<aside class="audit-side">
|
||
<h2>最终审核</h2>
|
||
<div id="auditHistoryPatientInfo" class="audit-edit-grid"></div>
|
||
<div id="auditHistoryTipsBox" class="tips-box"></div>
|
||
<div id="auditHistoryChangeLog" class="change-log"></div>
|
||
<div class="audit-verdict-grid">
|
||
<span>AI核验判断</span>
|
||
<strong id="auditHistoryAiVerdict"></strong>
|
||
<span>人工核验判断</span>
|
||
<strong id="auditHistoryManualVerdict"></strong>
|
||
<span>抽查源</span>
|
||
<strong id="auditHistorySource"></strong>
|
||
<span>操作人</span>
|
||
<strong id="auditHistoryUser"></strong>
|
||
<span>抽查时间</span>
|
||
<strong id="auditHistoryCheckedAt"></strong>
|
||
</div>
|
||
<div class="settings-label">最终人工核验判断</div>
|
||
<div class="button-row">
|
||
<button id="auditHistoryPassButton" class="primary-button" type="button">人工核验通过</button>
|
||
<button id="auditHistoryFailButton" class="danger-button" type="button">人工核验异常</button>
|
||
<button id="auditHistoryUnsureButton" class="secondary-button" type="button">暂不确定</button>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
</main>
|
||
|
||
<main id="settingsView" class="page-view hidden settings-view">
|
||
<section class="settings-layout">
|
||
<section class="settings-panel user-admin-panel">
|
||
<div class="settings-heading">
|
||
<h2>用户与权限</h2>
|
||
<span id="settingsUserCount" class="badge">0 个用户</span>
|
||
</div>
|
||
<form id="userForm" class="new-user-form">
|
||
<div class="settings-form-grid">
|
||
<label>新用户名<input id="newUsername" autocomplete="off"></label>
|
||
<label>密码<input id="newPassword" type="password" autocomplete="new-password"></label>
|
||
</div>
|
||
<div>
|
||
<div class="settings-label">页面权限</div>
|
||
<div id="newUserPermissions" class="permission-grid"></div>
|
||
</div>
|
||
<button class="primary-button" type="submit">新建用户</button>
|
||
</form>
|
||
<div id="userList" class="settings-list"></div>
|
||
</section>
|
||
|
||
<aside class="settings-side">
|
||
<form id="kimiForm" class="settings-panel">
|
||
<div class="settings-heading">
|
||
<h2>抽查大模型 API</h2>
|
||
<button id="kimiToggleButton" class="secondary-button compact-button" type="button">关闭API</button>
|
||
</div>
|
||
<label>Kimi API Key<input id="kimiApiKey" type="password" autocomplete="off"></label>
|
||
<label>模型<input id="kimiModel" value="kimi-k2.6"></label>
|
||
<button class="primary-button" type="submit">保存 Kimi 设置</button>
|
||
<div id="settingsState" class="save-state"></div>
|
||
</form>
|
||
<section class="settings-panel">
|
||
<div class="settings-heading">
|
||
<h2>处理项寻找</h2>
|
||
</div>
|
||
<p class="settings-note">进入系统时会自动扫描一次,查找复核、抽查和同步里仍需处理的数据。</p>
|
||
<div id="processingFinderGrid" class="finder-grid"></div>
|
||
<button id="processingFindButton" class="secondary-button" type="button">重新寻找处理项</button>
|
||
<div id="processingFinderState" class="save-state"></div>
|
||
</section>
|
||
<section class="settings-panel">
|
||
<div class="settings-heading">
|
||
<h2>数据提交</h2>
|
||
</div>
|
||
<p class="settings-note">将已人工复核通过的修订写入合并结果文件,重试同步数据库,并把这些条目归档隐藏。</p>
|
||
<button id="commitManualPassedButton" class="primary-button" type="button">提交已人工通过数据</button>
|
||
<div id="commitManualPassedState" class="save-state"></div>
|
||
</section>
|
||
<section class="settings-panel">
|
||
<div class="settings-heading">
|
||
<h2>抽查记录管理</h2>
|
||
</div>
|
||
<p class="settings-note">清空数据库中的抽查一览结果,不影响患者基础信息和复核修订。</p>
|
||
<button id="resetAuditHistoryButton" class="danger-button" type="button">重置抽查一览</button>
|
||
<div id="resetAuditHistoryState" class="save-state"></div>
|
||
</section>
|
||
</aside>
|
||
</section>
|
||
</main>
|
||
|
||
<script src="/static/app.js"></script>
|
||
</body>
|
||
</html>
|