2 lines
37 KiB
JavaScript
2 lines
37 KiB
JavaScript
import{o as ze,R as Ie,E as b,ap as ct,ac as Pe,bi as _t,q as u,r as f,s as a,v as l,D as i,u as _,cV as pt,w as ft,cO as gt,L as p,T as d,P as R,by as De,K as bt,cN as vt,d0 as yt,bI as kt,d1 as Nt,ae as P,d2 as Ee,d3 as Me,d4 as ht,c$ as ve,cv as Te,F as ae,G as ne,cD as Ct,at as Le,bu as xt,d5 as wt,O as E,bh as $t,bk as At,I as St,bB as Vt,bj as It,cl as Pt,as as Dt,b6 as Et,bm as Mt,bn as Tt,bA as Lt,b9 as zt,bs as Ft,a4 as Ut,d6 as jt,bq as Bt,b7 as Ot,bK as qt,bt as Kt,J as Jt,bp as Rt,ba as G,M as S,p as Y,e as Yt}from"./.pnpm-Dwh6tNxD.js";import{z as Wt,A as Ht,B as Gt,C as Zt,D as Qt,E as Xt,F as ea,G as ta}from"./first_visit-BE8Lm4EN.js";import aa from"./WecomFloatingWidgetBuilder-C28RN64v.js";import{_ as na}from"./index-CLwe6ftX.js";const sa={class:"promotion-page","element-loading-text":"正在加载推广配置"},la={class:"page-header"},ia={class:"heading-copy"},oa={class:"heading-icon"},da={class:"heading-actions"},ra={class:"scope-chip"},ua={key:0,class:"update-time"},ma={class:"metric-grid"},ca={class:"metric-card"},_a={class:"metric-icon is-teal"},pa={class:"metric-card"},fa={class:"metric-icon is-blue"},ga={class:"metric-card"},ba={class:"metric-icon is-green"},va={class:"metric-card"},ya={class:"metric-icon is-orange"},ka={class:"workspace-card"},Na={class:"tab-nav","aria-label":"企业微信获客助手功能"},ha={key:0,class:"tab-content links-tab"},Ca={class:"section-heading"},xa={key:0,class:"pool-layout"},wa={class:"pool-sidebar"},$a=["onClick"],Aa={class:"pool-main"},Sa={key:0,class:"pool-toolbar"},Va={class:"pool-title-row"},Ia={class:"owner-tag"},Pa={class:"toolbar-actions"},Da={class:"member-cell"},Ea={key:0,class:"status-tag is-online"},Ma={key:1,class:"status-tag is-offline"},Ta={key:2,class:"status-tag is-offline"},La={key:3,class:"muted"},za={key:1,class:"tab-content customer-stats-tab"},Fa={class:"section-heading customer-stats-heading"},Ua={class:"customer-heading-actions"},ja={key:0,class:"update-time"},Ba={class:"customer-metric-grid","aria-label":"获客客户消息汇总"},Oa={class:"customer-metric-card"},qa={class:"metric-icon is-teal"},Ka={class:"customer-metric-card"},Ja={class:"metric-icon is-blue"},Ra={class:"customer-metric-card"},Ya={class:"metric-icon is-green"},Wa={class:"customer-metric-card"},Ha={class:"metric-icon is-orange"},Ga={class:"customer-filter-bar"},Za=["title"],Qa={class:"member-cell"},Xa={class:"member-cell"},en={class:"customer-pagination"},tn={key:2,class:"tab-content authorization-tab"},an={class:"configuration-state"},nn={key:0},sn={key:1},ln={key:0,class:"missing-fields"},on={class:"callback-list"},dn={class:"configuration-actions"},rn={key:3,class:"tab-content install-tab"},un={class:"section-heading"},mn={class:"member-tree-option__label"},cn={key:0,class:"member-tree-option__count"},_n={key:1,class:"member-tree-option__detail"},pn={class:"form-tip"},fn=ze({name:"firstVisitWecomPromotionPage"}),gn=ze({...fn,setup(bn){const ye=()=>({meta:{scope_label:"",generated_at:""},config:{mode:"internal",configured:!1,ready:!1,missing:[],corp_id_masked:"",agent_id:"",secret_configured:!1,callback_ready:!1,callback_url:"",official_doc:""},summary:{configured_apps:0,pool_count:0,online_links:0,today_clicks:0},pools:[],links:[],member_options:[],department_options:[],customer_acquisition_link_example:"https://work.weixin.qq.com/ca/xxxxxxxx"}),m=G(ye()),se=S(!1),V=S("links"),K=S(),W=S(),Z=S(!1),M=S(!1),le=S(!1),Q=S(!1),O=S(!1),me=S(0),ie=S(0),N=G({id:0,name:"",fallback_url:"",status:1,member_admin_ids:[],skip_verify:0,main_url:""}),C=G({id:0,name:"",userid:"",daily_limit:0,status:1,active_range:[],remark:""}),X=S(!1),ke=S(!1),ce=S(!1),x=G({link_id:"",userid:"",chat_status:""}),I=G({page_no:1,page_size:20,total:0}),y=G({summary:{customer_count:0,messaged_customer_count:0,message_customer_rate:0,received_message_count:0,message_count_known_count:0},rows:[],link_options:[],member_options:[],meta:{last_synced_at:""}}),w=Y(()=>m.pools.find(t=>Number(t.id)===K.value)),Fe=Y(()=>{var t;return Array.isArray((t=w.value)==null?void 0:t.member_rules)?w.value.member_rules:[]}),_e=Y(()=>m.pools.find(t=>Number(t.id)===W.value)),Ue={value:"value",label:"label",children:"children",disabled:"disabled"},Ne=Y(()=>Xe(m.department_options,m.member_options)),je=Y(()=>Ne.value.map(t=>t.value)),Be=Y(()=>y.link_options.length?y.link_options:m.links.filter(t=>t.id).map(t=>({id:Number(t.id),name:t.name||t.remote_link_id||`链接 ${t.id}`}))),Oe=Y(()=>y.member_options.length?y.member_options:m.member_options.map(t=>({id:Number(t.id),userid:String(t.userid||""),name:t.name,department_name:Array.isArray(t.dept_names)?t.dept_names.join(" / "):t.department_name||t.dept_name||""})));Ie(()=>m.pools.map(t=>Number(t.id)).join(","),()=>{const t=m.pools.map(e=>Number(e.id));(!K.value||!t.includes(K.value))&&(K.value=t[0]),(!W.value||!t.includes(W.value))&&(W.value=t[0])},{immediate:!0}),Ie(V,t=>{t==="customer-stats"&&!ke.value&&J()});async function L(){se.value=!0;try{const t=await Ht();Object.assign(m,ye(),t||{})}catch(t){b.error((t==null?void 0:t.message)||"企业微信推广配置加载失败")}finally{se.value=!1}}function pe(t){Object.assign(N,t?{id:Number(t.id),name:t.name,fallback_url:t.fallback_url||"",status:Number(t.status),member_admin_ids:Array.isArray(t.member_admin_ids)?t.member_admin_ids.map(Number):[],skip_verify:Number(t.skip_verify)===1?1:0,main_url:t.main_url||""}:{id:0,name:"",fallback_url:"",status:1,member_admin_ids:[],skip_verify:0,main_url:""}),Z.value=!0}async function qe(){if(!N.name.trim())return b.warning("请输入分流方案名称");if(!N.member_admin_ids.length)return b.warning("请至少选择一名获客医助");M.value=!0;try{const t=await Gt({...N});Z.value=!1,await L(),t!=null&&t.id&&(K.value=Number(t.id)),t!=null&&t.sync_error?b.warning("方案已保存,企业微信多人范围将在后台自动重试同步"):b.success(N.id?"分流方案已保存":"分流方案和官方获客链接已创建")}catch(t){b.error((t==null?void 0:t.message)||"分流方案保存失败")}finally{M.value=!1}}async function Ke(t){try{await Yt.confirm(`删除“${t.name}”将同时永久删除企业微信后台中的官方获客链接,已投放的链接会失效且无法恢复。确认继续?`,"永久删除分流方案",{type:"warning",confirmButtonText:"永久删除",cancelButtonText:"取消"})}catch{return}ie.value=Number(t.id);try{await Zt({id:Number(t.id)}),b.success("分流方案及企业微信官方获客链接已永久删除"),await L()}catch(e){b.error((e==null?void 0:e.message)||"删除失败")}finally{ie.value=0}}function Je(t){const e=Number(t.active_start)>0&&Number(t.active_end)>0?[Ae(t.active_start),Ae(t.active_end)]:[];Object.assign(C,{id:Number(t.id),name:t.name||"",userid:t.userid||"",daily_limit:Number(t.daily_limit)||0,status:Number(t.enabled)===1?1:0,active_range:e,remark:t.remark||""}),Q.value=!0}async function Re(){var t,e;O.value=!0;try{const s=await Qt({...C,active_start:((t=C.active_range)==null?void 0:t[0])||"",active_end:((e=C.active_range)==null?void 0:e[1])||""});Q.value=!1,await L(),s!=null&&s.sync_error?b.warning("规则已保存,企业微信成员范围将在后台自动重试同步"):b.success("医助分流规则已保存")}catch(s){b.error((s==null?void 0:s.message)||"医助分流规则保存失败")}finally{O.value=!1}}async function Ye(t,e){me.value=Number(t.id);try{const s=await Xt({id:Number(t.id),status:e?1:0});await L(),s!=null&&s.sync_error?b.warning("成员状态已保存,企业微信成员范围将在后台自动重试同步"):b.success("成员规则已保存,企微多人路由范围已重新计算")}catch(s){b.error((s==null?void 0:s.message)||"成员状态更新失败"),await L()}finally{me.value=0}}async function he(){le.value=!0;try{const t=await ea();t!=null&&t.has_link?b.success((t==null?void 0:t.message)||"API 验证通过:应用凭证、可信 IP 与获客助手权限均可用"):b.warning((t==null?void 0:t.message)||"API 权限可用,但当前应用还没有创建官方获客链接")}catch(t){b.error((t==null?void 0:t.message)||"获客助手 API 验证失败")}finally{le.value=!1}}async function We(){await L(),V.value==="customer-stats"&&await J()}function H(t,e){for(const s of e)if((t==null?void 0:t[s])!==void 0&&(t==null?void 0:t[s])!==null&&(t==null?void 0:t[s])!==""){const o=Number(t[s]);return Number.isFinite(o)?o:0}return 0}async function J(){var t,e;X.value=!0;try{const s=await Wt({page_no:I.page_no,page_size:I.page_size,promotion_link_id:x.link_id?Number(x.link_id):void 0,userid:x.userid||void 0,chat_status:x.chat_status===""?void 0:x.chat_status==="messaged"?1:x.chat_status==="unknown"?2:0}),o=(s==null?void 0:s.summary)||(s==null?void 0:s.stats)||{},$=H(o,["customer_count","total_customers","customer_total","total"]),g=H(o,["messaged_customer_count","started_chat_count","chat_customer_count","message_customer_count","chatting_customers"]),A=["message_customer_rate","chat_customer_rate","messaged_rate","chat_rate"],F=A.some(r=>(o==null?void 0:o[r])!==void 0&&(o==null?void 0:o[r])!==null&&(o==null?void 0:o[r])!=="");Object.assign(y.summary,{customer_count:$,messaged_customer_count:g,message_customer_rate:F?H(o,A):$?g/$*100:0,received_message_count:H(o,["received_message_count","recv_msg_cnt","recv_msg_count","total_recv_msg_cnt","message_count"]),message_count_known_count:H(o,["message_count_known_count","exact_message_customer_count"])}),y.rows=Array.isArray(s==null?void 0:s.lists)?s.lists:Array.isArray(s==null?void 0:s.list)?s.list:Array.isArray(s==null?void 0:s.rows)?s.rows:[],I.total=Number((s==null?void 0:s.total)??(s==null?void 0:s.count)??((t=s==null?void 0:s.page)==null?void 0:t.total)??y.rows.length)||0;const h=(s==null?void 0:s.filters)||{},D=(s==null?void 0:s.link_options)||(h==null?void 0:h.link_options)||(h==null?void 0:h.links),T=(s==null?void 0:s.member_options)||(h==null?void 0:h.member_options)||(h==null?void 0:h.members);Array.isArray(D)&&(y.link_options=D),Array.isArray(T)&&(y.member_options=T);const k=y.rows.reduce((r,c)=>{const v=c.last_synced_at||c.last_sync_time||c.synced_at||c.sync_time||"";return Number(v||0)>Number(r||0)?v:r},""),U=((e=s==null?void 0:s.meta)==null?void 0:e.last_synced_at)||(s==null?void 0:s.last_synced_at)||k||y.meta.last_synced_at||"";Object.assign(y.meta,(s==null?void 0:s.meta)||{},{last_synced_at:U?be(U):""}),ke.value=!0}catch(s){b.error((s==null?void 0:s.message)||"获客客户统计加载失败")}finally{X.value=!1}}function He(){I.page_no=1,J()}function Ge(){Object.assign(x,{link_id:"",userid:"",chat_status:""}),I.page_no=1,J()}function Ze(){I.page_no=1,J()}async function Qe(){var t,e,s;ce.value=!0;try{const o=await ta({promotion_link_id:x.link_id?Number(x.link_id):void 0}),$=Number((o==null?void 0:o.scanned)??(o==null?void 0:o.customer_scanned)??((t=o==null?void 0:o.customers)==null?void 0:t.scanned)??0),g=Number((o==null?void 0:o.created)??(o==null?void 0:o.customer_created)??((e=o==null?void 0:o.customers)==null?void 0:e.created)??0),A=Number((o==null?void 0:o.updated)??(o==null?void 0:o.customer_updated)??((s=o==null?void 0:o.customers)==null?void 0:s.updated)??0);b.success((o==null?void 0:o.message)||`客户同步完成:扫描 ${z($)} 位,新增 ${z(g)} 位,更新 ${z(A)} 位`),I.page_no=1,await Promise.all([L(),J()])}catch(o){b.error((o==null?void 0:o.message)||"获客客户同步失败")}finally{ce.value=!1}}function oe(t){const e=Math.floor(Date.now()/1e3);return Number(t.enabled)!==1?{label:"已禁用",className:"is-muted"}:Number(t.active_start)>0&&Number(t.active_start)>e?{label:"尚未生效",className:"is-waiting"}:Number(t.active_end)>0&&Number(t.active_end)<e?{label:"已过期",className:"is-error"}:Number(t.daily_limit)>0&&Ce(t)>=Number(t.daily_limit)?{label:"今日已达上限",className:"is-waiting"}:Number(t.sync_status)===3?{label:"企微同步重试中",className:"is-waiting"}:Number(t.sync_status)===4?{label:"暂无可用成员",className:"is-error"}:{label:"可参与分流",className:"is-ok"}}function Ce(t){const e=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(new Date);return t.today_date===e?Number(t.today_count||0):0}function Xe(t,e){const s=new Set,o=r=>{r.forEach(c=>{const v=Number(c.id);v>0&&s.add(v),Array.isArray(c.children)&&o(c.children)})};o(Array.isArray(t)?t:[]);const $=[],g=new Set;for(const r of Array.isArray(e)?e:[]){const c=Number(r.id);c<=0||g.has(c)||(g.add(c),$.push({id:c,name:String(r.name||r.userid||`成员 ${c}`),userid:String(r.userid||""),display_dept_id:Number(r.display_dept_id||0),dept_ids:Array.isArray(r.dept_ids)?Array.from(new Set(r.dept_ids.map(Number).filter(v=>v>0))):[],dept_names:Array.isArray(r.dept_names)?r.dept_names.map(String).filter(Boolean):[]}))}const A=new Map;$.forEach(r=>{var j;const c=Number(r.display_dept_id||0),v=s.has(c)?c:r.dept_ids.find(B=>s.has(B))||0;A.has(v)||A.set(v,[]),(j=A.get(v))==null||j.push(r)});const F=new Set,h=r=>{const c=r.dept_names.length?r.dept_names.join(" / "):"未分部门",v=r.userid?`${c} · ${r.userid}`:c;return{value:r.id,label:r.name,kind:"member",detail:v,search_text:`${r.name} ${r.userid} ${r.dept_names.join(" ")}`.toLocaleLowerCase()}},D=(r,c)=>r.name.localeCompare(c.name,"zh-CN"),T=(r,c)=>{const v=[];for(const j of Array.isArray(r)?r:[]){const B=Number(j.id);if(B<=0)continue;const de=String(j.name||`部门 ${B}`),re=[...c,de],ue=T(Array.isArray(j.children)?j.children:[],re),ee=[...A.get(B)||[]].sort(D);ee.forEach(te=>F.add(te.id));const n=ee.map(h),q=[...ue,...n];if(!q.length)continue;const mt=q.reduce((te,Ve)=>te+(Ve.kind==="member"?1:Number(Ve.member_count||0)),0);v.push({value:`dept:${B}`,label:de,kind:"department",disabled:!0,member_count:mt,search_text:`${re.join(" ")} ${q.map(te=>te.search_text).join(" ")}`.toLocaleLowerCase(),children:q})}return v},k=T(Array.isArray(t)?t:[],[]),U=$.filter(r=>!F.has(r.id)).sort(D);if(U.length){const r=U.map(h);k.push({value:"dept:unassigned",label:"未分部门",kind:"department",disabled:!0,member_count:r.length,search_text:`未分部门 ${r.map(c=>c.search_text).join(" ")}`.toLocaleLowerCase(),children:r})}return k}function et(t,e){const s=String(t||"").trim().toLocaleLowerCase();return s===""||e.search_text.includes(s)}function tt(t){const e=Array.isArray(t==null?void 0:t.member_admin_ids)?t.member_admin_ids:[];return e.length?`${e.length} 名医助`:"未选择医助"}function at(t){return`${Array.isArray(t.dept_names)&&t.dept_names.length?t.dept_names.join(" / "):"未分部门"} · ${t.userid||"未绑定 userid"}`}function nt(t){const e=t.department_name||t.dept_name||"",s=t.userid?` · ${t.userid}`:"";return e?`${t.name} · ${e}${s}`:`${t.name}${s}`}function xe(t){const e=t.external_userid_masked||t.customer_id_masked||t.customer_masked||t.customer_name_masked;return e?String(e):st(t.external_userid||t.customer_id||t.id)}function st(t){const e=String(t||"").trim();return e?e.includes("*")?e:e.length<=4?`${e.slice(0,1)}***`:e.length<=8?`${e.slice(0,2)}***${e.slice(-1)}`:`${e.slice(0,4)}****${e.slice(-4)}`:"-"}function lt(t){return t.link_name||t.source_link_name||t.promotion_link_name||"未匹配来源链接"}function it(t){const e=t.link_id||t.remote_link_id||t.source_link_id;return e?`链接 ID:${e}`:"暂无链接 ID"}function fe(t){return H(t,["received_message_count","recv_msg_cnt","message_count","received_count"])}function we(t){const e=t.message_count_known??t.message_count_exact??t.count_known;return e!=null?e===!0||e===1||e==="1"||e==="true":fe(t)>0}function ge(t){const e=Number(t.chat_status);if(e===2)return"unknown";const s=t.has_messaged??t.has_message??t.messaged;return s!=null?s===!0||s===1||s==="1"||s==="true"||s==="messaged"?"messaged":"silent":e===1||fe(t)>0?"messaged":"silent"}function ot(t){const e=ge(t);return e==="messaged"?"已发消息":e==="unknown"?"状态未知":"未发消息"}function dt(t){if(we(t))return z(fe(t));const e=ge(t);return e==="silent"?"0":e==="unknown"?"未知":"待回调"}function $e(t){return t.last_message_at||t.last_chat_time||t.last_message_time||t.last_msg_time||t.event_time||""}function be(t){if(t==null||t===""||t===0||t==="0")return"-";if(typeof t=="number"||/^\d+$/.test(String(t))){const e=Number(t),s=new Date(e>1e11?e:e*1e3);return Number.isNaN(s.getTime())?"-":s.toLocaleString("zh-CN",{hour12:!1}).replaceAll("/","-")}return String(t).replace("T"," ").replace(/Z$/,"").slice(0,19)}function rt(t){return`${Number(t||0).toFixed(1)}%`}function z(t){return Number(t||0).toLocaleString("zh-CN")}function Ae(t){const e=new Date(Number(t||0)*1e3),s=o=>String(o).padStart(2,"0");return`${e.getFullYear()}-${s(e.getMonth()+1)}-${s(e.getDate())} ${s(e.getHours())}:${s(e.getMinutes())}:${s(e.getSeconds())}`}async function Se(t,e){if(!t)return b.warning(`${e}暂无内容`);try{await navigator.clipboard.writeText(t)}catch{const s=document.createElement("textarea");s.value=t,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select();const o=document.execCommand("copy");if(s.remove(),!o)throw new Error("copy command failed")}b.success(`${e}已复制`)}async function ut(){await L()}return ct(async()=>{await L()}),(t,e)=>{var ee;const s=ft,o=bt,$=$t,g=At,A=St,F=Vt,h=It,D=Tt,T=Mt,k=Et,U=zt,r=Ft,c=Bt,v=Ot,j=qt,B=Kt,de=Jt,re=Rt,ue=_t;return Pe((u(),f("div",sa,[a("header",la,[a("div",ia,[a("span",oa,[l(s,null,{default:i(()=>[l(_(pt))]),_:1})]),e[29]||(e[29]=a("div",null,[a("h1",null,"企业微信获客助手"),a("p",null,"一个方案保留一条企业微信官方直链,由企业微信在多个可用医助之间原生路由")],-1))]),a("div",da,[a("span",ra,[l(s,null,{default:i(()=>[l(_(gt))]),_:1}),p(d(m.meta.scope_label||"当前数据范围"),1)]),m.meta.generated_at?(u(),f("span",ua,"更新于 "+d(m.meta.generated_at),1)):R("",!0),l(o,{icon:_(De),loading:se.value||X.value,onClick:We},{default:i(()=>[...e[30]||(e[30]=[p("刷新",-1)])]),_:1},8,["icon","loading"])])]),a("section",ma,[a("article",ca,[a("span",_a,[l(s,null,{default:i(()=>[l(_(vt))]),_:1})]),a("div",null,[e[31]||(e[31]=a("small",null,"内部应用",-1)),a("strong",null,d(m.summary.configured_apps),1),e[32]||(e[32]=a("p",null,"直接读取服务器环境配置",-1))])]),a("article",pa,[a("span",fa,[l(s,null,{default:i(()=>[l(_(yt))]),_:1})]),a("div",null,[e[33]||(e[33]=a("small",null,"分流方案",-1)),a("strong",null,d(m.summary.pool_count),1),e[34]||(e[34]=a("p",null,"每个方案对应一个官方链接",-1))])]),a("article",ga,[a("span",ba,[l(s,null,{default:i(()=>[l(_(kt))]),_:1})]),a("div",null,[e[35]||(e[35]=a("small",null,"官方链接",-1)),a("strong",null,d(m.summary.online_links),1),e[36]||(e[36]=a("p",null,"链接不变,成员范围自动更新",-1))])]),a("article",va,[a("span",ya,[l(s,null,{default:i(()=>[l(_(Nt))]),_:1})]),a("div",null,[e[37]||(e[37]=a("small",null,"今日实际获客",-1)),a("strong",null,d(m.summary.today_clicks),1),e[38]||(e[38]=a("p",null,"按企业微信回调确认承接成员",-1))])])]),a("section",ka,[a("nav",Na,[a("button",{class:P({active:V.value==="links"}),onClick:e[0]||(e[0]=n=>V.value="links")},[l(s,null,{default:i(()=>[l(_(Ee))]),_:1}),e[39]||(e[39]=p("获客助手链接 ",-1))],2),a("button",{class:P({active:V.value==="customer-stats"}),onClick:e[1]||(e[1]=n=>V.value="customer-stats")},[l(s,null,{default:i(()=>[l(_(Me))]),_:1}),e[40]||(e[40]=p("获客客户统计 ",-1))],2),a("button",{class:P({active:V.value==="configuration"}),onClick:e[2]||(e[2]=n=>V.value="configuration")},[l(s,null,{default:i(()=>[l(_(ht))]),_:1}),e[41]||(e[41]=p("应用配置 ",-1))],2),a("button",{class:P({active:V.value==="install"}),onClick:e[3]||(e[3]=n=>V.value="install")},[l(s,null,{default:i(()=>[l(_(ve))]),_:1}),e[42]||(e[42]=p("JS 安装 ",-1))],2)]),V.value==="links"?(u(),f("div",ha,[a("div",Ca,[e[44]||(e[44]=a("div",null,[a("h2",null,"获客助手分流方案"),a("p",null,"选择几名医助就生成几条成员规则;官方链接只在方案顶部复制,成员行不重复展示链接。")],-1)),l(o,{type:"primary",icon:_(Te),onClick:e[4]||(e[4]=n=>pe())},{default:i(()=>[...e[43]||(e[43]=[p("新建分流方案",-1)])]),_:1},8,["icon"])]),m.pools.length?(u(),f("div",xa,[a("aside",wa,[(u(!0),f(ae,null,ne(m.pools,n=>(u(),f("button",{key:n.id,class:P(["pool-item",{active:Number(n.id)===K.value}]),onClick:q=>K.value=Number(n.id)},[a("span",{class:P(["pool-status",Number(n.status)===1?"online":"offline"])},null,2),a("span",null,[a("strong",null,d(n.name),1),a("small",null,d(tt(n))+" · "+d(n.main_url?"官方链接已生成":"待生成链接"),1)]),l(s,null,{default:i(()=>[l(_(Ct))]),_:1})],10,$a))),128))]),a("div",Aa,[w.value?(u(),f("div",Sa,[a("div",null,[a("div",Va,[a("h3",null,d(w.value.name),1),a("span",{class:P(["status-tag",Number(w.value.status)===1?"is-online":"is-offline"])},d(Number(w.value.status)===1?"运行中":"已停用"),3),a("span",Ia,d(w.value.dept_name||"未分部门")+" · "+d(w.value.owner_name||"系统"),1)]),a("p",null,"公开键:"+d(w.value.public_key),1)]),a("div",Pa,[l(o,{icon:_(Le),loading:le.value,onClick:he},{default:i(()=>[...e[45]||(e[45]=[p("验证 API",-1)])]),_:1},8,["icon","loading"]),l(o,{icon:_(ve),disabled:!w.value.main_url,onClick:e[5]||(e[5]=n=>Se(w.value.main_url,"官方获客链接"))},{default:i(()=>[...e[46]||(e[46]=[p("复制链接",-1)])]),_:1},8,["icon","disabled"]),l(o,{icon:_(ve),onClick:e[6]||(e[6]=n=>Se(w.value.install_code,"JS 安装代码"))},{default:i(()=>[...e[47]||(e[47]=[p("复制 JS",-1)])]),_:1},8,["icon"]),l(o,{icon:_(xt),onClick:e[7]||(e[7]=n=>pe(w.value))},{default:i(()=>[...e[48]||(e[48]=[p("编辑方案",-1)])]),_:1},8,["icon"]),l(o,{type:"danger",plain:"",icon:_(wt),loading:ie.value===Number(w.value.id),disabled:ie.value>0,onClick:e[8]||(e[8]=n=>Ke(w.value))},{default:i(()=>[...e[49]||(e[49]=[p("删除",-1)])]),_:1},8,["icon","loading","disabled"])])])):R("",!0),w.value.migration_state==="needs_resolution"?(u(),E($,{key:1,class:"legacy-sync-alert",type:"warning","show-icon":"",closable:!1,title:"检测到旧版方案存在多个官方链接",description:"当前显示最新链接;保存方案后,其余旧链接只会在本地下线,企业微信端与历史客户归因仍会保留。"})):R("",!0),l($,{class:"legacy-sync-alert",type:"info","show-icon":"",closable:!1,title:"企业微信原生多人路由",description:"当前全部可用医助会同时写入官方链接的成员范围,由企业微信在打开和添加阶段直接进行多人路由。回调只用于统计实际承接结果,并在禁用、过期或达到上限后更新成员范围。"}),l(h,{data:Fe.value,class:"link-table",stripe:""},{empty:i(()=>[l(F,{"image-size":72,description:"编辑方案并选择获客医助"})]),default:i(()=>[l(g,{label:"推广成员","min-width":"210",fixed:"left"},{default:i(({row:n})=>[a("div",Da,[a("strong",null,d(n.name||n.userid),1),a("small",null,d(at(n)),1)])]),_:1}),l(g,{label:"调度",width:"105",align:"center"},{default:i(({row:n})=>[n.is_in_remote_range&&oe(n).className==="is-ok"?(u(),f("span",Ea,"企微路由中")):n.is_in_remote_range?(u(),f("span",Ma,"待移出")):oe(n).className==="is-ok"?(u(),f("span",Ta,"待同步")):(u(),f("span",La,"不参与"))]),_:1}),l(g,{label:"今日 / 上限",width:"125",align:"center"},{default:i(({row:n})=>[p(d(Ce(n))+" / "+d(Number(n.daily_limit)?n.daily_limit:"不限"),1)]),_:1}),l(g,{label:"累计获客",prop:"total_count",width:"105",align:"center"}),l(g,{label:"当前可用性","min-width":"130"},{default:i(({row:n})=>[a("span",{class:P(["availability",oe(n).className])},d(oe(n).label),3)]),_:1}),l(g,{label:"上线",width:"90",align:"center"},{default:i(({row:n})=>[l(A,{"model-value":Number(n.enabled)===1,loading:me.value===Number(n.id),onChange:q=>Ye(n,q)},null,8,["model-value","loading","onChange"])]),_:1}),l(g,{label:"操作","min-width":"100",fixed:"right"},{default:i(({row:n})=>[l(o,{type:"primary",link:"",onClick:q=>Je(n)},{default:i(()=>[...e[50]||(e[50]=[p("编辑规则",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])])])):(u(),E(F,{key:1,description:"创建方案并选择多个医助,保存后自动生成一个企业微信官方获客链接"},{default:i(()=>[l(o,{type:"primary",icon:_(Te),onClick:e[9]||(e[9]=n=>pe())},{default:i(()=>[...e[51]||(e[51]=[p("创建第一个方案",-1)])]),_:1},8,["icon"])]),_:1}))])):V.value==="customer-stats"?(u(),f("div",za,[a("div",Fa,[e[53]||(e[53]=a("div",null,[a("h2",null,"获客客户消息统计"),a("p",null,"统计当前权限范围内由获客助手链接添加的客户,以及客户向承接成员发送消息的情况。")],-1)),a("div",Ua,[y.meta.last_synced_at?(u(),f("span",ja,"最近同步 "+d(y.meta.last_synced_at),1)):R("",!0),l(o,{type:"primary",icon:_(De),loading:ce.value,onClick:Qe},{default:i(()=>[...e[52]||(e[52]=[p("同步客户",-1)])]),_:1},8,["icon","loading"])])]),a("section",Ba,[a("article",Oa,[a("span",qa,[l(s,null,{default:i(()=>[l(_(Pt))]),_:1})]),a("div",null,[e[54]||(e[54]=a("small",null,"获客客户数",-1)),a("strong",null,d(z(y.summary.customer_count)),1),e[55]||(e[55]=a("p",null,"当前筛选范围内的去重客户",-1))])]),a("article",Ka,[a("span",Ja,[l(s,null,{default:i(()=>[l(_(Dt))]),_:1})]),a("div",null,[e[56]||(e[56]=a("small",null,"已发消息客户数",-1)),a("strong",null,d(z(y.summary.messaged_customer_count)),1),e[57]||(e[57]=a("p",null,"至少发送过一条消息",-1))])]),a("article",Ra,[a("span",Ya,[l(s,null,{default:i(()=>[l(_(Me))]),_:1})]),a("div",null,[e[58]||(e[58]=a("small",null,"消息客户率",-1)),a("strong",null,d(rt(y.summary.message_customer_rate)),1),e[59]||(e[59]=a("p",null,"已发消息客户占获客客户比例",-1))])]),a("article",Wa,[a("span",Ha,[l(s,null,{default:i(()=>[l(_(Ee))]),_:1})]),a("div",null,[e[60]||(e[60]=a("small",null,"累计接收消息数",-1)),a("strong",null,d(z(y.summary.received_message_count)),1),a("p",null,"已精确统计 "+d(z(y.summary.message_count_known_count))+" 位客户",1)])])]),m.config.callback_ready?R("",!0):(u(),E($,{key:0,class:"chatkey-alert",type:"warning","show-icon":"",closable:!1,title:"消息次数回调尚未配置完成",description:"复用企业微信自建应用现有的“API 接收消息”地址即可,无需新增第二个回调;请确保该地址为 /api/qywx/external-contact/notify,且服务器 Token、AESKey 与企微后台一致。未完成前无法自动累计成员获客数量,也无法在成员达到上限后自动更新官方范围。"})),l($,{class:"chatkey-alert",type:"info","show-icon":"",closable:!1,title:"获客助手通过事件与 ChatKey 返回收消息次数",description:"本功能复用现有回调并按事件类型处理 customer_acquisition,不会占用第二个回调。客户首次发消息会推送 customer_start_chat;累计第 3、5、10 次时推送 message_from_customer,服务端需在 30 分钟内用 ChatKey 查询成员、客户、获客链接和累计收消息次数。"}),a("div",Ga,[l(U,{model:x,inline:"","label-position":"top"},{default:i(()=>[l(k,{label:"来源链接"},{default:i(()=>[l(T,{modelValue:x.link_id,"onUpdate:modelValue":e[10]||(e[10]=n=>x.link_id=n),clearable:"",filterable:"",placeholder:"全部链接"},{default:i(()=>[(u(!0),f(ae,null,ne(Be.value,n=>(u(),E(D,{key:String(n.id),label:n.name,value:n.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),l(k,{label:"承接成员"},{default:i(()=>[l(T,{modelValue:x.userid,"onUpdate:modelValue":e[11]||(e[11]=n=>x.userid=n),clearable:"",filterable:"",placeholder:"全部成员"},{default:i(()=>[(u(!0),f(ae,null,ne(Oe.value,n=>(u(),E(D,{key:n.userid||String(n.id),label:nt(n),value:n.userid||String(n.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),l(k,{label:"聊天状态"},{default:i(()=>[l(T,{modelValue:x.chat_status,"onUpdate:modelValue":e[12]||(e[12]=n=>x.chat_status=n),clearable:"",placeholder:"全部状态"},{default:i(()=>[l(D,{label:"已发过消息",value:"messaged"}),l(D,{label:"未发过消息",value:"silent"}),l(D,{label:"状态未知",value:"unknown"})]),_:1},8,["modelValue"])]),_:1}),l(k,{class:"filter-actions"},{default:i(()=>[l(o,{type:"primary",icon:_(Lt),loading:X.value,onClick:He},{default:i(()=>[...e[61]||(e[61]=[p("查询",-1)])]),_:1},8,["icon","loading"]),l(o,{onClick:Ge},{default:i(()=>[...e[62]||(e[62]=[p("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),Pe((u(),E(h,{data:y.rows,class:"customer-table",stripe:""},{empty:i(()=>[l(F,{"image-size":72,description:"当前筛选范围暂无获客客户数据"})]),default:i(()=>[l(g,{label:"客户标识(已脱敏)","min-width":"190",fixed:"left"},{default:i(({row:n})=>[a("span",{class:"customer-identifier",title:xe(n)},d(xe(n)),9,Za)]),_:1}),l(g,{label:"来源链接","min-width":"190"},{default:i(({row:n})=>[a("div",Qa,[a("strong",null,d(lt(n)),1),a("small",null,d(it(n)),1)])]),_:1}),l(g,{label:"承接成员 / 部门","min-width":"175"},{default:i(({row:n})=>[a("div",Xa,[a("strong",null,d(n.member_name||n.owner_name||"未匹配成员"),1),a("small",null,d(n.department_name||n.dept_name||"未分部门")+" · "+d(n.userid||"未绑定企微账号"),1)])]),_:1}),l(g,{label:"客户开口",width:"110",align:"center"},{default:i(({row:n})=>[a("span",{class:P(["message-state",`is-${ge(n)}`])},d(ot(n)),3)]),_:1}),l(g,{label:"累计消息",width:"100",align:"right"},{default:i(({row:n})=>[a("strong",{class:P(["message-count",{muted:!we(n)}])},d(dt(n)),3)]),_:1}),l(g,{label:"最近同步时间","min-width":"165"},{default:i(({row:n})=>[p(d(be(n.last_synced_at||n.last_sync_time||n.synced_at||n.sync_time)),1)]),_:1}),l(g,{label:"最近收消息事件","min-width":"165"},{default:i(({row:n})=>[a("span",{class:P({muted:!$e(n)})},d(be($e(n))),3)]),_:1})]),_:1},8,["data"])),[[ue,X.value]]),a("div",en,[a("span",null,"共 "+d(z(I.total))+" 位客户",1),l(r,{"current-page":I.page_no,"onUpdate:currentPage":e[13]||(e[13]=n=>I.page_no=n),"page-size":I.page_size,"onUpdate:pageSize":e[14]||(e[14]=n=>I.page_size=n),background:"",layout:"sizes, prev, pager, next","page-sizes":[10,20,50,100],total:I.total,onCurrentChange:J,onSizeChange:Ze},null,8,["current-page","page-size","total"])])])):V.value==="configuration"?(u(),f("div",tn,[e[71]||(e[71]=a("div",{class:"section-heading"},[a("div",null,[a("h2",null,"企业微信内部应用配置"),a("p",null,"直接读取服务器现有的 work_wechat 配置,密钥不会返回浏览器,也不需要第三方应用授权。")])],-1)),a("div",{class:P(["configuration-panel",m.config.ready?"is-ready":"is-pending"])},[a("div",an,[a("span",null,[l(s,null,{default:i(()=>[(u(),E(Ut(m.config.ready?_(Le):_(jt))))]),_:1})]),a("div",null,[a("strong",null,d(m.config.ready?"内部应用已就绪":"内部应用配置不完整"),1),m.config.ready?(u(),f("p",nn,"已识别 CorpID 与应用 Secret;点击“验证 API”可同时检查可信 IP、获客助手开通状态和应用权限。")):(u(),f("p",sn,"请补齐服务器 .env 的 [work_wechat] 配置;页面不会展示 Secret 内容。"))])]),(ee=m.config.missing)!=null&&ee.length?(u(),f("div",ln,[e[63]||(e[63]=p(" 缺少:",-1)),(u(!0),f(ae,null,ne(m.config.missing,n=>(u(),f("code",{key:n},d(n),1))),128))])):R("",!0),a("dl",on,[a("div",null,[e[64]||(e[64]=a("dt",null,"企业 CorpID",-1)),a("dd",null,d(m.config.corp_id_masked||"未配置"),1),a("span",null,d(m.config.corp_id_masked?"已识别":"缺失"),1)]),a("div",null,[e[65]||(e[65]=a("dt",null,"应用 AgentID",-1)),a("dd",null,d(m.config.agent_id||"未配置"),1),a("span",null,d(m.config.agent_id?"已识别":"缺失"),1)]),a("div",null,[e[66]||(e[66]=a("dt",null,"应用 Secret",-1)),e[67]||(e[67]=a("dd",null,"仅保存在服务器环境变量中",-1)),a("span",null,d(m.config.secret_configured?"已配置":"缺失"),1)]),a("div",null,[e[68]||(e[68]=a("dt",null,"消息回调地址",-1)),a("dd",null,d(m.config.callback_url||"未生成"),1),a("span",null,d(m.config.callback_ready?"已配置密钥":"待配置 Token/AESKey"),1)])]),a("div",dn,[l(o,{type:"primary",loading:le.value,onClick:he},{default:i(()=>[...e[69]||(e[69]=[p("验证获客助手 API",-1)])]),_:1},8,["loading"]),m.config.official_doc?(u(),E(c,{key:0,href:m.config.official_doc,target:"_blank",type:"primary"},{default:i(()=>[...e[70]||(e[70]=[p("查看企业微信官方文档",-1)])]),_:1},8,["href"])):R("",!0)])],2)])):(u(),f("div",rn,[a("div",un,[e[72]||(e[72]=a("div",null,[a("h2",null,"安装 JS 与浮窗客服"),a("p",null,"为每个分流方案配置独立浮窗;基础脚本仍只负责展示入口、捕获点击并请求服务端分流。")],-1)),l(T,{modelValue:W.value,"onUpdate:modelValue":e[15]||(e[15]=n=>W.value=n),placeholder:"选择分流方案",class:"install-pool-select"},{default:i(()=>[(u(!0),f(ae,null,ne(m.pools,n=>(u(),E(D,{key:n.id,label:n.name,value:Number(n.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_e.value?(u(),E(aa,{key:Number(_e.value.id),pool:_e.value,onSaved:ut},null,8,["pool"])):(u(),E(F,{key:1,description:"请先创建分流方案,系统会自动生成 JS 安装代码"}))]))]),l(B,{modelValue:Z.value,"onUpdate:modelValue":e[22]||(e[22]=n=>Z.value=n),title:N.id?"编辑分流方案":"新建分流方案",width:"680px","destroy-on-close":"","close-on-click-modal":!1,"close-on-press-escape":!M.value},{footer:i(()=>[l(o,{disabled:M.value,onClick:e[21]||(e[21]=n=>Z.value=!1)},{default:i(()=>[...e[74]||(e[74]=[p("取消",-1)])]),_:1},8,["disabled"]),l(o,{type:"primary",loading:M.value,onClick:qe},{default:i(()=>[p(d(N.id?"保存方案":"保存并生成链接"),1)]),_:1},8,["loading"])]),default:i(()=>[l(U,{"label-position":"top"},{default:i(()=>[l(k,{label:"方案名称",required:""},{default:i(()=>[l(v,{modelValue:N.name,"onUpdate:modelValue":e[16]||(e[16]=n=>N.name=n),disabled:M.value,maxlength:"60","show-word-limit":"",placeholder:"例如:官网咨询分流"},null,8,["modelValue","disabled"])]),_:1}),l(k,{label:"获客医助",required:""},{default:i(()=>[l(j,{modelValue:N.member_admin_ids,"onUpdate:modelValue":e[17]||(e[17]=n=>N.member_admin_ids=n),data:Ne.value,props:Ue,"default-expanded-keys":je.value,"filter-node-method":et,disabled:M.value,"node-key":"value",multiple:"",filterable:"",clearable:"","show-checkbox":"","collapse-tags":"","collapse-tags-tooltip":"","max-collapse-tags":2,"multiple-limit":500,"render-after-expand":!1,placeholder:"按部门展开,或搜索姓名 / 部门 / 企微 userid",style:{width:"100%"}},{default:i(({data:n})=>[a("span",{class:P(["member-tree-option",`is-${n.kind}`])},[a("span",mn,d(n.label),1),n.kind==="department"?(u(),f("span",cn,d(n.member_count)+" 人",1)):(u(),f("span",_n,d(n.detail),1))],2)]),_:1},8,["modelValue","data","default-expanded-keys","disabled"]),a("span",pn,"已选 "+d(N.member_admin_ids.length)+" 名;保存后会为每名医助生成一条成员规则,官方链接地址始终只有一个。",1)]),_:1}),l(k,{label:"添加客户时跳过验证"},{default:i(()=>[l(A,{modelValue:N.skip_verify,"onUpdate:modelValue":e[18]||(e[18]=n=>N.skip_verify=n),disabled:M.value,"active-value":1,"inactive-value":0,"active-text":"跳过验证","inactive-text":"需要验证"},null,8,["modelValue","disabled"])]),_:1}),l(k,{label:"兜底获客助手链接"},{default:i(()=>[l(v,{modelValue:N.fallback_url,"onUpdate:modelValue":e[19]||(e[19]=n=>N.fallback_url=n),disabled:M.value,placeholder:"可选;仅供旧版兼容跳转使用"},null,8,["modelValue","disabled"]),e[73]||(e[73]=a("span",{class:"form-tip"},"新生成的官方直链不经过本站跳转;此项仅兼容旧安装代码。",-1))]),_:1}),l(k,{label:"运行状态"},{default:i(()=>[l(A,{modelValue:N.status,"onUpdate:modelValue":e[20]||(e[20]=n=>N.status=n),disabled:M.value,"active-value":1,"inactive-value":0,"active-text":"运行","inactive-text":"停用"},null,8,["modelValue","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue","title","close-on-press-escape"]),l(B,{modelValue:Q.value,"onUpdate:modelValue":e[28]||(e[28]=n=>Q.value=n),title:"编辑医助分流规则",width:"560px","destroy-on-close":"","close-on-click-modal":!1},{footer:i(()=>[l(o,{disabled:O.value,onClick:e[27]||(e[27]=n=>Q.value=!1)},{default:i(()=>[...e[76]||(e[76]=[p("取消",-1)])]),_:1},8,["disabled"]),l(o,{type:"primary",loading:O.value,onClick:Re},{default:i(()=>[...e[77]||(e[77]=[p("保存规则",-1)])]),_:1},8,["loading"])]),default:i(()=>[l(U,{"label-position":"top"},{default:i(()=>[l(k,{label:"获客医助"},{default:i(()=>[l(v,{"model-value":C.name?`${C.name} · ${C.userid}`:C.userid,readonly:""},null,8,["model-value"])]),_:1}),l(k,{label:"每日获客上限"},{default:i(()=>[l(de,{modelValue:C.daily_limit,"onUpdate:modelValue":e[23]||(e[23]=n=>C.daily_limit=n),min:0,max:1e6,disabled:O.value,style:{width:"100%"}},null,8,["modelValue","disabled"]),e[75]||(e[75]=a("span",{class:"form-tip"},"0 表示不限;数量按实际获客回调累计,达到上限后会从企微官方成员范围移除。",-1))]),_:1}),l(k,{label:"有效时间"},{default:i(()=>[l(re,{modelValue:C.active_range,"onUpdate:modelValue":e[24]||(e[24]=n=>C.active_range=n),type:"datetimerange","range-separator":"至","start-placeholder":"开始时间","end-placeholder":"结束时间","value-format":"YYYY-MM-DD HH:mm:ss",disabled:O.value,style:{width:"100%"}},null,8,["modelValue","disabled"])]),_:1}),l(k,{label:"上线状态"},{default:i(()=>[l(A,{modelValue:C.status,"onUpdate:modelValue":e[25]||(e[25]=n=>C.status=n),"active-value":1,"inactive-value":0,"active-text":"启用","inactive-text":"禁用",disabled:O.value},null,8,["modelValue","disabled"])]),_:1}),l(k,{label:"备注"},{default:i(()=>[l(v,{modelValue:C.remark,"onUpdate:modelValue":e[26]||(e[26]=n=>C.remark=n),type:"textarea",rows:2,maxlength:"255","show-word-limit":"",disabled:O.value},null,8,["modelValue","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"])])),[[ue,se.value]])}}}),hn=na(gn,[["__scopeId","data-v-d7b8c3f0"]]);export{hn as default};
|