2 lines
14 KiB
JavaScript
2 lines
14 KiB
JavaScript
import{d as ie,W as re,L as de,N as ue,T as ce,M as me}from"./element-plus-Bm2jcHo4.js";import{_ as pe}from"./index.vue_vue_type_script_setup_true_lang-DX-OsjLf.js";import{d as $}from"./dayjs-DG77mNTn.js";import{a8 as _e}from"./@element-plus/icons-vue-8Um_rfcd.js";import{u as ve}from"./usePaging-DofycyjW.js";import{q as ge}from"./first_visit-Ifm9U8v6.js";import{f as he,A as p,b as fe,d as we,ak as r,I as d,J as e,a as _,aN as h,O as v,F as k,ap as L,H as W,G,aP as ye}from"./@vue/runtime-core-C6bnekPw.js";import{Q as t,o as x}from"./@vue/shared-mAAVTE9n.js";import{y as f,a as be,n as ke,r as xe}from"./@vue/reactivity-DiY1c2vO.js";import{_ as Ne}from"./index-CJJeyIXM.js";import"./@vue/runtime-dom-DDAG46FW.js";import"./lodash-D3kF6u-c.js";import"./lodash-es-C2A-Pj28.js";import"./@popperjs/core-C5az9QE8.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-QlpZ4wdW.js";import"./pinia-B8cvXbiZ.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-1S4fJlii.js";import"./@vueuse/shared-Cl3lVqjz.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-CNLwa9wG.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DRNXw7y3.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-C4onkBvW.js";const De={class:"progress-board"},Se={class:"board-section overview-section"},qe={class:"section-heading"},Ce={class:"heading-copy"},Me={class:"heading-badge"},$e={class:"scope-chip"},Ae={class:"overview-grid"},Pe={class:"overview-card"},Le={class:"overview-card"},Te={key:0},Ve={key:1},Ye={key:0,class:"remaining-detail"},Ee={class:"remaining-detail-heading"},ze={class:"remaining-doctor-list"},Be={class:"remaining-doctor-identity"},Ie={class:"doctor-index"},Re={class:"remaining-doctor-metrics"},Oe={class:"is-remaining"},Fe={class:"board-section schedule-section"},je={class:"section-heading"},Ue={class:"heading-copy"},We={class:"heading-badge"},Ge={class:"schedule-range"},He={class:"schedule-grid"},Je=["aria-pressed","onClick"],Qe={class:"schedule-date"},Ke={class:"schedule-card-stats"},Xe={class:"schedule-card-action"},Ze={class:"schedule-drilldown"},et={class:"drilldown-heading"},tt={key:0,class:"doctor-schedule-list"},st={class:"doctor-identity"},ot={class:"doctor-index"},nt={class:"doctor-windows"},lt={class:"doctor-metric"},at={class:"doctor-metric doctor-metric-booked"},it={key:0,class:"doctor-metric doctor-metric-completed"},rt={class:"doctor-metric doctor-metric-passed"},dt={class:"doctor-metric doctor-metric-empty"},ut={class:"board-section queue-section"},ct={class:"section-heading queue-heading"},mt={class:"heading-copy"},pt={class:"queue-count"},_t={class:"queue-number"},vt={class:"patient-cell"},gt={class:"appointment-clock"},ht={key:0,class:"pagination-wrap"},ft=he({__name:"ProgressPanel",emits:["openDiagnosis"],setup(wt,{expose:H,emit:J}){const Q=J,w=$().format("YYYY-MM-DD"),y=ke(w),A=xe({keyword:"",status:1,start_date:w,end_date:w}),{pager:a,getLists:D,resetPage:K}=ve({fetchFun:ge,params:A,size:15,firstLoading:!0,latestOnly:!0}),g=p(()=>{var s,n,i,m,c,S,q,C,M,o,b,B,I,R,O,F,j,U;return{totalVisits:Number(((n=(s=a.extend)==null?void 0:s.today_overview)==null?void 0:n.total_visits)||0),booked:Number(((m=(i=a.extend)==null?void 0:i.today_overview)==null?void 0:m.booked)||0),completed:Number(((S=(c=a.extend)==null?void 0:c.today_overview)==null?void 0:S.completed)||0),missed:Number(((C=(q=a.extend)==null?void 0:q.today_overview)==null?void 0:C.missed)||0),emptySlots:Number(((o=(M=a.extend)==null?void 0:M.today_overview)==null?void 0:o.empty_slots)||0),passedSlots:Number(((B=(b=a.extend)==null?void 0:b.today_overview)==null?void 0:B.passed_slots)||0),remainingSlots:Number(((R=(I=a.extend)==null?void 0:I.today_overview)==null?void 0:R.remaining_slots)??((F=(O=a.extend)==null?void 0:O.today_overview)==null?void 0:F.empty_slots)??0),doctorCount:Number(((U=(j=a.extend)==null?void 0:j.today_overview)==null?void 0:U.doctor_count)||0)}}),l=p(()=>{var s;return((s=a.extend)==null?void 0:s.schedule_mode)==="ownership"}),N=p(()=>{var n;const s=Array.isArray((n=a.extend)==null?void 0:n.week_schedule)?a.extend.week_schedule:[];return s.length?s:Array.from({length:7},(i,m)=>{const c=$().add(m,"day");return{date:c.format("YYYY-MM-DD"),date_text:c.format("MM-DD"),weekday:`周${"日一二三四五六"[c.day()]}`,total_slots:0,booked_slots:0,passed_slots:0,remaining_slots:0,empty_slots:0,doctor_count:0,doctors:[],total_appointments:0,waiting_appointments:0,completed_appointments:0,missed_appointments:0}})}),u=p(()=>N.value.find(s=>s.date===y.value)||N.value[0]||{date:w,date_text:$().format("MM-DD"),weekday:`周${"日一二三四五六"[$().day()]}`,total_slots:0,booked_slots:0,passed_slots:0,remaining_slots:0,empty_slots:0,doctor_count:0,doctors:[],total_appointments:0,waiting_appointments:0,completed_appointments:0,missed_appointments:0}),T=p(()=>{var s;return Array.isArray((s=u.value)==null?void 0:s.doctors)?u.value.doctors:[]}),V=p(()=>{const s=N.value.find(i=>i.date===w);return(Array.isArray(s==null?void 0:s.doctors)?s.doctors:[]).map(i=>({...i,remaining_slots:Number(i.remaining_slots??i.empty_slots??0),passed_slots:Number(i.passed_slots||0)})).sort((i,m)=>m.remaining_slots-i.remaining_slots||m.booked_slots-i.booked_slots||String(i.doctor_name||"").localeCompare(String(m.doctor_name||""),"zh-CN"))}),Y=p(()=>{const s=u.value;return`${s.date_text||""} ${s.weekday||""} `}),E=p(()=>y.value===w?"今日":Y.value.trim()||y.value),X=p(()=>{var s,n;return((n=(s=a.extend)==null?void 0:s.scope)==null?void 0:n.label)||"按权限加载"}),Z=p(()=>{const s=N.value;return s.length?`${s[0].date_text} 至 ${s[s.length-1].date_text}`:""});let P=null;function ee(s){return D(s)}function te(s){s&&(y.value=s,A.start_date=s,A.end_date=s,K())}function z(s){const n=l.value?s.appointment_times:s.schedule_windows,i=Array.isArray(n)?n.filter(Boolean):[];return i.length?i.join("、"):l.value?"暂无预约时刻":"未设置具体时段"}function se(s){return String(s.appointment_time||"").slice(0,5)||"—"}function oe(s){if(s.queue_status==="consulting")return"0(进行中)";if(s.queue_status==="next")return"0(待接诊)";const n=Math.max(0,Number(s.ahead_count||0));return n===0?"0 位":`${n} 位 · 约 ${Number(s.estimated_wait_minutes||n*15)} 分钟`}function ne(s){return s==="consulting"?"success":s==="next"?"warning":s==="completed"?"success":s==="missed"?"danger":"info"}function le({row:s}){return Number(s.is_self_patient)===1?"queue-row-self":""}function ae(s){Q("openDiagnosis",s)}return H({refresh:ee,loading:p(()=>a.loading)}),fe(()=>{D(),P=setInterval(()=>D({silent:!0}),15e3)}),we(()=>{P&&clearInterval(P)}),(s,n)=>{const i=ie,m=re,c=ue,S=ce,q=me,C=pe,M=de;return r(),d("div",De,[e("section",Se,[e("div",qe,[e("div",Ce,[n[1]||(n[1]=e("h2",null,"今日面诊概览",-1)),e("span",Me,t(l.value?"按本人归属":"与排班合并"),1)]),e("span",$e,[_(i,null,{default:h(()=>[_(f(_e))]),_:1}),v(t(X.value),1)])]),e("div",Ae,[e("article",Pe,[e("span",null,t(l.value?"今日本人面诊":"今日面诊总号源"),1),e("strong",null,t(g.value.totalVisits),1),e("small",null,t(g.value.doctorCount)+" 位"+t(l.value?"接诊":"排班")+"医生",1)]),e("article",Le,[e("span",null,t(l.value?"待面诊":"已预约"),1),e("strong",null,t(g.value.booked),1),e("small",null,t(l.value?"本人归属患者的有效挂号":"按有效挂号占用号源"),1)]),e("article",{class:x(["overview-card",l.value?"overview-card-completed":"overview-card-empty"])},[e("span",null,t(l.value?"已完成":"空号"),1),e("strong",null,t(l.value?g.value.completed:g.value.remainingSlots),1),l.value?(r(),d("small",Te,"已过号 "+t(g.value.missed)+" 人",1)):(r(),d("small",Ve,"过号 "+t(g.value.passedSlots)+" · 未挂号 "+t(g.value.remainingSlots),1))],2)]),!l.value&&V.value.length?(r(),d("div",Ye,[e("div",Ee,[n[2]||(n[2]=e("h3",null,"医生剩余号源详情",-1)),e("span",null,"合计剩余可约 "+t(g.value.remainingSlots),1)]),e("div",ze,[(r(!0),d(k,null,L(V.value,(o,b)=>(r(),d("article",{key:o.doctor_id,class:"remaining-doctor-row"},[e("div",Be,[e("span",Ie,t(b+1),1),e("div",null,[e("strong",null,t(o.doctor_name),1),e("small",null,t(z(o)),1)])]),e("div",Re,[e("span",null,[n[3]||(n[3]=v("过号 ",-1)),e("strong",null,t(o.passed_slots||0),1)]),e("span",Oe,[n[4]||(n[4]=v("未挂号 / 剩余 ",-1)),e("strong",null,t(o.remaining_slots||0),1)])])]))),128))])])):W("",!0)]),e("section",Fe,[e("div",je,[e("div",Ue,[e("h2",null,t(l.value?"近一周面诊安排":"近一周排班"),1),e("span",We,t(l.value?"本人患者":"今日起 7 天"),1)]),e("span",Ge,t(Z.value),1)]),e("div",He,[(r(!0),d(k,null,L(N.value,o=>(r(),d("button",{key:o.date,type:"button",class:x(["schedule-card",{"is-today":o.date===f(w),"is-selected":o.date===y.value}]),"aria-pressed":o.date===y.value,onClick:b=>te(o.date)},[e("span",Qe,t(o.date_text)+" "+t(o.weekday),1),e("strong",null,t(l.value?o.total_appointments:o.total_slots),1),e("span",Ke,[e("span",null,t(l.value?"待诊":"已约")+" "+t(l.value?o.waiting_appointments:o.booked_slots),1),n[5]||(n[5]=e("i",null,"/",-1)),e("span",{class:x({"is-completed":l.value})},t(l.value?"完成":"剩余")+" "+t(l.value?o.completed_appointments:o.remaining_slots??o.empty_slots),3)]),e("span",Xe,[e("span",null,t(o.doctor_count)+" 位医生",1),e("span",null,t(o.date===y.value?"正在查看":"查看明细")+" ›",1)])],10,Je))),128))]),e("div",Ze,[e("div",et,[e("div",null,[e("h3",null,t(Y.value)+t(l.value?"面诊安排":"排班明细"),1),e("p",null,"共 "+t(u.value.doctor_count)+" 位"+t(l.value?"接诊":"排班")+"医生,点击上方日期可切换",1)]),e("div",{class:x(["drilldown-summary",{"is-ownership":l.value}])},[e("span",null,[v(t(l.value?"面诊总数":"总号源")+" ",1),e("strong",null,t(l.value?u.value.total_appointments:u.value.total_slots),1)]),e("span",null,[v(t(l.value?"待面诊":"已预约")+" ",1),e("strong",null,t(l.value?u.value.waiting_appointments:u.value.booked_slots),1)]),l.value?(r(),d(k,{key:0},[e("span",null,[n[6]||(n[6]=v("已完成 ",-1)),e("strong",null,t(u.value.completed_appointments),1)]),e("span",null,[n[7]||(n[7]=v("已过号 ",-1)),e("strong",null,t(u.value.missed_appointments),1)])],64)):(r(),d(k,{key:1},[e("span",null,[n[8]||(n[8]=v("过号 ",-1)),e("strong",null,t(u.value.passed_slots||0),1)]),e("span",null,[n[9]||(n[9]=v("剩余可约 ",-1)),e("strong",null,t(u.value.remaining_slots??u.value.empty_slots),1)])],64))],2)]),T.value.length?(r(),d("div",tt,[(r(!0),d(k,null,L(T.value,(o,b)=>(r(),d("article",{key:o.doctor_id,class:x(["doctor-schedule-row",{"is-ownership":l.value}])},[e("div",st,[e("span",ot,t(b+1),1),e("div",null,[e("strong",null,t(o.doctor_name),1),e("small",null,t(l.value?"本人患者接诊医生":"医生排班"),1)])]),e("div",nt,[e("span",null,t(l.value?"预约时刻":"排班时段"),1),e("strong",null,t(z(o)),1)]),e("div",lt,[e("span",null,t(l.value?"面诊总数":"总号源"),1),e("strong",null,t(l.value?o.total_appointments:o.total_slots),1)]),e("div",at,[e("span",null,t(l.value?"待面诊":"已预约"),1),e("strong",null,t(l.value?o.waiting_appointments:o.booked_slots),1)]),l.value?(r(),d("div",it,[n[10]||(n[10]=e("span",null,"完成 / 过号",-1)),e("strong",null,t(o.completed_appointments)+" / "+t(o.missed_appointments),1)])):(r(),d(k,{key:1},[e("div",rt,[n[11]||(n[11]=e("span",null,"过号",-1)),e("strong",null,t(o.passed_slots||0),1)]),e("div",dt,[n[12]||(n[12]=e("span",null,"未挂号 / 剩余",-1)),e("strong",null,t(o.remaining_slots??o.empty_slots),1)])],64))],2))),128))])):(r(),G(m,{key:1,"image-size":56,description:l.value?"该日期暂无本人归属患者的有效挂号":"该日期暂无当前权限范围内的医生排班"},null,8,["description"]))])]),e("section",ut,[e("div",ct,[e("div",mt,[e("h2",null,t(E.value)+"候诊列表",1),n[13]||(n[13]=e("span",{class:"heading-badge"},"按医生排队",-1)),e("span",pt,"共 "+t(f(a).count)+" 人",1)]),n[14]||(n[14]=e("span",{class:"refresh-time"},"每 15 秒自动刷新",-1))]),ye((r(),G(q,{data:f(a).lists,class:"queue-table","row-class-name":le,onRowDblclick:ae},{empty:h(()=>[_(m,{description:`当前权限范围内${E.value}暂无候诊患者`},null,8,["description"])]),default:h(()=>[_(c,{label:"排队",width:"92"},{default:h(({row:o})=>[e("span",_t,t(o.queue_no||"—"),1)]),_:1}),_(c,{label:"患者","min-width":"170"},{default:h(({row:o})=>[e("div",vt,[e("strong",null,t(o.patient_name||"未命名患者"),1),e("span",null,t(o.phone_masked||"无手机号"),1)])]),_:1}),_(c,{prop:"doctor_name",label:"医生","min-width":"130","show-overflow-tooltip":""}),_(c,{label:"预约时间","min-width":"135"},{default:h(({row:o})=>[e("span",gt,t(se(o)),1)]),_:1}),_(c,{label:"前方等待","min-width":"180"},{default:h(({row:o})=>[e("span",{class:x(["waiting-text",`is-${o.queue_status||"waiting"}`])},t(oe(o)),3)]),_:1}),_(c,{label:"状态","min-width":"110"},{default:h(({row:o})=>[_(S,{size:"small",round:"",effect:"light",type:ne(o.queue_status)},{default:h(()=>[v(t(o.queue_status_text||"等待中"),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])),[[M,f(a).loading]]),f(a).count>f(a).size?(r(),d("div",ht,[_(C,{modelValue:f(a),"onUpdate:modelValue":n[0]||(n[0]=o=>be(a)?a.value=o:null),onChange:f(D)},null,8,["modelValue","onChange"])])):W("",!0)])])}}}),as=Ne(ft,[["__scopeId","data-v-315ced2e"]]);export{as as default};
|