Files
2026-08-24 16:56:37 +08:00

2 lines
17 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 ee,ba as J,ap as be,ac as ve,bi as ye,q as r,r as c,s as e,T as s,v as i,D as u,u as z,cO as ke,w as we,L as d,P as v,by as xe,K as Ne,cP as Ve,O as f,bp as Ce,F as N,G as V,bn as Ee,bm as Me,bK as Se,cB as De,ae as W,t as X,bB as $e,bk as Fe,br as Le,bj as Oe,bX as ze,cJ as Te,M as Q,p as b,E as Z}from"./.pnpm-Dwh6tNxD.js";import{f as Be}from"./first_visit-C8RwWSjD.js";import{_ as Ie}from"./index-C9ilrjDr.js";const Pe={class:"conversion-page","element-loading-text":"正在汇总权限范围内的数据"},Re={class:"page-heading"},Ae={class:"heading-meta"},Ye={class:"scope-chip"},qe={key:0},Ue={class:"filter-strip"},je={class:"filter-item filter-item--time"},Ge={class:"filter-item"},Ke={class:"filter-item"},He={class:"filter-item"},Je={class:"range-text"},We={class:"metric-grid","aria-label":"综合转化指标"},Xe={class:"metric-value"},Qe={key:0,class:"deleted-fans-marker",title:"加粉总数中已删除"},Ze={key:0,class:"ranking-grid"},et={class:"panel ranking-panel"},tt={class:"panel-heading"},at={key:0,class:"bar-list"},nt=["title"],lt={class:"bar-track"},st={class:"panel ranking-panel"},ot={class:"panel-heading"},rt={key:0,class:"bar-list"},it=["title"],ut={class:"bar-track"},dt={class:"panel detail-panel"},ct={class:"panel-heading panel-heading--table"},_t={class:"fan-count-value"},mt={key:0,class:"deleted-fans-marker",title:"加粉总数中已删除"},pt={class:"panel target-panel"},gt={class:"panel-heading"},ht={class:"target-layout"},ft={class:"target-progress-list"},bt={class:"target-summary"},vt={class:"is-teal"},yt={class:"progress-block"},kt={class:"progress-copy"},wt={class:"progress-block progress-block--month"},xt={class:"progress-copy"},Nt={key:0,class:"target-empty-note"},Vt={class:"trend-wrap"},Ct=ee({name:"firstVisitConversionPage"}),Et=ee({...Ct,setup(Mt){const te=new Set(["account_cost","roi"]),T=()=>({meta:{time_type:"today",time_label:"今日",start_date:"",end_date:"",generated_at:"",scope_value:4,scope_label:"",selected_dept_name:"",selected_assistant_name:"",selected_media_channel_code:"",selected_media_channel_name:"",open_count_source:"",ranking_kind:"hidden",can_view_finance:!1},filters:{departments:[],assistants:[],media_channels:[]},summary:{},rankings:{orders:[],amounts:[]},rows:[],target:{year:new Date().getFullYear(),target_amount:0,actual_amount:0,completion_rate:null,current_month_target:0,current_month_actual:0,current_month_rate:null,department_count:0,months:[],target_cumulative:[],actual_cumulative:[]}}),l=J(T()),S=Q(!1),m=J({time_type:"today",dept_id:void 0,assistant_id:void 0,media_channel_code:""}),w=Q([]),ae={value:"id",label:"name",children:"children"},ne=[{label:"今日",value:"today"},{label:"昨天",value:"yesterday"},{label:"本周",value:"week"},{label:"本月",value:"month"},{label:"本季度",value:"quarter"},{label:"本年",value:"year"},{label:"自定义",value:"custom"}],B=[{key:"add_fans_count",label:"加粉数",type:"count",hint:"区间新增加粉(含已删除);(-N)为其中已删除"},{key:"total_open_count",label:"开口数",type:"count",hint:"来源于个人业绩录入"},{key:"interview_count",label:"面诊",type:"count",hint:"已完成预约"},{key:"completed_order_count",label:"接诊诊单",type:"count",hint:"业务订单,按创建人归属并过滤无效单"},{key:"completed_order_amount",label:"诊单金额",type:"money",hint:"排除取消、拒收、退款及已退款订单"},{key:"avg_unit_price",label:"平均客单价",type:"money",hint:"诊单金额 / 接诊诊单"},{key:"account_cost",label:"现金成本",type:"money",hint:"当前范围内实际投放成本"},{key:"roi",label:"ROI",type:"ratio",hint:"诊单金额 / 投放成本"}],le=b(()=>{const n=[`${l.meta.time_label||"当前区间"}数据`,l.meta.scope_label||"当前权限范围"];return l.meta.selected_dept_name&&n.push(l.meta.selected_dept_name),l.meta.selected_assistant_name&&n.push(l.meta.selected_assistant_name),l.meta.selected_media_channel_name&&n.push(`渠道:${l.meta.selected_media_channel_name}`),n.join(" · ")}),I=b(()=>!!l.meta.can_view_finance),se=b(()=>I.value?B:B.filter(n=>!te.has(n.key))),oe=b(()=>{const n=[],t=new Map;for(const o of l.filters.media_channels){if(o.kind==="group")continue;const h=String(o.group_name||"").trim();let k=t.get(h);k===void 0&&(k=n.length,t.set(h,k),n.push({group_name:h,customer_count:0,channels:[]}));const E=n[k],M=h!==""&&!o.name.includes(h)?`${o.name} ${h}`:"";E.channels.push(M===""?o:{...o,search_label:M}),E.customer_count=Math.max(E.customer_count,Number(o.customer_count||0))}for(const o of n){if(o.group_name==="")continue;const h=o.channels.some(k=>k.name===o.group_name);o.channels.length<2&&h||o.channels.unshift({code:`group:${o.group_name}`,name:`${o.group_name}(全部)`,group_name:o.group_name,customer_count:o.customer_count,kind:"group"})}return n}),P=b(()=>l.meta.ranking_kind||(Number(l.meta.scope_value)===4?"hidden":Number(l.meta.scope_value)===3?"member":"group")),re=b(()=>P.value!=="hidden"),D=b(()=>P.value==="member"?"组内成员":"小组"),R=b(()=>l.rankings.orders.reduce((n,t)=>n+Number(t.value||0),0)),A=b(()=>l.rankings.amounts.reduce((n,t)=>n+Number(t.value||0),0)),ie=b(()=>({animationDuration:450,color:["#0f9185","#2f78df"],tooltip:{trigger:"axis",valueFormatter:n=>g(n)},grid:{left:62,right:24,top:28,bottom:36},xAxis:{type:"category",boundaryGap:!1,data:l.target.months,axisLine:{lineStyle:{color:"#d9e1e9"}},axisLabel:{color:"#718096"}},yAxis:{type:"value",axisLabel:{color:"#718096",formatter:n=>me(n)},splitLine:{lineStyle:{color:"#edf1f5"}}},series:[{name:"实际完成",type:"line",smooth:!0,symbol:"none",lineStyle:{width:3},areaStyle:{color:"rgba(15,145,133,.08)"},data:l.target.actual_cumulative},{name:"目标值",type:"line",smooth:!0,symbol:"none",lineStyle:{width:2,type:"dashed"},data:l.target.target_cumulative}]}));let $=0;async function y(){const n=++$;S.value=!0;try{const t={...m};if(t.time_type==="custom"){if(t.start_date=w.value[0]||"",t.end_date=w.value[1]||"",!t.start_date||!t.end_date){Z.warning("请选择自定义日期范围");return}}else delete t.start_date,delete t.end_date;const o=await Be(t);if(n!==$)return;Object.assign(l,T(),o||{}),m.media_channel_code=l.meta.selected_media_channel_code||""}catch(t){if(n!==$)return;Z.error((t==null?void 0:t.message)||"综合数据加载失败")}finally{n===$&&(S.value=!1)}}function ue(){if(m.time_type!=="custom"){w.value=[],y();return}w.value.length===2&&y()}function de(){m.time_type==="custom"&&w.value.length===2&&y()}function ce(){m.assistant_id=void 0,y()}function _e(n,t){const o=l.summary[n];return t==="money"?g(o):t==="ratio"?U(o):C(o)}function C(n){return Math.round(Number(n||0)).toLocaleString("zh-CN")}function Y(n){return Math.round(Number(n||0))>0}function g(n){return`¥${Number(n||0).toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function x(n){return`${Number(n||0).toFixed(1)}%`}function q(n,t){return t<=0?"0.0%":`${(Number(n||0)/t*100).toFixed(1)}%`}function F(n){return n==null?"未设置":x(n)}function U(n){return Number(n||0).toFixed(2)}function me(n){return Math.abs(n)>=1e4?`${(n/1e4).toFixed(0)}万`:String(Math.round(n))}function j(n,t){const o=Number(n||0);return t<=0||o<=0?"0%":`${Math.max(4,Math.min(100,o/t*100))}%`}function G(n){return Math.max(0,Math.min(100,Number(n||0)))}return be(y),(n,t)=>{const o=we,h=Ne,k=Ve,E=Ce,M=Ee,K=Me,pe=Se,ge=De,L=$e,O=Le,_=Fe,he=Oe,H=ze,fe=ye;return ve((r(),c("div",Pe,[e("header",Re,[e("div",null,[t[5]||(t[5]=e("h1",null,"综合数据转化",-1)),e("p",null,s(le.value),1)]),e("div",Ae,[e("span",Ye,[i(o,null,{default:u(()=>[i(z(ke))]),_:1}),d(s(l.meta.scope_label||"数据范围"),1)]),l.meta.generated_at?(r(),c("span",qe,"更新于 "+s(l.meta.generated_at),1)):v("",!0),i(h,{icon:z(xe),loading:S.value,onClick:y},{default:u(()=>[...t[6]||(t[6]=[d("刷新",-1)])]),_:1},8,["icon","loading"])])]),e("section",Ue,[e("div",je,[t[7]||(t[7]=e("span",{class:"filter-label"},"时间范围",-1)),i(k,{modelValue:m.time_type,"onUpdate:modelValue":t[0]||(t[0]=a=>m.time_type=a),options:ne,onChange:ue},null,8,["modelValue"]),m.time_type==="custom"?(r(),f(E,{key:0,modelValue:w.value,"onUpdate:modelValue":t[1]||(t[1]=a=>w.value=a),type:"daterange","value-format":"YYYY-MM-DD","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",class:"date-range-picker",clearable:!1,onChange:de},null,8,["modelValue"])):v("",!0)]),e("div",Ge,[t[8]||(t[8]=e("span",{class:"filter-label"},"搜索员工",-1)),i(K,{modelValue:m.assistant_id,"onUpdate:modelValue":t[2]||(t[2]=a=>m.assistant_id=a),clearable:"",filterable:"",placeholder:"全部员工",class:"employee-select",onChange:y},{default:u(()=>[(r(!0),c(N,null,V(l.filters.assistants,a=>(r(),f(M,{key:a.id,label:a.name,value:Number(a.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Ke,[t[9]||(t[9]=e("span",{class:"filter-label"},"部门",-1)),i(pe,{modelValue:m.dept_id,"onUpdate:modelValue":t[3]||(t[3]=a=>m.dept_id=a),data:l.filters.departments,props:ae,"node-key":"id",clearable:"",filterable:"","check-strictly":"","default-expand-all":"",placeholder:"全部可见部门",class:"dept-select",onChange:ce},null,8,["modelValue","data"])]),e("div",He,[t[10]||(t[10]=e("span",{class:"filter-label"},"渠道",-1)),i(K,{modelValue:m.media_channel_code,"onUpdate:modelValue":t[4]||(t[4]=a=>m.media_channel_code=a),clearable:"",filterable:"",placeholder:"全部渠道",class:"channel-select",onChange:y},{default:u(()=>[(r(!0),c(N,null,V(oe.value,a=>(r(),f(ge,{key:a.group_name||"_",label:`${a.group_name||"(未分组)"} · ${a.customer_count}`},{default:u(()=>[(r(!0),c(N,null,V(a.channels,p=>(r(),f(M,{key:p.code,label:p.search_label||p.name,value:p.code},{default:u(()=>[e("span",{class:W(["channel-option",{"is-group":p.kind==="group"}])},[e("span",null,s(p.name),1),e("span",null,s(p.customer_count)+" 人",1)],2)]),_:2},1032,["label","value"]))),128))]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),e("span",Je,s(l.meta.start_date)+" 至 "+s(l.meta.end_date),1)]),e("section",We,[(r(!0),c(N,null,V(se.value,a=>(r(),c("article",{key:a.key,class:"metric-card"},[e("span",null,s(a.label),1),e("strong",Xe,[d(s(_e(a.key,a.type))+" ",1),a.key==="add_fans_count"&&Y(l.summary.deleted_fans_count)?(r(),c("em",Qe," (-"+s(C(l.summary.deleted_fans_count))+") ",1)):v("",!0)]),e("small",null,s(a.hint),1)]))),128))]),re.value?(r(),c("section",Ze,[e("article",et,[e("div",tt,[e("div",null,[e("h2",null,s(D.value)+"订单量占比排名",1),e("p",null,"按"+s(D.value)+"归属统计,排除取消、拒收及退款",1)]),t[11]||(t[11]=e("span",null,"单位:单",-1))]),l.rankings.orders.length?(r(),c("div",at,[(r(!0),c(N,null,V(l.rankings.orders,(a,p)=>(r(),c("div",{key:`order-${a.id}`,class:"bar-row"},[e("span",{class:"bar-name",title:a.name},[e("b",null,s(p+1),1),d(s(a.name),1)],8,nt),e("div",lt,[e("i",{class:"is-teal",style:X({width:j(a.value,R.value)})},null,4)]),e("strong",null,[e("span",null,s(C(a.value))+" 单",1),e("small",null,s(q(a.value,R.value)),1)])]))),128))])):(r(),f(L,{key:1,"image-size":54,description:"当前范围暂无订单数据"}))]),e("article",st,[e("div",ot,[e("div",null,[e("h2",null,s(D.value)+"金额占比排名",1),e("p",null,"按"+s(D.value)+"归属统计,仅含未取消、未拒收且未退款的有效金额",1)]),t[12]||(t[12]=e("span",null,"单位:元",-1))]),l.rankings.amounts.length?(r(),c("div",rt,[(r(!0),c(N,null,V(l.rankings.amounts,(a,p)=>(r(),c("div",{key:`amount-${a.id}`,class:"bar-row"},[e("span",{class:"bar-name",title:a.name},[e("b",null,s(p+1),1),d(s(a.name),1)],8,it),e("div",ut,[e("i",{class:"is-blue",style:X({width:j(a.value,A.value)})},null,4)]),e("strong",null,[e("span",null,s(g(a.value)),1),e("small",null,s(q(a.value,A.value)),1)])]))),128))])):(r(),f(L,{key:1,"image-size":54,description:"当前范围暂无金额数据"}))])])):v("",!0),e("section",dt,[e("div",ct,[t[13]||(t[13]=e("div",null,[e("h2",null,"明细数据列表"),e("p",null,"展开部门可查看人员明细;加粉=总进线=区间新增加粉(按员工+客户去重,包含区间内添加后已删客户,剔除继承客户、扫一扫/搜手机号/名片分享添加及区间前已加过的重加),(-N)表示加粉总数中已删除;挂号=已支付且实收低于 10 元的订单,预约=有效预约记录;开口率=开口/加粉,挂号率=挂号/加粉,面诊率=面诊/挂号(看挂号后流失),预约率=面诊/预约(看预约后未面诊),面诊接诊率=接诊诊单/面诊,接诊率=接诊诊单/总进线")],-1)),e("span",null,s(l.rows.length)+" 个顶层节点",1)]),i(he,{data:l.rows,"row-key":"id","tree-props":{children:"children"},"default-expand-all":"",class:"detail-table"},{empty:u(()=>[i(L,{description:"当前权限范围内暂无转化数据"})]),default:u(()=>[i(_,{prop:"name",label:"部门 / 人员","min-width":"220",fixed:"left"},{default:u(({row:a})=>[e("strong",{class:W({"is-parent":Array.isArray(a.children)&&a.children.length,"is-member":a.type==="member"})},s(a.name),3),!a.type&&a.leader_name?(r(),f(O,{key:0,size:"small",type:"warning",effect:"plain",class:"role-tag"},{default:u(()=>[d(" 组长 · "+s(a.leader_name),1)]),_:2},1024)):v("",!0),a.type==="member"&&a.role?(r(),f(O,{key:1,size:"small",type:"info",effect:"plain",class:"role-tag"},{default:u(()=>[d(s(a.role)+s(a.is_leader?" · 组长":""),1)]),_:2},1024)):a.type==="unbound"?(r(),f(O,{key:2,size:"small",type:"warning",effect:"plain",class:"role-tag"},{default:u(()=>[...t[14]||(t[14]=[d(" 未绑定账号 ",-1)])]),_:1})):v("",!0)]),_:1}),i(_,{prop:"add_fans_count",label:"加粉","min-width":"92",align:"right"},{default:u(({row:a})=>[e("span",_t,[d(s(C(a.add_fans_count))+" ",1),Y(a.deleted_fans_count)?(r(),c("em",mt," (-"+s(C(a.deleted_fans_count))+") ",1)):v("",!0)])]),_:1}),i(_,{prop:"total_open_count",label:"开口","min-width":"72",align:"right"}),i(_,{prop:"paid_appointment_count",label:"挂号","min-width":"72",align:"right"}),i(_,{prop:"appointment_total_count",label:"预约","min-width":"72",align:"right"}),i(_,{prop:"interview_count",label:"面诊","min-width":"72",align:"right"}),i(_,{prop:"completed_order_count",label:"接诊诊单","min-width":"88",align:"right"}),i(_,{label:"接诊金额","min-width":"104",align:"right"},{default:u(({row:a})=>[d(s(g(a.completed_order_amount)),1)]),_:1}),i(_,{label:"开口率","min-width":"82",align:"right"},{default:u(({row:a})=>[d(s(x(a.total_open_rate)),1)]),_:1}),i(_,{label:"挂号率","min-width":"82",align:"right"},{default:u(({row:a})=>[d(s(x(a.paid_appointment_rate)),1)]),_:1}),i(_,{label:"面诊率","min-width":"82",align:"right"},{default:u(({row:a})=>[d(s(x(a.interview_paid_rate)),1)]),_:1}),i(_,{label:"预约率","min-width":"82",align:"right"},{default:u(({row:a})=>[d(s(x(a.interview_rate)),1)]),_:1}),i(_,{label:"面诊接诊率","min-width":"100",align:"right"},{default:u(({row:a})=>[d(s(x(a.interview_receive_rate)),1)]),_:1}),i(_,{label:"接诊率","min-width":"82",align:"right"},{default:u(({row:a})=>[d(s(x(a.receive_rate)),1)]),_:1}),I.value?(r(),f(_,{key:0,label:"ROI","min-width":"72",align:"right"},{default:u(({row:a})=>[d(s(U(a.roi)),1)]),_:1})):v("",!0)]),_:1},8,["data"])]),e("section",pt,[e("div",gt,[e("div",null,[t[15]||(t[15]=e("h2",null,"一诊诊金目标追踪",-1)),e("p",null,s(l.target.year)+" 年 · 按当前角色、部门及员工筛选范围计算",1)]),e("span",null,s(l.target.department_count)+" 个目标部门",1)]),e("div",ht,[e("div",ft,[e("div",bt,[e("div",null,[t[16]||(t[16]=e("span",null,"年度目标",-1)),e("strong",null,s(g(l.target.target_amount)),1)]),e("div",null,[t[17]||(t[17]=e("span",null,"已完成",-1)),e("strong",null,s(g(l.target.actual_amount)),1)]),e("div",null,[t[18]||(t[18]=e("span",null,"完成率",-1)),e("strong",vt,s(F(l.target.completion_rate)),1)])]),e("div",yt,[e("div",kt,[t[19]||(t[19]=e("span",null,"年度范围目标",-1)),e("b",null,s(F(l.target.completion_rate)),1)]),i(H,{percentage:G(l.target.completion_rate),"show-text":!1,"stroke-width":12,color:"#0f9185"},null,8,["percentage"]),e("small",null,"已完成 "+s(g(l.target.actual_amount))+" / 目标 "+s(g(l.target.target_amount)),1)]),e("div",wt,[e("div",xt,[t[20]||(t[20]=e("span",null,"本月范围目标",-1)),e("b",null,s(F(l.target.current_month_rate)),1)]),i(H,{percentage:G(l.target.current_month_rate),"show-text":!1,"stroke-width":12,color:"#2f78df"},null,8,["percentage"]),e("small",null,"已完成 "+s(g(l.target.current_month_actual))+" / 目标 "+s(g(l.target.current_month_target)),1)]),Number(l.target.target_amount)<=0?(r(),c("div",Nt," 当前可见部门尚未维护本年度月度目标,实际诊单金额仍会正常统计。 ")):v("",!0)]),e("div",Vt,[t[21]||(t[21]=e("div",{class:"trend-title"},[e("span",null,"年度累计趋势"),e("div",null,[e("i",{class:"legend-line is-actual"}),d("实际完成 "),e("i",{class:"legend-line is-target"}),d("目标值")])],-1)),i(z(Te),{class:"target-chart",option:ie.value,autoresize:""},null,8,["option"])])])])])),[[fe,S.value]])}}}),Ft=Ie(Et,[["__scopeId","data-v-251ca648"]]);export{Ft as default};