2 lines
19 KiB
JavaScript
2 lines
19 KiB
JavaScript
import{o as de,bx as oe,q as u,r as f,s as a,v as c,bY as re,D as v,F as C,G as I,T as o,K as ue,L as w,O as W,u as h,b7 as me,ae as G,$ as ce,cv as pe,Z as fe,_ as be,P as z,cV as Y,w as ge,bE as _e,bJ as ve,cW as ye,bH as ke,M as T,p as Q,n as X,E as we}from"./.pnpm-BSw4l71J.js";import{A as he}from"./first_visit-Dq0_NqQZ.js";import{_ as Ve}from"./index-C7M1esnu.js";const ol=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"],xe=[{label:"客户昵称",value:"{customer_name}"},{label:"员工昵称",value:"{employee_name}"},{label:"添加时间",value:"{add_time}"}],E=e=>new TextEncoder().encode(e).length;function rl(e){return e.trim()?/[\p{C}\u2028\u2029]/u.test(e)?"标签名称不能包含换行、控制字符或不可见格式字符":Array.from(e.trim()).length>30?"标签名称最多 30 个字符":"":"请输入自定义标签名称"}function Ce(){return{reception_mode:"always",reception_schedule:[],backup_member_admin_ids:[],tags_enabled:!1,tag_ids:[],remark_enabled:!1,remark_template:"{customer_name}",description_enabled:!1,description:"",welcome_mode:"default",welcome:{text:"",attachments:[]},welcome_schedule_enabled:!1,welcome_schedule:[]}}function ul(e){var m,n;const b=Ce();if(!e)return b;const s=JSON.parse(JSON.stringify(e));return{reception_mode:s.reception_mode==="scheduled"?"scheduled":"always",reception_schedule:(s.reception_schedule||[]).map(({weekdays:r,start:$,end:V,member_admin_ids:y})=>({weekdays:[...r],start:$,end:V,member_admin_ids:y.map(Number)})),backup_member_admin_ids:(s.backup_member_admin_ids||[]).map(Number),tags_enabled:!!s.tags_enabled,tag_ids:[...s.tag_ids||[]],remark_enabled:!!s.remark_enabled,remark_template:s.remark_template??b.remark_template,description_enabled:!!s.description_enabled,description:s.description||"",welcome_mode:s.welcome_mode||"default",welcome:{text:((m=s.welcome)==null?void 0:m.text)||"",attachments:((n=s.welcome)==null?void 0:n.attachments)||[]},welcome_schedule_enabled:!!s.welcome_schedule_enabled,welcome_schedule:(s.welcome_schedule||[]).map(({weekdays:r,start:$,end:V,text:y,attachments:U})=>({weekdays:[...r],start:$,end:V,text:y||"",attachments:U||[]}))}}function ml(e){return{...e,tags_enabled:e.tags_enabled?1:0,remark_enabled:e.remark_enabled?1:0,description_enabled:e.description_enabled?1:0,welcome_schedule_enabled:e.welcome_schedule_enabled?1:0}}function $e(e,b="小陈",s){const m=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(new Date),n=e.replace(/\{(customer_name|employee_name|add_time)\}/g,r=>({"{customer_name}":"张女士","{employee_name}":b,"{add_time}":m})[r]||r);return s?Array.from(n).slice(0,s).join(""):n}function F(e){try{return["https:","http:"].includes(new URL(e).protocol)}catch{return!1}}function ee(e,b){return!e.weekdays.length||e.weekdays.some(s=>s<1||s>7)?`${b}请选择星期`:!/^(?:[01]\d|2[0-3]):[0-5]\d$/.test(e.start)||!/^(?:[01]\d|2[0-3]):[0-5]\d$/.test(e.end)?`${b}请填写有效的起止时间`:e.start===e.end?`${b}开始与结束时间不能相同,全天接待请选择全天模式`:""}function le(e,b,s=!0){if(Array.from(e.text).length>1200)return`${b}正文不能超过 1200 字`;if(E(e.text)>4e3)return`${b}正文不能超过 4000 UTF-8 字节,请减少表情或文字`;if(e.attachments.length>9)return`${b}最多添加 9 个附件`;if(s&&!e.text.trim()&&!e.attachments.length)return`${b}请填写正文或添加附件`;for(const[m,n]of e.attachments.entries()){const r=`${b}第 ${m+1} 个附件:`;switch(n.msgtype){case"image":if(!n.image.asset_id&&!F(n.image.pic_url||""))return r+"请上传图片或填写有效图片地址";break;case"video":if(!n.video.asset_id)return r+"请先上传视频";break;case"file":if(!n.file.asset_id)return r+"请先上传文件";break;case"link":if(!n.link.title.trim()||!F(n.link.url))return r+"请填写网页标题和有效的 HTTP/HTTPS 链接";if(E(n.link.title)>128||E(n.link.desc)>512)return r+"网页标题限 128 字节,描述限 512 字节";if(n.link.picurl&&!F(n.link.picurl))return r+"网页封面地址无效";break;case"miniprogram":if(!n.miniprogram.title.trim()||!n.miniprogram.appid.trim()||!n.miniprogram.page.trim()||!n.miniprogram.pic_asset_id)return r+"请填写小程序标题、AppID、页面路径并上传封面";if(E(n.miniprogram.title)>64)return r+"小程序标题不能超过 64 字节";break}}return""}function Ue(e){const b=new Set;for(const s of e){const[m,n]=s.start.split(":").map(Number),[r,$]=s.end.split(":").map(Number),V=m*60+n,y=(r*60+$-V+1440)%1440;for(const U of new Set(s.weekdays))for(let N=0;N<y;N++){const M=((U-1)*1440+V+N)%10080;if(b.has(M))return!0;b.add(M)}}return!1}function cl(e,b){if(e.backup_member_admin_ids.some(m=>b.includes(m)))return"备用成员不能与主接待成员重复";if(e.reception_schedule.length>30||e.welcome_schedule.length>30)return"每类时段最多添加 30 条";if(e.reception_mode==="scheduled"){if(!e.reception_schedule.length)return"按时段接待至少需要一个接待时段";if(!e.backup_member_admin_ids.length)return"按时段接待至少需要一名备用成员,以承接非接待时段的客户"}for(const[m,n]of e.reception_schedule.entries()){const r=ee(n,`接待时段 ${m+1}:`);if(r)return r;if(!n.member_admin_ids.length)return`接待时段 ${m+1}:请至少选择一名成员`;if(n.member_admin_ids.some($=>!b.includes($)))return`接待时段 ${m+1}:成员必须来自主接待成员,请重新选择`}if(e.tags_enabled&&!e.tag_ids.length)return"启用客户标签后,请选择一个企业微信标签,或创建自定义标签";if(e.tag_ids.length>1)return"客户标签只能选择一个,请重新选择或清空原标签";if(e.remark_enabled&&!e.remark_template.trim())return"请填写客户备注模板";if(Array.from(e.remark_template).length>200)return"客户备注模板不能超过 200 字";if(e.description_enabled&&!e.description.trim())return"请填写客户描述";if(Array.from(e.description).length>150)return"客户描述不能超过 150 字";const s=le(e.welcome,"基础渠道欢迎语:",e.welcome_mode==="channel");if(s)return s;if(e.welcome_mode==="channel"&&e.welcome_schedule_enabled&&!e.welcome_schedule.length)return"请至少添加一个分时欢迎语时段";for(const[m,n]of e.welcome_schedule.entries()){const r=ee(n,`欢迎语时段 ${m+1}:`)||le(n,`欢迎语时段 ${m+1}:`);if(r)return r}return Ue(e.welcome_schedule)?"分时欢迎语的时间范围不能重叠(跨午夜时段归属开始日)":""}const Ae={class:"welcome-editor"},Ee={class:"welcome-editor__fields"},Ne={class:"text-tools"},Te={class:"emoji-grid"},Se=["onClick"],Be={class:"attachments-heading"},Pe={key:0,class:"attachment-empty"},Me={class:"attachment-card__heading"},Ie={class:"upload-field"},ze={class:"field-tip"},De={class:"attachment-label"},je={class:"attachment-label"},Le={class:"attachment-label"},Oe={class:"upload-field mini-upload"},We={key:3,role:"alert",class:"upload-error"},Ge=["accept"],Fe={class:"welcome-preview","aria-label":"欢迎语手机预览"},Je={class:"phone-heading"},Re={class:"phone-content"},He={key:0,class:"chat-row"},Ke={class:"chat-avatar"},Ze={class:"chat-bubble"},qe={class:"chat-avatar"},Ye={class:"chat-bubble attachment-preview"},Qe=["src"],Xe={key:1,class:"media-placeholder"},el=["src"],ll={key:1,class:"media-placeholder"},tl={key:1,class:"preview-empty"},al=de({__name:"WelcomeMessageEditor",props:{modelValue:{},disabled:{type:Boolean},employeeName:{}},emits:["update:modelValue","busy"],setup(e,{emit:b}){const s=e,m=b,n=T(),r=T(),$=T({start:0,end:0}),V=T(-1),y=Q(()=>V.value>=0),U=T({}),N=T({}),M=T({index:0,type:"image"}),J=T("image/jpeg,image/png"),te=["😊","😀","👋","🌹","❤️","👍","🙏","🎉","☀️","✨","💐","🤝","💬","✅","🌿","🍀"],R=[{value:"image",label:"图片"},{value:"link",label:"网页"},{value:"miniprogram",label:"小程序"},{value:"video",label:"视频"},{value:"file",label:"文件"}],ae=Q(()=>Array.from(s.modelValue.text).length>1200||E(s.modelValue.text)>4e3);function H(i){m("update:modelValue",{...s.modelValue,text:i})}function D(){var l;const i=(l=n.value)==null?void 0:l.textarea;i&&($.value={start:i.selectionStart,end:i.selectionEnd})}async function K(i){var _,S,A,k;if(s.disabled)return;const{start:l,end:d}=$.value;H(s.modelValue.text.slice(0,l)+i+s.modelValue.text.slice(d)),await X();const x=l+i.length;(S=(_=n.value)==null?void 0:_.textarea)==null||S.focus(),(k=(A=n.value)==null?void 0:A.textarea)==null||k.setSelectionRange(x,x),$.value={start:x,end:x}}function L(i){var l;return((l=R.find(d=>d.value===i))==null?void 0:l.label)||"附件"}function se(i){if(s.disabled||y.value||s.modelValue.attachments.length>=9)return;let l;i==="image"?l={msgtype:"image",image:{asset_id:""}}:i==="video"?l={msgtype:"video",video:{asset_id:""}}:i==="file"?l={msgtype:"file",file:{asset_id:""}}:i==="link"?l={msgtype:"link",link:{title:"",url:"",desc:"",picurl:""}}:l={msgtype:"miniprogram",miniprogram:{title:"",appid:"",page:"",pic_asset_id:""}},m("update:modelValue",{...s.modelValue,attachments:[...s.modelValue.attachments,l]})}function ie(i){U.value={},m("update:modelValue",{...s.modelValue,attachments:s.modelValue.attachments.filter((l,d)=>d!==i)})}function Z(i,l){const d=[...s.modelValue.attachments];[d[i],d[i+l]]=[d[i+l],d[i]],U.value={},m("update:modelValue",{...s.modelValue,attachments:d})}function B(i){return i.msgtype==="image"?i.image.asset_id||"":i.msgtype==="video"?i.video.asset_id:i.msgtype==="file"?i.file.asset_id:i.msgtype==="miniprogram"?i.miniprogram.pic_asset_id:""}function O(i){var d;const l=B(i);return l?((d=N.value[l])==null?void 0:d.name)||`已保存素材 ${l.slice(-10)}`:i.msgtype==="image"&&i.image.pic_url?"已保存的企微图片":"尚未上传"}function j(i){var l;return((l=N.value[B(i)])==null?void 0:l.url)||""}async function q(i,l){var d;M.value={index:i,type:l},J.value=l==="image"?".jpg,.jpeg,.png":l==="video"?".mp4":"*",await X(),(d=r.value)==null||d.click()}async function ne(i){var P;const l=i.target,d=(P=l.files)==null?void 0:P[0];if(l.value="",!d)return;const{index:x,type:_}=M.value,S=_==="file"?20:10;let A="";if(d.size<=5||d.size>S*1024*1024?A=`文件必须大于 5 字节且不超过 ${S}MB`:_==="image"&&!/\.(jpe?g|png)$/i.test(d.name)?A="图片仅支持 JPG / PNG 格式":_==="video"&&!/\.mp4$/i.test(d.name)&&(A="视频仅支持 MP4 格式"),A){U.value[x]=A;return}const k=s.modelValue.attachments[x];if(k){V.value=x,m("busy",!0),delete U.value[x];try{const t=await he(d,_);if(!(t!=null&&t.asset_id))throw new Error("上传接口未返回素材 ID");const p=String(t.asset_id);N.value[p]={name:t.name||d.name,url:_==="image"?URL.createObjectURL(d):void 0},k.msgtype==="image"?k.image={asset_id:p}:k.msgtype==="video"?k.video.asset_id=p:k.msgtype==="file"?k.file.asset_id=p:k.msgtype==="miniprogram"&&(k.miniprogram.pic_asset_id=p),we.success("素材已上传")}catch(t){U.value[x]=t instanceof Error?t.message:typeof t=="string"?t:"素材上传失败"}finally{V.value=-1,m("busy",!1)}}}return oe(()=>{Object.values(N.value).forEach(i=>{i.url&&URL.revokeObjectURL(i.url)}),m("busy",!1)}),(i,l)=>{const d=ue,x=re,_=me,S=be,A=fe,k=ce,P=ge;return u(),f("div",Ae,[a("div",Ee,[a("div",Ne,[c(x,{placement:"bottom-start",trigger:"click",width:240,disabled:e.disabled},{reference:v(()=>[c(d,{size:"small",disabled:e.disabled},{default:v(()=>[...l[0]||(l[0]=[w("☺ 插入表情",-1)])]),_:1},8,["disabled"])]),default:v(()=>[a("div",Te,[(u(),f(C,null,I(te,t=>a("button",{key:t,type:"button",onClick:p=>K(t)},o(t),9,Se)),64))])]),_:1},8,["disabled"]),(u(!0),f(C,null,I(h(xe),t=>(u(),W(d,{key:t.value,size:"small",disabled:e.disabled,onClick:p=>K(t.value)},{default:v(()=>[w(o(t.label),1)]),_:2},1032,["disabled","onClick"]))),128))]),c(_,{ref_key:"textInput",ref:n,"model-value":e.modelValue.text,type:"textarea",rows:6,disabled:e.disabled,placeholder:"请输入欢迎语,也可插入客户昵称、员工昵称和添加日期","onUpdate:modelValue":H,onSelect:D,onKeyup:D,onClick:D,onBlur:D},null,8,["model-value","disabled"]),a("div",{class:G(["text-count",{"is-error":ae.value}])},o(Array.from(e.modelValue.text).length)+"/1200 字 · "+o(h(E)(e.modelValue.text))+"/4000 字节",3),a("div",Be,[a("strong",null,[l[1]||(l[1]=w("附件 ",-1)),a("span",null,o(e.modelValue.attachments.length)+"/9",1)]),c(k,{disabled:e.disabled||e.modelValue.attachments.length>=9||y.value,onCommand:se},{dropdown:v(()=>[c(A,null,{default:v(()=>[(u(),f(C,null,I(R,t=>c(S,{key:t.value,command:t.value},{default:v(()=>[w(o(t.label),1)]),_:2},1032,["command"])),64))]),_:1})]),default:v(()=>[c(d,{size:"small",disabled:e.disabled||e.modelValue.attachments.length>=9||y.value,icon:h(pe)},{default:v(()=>[...l[2]||(l[2]=[w("添加附件",-1)])]),_:1},8,["disabled","icon"])]),_:1},8,["disabled"])]),e.modelValue.attachments.length?z("",!0):(u(),f("div",Pe,"可添加图片、网页、小程序、视频或文件。")),(u(!0),f(C,null,I(e.modelValue.attachments,(t,p)=>(u(),f("div",{key:p,class:"attachment-card"},[a("div",Me,[a("strong",null,o(p+1)+". "+o(L(t.msgtype)),1),a("div",null,[c(d,{text:"",size:"small",disabled:e.disabled||y.value||p===0,onClick:g=>Z(p,-1)},{default:v(()=>[...l[3]||(l[3]=[w("上移",-1)])]),_:1},8,["disabled","onClick"]),c(d,{text:"",size:"small",disabled:e.disabled||y.value||p===e.modelValue.attachments.length-1,onClick:g=>Z(p,1)},{default:v(()=>[...l[4]||(l[4]=[w("下移",-1)])]),_:1},8,["disabled","onClick"]),c(d,{text:"",type:"danger",size:"small",disabled:e.disabled||y.value,onClick:g=>ie(p)},{default:v(()=>[...l[5]||(l[5]=[w("删除",-1)])]),_:1},8,["disabled","onClick"])])]),t.msgtype==="image"||t.msgtype==="video"||t.msgtype==="file"?(u(),f(C,{key:0},[a("div",Ie,[c(d,{size:"small",icon:h(Y),loading:V.value===p,disabled:e.disabled||y.value,onClick:g=>q(p,t.msgtype)},{default:v(()=>[w(o(B(t)?"重新上传":"上传")+o(L(t.msgtype)),1)]),_:2},1032,["icon","loading","disabled","onClick"]),a("span",{class:G(B(t)?"asset-ready":"muted")},o(O(t)),3)]),a("small",ze,o(t.msgtype==="image"?"JPG / PNG,最多 10MB。":t.msgtype==="video"?"MP4,最多 10MB。":"文件最多 20MB。")+"上传成功后由服务端保存素材;未上传完成不能提交。",1)],64)):t.msgtype==="link"?(u(),f(C,{key:1},[a("label",De,[l[6]||(l[6]=w("网页标题 ",-1)),a("span",null,o(h(E)(t.link.title))+"/128 字节",1)]),c(_,{modelValue:t.link.title,"onUpdate:modelValue":g=>t.link.title=g,disabled:e.disabled,placeholder:"必填:网页标题"},null,8,["modelValue","onUpdate:modelValue","disabled"]),l[8]||(l[8]=a("label",{class:"attachment-label"},"网页地址",-1)),c(_,{modelValue:t.link.url,"onUpdate:modelValue":g=>t.link.url=g,disabled:e.disabled,placeholder:"https://"},null,8,["modelValue","onUpdate:modelValue","disabled"]),a("label",je,[l[7]||(l[7]=w("网页描述 ",-1)),a("span",null,o(h(E)(t.link.desc))+"/512 字节",1)]),c(_,{modelValue:t.link.desc,"onUpdate:modelValue":g=>t.link.desc=g,disabled:e.disabled,type:"textarea",rows:2,placeholder:"选填:网页摘要"},null,8,["modelValue","onUpdate:modelValue","disabled"]),l[9]||(l[9]=a("label",{class:"attachment-label"},"网页封面地址",-1)),c(_,{modelValue:t.link.picurl,"onUpdate:modelValue":g=>t.link.picurl=g,disabled:e.disabled,placeholder:"选填:公网可访问的 HTTPS 图片地址"},null,8,["modelValue","onUpdate:modelValue","disabled"])],64)):t.msgtype==="miniprogram"?(u(),f(C,{key:2},[a("label",Le,[l[10]||(l[10]=w("小程序标题 ",-1)),a("span",null,o(h(E)(t.miniprogram.title))+"/64 字节",1)]),c(_,{modelValue:t.miniprogram.title,"onUpdate:modelValue":g=>t.miniprogram.title=g,disabled:e.disabled,placeholder:"必填:小程序标题"},null,8,["modelValue","onUpdate:modelValue","disabled"]),l[11]||(l[11]=a("label",{class:"attachment-label"},"AppID",-1)),c(_,{modelValue:t.miniprogram.appid,"onUpdate:modelValue":g=>t.miniprogram.appid=g,disabled:e.disabled,placeholder:"必填:小程序 AppID"},null,8,["modelValue","onUpdate:modelValue","disabled"]),l[12]||(l[12]=a("label",{class:"attachment-label"},"页面路径",-1)),c(_,{modelValue:t.miniprogram.page,"onUpdate:modelValue":g=>t.miniprogram.page=g,disabled:e.disabled,placeholder:"pages/index/index,可包含查询参数"},null,8,["modelValue","onUpdate:modelValue","disabled"]),a("div",Oe,[c(d,{size:"small",icon:h(Y),loading:V.value===p,disabled:e.disabled||y.value,onClick:g=>q(p,"image")},{default:v(()=>[w(o(t.miniprogram.pic_asset_id?"更换封面":"上传小程序封面"),1)]),_:2},1032,["icon","loading","disabled","onClick"]),a("span",{class:G(B(t)?"asset-ready":"muted")},o(O(t)),3)]),l[13]||(l[13]=a("small",{class:"field-tip"},"JPG / PNG,最多 10MB。",-1))],64)):z("",!0),U.value[p]?(u(),f("div",We,o(U.value[p])+" 请重试上传,原素材未被替换。",1)):z("",!0)]))),128)),a("input",{ref_key:"fileInput",ref:r,class:"file-input",type:"file",accept:J.value,onChange:ne},null,40,Ge)]),a("aside",Fe,[a("div",Je,[l[14]||(l[14]=a("span",null,"‹",-1)),a("strong",null,o(e.employeeName||"接待员工"),1),l[15]||(l[15]=a("span",null,"···",-1))]),a("div",Re,[l[19]||(l[19]=a("div",{class:"preview-time"},"添加成功 · 预览示例",-1)),e.modelValue.text?(u(),f("div",He,[a("span",Ke,o((e.employeeName||"员").slice(0,1)),1),a("div",Ze,o(h($e)(e.modelValue.text,e.employeeName)),1)])):z("",!0),(u(!0),f(C,null,I(e.modelValue.attachments,(t,p)=>(u(),f("div",{key:p,class:"chat-row"},[a("span",qe,o((e.employeeName||"员").slice(0,1)),1),a("div",Ye,[t.msgtype==="image"?(u(),f(C,{key:0},[j(t)?(u(),f("img",{key:0,src:j(t),alt:"欢迎语图片预览"},null,8,Qe)):(u(),f("div",Xe,[c(P,null,{default:v(()=>[c(h(_e))]),_:1}),a("span",null,o(B(t)?"已保存的图片素材":"待上传图片"),1)]))],64)):t.msgtype==="link"?(u(),f(C,{key:1},[a("strong",null,o(t.link.title||"网页标题"),1),a("p",null,o(t.link.desc||"网页摘要"),1),l[16]||(l[16]=a("small",null,"网页链接",-1))],64)):t.msgtype==="miniprogram"?(u(),f(C,{key:2},[l[18]||(l[18]=a("small",null,"小程序",-1)),a("strong",null,o(t.miniprogram.title||"小程序标题"),1),j(t)?(u(),f("img",{key:0,src:j(t),alt:"小程序封面预览"},null,8,el)):(u(),f("div",ll,[c(P,null,{default:v(()=>[c(h(ve))]),_:1}),l[17]||(l[17]=a("span",null,"小程序封面",-1))]))],64)):(u(),f(C,{key:3},[c(P,{class:"file-icon"},{default:v(()=>[t.msgtype==="video"?(u(),W(h(ye),{key:0})):(u(),W(h(ke),{key:1}))]),_:2},1024),a("strong",null,o(O(t)),1),a("small",null,o(L(t.msgtype)),1)],64))])]))),128)),!e.modelValue.text&&!e.modelValue.attachments.length?(u(),f("div",tl,"编辑内容后在这里预览")):z("",!0)]),l[20]||(l[20]=a("div",{class:"phone-input"},[a("span",null,"⊕"),a("span",{class:"phone-input__blank"}),a("span",null,"☺")],-1)),l[21]||(l[21]=a("p",{class:"preview-note"},"仅为排版示意,昵称与时间会替换为实际值。",-1))])])}}}),sl=Ve(al,[["__scopeId","data-v-1e5d0e03"]]),pl=Object.freeze(Object.defineProperty({__proto__:null,default:sl},Symbol.toStringTag,{value:"Module"}));export{sl as W,cl as a,pl as b,ul as c,Ce as d,F as i,$e as p,ml as s,xe as t,rl as v,ol as w};
|