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