4 lines
38 KiB
JavaScript
4 lines
38 KiB
JavaScript
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};
|