Files
wecom_it_smart_desk/frontend-agent/dist.bak/assets/SessionWorkbench-Caqy0KdE.js
Simon bea288e414 feat: 2026-07-11 全量更新 - 代办集成+会议室预定+知识迭代修复+UI统一+Bug修复
== 已部署上线 (9项) ==
- 代办事项真实数据源集成 (企微审批API 8bug修复链)
- H5/坐席端 Logo样式统一+绿色背景
- 视频引导页修复 (localStorage key v2)
- 坐席端 v9 Vue版本修复 (ElMessage._context)
- 截图按钮 v10 修复 (getDisplayMedia user gesture)
- 扫码样式恢复+H5扫码登录跳转修复
- H5截图快捷键提示

== 代码完成待部署 (3项) ==
- 知识迭代3Bug修复 (#8 POST端点/#7 MERGE幂等/#6 过期检查)
- 会议室预定-小鱼易联终端 (40文件, 40/40测试通过)
- IT资产升级审批推送 (asset_service.py)

== 需求文档 (2项) ==
- 坐席端AI辅助消息框-PRD (4项新功能确认)
- 坐席端布局优化建议 v2.0 (7天计划)

== 新增文档 ==
- 日报-2026-07-11.md
- 知识迭代Bug修复报告-20260711.md
- 会议室预定-部署指南.md
- CHANGELOG.md 更新

== 测试 ==
- test_todo_integration.py: 40/40
- test_meetingroom.py: 40/40
- test_bugfix_ki_suggestions.py: 21/21
2026-07-11 23:13:10 +08:00

2 lines
12 KiB
JavaScript

import{v as oe,r as S,x as g,d as M,b as v,n as V,w as u,f as t,t as d,g as p,h as b,c as x,e as j,i as f,m as E,o as le,a as re,u as B,Y as ie,y as ue,F as J,z as Y,E as L,j as ce,q as de}from"./index-B1u3nieA.js";import{a as U}from"./index-ChNUjLLo.js";import{u as pe}from"./agent-WRYR5BAs.js";import"./conversation-C4tqOoff.js";async function ve(a){return await U.post("/itportal/automation/sessions",a)}async function fe(a){return await U.get("/itportal/automation/sessions",{params:a})}async function _e(a){return await U.get(`/itportal/automation/sessions/${a}`)}async function me(a,c){return await U.post(`/itportal/automation/sessions/${a}/approve`,c)}async function ye(a,c){return await U.post(`/itportal/automation/sessions/${a}/takeover`,c)}function G(){return localStorage.getItem("agent_token")||""}function ge(a){const c=G(),l=window.location.protocol==="https:"?"wss:":"ws:",w=window.location.host;return`${l}//${w}/ws/automation/${a}?token=${encodeURIComponent(c)}`}const we=oe("automation",()=>{const a=S([]),c=S(null),l=S(!1),w=S(null),n=S(null),s=S(!1),r=g(()=>a.value.filter(i=>["created","running","paused"].includes(i.status)));async function $(){l.value=!0;try{a.value=await fe()}finally{l.value=!1}}async function A(i){l.value=!0;try{c.value=await _e(i)}finally{l.value=!1}}async function y(i){const _=await ve(i);return c.value=_,await $(),_}async function W(i,_,I){const k={decision:_,note:I};c.value=await me(i,k)}async function C(i,_,I){const k={agent_id:_,note:I};c.value=await ye(i,k)}function z(i){m();const _=ge(i),I=G(),k=new WebSocket(_,[`bearer.${I}`]);w.value=k,n.value=i,k.onopen=()=>{s.value=!0},k.onmessage=R=>{try{const N=JSON.parse(R.data);T(N)}catch(N){console.error("[automation WS] 消息解析失败",N)}},k.onclose=()=>{s.value=!1},k.onerror=()=>{s.value=!1}}function m(){w.value&&(w.value.close(),w.value=null),s.value=!1,n.value=null}function T(i){if(!(i.session_id&&n.value&&i.session_id!==n.value))switch(i.type){case"automation.progress":case"automation.action_required":case"automation.resolved":case"automation.takeover":case"automation.error":n.value&&A(n.value);break}}return{sessions:a,currentSession:c,loading:l,wsConnected:s,pendingSessions:r,fetchSessions:$,fetchSession:A,createSession:y,approve:W,takeover:C,connectWs:z,disconnectWs:m}}),ke={class:"card-header"},he={class:"title-row"},be={class:"action-title"},Se={class:"action-desc"},xe={key:0,class:"action-type"},Ie={key:0,class:"payload-block"},$e={class:"payload-pre"},Ae={key:1,class:"ticket-block"},Ce={class:"ticket-status"},Te={class:"action-buttons"},Ve=M({__name:"ActionApprovalCard",props:{action:{},ticket:{}},emits:["approve","reject"],setup(a,{emit:c}){const l=a,w=c,n=S(""),s=S(!1),r=g(()=>{switch(l.action.risk_level){case"read":return"只读";case"low":return"低风险";case"high":return"高危";default:return l.action.risk_level}}),$=g(()=>{switch(l.action.risk_level){case"read":return"info";case"low":return"success";case"high":return"danger";default:return"info"}}),A=g(()=>{if(!l.ticket)return"无";switch(l.ticket.status){case"pending":return"待审批";case"approved":return"已通过";case"rejected":return"已驳回";default:return l.ticket.status}}),y=g(()=>{try{return JSON.stringify(l.action.payload,null,2)}catch{return String(l.action.payload)}});async function W(){s.value=!0;try{w("approve",{actionId:l.action.id,note:n.value||void 0})}finally{s.value=!1}}async function C(){s.value=!0;try{w("reject",{actionId:l.action.id,note:n.value||void 0})}finally{s.value=!1}}return(z,m)=>{const T=f("el-tag"),i=f("el-button"),_=f("el-input"),I=f("el-card");return v(),V(I,{class:"action-approval-card",shadow:"hover","body-style":{padding:"14px"}},{default:u(()=>[t("div",ke,[t("div",he,[t("span",be,d(a.action.title),1),p(T,{type:$.value,size:"small",effect:"dark"},{default:u(()=>[b(d(r.value),1)]),_:1},8,["type"])]),t("div",Se,d(a.action.description),1),a.action.action_type?(v(),x("div",xe,"类型:"+d(a.action.action_type),1)):j("",!0)]),a.action.payload?(v(),x("div",Ie,[m[1]||(m[1]=t("div",{class:"block-label"},"动作参数",-1)),t("pre",$e,d(y.value),1)])):j("",!0),a.ticket?(v(),x("div",Ae,[p(T,{size:"small",type:a.ticket.status==="pending"?"warning":"info"},{default:u(()=>[b(" 审批渠道:"+d(a.ticket.channel==="h5"?"员工 H5 确认":"坐席审批"),1)]),_:1},8,["type"]),t("span",Ce,"状态:"+d(A.value),1)])):j("",!0),t("div",Te,[p(i,{type:"success",loading:s.value,onClick:W},{default:u(()=>[...m[2]||(m[2]=[b("通过并执行",-1)])]),_:1},8,["loading"]),p(i,{type:"danger",loading:s.value,onClick:C},{default:u(()=>[...m[3]||(m[3]=[b("驳回(转人工)",-1)])]),_:1},8,["loading"])]),p(_,{modelValue:n.value,"onUpdate:modelValue":m[0]||(m[0]=k=>n.value=k),class:"note-input",size:"small",placeholder:"审批意见(可选)"},null,8,["modelValue"])]),_:1})}}}),je=E(Ve,[["__scopeId","data-v-f998ce57"]]),We={class:"actions"},ze=M({__name:"TakeoverPanel",props:{sessionId:{},defaultAgentId:{}},emits:["takeover"],setup(a,{emit:c}){const l=a,w=c,n=S(l.defaultAgentId||""),s=S(""),r=S(!1);async function $(){if(n.value){r.value=!0;try{w("takeover",{agentId:n.value,note:s.value||void 0})}finally{r.value=!1}}}return(A,y)=>{const W=f("el-alert"),C=f("el-input"),z=f("el-form-item"),m=f("el-form"),T=f("el-button"),i=f("el-card");return v(),V(i,{class:"takeover-panel",shadow:"never","body-style":{padding:"14px"}},{default:u(()=>[y[3]||(y[3]=t("div",{class:"panel-title"},"转人工接管",-1)),p(W,{type:"info",closable:!1,title:"接管后该会话将由人工坐席继续处理,自动化处置终止。",style:{"margin-bottom":"12px"}}),p(m,{"label-width":"80px"},{default:u(()=>[p(z,{label:"坐席ID"},{default:u(()=>[p(C,{modelValue:n.value,"onUpdate:modelValue":y[0]||(y[0]=_=>n.value=_),placeholder:"当前坐席ID(默认本机)"},null,8,["modelValue"])]),_:1}),p(z,{label:"接管说明"},{default:u(()=>[p(C,{modelValue:s.value,"onUpdate:modelValue":y[1]||(y[1]=_=>s.value=_),type:"textarea",rows:2,placeholder:"可选,说明接管原因"},null,8,["modelValue"])]),_:1})]),_:1}),t("div",We,[p(T,{type:"primary",loading:r.value,onClick:$},{default:u(()=>[...y[2]||(y[2]=[b(" 确认接管 ",-1)])]),_:1},8,["loading"])])]),_:1})}}}),Le=E(ze,[["__scopeId","data-v-1bdb699a"]]),Ne={class:"session-workbench"},Ue={class:"wb-header"},Be={class:"wb-title"},Re={class:"wb-title-text"},De={key:1,class:"wb-loading"},Je={class:"overview"},Me={class:"ov-item"},Ee={class:"ov-item"},Oe={class:"ov-item"},Pe={class:"ov-item"},qe={key:0,class:"intent"},Fe={class:"tl-title"},He={class:"tl-desc"},Ye={class:"tl-status"},Ge={key:0,class:"tl-result"},Ke=M({__name:"SessionWorkbench",props:{sessionId:{}},setup(a){const c=a,l=de(),w=ce(),n=we(),s=g(()=>c.sessionId||l.params.id),r=g(()=>n.currentSession),$=g(()=>pe().agentUserId||localStorage.getItem("agent_user_id")||""),A=g(()=>{var e;return(((e=r.value)==null?void 0:e.actions)||[]).filter(o=>y(o))});function y(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"}le(async()=>{s.value&&(await n.fetchSession(s.value),n.connectWs(s.value))}),re(()=>n.disconnectWs());async function W(e){if(s.value)try{await n.approve(s.value,"approve",e.note),await n.fetchSession(s.value),L.success("已通过并执行")}catch{L.error("审批失败,请重试")}}async function C(e){if(s.value)try{await n.approve(s.value,"reject",e.note),await n.fetchSession(s.value),L.success("已驳回并转人工")}catch{L.error("操作失败,请重试")}}async function z(e){if(s.value)try{await n.takeover(s.value,e.agentId,e.note),await n.fetchSession(s.value),L.success("已接管,自动化终止")}catch{L.error("接管失败,请重试")}}function m(){w.back()}const T=g(()=>{var e;return k(((e=r.value)==null?void 0:e.status)||"")}),i=g(()=>{var e,o;switch((e=r.value)==null?void 0:e.mode){case"auto":return"全自动";case"assist":return"辅助坐席";case"supervised":return"监督模式";default:return((o=r.value)==null?void 0:o.mode)||"-"}}),_=g(()=>{var e;return O((e=r.value)==null?void 0:e.intent)}),I=g(()=>{var o;const e=(o=r.value)==null?void 0:o.auto_close_at;return e?Z(e):"无"});function k(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 R=g(()=>{var e;switch((e=r.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 N(e){switch(e.risk_level){case"read":return"只读";case"low":return"低风险";case"write":return"写操作";case"high":return"高危";default:return e.risk_level}}function K(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 Q(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 X(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 O(e){try{return typeof e=="string"?e:JSON.stringify(e,null,2)}catch{return String(e)}}function Z(e){try{return new Date(e).toLocaleString("zh-CN",{hour12:!1})}catch{return e}}return(e,o)=>{var F,H;const ee=f("el-button"),P=f("el-tag"),te=f("el-alert"),ne=f("el-skeleton"),D=f("el-card"),q=f("el-timeline-item"),se=f("el-timeline"),ae=f("el-empty");return v(),x("div",Ne,[t("div",Ue,[p(ee,{text:"",icon:B(ie),onClick:m},{default:u(()=>[...o[0]||(o[0]=[b("返回",-1)])]),_:1},8,["icon"]),t("div",Be,[t("span",Re,d(((F=r.value)==null?void 0:F.title)||"自动化会话"),1),p(P,{type:R.value,size:"small"},{default:u(()=>[b(d(T.value),1)]),_:1},8,["type"])]),t("div",{class:ue(["wb-ws",{connected:B(n).wsConnected}])},[o[1]||(o[1]=t("span",{class:"dot"},null,-1)),b(" "+d(B(n).wsConnected?"实时连接中":"未连接"),1)],2)]),((H=r.value)==null?void 0:H.status)==="resolved"?(v(),V(te,{key:0,type:"success",closable:!1,title:"会话已自动解决并关闭",class:"wb-alert"})):j("",!0),B(n).loading?(v(),x("div",De,[p(ne,{rows:8,animated:""})])):r.value?(v(),x(J,{key:2},[p(D,{class:"wb-card",shadow:"never"},{default:u(()=>[t("div",Je,[t("div",Me,[o[2]||(o[2]=t("span",{class:"ov-label"},"场景",-1)),t("span",null,d(r.value.scenario_key||"-"),1)]),t("div",Ee,[o[3]||(o[3]=t("span",{class:"ov-label"},"模式",-1)),t("span",null,d(i.value),1)]),t("div",Oe,[o[4]||(o[4]=t("span",{class:"ov-label"},"置信度",-1)),t("span",null,d(Math.round((r.value.confidence||0)*100))+"%",1)]),t("div",Pe,[o[5]||(o[5]=t("span",{class:"ov-label"},"自动关单",-1)),t("span",null,d(I.value),1)])]),r.value.intent?(v(),x("div",qe,"意图:"+d(_.value),1)):j("",!0)]),_:1}),p(D,{class:"wb-card",shadow:"never"},{header:u(()=>[...o[6]||(o[6]=[b("处置进展",-1)])]),default:u(()=>[p(se,null,{default:u(()=>[(v(!0),x(J,null,Y(r.value.actions,h=>(v(),V(q,{key:h.id,type:X(h),hollow:h.status==="pending"},{default:u(()=>[t("div",Fe,[t("span",null,d(h.title),1),p(P,{size:"small",type:K(h)},{default:u(()=>[b(d(N(h)),1)]),_:2},1032,["type"])]),t("div",He,d(h.description),1),t("div",Ye,"状态:"+d(Q(h)),1),h.result?(v(),x("pre",Ge,d(O(h.result)),1)):j("",!0)]),_:2},1032,["type","hollow"]))),128)),r.value.actions.length?j("",!0):(v(),V(q,{key:0,type:"info"},{default:u(()=>[...o[7]||(o[7]=[b("暂无动作",-1)])]),_:1}))]),_:1})]),_:1}),A.value.length?(v(),V(D,{key:0,class:"wb-card",shadow:"never"},{header:u(()=>[...o[8]||(o[8]=[b("待坐席审批(高危 / 写操作)",-1)])]),default:u(()=>[(v(!0),x(J,null,Y(A.value,h=>(v(),V(je,{key:h.id,action:h,ticket:r.value.approval,onApprove:W,onReject:C},null,8,["action","ticket"]))),128))]),_:1})):j("",!0),p(Le,{"session-id":s.value,"default-agent-id":$.value,onTakeover:z},null,8,["session-id","default-agent-id"])],64)):(v(),V(ae,{key:3,description:"会话不存在或已结束"}))])}}}),tt=E(Ke,[["__scopeId","data-v-de7dae2d"]]);export{tt as default};