Files
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
15 KiB
JavaScript

import{d as W,b as d,c as p,a3 as se,e as g,f as t,w as l,i as C,a1 as ie,a0 as oe,t as b,n as _,a8 as ue,U as S,g as w,T as H,j as K,o as re,V as de,r as x,k as ce,a9 as fe,y as D,E as y}from"./index-BYp6OBwf.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as ge,t as $,v as ve,w as ye,x as pe}from"./admin-QG1MRyaa.js";import"./index-CMW9Tl_L.js";const me={class:"integration-name"},_e={class:"integration-status"},be={class:"integration-detail"},ke={key:0,class:"config-info"},we={class:"config-info"},Ue={key:0,class:"config-info"},Ie={class:"config-info"},Ve={key:0,class:"config-info"},Ke={class:"config-info"},Ae={class:"integration-actions"},Ce=W({__name:"IntegrationCard",props:{integration:{},icon:{},iconBg:{},iconColor:{}},emits:["configure","test","view"],setup(i){const P=i,c=H(()=>{switch(P.integration.status){case"connected":return"success";case"partial":return"warning";case"disconnected":return"info";case"pending":return"info";default:return"info"}}),m=H(()=>{switch(P.integration.status){case"connected":return"已连接";case"partial":return"部分集成";case"disconnected":return"未连接";case"pending":return"待确认";default:return P.integration.status}});return(u,r)=>{const o=K("el-icon"),s=K("el-tag"),k=K("el-button");return d(),p("div",{class:se(["integration-card",{"is-configurable":i.integration.configurable}])},[g("div",{class:"integration-icon",style:oe({background:i.iconBg,color:i.iconColor})},[t(o,{size:22},{default:l(()=>[(d(),C(ie(i.icon)))]),_:1})],4),g("div",me,b(i.integration.name),1),g("div",_e,[t(s,{type:c.value,size:"small",effect:"dark"},{default:l(()=>[_(b(m.value),1)]),_:1},8,["type"])]),g("div",be,[ue(u.$slots,"detail",{},()=>[i.integration.configurable&&i.integration.config?(d(),p(S,{key:0},[i.integration.config_type==="url_key"||!i.integration.config_type?(d(),p(S,{key:0},[i.integration.config.api_url?(d(),p("div",ke,"API: "+b(i.integration.config.api_url),1)):w("",!0),g("div",we,b(i.integration.config.api_key_set?"密钥已配置":"密钥未配置"),1)],64)):i.integration.config_type==="access_key"?(d(),p(S,{key:1},[i.integration.config.base_url?(d(),p("div",Ue,"URL: "+b(i.integration.config.base_url),1)):w("",!0),g("div",Ie,b(i.integration.config.access_key_id_set?"AccessKey 已配置":"AccessKey 未配置"),1)],64)):i.integration.config_type==="account_password"?(d(),p(S,{key:2},[i.integration.config.base_url?(d(),p("div",Ve,"URL: "+b(i.integration.config.base_url),1)):w("",!0),g("div",Ke,b(i.integration.config.api_account_set?"账号已配置":"账号未配置"),1)],64)):w("",!0)],64)):w("",!0)],!0)]),g("div",Ae,[i.integration.configurable?(d(),C(k,{key:0,size:"small",type:"primary",onClick:r[0]||(r[0]=U=>u.$emit("configure",i.integration))},{default:l(()=>[...r[3]||(r[3]=[_(" 配置 ",-1)])]),_:1})):w("",!0),i.integration.configurable?(d(),C(k,{key:1,size:"small",onClick:r[1]||(r[1]=U=>u.$emit("test",i.integration))},{default:l(()=>[...r[4]||(r[4]=[_(" 测试 ",-1)])]),_:1})):(d(),C(k,{key:2,size:"small",onClick:r[2]||(r[2]=U=>u.$emit("view",i.integration))},{default:l(()=>[...r[5]||(r[5]=[_(" 查看 ",-1)])]),_:1}))])],2)}}}),Pe=j(Ce,[["__scopeId","data-v-468027ce"]]),xe={class:"integrations-page"},$e={key:0,class:"loading-state"},Se={key:1,class:"integration-grid"},Le={key:0,class:"test-result"},Re={key:0,class:"test-detail"},Be={key:1,class:"test-debug-hint"},De={key:2,class:"test-debug-info"},Te=W({__name:"Integrations",setup(i){const P=x(!1),c=x([]),m=x(!1),u=x(null),r=D({apiUrl:"",apiKey:""}),o=D({baseUrl:"",accessKeyId:"",accessKeySecret:""}),s=D({baseUrl:"",apiAccount:"",apiPassword:"",validateKey:""}),k=x(!1),U=x(!1),f=x(null);re(async()=>{P.value=!0;try{const a=await ge();c.value=a.data.data.items}catch{c.value=q()}finally{P.value=!1}});function q(){return[{id:"dify",name:"Dify AI",status:"connected",configurable:!0,config_type:"url_key",config:{api_url:"https://api.dify.ai/v1",api_key_set:!0}},{id:"ragflow",name:"RAGFlow",status:"partial",configurable:!0,config_type:"url_key",config:{api_url:"",api_key_set:!1}},{id:"data_platform",name:"数据平台",status:"disconnected",configurable:!1,config:null},{id:"beisen",name:"北森 eHR",status:"disconnected",configurable:!1,config:null},{id:"huorong",name:"火绒安全",status:"disconnected",configurable:!0,config_type:"access_key",config:{api_url:"",api_key_set:!1,access_key_id_set:!1,access_key_secret_set:!1,base_url:null}},{id:"lianruan",name:"联软LV7000",status:"disconnected",configurable:!0,config_type:"account_password",config:{api_url:"",api_account_set:!1,api_password_set:!1,base_url:null}}]}const R={dify:{icon:"Cpu",bg:"var(--accent-light)",color:"var(--accent)"},ragflow:{icon:"Coin",bg:"var(--success-bg)",color:"var(--success)"},data_platform:{icon:"TrendCharts",bg:"var(--warning-bg)",color:"var(--warning)"},beisen:{icon:"Avatar",bg:"rgba(139,92,246,0.12)",color:"#8b5cf6"},huorong:{icon:"WarningFilled",bg:"var(--danger-bg)",color:"var(--danger)"},lianruan:{icon:"Monitor",bg:"rgba(236,72,153,0.12)",color:"#ec4899"}};function G(a){var e;return((e=R[a])==null?void 0:e.icon)||"Setting"}function J(a){var e;return((e=R[a])==null?void 0:e.bg)||"var(--accent-light)"}function O(a){var e;return((e=R[a])==null?void 0:e.color)||"var(--accent)"}function Q(a){u.value=a;const e=a.config;a.config_type==="access_key"?(o.baseUrl=(e==null?void 0:e.base_url)||(e==null?void 0:e.api_url)||"",o.accessKeyId="",o.accessKeySecret=""):a.config_type==="account_password"?(s.baseUrl=(e==null?void 0:e.base_url)||(e==null?void 0:e.api_url)||"",s.apiAccount="",s.apiPassword="",s.validateKey=""):(r.apiUrl=(e==null?void 0:e.api_url)||"",r.apiKey=""),m.value=!0}async function X(){if(u.value)try{await $(u.value.id,{api_url:r.apiUrl,api_key:r.apiKey||void 0}),y.success("配置已保存");const a=c.value.findIndex(e=>e.id===u.value.id);a>=0&&(c.value[a]={...c.value[a],status:r.apiUrl?"connected":"partial",config:{api_url:r.apiUrl,api_key_set:!!r.apiKey}}),m.value=!1}catch{y.error("保存配置失败")}}async function Y(){if(u.value){if(!o.baseUrl){y.warning("请填写 Base URL");return}if(!o.accessKeyId){y.warning("请填写 AccessKey ID");return}if(!o.accessKeySecret){y.warning("请填写 AccessKey Secret");return}try{await $(u.value.id,{access_key_id:o.accessKeyId,access_key_secret:o.accessKeySecret,base_url:o.baseUrl}),y.success("配置已保存");const a=c.value.findIndex(e=>e.id===u.value.id);a>=0&&(c.value[a]={...c.value[a],status:"partial",config:{api_url:o.baseUrl,api_key_set:!0,access_key_id_set:!0,access_key_secret_set:!0,base_url:o.baseUrl}}),m.value=!1,y.info('请在集成管理页点击"测试连接"验证凭据是否正确')}catch{y.error("保存配置失败")}}}async function Z(){if(u.value){if(!s.baseUrl){y.warning("请填写 Base URL");return}if(!s.apiAccount){y.warning("请填写 API 账号");return}if(!s.apiPassword){y.warning("请填写 API 密码");return}try{await $(u.value.id,{api_account:s.apiAccount,api_password:s.apiPassword,base_url:s.baseUrl,validate_key:s.validateKey||void 0}),y.success("配置已保存");const a=c.value.findIndex(e=>e.id===u.value.id);a>=0&&(c.value[a]={...c.value[a],status:"connected",config:{api_url:s.baseUrl,api_account_set:!0,api_password_set:!0,base_url:s.baseUrl}}),m.value=!1}catch{y.error("保存配置失败")}}}async function h(){var a;if(!s.baseUrl||!s.apiAccount||!s.apiPassword){y.warning("请先填写完整配置");return}k.value=!0;try{await $(u.value.id,{api_account:s.apiAccount,api_password:s.apiPassword,base_url:s.baseUrl,validate_key:s.validateKey||void 0});const e=await ve();if(f.value=e.data.data,U.value=!0,(a=f.value)!=null&&a.success){const I=c.value.findIndex(v=>v.id===u.value.id);I>=0&&(c.value[I]={...c.value[I],status:"connected",config:{api_url:s.baseUrl,api_account_set:!0,api_password_set:!0,base_url:s.baseUrl}})}}catch{f.value={success:!1,message:"请求失败,请检查网络连接"},U.value=!0}finally{k.value=!1}}async function ee(){var a;if(!o.baseUrl||!o.accessKeyId||!o.accessKeySecret){y.warning("请先填写完整配置");return}k.value=!0;try{await $(u.value.id,{access_key_id:o.accessKeyId,access_key_secret:o.accessKeySecret,base_url:o.baseUrl});const e=await ye();if(f.value=e.data.data,U.value=!0,(a=f.value)!=null&&a.success){const I=c.value.findIndex(v=>v.id===u.value.id);I>=0&&(c.value[I]={...c.value[I],status:"connected",config:{api_url:o.baseUrl,api_key_set:!0,access_key_id_set:!0,access_key_secret_set:!0,base_url:o.baseUrl}})}}catch{f.value={success:!1,message:"请求失败,请检查网络连接"},U.value=!0}finally{k.value=!1}}async function ae(a){var e;if(!(a.id==="huorong"||a.id==="lianruan")){if(a.id==="ragflow"){k.value=!0;try{const I=await pe();if(f.value=I.data.data,U.value=!0,(e=f.value)!=null&&e.success){const v=c.value.findIndex(V=>V.id===a.id);v>=0&&(c.value[v]={...c.value[v],status:"connected"})}}catch{f.value={success:!1,message:"请求失败,请检查网络连接"},U.value=!0}finally{k.value=!1}return}y.info(`正在测试 ${a.name} 连接...`)}}function te(a){y.info(`${a.name} — 暂无更多配置信息`)}return(a,e)=>{var T,z,F,M,N,E;const I=K("el-skeleton"),v=K("el-input"),V=K("el-form-item"),B=K("el-form"),A=K("el-button"),L=K("el-dialog"),ne=K("el-result"),le=K("el-icon");return d(),p("div",xe,[e[33]||(e[33]=g("div",{class:"page-title"},"外部系统集成",-1)),e[34]||(e[34]=g("div",{class:"page-desc"},"管理后台管「配置和参数」,Dify 网页管「Workflow 逻辑」,两者边界明确。",-1)),P.value?(d(),p("div",$e,[t(I,{rows:6,animated:""})])):(d(),p("div",Se,[(d(!0),p(S,null,de(c.value,n=>(d(),C(Pe,{key:n.id,integration:n,icon:G(n.id),"icon-bg":J(n.id),"icon-color":O(n.id),onConfigure:Q,onTest:ae,onView:te},null,8,["integration","icon","icon-bg","icon-color"]))),128))])),((T=u.value)==null?void 0:T.config_type)==="url_key"?(d(),C(L,{key:2,modelValue:m.value,"onUpdate:modelValue":e[3]||(e[3]=n=>m.value=n),title:"配置集成 — "+((z=u.value)==null?void 0:z.name),width:"480px","destroy-on-close":""},{footer:l(()=>[t(A,{onClick:e[2]||(e[2]=n=>m.value=!1)},{default:l(()=>[...e[17]||(e[17]=[_("取消",-1)])]),_:1}),t(A,{type:"primary",onClick:X},{default:l(()=>[...e[18]||(e[18]=[_("保存配置",-1)])]),_:1})]),default:l(()=>[t(B,{"label-position":"top"},{default:l(()=>[t(V,{label:"API URL"},{default:l(()=>[t(v,{modelValue:r.apiUrl,"onUpdate:modelValue":e[0]||(e[0]=n=>r.apiUrl=n),placeholder:"https://api.dify.ai/v1"},null,8,["modelValue"])]),_:1}),t(V,{label:"API Key"},{default:l(()=>[t(v,{modelValue:r.apiKey,"onUpdate:modelValue":e[1]||(e[1]=n=>r.apiKey=n),type:"password",placeholder:"输入 API Key","show-password":""},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"])):w("",!0),((F=u.value)==null?void 0:F.config_type)==="access_key"?(d(),C(L,{key:3,modelValue:m.value,"onUpdate:modelValue":e[8]||(e[8]=n=>m.value=n),title:"配置集成 — "+((M=u.value)==null?void 0:M.name),width:"520px","destroy-on-close":""},{footer:l(()=>[t(A,{onClick:e[7]||(e[7]=n=>m.value=!1)},{default:l(()=>[...e[22]||(e[22]=[_("取消",-1)])]),_:1}),t(A,{loading:k.value,onClick:ee},{default:l(()=>[_(b(k.value?"测试中...":"测试连接"),1)]),_:1},8,["loading"]),t(A,{type:"primary",onClick:Y},{default:l(()=>[...e[23]||(e[23]=[_("保存配置",-1)])]),_:1})]),default:l(()=>[t(B,{"label-position":"top"},{default:l(()=>[t(V,{label:"Base URL(内网地址)"},{default:l(()=>[t(v,{modelValue:o.baseUrl,"onUpdate:modelValue":e[4]||(e[4]=n=>o.baseUrl=n),placeholder:"http://huorong.oa.servyou-it.com:8080"},null,8,["modelValue"]),e[19]||(e[19]=g("div",{class:"form-hint"},"火绒终端安全管理系统的内网API地址",-1))]),_:1}),t(V,{label:"AccessKey ID"},{default:l(()=>[t(v,{modelValue:o.accessKeyId,"onUpdate:modelValue":e[5]||(e[5]=n=>o.accessKeyId=n),placeholder:"输入 AccessKey ID"},null,8,["modelValue"]),e[20]||(e[20]=g("div",{class:"form-hint"},"在火绒管理后台 → 系统设置 → API管理 中创建",-1))]),_:1}),t(V,{label:"AccessKey Secret"},{default:l(()=>[t(v,{modelValue:o.accessKeySecret,"onUpdate:modelValue":e[6]||(e[6]=n=>o.accessKeySecret=n),type:"password",placeholder:"输入 AccessKey Secret","show-password":""},null,8,["modelValue"]),e[21]||(e[21]=g("div",{class:"form-hint"},"Secret 仅在创建时显示一次,请妥善保管",-1))]),_:1})]),_:1})]),_:1},8,["modelValue","title"])):w("",!0),((N=u.value)==null?void 0:N.config_type)==="account_password"?(d(),C(L,{key:4,modelValue:m.value,"onUpdate:modelValue":e[14]||(e[14]=n=>m.value=n),title:"配置集成 — "+((E=u.value)==null?void 0:E.name),width:"520px","destroy-on-close":""},{footer:l(()=>[t(A,{onClick:e[13]||(e[13]=n=>m.value=!1)},{default:l(()=>[...e[28]||(e[28]=[_("取消",-1)])]),_:1}),t(A,{loading:k.value,onClick:h},{default:l(()=>[_(b(k.value?"测试中...":"测试连接"),1)]),_:1},8,["loading"]),t(A,{type:"primary",onClick:Z},{default:l(()=>[...e[29]||(e[29]=[_("保存配置",-1)])]),_:1})]),default:l(()=>[t(B,{"label-position":"top"},{default:l(()=>[t(V,{label:"Base URL(内网地址)"},{default:l(()=>[t(v,{modelValue:s.baseUrl,"onUpdate:modelValue":e[9]||(e[9]=n=>s.baseUrl=n),placeholder:"http://192.168.x.x:30098"},null,8,["modelValue"]),e[24]||(e[24]=g("div",{class:"form-hint"},"联软LV7000终端安全管理系统的内网API地址,默认端口30098",-1))]),_:1}),t(V,{label:"API 账号"},{default:l(()=>[t(v,{modelValue:s.apiAccount,"onUpdate:modelValue":e[10]||(e[10]=n=>s.apiAccount=n),placeholder:"输入API账号"},null,8,["modelValue"]),e[25]||(e[25]=g("div",{class:"form-hint"},"在联软管理后台 → 系统设置 → API管理 中创建",-1))]),_:1}),t(V,{label:"API 密码"},{default:l(()=>[t(v,{modelValue:s.apiPassword,"onUpdate:modelValue":e[11]||(e[11]=n=>s.apiPassword=n),type:"password",placeholder:"输入API密码","show-password":""},null,8,["modelValue"]),e[26]||(e[26]=g("div",{class:"form-hint"},"与API账号配套的密码,仅在创建时显示",-1))]),_:1}),t(V,{label:"验证密钥(可选)"},{default:l(()=>[t(v,{modelValue:s.validateKey,"onUpdate:modelValue":e[12]||(e[12]=n=>s.validateKey=n),placeholder:"输入验证密钥(如需要)"},null,8,["modelValue"]),e[27]||(e[27]=g("div",{class:"form-hint"},"部分联软版本需要额外的验证密钥,无则留空",-1))]),_:1})]),_:1})]),_:1},8,["modelValue","title"])):w("",!0),t(L,{modelValue:U.value,"onUpdate:modelValue":e[16]||(e[16]=n=>U.value=n),title:"连接测试结果",width:"420px"},{footer:l(()=>[t(A,{type:"primary",onClick:e[15]||(e[15]=n=>U.value=!1)},{default:l(()=>[...e[32]||(e[32]=[_("确定",-1)])]),_:1})]),default:l(()=>[f.value?(d(),p("div",Le,[t(ne,{icon:f.value.success?"success":"error",title:f.value.success?"连接成功":"连接失败","sub-title":f.value.message},null,8,["icon","title","sub-title"]),f.value.success&&f.value.total_terminals?(d(),p("div",Re,[e[30]||(e[30]=_(" 检测到 ",-1)),g("strong",null,b(f.value.total_terminals),1),e[31]||(e[31]=_(" 个终端 ",-1))])):w("",!0),!f.value.success&&f.value.debug_hint?(d(),p("div",Be,[t(le,null,{default:l(()=>[t(ce(fe))]),_:1}),g("span",null,b(f.value.debug_hint),1)])):w("",!0),f.value.debug?(d(),p("div",De,[g("div",null,"Base URL: "+b(f.value.debug.base_url),1),g("div",null,"AccessKey ID: "+b(f.value.debug.access_key_id),1),g("div",null,"Secret 长度: "+b(f.value.debug.key_length)+" 字符",1)])):w("",!0)])):w("",!0)]),_:1},8,["modelValue"])])}}}),Ee=j(Te,[["__scopeId","data-v-4437a7cc"]]);export{Ee as default};