2 lines
19 KiB
JavaScript
2 lines
19 KiB
JavaScript
import{L as ue,d as fe,i as ge,K as ve,a3 as ye,r as ke,Z as he,W as be,aj as we,a1 as $e}from"./element-plus-CWHdHlgZ.js";import{a6 as xe,a8 as Ne,M as De,ar as F,as as z,i as G,y as Ce}from"./@element-plus/icons-vue-CbYn5zW9.js";import{H as Se}from"./vue-echarts-BNtg2q_G.js";import{v as Me}from"./stats-HAXkkxRm.js";import{f as J,b as Fe,ac as ze,ae as Ie,aP as Ee,ak as n,I as r,J as t,a as l,aN as c,O as d,H as g,G as p,F as u,ap as I,A as v}from"./@vue/runtime-core-C6bnekPw.js";import{y as _,r as Le,n as $}from"./@vue/reactivity-DiY1c2vO.js";import{Q as s,o as h,p as H}from"./@vue/shared-mAAVTE9n.js";import{_ as Ve}from"./index-MKPKssyT.js";import"./@vue/runtime-dom-DDAG46FW.js";import"./lodash-D3kF6u-c.js";import"./lodash-es-C2A-Pj28.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./resize-detector-G6vbKCU7.js";import"./echarts-CNLwa9wG.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DRNXw7y3.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-QlpZ4wdW.js";import"./pinia-B8cvXbiZ.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-1S4fJlii.js";import"./@vueuse/shared-Cl3lVqjz.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-C4onkBvW.js";const Te={class:"performance-dashboard","element-loading-text":"正在汇总权限范围内的数据"},Re={class:"dashboard-header"},Pe={class:"dashboard-heading"},Ae={class:"dashboard-heading__icon"},Be={class:"dashboard-title-row"},je={class:"scope-badge"},Oe={key:0},Ue={class:"dashboard-actions"},We={key:0,class:"updated-at"},Ge={key:1,class:"dashboard-skeleton"},He={class:"performance-strip","aria-label":"业绩概览"},Je={class:"metric-card metric-card--primary"},Ke={class:"metric-value metric-value--money"},Qe={class:"metric-card"},Ze={class:"metric-value metric-value--money"},qe={class:"metric-card"},Xe={class:"metric-value metric-value--money"},Ye={key:0,class:"metric-card"},et={class:"metric-label-row"},tt={class:"metric-value metric-value--money"},at={class:"metric-card metric-card--clock"},ot={class:"metric-value metric-value--time"},nt={class:"metric-foot"},st={class:"operating-grid","aria-label":"今日运营指标"},rt={class:"metric-label"},it={class:"metric-comparisons"},lt={class:"metric-hint"},ct={class:"dashboard-grid dashboard-grid--rankings"},dt={class:"dashboard-panel ranking-panel"},mt={class:"panel-header"},pt={key:0},_t={class:"panel-header-actions"},ut={key:0,class:"ranking-list"},ft={class:"ranking-main"},gt={class:"ranking-copy"},vt={key:0,class:"ranking-self-tag"},yt={class:"ranking-meter","aria-hidden":"true"},kt={class:"ranking-value"},ht={class:"dashboard-panel ranking-panel"},bt={class:"panel-header"},wt={key:0,class:"ranking-list"},$t={class:"ranking-main"},xt={class:"ranking-copy"},Nt={key:0,class:"ranking-self-tag"},Dt={class:"ranking-meter","aria-hidden":"true"},Ct={class:"ranking-value ranking-value--money"},St={class:"dashboard-grid dashboard-grid--bottom"},Mt={class:"dashboard-panel trend-panel"},Ft={class:"panel-header panel-header--stack-mobile"},zt={class:"dashboard-panel target-panel"},It={class:"panel-header"},Et={class:"panel-meta"},Lt={class:"target-block"},Vt={class:"target-copy"},Tt={key:0},Rt={key:1},Pt={class:"target-block target-block--secondary"},At={class:"target-copy"},Bt={key:0,class:"target-empty-note"},jt={class:"dashboard-notes"},Ot={key:3,class:"dashboard-empty"},Ut=J({name:"performanceDashboardPage"}),Wt=J({...Ut,setup(Gt){const b=()=>({direction:"flat",rate:null,previous:0}),A=()=>({scope:{key:"",kind:"",scope_value:4,label:"",is_limited:!0,viewer_name:"",viewer_id:0,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:b(),appointment_total_count:b(),low_amount_payment_count:b(),interview_count:b(),completed_order_count:b(),completed_order_amount:b(),paid_appointment_rate:b(),interview_receive_rate:b()}},rankings:{appointments:{title:"实时挂号排行",kind:"assistant",metric:"registration",scope_label:"",items:[]},performance:{title:"今日部门业绩排行",kind:"dept",scope_label:"",items:[]}},filters:{ranking_departments:[],ranking_dept_id:0,ranking_selectable:!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:""}}),e=Le(A()),x=$(!1),N=$(!1),D=$(""),E=$("registrations"),C=$(),L=$(new Date);let V;const K={value:"id",label:"name",children:"children"},Q=[{label:"挂号",value:"registrations"},{label:"预约",value:"appointments"},{label:"进线",value:"leads"},{label:"诊单",value:"orders"}],Z=v(()=>{const o=e.scope.role_names.length?e.scope.role_names.join("、"):"管理员",a=e.scope.department_names.length?e.scope.department_names.join("、"):"未绑定部门";return`${e.scope.viewer_name||"当前账号"},${o},${a}`}),q=v(()=>[{key:"fans",label:"今日加粉",value:y(e.today.add_fans_count),hint:"按企微新增客户事件统计",comparisons:[e.today.comparisons.add_fans_count]},{key:"appointments",label:"今日预约",value:y(e.today.appointment_total_count),hint:"状态为已预约、已完成或改期,排除已取消",comparisons:[e.today.comparisons.appointment_total_count]},{key:"lowAmountPayments",label:"今日挂号",value:`${y(e.today.low_amount_payment_count)} `,hint:"已支付且实收金额大于 0、低于 10 元的订单",comparisons:[e.today.comparisons.low_amount_payment_count]},{key:"orders",label:"今日接诊 / 诊单金额",value:"",hint:"按业务订单统计,排除取消、拒收和退款",comparisons:[{...e.today.comparisons.completed_order_count,label:"诊单"},{...e.today.comparisons.completed_order_amount,label:"金额"}]},{key:"appointmentRate",label:"挂号率",value:S(e.today.paid_appointment_rate),hint:`挂号 ${y(e.today.paid_appointment_count)} / 加粉数`,comparisons:[e.today.comparisons.paid_appointment_rate]},{key:"receiveRate",label:"接诊率",value:S(e.today.interview_receive_rate),hint:"诊单数 / 面诊数",comparisons:[e.today.comparisons.interview_receive_rate]},{key:"interviews",label:"今日面诊",value:y(e.today.interview_count),hint:"状态为已完成的预约",comparisons:[e.today.comparisons.interview_count]}]),X=v(()=>new Intl.DateTimeFormat("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(L.value)),Y=v(()=>new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",weekday:"short"}).format(L.value)),ee=v(()=>e.filters.ranking_selectable!==!1&&e.scope.kind!=="group_leader"&&e.rankings.appointments.kind!=="doctor"&&e.filters.ranking_departments.length>0),B=v(()=>e.rankings.appointments.metric==="appointment"?"预约":"挂号"),j=v(()=>{if(e.rankings.appointments.metric==="appointment")return"";const o=e.rankings.appointments.kind==="doctor"?"医生":"成员";return`${e.rankings.appointments.scope_label||"当前部门"}内${o}已支付且实收低于 10 元的订单数`}),te=v(()=>{const o=e.rankings.performance.scope_label||"当前部门";return e.rankings.performance.kind==="person"?e.scope.kind==="group_leader"?"本小组内今日计入业绩的个人订单":`${o}内今日计入业绩的个人订单`:`${o}内今日计入业绩的业务订单`}),ae=v(()=>Math.max(0,...e.rankings.appointments.items.map(o=>Number(o.count||0)))),oe=v(()=>Math.max(0,...e.rankings.performance.items.map(o=>Number(o.amount||0)))),ne=v(()=>{const a={registrations:{label:"挂号",data:e.trend.registrations},appointments:{label:"预约",data:e.trend.appointments},leads:{label:"进线",data:e.trend.leads},orders:{label:"诊单",data:e.trend.orders}}[E.value];return{animationDuration:320,tooltip:{trigger:"axis",valueFormatter:m=>`${y(m)} 条`},grid:{left:42,right:18,top:24,bottom:30,containLabel:!0},xAxis:{type:"category",boundaryGap:!1,data:e.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)"}]}}}]}}),k=(o,a=2)=>`¥${new Intl.NumberFormat("zh-CN",{minimumFractionDigits:a,maximumFractionDigits:a}).format(Number(o||0))}`,y=o=>new Intl.NumberFormat("zh-CN",{maximumFractionDigits:0}).format(Number(o||0)),S=o=>o===null?"暂无":`${Number(o||0).toFixed(1)}%`,T=o=>`${o>=0?"+":""}${Number(o).toFixed(1)}%`,R=o=>o===null||o===0?"":o>0?"is-positive":"is-negative",se=o=>o==="up"?"is-positive":o==="down"?"is-negative":"is-flat",re=o=>{const a=o.label?`${o.label} `:"";if(o.direction==="flat")return`${a}较昨日持平`;const m=o.direction==="up"?"上升":"下降";return o.rate===null?`${a}较昨日${m}(昨日为 0)`:`${a}较昨日${m} ${Math.abs(Number(o.rate)).toFixed(1)}%`},O=(o,a)=>a<=0||o<=0?"0%":`${Math.max(6,Math.min(100,Number(o)/a*100))}%`,U=o=>o===null||!Number.isFinite(Number(o))?0:Math.max(0,Math.min(100,Number(o))),w=async()=>{x.value=!0,D.value="";try{const o=await Me({ranking_dept_id:N.value?C.value||0:void 0,_t:Date.now()});Object.assign(e,A(),o||{}),C.value=Number(e.filters.ranking_dept_id||0)||void 0,N.value=!0}catch(o){D.value=(o==null?void 0:o.msg)||(o==null?void 0:o.message)||"驾驶舱数据加载失败,请稍后重试"}finally{x.value=!1}},ie=()=>{w()};return Fe(()=>{w(),V=setInterval(()=>{L.value=new Date},1e3)}),ze(()=>{N.value&&w()}),Ie(()=>{V&&clearInterval(V)}),(o,a)=>{const m=fe,P=ge,le=ve,ce=ye,de=ke,me=he,M=be,pe=we,W=$e,_e=ue;return Ee((n(),r("div",Te,[t("header",Re,[t("div",Pe,[t("div",Ae,[l(m,null,{default:c(()=>[l(_(xe))]),_:1})]),t("div",null,[t("div",Be,[a[2]||(a[2]=t("h1",null,"我的首页",-1)),t("span",je,[l(m,null,{default:c(()=>[l(_(Ne))]),_:1}),d(" "+s(e.scope.label||"数据范围"),1)])]),t("p",null,[d(s(Z.value)+" ",1),e.scope.visible_member_count>0?(n(),r("span",Oe," ,当前可见 "+s(e.scope.visible_member_count)+" 位成员 ",1)):g("",!0)])])]),t("div",Ue,[e.meta.generated_at?(n(),r("div",We," 数据更新于 "+s(e.meta.generated_at),1)):g("",!0),l(P,{icon:_(De),loading:x.value,onClick:w},{default:c(()=>[...a[3]||(a[3]=[d("刷新数据",-1)])]),_:1},8,["icon","loading"])])]),D.value?(n(),p(le,{key:0,class:"dashboard-error",type:"error",closable:!1,"show-icon":"",title:D.value},{default:c(()=>[l(P,{size:"small",onClick:w},{default:c(()=>[...a[4]||(a[4]=[d("重新加载",-1)])]),_:1})]),_:1},8,["title"])):g("",!0),!N.value&&x.value?(n(),r("div",Ge,[l(ce,{rows:12,animated:""})])):N.value?(n(),r(u,{key:2},[t("section",He,[t("article",Je,[a[5]||(a[5]=t("div",{class:"metric-label"},"本月实时业绩",-1)),t("div",Ke,s(k(e.performance.month_amount)),1),t("div",{class:h(["metric-foot",R(e.performance.month_compare_rate)])},[e.performance.month_compare_rate!==null?(n(),r(u,{key:0},[e.performance.month_compare_rate>=0?(n(),p(m,{key:0},{default:c(()=>[l(_(F))]),_:1})):(n(),p(m,{key:1},{default:c(()=>[l(_(z))]),_:1})),d(" "+s(e.performance.month_compare_label)+" "+s(T(e.performance.month_compare_rate)),1)],64)):(n(),r(u,{key:1},[d("上月同期暂无可比数据")],64))],2)]),t("article",Qe,[a[6]||(a[6]=t("div",{class:"metric-label"},"今日新增业绩",-1)),t("div",Ze,s(k(e.performance.today_amount)),1),t("div",{class:h(["metric-foot",R(e.performance.today_compare_rate)])},[e.performance.today_compare_rate!==null?(n(),r(u,{key:0},[e.performance.today_compare_rate>=0?(n(),p(m,{key:0},{default:c(()=>[l(_(F))]),_:1})):(n(),p(m,{key:1},{default:c(()=>[l(_(z))]),_:1})),d(" "+s(e.performance.today_compare_label)+" "+s(T(e.performance.today_compare_rate)),1)],64)):(n(),r(u,{key:1},[d("昨日暂无可比数据")],64))],2)]),t("article",qe,[a[7]||(a[7]=t("div",{class:"metric-label"},"昨日新增业绩",-1)),t("div",Xe,s(k(e.performance.yesterday_amount)),1),t("div",{class:h(["metric-foot",R(e.performance.yesterday_compare_rate)])},[e.performance.yesterday_compare_rate!==null?(n(),r(u,{key:0},[e.performance.yesterday_compare_rate>=0?(n(),p(m,{key:0},{default:c(()=>[l(_(F))]),_:1})):(n(),p(m,{key:1},{default:c(()=>[l(_(z))]),_:1})),d(" "+s(e.performance.yesterday_compare_label)+" "+s(T(e.performance.yesterday_compare_rate)),1)],64)):(n(),r(u,{key:1},[d("前一日暂无可比数据")],64))],2)]),e.scope.kind!=="assistant"?(n(),r("article",Ye,[t("div",et,[a[8]||(a[8]=t("span",null,"本人本月业绩",-1)),l(de,{content:e.meta.commission_note,placement:"top"},{default:c(()=>[l(m,{class:"metric-help"},{default:c(()=>[l(_(G))]),_:1})]),_:1},8,["content"])]),t("div",tt,s(k(e.performance.personal_month_amount)),1),a[9]||(a[9]=t("div",{class:"metric-foot"},"仅统计当前登录账号",-1))])):g("",!0),t("article",at,[a[10]||(a[10]=t("div",{class:"metric-label"},"当前时间",-1)),t("div",ot,s(X.value),1),t("div",nt,s(Y.value),1)])]),t("section",st,[(n(!0),r(u,null,I(q.value,i=>(n(),r("article",{key:i.key,class:"metric-card metric-card--compact"},[t("div",rt,s(i.label),1),t("div",{class:h(["metric-value",{"metric-value--pair":i.key==="orders"}])},[i.key==="orders"?(n(),r(u,{key:0},[d(s(y(e.today.completed_order_count))+" ",1),a[11]||(a[11]=t("span",null,"/",-1)),d(" "+s(k(e.today.completed_order_amount)),1)],64)):(n(),r(u,{key:1},[d(s(i.value),1)],64))],2),t("div",it,[(n(!0),r(u,null,I(i.comparisons,f=>(n(),r("div",{key:`${i.key}-${f.label||"total"}`,class:h(["metric-foot",se(f.direction)])},[f.direction==="up"?(n(),p(m,{key:0},{default:c(()=>[l(_(F))]),_:1})):f.direction==="down"?(n(),p(m,{key:1},{default:c(()=>[l(_(z))]),_:1})):(n(),p(m,{key:2},{default:c(()=>[l(_(Ce))]),_:1})),d(" "+s(re(f)),1)],2))),128))]),t("div",lt,s(i.hint),1)]))),128))]),t("section",ct,[t("article",dt,[t("div",mt,[t("div",null,[t("h2",null,s(e.rankings.appointments.title),1),j.value?(n(),r("p",pt,s(j.value),1)):g("",!0)]),t("div",_t,[ee.value?(n(),p(me,{key:0,modelValue:C.value,"onUpdate:modelValue":a[0]||(a[0]=i=>C.value=i),data:e.filters.ranking_departments,props:K,"node-key":"id","check-strictly":"",clearable:"",filterable:"","default-expand-all":"",placeholder:"全部部门",class:"ranking-dept-select",onChange:ie},null,8,["modelValue","data"])):g("",!0),a[12]||(a[12]=t("span",{class:"panel-meta"},"实时",-1))])]),e.rankings.appointments.items.length?(n(),r("div",ut,[(n(!0),r(u,null,I(e.rankings.appointments.items,(i,f)=>(n(),r("div",{key:`appointment-${i.id}-${f}`,class:h(["ranking-row",{"is-self":i.is_self}])},[t("span",{class:h(["ranking-index",{"is-top":f<2,"is-self":i.is_self}])},s(f+1),3),t("div",ft,[t("div",gt,[t("strong",null,[d(s(i.name||"未命名成员")+" ",1),i.is_self?(n(),r("i",vt,"我")):g("",!0)]),t("span",null,s(y(i.count))+" "+s(B.value),1)]),t("div",yt,[t("span",{style:H({width:O(i.count,ae.value)})},null,4)])]),t("b",kt,s(y(i.count)),1)],2))),128))])):(n(),p(M,{key:1,"image-size":72,description:`当前数据范围内暂无${B.value}排行`},null,8,["description"]))]),t("article",ht,[t("div",bt,[t("div",null,[t("h2",null,s(e.rankings.performance.title),1),t("p",null,s(te.value),1)]),a[13]||(a[13]=t("span",{class:"panel-meta"},"今日",-1))]),e.rankings.performance.items.length?(n(),r("div",wt,[(n(!0),r(u,null,I(e.rankings.performance.items,(i,f)=>(n(),r("div",{key:`performance-${i.id}-${f}`,class:h(["ranking-row",{"is-self":i.is_self}])},[t("span",{class:h(["ranking-index",{"is-top":f<2,"is-self":i.is_self}])},s(f+1),3),t("div",$t,[t("div",xt,[t("strong",null,[d(s(i.name||(e.rankings.performance.kind==="person"?"未命名成员":"未命名部门"))+" ",1),i.is_self?(n(),r("i",Nt,"我")):g("",!0)]),t("span",null,s(y(i.count))+" 个诊单",1)]),t("div",Dt,[t("span",{style:H({width:O(i.amount,oe.value)})},null,4)])]),t("b",Ct,s(k(i.amount)),1)],2))),128))])):(n(),p(M,{key:1,"image-size":72,description:"当前数据范围内暂无业务订单业绩"}))])]),t("section",St,[t("article",Mt,[t("div",Ft,[t("div",null,[a[14]||(a[14]=t("h2",null,"近 7 天数据趋势",-1)),t("p",null,s(e.trend.date_range.join(" 至 ")),1)]),l(pe,{modelValue:E.value,"onUpdate:modelValue":a[1]||(a[1]=i=>E.value=i),options:Q},null,8,["modelValue"])]),e.trend.dates.length?(n(),p(_(Se),{key:0,class:"trend-chart",option:ne.value,autoresize:""},null,8,["option"])):(n(),p(M,{key:1,"image-size":72,description:"暂无趋势数据"}))]),t("article",zt,[t("div",It,[t("div",null,[a[15]||(a[15]=t("h2",null,"进度目标",-1)),t("p",null,s(e.target.year_month)+",按当前角色数据范围计算",1)]),t("span",Et,s(e.target.department_count)+" 个目标部门",1)]),t("div",Lt,[t("div",Vt,[t("div",null,[a[16]||(a[16]=t("span",null,"范围目标进度",-1)),e.target.target_amount>0?(n(),r("strong",Tt,s(S(e.target.completion_rate)),1)):(n(),r("strong",Rt,"未设置"))]),t("p",null,[d(" 已完成 "+s(k(e.target.completed_amount))+" ",1),e.target.target_amount>0?(n(),r(u,{key:0},[d(" ,目标 "+s(k(e.target.target_amount)),1)],64)):g("",!0)])]),l(W,{percentage:U(e.target.completion_rate),"show-text":!1,"stroke-width":12,color:"#0f8f83"},null,8,["percentage"])]),t("div",Pt,[t("div",At,[t("div",null,[a[17]||(a[17]=t("span",null,"本人业绩贡献",-1)),t("strong",null,s(S(e.target.personal_contribution_rate)),1)]),t("p",null," 本人 "+s(k(e.target.personal_amount))+",占当前范围已完成业绩 ",1)]),l(W,{percentage:U(e.target.personal_contribution_rate),"show-text":!1,"stroke-width":12,color:"#738196"},null,8,["percentage"])]),e.target.target_amount<=0?(n(),r("div",Bt," 当前范围尚未设置本月部门目标,已完成业绩仍会正常统计。 ")):g("",!0)])]),t("footer",jt,[l(m,null,{default:c(()=>[l(_(G))]),_:1}),t("span",null,s(e.meta.rate_note),1)])],64)):D.value?(n(),r("div",Ot,[l(M,{description:"驾驶舱数据加载失败"},{default:c(()=>[l(P,{type:"primary",onClick:w},{default:c(()=>[...a[18]||(a[18]=[d("重新加载",-1)])]),_:1})]),_:1})])):g("",!0)])),[[_e,x.value]])}}}),Ia=Ve(Wt,[["__scopeId","data-v-8a87b9f7"]]);export{Ia as default};
|