feat: 健康体检后台单位体检费用统计按单位×体检医院拆行
- 列表增加体检医院/签约医院列并去掉总人数列,原6条单位汇总拆为16条医院明细行 - 缺少项目弹窗增加项目费用/折扣后费用列,统计明细与员工明细的缺少项目数标蓝可点击 - 员工费用明细弹窗新增筛选栏与导出列表数据按钮 - 同步更新 PRD 与 CHANGELOG
This commit is contained in:
@@ -113,12 +113,52 @@
|
||||
.report-note{border-radius:var(--radius-sm);padding:12px 16px;font-size:var(--font-sm);line-height:1.9;margin-bottom:16px;}
|
||||
.report-note--conclusion{border:1px solid #FFD591;background:#FFF7E6;color:#873800;}
|
||||
.report-note--advice{border:1px solid #B7EB8F;background:#F6FFED;color:#389E0D;}
|
||||
.report-section{margin-bottom:24px;}
|
||||
.report-section:last-child{margin-bottom:0;}
|
||||
.report-section__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);padding-left:10px;border-left:3px solid var(--primary);margin-bottom:12px;line-height:1.4;}
|
||||
.report-sub__title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:14px 0 8px;}
|
||||
.report-sub:first-of-type .report-sub__title{margin-top:0;}
|
||||
.result-abnormal{color:var(--danger);font-weight:600;}
|
||||
/* 报告弹窗内 Tab 切换 */
|
||||
.report-tabs{display:flex;gap:28px;padding:0 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
|
||||
.report-tab{position:relative;padding:12px 2px;font-size:var(--font-base);color:var(--text-secondary);cursor:pointer;transition:color .2s;}
|
||||
.report-tab:hover{color:var(--primary);}
|
||||
.report-tab.active{color:var(--primary);font-weight:600;}
|
||||
.report-tab.active::after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--primary);border-radius:2px;}
|
||||
.report-pane{display:none;}
|
||||
.report-pane.active{display:block;}
|
||||
/* 专业报告版式(冠脉CTA / 胃肠镜共用,与检后报告页一致) */
|
||||
.rpt-empty{padding:48px 0;text-align:center;font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.cta-rpt{border:1px solid var(--border);border-radius:var(--radius-md);padding:0;overflow:hidden;}
|
||||
.cta-rpt__band{background:#001529;color:#fff;padding:14px 20px;font-size:var(--font-base);font-weight:600;display:flex;align-items:center;justify-content:space-between;}
|
||||
.cta-rpt__band small{font-size:var(--font-xs);font-weight:400;opacity:.7;}
|
||||
.cta-rpt__meta{display:grid;grid-template-columns:repeat(3,1fr);gap:8px 20px;padding:14px 20px;border-bottom:1px dashed var(--border);font-size:var(--font-sm);}
|
||||
.cta-rpt__meta b{color:var(--text-secondary);font-weight:400;}
|
||||
.cta-rpt__sec{padding:14px 20px;border-bottom:1px solid var(--border);}
|
||||
.cta-rpt__sec:last-child{border-bottom:none;}
|
||||
.cta-rpt__sec-t{font-size:var(--font-sm);font-weight:600;color:var(--primary);margin-bottom:8px;}
|
||||
.cta-rpt__txt{font-size:var(--font-sm);color:var(--text-primary);line-height:1.7;}
|
||||
.cta-vessel{width:100%;border-collapse:collapse;}
|
||||
.cta-vessel th,.cta-vessel td{border:1px solid var(--border);padding:8px 10px;font-size:var(--font-sm);text-align:left;vertical-align:top;}
|
||||
.cta-vessel th{background:#FAFAFA;color:var(--text-secondary);font-weight:500;white-space:nowrap;}
|
||||
.cta-vessel td.v-name{white-space:nowrap;font-weight:500;}
|
||||
.cta-vessel td.v-grade{white-space:nowrap;text-align:center;}
|
||||
.cta-plaque{display:inline-flex;align-items:center;padding:1px 8px;border-radius:10px;font-size:var(--font-xs);margin-right:6px;}
|
||||
.cta-plaque--calc{background:#E6F7FF;color:#1890FF;}
|
||||
.cta-plaque--noncalc{background:#FFF7E6;color:#FAAD14;}
|
||||
.cta-plaque--mixed{background:#FFF1F0;color:#FF4D4F;}
|
||||
.cta-plaque--none{background:#F6FFED;color:#52C41A;}
|
||||
.cta-narrow{font-weight:600;}
|
||||
.cta-narrow--0{color:#52C41A;}
|
||||
.cta-narrow--1{color:#8CB800;}
|
||||
.cta-narrow--2{color:#FAAD14;}
|
||||
.cta-narrow--3{color:#FA8C16;}
|
||||
.cta-narrow--4{color:#FF4D4F;}
|
||||
.cta-imp{display:flex;align-items:center;gap:14px;padding:14px 20px;background:#F6FBFF;border-top:1px solid var(--border);}
|
||||
.cta-cad{flex:none;display:flex;flex-direction:column;align-items:center;justify-content:center;width:96px;height:64px;border-radius:var(--radius-md);color:#fff;font-weight:700;line-height:1.1;}
|
||||
.cta-cad small{font-size:var(--font-xs);font-weight:400;opacity:.9;}
|
||||
.cta-cad--0{background:#52C41A;}.cta-cad--1{background:#8CB800;}.cta-cad--2{background:#FAAD14;}.cta-cad--3{background:#FA8C16;}.cta-cad--4{background:#FF4D4F;}
|
||||
.cta-imp__list{font-size:var(--font-sm);color:var(--text-primary);line-height:1.7;}
|
||||
.cta-imgs{display:flex;gap:12px;flex-wrap:wrap;}
|
||||
.cta-img{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border:1px dashed var(--border);border-radius:var(--radius-sm);background:#FAFAFA;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.cta-img .link{font-size:var(--font-xs);}
|
||||
/* 体检年份选择控件 */
|
||||
.year-picker{position:relative;}
|
||||
.year-picker .filter-input{padding-right:30px;cursor:pointer;}
|
||||
@@ -240,20 +280,30 @@
|
||||
<div class="modal__title" id="report-title">体检报告</div>
|
||||
<button class="modal__close" onclick="closeReport()">✕</button>
|
||||
</div>
|
||||
<!-- 报告类型切换 -->
|
||||
<div class="report-tabs">
|
||||
<div class="report-tab active" data-tab="regular" onclick="switchReportTab('regular')">常规体检</div>
|
||||
<div class="report-tab" data-tab="gastro" onclick="switchReportTab('gastro')">胃肠镜体检</div>
|
||||
<div class="report-tab" data-tab="cta" onclick="switchReportTab('cta')">冠脉CTA体检</div>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div class="report-pane active" data-tab="regular">
|
||||
<div class="cta-rpt">
|
||||
<div class="cta-rpt__band">健康体检报告</div>
|
||||
<div class="cta-rpt__meta" id="regular-meta"></div>
|
||||
<!-- 体检结论 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">体检结论</div>
|
||||
<div class="report-note report-note--conclusion">1. 血脂异常:甘油三酯轻度偏高;<br>2. 视力疲劳:双眼裸眼视力下降;<br>3. 其余各项体检指标未见明显异常。</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">体检结论</div>
|
||||
<div class="report-note report-note--conclusion" style="margin-bottom:0;">1. 血脂异常:甘油三酯轻度偏高;<br>2. 视力疲劳:双眼裸眼视力下降;<br>3. 其余各项体检指标未见明显异常。</div>
|
||||
</div>
|
||||
<!-- 体检建议 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">体检建议</div>
|
||||
<div class="report-note report-note--advice">1. 建议低脂清淡饮食,少油少糖,规律运动,3个月后复查血脂;<br>2. 注意用眼卫生,避免长时间使用电子屏幕,必要时眼科随诊;<br>3. 建议每年进行一次健康体检,动态关注各项指标变化。</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">体检建议</div>
|
||||
<div class="report-note report-note--advice" style="margin-bottom:0;">1. 建议低脂清淡饮食,少油少糖,规律运动,3个月后复查血脂;<br>2. 注意用眼卫生,避免长时间使用电子屏幕,必要时眼科随诊;<br>3. 建议每年进行一次健康体检,动态关注各项指标变化。</div>
|
||||
</div>
|
||||
<!-- 物理检查 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">物理检查</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">物理检查</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">一般检查</div>
|
||||
<table>
|
||||
@@ -279,8 +329,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 内科 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">内科</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">内科</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">心肺听诊</div>
|
||||
<table>
|
||||
@@ -304,8 +354,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 外科 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">外科</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">外科</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">皮肤与淋巴结</div>
|
||||
<table>
|
||||
@@ -328,8 +378,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 化学检查 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">化学检查</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">化学检查</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">血常规</div>
|
||||
<table>
|
||||
@@ -374,6 +424,10 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="report-pane" data-tab="gastro" id="gastro-pane"></div>
|
||||
<div class="report-pane" data-tab="cta" id="cta-pane"></div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-primary" onclick="closeReport()">关闭</button>
|
||||
@@ -521,7 +575,7 @@ function buildBody(){
|
||||
if(!val)val=[(CAT_DEFAULTS[col.cat]||['-'])[0]];
|
||||
cells+='<td class="item'+(val[1]?' res-abn':'')+'">'+val[0]+'</td>';
|
||||
});
|
||||
cells+='<td class="td-op"><span class="link" onclick="openReport(\''+r.name+'\')">查看报告</span></td>';
|
||||
cells+='<td class="td-op"><span class="link" onclick="openReport('+MASTER_ROWS.indexOf(r)+')">查看报告</span></td>';
|
||||
return '<tr>'+cells+'</tr>';
|
||||
}).join('');
|
||||
return '<tbody>'+rows+'</tbody></table>';
|
||||
@@ -566,11 +620,166 @@ function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
var sub=active.closest('.sidebar-subgroup');
|
||||
while(sub){sub.classList.add('open');sub=sub.parentElement.closest('.sidebar-subgroup');}
|
||||
})();
|
||||
/* 查看体检报告弹窗(版式参考常规体检报告页) */
|
||||
function openReport(name){
|
||||
document.getElementById('report-title').textContent=name+' · 体检报告';
|
||||
/* 查看体检报告弹窗:常规体检 / 胃肠镜体检 / 冠脉CTA体检 三个页签 */
|
||||
function openReport(idx){
|
||||
var r=MASTER_ROWS[idx];
|
||||
document.getElementById('report-title').textContent=r.name+' · 体检报告';
|
||||
document.getElementById('regular-meta').innerHTML=
|
||||
'<span><b>姓名:</b>'+r.name+'</span><span><b>性别:</b>'+r.gender+'</span><span><b>年龄:</b>'+r.age+'岁</span>'
|
||||
+'<span><b>体检编号:</b>'+r.empNo+'</span><span><b>体检日期:</b>'+r.checkDate+'</span><span><b>体检医院:</b>'+r.hospital+'</span>';
|
||||
document.getElementById('gastro-pane').innerHTML=gastroReportHtml(r);
|
||||
document.getElementById('cta-pane').innerHTML=ctaReportHtml(r);
|
||||
switchReportTab('regular');
|
||||
document.getElementById('report-modal').classList.add('open');
|
||||
}
|
||||
function switchReportTab(key){
|
||||
var tabs=document.querySelectorAll('#report-modal .report-tab');
|
||||
for(var i=0;i<tabs.length;i++)tabs[i].classList.toggle('active',tabs[i].getAttribute('data-tab')===key);
|
||||
var panes=document.querySelectorAll('#report-modal .report-pane');
|
||||
for(var j=0;j<panes.length;j++)panes[j].classList.toggle('active',panes[j].getAttribute('data-tab')===key);
|
||||
}
|
||||
/* ============ 胃肠镜报告(内容参考员工端 report-gastro.html,版式与冠脉CTA报告一致) ============ */
|
||||
var GASTRO_PROFILES=[
|
||||
{esophagus:'食管黏膜光滑,色泽正常,血管纹理清晰,未见静脉曲张及占位性病变。贲门开闭良好。',
|
||||
stomach:'胃底、胃体黏膜光滑,色泽橘红,黏液湖清亮。胃角切迹光滑,胃窦黏膜轻度充血水肿,未见糜烂及溃疡。幽门口圆,开闭良好。',
|
||||
duodenum:'十二指肠球部及降部黏膜光滑,未见溃疡、糜烂及占位性病变。乳头形态正常。',
|
||||
gastroDx:'慢性非萎缩性胃炎(胃窦)',
|
||||
colon:'全结肠黏膜光滑,血管纹理清晰,未见充血、水肿、糜烂、溃疡及占位性病变。回盲瓣呈唇形,阑尾开口形态正常。结肠袋形态规整,蠕动良好。',
|
||||
colonDx:'全结肠黏膜未见明显异常',
|
||||
pathology:'(降结肠活检)送检肠黏膜组织,腺体排列整齐,间质少量淋巴细胞浸润,未见异型增生及癌细胞。病理诊断:黏膜慢性炎。'},
|
||||
{esophagus:'食管黏膜光滑,色泽正常,血管纹理清晰,未见静脉曲张及占位性病变。贲门开闭良好。',
|
||||
stomach:'胃底、胃体黏膜光滑,未见糜烂及溃疡;胃窦黏膜可见散在点状糜烂,覆薄白苔,周围黏膜充血水肿。幽门口圆,开闭良好。',
|
||||
duodenum:'十二指肠球部及降部黏膜光滑,未见溃疡、糜烂及占位性病变。乳头形态正常。',
|
||||
gastroDx:'糜烂性胃炎(胃窦)',
|
||||
colon:'升结肠、横结肠黏膜光滑,血管纹理清晰;乙状结肠距肛门约25cm处可见一枚直径约0.4cm息肉,表面光滑,亚蒂。余结肠及直肠黏膜未见异常。',
|
||||
colonDx:'乙状结肠息肉(内镜下已钳除,建议半年后复查)',
|
||||
pathology:'(乙状结肠活检)送检黏膜组织呈管状腺瘤样改变,伴低级别上皮内瘤变,基底切缘干净。病理诊断:管状腺瘤伴低级别上皮内瘤变。'}
|
||||
];
|
||||
function gastroProfile(r){
|
||||
var t=0;for(var i=0;i<r.empNo.length;i++)t+=r.empNo.charCodeAt(i);
|
||||
return GASTRO_PROFILES[t%GASTRO_PROFILES.length];
|
||||
}
|
||||
function gastroReportHtml(r){
|
||||
var p=gastroProfile(r);
|
||||
var eye='<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>';
|
||||
return '<div class="cta-rpt">'
|
||||
+'<div class="cta-rpt__band">胃肠镜检查报告</div>'
|
||||
+'<div class="cta-rpt__meta">'
|
||||
+'<span><b>姓名:</b>'+r.name+'</span><span><b>性别:</b>'+r.gender+'</span><span><b>年龄:</b>'+r.age+'岁</span>'
|
||||
+'<span><b>检查编号:</b>'+r.empNo+'</span><span><b>检查日期:</b>'+r.checkDate+'</span><span><b>检查医院:</b>'+r.hospital+'</span>'
|
||||
+'</div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">胃镜检查</div>'
|
||||
+'<table class="cta-vessel"><thead><tr><th style="width:110px;">项目</th><th>所见 / 结论</th></tr></thead><tbody>'
|
||||
+'<tr><td class="v-name">食管</td><td>'+p.esophagus+'</td></tr>'
|
||||
+'<tr><td class="v-name">胃</td><td>'+p.stomach+'</td></tr>'
|
||||
+'<tr><td class="v-name">十二指肠</td><td>'+p.duodenum+'</td></tr>'
|
||||
+'<tr><td class="v-name">诊断结果</td><td>'+p.gastroDx+'</td></tr>'
|
||||
+'</tbody></table></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">肠镜检查</div>'
|
||||
+'<table class="cta-vessel"><thead><tr><th style="width:110px;">项目</th><th>所见 / 结论</th></tr></thead><tbody>'
|
||||
+'<tr><td class="v-name">结肠</td><td>'+p.colon+'</td></tr>'
|
||||
+'<tr><td class="v-name">诊断结果</td><td>'+p.colonDx+'</td></tr>'
|
||||
+'<tr><td class="v-name">病理诊断</td><td>'+p.pathology+'</td></tr>'
|
||||
+'</tbody></table></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">报告图片</div><div class="cta-imgs">'
|
||||
+'<span class="cta-img">'+eye+'胃镜报告<span class="link">查看</span></span>'
|
||||
+'<span class="cta-img">'+eye+'肠镜报告<span class="link">查看</span></span>'
|
||||
+'<span class="cta-img">'+eye+'活检报告<span class="link">查看</span></span>'
|
||||
+'</div></div>'
|
||||
+'</div>';
|
||||
}
|
||||
/* ============ 冠脉CTA报告(数据与版式取自检后-冠脉CTA体检报告页 post-cta-report.html) ============ */
|
||||
var CTA_PROFILES=[
|
||||
{dominant:'右优势型',rate:'68',beta:true,agatston:86,cad:2,
|
||||
vessels:[
|
||||
{n:'左主干 LM',p:'none',g:0,d:'未见斑块及狭窄'},
|
||||
{n:'左前降支 LAD(近段)',p:'mixed',g:2,d:'混合斑块,管腔狭窄约30%'},
|
||||
{n:'左前降支 LAD(中段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'第一对角支 D1',p:'calc',g:1,d:'钙化斑块,管腔狭窄<25%'},
|
||||
{n:'左回旋支 LCX(近段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'左回旋支 LCX(远段)',p:'calc',g:1,d:'少量钙化斑块,管腔未见明显狭窄'},
|
||||
{n:'钝缘支 OM',p:'none',g:0,d:'未见异常'},
|
||||
{n:'右冠状动脉 RCA(近段)',p:'calc',g:2,d:'钙化斑块,管腔狭窄约40%'},
|
||||
{n:'右冠状动脉 RCA(中远段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'后降支 PDA',p:'none',g:0,d:'未见异常'}
|
||||
],
|
||||
cardiac:'各心腔大小未见扩大,左心耳未见血栓,主动脉及瓣膜未见明显钙化,心包少量积液。双肺下叶少许条索影。',
|
||||
impression:['冠状动脉粥样硬化表现','LAD近段混合斑块伴管腔约30%狭窄;RCA近段钙化斑块伴约40%狭窄','余所见冠脉未见明显狭窄'],
|
||||
advise:'建议心内科专科门诊评估,控制血压、血脂等危险因素,必要时行运动负荷心肌灌注或冠脉造影进一步检查。'}
|
||||
,
|
||||
{dominant:'右优势型',rate:'72',beta:true,agatston:0,cad:0,
|
||||
vessels:[
|
||||
{n:'左主干 LM',p:'none',g:0,d:'未见斑块及狭窄'},
|
||||
{n:'左前降支 LAD(近段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'左前降支 LAD(中段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'第一对角支 D1',p:'none',g:0,d:'未见异常'},
|
||||
{n:'左回旋支 LCX(近段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'左回旋支 LCX(远段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'钝缘支 OM',p:'none',g:0,d:'未见异常'},
|
||||
{n:'右冠状动脉 RCA(近段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'右冠状动脉 RCA(中远段)',p:'none',g:0,d:'管壁光滑,未见狭窄'},
|
||||
{n:'后降支 PDA',p:'none',g:0,d:'未见异常'}
|
||||
],
|
||||
cardiac:'各心腔大小、形态正常,左心耳未见血栓,瓣膜未见明显钙化,心包未见积液。双肺未见明显异常。',
|
||||
impression:['冠脉CTA未见明显异常','未见确切斑块及管腔狭窄'],
|
||||
advise:'本次冠脉CTA未见明显异常,建议结合临床,定期体检随访。'}
|
||||
,
|
||||
{dominant:'均衡型',rate:'65',beta:false,agatston:265,cad:3,
|
||||
vessels:[
|
||||
{n:'左主干 LM',p:'calc',g:1,d:'钙化斑块,管腔狭窄<25%'},
|
||||
{n:'左前降支 LAD(近段)',p:'mixed',g:3,d:'混合斑块,管腔狭窄约60%'},
|
||||
{n:'左前降支 LAD(中段)',p:'noncalc',g:2,d:'非钙化斑块,管腔狭窄约45%'},
|
||||
{n:'第一对角支 D1',p:'calc',g:1,d:'钙化斑块,管腔狭窄<25%'},
|
||||
{n:'左回旋支 LCX(近段)',p:'calc',g:2,d:'钙化斑块,管腔狭窄约35%'},
|
||||
{n:'左回旋支 LCX(远段)',p:'none',g:0,d:'未见明显狭窄'},
|
||||
{n:'钝缘支 OM',p:'calc',g:1,d:'少量钙化,管腔未见明显狭窄'},
|
||||
{n:'右冠状动脉 RCA(近段)',p:'mixed',g:2,d:'混合斑块,管腔狭窄约45%'},
|
||||
{n:'右冠状动脉 RCA(中远段)',p:'calc',g:3,d:'钙化斑块,管腔狭窄约55%'},
|
||||
{n:'后降支 PDA',p:'none',g:0,d:'未见异常'}
|
||||
],
|
||||
cardiac:'左心室稍增大,各瓣膜未见明显钙化,心包未见积液。升主动脉增宽约38mm。双肺下叶纤维灶。',
|
||||
impression:['多支冠状动脉粥样硬化并多发斑块形成','LAD近段混合斑块伴管腔中度狭窄(约60%);RCA远段钙化斑块伴中度狭窄(约55%)','LAD中段、LCX近段、RCA近段轻-中度狭窄'],
|
||||
advise:'建议尽快心内科专科就诊,行冠脉造影及必要时的血流储备分数(FFR)评估,规范抗血小板及降脂治疗。'}
|
||||
];
|
||||
function ctaProfile(r){
|
||||
var t=0;for(var i=0;i<r.empNo.length;i++)t+=r.empNo.charCodeAt(i);
|
||||
return CTA_PROFILES[t%CTA_PROFILES.length];
|
||||
}
|
||||
var PLAQUE_TXT={none:['未见斑块','none'],calc:['钙化斑块','calc'],noncalc:['非钙化斑块','noncalc'],mixed:['混合斑块','mixed']};
|
||||
var NARROW_TXT=['未见','<25%','25%~49%','50%~69%','≥70%'];
|
||||
var CAD_TXT=['CAD-RADS 0','CAD-RADS 1','CAD-RADS 2','CAD-RADS 3','CAD-RADS 4'];
|
||||
function ctaReportHtml(r){
|
||||
var p=ctaProfile(r);
|
||||
var vrows=p.vessels.map(function(v){
|
||||
var pl=PLAQUE_TXT[v.p];
|
||||
var gcls=v.g>0?('cta-narrow--'+Math.min(v.g,4)):'';
|
||||
return '<tr><td class="v-name">'+v.n+'</td>'
|
||||
+'<td><span class="cta-plaque cta-plaque--'+pl[1]+'">'+pl[0]+'</span></td>'
|
||||
+'<td class="v-grade">'+(v.g>0?('<span class="cta-narrow '+gcls+'">'+NARROW_TXT[v.g]+'</span>'):'<span class="cta-narrow cta-narrow--0">0%</span>')+'</td>'
|
||||
+'<td>'+v.d+'</td></tr>';
|
||||
}).join('');
|
||||
return '<div class="cta-rpt">'
|
||||
+'<div class="cta-rpt__band">冠状动脉CT血管成像报告</div>'
|
||||
+'<div class="cta-rpt__meta">'
|
||||
+'<span><b>姓名:</b>'+r.name+'</span><span><b>性别:</b>'+r.gender+'</span><span><b>年龄:</b>'+r.age+'岁</span>'
|
||||
+'<span><b>检查编号:</b>'+r.empNo+'</span><span><b>检查日期:</b>'+r.checkDate+'</span><span><b>检查医院:</b>'+r.hospital+'</span>'
|
||||
+'</div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">检查条件</div><div class="cta-rpt__txt">'
|
||||
+'扫描时心率 '+p.rate+' 次/分'+(p.beta?'(已使用β受体阻滞剂控制心率)':'')+',屏气良好;图像质量满足诊断要求。冠脉分布:'+p.dominant+'。'
|
||||
+'</div></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">冠状动脉钙化积分</div><div class="cta-rpt__txt">'
|
||||
+'Agatston 总积分约 '+p.agatston+' 分'+(p.agatston===0?'(未见钙化)':(p.agatston<100?'(轻度)':(p.agatston<400?'(中度)':'(重度)')))+'。'
|
||||
+'</div></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">冠状动脉分段所见</div>'
|
||||
+'<table class="cta-vessel"><thead><tr><th style="width:170px;">血管 / 段</th><th style="width:110px;">斑块性质</th><th style="width:88px;">狭窄程度</th><th>描述</th></tr></thead><tbody>'
|
||||
+vrows+'</tbody></table></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">心脏及冠脉外所见</div><div class="cta-rpt__txt">'+p.cardiac+'</div></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">结论与分级</div>'
|
||||
+'<div class="cta-imp"><div class="cta-cad cta-cad--'+p.cad+'"><span style="font-size:22px;">'+p.cad+'</span><small>CAD-RADS 分级</small></div>'
|
||||
+'<div class="cta-imp__list">'+p.impression.map(function(x,i){return '('+(i+1)+')'+x;}).join('<br>')+'</div></div></div>'
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">建议</div><div class="cta-rpt__txt">'+p.advise+'</div></div>'
|
||||
+'</div>';
|
||||
}
|
||||
function closeReport(){
|
||||
document.getElementById('report-modal').classList.remove('open');
|
||||
}
|
||||
|
||||
@@ -332,6 +332,7 @@
|
||||
<img id="cover-preview" style="display:none;">
|
||||
</div>
|
||||
<input type="file" id="cover-file" accept="image/*" style="display:none;" onchange="onCoverChange(this)">
|
||||
<div class="form-item__hint">支持 JPG/PNG 格式,大小不超过 5MB,建议尺寸 1280×720(16:9)</div>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label class="form-item__label">视频文件</label>
|
||||
@@ -342,7 +343,8 @@
|
||||
</div>
|
||||
<span id="video-name" style="display:none;font-size:var(--font-sm);color:var(--text-primary);"></span>
|
||||
</div>
|
||||
<input type="file" id="video-file" accept="video/*" style="display:none;" onchange="onVideoChange(this)">
|
||||
<input type="file" id="video-file" accept="video/mp4" style="display:none;" onchange="onVideoChange(this)">
|
||||
<div class="form-item__hint">支持 MP4 格式,大小不超过 200MB,时长建议 10 分钟以内</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -92,6 +92,11 @@
|
||||
.form-input:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
|
||||
.form-select{width:100%;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;}
|
||||
.form-select:focus{border-color:var(--primary);}
|
||||
/* 复选列表 */
|
||||
.checkbox-list{border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 16px;}
|
||||
.checkbox-item{display:flex;align-items:center;gap:8px;padding:9px 0;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;}
|
||||
.checkbox-item + .checkbox-item{border-top:1px solid #F0F0F0;}
|
||||
.checkbox-item input{accent-color:var(--primary);width:14px;height:14px;cursor:pointer;flex-shrink:0;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -296,6 +301,31 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 同步医院体检项目确认弹窗 -->
|
||||
<div class="modal-overlay" id="sync-confirm-modal" onclick="if(event.target===this)closeSyncConfirmModal()">
|
||||
<div class="modal">
|
||||
<div class="modal__header">
|
||||
<div class="modal__title">同步医院体检项目</div>
|
||||
<button class="modal__close" onclick="closeSyncConfirmModal()">✕</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div style="font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:16px;">选择医院进行同步医院体检项目,结果可在查看同步任务中查看</div>
|
||||
<div class="form-item">
|
||||
<div class="form-label"><span class="required">*</span> 选择医院(可多选)</div>
|
||||
<div class="checkbox-list" id="sync-hospital-list">
|
||||
<label class="checkbox-item"><input type="checkbox" id="sync-hospital-all" onchange="toggleAllSyncHospitals(this)">全选</label>
|
||||
<label class="checkbox-item"><input type="checkbox" value="泾河医院">泾河医院</label>
|
||||
<label class="checkbox-item"><input type="checkbox" value="庆阳医院">庆阳医院</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeSyncConfirmModal()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmSync()">确认同步</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
/* 侧边栏展开/折叠交互 */
|
||||
function toggleSubgroup(header){
|
||||
@@ -395,16 +425,17 @@ var syncTasks = [
|
||||
]}
|
||||
];
|
||||
|
||||
/* 模拟一次同步拉取到的增量项目 */
|
||||
function makeSyncItems(){
|
||||
/* 模拟一次同步拉取到的增量项目(按所选医院过滤) */
|
||||
function makeSyncItems(hospitals){
|
||||
var pool = [
|
||||
{ hospital: '泾河医院', code: 'JH-XM015', name: '糖类抗原199', basic: 'XM015(糖类抗原)', sys: '肿瘤标志物套餐', action: '新增' },
|
||||
{ hospital: '泾河医院', code: 'JH-XM016', name: '甲胎蛋白', basic: 'XM016(甲胎蛋白)', sys: '肿瘤标志物套餐', action: '新增' },
|
||||
{ hospital: '泾河医院', code: 'JH-XM001', name: '身高测量', basic: 'XM001(身高)', sys: '身高体重检测, 基础体检套餐', action: '更新' },
|
||||
{ hospital: '庆阳医院', code: 'QY-XM008', name: '癌胚抗原', basic: 'XM008(癌胚抗原)', sys: '肿瘤标志物套餐', action: '新增' }
|
||||
];
|
||||
var n = 2 + Math.floor(Math.random() * 3);
|
||||
return pool.slice(0, n);
|
||||
var items = pool.filter(function(it){ return hospitals.indexOf(it.hospital) !== -1; });
|
||||
var n = Math.min(items.length, 2 + Math.floor(Math.random() * 3));
|
||||
return items.slice(0, n);
|
||||
}
|
||||
|
||||
function nowTimeStr(){
|
||||
@@ -456,9 +487,29 @@ function closeSyncDetailModal(){
|
||||
document.getElementById('sync-detail-modal').classList.remove('open');
|
||||
}
|
||||
|
||||
/* 打开同步确认弹窗 */
|
||||
function syncHospitalItems(){
|
||||
if(!confirm('是否从医院同步增量体检项目?')) return;
|
||||
var task = { time: nowTimeStr(), user: '系统管理员', status: 'running', items: makeSyncItems() };
|
||||
var boxes = document.querySelectorAll('#sync-hospital-list input[type=checkbox]');
|
||||
boxes.forEach(function(c){ c.checked = false; });
|
||||
document.getElementById('sync-confirm-modal').classList.add('open');
|
||||
}
|
||||
function closeSyncConfirmModal(){
|
||||
document.getElementById('sync-confirm-modal').classList.remove('open');
|
||||
}
|
||||
function toggleAllSyncHospitals(master){
|
||||
document.querySelectorAll('#sync-hospital-list input[type=checkbox]').forEach(function(c){
|
||||
if(c.id !== 'sync-hospital-all') c.checked = master.checked;
|
||||
});
|
||||
}
|
||||
/* 确认同步:校验医院后创建同步任务 */
|
||||
function confirmSync(){
|
||||
var selected = [];
|
||||
document.querySelectorAll('#sync-hospital-list input[type=checkbox]').forEach(function(c){
|
||||
if(c.checked && c.value) selected.push(c.value);
|
||||
});
|
||||
if(!selected.length){ alert('请选择医院'); return; }
|
||||
closeSyncConfirmModal();
|
||||
var task = { time: nowTimeStr(), user: '系统管理员', status: 'running', items: makeSyncItems(selected) };
|
||||
syncTasks.unshift(task);
|
||||
renderSyncTasks();
|
||||
/* 模拟异步同步:2 秒后完成 */
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# 健康体检模块 CHANGELOG
|
||||
|
||||
## [Unreleased] 2026-09-17
|
||||
|
||||
### Changed
|
||||
- `post-unit-cost-stat.html`:单位体检费用统计列表增加"体检医院"列(部门列之后)并在"体检年份"后增加"签约医院"列(该单位签约的体检医院,可能存在多个,逗号相隔);因一个单位会存在多个体检医院,列表按"单位 × 体检医院"拆行——原 6 条单位年度汇总行拆为 16 条医院明细行(各分组内人数/报告/费用合计与原数据保持一致,计划费用仍按 2062.5 元/人 × 已体检人数口径),分页条数同步更新为 16 条,行配置 ROWS 补充 hospital/signed 字段供弹窗标题使用
|
||||
- `post-unit-cost-stat.html`:列表去掉"总人数"列;"体检报告缺少体检项目信息"弹窗增加"项目费用(元)""折扣后费用(元)"两列(折扣后统一按 8 折示例);统计明细弹窗缺少项目口径的"项目总数"标蓝可点击,点击同样打开体检报告缺少体检项目信息弹窗;员工费用明细弹窗"报告缺少项目数"标蓝可点击(报告不完整时),点击同样打开体检报告缺少体检项目信息弹窗;员工费用明细弹窗顶部新增筛选栏(姓名/员工编号模糊查询、报告完整状态 全部/完整/不完整,查询/重置,打开弹窗时自动重置,无结果显示"暂无数据",合计行随筛选结果汇总)及"导出列表数据"按钮
|
||||
- `PRD.md`:第 51 节"单位体检费用统计"功能说明改为按"单位 × 体检医院"统计(一行是一个体检医院),表格列说明同步补充"体检医院""签约医院"两列并去掉"总人数",统计明细弹窗/缺少项目弹窗说明同步更新
|
||||
|
||||
## [Unreleased] 2026-09-15
|
||||
|
||||
### Added
|
||||
|
||||
@@ -785,6 +785,7 @@
|
||||
|
||||
**业务规则:**
|
||||
- 添加为职业体检的员工,在移动端选择医院时,医院列表只显示支持职业体检的医院
|
||||
- 导入和添加员工时,需判断当前员工是否已预约,如果已预约,则不能被添加
|
||||
---
|
||||
|
||||
#### 22. 指定员工体检医院(pre-special-hospital.html)
|
||||
@@ -1297,7 +1298,7 @@
|
||||
|
||||

|
||||
|
||||
**功能说明:** 按单位统计体检费用与报告完整性;最多可下钻 3 层弹窗:员工费用明细 → 单人应检/已检项目列表 或 报告缺少项目明细 → 员工缺少项目清单。
|
||||
**功能说明:** 按"单位 × 体检医院"统计体检费用与报告完整性(一个单位会存在多个体检医院,一行是一个体检医院);最多可下钻 3 层弹窗:员工费用明细 → 单人应检/已检项目列表 或 报告缺少项目明细 → 员工缺少项目清单。
|
||||
|
||||
**Tab 切换:** 二级单位 / 三级单位(三级单位显示部门列)
|
||||
|
||||
@@ -1305,15 +1306,15 @@
|
||||
|
||||
**操作按钮:** 导出列表数据、导出员工明细、查看导出任务
|
||||
|
||||
**表格列:** 序号、单位、部门(仅三级单位 Tab)、总人数、已体检人数、报告完整人数、报告不完整人数、报告缺少项目总数、计划总体检费用(元)、实际总体检费用(元)、体检年份、操作(员工费用明细);已体检人数/报告完整人数/报告不完整人数/报告缺少项目总数 4 列为蓝色数字链接
|
||||
**表格列:** 序号、单位、部门(仅三级单位 Tab)、体检医院、已体检人数、报告完整人数、报告不完整人数、报告缺少项目总数、计划总体检费用(元)、实际总体检费用(元)、体检年份、签约医院(该单位签约的体检医院,可能存在多个,逗号相隔,位于体检年份之后)、操作(员工费用明细);已体检人数/报告完整人数/报告不完整人数/报告缺少项目总数 4 列为蓝色数字链接
|
||||
|
||||
**员工费用明细弹窗:** 标题"「单位」YYYY年 员工费用明细";表格列:序号、姓名、员工编号、部门、体检日期、体检医院、应检项目数(蓝链)、已检项目数(蓝链,附灰色提示"含未检/弃检 N")、报告完整状态(绿"完整"/橙"不完整"标签)、报告缺少项目数、计划体检费用(元)、实际体检费用(元);底部合计行;关闭
|
||||
|
||||
**项目列表弹窗(560px,二层):** 标题"「姓名」应检项目/已检项目(YYYY年)";表头动态:序号、项目名称、项目类别、应检项目费用(元)/项目费用(元)、体检状态(绿"已检"/红"弃检"/橙"未检"标签);底部费用合计行。项目库为 4 档套餐,费用合计恰与额度档 1000/1500/2500/4000 元一致
|
||||
|
||||
**统计明细弹窗(三层):** 由主表 4 个数字链接打开,标题随口径(已体检人员明细/报告完整人员明细/报告不完整人员明细/报告缺少项目明细);前三种口径列:序号、姓名、员工编号、部门、体检日期、体检医院、已检、应检项目数、报告状态、(缺少项目数[蓝链]);缺少项目口径列:序号、姓名、员工编号、部门、体检医院、报告缺少项目、项目总数;底部"共 N 人"+ 关闭
|
||||
**统计明细弹窗(三层):** 由主表 4 个数字链接打开,标题随口径(已体检人员明细/报告完整人员明细/报告不完整人员明细/报告缺少项目明细);前三种口径列:序号、姓名、员工编号、部门、体检日期、体检医院、已检、应检项目数、报告状态、(缺少项目数[蓝链]);缺少项目口径列:序号、姓名、员工编号、部门、体检医院、报告缺少项目、项目总数(蓝链,点击同样打开体检报告缺少体检项目信息弹窗);底部"共 N 人"+ 关闭
|
||||
|
||||
**体检报告缺少体检项目信息弹窗(四层):** 列:序号、项目名称、项目编码;底部"「姓名」共 N 项"+ 关闭
|
||||
**体检报告缺少体检项目信息弹窗(四层):** 列:序号、项目名称、项目编码、项目费用(元)、折扣后费用(元)(折扣后费用统一按 8 折示例);底部"「姓名」共 N 项"+ 关闭
|
||||
|
||||
**业务规则:** 弃检项目费用≥240 标红;实际费用 = 应检合计 − 弃检/未检合计;金额千分位格式化;Esc/点遮罩逐层关闭(四层 z-index 递增)。
|
||||
|
||||
|
||||
@@ -84,9 +84,6 @@
|
||||
.crumb-back:hover{background:#F5F5F5;color:var(--text-primary);}
|
||||
.crumb-tag{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:var(--radius-sm);border:1px solid var(--border);font-size:var(--font-sm);color:var(--text-primary);background:#fff;}
|
||||
.crumb-tag--active{color:var(--primary);border-color:#91Caff;background:#F0F7FF;}
|
||||
/* 说明框 */
|
||||
.desc-box{background:#FFFBE6;border:1px solid #FFE58F;border-radius:var(--radius-sm);padding:12px 16px;margin-bottom:16px;font-size:var(--font-sm);color:#7C5800;line-height:1.7;}
|
||||
.desc-box strong{color:#5C3D00;}
|
||||
/* 按钮行 */
|
||||
.btn-row{display:flex;gap:12px;margin-bottom:16px;}
|
||||
/* 体检年份选择控件 */
|
||||
@@ -144,11 +141,6 @@
|
||||
<span class="crumb-tag crumb-tag--active">结果异常</span>
|
||||
</div>
|
||||
|
||||
<!-- 异常数据定义说明框 -->
|
||||
<div class="desc-box">
|
||||
<strong>异常数据定义:</strong>体检结果中存在指标超出正常参考范围的情形,包括:危急(指标严重偏离正常范围,需立即处理)、异常(指标超出参考范围但未达危急程度)等。系统自动检测并记录,供管理员跟进处理。
|
||||
</div>
|
||||
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
@@ -179,14 +171,6 @@
|
||||
<span style="color:var(--text-secondary);font-size:var(--font-sm);">至</span>
|
||||
<input class="filter-input" type="date" style="min-width:140px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>异常等级:</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>危急</option>
|
||||
<option>异常</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
@@ -213,16 +197,16 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>异常等级</th><th>员工姓名</th><th>员工编号</th><th>单位</th><th>异常项目</th><th>异常值</th><th>参考范围</th><th>发现时间</th>
|
||||
<th>序号</th><th>员工姓名</th><th>员工编号</th><th>单位</th><th>异常项目</th><th>异常值</th><th>参考范围</th><th>发现时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>1</td><td><span class="tag tag-red">危急</span></td><td>张伟</td><td>CQ001234</td><td>采油一厂</td><td>空腹血糖</td><td>9.8 mmol/L</td><td>3.9~6.1 mmol/L</td><td>2026-05-01</td></tr>
|
||||
<tr><td>2</td><td><span class="tag tag-red">危急</span></td><td>李明</td><td>CQ002571</td><td>采油二厂</td><td>血压(收缩压)</td><td>185 mmHg</td><td>90~140 mmHg</td><td>2026-05-01</td></tr>
|
||||
<tr><td>3</td><td><span class="tag tag-orange">异常</span></td><td>刘洋</td><td>CQ004102</td><td>采油三厂</td><td>总胆固醇</td><td>7.2 mmol/L</td><td>2.8~5.7 mmol/L</td><td>2026-04-30</td></tr>
|
||||
<tr><td>4</td><td><span class="tag tag-orange">异常</span></td><td>陈磊</td><td>CQ006890</td><td>采油一厂</td><td>肌酐</td><td>186 umol/L</td><td>44~133 umol/L</td><td>2026-04-30</td></tr>
|
||||
<tr><td>5</td><td><span class="tag tag-orange">异常</span></td><td>周强</td><td>CQ008456</td><td>采油三厂</td><td>谷丙转氨酶</td><td>128 U/L</td><td>0~40 U/L</td><td>2026-04-29</td></tr>
|
||||
<tr><td>6</td><td><span class="tag tag-red">危急</span></td><td>孙丽</td><td>CQ007234</td><td>采油二厂</td><td>心电图</td><td>ST段压低</td><td>正常心电图</td><td>2026-04-28</td></tr>
|
||||
<tr><td>1</td><td>张伟</td><td>CQ001234</td><td>采油一厂</td><td>空腹血糖</td><td>9.8 mmol/L</td><td>3.9~6.1 mmol/L</td><td>2026-05-01</td></tr>
|
||||
<tr><td>2</td><td>李明</td><td>CQ002571</td><td>采油二厂</td><td>血压(收缩压)</td><td>185 mmHg</td><td>90~140 mmHg</td><td>2026-05-01</td></tr>
|
||||
<tr><td>3</td><td>刘洋</td><td>CQ004102</td><td>采油三厂</td><td>总胆固醇</td><td>7.2 mmol/L</td><td>2.8~5.7 mmol/L</td><td>2026-04-30</td></tr>
|
||||
<tr><td>4</td><td>陈磊</td><td>CQ006890</td><td>采油一厂</td><td>肌酐</td><td>186 umol/L</td><td>44~133 umol/L</td><td>2026-04-30</td></tr>
|
||||
<tr><td>5</td><td>周强</td><td>CQ008456</td><td>采油三厂</td><td>谷丙转氨酶</td><td>128 U/L</td><td>0~40 U/L</td><td>2026-04-29</td></tr>
|
||||
<tr><td>6</td><td>孙丽</td><td>CQ007234</td><td>采油二厂</td><td>心电图</td><td>ST段压低</td><td>正常心电图</td><td>2026-04-28</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th rowspan="2" style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></th><th rowspan="2">姓名</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">年龄范围</th><th rowspan="2">身份证号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">机构分类</th><th rowspan="2">员工编号</th><th rowspan="2">体检编码</th><th rowspan="2">用工形式</th><th rowspan="2">婚姻状态</th><th rowspan="2">体检类型</th><th rowspan="2">防癌项</th><th rowspan="2">是否上市员工</th><th rowspan="2">体检医院</th><th rowspan="2">体检预约信息</th><th rowspan="2">体检总费用</th><th colspan="4" style="text-align:center;">体检明细费用</th><th rowspan="2">预约状态</th><th rowspan="2">预约日期</th><th rowspan="2">体检状态</th><th rowspan="2">体检日期</th><th rowspan="2">体检年份</th><th rowspan="2">体检计划</th><th rowspan="2">操作</th>
|
||||
<th rowspan="2" style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></th><th rowspan="2">姓名</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">年龄范围</th><th rowspan="2">身份证号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">机构分类</th><th rowspan="2">员工编号</th><th rowspan="2">体检编码</th><th rowspan="2">用工形式</th><th rowspan="2">婚姻状态</th><th rowspan="2">体检类型</th><th rowspan="2">防癌项</th><th rowspan="2">是否上市员工</th><th rowspan="2">体检医院</th><th rowspan="2">体检总费用</th><th colspan="4" style="text-align:center;">体检明细费用</th><th rowspan="2">预约状态</th><th rowspan="2">体检预约信息</th><th rowspan="2">预约日期</th><th rowspan="2">体检状态</th><th rowspan="2">体检日期</th><th rowspan="2">体检年份</th><th rowspan="2">体检计划</th><th rowspan="2">操作</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>必检费用</th><th>选检费用</th><th>妇科费用</th><th>防癌筛查费用</th>
|
||||
@@ -312,29 +312,29 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>王旭</td><td>男</td><td>41</td><td>40≤年龄<45</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>342423</td><td>80038237</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>-</td><td>否</td><td>延安医院</td><td>已成功预约并更新项目</td><td class="fee-total">¥2,380.00</td>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>王旭</td><td>男</td><td>41</td><td>40≤年龄<45</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>342423</td><td>80038237</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>-</td><td>否</td><td>延安医院</td><td class="fee-total">¥2,380.00</td>
|
||||
<td class="fee-sub">¥1,200.00</td><td class="fee-sub">¥680.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-12</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>已成功预约并更新项目</td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-12</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>张武</td><td>男</td><td>38</td><td>35≤年龄<40</td><td>430626198806120037</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>324321</td><td>80037100</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>Septin9</td><td>否</td><td>延安医院</td><td>体检预约成功</td><td class="fee-total">¥1,860.00</td>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>张武</td><td>男</td><td>38</td><td>35≤年龄<40</td><td>430626198806120037</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>324321</td><td>80037100</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>Septin9</td><td>否</td><td>延安医院</td><td class="fee-total">¥1,860.00</td>
|
||||
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥260.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-11</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>体检预约成功</td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-11</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>李明</td><td>男</td><td>36</td><td>35≤年龄<40</td><td>610402199003150045</td><td>第一采油厂</td><td>生产一队</td><td>三产公司</td><td>456789</td><td>80036211</td><td>劳务派遣</td><td>未婚</td><td>未婚体检</td><td>-</td><td>否</td><td>泾河医院</td><td>体检预约成功</td><td class="fee-total">¥1,560.00</td>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>李明</td><td>男</td><td>36</td><td>35≤年龄<40</td><td>610402199003150045</td><td>第一采油厂</td><td>生产一队</td><td>三产公司</td><td>456789</td><td>80036211</td><td>劳务派遣</td><td>未婚</td><td>未婚体检</td><td>-</td><td>否</td><td>泾河医院</td><td class="fee-total">¥1,560.00</td>
|
||||
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥460.00</td><td class="fee-sub">-</td><td class="fee-sub">-</td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>2026-03-15</td><td><span class="tag tag-blue">体检中</span></td><td>2026-03-16</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
<td><span class="tag tag-green">已预约</span></td><td>体检预约成功</td><td>2026-03-15</td><td><span class="tag tag-blue">体检中</span></td><td>2026-03-16</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>赵芳</td><td>女</td><td>45</td><td>年龄≥45</td><td>610402198109230028</td><td>第二采油厂</td><td>地质研究所</td><td>子公司</td><td>512336</td><td>80035102</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>两项都有</td><td>是</td><td>-</td><td>-</td><td class="fee-total">¥1,920.00</td>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>赵芳</td><td>女</td><td>45</td><td>年龄≥45</td><td>610402198109230028</td><td>第二采油厂</td><td>地质研究所</td><td>子公司</td><td>512336</td><td>80035102</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>两项都有</td><td>是</td><td>-</td><td class="fee-total">¥1,920.00</td>
|
||||
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥320.00</td><td class="fee-sub">¥350.00</td><td class="fee-sub">¥150.00</td>
|
||||
<td><span class="tag tag-orange">未预约</span></td><td>-</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
<td><span class="tag tag-orange">未预约</span></td><td>-</td><td>-</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>陈强</td><td>男</td><td>52</td><td>年龄≥45</td><td>610402197407080011</td><td>第三采油厂</td><td>集输大队</td><td>三产公司</td><td>601178</td><td>80034065</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>CA724</td><td>否</td><td>市中心医院</td><td>已取消预约</td><td class="fee-total">¥2,380.00</td>
|
||||
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>陈强</td><td>男</td><td>52</td><td>年龄≥45</td><td>610402197407080011</td><td>第三采油厂</td><td>集输大队</td><td>三产公司</td><td>601178</td><td>80034065</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>CA724</td><td>否</td><td>市中心医院</td><td class="fee-total">¥2,380.00</td>
|
||||
<td class="fee-sub">¥1,200.00</td><td class="fee-sub">¥680.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
|
||||
<td><span class="tag tag-red">已取消预约</span></td><td>2026-03-08</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
|
||||
<td><span class="tag tag-red">已取消预约</span></td><td>已取消预约</td><td>2026-03-08</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -461,9 +461,9 @@ document.querySelectorAll('tbody .link:not(.edit-link)').forEach(function(link){
|
||||
set('unit',txt(6));set('dept',txt(7));set('orgType',txt(8));set('examCode',txt(10));
|
||||
set('empType',txt(11));set('marriage',txt(12));
|
||||
set('examType',txt(13));set('cancer',txt(14));set('listed',txt(15));
|
||||
set('hospital',txt(16));set('bookInfo',txt(17));set('feeTotal',txt(18));
|
||||
set('fee1',txt(19));set('fee2',txt(20));set('fee3',txt(21));set('fee4',txt(22));
|
||||
var bookStatus=txt(23);set('bookDate',txt(24));
|
||||
set('hospital',txt(16));set('feeTotal',txt(17));
|
||||
set('fee1',txt(18));set('fee2',txt(19));set('fee3',txt(20));set('fee4',txt(21));
|
||||
var bookStatus=txt(22);set('bookInfo',txt(23));set('bookDate',txt(24));
|
||||
var examStatus=txt(25);set('examDate',txt(26));
|
||||
set('year',txt(27));set('plan',txt(28));
|
||||
var bt=document.querySelector('[data-f="bookTag"]');
|
||||
|
||||
@@ -201,15 +201,15 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th rowspan="2">序号</th><th rowspan="2">单位</th><th rowspan="2" class="col-dept">部门</th><th rowspan="2">应体检人数</th><th rowspan="2">填写问卷人数</th><th colspan="3" style="text-align:center;">已预约情况</th><th rowspan="2">未预约人数</th><th rowspan="2">体检年份</th>
|
||||
<th rowspan="2">序号</th><th rowspan="2">单位</th><th rowspan="2" class="col-dept">部门</th><th rowspan="2">应体检人数</th><th colspan="3" style="text-align:center;">已预约情况</th><th rowspan="2">未预约人数</th><th rowspan="2">体检年份</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>已预约人数</th><th>已参检人数</th><th>未参检人数</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>1</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>5200</td><td>3600</td><td>4000</td><td>3000</td><td>1000</td><td>1000</td><td>2025</td></tr>
|
||||
<tr><td>2</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>5200</td><td>3600</td><td>4000</td><td>3000</td><td>1000</td><td>1000</td><td>2025</td></tr>
|
||||
<tr><td>1</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>5200</td><td>4000</td><td>3000</td><td>1000</td><td>1000</td><td>2025</td></tr>
|
||||
<tr><td>2</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>5200</td><td>4000</td><td>3000</td><td>1000</td><td>1000</td><td>2025</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -253,14 +253,15 @@ function toggleSubgroup(header){
|
||||
if(sub)sub.classList.add('open');
|
||||
})();
|
||||
|
||||
/* 日期范围默认当月 */
|
||||
/* 日期范围默认当日到30日后 */
|
||||
(function(){
|
||||
function pad(n){return n<10?'0'+n:''+n;}
|
||||
var now=new Date();
|
||||
var first=now.getFullYear()+'-'+pad(now.getMonth()+1)+'-01';
|
||||
var last=now.getFullYear()+'-'+pad(now.getMonth()+1)+'-'+pad(new Date(now.getFullYear(),now.getMonth()+1,0).getDate());
|
||||
document.getElementById('filter-date-start').value=first;
|
||||
document.getElementById('filter-date-end').value=last;
|
||||
function fmt(d){return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate());}
|
||||
var start=new Date();
|
||||
var end=new Date();
|
||||
end.setDate(end.getDate()+30);
|
||||
document.getElementById('filter-date-start').value=fmt(start);
|
||||
document.getElementById('filter-date-end').value=fmt(end);
|
||||
})();
|
||||
/* 体检年份选择控件 */
|
||||
function pickYear(el){
|
||||
|
||||
@@ -95,12 +95,17 @@
|
||||
.report-note{border-radius:var(--radius-sm);padding:12px 16px;font-size:var(--font-sm);line-height:1.9;margin-bottom:16px;}
|
||||
.report-note--conclusion{border:1px solid #FFD591;background:#FFF7E6;color:#873800;}
|
||||
.report-note--advice{border:1px solid #B7EB8F;background:#F6FFED;color:#389E0D;}
|
||||
.report-section{margin-bottom:24px;}
|
||||
.report-section:last-child{margin-bottom:0;}
|
||||
.report-section__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);padding-left:10px;border-left:3px solid var(--primary);margin-bottom:12px;line-height:1.4;}
|
||||
.report-sub__title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:14px 0 8px;}
|
||||
.report-sub:first-of-type .report-sub__title{margin-top:0;}
|
||||
.result-abnormal{color:var(--danger);font-weight:600;}
|
||||
/* 专业报告版式(与个人体检数据-报告弹窗一致) */
|
||||
.cta-rpt{border:1px solid var(--border);border-radius:var(--radius-md);padding:0;overflow:hidden;}
|
||||
.cta-rpt__band{background:#001529;color:#fff;padding:14px 20px;font-size:var(--font-base);font-weight:600;display:flex;align-items:center;justify-content:space-between;}
|
||||
.cta-rpt__meta{display:grid;grid-template-columns:repeat(3,1fr);gap:8px 20px;padding:14px 20px;border-bottom:1px dashed var(--border);font-size:var(--font-sm);}
|
||||
.cta-rpt__meta b{color:var(--text-secondary);font-weight:400;}
|
||||
.cta-rpt__sec{padding:14px 20px;border-bottom:1px solid var(--border);}
|
||||
.cta-rpt__sec:last-child{border-bottom:none;}
|
||||
.cta-rpt__sec-t{font-size:var(--font-sm);font-weight:600;color:var(--primary);margin-bottom:8px;}
|
||||
/* 体检年份选择控件 */
|
||||
.year-picker{position:relative;}
|
||||
.year-picker .filter-input{padding-right:30px;cursor:pointer;}
|
||||
@@ -244,18 +249,22 @@
|
||||
|
||||
<!-- 操作栏 -->
|
||||
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;">
|
||||
<button class="btn btn-primary">
|
||||
<button class="btn btn-primary" onclick="updateReportData()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M11.5 4A4.5 4.5 0 0 0 3.2 2.8M2.5 10a4.5 4.5 0 0 0 8.3 1.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M11.5 1.5v2.5H9M2.5 12.5V10h2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
更新体检报告数据
|
||||
</button>
|
||||
<button class="btn btn-primary">
|
||||
<button class="btn btn-primary" onclick="openSuppModal()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="5.5" stroke="currentColor" stroke-width="1.4"/><path d="M7 4.5v5M4.5 7h5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
|
||||
体检报告补录
|
||||
</button>
|
||||
<button class="btn btn-primary">
|
||||
<button class="btn btn-primary" onclick="fetchImageReport()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="2.5" width="11" height="9" rx="1.5" stroke="currentColor" stroke-width="1.4"/><circle cx="5" cy="5.5" r="1" fill="currentColor"/><path d="M1.5 9.5l3-2.5 2.5 2L9.5 6l3 3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
获取影像报告
|
||||
</button>
|
||||
<button class="btn btn-default">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 9V2M4.5 4.5L7 2l2.5 2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
报告模板导入
|
||||
</button>
|
||||
<button class="btn btn-default">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
导出详细报告
|
||||
@@ -275,12 +284,12 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>身份证号</th><th>单位</th><th>部门</th><th>体检医院</th><th>体检类型</th><th>体检日期</th><th>终审日期</th><th>更新日期</th><th>是否已读</th><th>已读时间</th><th>操作</th>
|
||||
<th style="width:40px;"><input type="checkbox" id="report-check-all" onchange="toggleAllReport(this)" title="全选"></th><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>身份证号</th><th>单位</th><th>部门</th><th>体检医院</th><th>体检类型</th><th>体检日期</th><th>终审日期</th><th>更新日期</th><th>是否已读</th><th>已读时间</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>1</td><td>王旭</td><td>342423</td><td>男</td><td>41</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>延安医院</td><td>常规体检</td><td>2026-03-10</td><td>2026-03-10</td><td>2026-03-10</td><td>是</td><td>2025-06-06</td><td><span class="link" onclick="openReport('王旭')">查看报告</span><span class="link" style="margin-left:12px;">查看影像</span><span class="link" style="margin-left:12px;">下载报告</span></td></tr>
|
||||
<tr><td>2</td><td>张丽娟</td><td>324321</td><td>女</td><td>36</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>延安医院</td><td>胃肠镜体检</td><td>2026-03-10</td><td>2026-03-10</td><td>2026-03-10</td><td>否</td><td>-</td><td><span class="link" onclick="openReport('张丽娟')">查看报告</span><span class="link" style="margin-left:12px;">查看影像</span><span class="link" style="margin-left:12px;">下载报告</span></td></tr>
|
||||
<tr><td><input type="checkbox" class="report-checkbox" data-name="王旭"></td><td>1</td><td>王旭</td><td>342423</td><td>男</td><td>41</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>延安医院</td><td>常规体检</td><td>2026-03-10</td><td>2026-03-10</td><td>2026-03-10</td><td>是</td><td>2025-06-06</td><td><span class="link" onclick="openReport(0)">查看报告</span><span class="link" style="margin-left:12px;">查看影像</span><span class="link" style="margin-left:12px;">下载报告</span></td></tr>
|
||||
<tr><td><input type="checkbox" class="report-checkbox" data-name="张丽娟"></td><td>2</td><td>张丽娟</td><td>324321</td><td>女</td><td>36</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>延安医院</td><td>胃肠镜体检</td><td>2026-03-10</td><td>2026-03-10</td><td>2026-03-10</td><td>否</td><td>-</td><td><span class="link" onclick="openReport(1)">查看报告</span><span class="link" style="margin-left:12px;">查看影像</span><span class="link" style="margin-left:12px;">下载报告</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -298,19 +307,22 @@
|
||||
<button class="modal__close" onclick="closeReport()">✕</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div class="cta-rpt">
|
||||
<div class="cta-rpt__band">健康体检报告</div>
|
||||
<div class="cta-rpt__meta" id="report-meta"></div>
|
||||
<!-- 体检结论 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">体检结论</div>
|
||||
<div class="report-note report-note--conclusion">1. 血脂异常:甘油三酯轻度偏高;<br>2. 视力疲劳:双眼裸眼视力下降;<br>3. 其余各项体检指标未见明显异常。</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">体检结论</div>
|
||||
<div class="report-note report-note--conclusion" style="margin-bottom:0;">1. 血脂异常:甘油三酯轻度偏高;<br>2. 视力疲劳:双眼裸眼视力下降;<br>3. 其余各项体检指标未见明显异常。</div>
|
||||
</div>
|
||||
<!-- 体检建议 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">体检建议</div>
|
||||
<div class="report-note report-note--advice">1. 建议低脂清淡饮食,少油少糖,规律运动,3个月后复查血脂;<br>2. 注意用眼卫生,避免长时间使用电子屏幕,必要时眼科随诊;<br>3. 建议每年进行一次健康体检,动态关注各项指标变化。</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">体检建议</div>
|
||||
<div class="report-note report-note--advice" style="margin-bottom:0;">1. 建议低脂清淡饮食,少油少糖,规律运动,3个月后复查血脂;<br>2. 注意用眼卫生,避免长时间使用电子屏幕,必要时眼科随诊;<br>3. 建议每年进行一次健康体检,动态关注各项指标变化。</div>
|
||||
</div>
|
||||
<!-- 物理检查 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">物理检查</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">物理检查</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">一般检查</div>
|
||||
<table>
|
||||
@@ -336,8 +348,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 内科 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">内科</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">内科</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">心肺听诊</div>
|
||||
<table>
|
||||
@@ -361,8 +373,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 外科 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">外科</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">外科</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">皮肤与淋巴结</div>
|
||||
<table>
|
||||
@@ -385,8 +397,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 化学检查 -->
|
||||
<div class="report-section">
|
||||
<div class="report-section__title">化学检查</div>
|
||||
<div class="cta-rpt__sec">
|
||||
<div class="cta-rpt__sec-t">化学检查</div>
|
||||
<div class="report-sub">
|
||||
<div class="report-sub__title">血常规</div>
|
||||
<table>
|
||||
@@ -431,24 +443,168 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-primary" onclick="closeReport()">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 体检报告补录弹窗 -->
|
||||
<div class="modal-overlay" id="supp-modal" onclick="if(event.target===this)closeSuppModal()">
|
||||
<div class="modal" style="width:480px;">
|
||||
<div class="modal__header">
|
||||
<div class="modal__title">体检报告补录</div>
|
||||
<button class="modal__close" onclick="closeSuppModal()">✕</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div style="display:flex;flex-direction:column;gap:14px;">
|
||||
<div style="display:flex;align-items:center;gap:12px;">
|
||||
<label style="width:80px;font-size:var(--font-sm);color:var(--text-secondary);flex-shrink:0;">体检医院</label>
|
||||
<select class="filter-select" id="supp-hospital" style="flex:1;min-width:0;">
|
||||
<option value="">请选择体检医院</option>
|
||||
<option>延安医院</option>
|
||||
<option>泾河医院</option>
|
||||
<option>庆阳医院</option>
|
||||
<option>市中心医院</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:12px;">
|
||||
<label style="width:80px;font-size:var(--font-sm);color:var(--text-secondary);flex-shrink:0;">身份证号</label>
|
||||
<input class="filter-input" id="supp-idno" type="text" placeholder="请输入身份证号" style="flex:1;min-width:0;">
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:12px;">
|
||||
<label style="width:80px;font-size:var(--font-sm);color:var(--text-secondary);flex-shrink:0;">体检编号</label>
|
||||
<input class="filter-input" id="supp-examno" type="text" placeholder="请输入体检编号" style="flex:1;min-width:0;">
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:12px;">
|
||||
<label style="width:80px;font-size:var(--font-sm);color:var(--text-secondary);flex-shrink:0;">体检年份</label>
|
||||
<div class="year-picker" id="supp-year-picker">
|
||||
<input class="filter-input" id="supp-year" type="text" readonly style="min-width:90px;">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="2.5" width="11" height="10" rx="1.5" stroke="#999" stroke-width="1.2"/><path d="M1.5 5.5h11M4.5 1v3M9.5 1v3" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
|
||||
<div class="year-picker__dropdown">
|
||||
<div class="selected" onclick="pickYear(this)">2026</div>
|
||||
<div onclick="pickYear(this)">2025</div>
|
||||
<div onclick="pickYear(this)">2024</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="supp-hint" style="font-size:var(--font-xs);color:var(--text-secondary);">身份证号与体检编号必须至少填写一项</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeSuppModal()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmSupp()">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 多位员工操作确认弹窗 -->
|
||||
<div class="modal-overlay" id="emp-confirm-modal" onclick="if(event.target===this)closeEmpConfirm()">
|
||||
<div class="modal" style="width:420px;">
|
||||
<div class="modal__header">
|
||||
<div class="modal__title" id="emp-confirm-title">操作确认</div>
|
||||
<button class="modal__close" onclick="closeEmpConfirm()">✕</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div id="emp-confirm-text" style="font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:12px;"></div>
|
||||
<div id="emp-confirm-names" style="font-size:var(--font-sm);color:var(--text-primary);line-height:1.8;"></div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeEmpConfirm()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmEmpOk()">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
|
||||
<script>
|
||||
/* 查看报告弹窗 */
|
||||
function openReport(name){
|
||||
document.getElementById('report-title').textContent=name+' · 常规体检报告';
|
||||
/* 查看报告弹窗(专业报告版式,与个人体检数据-常规体检tab一致) */
|
||||
var REPORT_ROWS=[
|
||||
{name:'王旭',gender:'男',age:41,empNo:'342423',checkDate:'2026-03-10',hospital:'延安医院'},
|
||||
{name:'张丽娟',gender:'女',age:36,empNo:'324321',checkDate:'2026-03-10',hospital:'延安医院'}
|
||||
];
|
||||
function openReport(idx){
|
||||
var r=REPORT_ROWS[idx];
|
||||
document.getElementById('report-title').textContent=r.name+' · 常规体检报告';
|
||||
document.getElementById('report-meta').innerHTML=
|
||||
'<span><b>姓名:</b>'+r.name+'</span><span><b>性别:</b>'+r.gender+'</span><span><b>年龄:</b>'+r.age+'岁</span>'
|
||||
+'<span><b>体检编号:</b>'+r.empNo+'</span><span><b>体检日期:</b>'+r.checkDate+'</span><span><b>体检医院:</b>'+r.hospital+'</span>';
|
||||
document.getElementById('report-modal').classList.add('open');
|
||||
}
|
||||
function closeReport(){
|
||||
document.getElementById('report-modal').classList.remove('open');
|
||||
}
|
||||
/* 体检报告补录弹窗 */
|
||||
function openSuppModal(){
|
||||
document.getElementById('supp-hospital').value='';
|
||||
document.getElementById('supp-idno').value='';
|
||||
document.getElementById('supp-examno').value='';
|
||||
/* 体检年份默认当年 */
|
||||
var y=String(new Date().getFullYear());
|
||||
document.getElementById('supp-year').value=y;
|
||||
document.querySelectorAll('#supp-year-picker .year-picker__dropdown div').forEach(function(d){
|
||||
d.classList.toggle('selected', d.textContent.trim()===y);
|
||||
});
|
||||
suppHintReset();
|
||||
document.getElementById('supp-modal').classList.add('open');
|
||||
}
|
||||
function closeSuppModal(){
|
||||
document.getElementById('supp-modal').classList.remove('open');
|
||||
}
|
||||
function suppHintReset(){
|
||||
var h=document.getElementById('supp-hint');
|
||||
h.style.color='var(--text-secondary)';
|
||||
h.textContent='身份证号与体检编号必须至少填写一项';
|
||||
}
|
||||
function confirmSupp(){
|
||||
var idno=document.getElementById('supp-idno').value.trim();
|
||||
var examno=document.getElementById('supp-examno').value.trim();
|
||||
var h=document.getElementById('supp-hint');
|
||||
if(!idno && !examno){
|
||||
h.style.color='var(--danger)';
|
||||
h.textContent='身份证号与体检编号不能都为空,请至少填写一项';
|
||||
return;
|
||||
}
|
||||
closeSuppModal();
|
||||
}
|
||||
/* ===== 员工选择校验(更新报告数据 / 获取影像报告) ===== */
|
||||
function toggleAllReport(master){
|
||||
document.querySelectorAll('.report-checkbox').forEach(function(cb){ cb.checked = master.checked; });
|
||||
}
|
||||
function getCheckedNames(){
|
||||
var names=[];
|
||||
document.querySelectorAll('.report-checkbox:checked').forEach(function(cb){ names.push(cb.getAttribute('data-name')); });
|
||||
return names;
|
||||
}
|
||||
/* 至少选择一位员工;无论几位都弹窗确认已选员工 */
|
||||
function checkEmployees(action, onOk){
|
||||
var names = getCheckedNames();
|
||||
if(!names.length){ alert('请先选择至少一位员工'); return; }
|
||||
document.getElementById('emp-confirm-title').textContent = action + ' - 确认员工';
|
||||
document.getElementById('emp-confirm-text').textContent = '已选择 ' + names.length + ' 位员工,请确认:';
|
||||
document.getElementById('emp-confirm-names').textContent = names.join('、');
|
||||
empConfirmCb = onOk;
|
||||
document.getElementById('emp-confirm-modal').classList.add('open');
|
||||
}
|
||||
var empConfirmCb = null;
|
||||
function closeEmpConfirm(){
|
||||
document.getElementById('emp-confirm-modal').classList.remove('open');
|
||||
empConfirmCb = null;
|
||||
}
|
||||
function confirmEmpOk(){
|
||||
var cb = empConfirmCb;
|
||||
closeEmpConfirm();
|
||||
if(cb) cb();
|
||||
}
|
||||
function updateReportData(){
|
||||
checkEmployees('更新体检报告数据', function(){ alert('已提交更新体检报告数据(原型演示)'); });
|
||||
}
|
||||
function fetchImageReport(){
|
||||
checkEmployees('获取影像报告', function(){ alert('已提交获取影像报告(原型演示)'); });
|
||||
}
|
||||
/* 侧边栏展开/折叠交互 */
|
||||
function toggleSubgroup(header){
|
||||
header.parentElement.classList.toggle('open');
|
||||
|
||||
@@ -122,14 +122,7 @@
|
||||
.modal__close:hover{background:#F5F5F5;}
|
||||
.modal__body{flex:1;overflow-y:auto;padding:24px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
/* 弹窗区块 */
|
||||
.report-section{margin-bottom:24px;}
|
||||
.report-section:last-child{margin-bottom:0;}
|
||||
.report-section__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);padding-left:10px;border-left:3px solid var(--primary);margin-bottom:12px;line-height:1.4;}
|
||||
.info-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px 24px;}
|
||||
.info-grid .info-label{font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.info-grid .info-value{font-size:var(--font-sm);color:var(--text-primary);margin-top:4px;}
|
||||
/* 详情弹窗 */
|
||||
/* 编辑弹窗 */
|
||||
.dform{display:grid;grid-template-columns:1fr 1fr;gap:20px 32px;}
|
||||
.dform__item{display:flex;align-items:flex-start;}
|
||||
.dform__label{width:104px;flex:none;text-align:right;padding-right:8px;font-size:var(--font-sm);color:var(--text-primary);line-height:34px;white-space:nowrap;}
|
||||
@@ -152,21 +145,23 @@
|
||||
.dtab-pane.active{display:block;}
|
||||
.dtab-pane td.res{max-width:460px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
||||
.dempty{padding:48px 0;text-align:center;font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
/* 报告大图 */
|
||||
.report-large{width:380px;height:230px;border:1px solid var(--border);border-radius:4px;background:#fff;padding:16px 20px;}
|
||||
.report-large__imgs{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
|
||||
.report-large__imgs i{width:100%;aspect-ratio:1/1;border-radius:50%;background:radial-gradient(circle at 35% 32%,#F3B07C,#B45A28);}
|
||||
.report-large__imgs i:nth-child(2n){background:radial-gradient(circle at 40% 35%,#E89A5F,#9C4E1F);}
|
||||
.report-large__lines{margin-top:14px;}
|
||||
.report-large__lines i{display:block;height:5px;border-radius:3px;background:#EAEAEA;}
|
||||
.report-large__lines i+i{margin-top:8px;}
|
||||
/* 编辑上传 */
|
||||
.upload-row{display:flex;gap:16px;align-items:flex-start;}
|
||||
.upload-box{width:380px;height:230px;border:1px dashed #D9D9D9;border-radius:4px;background:#FAFAFA;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--text-placeholder);font-size:var(--font-sm);cursor:pointer;transition:all .2s;}
|
||||
.upload-box:hover{border-color:var(--primary);color:var(--primary);}
|
||||
.upload-box--filled{border-style:solid;background:#fff;cursor:default;padding:12px 14px;}
|
||||
.upload-box--filled .report-large{cursor:zoom-in;}
|
||||
/* 编辑态图片操作 */
|
||||
.upload-box__ops{display:flex;gap:12px;}
|
||||
/* 查看报告弹窗(专业报告版式,与个人体检数据-胃肠镜体检tab一致) */
|
||||
.cta-rpt{border:1px solid var(--border);border-radius:var(--radius-md);padding:0;overflow:hidden;}
|
||||
.cta-rpt__band{background:#001529;color:#fff;padding:14px 20px;font-size:var(--font-base);font-weight:600;display:flex;align-items:center;justify-content:space-between;}
|
||||
.cta-rpt__meta{display:grid;grid-template-columns:repeat(3,1fr);gap:8px 20px;padding:14px 20px;border-bottom:1px dashed var(--border);font-size:var(--font-sm);}
|
||||
.cta-rpt__meta b{color:var(--text-secondary);font-weight:400;}
|
||||
.cta-rpt__sec{padding:14px 20px;border-bottom:1px solid var(--border);}
|
||||
.cta-rpt__sec:last-child{border-bottom:none;}
|
||||
.cta-rpt__sec-t{font-size:var(--font-sm);font-weight:600;color:var(--primary);margin-bottom:8px;}
|
||||
.cta-vessel{width:100%;border-collapse:collapse;}
|
||||
.cta-vessel th,.cta-vessel td{border:1px solid var(--border);padding:8px 10px;font-size:var(--font-sm);text-align:left;vertical-align:top;}
|
||||
.cta-vessel th{background:#FAFAFA;color:var(--text-secondary);font-weight:500;white-space:nowrap;}
|
||||
.cta-vessel td.v-name{white-space:nowrap;font-weight:500;}
|
||||
.cta-imgs{display:flex;gap:12px;flex-wrap:wrap;}
|
||||
.cta-img{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border:1px dashed var(--border);border-radius:var(--radius-sm);background:#FAFAFA;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.cta-img .link{font-size:var(--font-xs);}
|
||||
/* 轻提示 */
|
||||
.toast{position:fixed;top:76px;left:50%;transform:translateX(-50%) translateY(-16px);background:#fff;box-shadow:var(--shadow-md);border-radius:var(--radius-sm);padding:10px 20px;font-size:var(--font-sm);color:var(--text-primary);opacity:0;pointer-events:none;transition:all .25s;z-index:1000;display:flex;align-items:center;gap:8px;}
|
||||
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}
|
||||
@@ -373,16 +368,16 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 详情弹窗 -->
|
||||
<div class="modal-overlay" id="detail-modal" onclick="if(event.target===this)closeModal('detail-modal')">
|
||||
<!-- 查看报告弹窗(专业报告版式,与个人体检数据-胃肠镜体检tab一致) -->
|
||||
<div class="modal-overlay" id="report-modal" onclick="if(event.target===this)closeModal('report-modal')">
|
||||
<div class="modal modal--wide">
|
||||
<div class="modal__header">
|
||||
<div class="modal__title" id="detail-title">报告详情</div>
|
||||
<button class="modal__close" onclick="closeModal('detail-modal')">✕</button>
|
||||
<div class="modal__title" id="report-title">胃肠镜检查报告</div>
|
||||
<button class="modal__close" onclick="closeModal('report-modal')">✕</button>
|
||||
</div>
|
||||
<div class="modal__body" id="detail-body"></div>
|
||||
<div class="modal__body" id="report-body"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('detail-modal')">关闭</button>
|
||||
<button class="btn btn-default" onclick="closeModal('report-modal')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -443,7 +438,7 @@ var editIdx=-1,editDraft=null;
|
||||
/* ============ 表格渲染 ============ */
|
||||
function visibleCols(){return cols.filter(function(c){return c.fixed||!c.hidden;});}
|
||||
function thumbHtml(has,idx,key,label){
|
||||
if(has)return '<div class="report-thumb" title="点击查看大图" onclick="openDetail('+idx+')">'
|
||||
if(has)return '<div class="report-thumb" title="点击查看报告" onclick="openReport('+idx+')">'
|
||||
+'<div class="report-thumb__imgs"><i></i><i></i><i></i><i></i></div>'
|
||||
+'<div class="report-thumb__lines"><i style="width:92%"></i><i style="width:70%"></i><i style="width:82%"></i><i style="width:55%"></i></div></div>';
|
||||
return '<div class="report-thumb report-thumb--empty" title="暂无'+label+'图片,点击编辑上传" onclick="openEdit('+idx+')">'
|
||||
@@ -451,7 +446,7 @@ function thumbHtml(has,idx,key,label){
|
||||
}
|
||||
function cellHtml(c,r,idx){
|
||||
if(c.type==='thumb')return thumbHtml(r[c.key],idx,c.key,c.label);
|
||||
if(c.key==='op')return '<span class="link" onclick="openEdit('+idx+')">编辑</span><span class="link" style="margin-left:14px;" onclick="openDetail('+idx+')">详情</span>';
|
||||
if(c.key==='op')return '<span class="link" onclick="openEdit('+idx+')">编辑</span><span class="link" style="margin-left:14px;" onclick="openReport('+idx+')">查看报告</span>';
|
||||
return r[c.key];
|
||||
}
|
||||
function renderTable(){
|
||||
@@ -534,7 +529,7 @@ function toggleColPop(e){
|
||||
renderColPop();
|
||||
pop.classList.add('open');
|
||||
}
|
||||
/* ============ 详情弹窗 ============ */
|
||||
/* ============ 体检项目明细(编辑弹窗-体检项目页签数据) ============ */
|
||||
function detailItems(r){
|
||||
var items=[];
|
||||
if(r.gastro){
|
||||
@@ -547,18 +542,26 @@ function detailItems(r){
|
||||
}
|
||||
return items;
|
||||
}
|
||||
function openDetail(idx){
|
||||
var r=rows[idx];
|
||||
document.getElementById('detail-title').textContent=r.name+' · 胃肠镜报告详情';
|
||||
/* 图片预览块(编辑表单用) */
|
||||
function pickHtml(has){
|
||||
if(!has)return '<div class="dpick dpick--empty">暂无图片</div>';
|
||||
return '<div class="dpick"><div class="dpick__imgs"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>'
|
||||
+'<div class="dpick__lines"><i style="width:94%"></i><i style="width:82%"></i><i style="width:60%"></i></div></div>';
|
||||
}
|
||||
/* 编辑态图片块:预览+操作链接 */
|
||||
function editPickHtml(has,field){
|
||||
var ops='<div class="upload-box__ops" style="margin-top:8px;">'+(has
|
||||
?'<span class="link" onclick="fakeUpload(\''+field+'\')">重新上传</span><span class="link" style="color:#FF4D4F;" onclick="removeUpload(\''+field+'\')">删除</span>'
|
||||
:'<span class="link" onclick="fakeUpload(\''+field+'\')">上传图片</span>')+'</div>';
|
||||
return pickHtml(has)+ops;
|
||||
}
|
||||
/* 编辑弹窗主体(仅报告图片可修改) */
|
||||
function reportBodyHtml(r){
|
||||
var caret='<svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M3 4.5L6 7.5 9 4.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
|
||||
var cal='<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="2.5" width="11" height="10" rx="1.5" stroke="currentColor" stroke-width="1.2"/><path d="M1.5 5.5h11M4.5 1v3M9.5 1v3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>';
|
||||
var box=function(v,extra,cls){return '<div class="dbox'+(cls?' '+cls:'')+'"><span>'+v+'</span>'+(extra||'')+'</div>';};
|
||||
var pick=function(has){
|
||||
if(!has)return '<div class="dpick dpick--empty">暂无图片</div>';
|
||||
return '<div class="dpick"><div class="dpick__imgs"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>'
|
||||
+'<div class="dpick__lines"><i style="width:94%"></i><i style="width:82%"></i><i style="width:60%"></i></div></div>';
|
||||
};
|
||||
var item=function(label,html,req){return '<div class="dform__item"><div class="dform__label">'+(req?'<span class="req">*</span>':'')+label+':</div><div class="dform__box">'+html+'</div></div>';};
|
||||
var img=function(has,field){return '<div id="edit-'+field+'">'+editPickHtml(has,field)+'</div>';};
|
||||
var its=detailItems(r);
|
||||
var tabRows=its.length?its.map(function(t,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+t.cat+'</td><td>'+t.no+'</td><td>'+t.name+'</td><td class="res" title="'+t.res+'">'+t.res+'</td></tr>';
|
||||
@@ -581,77 +584,117 @@ function openDetail(idx){
|
||||
{no:'LE01.01',name:'胃黏膜糜烂',res:'1'},
|
||||
{no:'LE01.02',name:'胃黏膜萎缩',res:'1'}
|
||||
]:[];
|
||||
document.getElementById('detail-body').innerHTML=
|
||||
'<div class="dform">'
|
||||
return '<div class="dform">'
|
||||
+item('姓名',box(r.name))
|
||||
+item('身份证号',box(r.idCard))
|
||||
+item('单位',box(r.unit,caret))
|
||||
+item('部门',box(r.dept,caret))
|
||||
+item('承检医院',box(r.hospital))
|
||||
+item('体检年份',box(r.year,cal,'dbox--year'))
|
||||
+item('胃镜报告图片',pick(r.gastro),true)
|
||||
+item('肠镜报告图片',pick(r.colon),true)
|
||||
+item('活检报告图片',pick(false))
|
||||
+item('胃镜报告图片',img(r.gastro,'gastro'),true)
|
||||
+item('肠镜报告图片',img(r.colon,'colon'),true)
|
||||
+item('活检报告图片',img(!!r.bx,'bx'))
|
||||
+'</div>'
|
||||
+'<div class="dtabs">'
|
||||
+'<div class="dtabs__item active" data-tab="items" onclick="switchDetailTab(\'items\')">体检项目</div>'
|
||||
+'<div class="dtabs__item" data-tab="disease" onclick="switchDetailTab(\'disease\')">病种勾选</div>'
|
||||
+'<div class="dtabs__item" data-tab="handle" onclick="switchDetailTab(\'handle\')">体检处理情况</div>'
|
||||
+'<div class="dtabs__item" data-tab="lesion" onclick="switchDetailTab(\'lesion\')">病变情况</div>'
|
||||
+'<div class="dtabs__item active" data-tab="items" onclick="switchDetailTab(this,\'items\')">体检项目</div>'
|
||||
+'<div class="dtabs__item" data-tab="disease" onclick="switchDetailTab(this,\'disease\')">病种勾选</div>'
|
||||
+'<div class="dtabs__item" data-tab="handle" onclick="switchDetailTab(this,\'handle\')">体检处理情况</div>'
|
||||
+'<div class="dtabs__item" data-tab="lesion" onclick="switchDetailTab(this,\'lesion\')">病变情况</div>'
|
||||
+'</div>'
|
||||
+'<div class="dtab-pane active" data-tab="items"><table style="table-layout:fixed;"><thead><tr><th style="width:56px;">#</th><th style="width:120px;">检查类别</th><th style="width:130px;">项目编号</th><th style="width:160px;">项目名称</th><th>结果</th></tr></thead><tbody>'+tabRows+'</tbody></table></div>'
|
||||
+'<div class="dtab-pane" data-tab="disease">'+checkTable(diseases)+'</div>'
|
||||
+'<div class="dtab-pane" data-tab="handle">'+checkTable(handles)+'</div>'
|
||||
+'<div class="dtab-pane" data-tab="lesion">'+checkTable(lesions)+'</div>';
|
||||
document.getElementById('detail-modal').classList.add('open');
|
||||
}
|
||||
function switchDetailTab(key){
|
||||
var tabs=document.querySelectorAll('#detail-modal .dtabs__item');
|
||||
/* ============ 查看报告弹窗(内容与样式参考个人体检数据-胃肠镜体检tab) ============ */
|
||||
var GASTRO_PROFILES=[
|
||||
{esophagus:'食管黏膜光滑,色泽正常,血管纹理清晰,未见静脉曲张及占位性病变。贲门开闭良好。',
|
||||
stomach:'胃底、胃体黏膜光滑,色泽橘红,黏液湖清亮。胃角切迹光滑,胃窦黏膜轻度充血水肿,未见糜烂及溃疡。幽门口圆,开闭良好。',
|
||||
duodenum:'十二指肠球部及降部黏膜光滑,未见溃疡、糜烂及占位性病变。乳头形态正常。',
|
||||
gastroDx:'慢性非萎缩性胃炎(胃窦)',
|
||||
colon:'全结肠黏膜光滑,血管纹理清晰,未见充血、水肿、糜烂、溃疡及占位性病变。回盲瓣呈唇形,阑尾开口形态正常。结肠袋形态规整,蠕动良好。',
|
||||
colonDx:'全结肠黏膜未见明显异常',
|
||||
pathology:'(降结肠活检)送检肠黏膜组织,腺体排列整齐,间质少量淋巴细胞浸润,未见异型增生及癌细胞。病理诊断:黏膜慢性炎。'},
|
||||
{esophagus:'食管黏膜光滑,色泽正常,血管纹理清晰,未见静脉曲张及占位性病变。贲门开闭良好。',
|
||||
stomach:'胃底、胃体黏膜光滑,未见糜烂及溃疡;胃窦黏膜可见散在点状糜烂,覆薄白苔,周围黏膜充血水肿。幽门口圆,开闭良好。',
|
||||
duodenum:'十二指肠球部及降部黏膜光滑,未见溃疡、糜烂及占位性病变。乳头形态正常。',
|
||||
gastroDx:'糜烂性胃炎(胃窦)',
|
||||
colon:'升结肠、横结肠黏膜光滑,血管纹理清晰;乙状结肠距肛门约25cm处可见一枚直径约0.4cm息肉,表面光滑,亚蒂。余结肠及直肠黏膜未见异常。',
|
||||
colonDx:'乙状结肠息肉(内镜下已钳除,建议半年后复查)',
|
||||
pathology:'(乙状结肠活检)送检黏膜组织呈管状腺瘤样改变,伴低级别上皮内瘤变,基底切缘干净。病理诊断:管状腺瘤伴低级别上皮内瘤变。'}
|
||||
];
|
||||
function gastroProfile(r){
|
||||
var t=0;for(var i=0;i<r.empNo.length;i++)t+=r.empNo.charCodeAt(i);
|
||||
return GASTRO_PROFILES[t%GASTRO_PROFILES.length];
|
||||
}
|
||||
function gastroReportHtml(r){
|
||||
if(!r.gastro&&!r.colon)return '<div class="dempty">暂无报告数据</div>';
|
||||
var p=gastroProfile(r);
|
||||
var eye='<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>';
|
||||
var imgs='<span class="cta-img">'+eye+'胃镜报告<span class="link">查看</span></span>'
|
||||
+'<span class="cta-img">'+eye+'肠镜报告<span class="link">查看</span></span>'
|
||||
+'<span class="cta-img">'+eye+'活检报告<span class="link">查看</span></span>';
|
||||
return '<div class="cta-rpt">'
|
||||
+'<div class="cta-rpt__band">胃肠镜检查报告</div>'
|
||||
+'<div class="cta-rpt__meta">'
|
||||
+'<span><b>姓名:</b>'+r.name+'</span><span><b>性别:</b>'+r.gender+'</span><span><b>年龄:</b>'+r.age+'岁</span>'
|
||||
+'<span><b>检查编号:</b>'+r.empNo+'</span><span><b>检查日期:</b>'+r.checkDate+'</span><span><b>检查医院:</b>'+r.hospital+'</span>'
|
||||
+'</div>'
|
||||
+(r.gastro
|
||||
?'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">胃镜检查</div>'
|
||||
+'<table class="cta-vessel"><thead><tr><th style="width:110px;">项目</th><th>所见 / 结论</th></tr></thead><tbody>'
|
||||
+'<tr><td class="v-name">食管</td><td>'+p.esophagus+'</td></tr>'
|
||||
+'<tr><td class="v-name">胃</td><td>'+p.stomach+'</td></tr>'
|
||||
+'<tr><td class="v-name">十二指肠</td><td>'+p.duodenum+'</td></tr>'
|
||||
+'<tr><td class="v-name">诊断结果</td><td>'+p.gastroDx+'</td></tr>'
|
||||
+'</tbody></table></div>'
|
||||
:'')
|
||||
+(r.colon
|
||||
?'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">肠镜检查</div>'
|
||||
+'<table class="cta-vessel"><thead><tr><th style="width:110px;">项目</th><th>所见 / 结论</th></tr></thead><tbody>'
|
||||
+'<tr><td class="v-name">结肠</td><td>'+p.colon+'</td></tr>'
|
||||
+'<tr><td class="v-name">诊断结果</td><td>'+p.colonDx+'</td></tr>'
|
||||
+'<tr><td class="v-name">病理诊断</td><td>'+p.pathology+'</td></tr>'
|
||||
+'</tbody></table></div>'
|
||||
:'')
|
||||
+'<div class="cta-rpt__sec"><div class="cta-rpt__sec-t">报告图片</div><div class="cta-imgs">'+imgs+'</div></div>'
|
||||
+'</div>';
|
||||
}
|
||||
function openReport(idx){
|
||||
var r=rows[idx];
|
||||
document.getElementById('report-title').textContent=r.name+' · 胃肠镜检查报告';
|
||||
document.getElementById('report-body').innerHTML=gastroReportHtml(r);
|
||||
document.getElementById('report-modal').classList.add('open');
|
||||
}
|
||||
function switchDetailTab(el,key){
|
||||
var root=el.closest('.modal-overlay');
|
||||
var tabs=root.querySelectorAll('.dtabs__item');
|
||||
for(var i=0;i<tabs.length;i++)tabs[i].classList.toggle('active',tabs[i].getAttribute('data-tab')===key);
|
||||
var panes=document.querySelectorAll('#detail-modal .dtab-pane');
|
||||
var panes=root.querySelectorAll('.dtab-pane');
|
||||
for(var j=0;j<panes.length;j++)panes[j].classList.toggle('active',panes[j].getAttribute('data-tab')===key);
|
||||
}
|
||||
/* ============ 编辑弹窗 ============ */
|
||||
function infoGridHtml(r){
|
||||
var items=[['姓名',r.name],['性别',r.gender],['年龄',r.age],['员工编号',r.empNo],['身份证号',r.idCard],['单位',r.unit],['部门',r.dept],['体检医院',r.hospital],['检查日期',r.checkDate],['体检年份',r.year],['创建时间',r.createTime]];
|
||||
return '<div class="info-grid">'+items.map(function(it){
|
||||
return '<div><div class="info-label">'+it[0]+'</div><div class="info-value">'+it[1]+'</div></div>';
|
||||
}).join('')+'</div>';
|
||||
}
|
||||
function uploadBoxHtml(has,label,field){
|
||||
var inner=has
|
||||
?'<div class="upload-box upload-box--filled"><div class="report-large" style="width:100%;height:100%;padding:12px 16px;">'
|
||||
+'<div class="report-large__imgs" style="gap:8px;"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>'
|
||||
+'<div class="report-large__lines" style="margin-top:12px;"><i style="width:96%"></i><i style="width:84%"></i><i style="width:60%"></i></div></div></div>'
|
||||
:'<div class="upload-box" onclick="fakeUpload(\''+field+'\')"><svg width="34" height="34" viewBox="0 0 34 34" fill="none"><path d="M17 22V8M11.5 13L17 7.5 22.5 13" stroke="#999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 22v3.5A2.5 2.5 0 0 0 8.5 28h17a2.5 2.5 0 0 0 2.5-2.5V22" stroke="#999" stroke-width="2" stroke-linecap="round"/></svg>点击上传'+label+'图片</div>';
|
||||
var ops='<div class="upload-box__ops">'+(has
|
||||
?'<span class="link" onclick="fakeUpload(\''+field+'\')">重新上传</span><span class="link" style="color:#FF4D4F;" onclick="removeUpload(\''+field+'\')">删除</span>'
|
||||
:'<span class="link" onclick="fakeUpload(\''+field+'\')">上传图片</span>')+'</div>';
|
||||
return inner+ops;
|
||||
}
|
||||
/* ============ 编辑弹窗(仅报告图片可修改) ============ */
|
||||
function openEdit(idx){
|
||||
editIdx=idx;
|
||||
var r=rows[idx];
|
||||
editDraft={gastro:r.gastro,colon:r.colon};
|
||||
editDraft={gastro:r.gastro,colon:r.colon,bx:!!r.bx};
|
||||
document.getElementById('edit-title').textContent='编辑报告 · '+r.name;
|
||||
document.getElementById('edit-body').innerHTML=
|
||||
'<div class="report-section"><div class="report-section__title">基本信息</div>'+infoGridHtml(r)+'</div>'
|
||||
+'<div class="report-section"><div class="report-section__title">胃镜报告图片</div><div class="upload-row" id="edit-gastro">'+uploadBoxHtml(r.gastro,'胃镜','gastro')+'</div></div>'
|
||||
+'<div class="report-section"><div class="report-section__title">肠镜报告图片</div><div class="upload-row" id="edit-colon">'+uploadBoxHtml(r.colon,'肠镜','colon')+'</div></div>';
|
||||
document.getElementById('edit-body').innerHTML=reportBodyHtml(r);
|
||||
document.getElementById('edit-modal').classList.add('open');
|
||||
}
|
||||
function fakeUpload(field){
|
||||
editDraft[field]=true;
|
||||
document.getElementById('edit-'+field).innerHTML=uploadBoxHtml(true,field==='gastro'?'胃镜':'肠镜',field);
|
||||
document.getElementById('edit-'+field).innerHTML=editPickHtml(true,field);
|
||||
showToast('已选择报告图片 '+field+'-report-'+rows[editIdx].empNo+'.jpg');
|
||||
}
|
||||
function removeUpload(field){
|
||||
editDraft[field]=false;
|
||||
document.getElementById('edit-'+field).innerHTML=uploadBoxHtml(false,field==='gastro'?'胃镜':'肠镜',field);
|
||||
document.getElementById('edit-'+field).innerHTML=editPickHtml(false,field);
|
||||
}
|
||||
function saveEdit(){
|
||||
rows[editIdx].gastro=editDraft.gastro;
|
||||
rows[editIdx].colon=editDraft.colon;
|
||||
rows[editIdx].bx=editDraft.bx;
|
||||
closeModal('edit-modal');
|
||||
renderTable();
|
||||
showToast('保存成功');
|
||||
|
||||
@@ -98,6 +98,8 @@
|
||||
.modal__close{font-size:22px;color:var(--text-placeholder);cursor:pointer;line-height:1;}
|
||||
.modal__close:hover{color:var(--text-secondary);}
|
||||
.modal__body{padding:16px 24px;overflow:auto;}
|
||||
/* 员工费用明细弹窗内筛选栏 */
|
||||
.cost-filter{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
/* 体检年份选择控件 */
|
||||
.year-picker{position:relative;}
|
||||
@@ -260,7 +262,7 @@
|
||||
<th>序号</th>
|
||||
<th>单位</th>
|
||||
<th class="col-dept">部门</th>
|
||||
<th>总人数</th>
|
||||
<th>体检医院</th>
|
||||
<th>已体检人数</th>
|
||||
<th>报告完整人数</th>
|
||||
<th>报告不完整人数</th>
|
||||
@@ -268,21 +270,32 @@
|
||||
<th>计划总体检费用(元)</th>
|
||||
<th>实际总体检费用(元)</th>
|
||||
<th>体检年份</th>
|
||||
<th>签约医院</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>1</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>8000</td><td><span class="link" onclick="showStatDetail(0,'checked')">7520</span></td><td><span class="link" onclick="showStatDetail(0,'complete')">7186</span></td><td><span class="link" onclick="showStatDetail(0,'incomplete')">334</span></td><td><span class="link" onclick="showStatDetail(0,'missing')">1503</span></td><td>15,510,000.00</td><td>13,432,600.00</td><td>2026</td><td><span class="link" onclick="showCostDetail(0)">员工费用明细</span></td></tr>
|
||||
<tr><td>2</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>8000</td><td><span class="link" onclick="showStatDetail(1,'checked')">7310</span></td><td><span class="link" onclick="showStatDetail(1,'complete')">6987</span></td><td><span class="link" onclick="showStatDetail(1,'incomplete')">323</span></td><td><span class="link" onclick="showStatDetail(1,'missing')">1195</span></td><td>15,076,875.00</td><td>13,075,762.50</td><td>2026</td><td><span class="link" onclick="showCostDetail(1)">员工费用明细</span></td></tr>
|
||||
<tr><td>3</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>6500</td><td><span class="link" onclick="showStatDetail(2,'checked')">5980</span></td><td><span class="link" onclick="showStatDetail(2,'complete')">5745</span></td><td><span class="link" onclick="showStatDetail(2,'incomplete')">235</span></td><td><span class="link" onclick="showStatDetail(2,'missing')">869</span></td><td>12,333,750.00</td><td>10,681,775.00</td><td>2026</td><td><span class="link" onclick="showCostDetail(2)">员工费用明细</span></td></tr>
|
||||
<tr><td>4</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>8000</td><td><span class="link" onclick="showStatDetail(3,'checked')">7680</span></td><td><span class="link" onclick="showStatDetail(3,'complete')">7412</span></td><td><span class="link" onclick="showStatDetail(3,'incomplete')">268</span></td><td><span class="link" onclick="showStatDetail(3,'missing')">1099</span></td><td>15,840,000.00</td><td>13,737,600.00</td><td>2025</td><td><span class="link" onclick="showCostDetail(3)">员工费用明细</span></td></tr>
|
||||
<tr><td>5</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>8000</td><td><span class="link" onclick="showStatDetail(4,'checked')">7450</span></td><td><span class="link" onclick="showStatDetail(4,'complete')">7181</span></td><td><span class="link" onclick="showStatDetail(4,'incomplete')">269</span></td><td><span class="link" onclick="showStatDetail(4,'missing')">995</span></td><td>15,365,625.00</td><td>13,307,562.50</td><td>2025</td><td><span class="link" onclick="showCostDetail(4)">员工费用明细</span></td></tr>
|
||||
<tr><td>6</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>6500</td><td><span class="link" onclick="showStatDetail(5,'checked')">6120</span></td><td><span class="link" onclick="showStatDetail(5,'complete')">5925</span></td><td><span class="link" onclick="showStatDetail(5,'incomplete')">195</span></td><td><span class="link" onclick="showStatDetail(5,'missing')">722</span></td><td>12,622,500.00</td><td>10,947,150.00</td><td>2025</td><td><span class="link" onclick="showCostDetail(5)">员工费用明细</span></td></tr>
|
||||
<tr><td>1</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>CQ总医院</td><td><span class="link" onclick="showStatDetail(0,'checked')">3950</span></td><td><span class="link" onclick="showStatDetail(0,'complete')">3770</span></td><td><span class="link" onclick="showStatDetail(0,'incomplete')">180</span></td><td><span class="link" onclick="showStatDetail(0,'missing')">810</span></td><td>8,146,875.00</td><td>7,052,000.00</td><td>2026</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(0)">员工费用明细</span></td></tr>
|
||||
<tr><td>2</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>泾河医院</td><td><span class="link" onclick="showStatDetail(1,'checked')">2160</span></td><td><span class="link" onclick="showStatDetail(1,'complete')">2055</span></td><td><span class="link" onclick="showStatDetail(1,'incomplete')">105</span></td><td><span class="link" onclick="showStatDetail(1,'missing')">430</span></td><td>4,455,000.00</td><td>3,862,600.00</td><td>2026</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(1)">员工费用明细</span></td></tr>
|
||||
<tr><td>3</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>庆阳医院</td><td><span class="link" onclick="showStatDetail(2,'checked')">1410</span></td><td><span class="link" onclick="showStatDetail(2,'complete')">1361</span></td><td><span class="link" onclick="showStatDetail(2,'incomplete')">49</span></td><td><span class="link" onclick="showStatDetail(2,'missing')">263</span></td><td>2,908,125.00</td><td>2,518,000.00</td><td>2026</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(2)">员工费用明细</span></td></tr>
|
||||
<tr><td>4</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>CQ总医院</td><td><span class="link" onclick="showStatDetail(3,'checked')">3760</span></td><td><span class="link" onclick="showStatDetail(3,'complete')">3590</span></td><td><span class="link" onclick="showStatDetail(3,'incomplete')">170</span></td><td><span class="link" onclick="showStatDetail(3,'missing')">620</span></td><td>7,755,000.00</td><td>6,706,262.50</td><td>2026</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(3)">员工费用明细</span></td></tr>
|
||||
<tr><td>5</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>延安医院</td><td><span class="link" onclick="showStatDetail(4,'checked')">2190</span></td><td><span class="link" onclick="showStatDetail(4,'complete')">2097</span></td><td><span class="link" onclick="showStatDetail(4,'incomplete')">93</span></td><td><span class="link" onclick="showStatDetail(4,'missing')">350</span></td><td>4,516,875.00</td><td>3,926,500.00</td><td>2026</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(4)">员工费用明细</span></td></tr>
|
||||
<tr><td>6</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>泾河医院</td><td><span class="link" onclick="showStatDetail(5,'checked')">1360</span></td><td><span class="link" onclick="showStatDetail(5,'complete')">1300</span></td><td><span class="link" onclick="showStatDetail(5,'incomplete')">60</span></td><td><span class="link" onclick="showStatDetail(5,'missing')">225</span></td><td>2,805,000.00</td><td>2,443,000.00</td><td>2026</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(5)">员工费用明细</span></td></tr>
|
||||
<tr><td>7</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>庆阳医院</td><td><span class="link" onclick="showStatDetail(6,'checked')">3120</span></td><td><span class="link" onclick="showStatDetail(6,'complete')">2995</span></td><td><span class="link" onclick="showStatDetail(6,'incomplete')">125</span></td><td><span class="link" onclick="showStatDetail(6,'missing')">455</span></td><td>6,435,000.00</td><td>5,586,775.00</td><td>2026</td><td>庆阳医院,延安医院</td><td><span class="link" onclick="showCostDetail(6)">员工费用明细</span></td></tr>
|
||||
<tr><td>8</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>延安医院</td><td><span class="link" onclick="showStatDetail(7,'checked')">2860</span></td><td><span class="link" onclick="showStatDetail(7,'complete')">2750</span></td><td><span class="link" onclick="showStatDetail(7,'incomplete')">110</span></td><td><span class="link" onclick="showStatDetail(7,'missing')">414</span></td><td>5,898,750.00</td><td>5,095,000.00</td><td>2026</td><td>庆阳医院,延安医院</td><td><span class="link" onclick="showCostDetail(7)">员工费用明细</span></td></tr>
|
||||
<tr><td>9</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>CQ总医院</td><td><span class="link" onclick="showStatDetail(8,'checked')">4130</span></td><td><span class="link" onclick="showStatDetail(8,'complete')">3990</span></td><td><span class="link" onclick="showStatDetail(8,'incomplete')">140</span></td><td><span class="link" onclick="showStatDetail(8,'missing')">590</span></td><td>8,518,125.00</td><td>7,384,600.00</td><td>2025</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(8)">员工费用明细</span></td></tr>
|
||||
<tr><td>10</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>泾河医院</td><td><span class="link" onclick="showStatDetail(9,'checked')">2110</span></td><td><span class="link" onclick="showStatDetail(9,'complete')">2040</span></td><td><span class="link" onclick="showStatDetail(9,'incomplete')">70</span></td><td><span class="link" onclick="showStatDetail(9,'missing')">310</span></td><td>4,351,875.00</td><td>3,783,000.00</td><td>2025</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(9)">员工费用明细</span></td></tr>
|
||||
<tr><td>11</td><td>第一采油厂</td><td class="col-dept">采油作业一区</td><td>庆阳医院</td><td><span class="link" onclick="showStatDetail(10,'checked')">1440</span></td><td><span class="link" onclick="showStatDetail(10,'complete')">1382</span></td><td><span class="link" onclick="showStatDetail(10,'incomplete')">58</span></td><td><span class="link" onclick="showStatDetail(10,'missing')">199</span></td><td>2,970,000.00</td><td>2,570,000.00</td><td>2025</td><td>CQ总医院,泾河医院,庆阳医院</td><td><span class="link" onclick="showCostDetail(10)">员工费用明细</span></td></tr>
|
||||
<tr><td>12</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>CQ总医院</td><td><span class="link" onclick="showStatDetail(11,'checked')">3910</span></td><td><span class="link" onclick="showStatDetail(11,'complete')">3770</span></td><td><span class="link" onclick="showStatDetail(11,'incomplete')">140</span></td><td><span class="link" onclick="showStatDetail(11,'missing')">520</span></td><td>8,064,375.00</td><td>6,983,562.50</td><td>2025</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(11)">员工费用明细</span></td></tr>
|
||||
<tr><td>13</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>延安医院</td><td><span class="link" onclick="showStatDetail(12,'checked')">2140</span></td><td><span class="link" onclick="showStatDetail(12,'complete')">2061</span></td><td><span class="link" onclick="showStatDetail(12,'incomplete')">79</span></td><td><span class="link" onclick="showStatDetail(12,'missing')">290</span></td><td>4,413,750.00</td><td>3,829,000.00</td><td>2025</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(12)">员工费用明细</span></td></tr>
|
||||
<tr><td>14</td><td>第二采油厂</td><td class="col-dept">采油作业二区</td><td>泾河医院</td><td><span class="link" onclick="showStatDetail(13,'checked')">1400</span></td><td><span class="link" onclick="showStatDetail(13,'complete')">1350</span></td><td><span class="link" onclick="showStatDetail(13,'incomplete')">50</span></td><td><span class="link" onclick="showStatDetail(13,'missing')">185</span></td><td>2,887,500.00</td><td>2,495,000.00</td><td>2025</td><td>CQ总医院,延安医院,泾河医院</td><td><span class="link" onclick="showCostDetail(13)">员工费用明细</span></td></tr>
|
||||
<tr><td>15</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>庆阳医院</td><td><span class="link" onclick="showStatDetail(14,'checked')">3300</span></td><td><span class="link" onclick="showStatDetail(14,'complete')">3190</span></td><td><span class="link" onclick="showStatDetail(14,'incomplete')">110</span></td><td><span class="link" onclick="showStatDetail(14,'missing')">390</span></td><td>6,806,250.00</td><td>5,888,150.00</td><td>2025</td><td>庆阳医院,延安医院</td><td><span class="link" onclick="showCostDetail(14)">员工费用明细</span></td></tr>
|
||||
<tr><td>16</td><td>第三采油厂</td><td class="col-dept">集输作业一区</td><td>延安医院</td><td><span class="link" onclick="showStatDetail(15,'checked')">2820</span></td><td><span class="link" onclick="showStatDetail(15,'complete')">2735</span></td><td><span class="link" onclick="showStatDetail(15,'incomplete')">85</span></td><td><span class="link" onclick="showStatDetail(15,'missing')">332</span></td><td>5,816,250.00</td><td>5,059,000.00</td><td>2025</td><td>庆阳医院,延安医院</td><td><span class="link" onclick="showCostDetail(15)">员工费用明细</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>共 6 条</span>
|
||||
<span>共 16 条</span>
|
||||
<button class="page-btn active">1</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -295,6 +308,26 @@
|
||||
<span class="modal__close" onclick="hideCostDetail()">×</span>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<div class="cost-filter">
|
||||
<div class="filter-item">
|
||||
<label>姓名:</label>
|
||||
<input class="filter-input" id="cost-filter-name" type="text" placeholder="请输入姓名" style="min-width:130px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号:</label>
|
||||
<input class="filter-input" id="cost-filter-id" type="text" placeholder="请输入员工编号" style="min-width:150px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>报告完整状态:</label>
|
||||
<select class="filter-select" id="cost-filter-status" style="min-width:100px;"><option>全部</option><option>完整</option><option>不完整</option></select>
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="renderCostDetail()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetCostFilter()">重置</button>
|
||||
<button class="btn btn-default" style="margin-left:auto;">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
导出列表数据
|
||||
</button>
|
||||
</div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>序号</th><th>姓名</th><th>员工编号</th><th>部门</th><th>体检日期</th><th>体检医院</th><th>应检项目数</th><th>已检项目数</th><th>报告完整状态</th><th>报告缺少项目数</th><th>计划体检费用(元)</th><th>实际体检费用(元)</th></tr>
|
||||
@@ -356,7 +389,7 @@
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<table>
|
||||
<thead><tr><th>序号</th><th>项目名称</th><th>项目编码</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>项目名称</th><th>项目编码</th><th>项目费用(元)</th><th>折扣后费用(元)</th></tr></thead>
|
||||
<tbody id="emp-missing-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -377,14 +410,24 @@ function switchUnitLevel(el){
|
||||
el.classList.add('active');
|
||||
document.body.classList.toggle('level-3', el.textContent.trim()==='三级单位');
|
||||
}
|
||||
/* 行配置:单位/部门/年份/总人数/已体检人数;计划与实际总体检费用为明细弹窗 8 名员工合计×(已体检人数/8),主表与明细人均口径一致 */
|
||||
/* 行配置:单位/部门/体检医院/签约医院(一个单位可签约多家医院,逗号相隔)/年份/已体检人数;计划与实际总体检费用为明细弹窗 8 名员工合计×(已体检人数/8),主表与明细人均口径一致 */
|
||||
var ROWS=[
|
||||
{unit:'第一采油厂',dept:'采油作业一区',year:2026,total:8000,checked:7520},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',year:2026,total:8000,checked:7310},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',year:2026,total:6500,checked:5980},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',year:2025,total:8000,checked:7680},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',year:2025,total:8000,checked:7450},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',year:2025,total:6500,checked:6120}
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'CQ总医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2026,checked:3950},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'泾河医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2026,checked:2160},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'庆阳医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2026,checked:1410},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'CQ总医院',signed:'CQ总医院,延安医院,泾河医院',year:2026,checked:3760},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'延安医院',signed:'CQ总医院,延安医院,泾河医院',year:2026,checked:2190},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'泾河医院',signed:'CQ总医院,延安医院,泾河医院',year:2026,checked:1360},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',hospital:'庆阳医院',signed:'庆阳医院,延安医院',year:2026,checked:3120},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',hospital:'延安医院',signed:'庆阳医院,延安医院',year:2026,checked:2860},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'CQ总医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2025,checked:4130},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'泾河医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2025,checked:2110},
|
||||
{unit:'第一采油厂',dept:'采油作业一区',hospital:'庆阳医院',signed:'CQ总医院,泾河医院,庆阳医院',year:2025,checked:1440},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'CQ总医院',signed:'CQ总医院,延安医院,泾河医院',year:2025,checked:3910},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'延安医院',signed:'CQ总医院,延安医院,泾河医院',year:2025,checked:2140},
|
||||
{unit:'第二采油厂',dept:'采油作业二区',hospital:'泾河医院',signed:'CQ总医院,延安医院,泾河医院',year:2025,checked:1400},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',hospital:'庆阳医院',signed:'庆阳医院,延安医院',year:2025,checked:3300},
|
||||
{unit:'第三采油厂',dept:'集输作业一区',hospital:'延安医院',signed:'庆阳医院,延安医院',year:2025,checked:2820}
|
||||
];
|
||||
/* 体检项目字典:四档套餐项目费用合计恰为额度值 1000/1500/2500/4000 元 */
|
||||
var TIERS=[
|
||||
@@ -423,26 +466,52 @@ function buildPlan(rowIdx,empIdx){
|
||||
pool.forEach(function(it){it.status=(it.fee>=240)?'弃检':'未检';});
|
||||
return {items:items,plan:plan,actual:plan-sum,dropN:dropN,planN:items.length,checkedCnt:items.length-pool.length};
|
||||
}
|
||||
var CUR_ROW=null;
|
||||
var CUR_ROW=null,COST_IDX=0;
|
||||
function showCostDetail(rowIdx){
|
||||
CUR_ROW=ROWS[rowIdx];
|
||||
var html='',pSum=0,aSum=0,cnSum=0,pnSum=0,mnSum=0;
|
||||
COST_IDX=rowIdx;
|
||||
document.getElementById('cost-filter-name').value='';
|
||||
document.getElementById('cost-filter-id').value='';
|
||||
document.getElementById('cost-filter-status').value='全部';
|
||||
renderCostDetail();
|
||||
document.getElementById('cost-detail-title').textContent='「'+CUR_ROW.unit+'」'+CUR_ROW.year+'年 员工费用明细';
|
||||
document.getElementById('cost-detail-modal').style.display='flex';
|
||||
}
|
||||
/* 弹窗内筛选重绘:姓名/员工编号模糊匹配,报告完整状态精确匹配,合计行随筛选结果汇总 */
|
||||
function renderCostDetail(){
|
||||
var kw=document.getElementById('cost-filter-name').value.trim();
|
||||
var kid=document.getElementById('cost-filter-id').value.trim();
|
||||
var st=document.getElementById('cost-filter-status').value;
|
||||
var html='',pSum=0,aSum=0,cnSum=0,pnSum=0,mnSum=0,n=0;
|
||||
EMP_POOL.forEach(function(e,i){
|
||||
var d=buildPlan(rowIdx,i);
|
||||
var complete=reportComplete(rowIdx,i);
|
||||
var complete=reportComplete(COST_IDX,i);
|
||||
if(kw&&e.name.indexOf(kw)<0)return;
|
||||
if(kid&&e.id.indexOf(kid)<0)return;
|
||||
if(st==='完整'&&!complete)return;
|
||||
if(st==='不完整'&&complete)return;
|
||||
var d=buildPlan(COST_IDX,i);
|
||||
pSum+=d.plan;aSum+=d.actual;cnSum+=d.checkedCnt;pnSum+=d.planN;
|
||||
if(!complete)mnSum+=d.dropN;
|
||||
html+='<tr><td>'+(i+1)+'</td><td>'+e.name+'</td><td>'+e.id+'</td><td>'+CUR_ROW.dept+'</td><td>'+CUR_ROW.year+'-'+(6+(i%3))+'-'+(11+i*2)+'</td><td>'+e.hospital+'</td>'+
|
||||
'<td><span class="link" onclick="showItems('+rowIdx+','+i+',\'plan\')">'+d.planN+'</span></td>'+
|
||||
'<td><span class="link" onclick="showItems('+rowIdx+','+i+',\'checked\')">'+d.checkedCnt+' <span class="sub-hint">(含未检/弃检'+d.dropN+')</span></span></td>'+
|
||||
n++;
|
||||
html+='<tr><td>'+n+'</td><td>'+e.name+'</td><td>'+e.id+'</td><td>'+CUR_ROW.dept+'</td><td>'+CUR_ROW.year+'-'+(6+(i%3))+'-'+(11+i*2)+'</td><td>'+e.hospital+'</td>'+
|
||||
'<td><span class="link" onclick="showItems('+COST_IDX+','+i+',\'plan\')">'+d.planN+'</span></td>'+
|
||||
'<td><span class="link" onclick="showItems('+COST_IDX+','+i+',\'checked\')">'+d.checkedCnt+' <span class="sub-hint">(含未检/弃检'+d.dropN+')</span></span></td>'+
|
||||
'<td>'+(complete?'<span class="tag tag-green">完整</span>':'<span class="tag tag-orange">不完整</span>')+'</td>'+
|
||||
'<td>'+(complete?0:d.dropN)+'</td>'+
|
||||
'<td>'+(complete?0:'<span class="link" onclick="showEmpMissing('+COST_IDX+','+i+')">'+d.dropN+'</span>')+'</td>'+
|
||||
'<td>'+fmtMoney(d.plan)+'</td><td>'+fmtMoney(d.actual)+'</td></tr>';
|
||||
});
|
||||
html+='<tr style="font-weight:600;"><td></td><td>合计</td><td></td><td></td><td></td><td></td><td>'+pnSum+'</td><td>'+cnSum+'</td><td></td><td>'+mnSum+'</td><td>'+fmtMoney(pSum)+'</td><td>'+fmtMoney(aSum)+'</td></tr>';
|
||||
document.getElementById('cost-detail-title').textContent='「'+CUR_ROW.unit+'」'+CUR_ROW.year+'年 员工费用明细';
|
||||
if(n===0){
|
||||
html='<tr><td colspan="12" style="text-align:center;color:var(--text-placeholder);">暂无数据</td></tr>';
|
||||
}else{
|
||||
html+='<tr style="font-weight:600;"><td></td><td>合计</td><td></td><td></td><td></td><td></td><td>'+pnSum+'</td><td>'+cnSum+'</td><td></td><td>'+mnSum+'</td><td>'+fmtMoney(pSum)+'</td><td>'+fmtMoney(aSum)+'</td></tr>';
|
||||
}
|
||||
document.getElementById('cost-detail-body').innerHTML=html;
|
||||
document.getElementById('cost-detail-modal').style.display='flex';
|
||||
}
|
||||
function resetCostFilter(){
|
||||
document.getElementById('cost-filter-name').value='';
|
||||
document.getElementById('cost-filter-id').value='';
|
||||
document.getElementById('cost-filter-status').value='全部';
|
||||
renderCostDetail();
|
||||
}
|
||||
/* 第二层弹窗:应检=全部项目及应检费用;已检=已检项目及费用;两视角均标注体检状态 */
|
||||
function showItems(rowIdx,empIdx,mode){
|
||||
@@ -482,7 +551,7 @@ function showStatDetail(rowIdx,mode){
|
||||
var names=buildPlan(rowIdx,i).items.filter(function(it){return it.status!=='已检';}).map(function(it){return it.name;});
|
||||
if(names.length===0)return;
|
||||
cn++;
|
||||
body+='<tr><td>'+cn+'</td><td>'+e.name+'</td><td>'+e.id+'</td><td>'+CUR_ROW.dept+'</td><td>'+e.hospital+'</td><td>'+names.join(',')+'</td><td>'+names.length+'</td></tr>';
|
||||
body+='<tr><td>'+cn+'</td><td>'+e.name+'</td><td>'+e.id+'</td><td>'+CUR_ROW.dept+'</td><td>'+e.hospital+'</td><td>'+names.join(',')+'</td><td><span class="link" onclick="showEmpMissing('+rowIdx+','+i+')">'+names.length+'</span></td></tr>';
|
||||
});
|
||||
document.getElementById('stat-modal-count').textContent='共 '+cn+' 人(示例数据)';
|
||||
} else {
|
||||
@@ -518,13 +587,14 @@ function itemCode(name){
|
||||
for(var i=0;i<name.length;i++){h=(h*31+name.charCodeAt(i))%9000;}
|
||||
return 'XM'+(1000+h);
|
||||
}
|
||||
/* 第三层弹窗:点击缺少项目数,查看该员工缺少的具体项目 */
|
||||
/* 第三层弹窗:点击统计明细的缺少项目数(不完整口径)或缺少项目明细的项目总数,查看该员工缺少的具体项目 */
|
||||
/* 折扣后费用示例:统一按 8 折计 */
|
||||
function showEmpMissing(rowIdx,empIdx){
|
||||
var e=EMP_POOL[empIdx],html='',n=0;
|
||||
buildPlan(rowIdx,empIdx).items.forEach(function(it){
|
||||
if(it.status==='已检')return;
|
||||
n++;
|
||||
html+='<tr><td>'+n+'</td><td>'+it.name+'</td><td>'+itemCode(it.name)+'</td></tr>';
|
||||
html+='<tr><td>'+n+'</td><td>'+it.name+'</td><td>'+itemCode(it.name)+'</td><td>'+fmtMoney(it.fee)+'</td><td>'+fmtMoney(it.fee*0.8)+'</td></tr>';
|
||||
});
|
||||
document.getElementById('emp-missing-title').textContent='体检报告缺少体检项目信息';
|
||||
document.getElementById('emp-missing-body').innerHTML=html;
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;display:flex;align-items:center;gap:4px;font-weight:500;}
|
||||
.form-label .req{color:var(--danger);}
|
||||
.form-input{width:100%;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;transition:border-color .2s;}
|
||||
.form-input:disabled{background:#F5F7FA;color:var(--text-secondary);cursor:not-allowed;}
|
||||
.form-input:focus{border-color:var(--primary);}
|
||||
select.form-input{appearance:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;padding-right:32px;cursor:pointer;}
|
||||
.form-input:disabled{background:#F5F5F5;color:var(--text-secondary);cursor:not-allowed;}
|
||||
@@ -442,8 +443,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域 -->
|
||||
<div class="form-item">
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域(新增模式下隐藏) -->
|
||||
<div class="form-item" id="personScopeItem">
|
||||
<div class="form-label"><span class="req">*</span> 参加人员范围</div>
|
||||
<!-- [交互] 指定机构默认为组织单位,可额外勾选其他单位/部门 -->
|
||||
<div class="person-panel show" id="personPanel" style="margin-top:0;">
|
||||
@@ -656,6 +657,7 @@ function openPlanModal(){
|
||||
document.getElementById('plan-modal-title').textContent = '新增冠脉CTA体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '确认新增';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(true);
|
||||
document.getElementById('plan-modal-overlay').classList.add('open');
|
||||
document.getElementById('plan-drawer').classList.add('open');
|
||||
}
|
||||
@@ -664,6 +666,13 @@ function closePlanModal(){
|
||||
document.getElementById('plan-drawer').classList.remove('open');
|
||||
}
|
||||
|
||||
/* 新增模式:体检年份锁定为当年、隐藏参加人员范围;编辑模式恢复可编辑 */
|
||||
function setPlanFormMode(isAdd){
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
yearSel.disabled = isAdd;
|
||||
document.getElementById('personScopeItem').style.display = isAdd ? 'none' : '';
|
||||
}
|
||||
|
||||
/* [交互] 编辑:复用新增抽屉,按已存计划回填全部字段 */
|
||||
function openPlanEdit(el){
|
||||
var tr = el.closest('tr');
|
||||
@@ -674,6 +683,7 @@ function openPlanEdit(el){
|
||||
document.getElementById('plan-modal-title').textContent = '编辑冠脉CTA体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '保存';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(false);
|
||||
document.getElementById('planUnit').value = d.unit;
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
for(var i=0;i<yearSel.options.length;i++){ if(yearSel.options[i].value === d.year){ yearSel.selectedIndex = i; break; } }
|
||||
@@ -1114,7 +1124,8 @@ function savePlan(){
|
||||
if(!dateFrom || !dateTo){ showToast('请选择体检计划日期范围'); return; }
|
||||
if(dateFrom > dateTo){ showToast('体检计划开始日期不能晚于结束日期'); return; }
|
||||
var personType = 'specific';
|
||||
if(selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
/* 新增模式隐藏参加人员范围区域,仅编辑时校验 */
|
||||
if(editingPlanRid && selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
showToast('请至少选择指定机构或指定员工'); return;
|
||||
}
|
||||
var apptOn = document.getElementById('switchAppt').classList.contains('on');
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;display:flex;align-items:center;gap:4px;font-weight:500;}
|
||||
.form-label .req{color:var(--danger);}
|
||||
.form-input{width:100%;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;transition:border-color .2s;}
|
||||
.form-input:disabled{background:#F5F7FA;color:var(--text-secondary);cursor:not-allowed;}
|
||||
.form-input:focus{border-color:var(--primary);}
|
||||
select.form-input{appearance:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;padding-right:32px;cursor:pointer;}
|
||||
.form-input:disabled{background:#F5F5F5;color:var(--text-secondary);cursor:not-allowed;}
|
||||
@@ -442,8 +443,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域 -->
|
||||
<div class="form-item">
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域(新增模式下隐藏) -->
|
||||
<div class="form-item" id="personScopeItem">
|
||||
<div class="form-label"><span class="req">*</span> 参加人员范围</div>
|
||||
<!-- [交互] 指定机构默认为组织单位,可额外勾选其他单位/部门 -->
|
||||
<div class="person-panel show" id="personPanel" style="margin-top:0;">
|
||||
@@ -656,6 +657,7 @@ function openPlanModal(){
|
||||
document.getElementById('plan-modal-title').textContent = '新增胃肠镜体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '确认新增';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(true);
|
||||
document.getElementById('plan-modal-overlay').classList.add('open');
|
||||
document.getElementById('plan-drawer').classList.add('open');
|
||||
}
|
||||
@@ -664,6 +666,13 @@ function closePlanModal(){
|
||||
document.getElementById('plan-drawer').classList.remove('open');
|
||||
}
|
||||
|
||||
/* 新增模式:体检年份锁定为当年、隐藏参加人员范围;编辑模式恢复可编辑 */
|
||||
function setPlanFormMode(isAdd){
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
yearSel.disabled = isAdd;
|
||||
document.getElementById('personScopeItem').style.display = isAdd ? 'none' : '';
|
||||
}
|
||||
|
||||
/* [交互] 编辑:复用新增抽屉,按已存计划回填全部字段 */
|
||||
function openPlanEdit(el){
|
||||
var tr = el.closest('tr');
|
||||
@@ -674,6 +683,7 @@ function openPlanEdit(el){
|
||||
document.getElementById('plan-modal-title').textContent = '编辑胃肠镜体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '保存';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(false);
|
||||
document.getElementById('planUnit').value = d.unit;
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
for(var i=0;i<yearSel.options.length;i++){ if(yearSel.options[i].value === d.year){ yearSel.selectedIndex = i; break; } }
|
||||
@@ -1114,7 +1124,8 @@ function savePlan(){
|
||||
if(!dateFrom || !dateTo){ showToast('请选择体检计划日期范围'); return; }
|
||||
if(dateFrom > dateTo){ showToast('体检计划开始日期不能晚于结束日期'); return; }
|
||||
var personType = 'specific';
|
||||
if(selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
/* 新增模式隐藏参加人员范围区域,仅编辑时校验 */
|
||||
if(editingPlanRid && selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
showToast('请至少选择指定机构或指定员工'); return;
|
||||
}
|
||||
var apptOn = document.getElementById('switchAppt').classList.contains('on');
|
||||
|
||||
@@ -87,11 +87,6 @@
|
||||
.form-input:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
|
||||
.form-select{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;}
|
||||
.form-select:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
|
||||
/* Tab 切换 */
|
||||
.tabs{display:flex;gap:0;background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);padding:0 24px;margin-bottom:0;}
|
||||
.tab{padding:14px 24px;font-size:var(--font-base);color:var(--text-secondary);cursor:pointer;border-bottom:2px solid transparent;user-select:none;}
|
||||
.tab:hover{color:var(--primary);}
|
||||
.tab.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
|
||||
.num-link{color:var(--primary);cursor:pointer;font-weight:600;}
|
||||
.num-link:hover{color:#40a9ff;text-decoration:underline;}
|
||||
/* 体检年份选择控件 */
|
||||
@@ -213,14 +208,8 @@
|
||||
|
||||
|
||||
<main class="main">
|
||||
<div class="tabs">
|
||||
<div class="tab active" data-tab="dept" onclick="switchTab('dept')">部门</div>
|
||||
<div class="tab" data-tab="hospital" onclick="switchTab('hospital')">医院</div>
|
||||
</div>
|
||||
|
||||
<!-- 部门tab -->
|
||||
<div id="panel-dept">
|
||||
<div class="filter-bar" style="border-radius:0 0 var(--radius-md) var(--radius-md);margin-bottom:16px;">
|
||||
<div class="filter-bar" style="margin-bottom:16px;">
|
||||
<div class="filter-item">
|
||||
<label>体检年份:</label>
|
||||
<div class="year-picker">
|
||||
@@ -288,76 +277,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 医院tab -->
|
||||
<div id="panel-hospital" style="display:none;">
|
||||
<div class="filter-bar" style="border-radius:0 0 var(--radius-md) var(--radius-md);margin-bottom:16px;">
|
||||
<div class="filter-item">
|
||||
<label>体检年份:</label>
|
||||
<div class="year-picker">
|
||||
<input class="filter-input" type="text" readonly value="2026" style="min-width:110px;">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="2.5" width="11" height="10" rx="1.5" stroke="#999" stroke-width="1.2"/><path d="M1.5 5.5h11M4.5 1v3M9.5 1v3" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
|
||||
<div class="year-picker__dropdown">
|
||||
<div class="selected" onclick="pickYear(this)">2026</div>
|
||||
<div onclick="pickYear(this)">2025</div>
|
||||
<div onclick="pickYear(this)">2024</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位:</label>
|
||||
<select class="filter-select" style="min-width:160px;">
|
||||
<option>请选择</option>
|
||||
<option>采油四厂</option>
|
||||
<option>采油五厂</option>
|
||||
<option>采油六厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>预选医院:</label>
|
||||
<select class="filter-select" style="min-width:160px;">
|
||||
<option>请选择</option>
|
||||
<option>宁夏宝石花医院</option>
|
||||
<option>CQ油田医院</option>
|
||||
<option>长安胃肠镜医院</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap;">
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-default">查看导出任务</button>
|
||||
</div>
|
||||
|
||||
<div class="table-card">
|
||||
<div class="table-card__header">
|
||||
<div class="table-card__title">预选信息统计(医院)</div>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>预选医院</th><th>体检年份</th><th>单位</th><th>预选人数</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>宁夏宝石花医院</td><td>2026</td><td>采油四厂</td><td><span class="num-link" onclick="openDetail('宁夏宝石花医院 / 采油四厂')">20</span></td></tr>
|
||||
<tr><td>宁夏宝石花医院</td><td>2026</td><td>采油五厂</td><td><span class="num-link" onclick="openDetail('宁夏宝石花医院 / 采油五厂')">15</span></td></tr>
|
||||
<tr><td>CQ油田医院</td><td>2026</td><td>采油五厂</td><td><span class="num-link" onclick="openDetail('CQ油田医院 / 采油五厂')">31</span></td></tr>
|
||||
<tr><td>长安胃肠镜医院</td><td>2026</td><td>采油六厂</td><td><span class="num-link" onclick="openDetail('长安胃肠镜医院 / 采油六厂')">9</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>共 4 条</span>
|
||||
<button class="page-btn active">1</button>
|
||||
<span>每页</span>
|
||||
<select class="filter-select" style="min-width:70px;height:32px;"><option>10条</option><option>50条</option></select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- 预选人数明细弹窗 -->
|
||||
@@ -399,15 +318,6 @@ function toggleSubgroup(header){
|
||||
while(sub){ sub.classList.add('open'); sub=sub.parentElement.closest('.sidebar-subgroup'); }
|
||||
})();
|
||||
|
||||
/* tab 切换 */
|
||||
function switchTab(key){
|
||||
document.querySelectorAll('.tab').forEach(function(t){
|
||||
t.classList.toggle('active', t.getAttribute('data-tab') === key);
|
||||
});
|
||||
document.getElementById('panel-dept').style.display = key === 'dept' ? '' : 'none';
|
||||
document.getElementById('panel-hospital').style.display = key === 'hospital' ? '' : 'none';
|
||||
}
|
||||
|
||||
/* 预选人数明细 */
|
||||
function openDetail(title){
|
||||
document.getElementById('detail-title').textContent = '预选人数明细 - ' + title;
|
||||
|
||||
@@ -421,35 +421,35 @@
|
||||
<div class="tab-panel active" id="panel-required">
|
||||
<div class="panel-toolbar"><button class="btn btn-default" onclick="addProjectRow('required')">+ 添加项目</button></div>
|
||||
<table>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>金额(元)</th><th>操作</th></tr></thead>
|
||||
<tbody id="tbody-required"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-panel" id="panel-optional">
|
||||
<div class="panel-toolbar"><button class="btn btn-default" onclick="addProjectRow('optional')">+ 添加项目</button></div>
|
||||
<table>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>金额(元)</th><th>操作</th></tr></thead>
|
||||
<tbody id="tbody-optional"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-panel" id="panel-gyn-unmarried">
|
||||
<div class="panel-toolbar"><button class="btn btn-default" onclick="addProjectRow('gyn-unmarried')">+ 添加项目</button></div>
|
||||
<table>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>金额(元)</th><th>操作</th></tr></thead>
|
||||
<tbody id="tbody-gyn-unmarried"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-panel" id="panel-gyn-married">
|
||||
<div class="panel-toolbar"><button class="btn btn-default" onclick="addProjectRow('gyn-married')">+ 添加项目</button></div>
|
||||
<table>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>金额(元)</th><th>操作</th></tr></thead>
|
||||
<tbody id="tbody-gyn-married"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-panel" id="panel-cancer">
|
||||
<div class="panel-toolbar"><button class="btn btn-default" onclick="addProjectRow('cancer')">+ 添加项目</button></div>
|
||||
<table>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>金额(元)</th><th>操作</th></tr></thead>
|
||||
<tbody id="tbody-cancer"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -550,19 +550,29 @@ function toggleSubgroup(header){
|
||||
/* ===== 新增组合模板抽屉 ===== */
|
||||
var hospitalData = ['泾河医院','庆阳医院','延安医院','兴隆园医院','宁夏宝石花医院'];
|
||||
var projectData = [
|
||||
{name:'经颅多普勒', code:'TCD-001'},
|
||||
{name:'腹部彩超', code:'BUS-002'},
|
||||
{name:'血常规', code:'BLD-003'},
|
||||
{name:'心电图', code:'ECG-004'},
|
||||
{name:'胸部X光', code:'XRY-005'},
|
||||
{name:'肝功能', code:'LFT-006'},
|
||||
{name:'肾功能', code:'RFT-007'},
|
||||
{name:'空腹血糖', code:'GLU-008'},
|
||||
{name:'血脂四项', code:'LIP-009'},
|
||||
{name:'尿常规', code:'URI-010'},
|
||||
{name:'胃镜', code:'GAS-011'},
|
||||
{name:'肠镜', code:'COL-012'}
|
||||
{name:'经颅多普勒', code:'TCD-001', price:120},
|
||||
{name:'腹部彩超', code:'BUS-002', price:160},
|
||||
{name:'血常规', code:'BLD-003', price:25},
|
||||
{name:'心电图', code:'ECG-004', price:40},
|
||||
{name:'胸部X光', code:'XRY-005', price:80},
|
||||
{name:'肝功能', code:'LFT-006', price:60},
|
||||
{name:'肾功能', code:'RFT-007', price:60},
|
||||
{name:'空腹血糖', code:'GLU-008', price:20},
|
||||
{name:'血脂四项', code:'LIP-009', price:120},
|
||||
{name:'尿常规', code:'URI-010', price:20},
|
||||
{name:'胃镜', code:'GAS-011', price:400},
|
||||
{name:'肠镜', code:'COL-012', price:480}
|
||||
];
|
||||
/* 妇科/防癌等不在可选池中的项目金额(编辑回填时按编码取值) */
|
||||
var EXTRA_PRICES = {
|
||||
'GYN-013':'30.00', 'GYN-014':'95.00', 'GYN-015':'140.00',
|
||||
'SEP-016':'199.00', 'CA7-017':'150.00'
|
||||
};
|
||||
function projectPrice(code){
|
||||
var p = projectData.find(function(it){ return it.code === code; });
|
||||
if(p) return Number(p.price).toFixed(2);
|
||||
return EXTRA_PRICES[code] || '';
|
||||
}
|
||||
var projectTabKeys = ['required','optional','gyn-unmarried','gyn-married','cancer'];
|
||||
|
||||
/* 可搜索下拉通用组件 */
|
||||
@@ -766,6 +776,7 @@ function addProjectRow(tabKey){
|
||||
var tdItem = document.createElement('td');
|
||||
var tdCode = document.createElement('td');
|
||||
var tdMark = document.createElement('td');
|
||||
var tdAmount = document.createElement('td');
|
||||
var tdOp = document.createElement('td');
|
||||
|
||||
var codeInput = document.createElement('input');
|
||||
@@ -773,11 +784,19 @@ function addProjectRow(tabKey){
|
||||
codeInput.readOnly = true;
|
||||
codeInput.placeholder = '自动填充';
|
||||
|
||||
var amountInput = document.createElement('input');
|
||||
amountInput.className = 'row-input row-amount';
|
||||
amountInput.readOnly = true;
|
||||
amountInput.placeholder = '自动填充';
|
||||
|
||||
var ss = createSearchSelect(projectData, {
|
||||
sm: true,
|
||||
placeholder: '请选择体检项目',
|
||||
getLabel: function(item){ return item.name + '(' + item.code + ')'; },
|
||||
onSelect: function(item){ codeInput.value = item ? item.code : ''; }
|
||||
onSelect: function(item){
|
||||
codeInput.value = item ? item.code : '';
|
||||
amountInput.value = item ? Number(item.price).toFixed(2) : '';
|
||||
}
|
||||
});
|
||||
|
||||
var markSelect = document.createElement('select');
|
||||
@@ -797,11 +816,13 @@ function addProjectRow(tabKey){
|
||||
tdItem.appendChild(ss.container);
|
||||
tdCode.appendChild(codeInput);
|
||||
tdMark.appendChild(markSelect);
|
||||
tdAmount.appendChild(amountInput);
|
||||
tdOp.appendChild(del);
|
||||
|
||||
tr.appendChild(tdItem);
|
||||
tr.appendChild(tdCode);
|
||||
tr.appendChild(tdMark);
|
||||
tr.appendChild(tdAmount);
|
||||
tr.appendChild(tdOp);
|
||||
tbody.appendChild(tr);
|
||||
}
|
||||
@@ -857,12 +878,18 @@ function addStaticProjectRow(tabKey, p){
|
||||
var tdItem = document.createElement('td'); tdItem.className = 'row-static';
|
||||
var tdCode = document.createElement('td');
|
||||
var tdMark = document.createElement('td');
|
||||
var tdAmount = document.createElement('td');
|
||||
var tdOp = document.createElement('td');
|
||||
tdItem.textContent = p[0];
|
||||
var codeInput = document.createElement('input');
|
||||
codeInput.className = 'row-input';
|
||||
codeInput.readOnly = true;
|
||||
codeInput.value = p[1];
|
||||
var amountInput = document.createElement('input');
|
||||
amountInput.className = 'row-input row-amount';
|
||||
amountInput.readOnly = true;
|
||||
amountInput.value = projectPrice(p[1]);
|
||||
if(!amountInput.value) amountInput.placeholder = '—';
|
||||
var markSelect = document.createElement('select');
|
||||
markSelect.className = 'row-select';
|
||||
['一般项目','重点项目'].forEach(function(m){
|
||||
@@ -878,10 +905,12 @@ function addStaticProjectRow(tabKey, p){
|
||||
del.onclick = function(){ tr.remove(); };
|
||||
tdCode.appendChild(codeInput);
|
||||
tdMark.appendChild(markSelect);
|
||||
tdAmount.appendChild(amountInput);
|
||||
tdOp.appendChild(del);
|
||||
tr.appendChild(tdItem);
|
||||
tr.appendChild(tdCode);
|
||||
tr.appendChild(tdMark);
|
||||
tr.appendChild(tdAmount);
|
||||
tr.appendChild(tdOp);
|
||||
tbody.appendChild(tr);
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;display:flex;align-items:center;gap:4px;font-weight:500;}
|
||||
.form-label .req{color:var(--danger);}
|
||||
.form-input{width:100%;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;transition:border-color .2s;}
|
||||
.form-input:disabled{background:#F5F7FA;color:var(--text-secondary);cursor:not-allowed;}
|
||||
.form-input:focus{border-color:var(--primary);}
|
||||
select.form-input{appearance:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;padding-right:32px;cursor:pointer;}
|
||||
.form-input:disabled{background:#F5F5F5;color:var(--text-secondary);cursor:not-allowed;}
|
||||
@@ -457,8 +458,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域 -->
|
||||
<div class="form-item">
|
||||
<!-- 参加人员范围:固定为指定人员,直接展示指定区域(新增模式下隐藏) -->
|
||||
<div class="form-item" id="personScopeItem">
|
||||
<div class="form-label"><span class="req">*</span> 参加人员范围</div>
|
||||
<!-- [交互] 指定机构默认为组织单位,可额外勾选其他单位/部门 -->
|
||||
<div class="person-panel show" id="personPanel" style="margin-top:0;">
|
||||
@@ -678,6 +679,7 @@ function openPlanModal(){
|
||||
document.getElementById('plan-modal-title').textContent = '新增单位体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '确认新增';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(true);
|
||||
document.getElementById('plan-modal-overlay').classList.add('open');
|
||||
document.getElementById('plan-drawer').classList.add('open');
|
||||
}
|
||||
@@ -686,6 +688,13 @@ function closePlanModal(){
|
||||
document.getElementById('plan-drawer').classList.remove('open');
|
||||
}
|
||||
|
||||
/* 新增模式:体检年份锁定为当年、隐藏参加人员范围;编辑模式恢复可编辑 */
|
||||
function setPlanFormMode(isAdd){
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
yearSel.disabled = isAdd;
|
||||
document.getElementById('personScopeItem').style.display = isAdd ? 'none' : '';
|
||||
}
|
||||
|
||||
/* [交互] 编辑:复用新增抽屉,按已存计划回填全部字段 */
|
||||
function openPlanEdit(el){
|
||||
var tr = el.closest('tr');
|
||||
@@ -696,6 +705,7 @@ function openPlanEdit(el){
|
||||
document.getElementById('plan-modal-title').textContent = '编辑单位体检计划';
|
||||
document.getElementById('plan-save-btn').textContent = '保存';
|
||||
resetPlanForm();
|
||||
setPlanFormMode(false);
|
||||
document.getElementById('planUnit').value = d.unit;
|
||||
var yearSel = document.querySelector('#plan-drawer .plan-year');
|
||||
for(var i=0;i<yearSel.options.length;i++){ if(yearSel.options[i].value === d.year){ yearSel.selectedIndex = i; break; } }
|
||||
@@ -1223,7 +1233,8 @@ function savePlan(){
|
||||
if(!dateFrom || !dateTo){ showToast('请选择体检计划日期范围'); return; }
|
||||
if(dateFrom > dateTo){ showToast('体检计划开始日期不能晚于结束日期'); return; }
|
||||
var personType = 'specific';
|
||||
if(selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
/* 新增模式隐藏参加人员范围区域,仅编辑时校验 */
|
||||
if(editingPlanRid && selectedInstitutions.length === 0 && selectedEmployees.length === 0){
|
||||
showToast('请至少选择指定机构或指定员工'); return;
|
||||
}
|
||||
var apptOn = document.getElementById('switchAppt').classList.contains('on');
|
||||
|
||||
@@ -305,6 +305,8 @@
|
||||
<button class="btn btn-primary" onclick="openAddModal()">+ 添加指定体检医院员工</button>
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-default">查看导出任务</button>
|
||||
<button class="btn btn-default">批量导入人员</button>
|
||||
<button class="btn btn-default">查看导入任务</button>
|
||||
<button class="btn btn-default">批量删除</button>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user