feat:健康体检后台检后新增影像数据管理;基础配置中新增前置服务器菜单
This commit is contained in:
+27
-2
@@ -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:[
|
||||
|
||||
@@ -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>
|
||||
|
||||
<!-- 主内容 -->
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user