Files
zyt/server/public/admin/assets/index-C0800gAA.js
2026-08-05 14:06:07 +08:00

2 lines
15 KiB
JavaScript
Raw Permalink 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 U,ap as le,bx as ie,ac as ce,bi as de,q as s,r,s as e,v as l,D as c,u as p,cL as me,w as _e,cO as pe,L as m,T as o,P as b,by as ue,K as ve,O as u,bh as ge,bZ as fe,F as v,ae as k,d9 as L,da as T,cg as A,a1 as ye,G as M,db as he,t as G,bB as be,cP as ke,cJ as we,bX as xe,ba as $e,M as $,p as y}from"./.pnpm-CJoARskO.js";import{v as Ne}from"./stats-DaBfLuzV.js";import{_ as De}from"./index-DGIIeNfq.js";const Ce={class:"performance-dashboard","element-loading-text":"正在汇总权限范围内的数据"},Me={class:"dashboard-header"},Fe={class:"dashboard-heading"},Se={class:"dashboard-heading__icon"},ze={class:"dashboard-title-row"},Ee={class:"scope-badge"},Ie={key:0},Le={class:"dashboard-actions"},Te={key:0,class:"updated-at"},Ve={key:1,class:"dashboard-skeleton"},Be={class:"performance-strip","aria-label":"业绩概览"},Oe={class:"metric-card metric-card--primary"},Pe={class:"metric-value metric-value--money"},Re={class:"metric-card"},je={class:"metric-value metric-value--money"},Ae={class:"metric-card"},Ge={class:"metric-label-row"},Ue={class:"metric-value metric-value--money"},We={class:"metric-card metric-card--clock"},qe={class:"metric-value metric-value--time"},He={class:"metric-foot"},Je={class:"operating-grid","aria-label":"今日运营指标"},Ke={class:"metric-label"},Xe={class:"metric-comparisons"},Ze={class:"metric-hint"},Qe={class:"dashboard-grid dashboard-grid--rankings"},Ye={class:"dashboard-panel ranking-panel"},et={class:"panel-header"},tt={key:0,class:"ranking-list"},at={class:"ranking-main"},nt={class:"ranking-copy"},ot={class:"ranking-meter","aria-hidden":"true"},st={class:"ranking-value"},rt={class:"dashboard-panel ranking-panel"},lt={class:"panel-header"},it={key:0,class:"ranking-list"},ct={class:"ranking-main"},dt={class:"ranking-copy"},mt={class:"ranking-meter","aria-hidden":"true"},_t={class:"ranking-value ranking-value--money"},pt={class:"dashboard-grid dashboard-grid--bottom"},ut={class:"dashboard-panel trend-panel"},vt={class:"panel-header panel-header--stack-mobile"},gt={class:"dashboard-panel target-panel"},ft={class:"panel-header"},yt={class:"panel-meta"},ht={class:"target-block"},bt={class:"target-copy"},kt={key:0},wt={key:1},xt={class:"target-block target-block--secondary"},$t={class:"target-copy"},Nt={key:0,class:"target-empty-note"},Dt={class:"dashboard-notes"},Ct={key:3,class:"dashboard-empty"},Mt=U({name:"performanceDashboardPage"}),Ft=U({...Mt,setup(St){const h=()=>({direction:"flat",rate:null,previous:0}),V=()=>({scope:{key:"",scope_value:4,label:"",is_limited:!0,viewer_name:"",role_ids:[],role_names:[],department_names:[],visible_member_count:0},performance:{month_amount:0,month_compare_rate:null,month_compare_label:"",yesterday_amount:0,yesterday_compare_rate:null,yesterday_compare_label:"",personal_month_amount:0},today:{add_fans_count:0,appointment_total_count:0,interview_count:0,completed_order_count:0,completed_order_amount:0,paid_appointment_rate:0,interview_receive_rate:0,comparisons:{add_fans_count:h(),appointment_total_count:h(),interview_count:h(),completed_order_count:h(),completed_order_amount:h(),paid_appointment_rate:h(),interview_receive_rate:h()}},rankings:{appointments:{title:"实时挂号排行",kind:"assistant",scope_label:"",items:[]},performance:{title:"今日部门业绩排行",scope_label:"",items:[]}},trend:{date_range:[],dates:[],appointments:[],leads:[],orders:[]},target:{year_month:"",target_amount:0,completed_amount:0,completion_rate:null,personal_amount:0,personal_contribution_rate:null,department_count:0},meta:{generated_at:"",timezone:"",commission_note:"",rate_note:""}}),t=$e(V()),w=$(!1),F=$(!1),x=$(""),S=$("appointments"),z=$(new Date);let E;const W=[{label:"挂号",value:"appointments"},{label:"进线",value:"leads"},{label:"诊单",value:"orders"}],q=y(()=>{const a=t.scope.role_names.length?t.scope.role_names.join("、"):"管理员",n=t.scope.department_names.length?t.scope.department_names.join("、"):"未绑定部门";return`${t.scope.viewer_name||"当前账号"}${a}${n}`}),H=y(()=>[{key:"fans",label:"今日加粉",value:f(t.today.add_fans_count),hint:"按企微新增客户事件统计",comparisons:[t.today.comparisons.add_fans_count]},{key:"appointments",label:"今日挂号",value:f(t.today.appointment_total_count),hint:"状态为已预约、已完成或改期,排除已取消",comparisons:[t.today.comparisons.appointment_total_count]},{key:"orders",label:"今日接诊 / 诊单金额",value:"",hint:"按业务订单统计,排除取消、拒收和退款",comparisons:[{...t.today.comparisons.completed_order_count,label:"诊单"},{...t.today.comparisons.completed_order_amount,label:"金额"}]},{key:"appointmentRate",label:"付费挂号率",value:N(t.today.paid_appointment_rate),hint:"付费挂号数 / 加粉数",comparisons:[t.today.comparisons.paid_appointment_rate]},{key:"receiveRate",label:"面诊接诊率",value:N(t.today.interview_receive_rate),hint:"诊单数 / 面诊数",comparisons:[t.today.comparisons.interview_receive_rate]},{key:"interviews",label:"今日面诊",value:f(t.today.interview_count),hint:"状态为已完成的挂号",comparisons:[t.today.comparisons.interview_count]}]),J=y(()=>new Intl.DateTimeFormat("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(z.value)),K=y(()=>new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",weekday:"short"}).format(z.value)),X=y(()=>{const a=t.rankings.appointments.kind==="doctor"?"医生":"医助";return`${t.rankings.appointments.scope_label}内的${a}有效挂号数(不含已取消)`}),Z=y(()=>Math.max(0,...t.rankings.appointments.items.map(a=>Number(a.count||0)))),Q=y(()=>Math.max(0,...t.rankings.performance.items.map(a=>Number(a.amount||0)))),Y=y(()=>{const n={appointments:{label:"挂号",data:t.trend.appointments},leads:{label:"进线",data:t.trend.leads},orders:{label:"诊单",data:t.trend.orders}}[S.value];return{animationDuration:320,tooltip:{trigger:"axis",valueFormatter:d=>`${f(d)} 条`},grid:{left:42,right:18,top:24,bottom:30,containLabel:!0},xAxis:{type:"category",boundaryGap:!1,data:t.trend.dates,axisLine:{lineStyle:{color:"#d9e0e7"}},axisLabel:{color:"#7d8996"}},yAxis:{type:"value",minInterval:1,splitLine:{lineStyle:{color:"#edf1f4"}},axisLabel:{color:"#7d8996"}},series:[{name:n.label,type:"line",smooth:.35,showSymbol:!0,symbolSize:7,data:n.data,lineStyle:{color:"#0f8f83",width:3},itemStyle:{color:"#0f8f83",borderColor:"#ffffff",borderWidth:2},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:"rgba(15, 143, 131, 0.20)"},{offset:1,color:"rgba(15, 143, 131, 0.01)"}]}}}]}}),g=(a,n=2)=>${new Intl.NumberFormat("zh-CN",{minimumFractionDigits:n,maximumFractionDigits:n}).format(Number(a||0))}`,f=a=>new Intl.NumberFormat("zh-CN",{maximumFractionDigits:0}).format(Number(a||0)),N=a=>a===null?"暂无":`${Number(a||0).toFixed(1)}%`,B=a=>`${a>=0?"+":""}${Number(a).toFixed(1)}%`,O=a=>a===null||a===0?"":a>0?"is-positive":"is-negative",ee=a=>a==="up"?"is-positive":a==="down"?"is-negative":"is-flat",te=a=>{const n=a.label?`${a.label} `:"";if(a.direction==="flat")return`${n}较昨日持平`;const d=a.direction==="up"?"上升":"下降";return a.rate===null?`${n}较昨日${d}(昨日为 0`:`${n}较昨日${d} ${Math.abs(Number(a.rate)).toFixed(1)}%`},P=(a,n)=>n<=0||a<=0?"0%":`${Math.max(6,Math.min(100,Number(a)/n*100))}%`,R=a=>a===null||!Number.isFinite(Number(a))?0:Math.max(0,Math.min(100,Number(a))),D=async()=>{w.value=!0,x.value="";try{const a=await Ne();Object.assign(t,V(),a||{}),F.value=!0}catch(a){x.value=(a==null?void 0:a.msg)||(a==null?void 0:a.message)||"驾驶舱数据加载失败,请稍后重试"}finally{w.value=!1}};return le(()=>{D(),E=setInterval(()=>{z.value=new Date},1e3)}),ie(()=>{E&&clearInterval(E)}),(a,n)=>{const d=_e,I=ve,ae=ge,ne=fe,oe=ye,C=be,se=ke,j=xe,re=de;return ce((s(),r("div",Ce,[e("header",Me,[e("div",Fe,[e("div",Se,[l(d,null,{default:c(()=>[l(p(me))]),_:1})]),e("div",null,[e("div",ze,[n[1]||(n[1]=e("h1",null,"数据驾驶舱",-1)),e("span",Ee,[l(d,null,{default:c(()=>[l(p(pe))]),_:1}),m(" "+o(t.scope.label||"数据范围"),1)])]),e("p",null,[m(o(q.value)+" ",1),t.scope.visible_member_count>0?(s(),r("span",Ie," ,当前可见 "+o(t.scope.visible_member_count)+" 位成员 ",1)):b("",!0)])])]),e("div",Le,[t.meta.generated_at?(s(),r("div",Te," 数据更新于 "+o(t.meta.generated_at),1)):b("",!0),l(I,{icon:p(ue),loading:w.value,onClick:D},{default:c(()=>[...n[2]||(n[2]=[m("刷新数据",-1)])]),_:1},8,["icon","loading"])])]),x.value?(s(),u(ae,{key:0,class:"dashboard-error",type:"error",closable:!1,"show-icon":"",title:x.value},{default:c(()=>[l(I,{size:"small",onClick:D},{default:c(()=>[...n[3]||(n[3]=[m("重新加载",-1)])]),_:1})]),_:1},8,["title"])):b("",!0),!F.value&&w.value?(s(),r("div",Ve,[l(ne,{rows:12,animated:""})])):F.value?(s(),r(v,{key:2},[e("section",Be,[e("article",Oe,[n[4]||(n[4]=e("div",{class:"metric-label"},"本月实时业绩",-1)),e("div",Pe,o(g(t.performance.month_amount)),1),e("div",{class:k(["metric-foot",O(t.performance.month_compare_rate)])},[t.performance.month_compare_rate!==null?(s(),r(v,{key:0},[t.performance.month_compare_rate>=0?(s(),u(d,{key:0},{default:c(()=>[l(p(L))]),_:1})):(s(),u(d,{key:1},{default:c(()=>[l(p(T))]),_:1})),m(" "+o(t.performance.month_compare_label)+" "+o(B(t.performance.month_compare_rate)),1)],64)):(s(),r(v,{key:1},[m("上月同期暂无可比数据")],64))],2)]),e("article",Re,[n[5]||(n[5]=e("div",{class:"metric-label"},"昨日新增业绩",-1)),e("div",je,o(g(t.performance.yesterday_amount)),1),e("div",{class:k(["metric-foot",O(t.performance.yesterday_compare_rate)])},[t.performance.yesterday_compare_rate!==null?(s(),r(v,{key:0},[t.performance.yesterday_compare_rate>=0?(s(),u(d,{key:0},{default:c(()=>[l(p(L))]),_:1})):(s(),u(d,{key:1},{default:c(()=>[l(p(T))]),_:1})),m(" "+o(t.performance.yesterday_compare_label)+" "+o(B(t.performance.yesterday_compare_rate)),1)],64)):(s(),r(v,{key:1},[m("前一日暂无可比数据")],64))],2)]),e("article",Ae,[e("div",Ge,[n[6]||(n[6]=e("span",null,"本人本月业绩",-1)),l(oe,{content:t.meta.commission_note,placement:"top"},{default:c(()=>[l(d,{class:"metric-help"},{default:c(()=>[l(p(A))]),_:1})]),_:1},8,["content"])]),e("div",Ue,o(g(t.performance.personal_month_amount)),1),n[7]||(n[7]=e("div",{class:"metric-foot"},"仅统计当前登录账号",-1))]),e("article",We,[n[8]||(n[8]=e("div",{class:"metric-label"},"当前时间",-1)),e("div",qe,o(J.value),1),e("div",He,o(K.value),1)])]),e("section",Je,[(s(!0),r(v,null,M(H.value,i=>(s(),r("article",{key:i.key,class:"metric-card metric-card--compact"},[e("div",Ke,o(i.label),1),e("div",{class:k(["metric-value",{"metric-value--pair":i.key==="orders"}])},[i.key==="orders"?(s(),r(v,{key:0},[m(o(f(t.today.completed_order_count))+" ",1),n[9]||(n[9]=e("span",null,"/",-1)),m(" "+o(g(t.today.completed_order_amount)),1)],64)):(s(),r(v,{key:1},[m(o(i.value),1)],64))],2),e("div",Xe,[(s(!0),r(v,null,M(i.comparisons,_=>(s(),r("div",{key:`${i.key}-${_.label||"total"}`,class:k(["metric-foot",ee(_.direction)])},[_.direction==="up"?(s(),u(d,{key:0},{default:c(()=>[l(p(L))]),_:1})):_.direction==="down"?(s(),u(d,{key:1},{default:c(()=>[l(p(T))]),_:1})):(s(),u(d,{key:2},{default:c(()=>[l(p(he))]),_:1})),m(" "+o(te(_)),1)],2))),128))]),e("div",Ze,o(i.hint),1)]))),128))]),e("section",Qe,[e("article",Ye,[e("div",et,[e("div",null,[e("h2",null,o(t.rankings.appointments.title),1),e("p",null,o(X.value),1)]),n[10]||(n[10]=e("span",{class:"panel-meta"},"实时",-1))]),t.rankings.appointments.items.length?(s(),r("div",tt,[(s(!0),r(v,null,M(t.rankings.appointments.items,(i,_)=>(s(),r("div",{key:`appointment-${i.id}-${_}`,class:"ranking-row"},[e("span",{class:k(["ranking-index",{"is-top":_<2}])},o(_+1),3),e("div",at,[e("div",nt,[e("strong",null,o(i.name||"未命名成员"),1),e("span",null,o(f(i.count))+" 个挂号",1)]),e("div",ot,[e("span",{style:G({width:P(i.count,Z.value)})},null,4)])]),e("b",st,o(f(i.count)),1)]))),128))])):(s(),u(C,{key:1,"image-size":72,description:"当前数据范围内暂无挂号排行"}))]),e("article",rt,[e("div",lt,[e("div",null,[e("h2",null,o(t.rankings.performance.title),1),e("p",null,o(t.rankings.performance.scope_label)+"内今日计入业绩的业务订单",1)]),n[11]||(n[11]=e("span",{class:"panel-meta"},"今日",-1))]),t.rankings.performance.items.length?(s(),r("div",it,[(s(!0),r(v,null,M(t.rankings.performance.items,(i,_)=>(s(),r("div",{key:`performance-${i.id}-${_}`,class:"ranking-row"},[e("span",{class:k(["ranking-index",{"is-top":_<2}])},o(_+1),3),e("div",ct,[e("div",dt,[e("strong",null,o(i.name||"未命名部门"),1),e("span",null,o(f(i.count))+" 个诊单",1)]),e("div",mt,[e("span",{style:G({width:P(i.amount,Q.value)})},null,4)])]),e("b",_t,o(g(i.amount)),1)]))),128))])):(s(),u(C,{key:1,"image-size":72,description:"当前数据范围内暂无业务订单业绩"}))])]),e("section",pt,[e("article",ut,[e("div",vt,[e("div",null,[n[12]||(n[12]=e("h2",null,"近 7 天数据趋势",-1)),e("p",null,o(t.trend.date_range.join(" 至 ")),1)]),l(se,{modelValue:S.value,"onUpdate:modelValue":n[0]||(n[0]=i=>S.value=i),options:W},null,8,["modelValue"])]),t.trend.dates.length?(s(),u(p(we),{key:0,class:"trend-chart",option:Y.value,autoresize:""},null,8,["option"])):(s(),u(C,{key:1,"image-size":72,description:"暂无趋势数据"}))]),e("article",gt,[e("div",ft,[e("div",null,[n[13]||(n[13]=e("h2",null,"进度目标",-1)),e("p",null,o(t.target.year_month)+",按当前角色数据范围计算",1)]),e("span",yt,o(t.target.department_count)+" 个目标部门",1)]),e("div",ht,[e("div",bt,[e("div",null,[n[14]||(n[14]=e("span",null,"范围目标进度",-1)),t.target.target_amount>0?(s(),r("strong",kt,o(N(t.target.completion_rate)),1)):(s(),r("strong",wt,"未设置"))]),e("p",null,[m(" 已完成 "+o(g(t.target.completed_amount))+" ",1),t.target.target_amount>0?(s(),r(v,{key:0},[m(" ,目标 "+o(g(t.target.target_amount)),1)],64)):b("",!0)])]),l(j,{percentage:R(t.target.completion_rate),"show-text":!1,"stroke-width":12,color:"#0f8f83"},null,8,["percentage"])]),e("div",xt,[e("div",$t,[e("div",null,[n[15]||(n[15]=e("span",null,"本人业绩贡献",-1)),e("strong",null,o(N(t.target.personal_contribution_rate)),1)]),e("p",null," 本人 "+o(g(t.target.personal_amount))+",占当前范围已完成业绩 ",1)]),l(j,{percentage:R(t.target.personal_contribution_rate),"show-text":!1,"stroke-width":12,color:"#738196"},null,8,["percentage"])]),t.target.target_amount<=0?(s(),r("div",Nt," 当前范围尚未设置本月部门目标,已完成业绩仍会正常统计。 ")):b("",!0)])]),e("footer",Dt,[l(d,null,{default:c(()=>[l(p(A))]),_:1}),e("span",null,o(t.meta.rate_note),1)])],64)):x.value?(s(),r("div",Ct,[l(C,{description:"驾驶舱数据加载失败"},{default:c(()=>[l(I,{type:"primary",onClick:D},{default:c(()=>[...n[16]||(n[16]=[m("重新加载",-1)])]),_:1})]),_:1})])):b("",!0)])),[[re,w.value]])}}}),Lt=De(Ft,[["__scopeId","data-v-7a603eab"]]);export{Lt as default};