Files
2026-08-07 14:54:05 +08:00

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