Files
2026-08-10 17:46:04 +08:00

4 lines
38 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 Oe,R as De,E as _,ap as pt,ac as Le,bi as ft,q as d,r as v,s as n,v as s,D as i,u as p,cV as gt,w as vt,cO as bt,L as c,T as u,P as A,by as _e,K as yt,cN as kt,d0 as Nt,bI as Ct,d1 as wt,ae as P,d2 as Ee,d3 as Ue,d4 as Vt,c$ as Te,cv as pe,F as R,G as J,cD as $t,at as ze,bu as xt,d5 as St,O as y,bh as ht,bk as Pt,I as It,$ as At,ck as Dt,Z as Lt,_ as Et,bB as Ut,bj as Tt,cl as zt,as as Ot,b6 as Ft,bm as Mt,bn as qt,bA as jt,b9 as Bt,bs as Rt,a4 as Jt,d6 as Kt,bq as Yt,b7 as Ht,bt as Wt,J as Zt,bp as Gt,ba as K,M as V,p as F,e as te}from"./.pnpm-CC7b2w5D.js";import{y as Qt,z as Xt,A as en,B as tn,C as nn,D as an,E as ln,F as sn,G as on,H as un,I as dn,J as rn}from"./first_visit-DhxrOORk.js";import mn from"./WecomFloatingWidgetBuilder-DX4pdSWX.js";import{_ as cn}from"./index-Ur49qshF.js";const _n={class:"promotion-page","element-loading-text":"正在加载推广配置"},pn={class:"page-header"},fn={class:"heading-copy"},gn={class:"heading-icon"},vn={class:"heading-actions"},bn={class:"scope-chip"},yn={key:0,class:"update-time"},kn={class:"metric-grid"},Nn={class:"metric-card"},Cn={class:"metric-icon is-teal"},wn={class:"metric-card"},Vn={class:"metric-icon is-blue"},$n={class:"metric-card"},xn={class:"metric-icon is-green"},Sn={class:"metric-card"},hn={class:"metric-icon is-orange"},Pn={class:"workspace-card"},In={class:"tab-nav","aria-label":"企业微信获客助手功能"},An={key:0,class:"tab-content links-tab"},Dn={class:"section-heading"},Ln={key:0,class:"pool-layout"},En={class:"pool-sidebar"},Un=["onClick"],Tn={class:"pool-main"},zn={key:0,class:"pool-toolbar"},On={class:"pool-title-row"},Fn={class:"owner-tag"},Mn={class:"toolbar-actions"},qn={class:"member-cell"},jn=["title"],Bn={key:1,class:"legacy-tag"},Rn={key:1,class:"tab-content customer-stats-tab"},Jn={class:"section-heading customer-stats-heading"},Kn={class:"customer-heading-actions"},Yn={key:0,class:"update-time"},Hn={class:"customer-metric-grid","aria-label":"获客客户消息汇总"},Wn={class:"customer-metric-card"},Zn={class:"metric-icon is-teal"},Gn={class:"customer-metric-card"},Qn={class:"metric-icon is-blue"},Xn={class:"customer-metric-card"},ea={class:"metric-icon is-green"},ta={class:"customer-metric-card"},na={class:"metric-icon is-orange"},aa={class:"customer-filter-bar"},la=["title"],sa={class:"member-cell"},ia={class:"member-cell"},oa={class:"customer-pagination"},ua={key:2,class:"tab-content authorization-tab"},da={class:"configuration-state"},ra={key:0},ma={key:1},ca={key:0,class:"missing-fields"},_a={class:"callback-list"},pa={class:"configuration-actions"},fa={key:3,class:"tab-content install-tab"},ga={class:"section-heading"},va={class:"form-grid"},ba={class:"form-grid"},ya=Oe({name:"firstVisitWecomPromotionPage"}),ka=Oe({...ya,setup(Na){const fe=()=>({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:[],customer_acquisition_link_example:"https://work.weixin.qq.com/ca/xxxxxxxx"}),r=K(fe()),Z=V(!1),$=V("links"),U=V(),M=V(),Y=V(!1),H=V(!1),ne=V(!1),ae=V(!1),G=V(!1),le=V(!1),se=V(0),D=K({id:0,name:"",fallback_url:"",status:1}),m=K({id:0,pool_id:0,name:"",group_name:"默认分组",wecom_url:"",member_admin_ids:[],skip_verify:0,legacy:!1,weight:1,status:1,daily_limit:0,active_range:[],remark:""}),W=V(!1),ge=V(!1),ie=V(!1),N=K({link_id:"",userid:"",chat_status:""}),x=K({page_no:1,page_size:20,total:0}),b=K({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:""}}),C=F(()=>r.pools.find(t=>Number(t.id)===U.value)),oe=F(()=>r.links.filter(t=>Number(t.pool_id)===U.value)),ve=F(()=>oe.value.filter(t=>!!t.remote_link_id).length),be=F(()=>oe.value.length-ve.value),ue=F(()=>r.pools.find(t=>Number(t.id)===M.value)),Fe=F(()=>b.link_options.length?b.link_options:r.links.filter(t=>t.id).map(t=>({id:Number(t.id),name:t.name||t.remote_link_id||`链接 ${t.id}`}))),Me=F(()=>b.member_options.length?b.member_options:r.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||""})));De(()=>r.pools.map(t=>Number(t.id)).join(","),()=>{const t=r.pools.map(e=>Number(e.id));(!U.value||!t.includes(U.value))&&(U.value=t[0]),(!M.value||!t.includes(M.value))&&(M.value=t[0])},{immediate:!0}),De($,t=>{t==="customer-stats"&&!ge.value&&T()});async function S(){Z.value=!0;try{const t=await Xt();Object.assign(r,fe(),t||{})}catch(t){_.error((t==null?void 0:t.message)||"企业微信推广配置加载失败")}finally{Z.value=!1}}function qe(t){return r.links.filter(e=>Number(e.pool_id)===Number(t)).length}function de(t){Object.assign(D,t?{id:Number(t.id),name:t.name,fallback_url:t.fallback_url||"",status:Number(t.status)}:{id:0,name:"",fallback_url:"",status:1}),Y.value=!0}async function je(){if(!D.name.trim())return _.warning("请输入分流方案名称");ne.value=!0;try{const t=await en({...D});Y.value=!1,await S(),t!=null&&t.id&&(U.value=Number(t.id)),_.success("分流方案已保存")}catch(t){_.error((t==null?void 0:t.message)||"分流方案保存失败")}finally{ne.value=!1}}async function Be(t){await te.confirm(`删除“${t.name}”后,该方案下的获客助手链接也会停用。确认继续?`,"删除分流方案",{type:"warning"});try{await tn({id:Number(t.id)}),_.success("分流方案已删除"),await S()}catch(e){_.error((e==null?void 0:e.message)||"删除失败")}}function ye(t){if(!C.value)return;const e=t&&Number(t.active_start)>0&&Number(t.active_end)>0?[Se(t.active_start),Se(t.active_end)]:[],l=new Set(((t==null?void 0:t.range_userids)||[]).map(k=>String(k))),o=r.member_options.filter(k=>l.has(String(k.userid))).map(k=>Number(k.id));Object.assign(m,t?{id:Number(t.id),pool_id:Number(t.pool_id),name:t.name,group_name:t.group_name||"默认分组",wecom_url:t.wecom_url,member_admin_ids:o,skip_verify:Number(t.skip_verify)===1?1:0,legacy:!t.is_official,weight:Number(t.weight)||1,status:Number(t.status),daily_limit:Number(t.daily_limit)||0,active_range:e,remark:t.remark||""}:{id:0,pool_id:Number(C.value.id),name:"",group_name:"默认分组",wecom_url:"",member_admin_ids:[],skip_verify:0,legacy:!1,weight:1,status:1,daily_limit:0,active_range:[],remark:""}),H.value=!0}async function Re(){var t,e;if(!m.name.trim())return _.warning("请输入获客链接名称");if(m.legacy&&!m.wecom_url.trim())return _.warning("请填写企业微信获客助手链接");if(!m.legacy&&!m.member_admin_ids.length)return _.warning("请至少选择一名获客成员");ae.value=!0;try{await nn({...m,active_start:((t=m.active_range)==null?void 0:t[0])||"",active_end:((e=m.active_range)==null?void 0:e[1])||""}),H.value=!1,await S(),_.success(m.legacy?"本地分流规则已保存":"企业微信官方获客链接已保存")}catch(l){_.error((l==null?void 0:l.message)||"获客助手链接保存失败")}finally{ae.value=!1}}async function ke(){G.value=!0;try{const t=await an();t!=null&&t.has_link?_.success((t==null?void 0:t.message)||"API 验证通过:应用凭证、可信 IP 与获客助手权限均可用"):_.warning((t==null?void 0:t.message)||"API 权限可用,但当前应用还没有创建官方获客链接")}catch(t){_.error((t==null?void 0:t.message)||"获客助手 API 验证失败")}finally{G.value=!1}}async function Je(){await S(),$.value==="customer-stats"&&await T()}function q(t,e){for(const l of e)if((t==null?void 0:t[l])!==void 0&&(t==null?void 0:t[l])!==null&&(t==null?void 0:t[l])!==""){const o=Number(t[l]);return Number.isFinite(o)?o:0}return 0}async function T(){var t,e;W.value=!0;try{const l=await Qt({page_no:x.page_no,page_size:x.page_size,promotion_link_id:N.link_id?Number(N.link_id):void 0,userid:N.userid||void 0,chat_status:N.chat_status===""?void 0:N.chat_status==="messaged"?1:N.chat_status==="unknown"?2:0}),o=(l==null?void 0:l.summary)||(l==null?void 0:l.stats)||{},k=q(o,["customer_count","total_customers","customer_total","total"]),f=q(o,["messaged_customer_count","started_chat_count","chat_customer_count","message_customer_count","chatting_customers"]),I=["message_customer_rate","chat_customer_rate","messaged_rate","chat_rate"],Q=I.some(h=>(o==null?void 0:o[h])!==void 0&&(o==null?void 0:o[h])!==null&&(o==null?void 0:o[h])!=="");Object.assign(b.summary,{customer_count:k,messaged_customer_count:f,message_customer_rate:Q?q(o,I):k?f/k*100:0,received_message_count:q(o,["received_message_count","recv_msg_cnt","recv_msg_count","total_recv_msg_cnt","message_count"]),message_count_known_count:q(o,["message_count_known_count","exact_message_customer_count"])}),b.rows=Array.isArray(l==null?void 0:l.lists)?l.lists:Array.isArray(l==null?void 0:l.list)?l.list:Array.isArray(l==null?void 0:l.rows)?l.rows:[],x.total=Number((l==null?void 0:l.total)??(l==null?void 0:l.count)??((t=l==null?void 0:l.page)==null?void 0:t.total)??b.rows.length)||0;const w=(l==null?void 0:l.filters)||{},X=(l==null?void 0:l.link_options)||(w==null?void 0:w.link_options)||(w==null?void 0:w.links),z=(l==null?void 0:l.member_options)||(w==null?void 0:w.member_options)||(w==null?void 0:w.members);Array.isArray(X)&&(b.link_options=X),Array.isArray(z)&&(b.member_options=z);const ee=b.rows.reduce((h,g)=>{const j=g.last_synced_at||g.last_sync_time||g.synced_at||g.sync_time||"";return Number(j||0)>Number(h||0)?j:h},""),E=((e=l==null?void 0:l.meta)==null?void 0:e.last_synced_at)||(l==null?void 0:l.last_synced_at)||ee||b.meta.last_synced_at||"";Object.assign(b.meta,(l==null?void 0:l.meta)||{},{last_synced_at:E?ce(E):""}),ge.value=!0}catch(l){_.error((l==null?void 0:l.message)||"获客客户统计加载失败")}finally{W.value=!1}}function Ke(){x.page_no=1,T()}function Ye(){Object.assign(N,{link_id:"",userid:"",chat_status:""}),x.page_no=1,T()}function He(){x.page_no=1,T()}async function We(){var t,e,l;ie.value=!0;try{const o=await ln({promotion_link_id:N.link_id?Number(N.link_id):void 0}),k=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),f=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),I=Number((o==null?void 0:o.updated)??(o==null?void 0:o.customer_updated)??((l=o==null?void 0:o.customers)==null?void 0:l.updated)??0);_.success((o==null?void 0:o.message)||`客户同步完成:扫描 ${L(k)} 位,新增 ${L(f)} 位,更新 ${L(I)} 位`),x.page_no=1,await Promise.all([S(),T()])}catch(o){_.error((o==null?void 0:o.message)||"获客客户同步失败")}finally{ie.value=!1}}async function Ze(){if(!C.value)return _.warning("请先选择分流方案");le.value=!0;try{const t=await sn({pool_id:Number(C.value.id)}),e=`扫描 ${Number((t==null?void 0:t.scanned)||0)} 条,新建 ${Number((t==null?void 0:t.created)||0)} 条,更新 ${Number((t==null?void 0:t.updated)||0)} 条,按权限跳过 ${Number((t==null?void 0:t.skipped)||0)} 条,失败 ${Number((t==null?void 0:t.failed)||0)} 条`;Number((t==null?void 0:t.scanned)||0)===0?await te.alert(`${(t==null?void 0:t.empty_reason)||"当前应用没有可同步的官方获客链接"}
${(t==null?void 0:t.suggestion)||""}`,"没有可同步的官方链接",{type:"warning",confirmButtonText:"知道了"}):t!=null&&t.failed?_.warning(e):_.success(e),await S()}catch(t){_.error((t==null?void 0:t.message)||"同步企业微信获客链接失败")}finally{le.value=!1}}async function Ge(t){se.value=Number(t.id);try{await on({id:Number(t.id)}),_.success("企业微信官方详情已刷新"),await S()}catch(e){_.error((e==null?void 0:e.message)||"刷新官方详情失败")}finally{se.value=0}}async function Qe(t,e){if(t==="local"){await Ne(e);return}if(t==="remote"){await te.confirm(`将永久删除企业微信后台中的“${e.name}”,现有推广页面会立即失效,且无法恢复。确认继续?`,"永久删除企业微信获客链接",{type:"error",confirmButtonText:"永久删除",cancelButtonText:"取消"});try{await un({id:Number(e.id)}),_.success("企业微信获客链接已永久删除,本地记录已保留并停止分流"),await S()}catch(l){_.error((l==null?void 0:l.message)||"永久删除失败")}}}async function Xe(t,e){try{await dn({id:Number(t.id),status:e?1:0}),t.status=e?1:0,_.success(e?"链接已上线":"链接已下线"),await S()}catch(l){_.error((l==null?void 0:l.message)||"状态更新失败"),await S()}}async function Ne(t){await te.confirm(`仅从本地分流池移除“${t.name}”,不会删除企业微信后台的官方链接。确认继续?`,"从本地移除",{type:"warning"});try{await rn({id:Number(t.id)}),_.success("已从本地分流池移除"),await S()}catch(e){_.error((e==null?void 0:e.message)||"删除失败")}}function Ce(t){const e=Math.floor(Date.now()/1e3);return Number(t.remote_status)===2?{label:"企业微信已删除",className:"is-error"}:t.valid_customer_acquisition_link===!1?{label:"非获客助手链接",className:"is-error"}:Number(t.status)!==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&&we(t)>=Number(t.daily_limit)?{label:"今日已达上限",className:"is-waiting"}:{label:"可参与分流",className:"is-ok"}}function we(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 et(t){const e=Array.isArray(t.dept_names)&&t.dept_names.length?t.dept_names.join(" / "):"未分部门";return`${t.name} · ${e} · ${t.userid}`}function tt(t){const l=(Array.isArray(t.range_userids)?t.range_userids:[]).map(k=>{const f=r.member_options.find(I=>String(I.userid)===String(k));return(f==null?void 0:f.name)||String(k)});if(l.length)return l.length>2?`${l.slice(0,2).join("、")}${l.length} 人`:l.join("、");const o=Array.isArray(t.range_department_ids)?t.range_department_ids:[];return o.length?`企微部门 ${o.join("、")}`:t.is_official?"未返回成员范围":"手工配置"}function nt(t){const e=t.department_name||t.dept_name||"";return e?`${t.name} · ${e}`:t.name}function Ve(t){const e=t.external_userid_masked||t.customer_id_masked||t.customer_masked||t.customer_name_masked;return e?String(e):at(t.external_userid||t.customer_id||t.id)}function at(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 st(t){const e=t.link_id||t.remote_link_id||t.source_link_id;return e?`链接 ID${e}`:"暂无链接 ID"}function re(t){return q(t,["received_message_count","recv_msg_cnt","message_count","received_count"])}function $e(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":re(t)>0}function me(t){const e=Number(t.chat_status);if(e===2)return"unknown";const l=t.has_messaged??t.has_message??t.messaged;return l!=null?l===!0||l===1||l==="1"||l==="true"||l==="messaged"?"messaged":"silent":e===1||re(t)>0?"messaged":"silent"}function it(t){const e=me(t);return e==="messaged"?"已发消息":e==="unknown"?"状态未知":"未发消息"}function ot(t){if($e(t))return L(re(t));const e=me(t);return e==="silent"?"0":e==="unknown"?"未知":"待回调"}function xe(t){return t.last_message_at||t.last_chat_time||t.last_message_time||t.last_msg_time||t.event_time||""}function ce(t){if(t==null||t===""||t===0||t==="0")return"-";if(typeof t=="number"||/^\d+$/.test(String(t))){const e=Number(t),l=new Date(e>1e11?e:e*1e3);return Number.isNaN(l.getTime())?"-":l.toLocaleString("zh-CN",{hour12:!1}).replaceAll("/","-")}return String(t).replace("T"," ").replace(/Z$/,"").slice(0,19)}function ut(t){return`${Number(t||0).toFixed(1)}%`}function L(t){return Number(t||0).toLocaleString("zh-CN")}function Se(t){const e=new Date(Number(t||0)*1e3),l=o=>String(o).padStart(2,"0");return`${e.getFullYear()}-${l(e.getMonth()+1)}-${l(e.getDate())} ${l(e.getHours())}:${l(e.getMinutes())}:${l(e.getSeconds())}`}async function dt(t,e){if(!t)return _.warning(`${e}暂无内容`);try{await navigator.clipboard.writeText(t)}catch{const l=document.createElement("textarea");l.value=t,l.style.position="fixed",l.style.opacity="0",document.body.appendChild(l),l.select(),document.execCommand("copy"),l.remove()}_.success(`${e}已复制`)}async function rt(){await S()}return pt(async()=>{await S()}),(t,e)=>{var Ae;const l=vt,o=yt,k=ht,f=Pt,I=It,Q=Et,w=Lt,X=At,z=Ut,ee=Tt,E=qt,h=Mt,g=Ft,j=Bt,mt=Rt,ct=Yt,B=Ht,he=Wt,Pe=Zt,_t=Gt,Ie=ft;return Le((d(),v("div",_n,[n("header",pn,[n("div",fn,[n("span",gn,[s(l,null,{default:i(()=>[s(p(gt))]),_:1})]),e[33]||(e[33]=n("div",null,[n("h1",null,"企业微信获客助手"),n("p",null,"对接企业微信获客助手官方 API,按角色与部门管理获客成员,并将链接安全分流到推广页面")],-1))]),n("div",vn,[n("span",bn,[s(l,null,{default:i(()=>[s(p(bt))]),_:1}),c(u(r.meta.scope_label||"当前数据范围"),1)]),r.meta.generated_at?(d(),v("span",yn,"更新于 "+u(r.meta.generated_at),1)):A("",!0),s(o,{icon:p(_e),loading:Z.value||W.value,onClick:Je},{default:i(()=>[...e[34]||(e[34]=[c("刷新",-1)])]),_:1},8,["icon","loading"])])]),n("section",kn,[n("article",Nn,[n("span",Cn,[s(l,null,{default:i(()=>[s(p(kt))]),_:1})]),n("div",null,[e[35]||(e[35]=n("small",null,"内部应用",-1)),n("strong",null,u(r.summary.configured_apps),1),e[36]||(e[36]=n("p",null,"直接读取服务器环境配置",-1))])]),n("article",wn,[n("span",Vn,[s(l,null,{default:i(()=>[s(p(Nt))]),_:1})]),n("div",null,[e[37]||(e[37]=n("small",null,"分流方案",-1)),n("strong",null,u(r.summary.pool_count),1),e[38]||(e[38]=n("p",null,"每个方案生成独立 JS",-1))])]),n("article",$n,[n("span",xn,[s(l,null,{default:i(()=>[s(p(Ct))]),_:1})]),n("div",null,[e[39]||(e[39]=n("small",null,"在线链接",-1)),n("strong",null,u(r.summary.online_links),1),e[40]||(e[40]=n("p",null,"停用或超限自动排除",-1))])]),n("article",Sn,[n("span",hn,[s(l,null,{default:i(()=>[s(p(wt))]),_:1})]),n("div",null,[e[41]||(e[41]=n("small",null,"今日分流点击",-1)),n("strong",null,u(r.summary.today_clicks),1),e[42]||(e[42]=n("p",null,"只记录脱敏访问数据",-1))])])]),n("section",Pn,[n("nav",In,[n("button",{class:P({active:$.value==="links"}),onClick:e[0]||(e[0]=a=>$.value="links")},[s(l,null,{default:i(()=>[s(p(Ee))]),_:1}),e[43]||(e[43]=c("获客助手链接 ",-1))],2),n("button",{class:P({active:$.value==="customer-stats"}),onClick:e[1]||(e[1]=a=>$.value="customer-stats")},[s(l,null,{default:i(()=>[s(p(Ue))]),_:1}),e[44]||(e[44]=c("获客客户统计 ",-1))],2),n("button",{class:P({active:$.value==="configuration"}),onClick:e[2]||(e[2]=a=>$.value="configuration")},[s(l,null,{default:i(()=>[s(p(Vt))]),_:1}),e[45]||(e[45]=c("应用配置 ",-1))],2),n("button",{class:P({active:$.value==="install"}),onClick:e[3]||(e[3]=a=>$.value="install")},[s(l,null,{default:i(()=>[s(p(Te))]),_:1}),e[46]||(e[46]=c("JS 安装 ",-1))],2)]),$.value==="links"?(d(),v("div",An,[n("div",Dn,[e[48]||(e[48]=n("div",null,[n("h2",null,"获客助手链接分流"),n("p",null,"访客点击时由服务端从当前可用的获客助手链接中按权重随机选择,页面端不会暴露完整链接池。")],-1)),s(o,{type:"primary",icon:p(pe),onClick:e[4]||(e[4]=a=>de())},{default:i(()=>[...e[47]||(e[47]=[c("新建分流方案",-1)])]),_:1},8,["icon"])]),r.pools.length?(d(),v("div",Ln,[n("aside",En,[(d(!0),v(R,null,J(r.pools,a=>(d(),v("button",{key:a.id,class:P(["pool-item",{active:Number(a.id)===U.value}]),onClick:O=>U.value=Number(a.id)},[n("span",{class:P(["pool-status",Number(a.status)===1?"online":"offline"])},null,2),n("span",null,[n("strong",null,u(a.name),1),n("small",null,u(qe(a.id))+" 条链接 · "+u(L(a.click_count))+" 次点击",1)]),s(l,null,{default:i(()=>[s(p($t))]),_:1})],10,Un))),128))]),n("div",Tn,[C.value?(d(),v("div",zn,[n("div",null,[n("div",On,[n("h3",null,u(C.value.name),1),n("span",{class:P(["status-tag",Number(C.value.status)===1?"is-online":"is-offline"])},u(Number(C.value.status)===1?"运行中":"已停用"),3),n("span",Fn,u(C.value.dept_name||"未分部门")+" · "+u(C.value.owner_name||"系统"),1)]),n("p",null,"公开键:"+u(C.value.public_key),1)]),n("div",Mn,[s(o,{icon:p(ze),loading:G.value,onClick:ke},{default:i(()=>[...e[49]||(e[49]=[c("验证 API",-1)])]),_:1},8,["icon","loading"]),s(o,{icon:p(_e),loading:le.value,onClick:Ze},{default:i(()=>[...e[50]||(e[50]=[c("同步企业微信",-1)])]),_:1},8,["icon","loading"]),s(o,{icon:p(Te),onClick:e[5]||(e[5]=a=>dt(C.value.install_code,"JS 安装代码"))},{default:i(()=>[...e[51]||(e[51]=[c("复制 JS",-1)])]),_:1},8,["icon"]),s(o,{icon:p(xt),onClick:e[6]||(e[6]=a=>de(C.value))},{default:i(()=>[...e[52]||(e[52]=[c("编辑方案",-1)])]),_:1},8,["icon"]),s(o,{type:"danger",plain:"",icon:p(St),onClick:e[7]||(e[7]=a=>Be(C.value))},{default:i(()=>[...e[53]||(e[53]=[c("删除",-1)])]),_:1},8,["icon"]),s(o,{type:"primary",icon:p(pe),onClick:e[8]||(e[8]=a=>ye())},{default:i(()=>[...e[54]||(e[54]=[c("创建官方获客链接",-1)])]),_:1},8,["icon"])])])):A("",!0),be.value>0&&ve.value===0?(d(),y(k,{key:1,class:"legacy-sync-alert",type:"warning","show-icon":"",closable:!1,title:`当前方案的 ${be.value} 条链接都是历史手工链接,企业微信同步不会返回它们`,description:"官方接口只返回当前应用通过 API 创建的获客链接。现有链接仍可参与本地分流;如需同步 link_id、客户和官方统计,请点击“创建官方获客链接”。"},null,8,["title"])):A("",!0),s(ee,{data:oe.value,class:"link-table",stripe:""},{empty:i(()=>[s(z,{"image-size":72,description:"当前方案还没有获客助手链接"})]),default:i(()=>[s(f,{label:"推广成员 / 分组","min-width":"180",fixed:"left"},{default:i(({row:a})=>[n("div",qn,[n("strong",null,u(a.name),1),n("small",null,u(a.group_name||"默认分组"),1)])]),_:1}),s(f,{label:"企业微信链接 ID","min-width":"180"},{default:i(({row:a})=>[a.remote_link_id?(d(),v("span",{key:0,class:"remote-id",title:a.remote_link_id},u(a.remote_link_id),9,jn)):(d(),v("span",Bn,"历史手工链接"))]),_:1}),s(f,{label:"可用成员","min-width":"150"},{default:i(({row:a})=>[n("span",null,u(tt(a)),1)]),_:1}),s(f,{label:"权重",prop:"weight",width:"84",align:"center"}),s(f,{label:"今日 / 上限","min-width":"120",align:"center"},{default:i(({row:a})=>[c(u(we(a))+" / "+u(Number(a.daily_limit)?a.daily_limit:"不限"),1)]),_:1}),s(f,{label:"累计点击",prop:"click_count","min-width":"105",align:"center"}),s(f,{label:"当前可用性","min-width":"130"},{default:i(({row:a})=>[n("span",{class:P(["availability",Ce(a).className])},u(Ce(a).label),3)]),_:1}),s(f,{label:"上线",width:"90",align:"center"},{default:i(({row:a})=>[s(I,{"model-value":Number(a.status)===1,disabled:Number(a.remote_status)===2,onChange:O=>Xe(a,O)},null,8,["model-value","disabled","onChange"])]),_:1}),s(f,{label:"操作","min-width":"245",fixed:"right"},{default:i(({row:a})=>[a.is_official&&Number(a.remote_status)!==2?(d(),y(o,{key:0,type:"primary",link:"",loading:se.value===Number(a.id),onClick:O=>Ge(a)},{default:i(()=>[...e[55]||(e[55]=[c("刷新详情",-1)])]),_:1},8,["loading","onClick"])):A("",!0),!a.is_official||Number(a.remote_status)!==2?(d(),y(o,{key:1,type:"primary",link:"",onClick:O=>ye(a)},{default:i(()=>[...e[56]||(e[56]=[c("编辑",-1)])]),_:1},8,["onClick"])):A("",!0),a.is_official?(d(),y(X,{key:2,trigger:"click",onCommand:O=>Qe(O,a)},{dropdown:i(()=>[s(w,null,{default:i(()=>[s(Q,{command:"local"},{default:i(()=>[...e[58]||(e[58]=[c("从本地移除",-1)])]),_:1}),Number(a.remote_status)!==2?(d(),y(Q,{key:0,command:"remote",divided:"",class:"danger-command"},{default:i(()=>[...e[59]||(e[59]=[c("永久删除企业微信链接",-1)])]),_:1})):A("",!0)]),_:2},1024)]),default:i(()=>[s(o,{type:"primary",link:""},{default:i(()=>[e[57]||(e[57]=c("更多",-1)),s(l,{class:"el-icon--right"},{default:i(()=>[s(p(Dt))]),_:1})]),_:1})]),_:2},1032,["onCommand"])):(d(),y(o,{key:3,type:"danger",link:"",onClick:O=>Ne(a)},{default:i(()=>[...e[60]||(e[60]=[c("从本地移除",-1)])]),_:1},8,["onClick"]))]),_:1})]),_:1},8,["data"])])])):(d(),y(z,{key:1,description:"先创建一个分流方案,再添加企业微信获客助手链接"},{default:i(()=>[s(o,{type:"primary",icon:p(pe),onClick:e[9]||(e[9]=a=>de())},{default:i(()=>[...e[61]||(e[61]=[c("创建第一个方案",-1)])]),_:1},8,["icon"])]),_:1}))])):$.value==="customer-stats"?(d(),v("div",Rn,[n("div",Jn,[e[63]||(e[63]=n("div",null,[n("h2",null,"获客客户消息统计"),n("p",null,"统计当前权限范围内由获客助手链接添加的客户,以及客户向承接成员发送消息的情况。")],-1)),n("div",Kn,[b.meta.last_synced_at?(d(),v("span",Yn,"最近同步 "+u(b.meta.last_synced_at),1)):A("",!0),s(o,{type:"primary",icon:p(_e),loading:ie.value,onClick:We},{default:i(()=>[...e[62]||(e[62]=[c("同步客户",-1)])]),_:1},8,["icon","loading"])])]),n("section",Hn,[n("article",Wn,[n("span",Zn,[s(l,null,{default:i(()=>[s(p(zt))]),_:1})]),n("div",null,[e[64]||(e[64]=n("small",null,"获客客户数",-1)),n("strong",null,u(L(b.summary.customer_count)),1),e[65]||(e[65]=n("p",null,"当前筛选范围内的去重客户",-1))])]),n("article",Gn,[n("span",Qn,[s(l,null,{default:i(()=>[s(p(Ot))]),_:1})]),n("div",null,[e[66]||(e[66]=n("small",null,"已发消息客户数",-1)),n("strong",null,u(L(b.summary.messaged_customer_count)),1),e[67]||(e[67]=n("p",null,"至少发送过一条消息",-1))])]),n("article",Xn,[n("span",ea,[s(l,null,{default:i(()=>[s(p(Ue))]),_:1})]),n("div",null,[e[68]||(e[68]=n("small",null,"消息客户率",-1)),n("strong",null,u(ut(b.summary.message_customer_rate)),1),e[69]||(e[69]=n("p",null,"已发消息客户占获客客户比例",-1))])]),n("article",ta,[n("span",na,[s(l,null,{default:i(()=>[s(p(Ee))]),_:1})]),n("div",null,[e[70]||(e[70]=n("small",null,"累计接收消息数",-1)),n("strong",null,u(L(b.summary.received_message_count)),1),n("p",null,"已精确统计 "+u(L(b.summary.message_count_known_count))+" 位客户",1)])])]),r.config.callback_ready?A("",!0):(d(),y(k,{key:0,class:"chatkey-alert",type:"warning","show-icon":"",closable:!1,title:"消息次数回调尚未配置完成",description:"请在企业微信获客助手的 API 接入场景中配置本页“应用配置”展示的消息回调地址,并在服务器配置 contact_callback_token 与 contact_callback_aes_key。未完成前只能同步客户及聊天状态,无法得到精确接收消息次数。"})),s(k,{class:"chatkey-alert",type:"info","show-icon":"",closable:!1,title:"消息统计依赖企业微信 ChatKey",description:"ChatKey 仅在事件产生后的 30 分钟内有效。服务端收到企业微信回调后会立即拉取会话详情;手动同步用于刷新客户清单,无法补取已过期的会话消息。"}),n("div",aa,[s(j,{model:N,inline:"","label-position":"top"},{default:i(()=>[s(g,{label:"来源链接"},{default:i(()=>[s(h,{modelValue:N.link_id,"onUpdate:modelValue":e[10]||(e[10]=a=>N.link_id=a),clearable:"",filterable:"",placeholder:"全部链接"},{default:i(()=>[(d(!0),v(R,null,J(Fe.value,a=>(d(),y(E,{key:String(a.id),label:a.name,value:a.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s(g,{label:"承接成员"},{default:i(()=>[s(h,{modelValue:N.userid,"onUpdate:modelValue":e[11]||(e[11]=a=>N.userid=a),clearable:"",filterable:"",placeholder:"全部成员"},{default:i(()=>[(d(!0),v(R,null,J(Me.value,a=>(d(),y(E,{key:a.userid||String(a.id),label:nt(a),value:a.userid||String(a.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s(g,{label:"聊天状态"},{default:i(()=>[s(h,{modelValue:N.chat_status,"onUpdate:modelValue":e[12]||(e[12]=a=>N.chat_status=a),clearable:"",placeholder:"全部状态"},{default:i(()=>[s(E,{label:"已发过消息",value:"messaged"}),s(E,{label:"未发过消息",value:"silent"}),s(E,{label:"状态未知",value:"unknown"})]),_:1},8,["modelValue"])]),_:1}),s(g,{class:"filter-actions"},{default:i(()=>[s(o,{type:"primary",icon:p(jt),loading:W.value,onClick:Ke},{default:i(()=>[...e[71]||(e[71]=[c("查询",-1)])]),_:1},8,["icon","loading"]),s(o,{onClick:Ye},{default:i(()=>[...e[72]||(e[72]=[c("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),Le((d(),y(ee,{data:b.rows,class:"customer-table",stripe:""},{empty:i(()=>[s(z,{"image-size":72,description:"当前筛选范围暂无获客客户数据"})]),default:i(()=>[s(f,{label:"客户标识(已脱敏)","min-width":"190",fixed:"left"},{default:i(({row:a})=>[n("span",{class:"customer-identifier",title:Ve(a)},u(Ve(a)),9,la)]),_:1}),s(f,{label:"来源链接","min-width":"190"},{default:i(({row:a})=>[n("div",sa,[n("strong",null,u(lt(a)),1),n("small",null,u(st(a)),1)])]),_:1}),s(f,{label:"承接成员 / 部门","min-width":"175"},{default:i(({row:a})=>[n("div",ia,[n("strong",null,u(a.member_name||a.owner_name||"未匹配成员"),1),n("small",null,u(a.department_name||a.dept_name||"未分部门"),1)])]),_:1}),s(f,{label:"是否发过消息",width:"125",align:"center"},{default:i(({row:a})=>[n("span",{class:P(["message-state",`is-${me(a)}`])},u(it(a)),3)]),_:1}),s(f,{label:"接收消息数",width:"120",align:"right"},{default:i(({row:a})=>[n("strong",{class:P(["message-count",{muted:!$e(a)}])},u(ot(a)),3)]),_:1}),s(f,{label:"最近同步时间","min-width":"165"},{default:i(({row:a})=>[c(u(ce(a.last_synced_at||a.last_sync_time||a.synced_at||a.sync_time)),1)]),_:1}),s(f,{label:"最近消息时间","min-width":"165"},{default:i(({row:a})=>[n("span",{class:P({muted:!xe(a)})},u(ce(xe(a))),3)]),_:1})]),_:1},8,["data"])),[[Ie,W.value]]),n("div",oa,[n("span",null,"共 "+u(L(x.total))+" 位客户",1),s(mt,{"current-page":x.page_no,"onUpdate:currentPage":e[13]||(e[13]=a=>x.page_no=a),"page-size":x.page_size,"onUpdate:pageSize":e[14]||(e[14]=a=>x.page_size=a),background:"",layout:"sizes, prev, pager, next","page-sizes":[10,20,50,100],total:x.total,onCurrentChange:T,onSizeChange:He},null,8,["current-page","page-size","total"])])])):$.value==="configuration"?(d(),v("div",ua,[e[81]||(e[81]=n("div",{class:"section-heading"},[n("div",null,[n("h2",null,"企业微信内部应用配置"),n("p",null,"直接读取服务器现有的 work_wechat 配置,密钥不会返回浏览器,也不需要第三方应用授权。")])],-1)),n("div",{class:P(["configuration-panel",r.config.ready?"is-ready":"is-pending"])},[n("div",da,[n("span",null,[s(l,null,{default:i(()=>[(d(),y(Jt(r.config.ready?p(ze):p(Kt))))]),_:1})]),n("div",null,[n("strong",null,u(r.config.ready?"内部应用已就绪":"内部应用配置不完整"),1),r.config.ready?(d(),v("p",ra,"已识别 CorpID 与应用 Secret;点击“验证 API”可同时检查可信 IP、获客助手开通状态和应用权限。")):(d(),v("p",ma,"请补齐服务器 .env 的 [work_wechat] 配置;页面不会展示 Secret 内容。"))])]),(Ae=r.config.missing)!=null&&Ae.length?(d(),v("div",ca,[e[73]||(e[73]=c(" 缺少:",-1)),(d(!0),v(R,null,J(r.config.missing,a=>(d(),v("code",{key:a},u(a),1))),128))])):A("",!0),n("dl",_a,[n("div",null,[e[74]||(e[74]=n("dt",null,"企业 CorpID",-1)),n("dd",null,u(r.config.corp_id_masked||"未配置"),1),n("span",null,u(r.config.corp_id_masked?"已识别":"缺失"),1)]),n("div",null,[e[75]||(e[75]=n("dt",null,"应用 AgentID",-1)),n("dd",null,u(r.config.agent_id||"未配置"),1),n("span",null,u(r.config.agent_id?"已识别":"缺失"),1)]),n("div",null,[e[76]||(e[76]=n("dt",null,"应用 Secret",-1)),e[77]||(e[77]=n("dd",null,"仅保存在服务器环境变量中",-1)),n("span",null,u(r.config.secret_configured?"已配置":"缺失"),1)]),n("div",null,[e[78]||(e[78]=n("dt",null,"消息回调地址",-1)),n("dd",null,u(r.config.callback_url||"未生成"),1),n("span",null,u(r.config.callback_ready?"已配置密钥":"待配置 Token/AESKey"),1)])]),n("div",pa,[s(o,{type:"primary",loading:G.value,onClick:ke},{default:i(()=>[...e[79]||(e[79]=[c("验证获客助手 API",-1)])]),_:1},8,["loading"]),r.config.official_doc?(d(),y(ct,{key:0,href:r.config.official_doc,target:"_blank",type:"primary"},{default:i(()=>[...e[80]||(e[80]=[c("查看企业微信官方文档",-1)])]),_:1},8,["href"])):A("",!0)])],2)])):(d(),v("div",fa,[n("div",ga,[e[82]||(e[82]=n("div",null,[n("h2",null,"安装 JS 与浮窗客服"),n("p",null,"为每个分流方案配置独立浮窗;基础脚本仍只负责展示入口、捕获点击并请求服务端分流。")],-1)),s(h,{modelValue:M.value,"onUpdate:modelValue":e[15]||(e[15]=a=>M.value=a),placeholder:"选择分流方案",class:"install-pool-select"},{default:i(()=>[(d(!0),v(R,null,J(r.pools,a=>(d(),y(E,{key:a.id,label:a.name,value:Number(a.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),ue.value?(d(),y(mn,{key:Number(ue.value.id),pool:ue.value,onSaved:rt},null,8,["pool"])):(d(),y(z,{key:1,description:"请先创建分流方案,系统会自动生成 JS 安装代码"}))]))]),s(he,{modelValue:Y.value,"onUpdate:modelValue":e[20]||(e[20]=a=>Y.value=a),title:D.id?"编辑分流方案":"新建分流方案",width:"560px","destroy-on-close":""},{footer:i(()=>[s(o,{onClick:e[19]||(e[19]=a=>Y.value=!1)},{default:i(()=>[...e[84]||(e[84]=[c("取消",-1)])]),_:1}),s(o,{type:"primary",loading:ne.value,onClick:je},{default:i(()=>[...e[85]||(e[85]=[c("保存方案",-1)])]),_:1},8,["loading"])]),default:i(()=>[s(j,{"label-position":"top"},{default:i(()=>[s(g,{label:"方案名称",required:""},{default:i(()=>[s(B,{modelValue:D.name,"onUpdate:modelValue":e[16]||(e[16]=a=>D.name=a),maxlength:"60","show-word-limit":"",placeholder:"例如:官网咨询分流"},null,8,["modelValue"])]),_:1}),s(g,{label:"兜底获客助手链接"},{default:i(()=>[s(B,{modelValue:D.fallback_url,"onUpdate:modelValue":e[17]||(e[17]=a=>D.fallback_url=a),placeholder:"可选;没有可用成员时跳转"},null,8,["modelValue"]),e[83]||(e[83]=n("span",{class:"form-tip"},"仅接受企业微信获客助手生成的 https://work.weixin.qq.com/ca/... 链接。",-1))]),_:1}),s(g,{label:"运行状态"},{default:i(()=>[s(I,{modelValue:D.status,"onUpdate:modelValue":e[18]||(e[18]=a=>D.status=a),"active-value":1,"inactive-value":0,"active-text":"运行","inactive-text":"停用"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"]),s(he,{modelValue:H.value,"onUpdate:modelValue":e[32]||(e[32]=a=>H.value=a),title:m.id?"编辑获客助手链接":"创建企业微信官方获客链接",width:"720px","destroy-on-close":""},{footer:i(()=>[s(o,{onClick:e[31]||(e[31]=a=>H.value=!1)},{default:i(()=>[...e[90]||(e[90]=[c("取消",-1)])]),_:1}),s(o,{type:"primary",loading:ae.value,onClick:Re},{default:i(()=>[...e[91]||(e[91]=[c("保存链接",-1)])]),_:1},8,["loading"])]),default:i(()=>[s(j,{"label-position":"top",class:"link-form"},{default:i(()=>[n("div",va,[s(g,{label:"获客链接名称",required:""},{default:i(()=>[s(B,{modelValue:m.name,"onUpdate:modelValue":e[21]||(e[21]=a=>m.name=a),maxlength:"80",placeholder:"用于企业微信和后台识别"},null,8,["modelValue"])]),_:1}),s(g,{label:"分组"},{default:i(()=>[s(B,{modelValue:m.group_name,"onUpdate:modelValue":e[22]||(e[22]=a=>m.group_name=a),maxlength:"60",placeholder:"默认分组"},null,8,["modelValue"])]),_:1})]),m.legacy?(d(),y(g,{key:1,label:"企业微信获客助手链接",required:""},{default:i(()=>[s(B,{modelValue:m.wecom_url,"onUpdate:modelValue":e[24]||(e[24]=a=>m.wecom_url=a),type:"textarea",rows:2,placeholder:r.customer_acquisition_link_example},null,8,["modelValue","placeholder"]),e[87]||(e[87]=n("span",{class:"form-tip"},"这是历史手工链接,只更新本地分流规则,不会调用企业微信创建或修改接口。",-1))]),_:1})):(d(),y(g,{key:0,label:"获客成员",required:""},{default:i(()=>[s(h,{modelValue:m.member_admin_ids,"onUpdate:modelValue":e[23]||(e[23]=a=>m.member_admin_ids=a),multiple:"",filterable:"","collapse-tags":"","collapse-tags-tooltip":"",placeholder:"仅显示当前角色和部门可管理、且已绑定企业微信的成员",style:{width:"100%"}},{default:i(()=>[(d(!0),v(R,null,J(r.member_options,a=>(d(),y(E,{key:a.id,label:et(a),value:Number(a.id)},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),e[86]||(e[86]=n("span",{class:"form-tip"},"官方链接按这里的企业微信 userid 建立可见范围;越权成员不会出现在列表中。",-1))]),_:1})),n("div",ba,[s(g,{label:"分流权重",required:""},{default:i(()=>[s(Pe,{modelValue:m.weight,"onUpdate:modelValue":e[25]||(e[25]=a=>m.weight=a),min:1,max:100,"controls-position":"right"},null,8,["modelValue"])]),_:1}),s(g,{label:"每日点击上限"},{default:i(()=>[s(Pe,{modelValue:m.daily_limit,"onUpdate:modelValue":e[26]||(e[26]=a=>m.daily_limit=a),min:0,max:1e6,"controls-position":"right"},null,8,["modelValue"]),e[88]||(e[88]=n("span",{class:"form-tip"},"0 表示不限",-1))]),_:1})]),m.legacy?A("",!0):(d(),y(g,{key:2,label:"添加客户时跳过验证"},{default:i(()=>[s(I,{modelValue:m.skip_verify,"onUpdate:modelValue":e[27]||(e[27]=a=>m.skip_verify=a),"active-value":1,"inactive-value":0,"active-text":"跳过验证","inactive-text":"需要验证"},null,8,["modelValue"])]),_:1})),s(g,{label:"上线状态"},{default:i(()=>[s(I,{modelValue:m.status,"onUpdate:modelValue":e[28]||(e[28]=a=>m.status=a),"active-value":1,"inactive-value":0,"active-text":"上线","inactive-text":"下线"},null,8,["modelValue"])]),_:1}),s(g,{label:"生效时间段"},{default:i(()=>[s(_t,{modelValue:m.active_range,"onUpdate:modelValue":e[29]||(e[29]=a=>m.active_range=a),type:"datetimerange","value-format":"YYYY-MM-DD HH:mm:ss","start-placeholder":"开始时间","end-placeholder":"结束时间","range-separator":"至"},null,8,["modelValue"]),e[89]||(e[89]=n("span",{class:"form-tip"},"不选择表示长期有效",-1))]),_:1}),s(g,{label:"备注"},{default:i(()=>[s(B,{modelValue:m.remark,"onUpdate:modelValue":e[30]||(e[30]=a=>m.remark=a),maxlength:"255","show-word-limit":""},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"])])),[[Ie,Z.value]])}}}),xa=cn(ka,[["__scopeId","data-v-6c8efb65"]]);export{xa as default};