Import sanitized HIS processing tools
This commit is contained in:
4
患者列表处理/人工复核网页端/.dockerignore
Normal file
4
患者列表处理/人工复核网页端/.dockerignore
Normal file
@@ -0,0 +1,4 @@
|
||||
.env
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*.log
|
||||
15
患者列表处理/人工复核网页端/.env.example
Normal file
15
患者列表处理/人工复核网页端/.env.example
Normal file
@@ -0,0 +1,15 @@
|
||||
REVIEW_APP_USERNAME=admin
|
||||
REVIEW_APP_PASSWORD=change-me
|
||||
REVIEW_APP_SECRET_KEY=change-me-to-a-random-string
|
||||
REVIEW_APP_PORT=8090
|
||||
REVIEW_POSTGRES_SYNC=1
|
||||
KIMI_API_KEY=change-me
|
||||
KIMI_API_ENABLED=1
|
||||
KIMI_MODEL=kimi-k2.6
|
||||
KIMI_TIMEOUT_SECONDS=120
|
||||
KIMI_IMAGE_MAX_WIDTH=1200
|
||||
KIMI_AUDIT_MAX_TOKENS=768
|
||||
KIMI_CORRECTION_MAX_TOKENS=768
|
||||
|
||||
# Docker 内默认挂载项目根目录到 /workspace;本机直接运行时可改为项目根目录。
|
||||
WORKSPACE_ROOT=/workspace
|
||||
17
患者列表处理/人工复核网页端/Dockerfile
Normal file
17
患者列表处理/人工复核网页端/Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
FROM python:3.12-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY app.py ./app.py
|
||||
COPY templates ./templates
|
||||
COPY static ./static
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app", "--workers", "2", "--threads", "4", "--timeout", "180"]
|
||||
62
患者列表处理/人工复核网页端/README.md
Normal file
62
患者列表处理/人工复核网页端/README.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# HIS 患者列表人工复核网页端
|
||||
|
||||
用于查看 `复核报告.json` 中的待处理记录,按原图行号生成局部截图,保存人工修订到 `数据处理工作区/03_人工复核修正.json`。
|
||||
|
||||
## 配置
|
||||
|
||||
在项目根目录 `.env` 中增加:
|
||||
|
||||
```bash
|
||||
REVIEW_APP_USERNAME=admin
|
||||
REVIEW_APP_PASSWORD=请填写本地登录密码
|
||||
REVIEW_APP_SECRET_KEY=请填写随机字符串
|
||||
REVIEW_APP_PORT=8090
|
||||
KIMI_API_KEY=请填写Kimi或Moonshot API Key
|
||||
KIMI_MODEL=kimi-k2.6
|
||||
```
|
||||
|
||||
如果未设置 `REVIEW_APP_PASSWORD`,程序会回退使用 `HIS_DB_PASSWORD` 作为登录密码。
|
||||
|
||||
默认启用 PostgreSQL 联动,保存或删除人工修订时会先按 `image_path + image_row_no` 更新 `"Patient_Lists"` 对应记录;如果合并去重后正式表只保留了同住院号的另一条记录,会继续按 `inpatient_no` 匹配更新。PostgreSQL 暂不可用时,本地修订不会丢失,会写入待同步状态,恢复连接后点击“提交待同步”即可补交。需要临时关闭时可设置:
|
||||
|
||||
```bash
|
||||
REVIEW_POSTGRES_SYNC=0
|
||||
```
|
||||
|
||||
## Docker 启动
|
||||
|
||||
```bash
|
||||
cd 人工复核网页端
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
访问:
|
||||
|
||||
```text
|
||||
http://127.0.0.1:8090
|
||||
```
|
||||
|
||||
## 复核后重建
|
||||
|
||||
网页保存后,人工修订会写入:
|
||||
|
||||
```text
|
||||
数据处理工作区/03_人工复核修正.json
|
||||
```
|
||||
|
||||
之后对相应批次运行 `02_患者列表OCR归档.py --rebuild-from-cache`,再执行合并和入库脚本即可。
|
||||
|
||||
出院时间默认允许为空;确有出院时间时,网页端会校验时间格式以及是否早于入院时间。
|
||||
PostgreSQL 中也已加入对应约束:空出院时间放行;入院时间晚于出院时间时,该记录必须保持 `需人工复核` 状态。
|
||||
|
||||
时间字段支持输入 `2021-11-24 9:46:59`、`2021-12-8 9:38:00` 这类单数字月、日、小时格式;网页端和后端保存时会统一补全为 `YYYY-MM-DD HH:MM:SS`。
|
||||
|
||||
保存前如果仍有校验提示,网页会弹窗确认是否继续保存;无提示保存成功后会自动切到下一条待处理记录。
|
||||
|
||||
页面右上角会显示 PostgreSQL 连接状态,也会每 20 秒自动检测一次;如果本地修订保存成功但数据库同步失败,会标记为待同步,之后点击“提交待同步”可重新提交。提交后会汇总成功、未匹配、失败数量,未成功项可选择保留或从待同步列表删除。
|
||||
|
||||
字段顺序固定为:入院时间、最后书写时间、住院天数、出院时间。字段校验提示统一显示在截图下方,右侧编辑区不再重复显示。截图区支持鼠标滚轮缩放,“恢复尺寸”会回到图片原始大小。
|
||||
|
||||
抽查页会随机抽取患者行,调用 Kimi 多模态模型核对裁剪截图与结构化字段;抽查结论、AI 反馈、人工反馈直接写入 PostgreSQL 的 `audit_*` 字段,可在“抽查查看”页回看。复核页也可以调用“Kimi自动修改当前项/5项”,生成的内容会标记为 `AI修改-待确认`,不会进入待同步;人工点击“保存确认”后才会作为正式修订同步数据库。
|
||||
|
||||
设置页可新增网页端用户,为每个配置用户单独设置是否能看到概览、复核、抽查、抽查查看、设置,也可修改抽查模型和 API Key。设置内容保存在本地 `数据处理工作区/人工复核网页端配置.json`,该文件不提交到 Git。
|
||||
2127
患者列表处理/人工复核网页端/app.py
Normal file
2127
患者列表处理/人工复核网页端/app.py
Normal file
File diff suppressed because it is too large
Load Diff
19
患者列表处理/人工复核网页端/docker-compose.yml
Normal file
19
患者列表处理/人工复核网页端/docker-compose.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
name: his-list-review
|
||||
|
||||
services:
|
||||
manual-review:
|
||||
build:
|
||||
context: .
|
||||
image: his-list-manual-review:latest
|
||||
container_name: his-list-manual-review
|
||||
env_file:
|
||||
- ../.env
|
||||
environment:
|
||||
WORKSPACE_ROOT: /workspace
|
||||
REVIEW_APP_HOST: 0.0.0.0
|
||||
REVIEW_APP_PORT: 8000
|
||||
ports:
|
||||
- "${REVIEW_APP_PORT:-8090}:8000"
|
||||
volumes:
|
||||
- ..:/workspace
|
||||
restart: unless-stopped
|
||||
5
患者列表处理/人工复核网页端/requirements.txt
Normal file
5
患者列表处理/人工复核网页端/requirements.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Flask==3.0.3
|
||||
gunicorn==23.0.0
|
||||
Pillow==10.4.0
|
||||
psycopg[binary]==3.2.9
|
||||
python-dotenv==1.0.1
|
||||
1339
患者列表处理/人工复核网页端/static/app.css
Normal file
1339
患者列表处理/人工复核网页端/static/app.css
Normal file
File diff suppressed because it is too large
Load Diff
2042
患者列表处理/人工复核网页端/static/app.js
Normal file
2042
患者列表处理/人工复核网页端/static/app.js
Normal file
File diff suppressed because it is too large
Load Diff
382
患者列表处理/人工复核网页端/templates/index.html
Normal file
382
患者列表处理/人工复核网页端/templates/index.html
Normal file
@@ -0,0 +1,382 @@
|
||||
<!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>
|
||||
29
患者列表处理/人工复核网页端/templates/login.html
Normal file
29
患者列表处理/人工复核网页端/templates/login.html
Normal file
@@ -0,0 +1,29 @@
|
||||
<!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 class="login-shell">
|
||||
<main class="login-panel">
|
||||
<div class="login-mark">HIS</div>
|
||||
<h1>患者目录图片集群人工复核及抽查</h1>
|
||||
<form method="post" class="login-form">
|
||||
<label>
|
||||
账号
|
||||
<input name="username" autocomplete="username" autofocus>
|
||||
</label>
|
||||
<label>
|
||||
密码
|
||||
<input name="password" type="password" autocomplete="current-password">
|
||||
</label>
|
||||
{% if error %}
|
||||
<div class="form-error">{{ error }}</div>
|
||||
{% endif %}
|
||||
<button type="submit">登录</button>
|
||||
</form>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user