2 lines
5.4 KiB
JavaScript
2 lines
5.4 KiB
JavaScript
import{o as H,ap as J,aq as Q,ac as X,bi as Z,q as n,r as _,s as c,v as h,D as p,L as M,u as ee,by as ae,K as te,b6 as se,bc as le,F as S,G as C,O as b,bf as oe,T as Y,bB as ne,P as x,ae as z,b9 as ie,M as g,ba as re,p as A,n as ce}from"./.pnpm-C1KTa5cB.js";import{d,i as ue}from"./dayjs-DznSeB-q.js";import{g as de}from"./tcm-BlzCcc0R.js";import{r as me,g as fe}from"./doctor-HO-u4a0b.js";import{i as f,_ as ve}from"./index-BzVi6Aa3.js";const _e={class:"embedded-panel"},pe={class:"panel-toolbar"},be={class:"toolbar-actions"},ge={class:"doctor-list"},ye={key:2,class:"paiban-time-container"},he={class:"date-selector"},De={key:0,class:"time-slots-container"},ke={class:"time-slots-grid"},we=["onClick"],Te={class:"slot-time"},Ye=H({__name:"PaibanPanel",setup(Ee,{expose:I}){d.extend(ue);const u=g(!1),E=g(!1),y=g([]),v=g([]),o=g(0),r=g([]);let D=null,k=!1;const s=re({date:"",selectedTime:""}),F=A(()=>{if(!o.value||r.value.length===0)return[];const e=[],a=["日","一","二","三","四","五","六"],t=d().startOf("day");for(const i of r.value){const m=d(i);m.isBefore(t)||e.push({date:i,label:`${m.format("MM月DD日")} (${a[m.day()]})`})}return e}),B=A(()=>{if(!s.date||v.value.length===0)return[];const e=d().format("YYYY-MM-DD");if(s.date!==e)return v.value;const a=d();return v.value.map(t=>{const i=d(`${s.date} ${t.time}`);return i.isBefore(a)||i.isSame(a,"minute")?{...t,available:!1}:t})});async function R(){try{u.value=!0;const e=await de();y.value=e||[],y.value.length>0&&!o.value&&(o.value=y.value[0].id,await P())}catch(e){console.error("加载医生列表失败:",e),f.msgError("加载医生列表失败")}finally{u.value=!1}}async function P(){s.selectedTime="",s.date="",v.value=[],r.value=[],o.value&&await N()}async function N(){if(o.value)try{u.value=!0;const e=d().format("YYYY-MM-DD"),a=d().add(6,"day").format("YYYY-MM-DD"),t=await me({doctor_id:o.value,start_date:e,end_date:a,status:1});if(t!=null&&t.lists&&t.lists.length>0){if(r.value=[...new Set(t.lists.map(i=>i.date))],r.value.sort(),await ce(),r.value.length>0){const i=d().format("YYYY-MM-DD"),m=r.value.includes(i)?i:r.value[0];V(m)}}else r.value=[],f.msgWarning("该医生暂无排班")}catch(e){console.error("加载医生排班失败:",e),f.msgError("加载医生排班失败"),r.value=[]}finally{u.value=!1}}function V(e){s.date=e,s.selectedTime="",o.value&&w()}async function w(e=!1){if(!(!o.value||!s.date)&&!k)try{k=!0,e||(u.value=!0);const a=await fe({doctor_id:o.value,appointment_date:s.date,period:"all"});v.value=((a==null?void 0:a.slots)||[]).map(t=>({time:t.time,available:t.available,hasAppointment:!!(t.has_appointment??t.available===!1),quota:t.available?1:0}))}catch(a){console.error("加载时间段失败:",a),e||f.msgError("加载时间段失败"),v.value=[]}finally{k=!1,e||(u.value=!1)}}function W(e){if(!e.available){f.msgWarning("该时间段不可预约");return}s.selectedTime=e.time}async function q(){if(!(!o.value||!s.date)){if(k){f.msgWarning("正在刷新中,请稍候");return}try{E.value=!0;const e=s.selectedTime;if(s.selectedTime="",await w(),e){const a=v.value.find(t=>t.time===e);a!=null&&a.available&&(s.selectedTime=e)}f.msgSuccess("刷新成功")}catch(e){console.error("刷新失败:",e),f.msgError("刷新失败,请重试")}finally{E.value=!1}}}function j(){L(),D=window.setInterval(()=>{o.value&&s.date&&w(!0)},5e3)}function L(){D&&(clearInterval(D),D=null)}async function G(){if(o.value&&s.date){await w();return}await R()}return I({refresh:G,loading:u}),J(()=>{R(),j()}),Q(()=>{L()}),(e,a)=>{const t=te,i=oe,m=le,T=ne,$=se,U=ie,K=Z;return X((n(),_("section",_e,[c("div",pe,[a[2]||(a[2]=c("div",null,[c("h2",null,"医生排班"),c("p",null,"查看近 7 日出诊医生及可约时段(与医生排班管理同口径)")],-1)),c("div",be,[h(t,{icon:ee(ae),loading:E.value,disabled:!o.value||!s.date,onClick:q},{default:p(()=>[...a[1]||(a[1]=[M(" 刷新时段 ",-1)])]),_:1},8,["icon","loading","disabled"])])]),h(U,{model:s,"label-width":"88px",class:"paiban-form"},{default:p(()=>[h($,{label:"选择医生"},{default:p(()=>[c("div",ge,[h(m,{modelValue:o.value,"onUpdate:modelValue":a[0]||(a[0]=l=>o.value=l),onChange:P},{default:p(()=>[(n(!0),_(S,null,C(y.value,l=>(n(),b(i,{key:l.id,value:l.id,class:"doctor-radio"},{default:p(()=>[M(Y(l.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"]),!u.value&&y.value.length===0?(n(),b(T,{key:0,description:"暂无可用医生","image-size":64})):x("",!0)])]),_:1}),h($,{label:"排班时间"},{default:p(()=>[o.value?o.value&&r.value.length===0?(n(),b(T,{key:1,description:"该医生暂无排班","image-size":72})):(n(),_("div",ye,[c("div",he,[(n(!0),_(S,null,C(F.value,l=>(n(),b(t,{key:l.date,type:s.date===l.date?"primary":"",class:"date-button",onClick:O=>V(l.date)},{default:p(()=>[M(Y(l.label),1)]),_:2},1032,["type","onClick"]))),128))]),s.date?(n(),_("div",De,[c("div",ke,[(n(!0),_(S,null,C(B.value,l=>(n(),_("div",{key:l.time,class:z(["time-slot-item",{available:l.available,unavailable:!l.available,selected:s.selectedTime===l.time}]),onClick:O=>W(l)},[c("div",Te,Y(l.time),1),c("div",{class:z(["slot-status",{"status-available":l.available}])},Y(l.available?"可约":l.hasAppointment?"已约":"空号"),3)],10,we))),128))]),B.value.length===0?(n(),b(T,{key:0,description:"当前日期暂无可展示时段","image-size":64})):x("",!0)])):x("",!0)])):(n(),b(T,{key:0,description:"请先选择医生","image-size":72}))]),_:1})]),_:1},8,["model"])])),[[K,u.value]])}}}),Re=ve(Ye,[["__scopeId","data-v-e7899ed0"]]);export{Re as default};
|