2 lines
17 KiB
JavaScript
2 lines
17 KiB
JavaScript
import{L as nt,d as lt,i as st,Z as ot,aj as it,Q as rt,P as mt,N as dt,q as pt,W as ut,M as ct,a1 as _t,E as gt}from"./element-plus-Bm2jcHo4.js";import{aa as bt,a8 as ft,M as ht,X as T,k as yt,ab as vt,i as kt}from"./@element-plus/icons-vue-8Um_rfcd.js";import{H as wt}from"./vue-echarts-BNtg2q_G.js";import{w as xt}from"./first_visit-Ifm9U8v6.js";import{f as P,b as Nt,aP as St,ak as r,I as d,J as t,a as o,aN as i,O as u,H as D,F as S,ap as M,G as w,A as $}from"./@vue/runtime-core-C6bnekPw.js";import{r as L,y as _,n as Mt}from"./@vue/reactivity-DiY1c2vO.js";import{Q as s,o as c,p as V}from"./@vue/shared-mAAVTE9n.js";import{_ as $t}from"./index-CJJeyIXM.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 Ct={class:"registration-stats","element-loading-text":"正在汇总权限范围内的挂号与预约数据"},Vt={class:"page-heading"},Et={class:"heading-copy"},zt={class:"heading-mark"},Ft={class:"heading-actions"},Tt={class:"scope-chip"},Dt={key:0,class:"update-time"},Lt={class:"filter-strip"},Pt={class:"filter-item"},Ot={class:"filter-item filter-item--time"},At={class:"filter-item"},Bt={class:"filter-summary"},It={class:"metric-grid","aria-label":"挂号统计核心指标"},Rt={class:"metric-card metric-card--teal"},Ut={class:"metric-icon"},Wt={class:"metric-card metric-card--blue"},jt={class:"metric-icon"},qt={class:"metric-card metric-card--violet"},Gt={class:"metric-icon"},Ht={class:"metric-card metric-card--amber"},Qt={class:"metric-icon"},Jt={class:"panel employee-panel"},Xt={class:"panel-heading"},Yt={class:"panel-badge"},Zt={key:0,class:"dept-dot"},Kt={key:2},te={class:"panel target-panel"},ee={class:"panel-heading"},ae={class:"panel-badge"},ne={class:"target-layout"},le={class:"target-summary"},se={class:"target-numbers"},oe={class:"is-teal"},ie={key:0},re={key:1,class:"target-empty"},me={class:"target-chart-wrap"},de={class:"ranking-grid"},pe={class:"panel ranking-panel"},ue={class:"panel-heading"},ce={key:0,class:"ranking-list"},_e={class:"rank-track"},ge={class:"panel ranking-panel"},be={class:"panel-heading"},fe={key:0,class:"ranking-list ranking-list--blue"},he={class:"rank-track"},ye={class:"panel ranking-panel"},ve={class:"panel-heading"},ke={key:0,class:"ranking-list ranking-list--blue"},we={class:"rank-track"},xe={class:"panel department-panel"},Ne={class:"panel-heading"},Se={class:"panel-badge"},Me={class:"data-note"},$e=P({name:"firstVisitRegistrationStatsPage"}),Ce=P({...$e,setup(Ve){const E=()=>({meta:{time_type:"today",time_label:"今日",start_date:"",end_date:"",generated_at:"",scope_value:4,scope_label:"",selected_dept_name:"",selected_assistant_name:"",member_count:0,registration_rule:"",appointment_rule:"",performance_rule:""},filters:{departments:[],assistants:[]},summary:{registration_count:0,registration_compare_count:0,registration_compare_rate:null,appointment_count:0,appointment_compare_count:0,appointment_compare_rate:null,order_count:0,order_amount:0,range_label:"今日"},employee_rows:[],rankings:{performance:[],registrations:[],appointments:[]},departments:[],target:{year:new Date().getFullYear(),target_amount:0,actual_amount:0,completion_rate:null,department_count:0,scope_note:"",months:[],target_cumulative:[],actual_cumulative:[]}}),x=Mt(!1),a=L(E()),p=L({time_type:"today"}),O=[{label:"今日",value:"today"},{label:"昨天",value:"yesterday"},{label:"本周",value:"week"},{label:"本月",value:"month"}],A={label:"name",value:"id",children:"children"},B=$(()=>Math.max(0,...a.rankings.performance.map(n=>Number(n.value)||0))),I=$(()=>Math.max(0,...a.rankings.registrations.map(n=>Number(n.value)||0))),R=$(()=>Math.max(0,...a.rankings.appointments.map(n=>Number(n.value)||0))),U=$(()=>({animationDuration:450,grid:{left:18,right:18,top:18,bottom:12,containLabel:!0},tooltip:{trigger:"axis",valueFormatter:n=>g(n)},xAxis:{type:"category",boundaryGap:!1,data:a.target.months,axisLine:{lineStyle:{color:"#d9e1e8"}},axisTick:{show:!1},axisLabel:{color:"#7d8b9c",fontSize:11}},yAxis:{type:"value",splitNumber:3,axisLabel:{color:"#8b98a8",formatter:n=>j(n)},splitLine:{lineStyle:{color:"#eef2f5"}}},series:[{name:"累计完成",type:"line",smooth:!0,symbol:"circle",symbolSize:5,data:a.target.actual_cumulative,lineStyle:{color:"#139a8c",width:3},itemStyle:{color:"#ffffff",borderColor:"#139a8c",borderWidth:2},areaStyle:{color:"rgba(19,154,140,.08)"}},{name:"累计目标",type:"line",smooth:!0,showSymbol:!1,data:a.target.target_cumulative,lineStyle:{color:"#5f86e8",width:2,type:"dashed"}}]}));async function y(){x.value=!0;try{const n={time_type:p.time_type};p.dept_id&&(n.dept_id=Number(p.dept_id)),p.assistant_id&&(n.assistant_id=Number(p.assistant_id));const e=await xt(n);Object.assign(a,E(),e||{})}catch(n){gt.error((n==null?void 0:n.message)||"挂号统计加载失败,请稍后重试")}finally{x.value=!1}}function W(){delete p.assistant_id,y()}function v(n){return Number(n||0).toLocaleString("zh-CN",{maximumFractionDigits:0})}function g(n){return`¥${Number(n||0).toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function j(n){return Math.abs(n)>=1e4?`${(n/1e4).toFixed(n>=1e5?0:1)}万`:`${Math.round(n)}`}function q(n){return n==null?"未设置":`${Number(n).toFixed(1)}%`}function G(n){return Math.min(100,Math.max(0,Number(n)||0))}function z(n){if(n==null)return"上期无数据,暂不计算环比";const e=Number(n);return e===0?"与上期持平":`${e>0?"较上期增长":"较上期下降"} ${Math.abs(e).toFixed(1)}%`}function N(n){if(n==null)return"—";const e=Number(n);return`${e>0?"+":""}${e.toFixed(1)}%`}function h(n){return n==null||Number(n)===0?"is-neutral":Number(n)>0?"is-up":"is-down"}function C(n,e){return e<=0?"0%":`${Math.max(4,Math.min(100,Number(n||0)/e*100))}%`}function H(n){return String(n||"员").trim().slice(-1)}function Q(n,e){return Number((n==null?void 0:n.order_amount)||0)-Number((e==null?void 0:e.order_amount)||0)}return Nt(y),(n,e)=>{const f=lt,J=st,X=ot,Y=it,Z=rt,K=mt,tt=pt,m=dt,k=ut,F=ct,et=_t,at=nt;return St((r(),d("div",Ct,[t("header",Vt,[t("div",Et,[t("span",zt,[o(f,null,{default:i(()=>[o(_(bt))]),_:1})]),e[3]||(e[3]=t("div",null,[t("h1",null,"挂号统计"),t("p",null,"挂号、预约、诊单与目标数据按当前角色和部门权限实时汇总")],-1))]),t("div",Ft,[t("span",Tt,[o(f,null,{default:i(()=>[o(_(ft))]),_:1}),u(s(a.meta.scope_label||"数据范围"),1)]),a.meta.generated_at?(r(),d("span",Dt,"更新于 "+s(a.meta.generated_at),1)):D("",!0),o(J,{icon:_(ht),loading:x.value,onClick:y},{default:i(()=>[...e[4]||(e[4]=[u("刷新",-1)])]),_:1},8,["icon","loading"])])]),t("section",Lt,[t("div",Pt,[e[5]||(e[5]=t("span",null,"部门",-1)),o(X,{modelValue:p.dept_id,"onUpdate:modelValue":e[0]||(e[0]=l=>p.dept_id=l),data:a.filters.departments,props:A,"node-key":"id",clearable:"",filterable:"","check-strictly":"","default-expand-all":"",placeholder:"全部可见部门",class:"dept-select",onChange:W},null,8,["modelValue","data"])]),t("div",Ot,[e[6]||(e[6]=t("span",null,"时间",-1)),o(Y,{modelValue:p.time_type,"onUpdate:modelValue":e[1]||(e[1]=l=>p.time_type=l),options:O,onChange:y},null,8,["modelValue"])]),t("div",At,[e[7]||(e[7]=t("span",null,"员工",-1)),o(K,{modelValue:p.assistant_id,"onUpdate:modelValue":e[2]||(e[2]=l=>p.assistant_id=l),clearable:"",filterable:"",placeholder:"全部可见员工",class:"employee-select",onChange:y},{default:i(()=>[(r(!0),d(S,null,M(a.filters.assistants,l=>(r(),w(Z,{key:l.id,label:l.name,value:Number(l.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),t("div",Bt,[t("strong",null,s(a.meta.start_date||"—"),1),t("span",null,"至 "+s(a.meta.end_date||"—")+" · "+s(a.meta.member_count||0)+" 位员工",1)])]),t("section",It,[t("article",Rt,[t("div",Ut,[o(f,null,{default:i(()=>[o(_(T))]),_:1})]),t("div",null,[t("span",null,s(a.meta.time_label||"今日")+"总挂号",1),t("strong",null,s(v(a.summary.registration_count)),1),t("small",{class:c(h(a.summary.registration_compare_rate))},s(z(a.summary.registration_compare_rate)),3)])]),t("article",Wt,[t("div",jt,[o(f,null,{default:i(()=>[o(_(yt))]),_:1})]),t("div",null,[t("span",null,s(a.meta.time_label||"今日")+"总预约",1),t("strong",null,s(v(a.summary.appointment_count)),1),t("small",{class:c(h(a.summary.appointment_compare_rate))},s(z(a.summary.appointment_compare_rate)),3)])]),t("article",qt,[t("div",Gt,[o(f,null,{default:i(()=>[o(_(vt))]),_:1})]),t("div",null,[t("span",null,s(a.meta.time_label||"今日")+"总诊单",1),t("strong",null,s(v(a.summary.order_count)),1),e[8]||(e[8]=t("small",null,"排除取消、拒收和退款订单",-1))])]),t("article",Ht,[t("div",Qt,[o(f,null,{default:i(()=>[o(_(T))]),_:1})]),t("div",null,[t("span",null,s(a.meta.time_label||"今日")+"总业绩",1),t("strong",null,s(g(a.summary.order_amount)),1),e[9]||(e[9]=t("small",null,"按业务订单创建人归属",-1))])])]),t("section",Jt,[t("div",Xt,[e[10]||(e[10]=t("div",null,[t("h2",null,"本组员工挂号与预约统计"),t("p",null,"挂号按已支付且实收低于 10 元的支付订单统计;预约按预约记录统计")],-1)),t("span",Yt,s(a.meta.time_label||"当前范围"),1)]),o(F,{data:a.employee_rows,"row-key":"id","tree-props":{children:"children"},"default-expand-all":"",class:"stats-table"},{empty:i(()=>[o(k,{description:"当前权限与筛选范围内暂无医助数据"})]),default:i(()=>[o(m,{prop:"name",label:"部门 / 员工","min-width":"250",fixed:"left"},{default:i(({row:l})=>[t("div",{class:c(["name-cell",`is-${l.row_type}`])},[l.row_type==="department"?(r(),d("span",Zt)):(r(),w(tt,{key:1,size:26},{default:i(()=>[u(s(H(l.name)),1)]),_:2},1024)),t("strong",null,s(l.name),1),l.row_type==="department"?(r(),d("em",Kt,s(l.member_count)+" 人",1)):D("",!0)],2)]),_:1}),o(m,{prop:"registration_count",label:`${a.meta.time_label||"当前"}挂号`,"min-width":"118",align:"right",sortable:""},null,8,["label"]),o(m,{prop:"appointment_count",label:`${a.meta.time_label||"当前"}预约`,"min-width":"118",align:"right",sortable:""},null,8,["label"]),o(m,{prop:"tomorrow_count",label:"明日预约","min-width":"105",align:"right",sortable:""}),o(m,{prop:"day_after_count",label:"后日预约","min-width":"105",align:"right",sortable:""}),o(m,{prop:"order_count",label:"诊单","min-width":"86",align:"right",sortable:""}),o(m,{label:"业绩","min-width":"128",align:"right",sortable:"","sort-method":Q},{default:i(({row:l})=>[u(s(g(l.order_amount)),1)]),_:1}),o(m,{label:"挂号较上期","min-width":"112",align:"right"},{default:i(({row:l})=>[t("span",{class:c(["rate-text",h(l.registration_compare_rate)])},s(N(l.registration_compare_rate)),3)]),_:1}),o(m,{label:"预约较上期","min-width":"112",align:"right"},{default:i(({row:l})=>[t("span",{class:c(["rate-text",h(l.appointment_compare_rate)])},s(N(l.appointment_compare_rate)),3)]),_:1}),o(m,{label:"状态","min-width":"92",align:"center"},{default:i(()=>[...e[11]||(e[11]=[t("span",{class:"status-pill"},[t("i"),u("正常")],-1)])]),_:1})]),_:1},8,["data"])]),t("section",te,[t("div",ee,[t("div",null,[e[12]||(e[12]=t("h2",null,"一诊诊金目标追踪",-1)),t("p",null,s(a.target.year)+" 年 · "+s(a.target.scope_note),1)]),t("span",ae,s(a.target.department_count||0)+" 个目标部门",1)]),t("div",ne,[t("div",le,[t("div",se,[t("div",null,[e[13]||(e[13]=t("span",null,"年度目标",-1)),t("strong",null,s(g(a.target.target_amount)),1)]),t("div",null,[e[14]||(e[14]=t("span",null,"已完成",-1)),t("strong",null,s(g(a.target.actual_amount)),1)]),t("div",null,[e[15]||(e[15]=t("span",null,"完成率",-1)),t("strong",oe,s(q(a.target.completion_rate)),1)])]),o(et,{percentage:G(a.target.completion_rate),"show-text":!1,"stroke-width":13,color:"#139a8c"},null,8,["percentage"]),Number(a.target.target_amount)>0?(r(),d("p",ie," 尚差 "+s(g(Math.max(0,Number(a.target.target_amount)-Number(a.target.actual_amount))))+" 达成年度目标 ",1)):(r(),d("p",re,"当前范围未维护可用目标,实际业绩仍按统一口径正常统计。"))]),t("div",me,[e[16]||(e[16]=t("div",{class:"chart-legend"},[t("i",{class:"actual"}),u("累计完成 "),t("i",{class:"target"}),u("累计目标")],-1)),o(_(wt),{class:"target-chart",option:U.value,autoresize:""},null,8,["option"])])])]),t("section",de,[t("article",pe,[t("div",ue,[t("div",null,[t("h2",null,s(a.meta.time_label||"今日")+"业绩 TOP",1),e[17]||(e[17]=t("p",null,"按业务订单创建人排序",-1))]),e[18]||(e[18]=t("span",{class:"panel-badge"},"金额",-1))]),a.rankings.performance.length?(r(),d("div",ce,[(r(!0),d(S,null,M(a.rankings.performance,(l,b)=>(r(),d("div",{key:`performance-${l.admin_id}`,class:"ranking-row"},[t("b",{class:c({"is-top":b<3})},s(b+1),3),t("span",null,[u(s(l.name),1),t("small",null,s(l.count)+" 单",1)]),t("div",_e,[t("i",{style:V({width:C(l.value,B.value)})},null,4)]),t("strong",null,s(g(l.value)),1)]))),128))])):(r(),w(k,{key:1,"image-size":52,description:"暂无业绩数据"}))]),t("article",ge,[t("div",be,[t("div",null,[t("h2",null,s(a.meta.time_label||"今日")+"挂号 TOP",1),e[19]||(e[19]=t("p",null,"按低于 10 元的已支付订单笔数排序",-1))]),e[20]||(e[20]=t("span",{class:"panel-badge"},"挂号",-1))]),a.rankings.registrations.length?(r(),d("div",fe,[(r(!0),d(S,null,M(a.rankings.registrations,(l,b)=>(r(),d("div",{key:`registration-${l.admin_id}`,class:"ranking-row"},[t("b",{class:c({"is-top":b<3})},s(b+1),3),t("span",null,[u(s(l.name),1),e[21]||(e[21]=t("small",null,"已支付小额订单",-1))]),t("div",he,[t("i",{style:V({width:C(l.value,I.value)})},null,4)]),t("strong",null,s(v(l.value))+" 笔",1)]))),128))])):(r(),w(k,{key:1,"image-size":52,description:"暂无挂号数据"}))]),t("article",ye,[t("div",ve,[t("div",null,[t("h2",null,s(a.meta.time_label||"今日")+"预约 TOP",1),e[22]||(e[22]=t("p",null,"按有效预约记录数量排序",-1))]),e[23]||(e[23]=t("span",{class:"panel-badge"},"预约",-1))]),a.rankings.appointments.length?(r(),d("div",ke,[(r(!0),d(S,null,M(a.rankings.appointments,(l,b)=>(r(),d("div",{key:`appointment-${l.admin_id}`,class:"ranking-row"},[t("b",{class:c({"is-top":b<3})},s(b+1),3),t("span",null,[u(s(l.name),1),e[24]||(e[24]=t("small",null,"有效预约",-1))]),t("div",we,[t("i",{style:V({width:C(l.value,R.value)})},null,4)]),t("strong",null,s(v(l.value))+" 个",1)]))),128))])):(r(),w(k,{key:1,"image-size":52,description:"暂无预约数据"}))])]),t("section",xe,[t("div",Ne,[e[25]||(e[25]=t("div",null,[t("h2",null,"按部门统计"),t("p",null,"员工按最深层有效归属部门唯一计入,避免多部门重复累计")],-1)),t("span",Se,s(a.departments.length)+" 个部门",1)]),o(F,{data:a.departments,class:"stats-table department-table"},{empty:i(()=>[o(k,{description:"当前范围暂无部门汇总"})]),default:i(()=>[o(m,{prop:"name",label:"部门","min-width":"220"},{default:i(({row:l})=>[t("strong",null,s(l.name),1)]),_:1}),o(m,{prop:"member_count",label:"人数","min-width":"90",align:"right",sortable:""}),o(m,{prop:"registration_count",label:`${a.meta.time_label||"当前"}挂号`,"min-width":"118",align:"right",sortable:""},null,8,["label"]),o(m,{prop:"appointment_count",label:`${a.meta.time_label||"当前"}预约`,"min-width":"118",align:"right",sortable:""},null,8,["label"]),o(m,{prop:"tomorrow_count",label:"明日预约","min-width":"105",align:"right",sortable:""}),o(m,{prop:"order_count",label:"诊单","min-width":"90",align:"right",sortable:""}),o(m,{label:"业绩","min-width":"130",align:"right"},{default:i(({row:l})=>[u(s(g(l.order_amount)),1)]),_:1}),o(m,{label:"挂号环比","min-width":"110",align:"right"},{default:i(({row:l})=>[t("span",{class:c(["rate-text",h(l.registration_compare_rate)])},s(N(l.registration_compare_rate)),3)]),_:1}),o(m,{label:"预约环比","min-width":"110",align:"right"},{default:i(({row:l})=>[t("span",{class:c(["rate-text",h(l.appointment_compare_rate)])},s(N(l.appointment_compare_rate)),3)]),_:1})]),_:1},8,["data"])]),t("footer",Me,[o(f,null,{default:i(()=>[o(_(kt))]),_:1}),t("span",null,s(a.meta.registration_rule)+";"+s(a.meta.appointment_rule)+";"+s(a.meta.performance_rule)+"。",1)])])),[[at,x.value]])}}}),ba=$t(Ce,[["__scopeId","data-v-31f07bda"]]);export{ba as default};
|