Files
zyt/server/public/admin/assets/roster-CtZQfngt.js
T
2026-07-03 12:07:34 +08:00

2 lines
18 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{o as le,M as p,ap as qe,q as v,r as k,v as l,D as o,s as _,b9 as Ue,b6 as $e,b7 as Se,K as Ie,L as s,bh as Me,T as Y,ac as Be,O as M,bj as We,bk as he,F as N,G as T,ae as Re,bi as Ne,bg as Te,bt as Le,cy as Fe,bm as je,bn as ze,J as Oe,bc as Ae,bf as Ge,P as te,bp as Pe,cz as Je,bd as Ke,p as L,e as He}from"./.pnpm-BGZW0UGg.js";import{d as B,i as Qe}from"./dayjs-BnultS00.js";import{i as m,_ as Xe}from"./index-CeIwrh_6.js";import{h as Ze,i as et,f as tt,r as lt,j as at}from"./doctor-CF92xvl4.js";const ot={class:"doctor-roster p-4"},st={class:"flex justify-between items-center"},nt={class:"mb-4"},ut={class:"text-center mb-4 text-gray-600"},dt=["onClick"],rt={key:0,class:"text-xs text-gray-400 text-center py-2"},it={key:1,class:"space-y-1"},mt={class:"flex items-center gap-2 flex-wrap"},ft={class:"w-full space-y-2"},pt=le({name:"doctorRoster"}),vt=le({...pt,setup(_t){B.extend(Qe);const F=p(""),b=p(B().startOf("isoWeek")),j=p(!1),W=p(!1),V=p(null),x=p(""),P=p([]),U=p(!1),z=p(!1),r=p({id:null,doctorId:0,date:"",start_time:"09:00",end_time:"12:00",shift_type:"",slot_minutes:15,status:1,quota:0,max_patients:0,remark:""}),$=p(!1),O=p(!1),J=()=>[{start_time:"09:00",end_time:"12:00",shift_type:"day",slot_minutes:15,quota:0},{start_time:"14:00",end_time:"18:00",shift_type:"day",slot_minutes:15,quota:0}],u=p({doctorIds:[],dateRange:[],weekdays:[1,2,3,4,5],status:1,remark:"",segments:J()}),q=p([]),ae=L(()=>{const t=F.value.trim();return t?q.value.filter(e=>e.doctorName.includes(t)):q.value}),oe=L(()=>!V.value||!x.value?"当日排班":`${V.value.doctorName} · ${x.value}`),se=L(()=>{const t=[],e=["周一","周二","周三","周四","周五","周六","周日"];for(let d=0;d<7;d++){const i=b.value.add(d,"day");t.push({date:i.format("YYYY-MM-DD"),label:`${e[d]} ${i.format("MM-DD")}`})}return t}),ne=L(()=>{const t=b.value.format("YYYY-MM-DD"),e=b.value.add(6,"day").format("YYYY-MM-DD");return`${t}${e}`});function K(t){return{1:"出诊",2:"停诊",3:"休息",4:"请假"}[t]??String(t)}function H(t){return t==="day"?"白班":t==="night"?"夜班":"—"}function ue(t){return t===1?"bg-emerald-50 text-emerald-800 border border-emerald-100":t===2?"bg-amber-50 text-amber-900 border border-amber-100":t===3?"bg-slate-100 text-slate-600 border border-slate-200":"bg-gray-100 text-gray-700 border border-gray-200"}function de(t){const e=`${t.start_time}-${t.end_time}`,d=H(t.shift_type),i=d!=="—"?` ${d}`:"";if(t.status===1){const n=t.quota>0?` 号源${t.quota}`:"";return`${e}${i} 出诊${n}`}return`${e}${i} ${K(t.status)}`}function Q(t,e){return t.rostersByDate[e]||[]}function h(){if(!V.value||!x.value)return;const t=q.value.find(e=>e.doctorId===V.value.doctorId);t&&(P.value=[...t.rostersByDate[x.value]||[]].sort((e,d)=>e.start_time.localeCompare(d.start_time)))}function re(t,e){V.value=t,x.value=e,h(),W.value=!0}function X(t){if(!V.value||!x.value){m.msgWarning("请先选择日期格子");return}t?r.value={id:t.id,doctorId:V.value.doctorId,date:x.value,start_time:t.start_time||"09:00",end_time:t.end_time||"12:00",shift_type:t.shift_type||"",slot_minutes:t.slot_minutes||15,status:t.status,quota:t.quota??0,max_patients:t.max_patients??0,remark:t.remark||""}:r.value={id:null,doctorId:V.value.doctorId,date:x.value,start_time:"09:00",end_time:"12:00",shift_type:"day",slot_minutes:15,status:1,quota:0,max_patients:0,remark:""},U.value=!0}async function ie(){const t=r.value;if(!t.start_time||!t.end_time){m.msgWarning("请填写接诊开始与结束时间");return}if(t.status===1&&t.start_time>=t.end_time){m.msgWarning("出诊时结束时间须晚于开始时间");return}if(t.start_time>=t.end_time){m.msgWarning("结束时间须晚于开始时间");return}z.value=!0;try{const e={doctor_id:t.doctorId,date:t.date,period:"segment",start_time:t.start_time,end_time:t.end_time,slot_minutes:t.slot_minutes||15,status:t.status,quota:t.status===1?t.quota:0,max_patients:t.status===1?t.max_patients:0,remark:t.remark||""};t.shift_type&&(e.shift_type=t.shift_type),t.id&&(e.id=t.id),await Ze(e),m.msgSuccess("保存成功"),U.value=!1,await c(),h()}catch{m.msgError("保存失败")}finally{z.value=!1}}async function me(t){try{await He.confirm("确定删除该时段?","提示",{type:"warning"})}catch{return}try{await et({id:t.id}),m.msgSuccess("已删除"),await c(),h()}catch{m.msgError("删除失败")}}const fe=async()=>{try{const t=await tt({page_no:1,page_size:1e3});q.value=((t==null?void 0:t.lists)||[]).map(e=>({doctorId:e.id,doctorName:e.name||e.account,rostersByDate:{}})),await c()}catch(t){console.error("加载医生列表失败:",t),m.msgError("加载医生列表失败")}},c=async()=>{j.value=!0;try{const t={start_date:b.value.format("YYYY-MM-DD"),end_date:b.value.add(6,"day").format("YYYY-MM-DD")},e=await lt(t),d=(e==null?void 0:e.lists)||[];q.value.forEach(i=>{i.rostersByDate={},d.forEach(n=>{if(n.doctor_id!==i.doctorId)return;const g=n.date;i.rostersByDate[g]||(i.rostersByDate[g]=[]),i.rostersByDate[g].push({id:n.id,status:n.status,quota:n.quota||0,max_patients:n.max_patients,start_time:n.start_time||pe(n.period),end_time:n.end_time||ve(n.period),shift_type:n.shift_type,slot_minutes:n.slot_minutes??15,remark:n.remark,period:n.period})})}),h()}catch(t){console.error("加载排班数据失败:",t),m.msgError("加载排班数据失败")}finally{j.value=!1}};function pe(t){return t==="morning"?"09:00":t==="afternoon"?"14:00":t==="night"?"18:00":"09:00"}function ve(t){return t==="morning"?"12:00":t==="afternoon"?"18:00":t==="night"?"22:00":"12:00"}const _e=()=>{c()},ye=()=>{b.value=b.value.subtract(1,"week"),c()},be=()=>{b.value=b.value.add(1,"week"),c()},ge=()=>{b.value=B().startOf("isoWeek"),c()},ke=()=>{u.value={doctorIds:[],dateRange:[],weekdays:[1,2,3,4,5],status:1,remark:"",segments:J()},$.value=!0},Ve=()=>{u.value.segments.push({start_time:"09:00",end_time:"12:00",shift_type:"day",slot_minutes:15,quota:0})},xe=()=>{u.value.segments.push({start_time:"18:00",end_time:"22:00",shift_type:"night",slot_minutes:15,quota:0})},ce=t=>{u.value.segments.length<=1||u.value.segments.splice(t,1)},we=async()=>{if(u.value.doctorIds.length===0){m.msgWarning("请选择医生");return}if(!u.value.dateRange||u.value.dateRange.length!==2){m.msgWarning("请选择日期范围");return}if(u.value.weekdays.length===0){m.msgWarning("请选择星期");return}for(const t of u.value.segments){if(!t.start_time||!t.end_time){m.msgWarning("请完善时段模板的开始与结束时间");return}if(t.start_time>=t.end_time){m.msgWarning("时段模板中结束时间须晚于开始时间");return}}O.value=!0;try{const t=[],e=B(u.value.dateRange[0]),d=B(u.value.dateRange[1]);let i=e;for(;i.isBefore(d)||i.isSame(d,"day");){const n=i.day();u.value.weekdays.includes(n)&&u.value.doctorIds.forEach(g=>{u.value.segments.forEach(w=>{const y={doctor_id:g,date:i.format("YYYY-MM-DD"),period:"segment",start_time:w.start_time,end_time:w.end_time,slot_minutes:w.slot_minutes||15,status:u.value.status,quota:u.value.status===1?w.quota:0,max_patients:0,remark:u.value.remark};w.shift_type&&(y.shift_type=w.shift_type),t.push(y)})}),i=i.add(1,"day")}if(t.length===0){m.msgWarning("没有符合条件的排班数据");return}await at({rosters:t}),m.msgSuccess(`批量保存成功!共处理 ${t.length} 条记录`),$.value=!1,await c()}catch(t){console.error("批量保存失败:",t),m.msgError("批量保存失败")}finally{O.value=!1}};return qe(()=>{fe()}),(t,e)=>{const d=Ie,i=Se,n=$e,g=Ue,w=Me,y=he,Z=We,De=Te,A=Le,R=Fe,S=ze,G=je,I=Oe,D=Ge,ee=Ae,Ce=Pe,E=Ke,Ye=Je,Ee=Ne;return v(),k("div",ot,[l(De,{shadow:"never"},{header:o(()=>[_("div",st,[e[25]||(e[25]=_("span",{class:"text-lg font-medium"},"医生排班管理",-1)),_("div",null,[l(d,{type:"success",onClick:ke},{default:o(()=>[...e[21]||(e[21]=[s("批量排班",-1)])]),_:1}),l(d,{onClick:ye},{default:o(()=>[...e[22]||(e[22]=[s("上一周",-1)])]),_:1}),l(d,{onClick:be},{default:o(()=>[...e[23]||(e[23]=[s("下一周",-1)])]),_:1}),l(d,{type:"primary",onClick:ge},{default:o(()=>[...e[24]||(e[24]=[s("本周",-1)])]),_:1})])])]),default:o(()=>[_("div",nt,[l(g,{inline:""},{default:o(()=>[l(n,{label:"医生"},{default:o(()=>[l(i,{modelValue:F.value,"onUpdate:modelValue":e[0]||(e[0]=a=>F.value=a),placeholder:"请输入医生姓名",clearable:"",style:{width:"200px"}},null,8,["modelValue"])]),_:1}),l(n,null,{default:o(()=>[l(d,{type:"primary",onClick:_e},{default:o(()=>[...e[26]||(e[26]=[s("查询",-1)])]),_:1})]),_:1})]),_:1})]),l(w,{type:"info",closable:!1,class:"mb-4","show-icon":""},{default:o(()=>[...e[27]||(e[27]=[s(" 每条排班为一段连续可挂号时间;同一天可添加多段(如白班 + 夜班)。休息时段不添加出诊段即可。号源间隔默认 15 分钟;号源数填 0 表示按时段长度自动满号。 ",-1)])]),_:1}),_("div",ut,Y(ne.value),1),Be((v(),M(Z,{data:ae.value,border:""},{default:o(()=>[l(y,{prop:"doctorName",label:"医生",width:"120",fixed:""}),(v(!0),k(N,null,T(se.value,a=>(v(),M(y,{key:a.date,label:a.label,"min-width":"168"},{default:o(({row:C})=>[_("div",{class:"day-cell rounded border border-dashed border-gray-200 p-1 min-h-[56px] cursor-pointer hover:bg-gray-50",onClick:f=>re(C,a.date)},[Q(C,a.date).length===0?(v(),k("div",rt,"点击管理")):(v(),k("div",it,[(v(!0),k(N,null,T(Q(C,a.date),f=>(v(),k("div",{key:f.id,class:Re(["text-xs px-1 py-0.5 rounded leading-tight",ue(f.status)])},Y(de(f)),3))),128))]))],8,dt)]),_:2},1032,["label"]))),128))]),_:1},8,["data"])),[[Ee,j.value]])]),_:1}),l(A,{modelValue:W.value,"onUpdate:modelValue":e[3]||(e[3]=a=>W.value=a),title:oe.value,width:"720px","destroy-on-close":""},{footer:o(()=>[l(d,{onClick:e[1]||(e[1]=a=>W.value=!1)},{default:o(()=>[...e[30]||(e[30]=[s("关闭",-1)])]),_:1}),l(d,{type:"primary",onClick:e[2]||(e[2]=a=>X())},{default:o(()=>[...e[31]||(e[31]=[s("添加时段",-1)])]),_:1})]),default:o(()=>[l(Z,{data:P.value,border:"",size:"small","max-height":"360"},{default:o(()=>[l(y,{label:"时间",width:"150"},{default:o(({row:a})=>[s(Y(a.start_time)+" - "+Y(a.end_time),1)]),_:1}),l(y,{label:"班次",width:"80"},{default:o(({row:a})=>[s(Y(H(a.shift_type)),1)]),_:1}),l(y,{label:"状态",width:"88"},{default:o(({row:a})=>[s(Y(K(a.status)),1)]),_:1}),l(y,{label:"间隔",width:"72"},{default:o(({row:a})=>[s(Y(a.slot_minutes||15)+" 分",1)]),_:1}),l(y,{label:"号源",width:"72"},{default:o(({row:a})=>[s(Y(a.status===1?a.quota||"不限":"-"),1)]),_:1}),l(y,{label:"备注",prop:"remark","min-width":"100","show-overflow-tooltip":""}),l(y,{label:"操作",width:"140",fixed:"right"},{default:o(({row:a})=>[l(d,{type:"primary",link:"",onClick:C=>X(a)},{default:o(()=>[...e[28]||(e[28]=[s("编辑",-1)])]),_:1},8,["onClick"]),l(d,{type:"danger",link:"",onClick:C=>me(a)},{default:o(()=>[...e[29]||(e[29]=[s("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])]),_:1},8,["modelValue","title"]),l(A,{modelValue:U.value,"onUpdate:modelValue":e[13]||(e[13]=a=>U.value=a),title:r.value.id?"编辑时段":"添加时段",width:"520px","destroy-on-close":""},{footer:o(()=>[l(d,{onClick:e[12]||(e[12]=a=>U.value=!1)},{default:o(()=>[...e[39]||(e[39]=[s("取消",-1)])]),_:1}),l(d,{type:"primary",loading:z.value,onClick:ie},{default:o(()=>[...e[40]||(e[40]=[s("保存",-1)])]),_:1},8,["loading"])]),default:o(()=>[l(g,{model:r.value,"label-width":"110px"},{default:o(()=>[l(n,{label:"接诊时间",required:""},{default:o(()=>[_("div",mt,[l(R,{modelValue:r.value.start_time,"onUpdate:modelValue":e[4]||(e[4]=a=>r.value.start_time=a),start:"00:00",step:"00:5",end:"23:45",placeholder:"开始",style:{width:"120px"}},null,8,["modelValue"]),e[32]||(e[32]=_("span",null,"至",-1)),l(R,{modelValue:r.value.end_time,"onUpdate:modelValue":e[5]||(e[5]=a=>r.value.end_time=a),start:"00:00",step:"00:5",end:"23:45",placeholder:"结束",style:{width:"120px"}},null,8,["modelValue"])])]),_:1}),l(n,{label:"班次标签"},{default:o(()=>[l(G,{modelValue:r.value.shift_type,"onUpdate:modelValue":e[6]||(e[6]=a=>r.value.shift_type=a),placeholder:"选填",clearable:"",style:{width:"200px"}},{default:o(()=>[l(S,{label:"白班",value:"day"}),l(S,{label:"夜班",value:"night"})]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"号源间隔(分)"},{default:o(()=>[l(I,{modelValue:r.value.slot_minutes,"onUpdate:modelValue":e[7]||(e[7]=a=>r.value.slot_minutes=a),min:5,max:120,step:5},null,8,["modelValue"]),e[33]||(e[33]=_("span",{class:"ml-2 text-gray-500 text-sm"},"默认 15",-1))]),_:1}),l(n,{label:"状态"},{default:o(()=>[l(ee,{modelValue:r.value.status,"onUpdate:modelValue":e[8]||(e[8]=a=>r.value.status=a)},{default:o(()=>[l(D,{label:1},{default:o(()=>[...e[34]||(e[34]=[s("出诊",-1)])]),_:1}),l(D,{label:2},{default:o(()=>[...e[35]||(e[35]=[s("停诊",-1)])]),_:1}),l(D,{label:3},{default:o(()=>[...e[36]||(e[36]=[s("休息",-1)])]),_:1}),l(D,{label:4},{default:o(()=>[...e[37]||(e[37]=[s("请假",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),r.value.status===1?(v(),M(n,{key:0,label:"号源上限"},{default:o(()=>[l(I,{modelValue:r.value.quota,"onUpdate:modelValue":e[9]||(e[9]=a=>r.value.quota=a),min:0,max:200},null,8,["modelValue"]),e[38]||(e[38]=_("div",{class:"text-gray-500 text-xs mt-1"},"0 表示不限制(由时段÷间隔计算可约数)",-1))]),_:1})):te("",!0),r.value.status===1?(v(),M(n,{key:1,label:"最大接诊"},{default:o(()=>[l(I,{modelValue:r.value.max_patients,"onUpdate:modelValue":e[10]||(e[10]=a=>r.value.max_patients=a),min:0,max:500},null,8,["modelValue"])]),_:1})):te("",!0),l(n,{label:"备注"},{default:o(()=>[l(i,{modelValue:r.value.remark,"onUpdate:modelValue":e[11]||(e[11]=a=>r.value.remark=a),type:"textarea",rows:2},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"]),l(A,{modelValue:$.value,"onUpdate:modelValue":e[20]||(e[20]=a=>$.value=a),title:"批量排班",width:"780px","destroy-on-close":""},{footer:o(()=>[l(d,{onClick:e[19]||(e[19]=a=>$.value=!1)},{default:o(()=>[...e[58]||(e[58]=[s("取消",-1)])]),_:1}),l(d,{type:"primary",onClick:we,loading:O.value},{default:o(()=>[...e[59]||(e[59]=[s("确定",-1)])]),_:1},8,["loading"])]),default:o(()=>[l(g,{model:u.value,"label-width":"100px"},{default:o(()=>[l(n,{label:"选择医生",required:""},{default:o(()=>[l(G,{modelValue:u.value.doctorIds,"onUpdate:modelValue":e[14]||(e[14]=a=>u.value.doctorIds=a),multiple:"",placeholder:"请选择医生",class:"w-full",filterable:""},{default:o(()=>[(v(!0),k(N,null,T(q.value,a=>(v(),M(S,{key:a.doctorId,label:a.doctorName,value:a.doctorId},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"日期范围",required:""},{default:o(()=>[l(Ce,{modelValue:u.value.dateRange,"onUpdate:modelValue":e[15]||(e[15]=a=>u.value.dateRange=a),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"w-full"},null,8,["modelValue"])]),_:1}),l(n,{label:"星期",required:""},{default:o(()=>[l(Ye,{modelValue:u.value.weekdays,"onUpdate:modelValue":e[16]||(e[16]=a=>u.value.weekdays=a)},{default:o(()=>[l(E,{label:1},{default:o(()=>[...e[41]||(e[41]=[s("周一",-1)])]),_:1}),l(E,{label:2},{default:o(()=>[...e[42]||(e[42]=[s("周二",-1)])]),_:1}),l(E,{label:3},{default:o(()=>[...e[43]||(e[43]=[s("周三",-1)])]),_:1}),l(E,{label:4},{default:o(()=>[...e[44]||(e[44]=[s("周四",-1)])]),_:1}),l(E,{label:5},{default:o(()=>[...e[45]||(e[45]=[s("周五",-1)])]),_:1}),l(E,{label:6},{default:o(()=>[...e[46]||(e[46]=[s("周六",-1)])]),_:1}),l(E,{label:0},{default:o(()=>[...e[47]||(e[47]=[s("周日",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"时段模板"},{default:o(()=>[_("div",ft,[(v(!0),k(N,null,T(u.value.segments,(a,C)=>(v(),k("div",{key:C,class:"flex flex-wrap items-center gap-2 p-2 bg-gray-50 rounded"},[l(R,{modelValue:a.start_time,"onUpdate:modelValue":f=>a.start_time=f,start:"00:00",step:"00:05",end:"23:45",placeholder:"开始",style:{width:"110px"}},null,8,["modelValue","onUpdate:modelValue"]),e[49]||(e[49]=_("span",null,"—",-1)),l(R,{modelValue:a.end_time,"onUpdate:modelValue":f=>a.end_time=f,start:"00:00",step:"00:05",end:"23:45",placeholder:"结束",style:{width:"110px"}},null,8,["modelValue","onUpdate:modelValue"]),l(G,{modelValue:a.shift_type,"onUpdate:modelValue":f=>a.shift_type=f,placeholder:"班次",clearable:"",style:{width:"100px"}},{default:o(()=>[l(S,{label:"白班",value:"day"}),l(S,{label:"夜班",value:"night"})]),_:1},8,["modelValue","onUpdate:modelValue"]),e[50]||(e[50]=_("span",{class:"text-sm text-gray-500"},"间隔",-1)),l(I,{modelValue:a.slot_minutes,"onUpdate:modelValue":f=>a.slot_minutes=f,min:5,max:120,step:5,style:{width:"100px"}},null,8,["modelValue","onUpdate:modelValue"]),e[51]||(e[51]=_("span",{class:"text-sm text-gray-500"},"号源0=不限",-1)),l(I,{modelValue:a.quota,"onUpdate:modelValue":f=>a.quota=f,min:0,max:200,style:{width:"100px"}},null,8,["modelValue","onUpdate:modelValue"]),l(d,{type:"danger",link:"",onClick:f=>ce(C),disabled:u.value.segments.length<=1},{default:o(()=>[...e[48]||(e[48]=[s("删除",-1)])]),_:1},8,["onClick","disabled"])]))),128)),l(d,{type:"primary",link:"",onClick:Ve},{default:o(()=>[...e[52]||(e[52]=[s("+ 增加一段",-1)])]),_:1}),l(d,{type:"success",link:"",onClick:xe},{default:o(()=>[...e[53]||(e[53]=[s("+ 夜班 18:0022:00",-1)])]),_:1})])]),_:1}),l(n,{label:"排班状态",required:""},{default:o(()=>[l(ee,{modelValue:u.value.status,"onUpdate:modelValue":e[17]||(e[17]=a=>u.value.status=a)},{default:o(()=>[l(D,{label:1},{default:o(()=>[...e[54]||(e[54]=[s("出诊",-1)])]),_:1}),l(D,{label:2},{default:o(()=>[...e[55]||(e[55]=[s("停诊",-1)])]),_:1}),l(D,{label:3},{default:o(()=>[...e[56]||(e[56]=[s("休息",-1)])]),_:1}),l(D,{label:4},{default:o(()=>[...e[57]||(e[57]=[s("请假",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"备注"},{default:o(()=>[l(i,{modelValue:u.value.remark,"onUpdate:modelValue":e[18]||(e[18]=a=>u.value.remark=a),type:"textarea",rows:2},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])}}}),Vt=Xe(vt,[["__scopeId","data-v-3efc17b6"]]);export{Vt as default};