feat:健康体检后台检后新增影像数据管理;基础配置中新增前置服务器菜单

This commit is contained in:
fengpu
2026-09-18 17:44:26 +08:00
parent b0479ee9d1
commit 63407a20c2
13 changed files with 102 additions and 408 deletions
+27 -2
View File
@@ -219,6 +219,7 @@ const SITE_MAP = [
{ file:'config-standard-category.html', label:'体检项目分类' },
{ file:'config-standard-basic.html', label:'体检基本项目' },
{ file:'config-standard-hospital.html', label:'医院体检项目' },
{ file:'agent-device.html', label:'前置机管理' },
{ file:'pre-hospital-scope.html', label:'医院承检范围' },
{ file:'pre-plan.html', label:'单位体检计划管理' },
{ file:'pre-quota-group.html', label:'群体额度配置' },
@@ -275,7 +276,6 @@ const SITE_MAP = [
{ file:'post-imc-class.html', label:'用户影像文件分类' },
{ file:'post-imc-info.html', label:'用户影像文件详细' },
{ file:'post-imc-log.html', label:'文件处理日志' },
{ file:'agent-device.html', label:'前置机管理 · 常规体检前置服务' },
{ file:'exception-dirty.html', label:'系统脏数据' },
{ file:'exception-result.html', label:'结果异常' }
]},
@@ -837,7 +837,7 @@ const SITE_MAP = [
{ file:'phone-list.html', label:'手机号' }
]}
]},
{ id:'emergency-app', label:'健康应急 APP', icon:'emergency', color:'#ffc069',
{ id:'emergency-app', label:'健康服务 APP', icon:'emergency', color:'#ffc069',
roles:[
{ role:'咨询专家', id:'expert', modules:[
{ name:'工作台', dir:'emergency-app/expert/workbench', prd:'emergency-app/expert/doc/PRD.md', done:true, pages:[
@@ -956,6 +956,31 @@ const SITE_MAP = [
{file:'index.html',label:'个人中心'},
{file:'edit-profile.html',label:'修改个人信息'},{file:'change-pwd.html',label:'修改密码'}
]}
]},
{ role:'营养师', id:'nutritionist', modules:[
{name:'工作台',dir:'emergency-app/nutritionist/workbench',pages:[
{file:'index.html',label:'工作台首页'},
{file:'consult-chat.html',label:'营养咨询聊天'},
{file:'consult-chat-done.html',label:'营养咨询聊天(已结束)'},
{file:'employee-list.html',label:'员工营养管理'},
{file:'employee-detail.html',label:'员工营养详情'},
{file:'employee-health.html',label:'员工健康档案'},
{file:'employee-diet-history.html',label:'员工饮食记录'},
{file:'plan-detail.html',label:'营养方案详情'},
{file:'recipe-list.html',label:'我的食谱'},
{file:'recipe-create.html',label:'制定食谱'},
{file:'recipe-detail.html',label:'食谱详情'}
]},
{name:'知识库',dir:'emergency-app/nutritionist/knowledge',pages:[
{file:'index.html',label:'知识库首页'},{file:'detail.html',label:'知识详情'}
]},
{name:'我的',dir:'emergency-app/nutritionist/profile',pages:[
{file:'index.html',label:'个人中心'},
{file:'edit-profile.html',label:'编辑资料'},
{file:'schedule.html',label:'排班设置'},
{file:'stats.html',label:'营养咨询统计'},
{file:'change-pwd.html',label:'修改密码'}
]}
]}
],
shared:[
+56 -4
View File
@@ -33,6 +33,15 @@
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
.sidebar-item.active{color:#fff;background:var(--primary);}
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;user-select:none;}
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);background:rgba(255,255,255,0.04);}
.sidebar-subgroup__header .arrow{width:10px;height:10px;transition:transform .2s;flex-shrink:0;}
.sidebar-subgroup__header .arrow path{stroke:rgba(255,255,255,0.45);}
.sidebar-subgroup.open>.sidebar-subgroup__header{color:rgba(255,255,255,0.85);}
.sidebar-subgroup.open>.sidebar-subgroup__header .arrow{transform:rotate(90deg);}
.sidebar-subgroup__body{display:none;padding-left:16px;}
.sidebar-subgroup.open>.sidebar-subgroup__body{display:block;}
.sidebar-subgroup__body .sidebar-item{padding-left:36px;font-size:12px;}
/* 主内容 */
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
/* 按钮行 */
@@ -168,11 +177,10 @@
</div>
<nav class="top-bar__nav">
<a href="archive-personal.html">档案</a>
<a href="config-material-notice.html">基础配置</a>
<a href="config-material-notice.html" class="active">基础配置</a>
<a href="pre-hospital-scope.html">检前</a>
<a href="mid-appointment-track.html">检中</a>
<a href="post-unit-count.html">检后</a>
<a href="agent-device.html" class="active">前置机管理</a>
<a href="exception-dirty.html">异常事件</a>
</nav>
<div class="top-bar__right">
@@ -187,8 +195,40 @@
<!-- 侧边栏 -->
<aside class="sidebar">
<div class="sidebar-menu__title">前置机管理</div>
<a href="agent-device.html" class="sidebar-item active">常规体检前置服务</a>
<div class="sidebar-menu__title">基础配置</div>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
素材信息
</div>
<div class="sidebar-subgroup__body">
<a href="config-material-notice.html" class="sidebar-item">体检须知</a>
<a href="config-material-video.html" class="sidebar-item">操作说明</a>
</div>
</div>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
医院配置
</div>
<div class="sidebar-subgroup__body">
<a href="config-hospital-basic.html" class="sidebar-item">基本信息配置</a>
<a href="config-hospital-combo.html" class="sidebar-item">检查项组合配置</a>
</div>
</div>
<a href="config-report-template.html" class="sidebar-item">体检导入模板管理</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
体检标准化项目
</div>
<div class="sidebar-subgroup__body">
<a href="config-standard-category.html" class="sidebar-item">体检项目分类</a>
<a href="config-standard-basic.html" class="sidebar-item">体检基本项目</a>
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item active">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -726,6 +766,18 @@ datasource:
<div class="toast" id="toast"></div>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');
}
/* 页面加载时自动展开当前页面所在的子分组 */
(function(){
var active=document.querySelector('.sidebar-item.active');
if(!active)return;
var sub=active.closest('.sidebar-subgroup');
if(sub)sub.classList.add('open');
})();
/* 弹窗开关 */
function openModal(id){ document.getElementById(id).classList.add('open'); }
function closeModal(id){ document.getElementById(id).classList.remove('open'); }
@@ -204,6 +204,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -171,6 +171,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -166,6 +166,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -198,6 +198,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -208,6 +208,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -215,6 +215,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -219,6 +219,7 @@
<a href="config-standard-hospital.html" class="sidebar-item">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
@@ -160,6 +160,7 @@
<a href="config-standard-hospital.html" class="sidebar-item active">医院体检项目</a>
</div>
</div>
<a href="agent-device.html" class="sidebar-item">前置机管理</a>
</aside>
<!-- 主内容 -->
+3 -152
View File
@@ -256,19 +256,7 @@
</div>
<div style="display:flex;gap:12px;margin-bottom:16px;align-items:center;">
<button class="btn btn-primary" onclick="openForm(null)">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>
新增
</button>
<button class="btn btn-default" onclick="exportList()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v7M4 6l3 3 3-3M2 12.5h10" stroke="#666" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出
</button>
<button class="btn btn-default" onclick="importList()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 9V2M4 5l3-3 3 3M2 12.5h10" stroke="#666" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导入
</button>
<button class="btn btn-default" onclick="batchDelete()" style="margin-left:auto;">
<button class="btn btn-default" onclick="batchDelete()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 3.5h10M5.5 3.5V2h3v1.5M3.5 3.5l.7 8.5h5.6l.7-8.5" stroke="#666" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
批量删除
</button>
@@ -300,85 +288,6 @@
</div>
</main>
<div class="modal-mask" id="formMask" onclick="if(event.target===this)closeForm()">
<div class="modal">
<div class="modal__header">
<span class="modal__close" onclick="closeForm()">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3.5 3.5l9 9M12.5 3.5l-9 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
</span>
<span class="modal__title" id="formTitle">新增用户影像文件分类</span>
</div>
<div class="modal__body">
<div class="form-item">
<div class="form-label">用户体检信息ID</div>
<input class="form-input" id="formMuid" type="text" placeholder="请输入用户体检信息ID">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 影像分类</div>
<select class="form-select" id="formImgclass">
<option value="超声">超声</option>
<option value="CT">CT</option>
<option value="MRI">MRI</option>
<option value="X射线">X射线</option>
<option value="心电">心电</option>
</select>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 检查项目名称</div>
<input class="form-input" id="formName" type="text" placeholder="请输入检查项目名称">
</div>
<div class="form-item">
<div class="form-label">影像文件类型</div>
<select class="form-select" id="formImgtype">
<option value="非DICOM">非DICOM</option>
<option value="dic">dic</option>
<option value="dcm">dcm</option>
</select>
</div>
<div class="form-item">
<div class="form-label">报告文件类型</div>
<select class="form-select" id="formReptype">
<option value="png">png</option>
<option value="jpg">jpg</option>
<option value="pdf">pdf</option>
</select>
</div>
<div class="form-item">
<div class="form-label">处理状态</div>
<select class="form-select" id="formStatus">
<option value="1">新建</option>
<option value="2">待解析</option>
<option value="3">失败</option>
<option value="4">解析中</option>
<option value="5">成功</option>
<option value="6">失败待重试</option>
<option value="7">最终失败</option>
</select>
</div>
<div class="form-item">
<div class="form-label">检查结果</div>
<textarea class="form-textarea" id="formContent" placeholder="请输入检查结果"></textarea>
</div>
<div class="form-item">
<div class="form-label">错误信息</div>
<textarea class="form-textarea" id="formMsg" placeholder="请输入错误信息"></textarea>
</div>
<div class="form-item">
<div class="form-label">出报告时间</div>
<input class="form-input" id="formReportdate" type="text" placeholder="如 2026-08-15 12:00:00">
</div>
<div class="form-item">
<div class="form-label">创建日期</div>
<input class="form-input" id="formCreatetime" type="text" placeholder="如 2026-08-15 11:30:00">
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeForm()">取消</button>
<button class="btn btn-primary" onclick="saveForm()">保存</button>
</div>
</div>
</div>
<div class="modal-mask" id="detailMask" onclick="if(event.target===this)closeDetail()">
<div class="modal">
<div class="modal__header">
@@ -460,7 +369,7 @@ function renderTable(){
+'<td>'+r.imgClass+'</td><td>'+r.name+'</td><td>'+r.imgType+'</td><td>'+r.repType+'</td>'
+'<td>'+statusTag(r.status)+'</td><td style="text-align:left;">'+content+'</td><td style="text-align:left;">'+msg+'</td>'
+'<td>'+(r.reportDate||'<span class="muted">—</span>')+'</td><td>'+r.createTime+'</td>'
+'<td><span class="link" onclick="openForm('+idx+')">编辑</span> <span class="link" style="margin-left:8px;" onclick="openDetail('+idx+')">详情</span> <span class="link-danger" style="margin-left:8px;" onclick="deleteRow('+idx+')">删除</span></td>'
+'<td><span class="link" onclick="openDetail('+idx+')">详情</span> <span class="link-danger" style="margin-left:8px;" onclick="deleteRow('+idx+')">删除</span></td>'
+'</tr>';
}).join(''):'<tr><td colspan="12"><div class="empty-tip">暂无数据</div></td></tr>';
var all=tbody.querySelectorAll('.row-check');
@@ -524,64 +433,6 @@ function deleteRow(idx){
rows.splice(idx,1);
renderTable();
}
function exportList(){alert('导出当前筛选结果(Excel');}
function importList(){alert('导入影像文件分类数据(Excel');}
var editingIdx=null;
function openForm(idx){
editingIdx=idx;
document.getElementById('formTitle').textContent=idx===null?'新增用户影像文件分类':'编辑用户影像文件分类';
if(idx===null){
document.getElementById('formMuid').value='';
document.getElementById('formImgclass').value='超声';
document.getElementById('formName').value='';
document.getElementById('formImgtype').value='dcm';
document.getElementById('formReptype').value='pdf';
document.getElementById('formStatus').value='1';
document.getElementById('formContent').value='';
document.getElementById('formMsg').value='';
document.getElementById('formReportdate').value='';
document.getElementById('formCreatetime').value='';
}else{
var r=rows[idx];
document.getElementById('formMuid').value=r.muId;
document.getElementById('formImgclass').value=r.imgClass;
document.getElementById('formName').value=r.name;
document.getElementById('formImgtype').value=r.imgType;
document.getElementById('formReptype').value=r.repType;
document.getElementById('formStatus').value=String(r.status);
document.getElementById('formContent').value=r.content;
document.getElementById('formMsg').value=r.msg;
document.getElementById('formReportdate').value=r.reportDate;
document.getElementById('formCreatetime').value=r.createTime;
}
document.getElementById('formMask').classList.add('open');
}
function closeForm(){document.getElementById('formMask').classList.remove('open');}
function saveForm(){
var name=document.getElementById('formName').value.trim();
if(!name){alert('请输入检查项目名称');return;}
var data={
imgClass:document.getElementById('formImgclass').value,
name:name,
imgType:document.getElementById('formImgtype').value,
repType:document.getElementById('formReptype').value,
status:parseInt(document.getElementById('formStatus').value,10),
content:document.getElementById('formContent').value.trim(),
msg:document.getElementById('formMsg').value.trim(),
reportDate:document.getElementById('formReportdate').value.trim(),
createTime:document.getElementById('formCreatetime').value.trim(),
muId:document.getElementById('formMuid').value.trim()
};
if(editingIdx===null){
rows.unshift(data);
}else{
rows[editingIdx]=data;
}
closeForm();
renderTable();
}
function openDetail(idx){
var r=rows[idx];
document.getElementById('detailBody').innerHTML=
@@ -601,7 +452,7 @@ function openDetail(idx){
}
function closeDetail(){document.getElementById('detailMask').classList.remove('open');}
document.addEventListener('keydown',function(e){
if(e.key==='Escape'){closeForm();closeDetail();}
if(e.key==='Escape'){closeDetail();}
});
function toggleSubgroup(header){
+3 -133
View File
@@ -241,19 +241,7 @@
</div>
<div style="display:flex;gap:12px;margin-bottom:16px;align-items:center;">
<button class="btn btn-primary" onclick="openForm(null)">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>
新增
</button>
<button class="btn btn-default" onclick="exportList()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v7M4 6l3 3 3-3M2 12.5h10" stroke="#666" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出
</button>
<button class="btn btn-default" onclick="importList()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 9V2M4 5l3-3 3 3M2 12.5h10" stroke="#666" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导入
</button>
<button class="btn btn-default" onclick="batchDelete()" style="margin-left:auto;">
<button class="btn btn-default" onclick="batchDelete()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 3.5h10M5.5 3.5V2h3v1.5M3.5 3.5l.7 8.5h5.6l.7-8.5" stroke="#666" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
批量删除
</button>
@@ -285,66 +273,6 @@
</div>
</main>
<div class="modal-mask" id="formMask" onclick="if(event.target===this)closeForm()">
<div class="modal">
<div class="modal__header">
<span class="modal__close" onclick="closeForm()">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3.5 3.5l9 9M12.5 3.5l-9 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
</span>
<span class="modal__title" id="formTitle">新增用户影像文件详细</span>
</div>
<div class="modal__body">
<div class="form-item">
<div class="form-label">用户影像文件分类ID</div>
<input class="form-input" id="formMuicid" type="text" placeholder="请输入用户影像文件分类ID">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 文件类型</div>
<select class="form-select" id="formFiletype">
<option value="影像">影像</option>
<option value="报告">报告</option>
</select>
</div>
<div class="form-item">
<div class="form-label">影像序号</div>
<input class="form-input" id="formImageno" type="text" placeholder="请输入影像序号">
</div>
<div class="form-item">
<div class="form-label">错误信息</div>
<textarea class="form-textarea" id="formMsg" placeholder="请输入错误信息"></textarea>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 文件地址</div>
<input class="form-input" id="formFileurl" type="text" placeholder="请输入文件地址">
</div>
<div class="form-item">
<div class="form-label">dcm实例ID</div>
<input class="form-input" id="formInsid" type="text" placeholder="请输入dcm实例ID">
</div>
<div class="form-item">
<div class="form-label">研究实例ID</div>
<input class="form-input" id="formStudyins" type="text" placeholder="请输入研究实例ID">
</div>
<div class="form-item">
<div class="form-label">患者ID</div>
<input class="form-input" id="formPatient" type="text" placeholder="请输入患者ID">
</div>
<div class="form-item">
<div class="form-label">研究ID</div>
<input class="form-input" id="formStudyid" type="text" placeholder="请输入研究ID">
</div>
<div class="form-item">
<div class="form-label">创建日期</div>
<input class="form-input" id="formCreatetime" type="text" placeholder="如 2026-08-15 11:30:00">
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeForm()">取消</button>
<button class="btn btn-primary" onclick="saveForm()">保存</button>
</div>
</div>
</div>
<div class="modal-mask" id="detailMask" onclick="if(event.target===this)closeDetail()">
<div class="modal">
<div class="modal__header">
@@ -418,7 +346,7 @@ function renderTable(){
+'<td><span class="link" onclick="downloadFile(\''+r.fileUrl+'\')">下载</span></td>'
+'<td>'+(r.insId||'<span class="muted">—</span>')+'</td><td>'+r.studyInsId+'</td><td>'+(r.patientId||'<span class="muted">—</span>')+'</td>'
+'<td>'+r.studyId+'</td><td>'+r.createTime+'</td>'
+'<td><span class="link" onclick="openForm('+idx+')">编辑</span> <span class="link" style="margin-left:8px;" onclick="openDetail('+idx+')">详情</span> <span class="link-danger" style="margin-left:8px;" onclick="deleteRow('+idx+')">删除</span></td>'
+'<td><span class="link" onclick="openDetail('+idx+')">详情</span> <span class="link-danger" style="margin-left:8px;" onclick="deleteRow('+idx+')">删除</span></td>'
+'</tr>';
}).join(''):'<tr><td colspan="12"><div class="empty-tip">暂无数据</div></td></tr>';
var all=tbody.querySelectorAll('.row-check');
@@ -485,64 +413,6 @@ function deleteRow(idx){
rows.splice(idx,1);
renderTable();
}
function exportList(){alert('导出当前筛选结果(Excel');}
function importList(){alert('导入影像文件详细数据(Excel');}
var editingIdx=null;
function openForm(idx){
editingIdx=idx;
document.getElementById('formTitle').textContent=idx===null?'新增用户影像文件详细':'编辑用户影像文件详细';
if(idx===null){
document.getElementById('formMuicid').value='';
document.getElementById('formFiletype').value='影像';
document.getElementById('formImageno').value='';
document.getElementById('formMsg').value='';
document.getElementById('formFileurl').value='';
document.getElementById('formInsid').value='';
document.getElementById('formStudyins').value='';
document.getElementById('formPatient').value='';
document.getElementById('formStudyid').value='';
document.getElementById('formCreatetime').value='';
}else{
var r=rows[idx];
document.getElementById('formMuicid').value=r.muicId;
document.getElementById('formFiletype').value=r.fileType;
document.getElementById('formImageno').value=r.imageNo;
document.getElementById('formMsg').value=r.msg;
document.getElementById('formFileurl').value=r.fileUrl;
document.getElementById('formInsid').value=r.insId;
document.getElementById('formStudyins').value=r.studyInsId;
document.getElementById('formPatient').value=r.patientId;
document.getElementById('formStudyid').value=r.studyId;
document.getElementById('formCreatetime').value=r.createTime;
}
document.getElementById('formMask').classList.add('open');
}
function closeForm(){document.getElementById('formMask').classList.remove('open');}
function saveForm(){
var fileUrl=document.getElementById('formFileurl').value.trim();
if(!fileUrl){alert('请输入文件地址');return;}
var data={
muicId:document.getElementById('formMuicid').value.trim(),
fileType:document.getElementById('formFiletype').value,
imageNo:document.getElementById('formImageno').value.trim(),
msg:document.getElementById('formMsg').value.trim(),
fileUrl:fileUrl,
insId:document.getElementById('formInsid').value.trim(),
studyInsId:document.getElementById('formStudyins').value.trim(),
patientId:document.getElementById('formPatient').value.trim(),
studyId:document.getElementById('formStudyid').value.trim(),
createTime:document.getElementById('formCreatetime').value.trim()
};
if(editingIdx===null){
rows.unshift(data);
}else{
rows[editingIdx]=data;
}
closeForm();
renderTable();
}
function openDetail(idx){
var r=rows[idx];
document.getElementById('detailBody').innerHTML=
@@ -562,7 +432,7 @@ function openDetail(idx){
}
function closeDetail(){document.getElementById('detailMask').classList.remove('open');}
document.addEventListener('keydown',function(e){
if(e.key==='Escape'){closeForm();closeDetail();}
if(e.key==='Escape'){closeDetail();}
});
function toggleSubgroup(header){
+5 -117
View File
@@ -313,65 +313,6 @@
</div>
</main>
<!-- 编辑弹窗 -->
<div class="modal-mask" id="formMask" onclick="if(event.target===this)closeForm()">
<div class="modal">
<div class="modal__header">
<span class="modal__close" onclick="closeForm()">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3.5 3.5l9 9M12.5 3.5l-9 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
</span>
<span class="modal__title" id="formTitle">编辑用户体检信息</span>
</div>
<div class="modal__body">
<div class="form-item">
<div class="form-label">单位信息</div>
<input class="form-input" id="formUnit" type="text" placeholder="请输入单位信息">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 姓名</div>
<input class="form-input" id="formName" type="text" placeholder="请输入姓名">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 身份证号</div>
<input class="form-input" id="formIdcard" type="text" placeholder="请输入身份证号">
</div>
<div class="form-item">
<div class="form-label">体检年份</div>
<input class="form-input" id="formYear" type="text" placeholder="请输入体检年份">
</div>
<div class="form-item">
<div class="form-label">体检编号</div>
<input class="form-input" id="formPeid" type="text" placeholder="请输入体检编号">
</div>
<div class="form-item">
<div class="form-label">医院ID</div>
<input class="form-input" id="formHospid" type="text" placeholder="请输入医院ID">
</div>
<div class="form-item">
<div class="form-label">医院名称</div>
<input class="form-input" id="formHospital" type="text" placeholder="请输入医院名称">
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeForm()">取消</button>
<button class="btn btn-primary" onclick="saveForm()">保存</button>
</div>
</div>
</div>
<!-- 详情弹窗 -->
<div class="modal-mask" id="detailMask" onclick="if(event.target===this)closeDetail()">
<div class="modal">
<div class="modal__header">
<span class="modal__close" onclick="closeDetail()">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3.5 3.5l9 9M12.5 3.5l-9 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
</span>
<span class="modal__title">用户体检信息详情</span>
</div>
<div class="modal__body" id="detailBody"></div>
</div>
</div>
<script>
/* ============ 数据 ============ */
var handleStatusMap={1:'新建',2:'待解析',3:'失败',4:'解析中',5:'成功',6:'失败待重试',7:'最终失败'};
@@ -481,7 +422,7 @@ function renderTable(){
+'</span></td>'
+'<td>'+u.unit+'</td><td>'+u.realname+'</td><td>'+u.idCard+'</td><td>'+u.medicalYear+'</td>'
+'<td>'+u.hospitalName+'</td><td>'+u.peId+'</td><td>'+u.createTime+'</td>'
+'<td><span class="link" onclick="openForm('+i+')">编辑</span> <span class="link" style="margin-left:8px;" onclick="openDetail('+i+')">详情</span> <span class="link-danger" style="margin-left:8px;" onclick="deleteRow('+i+')">删除</span></td>'
+'<td><span class="link-danger" onclick="deleteRow('+i+')">删除</span></td>'
+'</tr>';
if(isOpen)html+=renderExpandRow(i);
return html;
@@ -495,21 +436,21 @@ function renderExpandRow(i){
var u=users[i];
var body='';
if(!u.children.length){
body='<tr><td colspan="4"><div class="inner-empty" style="padding:16px 0;text-align:center;">暂无检查项目数据</div></td></tr>';
body='<tr><td colspan="5"><div class="inner-empty" style="padding:16px 0;text-align:center;">暂无检查项目数据</div></td></tr>';
}else{
body=u.children.map(function(c){
body=u.children.map(function(c,ci){
var studiesHtml=c.studies.length?c.studies.map(function(s){
return '<span class="link" style="margin-right:6px;" onclick="previewStudy(\''+s+'\')">预览</span>';
}).join(''):'<span class="inner-empty">暂无</span>';
var filesHtml=c.files.length?c.files.map(function(f){
return '<span class="link" style="margin-right:6px;" onclick="viewReport(\''+f+'\')">查看</span>';
}).join(''):'<span class="inner-empty">无文件</span>';
return '<tr><td>'+c.name+'</td><td>'+statusTag(c.status)+'</td><td>'+studiesHtml+'</td><td>'+filesHtml+'</td></tr>';
return '<tr><td>'+(ci+1)+'</td><td>'+c.name+'</td><td>'+statusTag(c.status)+'</td><td>'+studiesHtml+'</td><td>'+filesHtml+'</td></tr>';
}).join('');
}
return '<tr class="expand-row"><td colspan="11"><div class="inner-wrap">'
+'<table class="inner-table"><thead><tr>'
+'<th>检查项目名称</th><th>处理状态</th><th>影像信息</th><th>影像报告</th>'
+'<th style="width:56px;">序号</th><th>检查项目名称</th><th>处理状态</th><th>影像信息</th><th>影像报告</th>'
+'</tr></thead><tbody>'+body+'</tbody></table>'
+'</div></td></tr>';
}
@@ -588,59 +529,6 @@ function batchDelete(){
renderTable();
}
/* ============ 详情 ============ */
function openDetail(idx){
var u=users[idx];
document.getElementById('detailBody').innerHTML=
'<table class="detail-table"><tbody>'
+'<tr><th>单位信息</th><td>'+u.unit+'</td></tr>'
+'<tr><th>姓名</th><td>'+u.realname+'</td></tr>'
+'<tr><th>身份证号</th><td>'+u.idCard+'</td></tr>'
+'<tr><th>体检年份</th><td>'+u.medicalYear+'</td></tr>'
+'<tr><th>体检编号</th><td>'+u.peId+'</td></tr>'
+'<tr><th>医院ID</th><td>'+u.hospitalId+'</td></tr>'
+'<tr><th>医院名称</th><td>'+u.hospitalName+'</td></tr>'
+'</tbody></table>';
document.getElementById('detailMask').classList.add('open');
}
function closeDetail(){document.getElementById('detailMask').classList.remove('open');}
/* ============ 编辑 ============ */
var editingIdx=null;
function openForm(idx){
editingIdx=idx;
document.getElementById('formTitle').textContent='编辑用户体检信息';
var u=users[idx];
document.getElementById('formUnit').value=u.unit;
document.getElementById('formName').value=u.realname;
document.getElementById('formIdcard').value=u.idCard;
document.getElementById('formYear').value=u.medicalYear;
document.getElementById('formPeid').value=u.peId;
document.getElementById('formHospid').value=u.hospitalId;
document.getElementById('formHospital').value=u.hospitalName;
document.getElementById('formMask').classList.add('open');
}
function closeForm(){document.getElementById('formMask').classList.remove('open');}
function saveForm(){
var name=document.getElementById('formName').value.trim();
var idcard=document.getElementById('formIdcard').value.trim();
if(!name){alert('请输入姓名');return;}
if(!idcard){alert('请输入身份证号');return;}
var u=users[editingIdx];
u.unit=document.getElementById('formUnit').value.trim();
u.realname=name;
u.idCard=idcard;
u.medicalYear=document.getElementById('formYear').value.trim();
u.peId=document.getElementById('formPeid').value.trim();
u.hospitalId=document.getElementById('formHospid').value.trim();
u.hospitalName=document.getElementById('formHospital').value.trim();
closeForm();
renderTable();
}
document.addEventListener('keydown',function(e){
if(e.key==='Escape'){closeForm();closeDetail();}
});
/* ============ 通用 ============ */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');