Files
zyt/server/public/admin/assets/PromotionAutomationForm-7RvW6GYj.js
T
2026-09-09 15:52:46 +08:00

2 lines
18 KiB
JavaScript

import{o as Ue,R as ve,bx as Ee,q as s,r as i,v as o,bh as Ce,s as d,b6 as xe,D as u,bc as Ie,bf as Te,L as r,F as y,G as V,T as _,K as He,cA as Me,u as H,O as h,bd as Se,c5 as Be,P as c,bm as $e,bn as Ne,cw as ee,ae as le,I as Ae,cC as De,by as ze,b7 as Pe,b8 as Re,aw as Fe,p as b,M as w,n as Ge}from"./.pnpm-BHOjf1ZS.js";import{y as Ke,z as Le}from"./first_visit-CL3LsNli.js";import{w as pe,t as Oe,W as ce,p as We,v as Ye}from"./WelcomeMessageEditor-s-2890d7.js";import{_ as je}from"./index-FUvp6yIk.js";const qe={class:"automation-form"},Je={key:0,class:"reception-schedules"},Qe={class:"schedule-heading"},Xe={class:"time-row"},Ze={key:0},el={key:0,class:"inline-error"},ll={key:0,class:"legacy-tags-warning full-width",role:"alert"},al={key:1,class:"full-width tags-content"},tl={class:"tag-select-row"},sl={key:0,role:"alert",class:"inline-error"},ol={key:1,class:"field-help"},dl={key:2,class:"custom-tag-editor"},ul={class:"custom-tag-row"},nl={key:0,role:"alert",class:"inline-error"},il={key:3,role:"status",class:"tag-success"},rl={key:0,class:"full-width remark-content"},ml={class:"token-buttons"},vl={class:"remark-preview"},pl={class:"field-help"},cl={key:0,class:"field-help"},bl={key:1,class:"field-help warning-help"},fl={key:2,class:"field-help warning-help"},_l={class:"welcome-block"},gl={key:0},kl={class:"schedule-heading"},yl={class:"time-row"},wl={key:0},Vl=Ue({__name:"PromotionAutomationForm",props:{modelValue:{},mainMemberIds:{},members:{},disabled:{type:Boolean},disabledSections:{},backupExcludedMemberIds:{}},emits:["update:modelValue","busy"],setup(Y,{emit:be}){const C=Y,j=be,t=b({get:()=>C.modelValue,set:a=>j("update:modelValue",a)}),q=a=>{var e;return!!(C.disabled||(e=C.disabledSections)!=null&&e.includes(a))},x=b(()=>q("reception")),m=b(()=>q("customer")),U=b(()=>q("welcome")),fe=b(()=>C.backupExcludedMemberIds||C.mainMemberIds),ae=b(()=>C.members.filter(a=>C.mainMemberIds.includes(Number(a.id)))),_e=b(()=>t.value.backup_member_admin_ids.filter(a=>!C.members.some(e=>Number(e.id)===a))),P=b(()=>{var a;return((a=ae.value[0])==null?void 0:a.name)||"小陈"}),te=b(()=>We(t.value.remark_template,P.value,20)),R=w(),J=w({start:0,end:0}),M=w([]),T=w(!1),B=w(""),se=w(!1),g=w(!1),F=w(!1),$=w(""),S=w(""),N=w(""),ge=b(()=>t.value.tag_ids.length>1),G=b({get:()=>t.value.tag_ids.length===1?t.value.tag_ids[0]:"",set:a=>{t.value.tag_ids=a?[a]:[],N.value=""}}),ke=b(()=>{const a=M.value.flatMap(e=>e.tag);return t.value.tag_ids.map(e=>{var v;return((v=a.find(p=>p.id===e))==null?void 0:v.name)||e}).join("、")}),K=w(new Set),A=b(()=>K.value.size>0);ve([g,A],([a,e])=>j("busy",a||e),{flush:"sync"});const oe=b(()=>{const a=new Set(M.value.flatMap(e=>e.tag.map(v=>v.id)));return t.value.tag_ids.filter(e=>!a.has(e))});ve([()=>t.value.tags_enabled,m],([a,e])=>{a&&!e&&!se.value&&!T.value&&ne()},{immediate:!0});function de(a){var e;return`${a.name} · ${((e=a.dept_names)==null?void 0:e.join(" / "))||a.userid||"未分部门"}`}function ye(){t.value.reception_schedule.push({weekdays:[1,2,3,4,5],start:"09:00",end:"18:00",member_admin_ids:[...C.mainMemberIds]})}function we(){t.value.welcome_schedule.push({weekdays:[1,2,3,4,5],start:"09:00",end:"18:00",text:"",attachments:[]})}function Ve(a){t.value.welcome_schedule.splice(a,1),K.value.clear()}function ue(a,e){e?K.value.add(a):K.value.delete(a)}async function ne(){if(!(g.value||T.value)){T.value=!0,B.value="";try{const a=await Ke();if(!Array.isArray(a==null?void 0:a.tag_groups))throw new Error("标签接口未返回有效的标签列表。");M.value=a.tag_groups.map(e=>({...e,tag:Array.isArray(e.tag)?e.tag:[]})),se.value=!0}catch(a){B.value=a instanceof Error?a.message:typeof a=="string"?a:"企业微信标签加载失败。"}finally{T.value=!1}}}async function ie(){var a;if(!(m.value||g.value||T.value)&&(S.value=Ye($.value),N.value="",!S.value)){g.value=!0;try{const e=await Le({name:$.value.trim()});if(!((a=e==null?void 0:e.tag)!=null&&a.id)||!e.tag.name||!e.group_id)throw new Error("企业微信未返回有效的标签 ID,请刷新标签后确认。");let v=M.value.find(I=>I.group_id===e.group_id);v||(v={group_id:e.group_id,group_name:e.group_name,tag:[]},M.value.push(v));const p=v.tag.findIndex(I=>I.id===e.tag.id);p>=0?v.tag[p]=e.tag:v.tag.push(e.tag),G.value=e.tag.id,N.value=`${e.reused?"已选用已有":"已创建并选用"}标签“${e.tag.name}”,保存方案后生效。`,$.value="",F.value=!1}catch(e){S.value=e instanceof Error?e.message:typeof e=="string"?e:"自定义标签创建失败,请刷新确认或重试。"}finally{g.value=!1}}}function L(){var e;const a=(e=R.value)==null?void 0:e.input;a&&(J.value={start:a.selectionStart||0,end:a.selectionEnd||0})}async function he(a){var I,E,k,D;const{start:e,end:v}=J.value;t.value.remark_template=t.value.remark_template.slice(0,e)+a+t.value.remark_template.slice(v),await Ge();const p=e+a.length;(E=(I=R.value)==null?void 0:I.input)==null||E.focus(),(D=(k=R.value)==null?void 0:k.input)==null||D.setSelectionRange(p,p),J.value={start:p,end:p}}return Ee(()=>j("busy",!1)),(a,e)=>{const v=Ce,p=Te,I=Ie,E=xe,k=He,D=Se,re=Me,O=Be,z=Ne,Q=$e,W=Ae,me=De,X=Pe;return s(),i("div",qe,[o(v,{class:"automation-note",type:"info","show-icon":"",closable:!1,title:"自动化设置只作用于之后新添加的客户,不会写入企微获客链接详情中的“欢迎语/客户标签”配置。",description:"系统会在客户添加回调中立即发送渠道欢迎语并添加标签,后台任务负责失败重试及其他补偿。测试时请使用系统复制的、带渠道参数的链接。"}),d("section",{class:le(["automation-section",{"is-disabled":x.value}])},[e[24]||(e[24]=d("h3",{class:"form-section-title"},"接待设置",-1)),o(E,{label:"接待模式"},{default:u(()=>[o(I,{modelValue:t.value.reception_mode,"onUpdate:modelValue":e[0]||(e[0]=l=>t.value.reception_mode=l),disabled:x.value},{default:u(()=>[o(p,{value:"always"},{default:u(()=>[...e[16]||(e[16]=[r("全天接待",-1)])]),_:1}),o(p,{value:"scheduled"},{default:u(()=>[...e[17]||(e[17]=[r("按星期时段自动上下线",-1)])]),_:1})]),_:1},8,["modelValue","disabled"]),e[18]||(e[18]=d("p",{class:"field-help"},"成员仍受每日上限、有效期及启用状态限制;时间统一使用北京时间。",-1))]),_:1}),t.value.reception_mode==="scheduled"?(s(),i("div",Je,[(s(!0),i(y,null,V(t.value.reception_schedule,(l,f)=>(s(),i("div",{key:f,class:"schedule-card"},[d("div",Qe,[d("strong",null,"接待时段 "+_(f+1),1),o(k,{type:"danger",text:"",size:"small",disabled:x.value,onClick:n=>t.value.reception_schedule.splice(f,1)},{default:u(()=>[...e[19]||(e[19]=[r("删除时段",-1)])]),_:1},8,["disabled","onClick"])]),o(re,{modelValue:l.weekdays,"onUpdate:modelValue":n=>l.weekdays=n,class:"weekday-select",disabled:x.value},{default:u(()=>[(s(!0),i(y,null,V(H(pe),(n,Z)=>(s(),h(D,{key:n,value:Z+1},{default:u(()=>[r(_(n),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),d("div",Xe,[o(O,{modelValue:l.start,"onUpdate:modelValue":n=>l.start=n,disabled:x.value,format:"HH:mm","value-format":"HH:mm",placeholder:"开始时间",clearable:!1},null,8,["modelValue","onUpdate:modelValue","disabled"]),e[20]||(e[20]=d("span",null,"至",-1)),o(O,{modelValue:l.end,"onUpdate:modelValue":n=>l.end=n,disabled:x.value,format:"HH:mm","value-format":"HH:mm",placeholder:"结束时间",clearable:!1},null,8,["modelValue","onUpdate:modelValue","disabled"]),l.end<l.start?(s(),i("small",Ze,"次日结束")):c("",!0)]),o(Q,{modelValue:l.member_admin_ids,"onUpdate:modelValue":n=>l.member_admin_ids=n,disabled:x.value,multiple:"",filterable:"",clearable:"",placeholder:"从上方主接待成员中选择",style:{width:"100%"}},{default:u(()=>[(s(!0),i(y,null,V(ae.value,n=>(s(),h(z,{key:n.id,value:Number(n.id),label:de(n)},null,8,["value","label"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),l.member_admin_ids.some(n=>!Y.mainMemberIds.includes(n))?(s(),i("p",el,"该时段含已从主接待移除的成员,请重新选择。")):c("",!0)]))),128)),o(k,{icon:H(ee),disabled:x.value||t.value.reception_schedule.length>=30,onClick:ye},{default:u(()=>[...e[21]||(e[21]=[r("添加接待时段",-1)])]),_:1},8,["icon","disabled"]),e[22]||(e[22]=d("p",{class:"field-help"},"最多 30 个时段。跨午夜时段归属开始日,例如星期一 22:00 至 02:00 包含星期二凌晨;接待时段重叠时取成员并集。",-1))])):c("",!0),o(E,{label:"备用成员",required:t.value.reception_mode==="scheduled"},{default:u(()=>[o(Q,{modelValue:t.value.backup_member_admin_ids,"onUpdate:modelValue":e[1]||(e[1]=l=>t.value.backup_member_admin_ids=l),disabled:x.value,multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":"","max-collapse-tags":3,"multiple-limit":500,placeholder:"主接待成员均不可用时由备用成员接待",style:{width:"100%"}},{default:u(()=>[(s(!0),i(y,null,V(Y.members,l=>(s(),h(z,{key:l.id,value:Number(l.id),label:de(l),disabled:fe.value.includes(Number(l.id))},null,8,["value","label","disabled"]))),128)),(s(!0),i(y,null,V(_e.value,l=>(s(),h(z,{key:`missing-${l}`,value:l,label:`成员 ${l}(当前不可选,请移除后重新选择)`,disabled:""},null,8,["value","label"]))),128))]),_:1},8,["modelValue","disabled"]),e[23]||(e[23]=d("p",{class:"field-help"},"备用成员不能与主接待重复。按时段模式至少配置一名备用成员;仅当无可用主接待时进入官方成员范围。",-1))]),_:1},8,["required"])],2),d("section",{class:le(["automation-section",{"is-disabled":m.value}])},[e[31]||(e[31]=d("h3",{class:"form-section-title"},"客户设置",-1)),o(E,{label:"自动添加客户标签"},{default:u(()=>[o(W,{modelValue:t.value.tags_enabled,"onUpdate:modelValue":e[2]||(e[2]=l=>t.value.tags_enabled=l),disabled:m.value||g.value},null,8,["modelValue","disabled"]),ge.value?(s(),i("div",ll,[d("p",null,"原方案设置了多个标签:"+_(ke.value)+"。现在仅支持单选,请重新选择一个标签,或清空原标签。",1),o(k,{size:"small",disabled:m.value||g.value,onClick:e[3]||(e[3]=l=>G.value="")},{default:u(()=>[...e[25]||(e[25]=[r("清空原标签",-1)])]),_:1},8,["disabled"])])):c("",!0),t.value.tags_enabled?(s(),i("div",al,[d("div",tl,[o(Q,{modelValue:G.value,"onUpdate:modelValue":e[4]||(e[4]=l=>G.value=l),disabled:m.value||g.value,loading:T.value,filterable:"",clearable:"",placeholder:"选择一个企业微信客户标签","aria-label":"企业微信客户标签",class:"tag-select"},{default:u(()=>[(s(!0),i(y,null,V(M.value,l=>(s(),h(me,{key:l.group_id,label:l.group_name},{default:u(()=>[(s(!0),i(y,null,V(l.tag,f=>(s(),h(z,{key:f.id,value:f.id,label:f.name},null,8,["value","label"]))),128))]),_:2},1032,["label"]))),128)),oe.value.length?(s(),h(me,{key:0,label:"已选标签(名称暂不可用)"},{default:u(()=>[(s(!0),i(y,null,V(oe.value,l=>(s(),h(z,{key:l,value:l,label:`已选标签 · ${l}`},null,8,["value","label"]))),128))]),_:1})):c("",!0)]),_:1},8,["modelValue","disabled","loading"]),o(k,{icon:H(ee),disabled:m.value||g.value,onClick:e[5]||(e[5]=l=>F.value=!F.value)},{default:u(()=>[...e[26]||(e[26]=[r("自定义标签",-1)])]),_:1},8,["icon","disabled"]),o(k,{icon:H(ze),disabled:m.value||g.value,loading:T.value,onClick:ne},{default:u(()=>[r(_(B.value?"重试":"刷新标签"),1)]),_:1},8,["icon","disabled","loading"])]),B.value?(s(),i("p",sl,_(B.value)+" 已保留原有标签,点击“重试”重新加载。",1)):(s(),i("p",ol,"每个方案只选一个标签,可选择已有企业微信标签,也可自定义创建。客户添加成功后由系统调用企微接口打标,不会显示在企微获客链接详情的“客户标签”配置中。")),F.value?(s(),i("div",dl,[e[28]||(e[28]=d("label",{for:"promotion-custom-tag-name"},"自定义标签名称",-1)),d("div",ul,[o(X,{id:"promotion-custom-tag-name",modelValue:$.value,"onUpdate:modelValue":e[6]||(e[6]=l=>$.value=l),disabled:m.value||g.value,maxlength:"30","show-word-limit":"",placeholder:"例如:官网咨询",onInput:e[7]||(e[7]=l=>S.value=""),onKeydown:Re(Fe(ie,["prevent"]),["enter"])},null,8,["modelValue","disabled","onKeydown"]),o(k,{type:"primary",disabled:m.value||T.value,loading:g.value,onClick:ie},{default:u(()=>[...e[27]||(e[27]=[r("创建并选用",-1)])]),_:1},8,["disabled","loading"])]),e[29]||(e[29]=d("p",{class:"field-help"},"创建到企业微信“推广渠道”分组,同组同名标签会复用。创建后即保存到企微标签库,取消方案编辑不会删除标签。",-1)),S.value?(s(),i("p",nl,_(S.value)+" 原有选择未改变。",1)):c("",!0)])):c("",!0),N.value?(s(),i("p",il,_(N.value),1)):c("",!0)])):c("",!0)]),_:1}),o(E,{label:"自动设置客户备注"},{default:u(()=>[o(W,{modelValue:t.value.remark_enabled,"onUpdate:modelValue":e[8]||(e[8]=l=>t.value.remark_enabled=l),disabled:m.value},null,8,["modelValue","disabled"]),t.value.remark_enabled?(s(),i("div",rl,[d("div",ml,[(s(!0),i(y,null,V(H(Oe),l=>(s(),h(k,{key:l.value,size:"small",disabled:m.value,onClick:f=>he(l.value)},{default:u(()=>[r("插入"+_(l.label),1)]),_:2},1032,["disabled","onClick"]))),128))]),o(X,{ref_key:"remarkInput",ref:R,modelValue:t.value.remark_template,"onUpdate:modelValue":e[9]||(e[9]=l=>t.value.remark_template=l),disabled:m.value,maxlength:"200","show-word-limit":"",placeholder:"例如:官网-{customer_name}",onSelect:L,onKeyup:L,onClick:L,onBlur:L},null,8,["modelValue","disabled"]),d("div",vl,[e[30]||(e[30]=d("span",null,"备注预览",-1)),d("strong",null,_(te.value||"—"),1),d("small",null,_(Array.from(te.value).length)+"/20 字",1)]),d("p",pl,"示例客户:张女士;员工:"+_(P.value)+"。添加时间格式为 YYYY-MM-DD,生成后的备注最多保留前 20 字。",1)])):c("",!0)]),_:1}),o(E,{label:"自动设置客户描述"},{default:u(()=>[o(W,{modelValue:t.value.description_enabled,"onUpdate:modelValue":e[10]||(e[10]=l=>t.value.description_enabled=l),disabled:m.value},null,8,["modelValue","disabled"]),t.value.description_enabled?(s(),h(X,{key:0,modelValue:t.value.description,"onUpdate:modelValue":e[11]||(e[11]=l=>t.value.description=l),class:"description-input",disabled:m.value,type:"textarea",rows:3,maxlength:"150","show-word-limit":"",placeholder:"请输入客户描述,最多 150 字"},null,8,["modelValue","disabled"])):c("",!0)]),_:1})],2),d("section",{class:le(["automation-section",{"is-disabled":U.value}])},[e[42]||(e[42]=d("h3",{class:"form-section-title"},"欢迎语设置",-1)),o(E,{label:"欢迎语模式"},{default:u(()=>[o(I,{modelValue:t.value.welcome_mode,"onUpdate:modelValue":e[12]||(e[12]=l=>t.value.welcome_mode=l),disabled:U.value||A.value},{default:u(()=>[o(p,{value:"channel"},{default:u(()=>[...e[32]||(e[32]=[r("渠道欢迎语",-1)])]),_:1}),o(p,{value:"default"},{default:u(()=>[...e[33]||(e[33]=[r("默认欢迎语",-1)])]),_:1}),o(p,{value:"none"},{default:u(()=>[...e[34]||(e[34]=[r("不发送欢迎语",-1)])]),_:1})]),_:1},8,["modelValue","disabled"]),t.value.welcome_mode==="default"?(s(),i("p",cl,"沿用企业微信后台配置,本系统不发送欢迎语。")):t.value.welcome_mode==="none"?(s(),i("p",bl,"仅关闭本系统欢迎语,无法覆盖或关闭企业微信后台已配置的欢迎语。")):(s(),i("p",fl,"渠道欢迎语由客户添加回调即时发送,不会显示在企微获客链接详情中。同一接待成员若已配置企微原生欢迎语,企微可能不再下发欢迎码,请先关闭冲突配置。"))]),_:1}),t.value.welcome_mode==="channel"?(s(),i(y,{key:0},[d("div",_l,[e[35]||(e[35]=d("h4",null,"基础渠道欢迎语",-1)),e[36]||(e[36]=d("p",{class:"field-help"},"未开启分时欢迎语,或新客户添加时间未匹配任何时段时,使用以下内容。",-1)),o(ce,{modelValue:t.value.welcome,"onUpdate:modelValue":e[13]||(e[13]=l=>t.value.welcome=l),disabled:U.value,"employee-name":P.value,onBusy:e[14]||(e[14]=l=>ue("basic",l))},null,8,["modelValue","disabled","employee-name"])]),o(E,{class:"schedule-switch",label:"分时欢迎语"},{default:u(()=>[o(W,{modelValue:t.value.welcome_schedule_enabled,"onUpdate:modelValue":e[15]||(e[15]=l=>t.value.welcome_schedule_enabled=l),disabled:U.value||A.value},null,8,["modelValue","disabled"]),e[37]||(e[37]=d("span",{class:"switch-help"},"按客户添加时的北京时间匹配,时段不能重叠",-1))]),_:1}),t.value.welcome_schedule_enabled?(s(),i("div",gl,[(s(!0),i(y,null,V(t.value.welcome_schedule,(l,f)=>(s(),i("div",{key:f,class:"schedule-card welcome-schedule"},[d("div",kl,[d("strong",null,"欢迎语时段 "+_(f+1),1),o(k,{type:"danger",text:"",size:"small",disabled:U.value||A.value,onClick:n=>Ve(f)},{default:u(()=>[...e[38]||(e[38]=[r("删除时段",-1)])]),_:1},8,["disabled","onClick"])]),o(re,{modelValue:l.weekdays,"onUpdate:modelValue":n=>l.weekdays=n,class:"weekday-select",disabled:U.value},{default:u(()=>[(s(!0),i(y,null,V(H(pe),(n,Z)=>(s(),h(D,{key:n,value:Z+1},{default:u(()=>[r(_(n),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),d("div",yl,[o(O,{modelValue:l.start,"onUpdate:modelValue":n=>l.start=n,disabled:U.value,format:"HH:mm","value-format":"HH:mm",placeholder:"开始时间",clearable:!1},null,8,["modelValue","onUpdate:modelValue","disabled"]),e[39]||(e[39]=d("span",null,"至",-1)),o(O,{modelValue:l.end,"onUpdate:modelValue":n=>l.end=n,disabled:U.value,format:"HH:mm","value-format":"HH:mm",placeholder:"结束时间",clearable:!1},null,8,["modelValue","onUpdate:modelValue","disabled"]),l.end<l.start?(s(),i("small",wl,"次日结束")):c("",!0)]),o(ce,{"model-value":l,disabled:U.value,"employee-name":P.value,"onUpdate:modelValue":n=>Object.assign(l,n),onBusy:n=>ue(`slot-${f}`,n)},null,8,["model-value","disabled","employee-name","onUpdate:modelValue","onBusy"])]))),128)),o(k,{icon:H(ee),disabled:U.value||A.value||t.value.welcome_schedule.length>=30,onClick:we},{default:u(()=>[...e[40]||(e[40]=[r("添加欢迎语时段",-1)])]),_:1},8,["icon","disabled"]),e[41]||(e[41]=d("p",{class:"field-help"},"最多 30 个时段,支持跨午夜。时段外自动使用基础渠道欢迎语,不会随机选择内容。",-1))])):c("",!0)],64)):c("",!0)],2)])}}}),xl=je(Vl,[["__scopeId","data-v-a7e42c87"]]);export{xl as default};