2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{_ as ke}from"./index.vue_vue_type_script_setup_true_lang-DHyWBn5F.js";import{D as we,B as Ce,ag as xe,W as Ee,P as Oe,Q as Ve,G as Ae,F as Se,a2 as Ne,i as Pe,J as Te,a4 as We,R as De,a3 as Le,M as Fe,N as Re,E as ze}from"./element-plus-Uuzrfxfo.js";import{H as N}from"./vue-echarts-CjH97xuT.js";import{r as Ie,_ as Be}from"./index-DEQsECZO.js";import{u as Me}from"./usePaging-B_C_SZ2Z.js";import{f as j,b as $e,ak as d,I as V,a as l,aN as o,G as _,F as P,ap as T,O as v,H as Ue,J as s,A as c}from"./@vue/runtime-core-C0pg79pw.js";import{y as h,a as He,o as b,r as Q}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as g,o as Ye}from"./@vue/shared-mAAVTE9n.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@element-plus/icons-vue-CRomrsQH.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-CZvD9OL_.js";import"./tslib-BDyQ-Jie.js";import"./zrender-BQyIY4j9.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.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-BVMzZUvF.js";function Ge(W){return Ie.get({url:"/stats.conversion/overview",params:W})}const Qe={class:"conversion-stats-page"},je={class:"stats-kpi-grid"},qe={class:"stats-kpi-label"},Je={class:"card-header"},Ke={class:"card-hint"},Xe={class:"card-header"},Ze={class:"card-hint"},et=["title"],tt={class:"mt-4 flex justify-end"},at=j({name:"conversionStatsPage"}),nt=j({...at,setup(W){const y=b([]),D=b([]),L=b([]),F=b([]),R=b([]),z=b(!1),m=Q({dimension:"dept",date_range:[],summary:{},charts:{ranking:{names:[],amounts:[],order_counts:[],fan_counts:[],rois:[]},amount_share:[],fan_share:[]}}),a=Q({dimension:"dept",dept_id:void 0,assistant_id:void 0,doctor_id:void 0,time_type:"today",start_date:"",end_date:""}),q=async t=>{var r;t.include_filters=z.value?0:1,a.time_type==="custom"&&(t.start_date=y.value[0]||"",t.end_date=y.value[1]||"");const e=await Ge(t);return Object.assign(m,(e==null?void 0:e.extend)||{}),de((r=e==null?void 0:e.extend)==null?void 0:r.filters),e},{pager:p,getLists:I}=Me({fetchFun:q,params:a,firstLoading:!0}),J=[{label:"部门",value:"dept"},{label:"医助",value:"assistant"},{label:"医生",value:"doctor"}],K={value:"id",label:"name",children:"children"},X={children:"children"},k=c(()=>a.dimension==="assistant"?"医助":a.dimension==="doctor"?"医生":"部门"),Z=c(()=>a.dimension==="assistant"?F.value:a.dimension==="doctor"?R.value:L.value),x=c({get:()=>a.dimension==="assistant"?a.assistant_id:a.dimension==="doctor"?a.doctor_id:a.dept_id,set:t=>{if(a.dimension==="assistant"){a.assistant_id=t;return}if(a.dimension==="doctor"){a.doctor_id=t;return}a.dept_id=t}}),ee=[{key:"add_fans_count",label:"加粉数",type:"count"},{key:"paid_appointment_count",label:"付费挂号",type:"count"},{key:"free_appointment_count",label:"免费挂号",type:"count"},{key:"interview_count",label:"面诊",type:"count"},{key:"completed_order_count",label:"接诊诊单",type:"count"},{key:"paid_appointment_rate",label:"付费挂号率",type:"percent"},{key:"interview_rate",label:"面诊率",type:"percent"},{key:"receive_rate",label:"接诊率",type:"percent"},{key:"interview_receive_rate",label:"面诊接诊率",type:"percent"},{key:"completed_order_amount",label:"诊单金额",type:"money"},{key:"avg_unit_price",label:"平均单价",type:"money"},{key:"account_cost",label:"账户消耗",type:"money"},{key:"cash_cost",label:"现金成本",type:"money"},{key:"roi",label:"ROI",type:"ratio"}],te=[{key:"add_fans_count",label:"加粉数",type:"count"},{key:"total_open_count",label:"总开口",type:"count",placeholder:!0},{key:"unreplied_count",label:"未回复",type:"count",placeholder:!0},{key:"paid_appointment_count",label:"付费挂号",type:"count"},{key:"free_appointment_count",label:"免费挂号",type:"count"},{key:"appointment_total_count",label:"挂号总数",type:"count"},{key:"interview_count",label:"面诊",type:"count"},{key:"completed_order_count",label:"接诊诊单",type:"count"},{key:"completed_order_amount",label:"诊单金额",type:"money",minWidth:120},{key:"paid_appointment_rate",label:"付费挂号率",type:"percent",minWidth:120},{key:"open_appointment_rate",label:"开口挂号率",type:"percent",placeholder:!0,minWidth:120},{key:"interview_rate",label:"面诊率",type:"percent",minWidth:100},{key:"receive_rate",label:"接诊率",type:"percent",minWidth:100},{key:"interview_receive_rate",label:"面诊接诊率",type:"percent",minWidth:130},{key:"open_receive_rate",label:"开口接诊率",type:"percent",placeholder:!0,minWidth:120},{key:"avg_unit_price",label:"平均单价",type:"money",minWidth:110},{key:"cash_cost",label:"现金成本",type:"money",minWidth:110},{key:"roi",label:"ROI",type:"ratio",minWidth:90}],ae=c(()=>{var t;return(t=m.date_range)!=null&&t.length?`${m.date_range[0]} 至 ${m.date_range[1]}`:"未选择"}),ne=c(()=>m.charts.ranking.names.length>0),oe=c(()=>m.charts.amount_share.length>0),le=c(()=>m.charts.fan_share.length>0),w=c(()=>{var u;const t=((u=m.charts)==null?void 0:u.ranking)||{},e=Array.isArray(t.names)?t.names:[],r=i=>e.map((U,A)=>Number((i==null?void 0:i[A])??0));return{names:e,amounts:r(Array.isArray(t.amounts)?t.amounts:[]),orderCounts:r(Array.isArray(t.order_counts)?t.order_counts:[]),fanCounts:r(Array.isArray(t.fan_counts)?t.fan_counts:[])}}),re=c(()=>({tooltip:{trigger:"axis"},legend:{data:["诊单金额","接诊诊单","加粉数"]},grid:{left:48,right:24,top:48,bottom:48},xAxis:{type:"category",data:w.value.names,axisLabel:{interval:0,rotate:w.value.names.length>6?25:0}},yAxis:[{type:"value",name:"金额 / 数量"}],series:[{name:"诊单金额",type:"bar",barMaxWidth:36,data:w.value.amounts,itemStyle:{color:"#4a78ff"}},{name:"接诊诊单",type:"line",smooth:!0,showSymbol:!0,symbolSize:8,lineStyle:{width:3},data:w.value.orderCounts,itemStyle:{color:"#15b8a6"}},{name:"加粉数",type:"line",smooth:!0,showSymbol:!0,symbolSize:8,lineStyle:{width:3},data:w.value.fanCounts,itemStyle:{color:"#ff9f43"}}]})),se=c(()=>({tooltip:{trigger:"item"},legend:{bottom:0,type:"scroll",pageIconColor:"#409eff",pageTextStyle:{color:"#909399"}},series:[{name:"诊单金额",type:"pie",radius:["42%","70%"],center:["50%","42%"],avoidLabelOverlap:!0,minAngle:3,label:{show:!0,formatter:"{b}",overflow:"truncate",width:90},labelLayout:{hideOverlap:!0},data:m.charts.amount_share}]})),ie=c(()=>({tooltip:{trigger:"item"},legend:{bottom:0,type:"scroll",pageIconColor:"#409eff",pageTextStyle:{color:"#909399"}},series:[{name:"加粉数",type:"pie",radius:["42%","70%"],center:["50%","42%"],avoidLabelOverlap:!0,minAngle:3,label:{show:!0,formatter:"{b}",overflow:"truncate",width:90},labelLayout:{hideOverlap:!0},data:m.charts.fan_share}]})),B=t=>{let e=[];return t.forEach(r=>{e.push({id:Number(r.id),name:r.name}),Array.isArray(r.children)&&r.children.length>0&&(e=e.concat(B(r.children)))}),e},de=t=>{if(!t)return;z.value=!0;const e=Array.isArray(t.departments)?t.departments:[],r=Array.isArray(t.assistants)?t.assistants:[],u=Array.isArray(t.doctors)?t.doctors:[];D.value=e,L.value=B(e),F.value=r.map(i=>({id:Number(i.id),name:i.name})),R.value=u.map(i=>({id:Number(i.id),name:i.name}))},f=async()=>{try{await I()}catch(t){console.error("获取统计概览失败:",t),ze.error((t==null?void 0:t.msg)||"获取统计数据失败")}},pe=()=>{a.dept_id=void 0,a.assistant_id=void 0,a.doctor_id=void 0,p.page=1,f()},M=()=>{p.page=1,f()},ue=()=>{a.time_type!=="custom"&&(y.value=[],p.page=1,f())},me=()=>{y.value.length===2&&(p.page=1,f())},ce=()=>{p.page=1,f()},_e=()=>{a.dimension="dept",a.dept_id=void 0,a.assistant_id=void 0,a.doctor_id=void 0,a.time_type="today",y.value=[],p.page=1,p.size=15,f()},$=(t,e,r="count",u=!1)=>{if(u)return"—";const i=(e==null?void 0:e[t])??0;return r==="money"?`¥${Number(i||0).toFixed(2)}`:r==="percent"?`${Number(i||0).toFixed(2)}%`:r==="ratio"?Number(i||0).toFixed(2):String(i??0)};return $e(async()=>{await f()}),(t,e)=>{const r=xe,u=Ce,i=Ee,U=Ve,A=Oe,E=Se,ye=Ae,fe=Ne,H=Pe,ve=we,C=Te,S=De,O=We,Y=Le,G=Re,he=Fe,be=ke;return d(),V("div",Qe,[l(C,{class:"!border-none",shadow:"never"},{default:o(()=>[l(ve,{inline:!0,model:a,class:"stats-filter-form"},{default:o(()=>[l(u,{label:"统计维度"},{default:o(()=>[l(r,{modelValue:a.dimension,"onUpdate:modelValue":e[0]||(e[0]=n=>a.dimension=n),options:J,onChange:pe},null,8,["modelValue"])]),_:1}),l(u,{label:k.value},{default:o(()=>[a.dimension==="dept"?(d(),_(i,{key:0,modelValue:x.value,"onUpdate:modelValue":e[1]||(e[1]=n=>x.value=n),data:D.value,placeholder:`全部${k.value}`,clearable:"",filterable:"","node-key":"id","check-strictly":"","default-expand-all":!0,props:K,style:{width:"220px"},onChange:M},null,8,["modelValue","data","placeholder"])):(d(),_(A,{key:1,modelValue:x.value,"onUpdate:modelValue":e[2]||(e[2]=n=>x.value=n),placeholder:`全部${k.value}`,clearable:"",filterable:"",style:{width:"220px"},onChange:M},{default:o(()=>[(d(!0),V(P,null,T(Z.value,n=>(d(),_(U,{key:n.id,label:n.name,value:n.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"]))]),_:1},8,["label"]),l(u,{label:"时间范围"},{default:o(()=>[l(ye,{modelValue:a.time_type,"onUpdate:modelValue":e[3]||(e[3]=n=>a.time_type=n),onChange:ue},{default:o(()=>[l(E,{label:"today"},{default:o(()=>[...e[6]||(e[6]=[v("今天",-1)])]),_:1}),l(E,{label:"week"},{default:o(()=>[...e[7]||(e[7]=[v("最近7天",-1)])]),_:1}),l(E,{label:"month"},{default:o(()=>[...e[8]||(e[8]=[v("最近30天",-1)])]),_:1}),l(E,{label:"custom"},{default:o(()=>[...e[9]||(e[9]=[v("自定义",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a.time_type==="custom"?(d(),_(u,{key:0},{default:o(()=>[l(fe,{modelValue:y.value,"onUpdate:modelValue":e[4]||(e[4]=n=>y.value=n),type:"daterange","value-format":"YYYY-MM-DD","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",style:{width:"260px"},onChange:me},null,8,["modelValue"])]),_:1})):Ue("",!0),l(u,null,{default:o(()=>[l(H,{type:"primary",loading:h(p).loading,onClick:ce},{default:o(()=>[...e[10]||(e[10]=[v("查询",-1)])]),_:1},8,["loading"]),l(H,{onClick:_e},{default:o(()=>[...e[11]||(e[11]=[v("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),s("div",je,[(d(),V(P,null,T(ee,n=>s("div",{key:n.key,class:"stats-kpi-card"},[s("div",qe,g(n.label),1),s("div",{class:Ye(["stats-kpi-value",{"is-money":n.type==="money"}])},g($(n.key,m.summary,n.type,n.placeholder)),3)])),64))]),l(Y,{gutter:20,class:"mt-4"},{default:o(()=>[l(O,{xs:24,lg:14},{default:o(()=>[l(C,{class:"!border-none",shadow:"never"},{header:o(()=>[s("div",Je,[e[12]||(e[12]=s("span",null,"转化排行",-1)),s("span",Ke,g(ae.value),1)])]),default:o(()=>[ne.value?(d(),_(h(N),{key:0,class:"stats-chart",option:re.value,autoresize:""},null,8,["option"])):(d(),_(S,{key:1,description:"暂无图表数据"}))]),_:1})]),_:1}),l(O,{xs:24,lg:10},{default:o(()=>[l(C,{class:"!border-none",shadow:"never"},{header:o(()=>[...e[13]||(e[13]=[s("div",{class:"card-header"},[s("span",null,"诊单金额占比"),s("span",{class:"card-hint"},"TOP 10")],-1)])]),default:o(()=>[oe.value?(d(),_(h(N),{key:0,class:"stats-chart",option:se.value,autoresize:""},null,8,["option"])):(d(),_(S,{key:1,description:"暂无金额数据"}))]),_:1})]),_:1})]),_:1}),l(Y,{gutter:20,class:"mt-4"},{default:o(()=>[l(O,{xs:24,lg:10},{default:o(()=>[l(C,{class:"!border-none",shadow:"never"},{header:o(()=>[...e[14]||(e[14]=[s("div",{class:"card-header"},[s("span",null,"加粉占比"),s("span",{class:"card-hint"},"TOP 10")],-1)])]),default:o(()=>[le.value?(d(),_(h(N),{key:0,class:"stats-chart",option:ie.value,autoresize:""},null,8,["option"])):(d(),_(S,{key:1,description:"暂无加粉数据"}))]),_:1})]),_:1}),l(O,{xs:24,lg:14},{default:o(()=>[l(C,{class:"!border-none",shadow:"never"},{header:o(()=>[s("div",Xe,[e[15]||(e[15]=s("span",null,"明细列表",-1)),s("span",Ze,g(k.value)+"维度",1)])]),default:o(()=>[l(he,{data:h(p).lists,"row-key":a.dimension==="dept"?"id":void 0,"tree-props":a.dimension==="dept"?X:void 0,"default-expand-all":!1,size:"large",style:{width:"100%"},"max-height":"560"},{default:o(()=>[l(G,{label:k.value,prop:"name",fixed:"left","min-width":"280","class-name":"dept-name-column","show-overflow-tooltip":""},{default:o(({row:n})=>[s("span",{class:"dept-name-cell",title:n.name},g(n.name),9,et)]),_:1},8,["label"]),(d(),V(P,null,T(te,n=>l(G,{key:n.key,label:n.label,"min-width":n.minWidth||110,width:n.width,align:n.align||"center"},{default:o(({row:ge})=>[v(g($(n.key,ge,n.type,n.placeholder)),1)]),_:2},1032,["label","min-width","width","align"])),64))]),_:1},8,["data","row-key","tree-props"]),s("div",tt,[l(be,{modelValue:h(p),"onUpdate:modelValue":e[5]||(e[5]=n=>He(p)?p.value=n:null),onChange:h(I)},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),_:1})])}}}),Yt=Be(nt,[["__scopeId","data-v-8cab927d"]]);export{Yt as default};
|