Files
wecom_it_smart_desk/frontend-agent/dist_old/assets/SessionWorkbench-BLisoDd-.js
T

2 lines
19 KiB
JavaScript
Raw 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{v as pe,r as C,x as w,d as Z,i as _,b as u,n as $,w as o,f as t,t as r,g as p,h as g,c as h,e as k,m as G,z as H,F as O,u as P,Y as ve,Z as fe,o as _e,a as me,$ as ye,y as ge,E as M,B as le,j as we,q as ke}from"./index-CnIbBo4X.js";import{a as U}from"./index-ra8jRslb.js";import{u as he}from"./agent-Dxg35leS.js";import"./conversation-BQKKYvcD.js";async function be(a){return await U.post("/itportal/automation/sessions",a)}async function $e(a){return await U.get("/itportal/automation/sessions",{params:a})}async function Se(a){return await U.get(`/itportal/automation/sessions/${a}`)}async function Ie(a,c){return await U.post(`/itportal/automation/sessions/${a}/approve`,c)}async function xe(a,c){return await U.post(`/itportal/automation/sessions/${a}/takeover`,c)}async function Te(a){return await U.get("/itportal/automation/sessions/paused",{params:{employee_id:a}})}async function Ce(a,c){return await U.post(`/itportal/automation/sessions/${a}/agent-resume`,c)}async function Ae(a,c){return await U.post(`/itportal/automation/sessions/${a}/agent-close`,c)}async function ze(a){return await U.get(`/itportal/automation/sessions/${a}/info-items`)}function ie(){return localStorage.getItem("agent_token")||""}function Ve(a){const c=ie(),d=window.location.protocol==="https:"?"wss:":"ws:",x=window.location.host;return`${d}//${x}/ws/automation/${a}?token=${encodeURIComponent(c)}`}const Be=pe("automation",()=>{const a=C([]),c=C(null),d=C(!1),x=C(null),s=C(null),l=C(!1),i=C([]),z=C([]),y=w(()=>a.value.filter(f=>["created","running","paused"].includes(f.status)));async function m(){d.value=!0;try{a.value=await $e()}finally{d.value=!1}}async function S(f){d.value=!0;try{c.value=await Se(f)}finally{d.value=!1}}async function V(f){const T=await be(f);return c.value=T,await m(),T}async function N(f,T,J){const W={decision:T,note:J};c.value=await Ie(f,W)}async function I(f,T,J){const W={agent_id:T,note:J};c.value=await xe(f,W)}async function j(f){i.value=await Te(f)}async function D(f,T){c.value=await Ce(f,{note:T})}async function B(f,T){c.value=await Ae(f,{note:T})}async function v(f){z.value=await ze(f)}function b(f){E();const T=Ve(f),J=ie(),W=new WebSocket(T,[`bearer.${J}`]);x.value=W,s.value=f,W.onopen=()=>{l.value=!0},W.onmessage=Q=>{try{const q=JSON.parse(Q.data);K(q)}catch(q){console.error("[automation WS] 消息解析失败",q)}},W.onclose=()=>{l.value=!1},W.onerror=()=>{l.value=!1}}function E(){x.value&&(x.value.close(),x.value=null),l.value=!1,s.value=null}function K(f){if(!(f.session_id&&s.value&&f.session_id!==s.value))switch(f.type){case"automation.progress":case"automation.action_required":case"automation.resolved":case"automation.takeover":case"automation.error":s.value&&S(s.value);break;case"automation.paused":s.value&&S(s.value);break;case"automation.resumed":s.value&&(S(s.value),v(s.value));break;case"automation.info_corrected":s.value&&v(s.value);break;case"automation.info_supplemented":s.value&&v(s.value);break;case"automation.timeout_closed":s.value&&S(s.value);break}}return{sessions:a,currentSession:c,loading:d,wsConnected:l,pendingSessions:y,pausedSessions:i,infoItems:z,fetchSessions:m,fetchSession:S,createSession:V,approve:N,takeover:I,fetchPausedSessions:j,agentResume:D,agentClose:B,fetchInfoItems:v,connectWs:b,disconnectWs:E}}),We={class:"card-header"},je={class:"title-row"},De={class:"action-title"},Ne={class:"action-desc"},Le={key:0,class:"action-type"},Re={key:0,class:"payload-block"},Ue={class:"payload-pre"},Me={key:1,class:"ticket-block"},Pe={class:"ticket-status"},Ee={class:"action-buttons"},Je=Z({__name:"ActionApprovalCard",props:{action:{},ticket:{}},emits:["approve","reject"],setup(a,{emit:c}){const d=a,x=c,s=C(""),l=C(!1),i=w(()=>{switch(d.action.risk_level){case"read":return"只读";case"low":return"低风险";case"high":return"高危";default:return d.action.risk_level}}),z=w(()=>{switch(d.action.risk_level){case"read":return"info";case"low":return"success";case"high":return"danger";default:return"info"}}),y=w(()=>{if(!d.ticket)return"无";switch(d.ticket.status){case"pending":return"待审批";case"approved":return"已通过";case"rejected":return"已驳回";default:return d.ticket.status}}),m=w(()=>{try{return JSON.stringify(d.action.payload,null,2)}catch{return String(d.action.payload)}});async function S(){l.value=!0;try{x("approve",{actionId:d.action.id,note:s.value||void 0})}finally{l.value=!1}}async function V(){l.value=!0;try{x("reject",{actionId:d.action.id,note:s.value||void 0})}finally{l.value=!1}}return(N,I)=>{const j=_("el-tag"),D=_("el-button"),B=_("el-input"),v=_("el-card");return u(),$(v,{class:"action-approval-card",shadow:"hover","body-style":{padding:"14px"}},{default:o(()=>[t("div",We,[t("div",je,[t("span",De,r(a.action.title),1),p(j,{type:z.value,size:"small",effect:"dark"},{default:o(()=>[g(r(i.value),1)]),_:1},8,["type"])]),t("div",Ne,r(a.action.description),1),a.action.action_type?(u(),h("div",Le,"类型:"+r(a.action.action_type),1)):k("",!0)]),a.action.payload?(u(),h("div",Re,[I[1]||(I[1]=t("div",{class:"block-label"},"动作参数",-1)),t("pre",Ue,r(m.value),1)])):k("",!0),a.ticket?(u(),h("div",Me,[p(j,{size:"small",type:a.ticket.status==="pending"?"warning":"info"},{default:o(()=>[g(" 审批渠道:"+r(a.ticket.channel==="h5"?"员工 H5 确认":"坐席审批"),1)]),_:1},8,["type"]),t("span",Pe,"状态:"+r(y.value),1)])):k("",!0),t("div",Ee,[p(D,{type:"success",loading:l.value,onClick:S},{default:o(()=>[...I[2]||(I[2]=[g("通过并执行",-1)])]),_:1},8,["loading"]),p(D,{type:"danger",loading:l.value,onClick:V},{default:o(()=>[...I[3]||(I[3]=[g("驳回(转人工)",-1)])]),_:1},8,["loading"])]),p(B,{modelValue:s.value,"onUpdate:modelValue":I[0]||(I[0]=b=>s.value=b),class:"note-input",size:"small",placeholder:"审批意见(可选)"},null,8,["modelValue"])]),_:1})}}}),Oe=G(Je,[["__scopeId","data-v-f998ce57"]]),qe={class:"actions"},Fe=Z({__name:"TakeoverPanel",props:{sessionId:{},defaultAgentId:{}},emits:["takeover"],setup(a,{emit:c}){const d=a,x=c,s=C(d.defaultAgentId||""),l=C(""),i=C(!1);async function z(){if(s.value){i.value=!0;try{x("takeover",{agentId:s.value,note:l.value||void 0})}finally{i.value=!1}}}return(y,m)=>{const S=_("el-alert"),V=_("el-input"),N=_("el-form-item"),I=_("el-form"),j=_("el-button"),D=_("el-card");return u(),$(D,{class:"takeover-panel",shadow:"never","body-style":{padding:"14px"}},{default:o(()=>[m[3]||(m[3]=t("div",{class:"panel-title"},"转人工接管",-1)),p(S,{type:"info",closable:!1,title:"接管后该会话将由人工坐席继续处理,自动化处置终止。",style:{"margin-bottom":"12px"}}),p(I,{"label-width":"80px"},{default:o(()=>[p(N,{label:"坐席ID"},{default:o(()=>[p(V,{modelValue:s.value,"onUpdate:modelValue":m[0]||(m[0]=B=>s.value=B),placeholder:"当前坐席ID(默认本机)"},null,8,["modelValue"])]),_:1}),p(N,{label:"接管说明"},{default:o(()=>[p(V,{modelValue:l.value,"onUpdate:modelValue":m[1]||(m[1]=B=>l.value=B),type:"textarea",rows:2,placeholder:"可选,说明接管原因"},null,8,["modelValue"])]),_:1})]),_:1}),t("div",qe,[p(j,{type:"primary",loading:i.value,onClick:z},{default:o(()=>[...m[2]||(m[2]=[g(" 确认接管 ",-1)])]),_:1},8,["loading"])])]),_:1})}}}),He=G(Fe,[["__scopeId","data-v-1bdb699a"]]),Ye={class:"panel-header"},Ze={class:"item-title-row"},Ge={class:"item-name"},Ke={class:"item-section"},Qe={class:"section-value"},Xe={key:0,class:"item-section"},et={class:"modifier-tags"},tt={key:1,class:"item-section"},st={class:"history-entry"},nt={class:"history-version"},at={class:"history-action-tag"},ot={class:"history-values"},lt={class:"old-value"},it={class:"new-value"},rt={key:2,class:"item-footer"},ut=Z({__name:"InformationItemPanel",props:{items:{}},setup(a){const c=a,d=C([]),x=w(()=>c.items.filter(y=>y.is_filled).length);function s(y){return y.is_locked?"danger":y.is_filled?"success":"warning"}function l(y){return y.is_locked?"已锁定":y.is_filled?"已填写":"待填写"}function i(y){switch(y){case"固定":return"danger";case"必需":return"warning";case"增量":return"primary";case"明确":return"success";case"隐含":return"info";case"复述":return"warning";default:return"info"}}function z(y){try{return new Date(y).toLocaleString("zh-CN",{hour12:!1})}catch{return y}}return(y,m)=>{const S=_("el-tag"),V=_("el-icon"),N=_("el-timeline-item"),I=_("el-timeline"),j=_("el-collapse-item"),D=_("el-collapse"),B=_("el-card");return u(),$(B,{class:"info-item-panel",shadow:"never"},{header:o(()=>[t("div",Ye,[t("span",null,"信息项("+r(a.items.length)+"",1),p(S,{size:"small",type:"info"},{default:o(()=>[g(r(x.value)+"/"+r(a.items.length)+" 已填写",1)]),_:1})])]),default:o(()=>[p(D,{modelValue:d.value,"onUpdate:modelValue":m[0]||(m[0]=v=>d.value=v)},{default:o(()=>[(u(!0),h(O,null,H(a.items,v=>(u(),$(j,{key:v.id,name:v.id},{title:o(()=>[t("div",Ze,[v.is_locked?(u(),$(V,{key:0,class:"lock-icon"},{default:o(()=>[p(P(fe))]),_:1})):k("",!0),t("span",Ge,r(v.name),1),p(S,{type:s(v),size:"small",class:"item-status-tag"},{default:o(()=>[g(r(l(v)),1)]),_:2},1032,["type"]),v.version>1?(u(),$(S,{key:1,size:"small",plain:"",class:"version-tag"},{default:o(()=>[g(" v"+r(v.version),1)]),_:2},1024)):k("",!0)])]),default:o(()=>[t("div",Ke,[m[1]||(m[1]=t("div",{class:"section-label"},"当前值",-1)),t("div",Qe,r(v.value||"(空)"),1)]),v.modifiers.length>0?(u(),h("div",Xe,[m[2]||(m[2]=t("div",{class:"section-label"},"修饰符",-1)),t("div",et,[(u(!0),h(O,null,H(v.modifiers,b=>(u(),$(S,{key:b,type:i(b),size:"small",effect:"plain"},{default:o(()=>[g(r(b),1)]),_:2},1032,["type"]))),128))])])):k("",!0),v.update_history.length>0?(u(),h("div",tt,[m[3]||(m[3]=t("div",{class:"section-label"},"变更历史",-1)),p(I,{class:"history-timeline"},{default:o(()=>[(u(!0),h(O,null,H(v.update_history,(b,E)=>(u(),$(N,{key:E,type:b.action==="correct"?"warning":"primary",timestamp:z(b.timestamp),size:"normal"},{default:o(()=>[t("div",st,[t("span",nt,"v"+r(b.version),1),t("span",at,r(b.action==="correct"?"更正":"补充"),1),t("div",ot,[t("span",lt,r(b.old_value||"(空)"),1),p(V,{class:"arrow-icon"},{default:o(()=>[p(P(ve))]),_:1}),t("span",it,r(b.new_value||"(空)"),1)])])]),_:2},1032,["type","timestamp"]))),128))]),_:2},1024)])):k("",!0),v.updated_at?(u(),h("div",rt," 最后更新:"+r(z(v.updated_at)),1)):k("",!0)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1})}}}),ct=G(ut,[["__scopeId","data-v-400334ea"]]),dt={class:"session-workbench"},pt={class:"wb-header"},vt={class:"wb-title"},ft={class:"wb-title-text"},_t={key:0,class:"timeout-warning"},mt={class:"paused-actions"},yt={key:2,class:"wb-loading"},gt={class:"overview"},wt={class:"ov-item"},kt={class:"ov-item"},ht={class:"ov-item"},bt={class:"ov-item"},$t={key:0,class:"ov-item"},St={key:0,class:"intent"},It={class:"resume-info"},xt={class:"ri-item"},Tt={class:"ri-item"},Ct={class:"ri-item"},At={class:"tl-title"},zt={class:"tl-desc"},Vt={class:"tl-status"},Bt={key:0,class:"tl-result"},Wt=Z({__name:"SessionWorkbench",props:{sessionId:{}},setup(a){const c=a,d=ke(),x=we(),s=Be(),l=w(()=>c.sessionId||d.params.id),i=w(()=>s.currentSession),z=w(()=>he().agentUserId||localStorage.getItem("agent_user_id")||""),y=w(()=>{var e;return(((e=i.value)==null?void 0:e.actions)||[]).filter(n=>m(n))});function m(e){return["done","executed","approved","rejected","skipped","failed"].includes(e.status)?!1:e.risk_level==="high"||e.risk_level==="write"||e.status==="pending"||e.status==="awaiting_approval"}_e(async()=>{if(l.value){await s.fetchSession(l.value),s.connectWs(l.value);try{await s.fetchInfoItems(l.value)}catch{}}}),me(()=>s.disconnectWs());async function S(e){if(l.value)try{await s.approve(l.value,"approve",e.note),await s.fetchSession(l.value),M.success("已通过并执行")}catch{M.error("审批失败,请重试")}}async function V(e){if(l.value)try{await s.approve(l.value,"reject",e.note),await s.fetchSession(l.value),M.success("已驳回并转人工")}catch{M.error("操作失败,请重试")}}async function N(e){if(l.value)try{await s.takeover(l.value,e.agentId,e.note),await s.fetchSession(l.value),M.success("已接管,自动化终止")}catch{M.error("接管失败,请重试")}}function I(){x.back()}const j=w(()=>{var e;return J(((e=i.value)==null?void 0:e.status)||"")}),D=w(()=>{var e,n;switch((e=i.value)==null?void 0:e.mode){case"auto":return"全自动";case"assist":return"辅助坐席";case"supervised":return"监督模式";default:return((n=i.value)==null?void 0:n.mode)||"-"}}),B=w(()=>{var e;return ee((e=i.value)==null?void 0:e.intent)}),v=w(()=>{var n;const e=(n=i.value)==null?void 0:n.auto_close_at;return e?te(e):"无"}),b=w(()=>{var R;if(!((R=i.value)!=null&&R.paused_at))return"";const e=Date.now()-new Date(i.value.paused_at).getTime(),n=Math.floor(e/36e5),L=Math.floor(e%36e5/6e4);return n>0?`已暂停 ${n}h ${L}min`:`已暂停 ${L}min`}),E=w(()=>{var n;return(n=i.value)!=null&&n.paused_at?Date.now()-new Date(i.value.paused_at).getTime()>20*36e5:!1}),K=w(()=>{var L;const e=((L=i.value)==null?void 0:L.actions)||[],n=e.find(R=>{var F;return R.id===((F=i.value)==null?void 0:F.current_action_id)});return n?`${n.title}${X(n)}`:e.length>0?`已完成 ${e.filter(R=>["success","done","executed"].includes(R.status)).length}/${e.length}`:"等待开始处置"});async function f(){if(l.value)try{await le.confirm("确认代替员工恢复此暂停会话?","坐席代恢复",{confirmButtonText:"确认恢复",cancelButtonText:"取消",type:"warning"}),await s.agentResume(l.value,"坐席代恢复"),await s.fetchSession(l.value),M.success("已代恢复,任务继续执行")}catch{}}async function T(){if(l.value)try{await le.confirm("确认关闭此暂停会话?关闭后不可恢复。","坐席关闭会话",{confirmButtonText:"确认关闭",cancelButtonText:"取消",type:"warning"}),await s.agentClose(l.value,"坐席手动关闭"),await s.fetchSession(l.value),M.success("会话已关闭")}catch{}}function J(e){switch(e){case"created":return"已创建";case"running":return"执行中";case"paused":return"已暂停";case"resolved":return"已解决";case"handoff":return"已转人工";case"error":return"异常";case"closed":return"已关闭";default:return e||"未知"}}const W=w(()=>{var e;switch((e=i.value)==null?void 0:e.status){case"resolved":return"success";case"running":return"primary";case"paused":case"handoff":return"warning";case"error":return"danger";default:return"info"}});function Q(e){switch(e.risk_level){case"read":return"只读";case"low":return"低风险";case"write":return"写操作";case"high":return"高危";default:return e.risk_level}}function q(e){switch(e.risk_level){case"read":return"info";case"low":return"success";case"write":return"warning";case"high":return"danger";default:return"info"}}function X(e){switch(e.status){case"pending":return"待审批";case"awaiting_approval":return"待审批";case"approved":return"已通过";case"rejected":return"已驳回";case"running":return"执行中";case"done":case"executed":return"已完成";case"failed":return"失败";case"skipped":return"已跳过";default:return e.status}}function re(e){return e.status==="done"||e.status==="executed"||e.status==="approved"?"success":e.status==="failed"?"danger":e.status==="rejected"||e.status==="pending"||e.status==="awaiting_approval"?"warning":"primary"}function ee(e){try{return typeof e=="string"?e:JSON.stringify(e,null,2)}catch{return String(e)}}function te(e){try{return new Date(e).toLocaleString("zh-CN",{hour12:!1})}catch{return e}}return(e,n)=>{var ne,ae,oe;const L=_("el-button"),R=_("el-tag"),F=_("el-alert"),ue=_("el-skeleton"),Y=_("el-card"),se=_("el-timeline-item"),ce=_("el-timeline"),de=_("el-empty");return u(),h("div",dt,[t("div",pt,[p(L,{text:"",icon:P(ye),onClick:I},{default:o(()=>[...n[0]||(n[0]=[g("返回",-1)])]),_:1},8,["icon"]),t("div",vt,[t("span",ft,r(((ne=i.value)==null?void 0:ne.title)||"自动化会话"),1),p(R,{type:W.value,size:"small"},{default:o(()=>[g(r(j.value),1)]),_:1},8,["type"])]),t("div",{class:ge(["wb-ws",{connected:P(s).wsConnected}])},[n[1]||(n[1]=t("span",{class:"dot"},null,-1)),g(" "+r(P(s).wsConnected?"实时连接中":"未连接"),1)],2)]),((ae=i.value)==null?void 0:ae.status)==="resolved"?(u(),$(F,{key:0,type:"success",closable:!1,title:"会话已自动解决并关闭",class:"wb-alert"})):k("",!0),((oe=i.value)==null?void 0:oe.status)==="paused"?(u(),$(F,{key:1,type:E.value?"warning":"info",closable:!1,class:"wb-alert"},{title:o(()=>[g(" 会话已暂停 · "+r(b.value)+" ",1),E.value?(u(),h("span",_t,"⚠ 接近24小时超时")):k("",!0)]),default:o(()=>[t("div",mt,[p(L,{size:"small",type:"primary",onClick:f},{default:o(()=>[...n[2]||(n[2]=[g("恢复任务",-1)])]),_:1}),p(L,{size:"small",type:"danger",plain:"",onClick:T},{default:o(()=>[...n[3]||(n[3]=[g("关闭会话",-1)])]),_:1})])]),_:1},8,["type"])):k("",!0),P(s).loading?(u(),h("div",yt,[p(ue,{rows:8,animated:""})])):i.value?(u(),h(O,{key:3},[p(Y,{class:"wb-card",shadow:"never"},{default:o(()=>[t("div",gt,[t("div",wt,[n[4]||(n[4]=t("span",{class:"ov-label"},"场景",-1)),t("span",null,r(i.value.scenario_key||"-"),1)]),t("div",kt,[n[5]||(n[5]=t("span",{class:"ov-label"},"模式",-1)),t("span",null,r(D.value),1)]),t("div",ht,[n[6]||(n[6]=t("span",{class:"ov-label"},"置信度",-1)),t("span",null,r(Math.round((i.value.confidence||0)*100))+"%",1)]),t("div",bt,[n[7]||(n[7]=t("span",{class:"ov-label"},"自动关单",-1)),t("span",null,r(v.value),1)]),i.value.paused_at?(u(),h("div",$t,[n[8]||(n[8]=t("span",{class:"ov-label"},"暂停时间",-1)),t("span",null,r(te(i.value.paused_at)),1)])):k("",!0)]),i.value.intent?(u(),h("div",St,"意图:"+r(B.value),1)):k("",!0)]),_:1}),i.value.status==="paused"?(u(),$(Y,{key:0,class:"wb-card",shadow:"never"},{header:o(()=>[...n[9]||(n[9]=[g("恢复点信息",-1)])]),default:o(()=>[t("div",It,[t("div",xt,[n[10]||(n[10]=t("span",{class:"ri-label"},"会话标题",-1)),t("span",null,r(i.value.title),1)]),t("div",Tt,[n[11]||(n[11]=t("span",{class:"ri-label"},"当前步骤",-1)),t("span",null,r(K.value),1)]),t("div",Ct,[n[12]||(n[12]=t("span",{class:"ri-label"},"暂停时长",-1)),t("span",null,r(b.value),1)])])]),_:1})):k("",!0),P(s).infoItems.length>0?(u(),$(ct,{key:1,items:P(s).infoItems},null,8,["items"])):k("",!0),p(Y,{class:"wb-card",shadow:"never"},{header:o(()=>[...n[13]||(n[13]=[g("处置进展",-1)])]),default:o(()=>[p(ce,null,{default:o(()=>[(u(!0),h(O,null,H(i.value.actions,A=>(u(),$(se,{key:A.id,type:re(A),hollow:A.status==="pending"},{default:o(()=>[t("div",At,[t("span",null,r(A.title),1),p(R,{size:"small",type:q(A)},{default:o(()=>[g(r(Q(A)),1)]),_:2},1032,["type"])]),t("div",zt,r(A.description),1),t("div",Vt,"状态:"+r(X(A)),1),A.result?(u(),h("pre",Bt,r(ee(A.result)),1)):k("",!0)]),_:2},1032,["type","hollow"]))),128)),i.value.actions.length?k("",!0):(u(),$(se,{key:0,type:"info"},{default:o(()=>[...n[14]||(n[14]=[g("暂无动作",-1)])]),_:1}))]),_:1})]),_:1}),y.value.length?(u(),$(Y,{key:2,class:"wb-card",shadow:"never"},{header:o(()=>[...n[15]||(n[15]=[g("待坐席审批(高危 / 写操作)",-1)])]),default:o(()=>[(u(!0),h(O,null,H(y.value,A=>(u(),$(Oe,{key:A.id,action:A,ticket:i.value.approval,onApprove:S,onReject:V},null,8,["action","ticket"]))),128))]),_:1})):k("",!0),p(He,{"session-id":l.value,"default-agent-id":z.value,onTakeover:N},null,8,["session-id","default-agent-id"])],64)):(u(),$(de,{key:4,description:"会话不存在或已结束"}))])}}}),Rt=G(Wt,[["__scopeId","data-v-b617dfaa"]]);export{Rt as default};