2 lines
16 KiB
JavaScript
2 lines
16 KiB
JavaScript
import{o as je,R as Ge,ap as Qe,bx as We,q as o,r,O as x,bh as Xe,P as f,s as a,v as l,D as i,K as Ye,u as y,w as Je,by as ve,a1 as Ze,bz as es,F as M,G as I,bn as ss,a0 as ts,L as v,T as d,bm as as,bA as ls,b8 as ns,b7 as is,bd as os,ac as ae,bi as us,bB as rs,ae as ds,bC as cs,br as _s,as as fs,X as vs,Y as ms,bD as ps,bj as gs,bk as ys,bt as hs,M as _,p as me,n as le}from"./.pnpm-BGZW0UGg.js";import{i as C,t as ks,_ as bs}from"./index-CeIwrh_6.js";import{u as ws}from"./usePaging-C4oc3vBq.js";import xs from"./MessageBubble-WiCZBdGB.js";import{q as Ss,S as Ts,a as Ms,b as zs,c as Es,d as Cs,e as ne,f as Ds,g as Vs,h as pe}from"./SendPanel-CFrKBAgW.js";import"./file-tQw_m7Aj.js";const $s={class:"qywx-im"},Ls={class:"im-layout"},qs={class:"col-session"},As={class:"col-header"},Bs={class:"col-actions"},Is={class:"col-filters"},Ps={class:"staff-option"},Hs={class:"staff-userid"},Ns={class:"session-list"},Us={key:0,class:"empty-tip"},Rs=["onClick"],Ks={class:"session-meta"},Fs={class:"session-top"},Os={class:"session-name"},js={class:"session-time"},Gs={class:"session-bottom"},Qs={class:"session-preview"},Ws={key:0,class:"session-staff"},Xs={key:1,class:"session-load-more"},Ys={class:"col-message"},Js={key:0,class:"no-session"},Zs={class:"col-header"},et={class:"msg-header-title"},st={class:"msg-customer-name"},tt={class:"msg-customer-sub"},at={class:"col-actions"},lt={key:0,class:"load-history"},nt={key:1,class:"load-history end-tip"},it={key:2,class:"empty-tip"},ot={class:"col-profile"},ut={class:"profile-panel"},rt={class:"profile-name"},dt={class:"profile-fields"},ct={class:"field"},_t={class:"value"},ft={class:"field"},vt=["title"],mt={key:0,class:"field"},pt={class:"value"},gt={key:1,class:"field"},yt={class:"value"},ht={class:"field"},kt={class:"value"},bt={class:"field"},wt={class:"value"},xt={class:"tasks-panel"},St={key:0,class:"empty-tip"},Tt={class:"task-top"},Mt={class:"task-time"},zt={class:"task-body"},Et={key:0,class:"task-text"},Ct={key:1,class:"task-attachments"},Dt={key:2,class:"task-error"},Vt={class:"task-actions"},$t={key:1,class:"no-session"},Lt={class:"tips"},qt={key:1,class:"mt-2 text-center"},At=je({__name:"index",setup(Bt){const z=_(null),j=_(!1),ge=me(()=>{if(!z.value)return"";const s=z.value;return s.enabled?`会话存档 SDK 不可用:${s.error||"未知错误"}`:"「会话内容存档」未启用,实时消息不可用。请在后端 pay.php 中开启 msgaudit_enabled 并配置 SDK 动态库与 RSA 私钥。"});async function ye(){try{z.value=await Ms()}catch{}}async function he(){j.value=!0;try{await zs(5,!0),C.msgSuccess("已触发一次拉取,稍后刷新可见"),await S(!0),n.value&&await X()}catch(s){C.msgError((s==null?void 0:s.msg)||(s==null?void 0:s.message)||"拉取失败")}finally{j.value=!1}}const G=_([]);async function ke(){try{const s=await Es();G.value=Array.isArray(s)?s:(s==null?void 0:s.lists)||[]}catch{G.value=[]}}const E=_({staff_userid:"",keyword:"",only_unread:0}),Q=_(!1);Ge(Q,s=>{E.value.only_unread=s?1:0});const{pager:g,getLists:W}=ws({fetchFun:Ss,params:E.value,size:30});function S(s=!1){return s||(g.page=1),W()}async function be(){const s=[...g.lists||[]];g.page+=1;try{await W();const e=g.lists||[],u=new Set(s.map(m=>m.id)),c=[...s,...e.filter(m=>!u.has(m.id))];g.lists=c}catch{}}const n=_(null),h=_([]),P=_(!1),D=_(!1),V=_(!1),H=_(0),N=_(0),k=_(null),we=me(()=>!!n.value&&n.value.session_type!==2);async function xe(s){var e;if(((e=n.value)==null?void 0:e.id)!==s.id){if(n.value=s,h.value=[],H.value=0,N.value=0,V.value=!1,await X(),await ue(),s.unread_staff>0)try{await Cs(s.id),s.unread_staff=0}catch{}U.value="profile"}}async function X(){if(n.value){P.value=!0;try{const s=await ne({session_id:n.value.id,page_no:1,page_size:30}),e=(s==null?void 0:s.lists)||[];h.value=e,e.length&&(H.value=e[0].send_time,N.value=e[e.length-1].send_time),V.value=e.length>=30,await le(),oe()}catch(s){C.msgError((s==null?void 0:s.msg)||(s==null?void 0:s.message)||"加载消息失败")}finally{P.value=!1}}}async function ie(){var e;if(!n.value||D.value)return;D.value=!0;const s=((e=k.value)==null?void 0:e.scrollHeight)||0;try{const u=await ne({session_id:n.value.id,page_no:1,page_size:30,before_time:H.value}),c=(u==null?void 0:u.lists)||[];c.length&&(H.value=c[0].send_time,h.value=[...c,...h.value]),V.value=c.length>=30,await le(),k.value&&(k.value.scrollTop=k.value.scrollHeight-s)}finally{D.value=!1}}async function Se(){if(n.value)try{const s=await ne({session_id:n.value.id,page_no:1,page_size:50,after_time:N.value}),e=(s==null?void 0:s.lists)||[];if(!e.length)return;const u=new Set(h.value.map(T=>T.id)),c=e.filter(T=>!u.has(T.id));if(!c.length)return;h.value=[...h.value,...c],N.value=c[c.length-1].send_time;const m=k.value;(m?m.scrollHeight-m.scrollTop-m.clientHeight<120:!0)&&(await le(),oe())}catch{}}function Te(){const s=k.value;s&&s.scrollTop<40&&V.value&&!D.value&&ie()}function oe(){k.value&&(k.value.scrollTop=k.value.scrollHeight)}async function Me(s){if(n.value)try{await Ds({sender_userid:n.value.staff_userid,external_userids:[n.value.external_userid],msg_payload:s,chat_type:"single"}),C.msgSuccess("已创建群发任务,员工手机确认后送达客户"),await ue(),U.value="tasks"}catch(e){C.msgError((e==null?void 0:e.msg)||(e==null?void 0:e.message)||"发送失败")}}const U=_("profile"),R=_([]),Y=_(!1);async function ue(){if(n.value){Y.value=!0;try{const s=await Vs({sender_userid:n.value.staff_userid,page_no:1,page_size:50}),e=(s==null?void 0:s.lists)||[];R.value=e.filter(u=>(u.external_userids||[]).includes(n.value.external_userid))}finally{Y.value=!1}}}function ze(s){return{0:"待提交",1:"已提交",2:"已送达",3:"失败"}[s]??`状态${s}`}function Ee(s){return{0:"info",1:"primary",2:"success",3:"danger"}[s]??"info"}function Ce(s){return{image:"图片",video:"视频",file:"文件",link:"链接",miniprogram:"小程序"}[s]||s}const J=_(!1),$=_(!1),re=_(0),b=_(null);async function De(s){re.value=s.id,b.value={detail_list:[],next_cursor:""},J.value=!0,$.value=!0;try{const e=await pe(s.id,"");b.value={detail_list:(e==null?void 0:e.detail_list)||[],next_cursor:(e==null?void 0:e.next_cursor)||"",task:e==null?void 0:e.task}}catch(e){C.msgError((e==null?void 0:e.msg)||(e==null?void 0:e.message)||"加载失败")}finally{$.value=!1}}async function Ve(){var s;if((s=b.value)!=null&&s.next_cursor){$.value=!0;try{const e=await pe(re.value,b.value.next_cursor);b.value={detail_list:[...b.value.detail_list,...(e==null?void 0:e.detail_list)||[]],next_cursor:(e==null?void 0:e.next_cursor)||"",task:e==null?void 0:e.task}}finally{$.value=!1}}}function $e(s){switch(s){case 0:return"未发送";case 1:return"已送达";case 2:return"被拒收";case 3:return"已送达(未读)";default:return`状态${s}`}}function Le(s){return s===1?"success":s===2?"warning":s===3?"primary":"info"}function L(s){var e;return(e=s.customer)!=null&&e.name?s.customer.name:s.session_type===2?`群聊 ${s.roomid.slice(-6)}`:s.external_userid||"未命名客户"}function qe(s){const e=s.last_msg_summary||"",u=s.last_msg_type;return e||(u==="image"?"[图片]":u==="video"?"[视频]":u==="voice"?"[语音]":u==="file"?"[文件]":u==="link"?"[链接]":u==="weapp"?"[小程序]":u==="chatrecord"?"[聊天记录]":u?`[${u}]`:"暂无消息")}function Z(s){return s?ks(s*1e3,"yyyy-mm-dd hh:MM"):"-"}function Ae(s){if(!s)return"";const u=Math.floor(Date.now()/1e3)-s;if(u<60)return`${u}秒前`;if(u<3600)return`${Math.floor(u/60)}分前`;if(u<86400)return`${Math.floor(u/3600)}小时前`;const c=new Date(s*1e3);return`${c.getMonth()+1}-${c.getDate()}`}let ee=null,se=null;return Qe(async()=>{await Promise.all([ye(),ke()]),await S(),ee=window.setInterval(()=>{W({silent:!0}).catch(()=>{})},15e3),se=window.setInterval(()=>{Se()},8e3)}),We(()=>{ee&&window.clearInterval(ee),se&&window.clearInterval(se)}),(s,e)=>{var ce,_e;const u=Xe,c=Je,m=Ye,K=Ze,T=ts,Be=ss,Ie=as,Pe=is,He=os,F=rs,Ne=cs,q=_s,de=vs,Ue=ms,Re=ps,O=ys,Ke=gs,Fe=hs,te=us;return o(),r("div",$s,[z.value&&!z.value.available?(o(),x(u,{key:0,title:ge.value,type:"warning",closable:!1,"show-icon":"",class:"archive-warning"},null,8,["title"])):f("",!0),a("div",Ls,[a("section",qs,[a("header",As,[e[11]||(e[11]=a("div",{class:"col-title"},"会话",-1)),a("div",Bs,[l(K,{content:"刷新"},{default:i(()=>[l(m,{size:"small",link:"",loading:y(g).loading,onClick:e[0]||(e[0]=t=>S(!0))},{default:i(()=>[l(c,null,{default:i(()=>[l(y(ve))]),_:1})]),_:1},8,["loading"])]),_:1}),l(K,{content:"手动拉一次存档"},{default:i(()=>{var t;return[l(m,{size:"small",link:"",disabled:!((t=z.value)!=null&&t.available),loading:j.value,onClick:he},{default:i(()=>[l(c,null,{default:i(()=>[l(y(es))]),_:1})]),_:1},8,["disabled","loading"])]}),_:1})])]),a("div",Is,[l(Ie,{modelValue:E.value.staff_userid,"onUpdate:modelValue":e[1]||(e[1]=t=>E.value.staff_userid=t),placeholder:"全部员工",clearable:"",filterable:"",size:"default",style:{width:"100%"},onChange:e[2]||(e[2]=t=>S())},{default:i(()=>[(o(!0),r(M,null,I(G.value,t=>(o(),x(Be,{key:t.userid,label:(t.name||t.userid)+"("+t.userid+")",value:t.userid},{default:i(()=>[a("div",Ps,[l(T,{size:20,src:t.avatar},{default:i(()=>[v(d((t.name||"").slice(-2)),1)]),_:2},1032,["src"]),a("span",null,d(t.name),1),a("span",Hs,d(t.userid),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue"]),l(Pe,{modelValue:E.value.keyword,"onUpdate:modelValue":e[3]||(e[3]=t=>E.value.keyword=t),placeholder:"搜索客户或消息",clearable:"",size:"default",onKeyup:e[4]||(e[4]=ns(t=>S(),["enter"])),onClear:e[5]||(e[5]=t=>S())},{prefix:i(()=>[l(c,null,{default:i(()=>[l(y(ls))]),_:1})]),_:1},8,["modelValue"]),l(He,{modelValue:Q.value,"onUpdate:modelValue":e[6]||(e[6]=t=>Q.value=t),onChange:e[7]||(e[7]=t=>S())},{default:i(()=>[...e[12]||(e[12]=[v(" 仅未读 ",-1)])]),_:1},8,["modelValue"])]),ae((o(),r("div",Ns,[!y(g).lists.length&&!y(g).loading?(o(),r("div",Us,[l(F,{description:"暂无会话","image-size":80})])):f("",!0),(o(!0),r(M,null,I(y(g).lists,t=>{var p;return o(),r("div",{key:t.id,class:ds(["session-item",{active:((p=n.value)==null?void 0:p.id)===t.id}]),onClick:w=>xe(t)},[l(Ne,{value:t.unread_staff,hidden:!t.unread_staff,max:99},{default:i(()=>{var w;return[l(T,{size:42,src:((w=t.customer)==null?void 0:w.avatar)||""},{default:i(()=>[v(d(L(t).slice(-2)),1)]),_:2},1032,["src"])]}),_:2},1032,["value","hidden"]),a("div",Ks,[a("div",Fs,[a("span",Os,d(L(t)),1),a("span",js,d(Ae(t.last_msg_time)),1)]),a("div",Gs,[a("span",Qs,d(qe(t)),1),t.session_type===2?(o(),x(q,{key:0,size:"small",type:"info",class:"session-tag"},{default:i(()=>[...e[13]||(e[13]=[v(" 群 ",-1)])]),_:1})):f("",!0)]),t.staff?(o(),r("div",Ws," 员工: "+d(t.staff.name||t.staff_userid),1)):f("",!0)])],10,Rs)}),128)),y(g).lists.length<y(g).count?(o(),r("div",Xs,[l(m,{link:"",type:"primary",onClick:be},{default:i(()=>[...e[14]||(e[14]=[v(" 加载更多 ",-1)])]),_:1})])):f("",!0)])),[[te,y(g).loading]])]),a("section",Ys,[n.value?(o(),r(M,{key:1},[a("header",Zs,[a("div",et,[a("div",st,d(L(n.value)),1),a("div",tt,[(ce=n.value.customer)!=null&&ce.corp_name?(o(),r(M,{key:0},[v(d(n.value.customer.corp_name)+" · ",1)],64)):f("",!0),v(" 代发员工: "+d(((_e=n.value.staff)==null?void 0:_e.name)||n.value.staff_userid)+" ",1),n.value.session_type===2?(o(),x(q,{key:1,size:"small",type:"info",class:"ml-1"},{default:i(()=>[...e[15]||(e[15]=[v(" 群聊 ",-1)])]),_:1})):f("",!0)])]),a("div",at,[l(K,{content:"刷新消息"},{default:i(()=>[l(m,{link:"",size:"small",loading:P.value,onClick:e[8]||(e[8]=t=>X())},{default:i(()=>[l(c,null,{default:i(()=>[l(y(ve))]),_:1})]),_:1},8,["loading"])]),_:1})])]),a("div",{ref_key:"messageListRef",ref:k,class:"message-list",onScroll:Te},[V.value?(o(),r("div",lt,[l(m,{link:"",type:"primary",loading:D.value,onClick:ie},{default:i(()=>[...e[16]||(e[16]=[v(" 加载更早的消息 ",-1)])]),_:1},8,["loading"])])):h.value.length?(o(),r("div",nt," —— 没有更早的消息了 —— ")):f("",!0),!h.value.length&&!P.value?(o(),r("div",it,[l(F,{description:"暂无消息","image-size":80})])):f("",!0),(o(!0),r(M,null,I(h.value,t=>(o(),x(xs,{key:t.id,message:t},null,8,["message"]))),128))],544),l(Ts,{"can-send-message":we.value,onSend:Me},null,8,["can-send-message"])],64)):(o(),r("div",Js,[l(F,{description:"选择左侧会话查看消息"},{image:i(()=>[l(c,{size:60,color:"#ccc"},{default:i(()=>[l(y(fs))]),_:1})]),_:1})]))]),a("section",ot,[n.value?(o(),x(Ue,{key:0,modelValue:U.value,"onUpdate:modelValue":e[9]||(e[9]=t=>U.value=t),class:"profile-tabs"},{default:i(()=>[l(de,{label:"客户资料",name:"profile"},{default:i(()=>{var t,p,w,A,B;return[a("div",ut,[l(T,{size:72,src:((t=n.value.customer)==null?void 0:t.avatar)||""},{default:i(()=>[v(d(L(n.value).slice(-2)),1)]),_:1},8,["src"]),a("div",rt,d(L(n.value)),1),a("div",dt,[a("div",ct,[e[17]||(e[17]=a("span",{class:"label"},"客户类型",-1)),a("span",_t,d(((p=n.value.customer)==null?void 0:p.type)===2?"@微信":"@企业微信"),1)]),a("div",ft,[e[18]||(e[18]=a("span",{class:"label"},"外部 ID",-1)),a("span",{class:"value ellipsis",title:n.value.external_userid},d(n.value.external_userid||"-"),9,vt)]),(w=n.value.customer)!=null&&w.corp_name?(o(),r("div",mt,[e[19]||(e[19]=a("span",{class:"label"},"所属企业",-1)),a("span",pt,d(n.value.customer.corp_name),1)])):f("",!0),(A=n.value.customer)!=null&&A.gender?(o(),r("div",gt,[e[20]||(e[20]=a("span",{class:"label"},"性别",-1)),a("span",yt,d(n.value.customer.gender===1?"男":n.value.customer.gender===2?"女":"未知"),1)])):f("",!0),a("div",ht,[e[21]||(e[21]=a("span",{class:"label"},"代发员工",-1)),a("span",kt,d(((B=n.value.staff)==null?void 0:B.name)||n.value.staff_userid),1)]),a("div",bt,[e[22]||(e[22]=a("span",{class:"label"},"最近消息",-1)),a("span",wt,d(Z(n.value.last_msg_time)),1)])])])]}),_:1}),l(de,{label:`发送任务(${R.value.length})`,name:"tasks"},{default:i(()=>[ae((o(),r("div",xt,[R.value.length?f("",!0):(o(),r("div",St,[l(F,{description:"暂无任务","image-size":80})])),(o(!0),r(M,null,I(R.value,t=>{var p,w,A,B;return o(),r("div",{key:t.id,class:"task-item"},[a("div",Tt,[l(q,{type:Ee(t.status),size:"small"},{default:i(()=>[v(d(ze(t.status)),1)]),_:2},1032,["type"]),a("span",Mt,d(Z(t.create_time)),1)]),a("div",zt,[(w=(p=t.msg_payload)==null?void 0:p.text)!=null&&w.content?(o(),r("div",Et,d(t.msg_payload.text.content),1)):f("",!0),(B=(A=t.msg_payload)==null?void 0:A.attachments)!=null&&B.length?(o(),r("div",Ct,[e[23]||(e[23]=v(" 附件: ",-1)),(o(!0),r(M,null,I(t.msg_payload.attachments,(fe,Oe)=>(o(),x(q,{key:Oe,size:"small",type:"info",class:"mr-1"},{default:i(()=>[v(d(Ce(fe.msgtype)),1)]),_:2},1024))),128))])):f("",!0),t.error?(o(),r("div",Dt,d(t.error),1)):f("",!0)]),a("div",Vt,[l(m,{size:"small",link:"",type:"primary",onClick:fe=>De(t)},{default:i(()=>[...e[24]||(e[24]=[v(" 送达详情 ",-1)])]),_:1},8,["onClick"])])])}),128))])),[[te,Y.value]])]),_:1},8,["label"])]),_:1},8,["modelValue"])):(o(),r("div",$t,[a("div",Lt,[e[25]||(e[25]=a("h4",null,"企业微信 IM",-1)),e[26]||(e[26]=a("p",null,"选择一个会话查看客户资料与群发任务",-1)),l(Re),e[27]||(e[27]=a("p",{class:"text-sm"}," · 实时消息依赖「会话内容存档」,由后台计划任务每 30 秒拉取一次。 ",-1)),e[28]||(e[28]=a("p",{class:"text-sm"}," · 发送使用「企业群发」能力,员工手机端确认后送达客户。 ",-1))])]))])]),l(Fe,{modelValue:J.value,"onUpdate:modelValue":e[10]||(e[10]=t=>J.value=t),title:"群发送达详情",width:"640px",top:"8vh"},{default:i(()=>{var t;return[b.value?ae((o(),x(Ke,{key:0,data:b.value.detail_list,border:"",size:"small","max-height":"420"},{default:i(()=>[l(O,{label:"外部客户",prop:"external_userid","min-width":"200"}),l(O,{label:"员工",prop:"userid","min-width":"120"}),l(O,{label:"状态",width:"120"},{default:i(({row:p})=>[l(q,{type:Le(p.status),size:"small"},{default:i(()=>[v(d($e(p.status)),1)]),_:2},1032,["type"])]),_:1}),l(O,{label:"送达时间",width:"160"},{default:i(({row:p})=>[v(d(p.send_time?Z(p.send_time):"-"),1)]),_:1})]),_:1},8,["data"])),[[te,$.value]]):f("",!0),(t=b.value)!=null&&t.next_cursor?(o(),r("div",qt,[l(m,{link:"",type:"primary",onClick:Ve},{default:i(()=>[...e[29]||(e[29]=[v(" 加载更多 ",-1)])]),_:1})])):f("",!0)]}),_:1},8,["modelValue"])])}}}),Kt=bs(At,[["__scopeId","data-v-2107a11f"]]);export{Kt as default};
|