2 lines
24 KiB
JavaScript
2 lines
24 KiB
JavaScript
import{aN as ee,bs as M,aG as B,bk as Q,aD as l,aK as t,$ as Le,bL as b,cb as Pe,I as ve,c8 as n,r as ce,bS as p,bi as Re,K as _e,J as be,aJ as _,a8 as he,Q as we,c1 as ze,aC as Ne,aw as We,c6 as He,az as qe,ay as C,Y as le,X as q,ak as de,b as R,bC as F,bp as ue,ad as Je,bD as ge,bv as je,at as Ge,c9 as ye,b$ as Ce,aE as J,aF as re,ai as Y,bE as Z,R as fe,aP as Ke,a4 as Ie,Z as Ve,L as ke,N as Xe,O as Qe,a5 as Ye,G as Ze,S as et,k as tt,E as at,ac as $e,a9 as Me,B as lt,C as nt,b4 as ot,br as st,bK as me,bV as it,c7 as pe,bW as rt,bX as ct,bI as dt,am as ut}from"./index-D5GfLbIx.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as ft}from"./reflection-BwOBPyb9.js";import{u as Ee,C as xe}from"./ConfigPageBase-CgfsngDp.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css */import{l as mt}from"./projection-BHFE6Meg.js";import{u as pt}from"./useProjectionStream-ayb6RvWW.js";/* empty css *//* empty css */import"./PermissionGuard-CR4qtxrh.js";import"./monitorConfigCache-DXn96T8F.js";const vt={online:"OnlineCar",offline:"OfflineCar",repair:"Repair",blown:"Blown"};async function Se(s,d){const o=vt[d];if(!o)return!1;try{return await ft.execute("car",s,o),!0}catch{return!1}}function _t(s,d){const o=s??(d?`http://${d}:8081`:null);o&&window.open(o,"_blank","noopener,noreferrer")}const bt={class:"battery-strip"},ht={class:"card-head"},wt={class:"title-block"},gt={class:"vid"},yt=["title"],Ct={class:"card-body"},It={class:"thumb"},Vt={class:"metrics"},kt={class:"metric-row"},$t={class:"value mono"},Mt={class:"metric-row"},Et={class:"metric-row"},xt={class:"metric-row"},St={class:"value"},Ft={class:"metric-row"},At={class:"value"},Ut={class:"icon-grid"},Bt={class:"icon-cell",title:"CPU"},Ot={class:"icon-cell",title:"内存"},Tt={class:"icon-cell",title:"报警"},Dt={class:"icon-cell",title:"连接"},Lt={class:"card-foot"},Pt=ee({__name:"VehicleHealthCard",props:{vehicle:{},selected:{type:Boolean},canWrite:{type:Boolean}},emits:["select","maintenanceChanged"],setup(s,{emit:d}){const o=s,k=d,f={idle:"空闲",running:"运行",charging:"充电",paused:"暂停",fault:"故障",offline:"离线"},w=C(()=>f[o.vehicle.state]??o.vehicle.state),g=C(()=>{const e=o.vehicle.batterySoc??0,a=e>1?e:e*100;return Math.max(0,Math.min(100,Math.round(a)))}),E=C(()=>{const e=g.value;return e<20?"#f56c6c":e<50?"#e6a23c":"#67c23a"}),v=C(()=>o.vehicle.maintenanceMode==="online"),U=C(()=>({"is-selected":o.selected,"is-alarm":o.vehicle.isAlarmActive,"is-offline":o.vehicle.maintenanceMode==="offline"||o.vehicle.state==="offline","is-maintenance":o.vehicle.maintenanceMode==="repair"||o.vehicle.maintenanceMode==="blown","is-unreachable":o.vehicle.reachable===!1})),u=C(()=>{const e=o.vehicle.latencyMs;return e==null?"—":o.vehicle.reachable===!1?"超时":`${e} ms`}),y=C(()=>{const e=o.vehicle.latencyMs;return o.vehicle.reachable===!1?"danger":e!=null&&e>80?"warn":""}),I=C(()=>{const e=o.vehicle.faultRatePercent;return e==null?"—":`${e.toFixed(2)}%`}),W=C(()=>{const e=o.vehicle.faultRatePercent??0;return e>=5?"danger":e>=1?"warn":""}),O=C(()=>{const e=o.vehicle.cpuPercent;return e!=null?`${Math.round(e)}%`:"—"}),L=C(()=>{const e=o.vehicle.memPercent;return e!=null?`${Math.round(e)}%`:"—"});function z(){k("select",o.vehicle.id)}function T(e){e.target.closest(".head-actions")||_t(o.vehicle.onboardUrl,o.vehicle.ip)}async function A(e){const a=o.vehicle.rawId??parseInt(o.vehicle.id.replace(/\D/g,""),10);if(!Number.isFinite(a))return;await Se(a,e)?(q.success("维护状态已更新"),k("maintenanceChanged")):q.error("维护操作失败")}async function c(e){if(!o.canWrite)return;const a=e?"online":"offline";try{await le.confirm(e?"确认将车辆上线?":"确认将车辆下线维护?","维护确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await A(a)}catch{}}async function i(e){if(!o.canWrite)return;const a=e;if(a==="blown"){try{await le.confirm("返厂检修将停止调度并清空站点,确认?","危险操作",{type:"error",confirmButtonText:"确定",cancelButtonText:"取消"}),await A(a)}catch{}return}if(a==="repair"){try{await le.confirm("现场检修:不调度但仍刷新状态,确认?","维护确认",{type:"warning"}),await A(a)}catch{}return}await A(a)}return(e,a)=>{const m=Le,N=ce,D=be,G=_e,K=ve,X=he,V=we;return M(),B("div",{class:Q(["vehicle-health-card",U.value]),onClick:z,onDblclick:T},[l("div",bt,[t(m,{percentage:g.value,"stroke-width":4,"show-text":!1,color:E.value},null,8,["percentage","color"])]),l("div",ht,[l("div",wt,[l("span",gt,b(s.vehicle.id),1),l("span",{class:"vname",title:s.vehicle.name},b(s.vehicle.name),9,yt)]),l("div",{class:"head-actions",onClick:a[1]||(a[1]=Pe(()=>{},["stop"]))},[t(K,{trigger:"click",onCommand:i},{dropdown:n(()=>[t(G,null,{default:n(()=>[t(D,{command:"online"},{default:n(()=>[...a[2]||(a[2]=[_("上线",-1)])]),_:1}),t(D,{command:"offline"},{default:n(()=>[...a[3]||(a[3]=[_("下线维护",-1)])]),_:1}),t(D,{command:"repair"},{default:n(()=>[...a[4]||(a[4]=[_("现场检修",-1)])]),_:1}),t(D,{command:"blown",divided:""},{default:n(()=>[...a[5]||(a[5]=[_("返厂检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(N,{size:"small",text:"",icon:p(Re)},null,8,["icon"])]),_:1}),t(X,{"model-value":v.value,size:"small",disabled:!s.canWrite,"inline-prompt":"","active-text":"开","inactive-text":"关",onChange:a[0]||(a[0]=j=>c(!!j))},null,8,["model-value","disabled"])])]),l("div",Ct,[l("div",It,[t(V,{size:36},{default:n(()=>[t(p(ze))]),_:1})]),l("div",Vt,[l("div",kt,[a[6]||(a[6]=l("span",{class:"label"},"IP",-1)),l("span",$t,b(s.vehicle.ip??"—"),1)]),l("div",Mt,[a[7]||(a[7]=l("span",{class:"label"},"延迟",-1)),l("span",{class:Q(["value",y.value])},b(u.value),3)]),l("div",Et,[a[8]||(a[8]=l("span",{class:"label"},"故障率",-1)),l("span",{class:Q(["value",W.value])},b(I.value),3)]),l("div",xt,[a[9]||(a[9]=l("span",{class:"label"},"群组",-1)),l("span",St,b(s.vehicle.group??"—"),1)]),l("div",Ft,[a[10]||(a[10]=l("span",{class:"label"},"状态",-1)),l("span",At,b(s.vehicle.lstatus??w.value),1)])])]),l("div",Ut,[l("div",Bt,[t(V,null,{default:n(()=>[t(p(Ne))]),_:1}),l("span",null,b(O.value),1)]),l("div",Ot,[t(V,null,{default:n(()=>[t(p(We))]),_:1}),l("span",null,b(L.value),1)]),l("div",Tt,[t(V,{class:Q({"is-alarm":s.vehicle.isAlarmActive})},{default:n(()=>[t(p(He))]),_:1},8,["class"]),l("span",null,b(s.vehicle.isAlarmActive?"报警":"正常"),1)]),l("div",Dt,[t(V,{class:Q({"is-down":s.vehicle.reachable===!1})},{default:n(()=>[t(p(qe))]),_:1},8,["class"]),l("span",null,b(s.vehicle.reachable===!1?"不可达":"可达"),1)])]),l("div",Lt,[l("span",null,"电量 "+b(g.value)+"%",1),a[11]||(a[11]=l("span",{class:"hint"},"双击打开车载界面",-1))])],34)}}}),Rt=de(Pt,[["__scopeId","data-v-30c5a691"]]),ae=F([]),ie=F(!1);function Fe(){const s=Ee();async function d(f=!1){ie.value=!0;try{const g=(await s.load("fleet",f)).payload??R;ae.value=JSON.parse(JSON.stringify(g.groups??[]))}finally{ie.value=!1}}function o(f){for(const w of ae.value)if(w.carIds.includes(f))return w.name||w.id}function k(f){for(const w of ae.value)if(w.carIds.includes(f))return w.region||void 0}return{groups:ae,loading:ie,reload:d,fleetNameForCarId:o,regionForCarId:k}}const zt={class:"fleet-alloc"},Nt={class:"fa-header"},Wt={class:"fa-body"},Ht={class:"fc-row"},qt={key:0,class:"fa-note"},Jt=ee({__name:"FleetAllocationPanel",props:{cars:{},canWrite:{type:Boolean}},emits:["saved"],setup(s,{emit:d}){const o=s,k=d,f=Ee(),{reload:w}=Fe(),g=F(!1),E=F(!1),v=F(!1),U=F({ota:R.ota,batchOps:R.batchOps,networkDiag:R.networkDiag}),u=F([]);function y(){v.value=!0}const I=C(()=>{const i=new Map;for(const e of o.cars)i.set(e.id,e.name??e.id);return i});function W(i){const e=new Set;for(const a of u.value)if(a!==i)for(const m of a.carIds)e.add(m);return o.cars.map(a=>({id:a.id,label:a.name&&a.name!==a.id?`${a.id} · ${a.name}`:a.id,takenByOther:e.has(a.id)}))}const O=C(()=>{const i=I.value,e=[];for(const a of u.value)for(const m of a.carIds)!i.has(m)&&!e.includes(m)&&e.push(m);return e});function L(){const i=new Set(u.value.map(m=>m.id));let e=u.value.length+1,a=`G-${e}`;for(;i.has(a);)e+=1,a=`G-${e}`;return a}function z(){u.value.push({id:L(),name:"新车队",floor:"",region:"",carIds:[]}),y()}function T(i){u.value.splice(i,1),y()}async function A(i=!1){g.value=!0;try{const a=(await f.load("fleet",i)).payload??R;U.value={ota:a.ota??R.ota,batchOps:a.batchOps??R.batchOps,networkDiag:a.networkDiag??R.networkDiag},u.value=JSON.parse(JSON.stringify(a.groups??[])),v.value=!1,i&&q.success("已重载车队配置")}catch(e){q.error(`加载车队配置失败:${e instanceof Error?e.message:String(e)}`)}finally{g.value=!1}}async function c(){E.value=!0;try{const i={...U.value,groups:JSON.parse(JSON.stringify(u.value))},e=await f.save("fleet",i);v.value=!1,await w(!0),k("saved"),q.success(`车队分配已保存 v${e.version}`)}catch(i){q.error(`保存失败:${i instanceof Error?i.message:String(i)}`)}finally{E.value=!1}}return ue(()=>A()),(i,e)=>{const a=Je,m=ce,N=ke,D=fe,G=Ve,K=Ie,X=Ce;return M(),B("section",zt,[l("div",Nt,[e[5]||(e[5]=l("span",{class:"fa-title"},"车队分配",-1)),t(a,{size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[1]||(e[1]=[_("区域管理",-1)])]),_:1}),e[6]||(e[6]=l("span",{class:"fa-sub"},"将车辆分配到车队,并设定车队名称 / 区域 / 楼层",-1)),e[7]||(e[7]=l("div",{class:"spacer"},null,-1)),t(m,{size:"small",icon:p(ge),loading:g.value,onClick:e[0]||(e[0]=V=>A(!0))},{default:n(()=>[...e[2]||(e[2]=[_("重载",-1)])]),_:1},8,["icon","loading"]),t(m,{size:"small",icon:p(je),disabled:!s.canWrite,onClick:z},{default:n(()=>[...e[3]||(e[3]=[_("新建车队",-1)])]),_:1},8,["icon","disabled"]),t(m,{size:"small",type:"primary",icon:p(Ge),loading:E.value,disabled:!s.canWrite||!v.value,onClick:c},{default:n(()=>[...e[4]||(e[4]=[_(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])]),ye((M(),B("div",Wt,[u.value.length?re("",!0):(M(),J(N,{key:0,description:"暂无车队,点击「新建车队」开始分配"})),(M(!0),B(Y,null,Z(u.value,(V,j)=>(M(),B("div",{key:V.id,class:"fleet-card"},[l("div",Ht,[t(D,{modelValue:V.name,"onUpdate:modelValue":S=>V.name=S,size:"small",class:"fc-name",placeholder:"车队名称",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[8]||(e[8]=[_("名称",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.region,"onUpdate:modelValue":S=>V.region=S,size:"small",class:"fc-region",placeholder:"区域",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[9]||(e[9]=[_("区域",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.floor,"onUpdate:modelValue":S=>V.floor=S,size:"small",class:"fc-floor",placeholder:"楼层",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[10]||(e[10]=[_("楼层",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(a,{size:"small",effect:"plain"},{default:n(()=>[_(b(V.carIds.length)+" 辆",1)]),_:2},1024),t(m,{size:"small",type:"danger",text:"",icon:p(Ke),disabled:!s.canWrite,onClick:S=>T(j)},{default:n(()=>[...e[11]||(e[11]=[_(" 删除 ",-1)])]),_:1},8,["icon","disabled","onClick"])]),t(K,{modelValue:V.carIds,"onUpdate:modelValue":S=>V.carIds=S,size:"small",multiple:"",filterable:"","collapse-tags":"","collapse-tags-tooltip":"",class:"fc-cars",placeholder:"选择要分配到该车队的车辆",disabled:!s.canWrite,onChange:y},{default:n(()=>[(M(!0),B(Y,null,Z(W(V),S=>(M(),J(G,{key:S.id,label:S.label,value:S.id,disabled:S.takenByOther},null,8,["label","value","disabled"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled"])]))),128))])),[[X,g.value]]),O.value.length?(M(),B("p",qt," 提示:以下已分配的车辆 ID 不在当前在册车辆中:"+b(O.value.join("、")),1)):re("",!0)])}}}),jt=de(Jt,[["__scopeId","data-v-f299c1d2"]]),Gt=ee({__name:"VehicleMaintenanceView",setup(s){return(d,o)=>{const k=Ye,f=Qe,w=Ze,g=he,E=fe,v=et,U=Xe;return M(),J(xe,{section:"vehicle",title:"车辆维护策略",description:"电量阈值、故障上报、自动报修(VehicleMaintenancePolicy)",defaults:p(tt)},{default:n(({payload:u,update:y})=>[t(U,{"label-width":"160px",model:u},{default:n(()=>[t(f,{label:"低电量阈值"},{default:n(()=>[t(k,{"model-value":u.lowBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,lowBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"临界电量阈值"},{default:n(()=>[t(k,{"model-value":u.criticalBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,criticalBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[0]||(o[0]=[_("故障上报",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.faultReport.enabled,"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"接收邮箱"},{default:n(()=>[t(E,{"model-value":u.faultReport.emailTo.join(", "),"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,emailTo:I.split(/[,\s]+/).filter(Boolean)}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[1]||(o[1]=[_("自动报修",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.autoRepair.enabled,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"冷却时间 (秒)"},{default:n(()=>[t(v,{"model-value":u.autoRepair.cooldownSec,min:0,max:86400,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,cooldownSec:I??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}}),Kt=ee({__name:"FleetLifecycleView",setup(s){return(d,o)=>{const k=at,f=nt,w=lt,g=Me,E=$e;return M(),J(xe,{section:"fleet",title:"车队全生命周期",description:"分区域/跨楼层/多车协作;OTA、批量操作、网络诊断(FleetLifecycleConfig)",defaults:p(R)},{default:n(({payload:v})=>[t(k,{type:"info",closable:!1,"show-icon":"",title:"车队分配已移至「车辆运维 → 运维总览」",description:"在运维总览中可新建车队、设定名称/区域/楼层,并将车辆分配到各车队。",style:{"margin-bottom":"12px"}}),t(E,{"model-value":"ota"},{default:n(()=>[t(g,{name:"ota",label:"OTA 升级"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"启用"},{default:n(()=>[_(b(v.ota.enabled?"是":"否"),1)]),_:2},1024),t(f,{label:"批次大小"},{default:n(()=>[_(b(v.ota.batchSize),1)]),_:2},1024),t(f,{label:"失败回滚"},{default:n(()=>[_(b(v.ota.rollbackOnFail?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"batch",label:"批量操作"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"需确认"},{default:n(()=>[_(b(v.batchOps.confirmationRequired?"是":"否"),1)]),_:2},1024),t(f,{label:"最大批量"},{default:n(()=>[_(b(v.batchOps.maxBatch),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"diag",label:"网络诊断"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"RTT 阈值 (ms)"},{default:n(()=>[_(b(v.networkDiag.rttThresholdMs),1)]),_:2},1024),t(f,{label:"丢包阈值"},{default:n(()=>[_(b(v.networkDiag.packetLossThreshold),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});async function Xt(){const{data:s}=await ot.get("/sl/projection/fleet/health");return Array.isArray(s)?s:[]}const Qt=5e3,Yt=2e4;function Zt(s){const d=(s.lstatus??"").toLowerCase();return/返厂|blown/.test(d)?"blown":/现场检修|repair/.test(d)?"repair":/下线|offline/.test(d)||s.state==="offline"?"offline":"online"}function ea(s,d){return{...s,ip:d?.ip??s.ip,onboardUrl:d?.onboardUrl??s.onboardUrl??(s.ip?`http://${s.ip}:8081`:void 0),latencyMs:d?.latencyMs,reachable:d?.reachable,faultRatePercent:d?.faultRatePercent,isAlarmActive:d?.isAlarmActive??s.state==="fault",cpuPercent:d?.cpuPercent,memPercent:d?.memPercent,maintenanceMode:Zt(s)}}function ta(){const s=me([]),d=me([]),o=F(!1),k=F(!1),f=F(null);let w=null,g=null;const E=C(()=>{const c=new Map;for(const i of d.value)c.set(i.carId,i);return c}),v=C(()=>s.value.map(c=>{const i=c.rawId??parseInt(c.id.replace(/\D/g,""),10),e=Number.isFinite(i)?E.value.get(i):void 0;return ea(c,e)})),U=C(()=>v.value.length),u=C(()=>v.value.filter(c=>c.state!=="offline"&&c.maintenanceMode==="online").length),y=C(()=>v.value.filter(c=>c.maintenanceMode==="offline"||c.maintenanceMode==="repair"||c.maintenanceMode==="blown").length),I=C(()=>v.value.filter(c=>c.isAlarmActive).length),W=C(()=>v.value.filter(c=>c.reachable===!1).length);async function O(){o.value=!0;try{s.value=await mt()}finally{o.value=!1}}async function L(){k.value=!0;try{d.value=await Xt()}finally{k.value=!1}}async function z(){await Promise.all([O(),L()])}function T(c,i){const e=s.value.findIndex(m=>(m.rawId??parseInt(m.id.replace(/\D/g,""),10))===c);if(e<0)return;const a=[...s.value];a[e]={...a[e],...i,lastUpdate:new Date().toISOString()},s.value=a}const A=pt({extraEventKinds:["alarm","car-state"],autoConnect:!0});return A.on(c=>{if(c.kind==="car-state"&&c.payload&&typeof c.payload=="object"){const i=c.payload,e=i.rawId;e!=null&&T(e,{state:i.state,lstatus:i.lstatus})}if(c.kind==="alarm"&&c.payload&&typeof c.payload=="object"){const i=c.payload;if(i.carId!=null){const e=i.action==="raise"||i.action==="update",a=d.value.findIndex(m=>m.carId===i.carId);if(a>=0){const m=[...d.value];m[a]={...m[a],isAlarmActive:e},d.value=m}T(i.carId,{state:e?"fault":void 0})}}}),ue(()=>{z(),w=setInterval(()=>void O(),Qt),g=setInterval(()=>void L(),Yt)}),st(()=>{w&&clearInterval(w),g&&clearInterval(g),A.disconnect()}),{cardModels:v,loading:o,healthLoading:k,selectedId:f,totalCount:U,onlineCount:u,maintenanceCount:y,alarmCount:I,unreachableCount:W,refreshAll:z,loadCars:O,loadHealth:L}}const aa={class:"vehicle-hub-page"},la={class:"overview-pane"},na={class:"hub-toolbar"},oa={class:"stats-row"},sa={class:"stat"},ia={class:"num"},ra={class:"stat online"},ca={class:"num"},da={class:"stat warn"},ua={class:"num"},fa={class:"stat danger"},ma={class:"num"},pa={class:"stat muted"},va={class:"num"},_a={class:"filters-row"},ba={class:"card-grid"},ha={class:"config-pane"},wa={class:"config-pane"},ga=ee({__name:"VehicleHubView",setup(s){const d=it(),o=C(()=>d.scope==="Platform"||(d.effectivePermissions?.allowedOps??[]).includes("*")),k=rt(),f=ct(),w=["overview","maintenance","fleet"];function g(){const h=k.query.tab;return typeof h=="string"&&w.includes(h)?h:"overview"}const E=F(g());pe(E,h=>{k.query.tab!==h&&f.replace({query:{...k.query,tab:h}})}),pe(()=>k.query.tab,()=>{const h=g();h!==E.value&&(E.value=h)});const{cardModels:v,loading:U,healthLoading:u,selectedId:y,totalCount:I,onlineCount:W,maintenanceCount:O,alarmCount:L,unreachableCount:z,refreshAll:T}=ta(),{groups:A,reload:c,fleetNameForCarId:i,regionForCarId:e}=Fe();ue(()=>void c());const a=F(""),m=F(""),N=F(""),D=[{value:"idle",label:"空闲"},{value:"running",label:"运行"},{value:"charging",label:"充电"},{value:"paused",label:"暂停"},{value:"fault",label:"故障"},{value:"offline",label:"离线"}],G=C(()=>A.value.map(h=>({value:h.id,label:h.region?`${h.name}(${h.region})`:h.name||h.id})));function K(){c(!0)}function X(h){if(!N.value)return!0;const r=A.value.find(x=>x.id===N.value);return r?r.carIds.includes(h):!1}const V=C(()=>{const h=a.value.trim().toLowerCase(),r=h?h.split(/\s+/).filter(Boolean):[];return v.value.filter(x=>{if(m.value&&x.state!==m.value||!X(x.id))return!1;if(!r.length)return!0;const P=i(x.id),H=e(x.id),ne=[x.id,x.name,x.ip,x.group,P,H,x.lstatus].filter(Boolean).join(" ").toLowerCase();return r.every(te=>ne.includes(te))})}),j=C(()=>y.value?[y.value]:[]);async function S(h){const r=h,x=V.value.filter(P=>y.value?P.id===y.value:!0);if(x.length)try{await le.confirm(`对 ${x.length} 辆车执行「${h}」?`,"批量维护",{type:"warning"});for(const P of x){const H=P.rawId??parseInt(P.id.replace(/\D/g,""),10);Number.isFinite(H)&&await Se(H,r)}q.success("批量操作已提交"),await T()}catch{}}return(h,r)=>{const x=fe,P=Ve,H=Ie,ne=we,te=ce,oe=be,Ae=_e,Ue=ve,Be=ke,se=Me,Oe=$e,Te=Ce;return M(),B("div",aa,[t(Oe,{modelValue:E.value,"onUpdate:modelValue":r[4]||(r[4]=$=>E.value=$),class:"hub-tabs"},{default:n(()=>[t(se,{name:"overview",label:"运维总览"},{default:n(()=>[l("div",la,[l("div",na,[l("div",oa,[l("div",sa,[l("span",ia,b(p(I)),1),r[5]||(r[5]=l("span",{class:"label"},"总数",-1))]),l("div",ra,[l("span",ca,b(p(W)),1),r[6]||(r[6]=l("span",{class:"label"},"在线",-1))]),l("div",da,[l("span",ua,b(p(O)),1),r[7]||(r[7]=l("span",{class:"label"},"维护中",-1))]),l("div",fa,[l("span",ma,b(p(L)),1),r[8]||(r[8]=l("span",{class:"label"},"报警",-1))]),l("div",pa,[l("span",va,b(p(z)),1),r[9]||(r[9]=l("span",{class:"label"},"不可达",-1))])]),l("div",_a,[t(x,{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=$=>a.value=$),size:"small",clearable:"",placeholder:"搜索 ID / 名称 / IP",class:"search-input","prefix-icon":p(dt)},null,8,["modelValue","prefix-icon"]),t(H,{modelValue:m.value,"onUpdate:modelValue":r[1]||(r[1]=$=>m.value=$),size:"small",clearable:"",placeholder:"状态",class:"filter-select"},{default:n(()=>[(M(),B(Y,null,Z(D,$=>t(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),t(H,{modelValue:N.value,"onUpdate:modelValue":r[2]||(r[2]=$=>N.value=$),size:"small",clearable:"",placeholder:"车队",class:"filter-select fleet-filter"},{default:n(()=>[(M(!0),B(Y,null,Z(G.value,$=>(M(),J(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(Ue,{disabled:!o.value||!j.value.length,onCommand:S},{dropdown:n(()=>[t(Ae,null,{default:n(()=>[t(oe,{command:"online"},{default:n(()=>[...r[11]||(r[11]=[_("批量上线",-1)])]),_:1}),t(oe,{command:"offline"},{default:n(()=>[...r[12]||(r[12]=[_("批量下线",-1)])]),_:1}),t(oe,{command:"repair"},{default:n(()=>[...r[13]||(r[13]=[_("批量现场检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(te,{size:"small",disabled:!o.value||!j.value.length},{default:n(()=>[r[10]||(r[10]=_(" 批量维护 ",-1)),t(ne,{class:"el-icon--right"},{default:n(()=>[t(p(ut))]),_:1})]),_:1},8,["disabled"])]),_:1},8,["disabled"]),t(te,{size:"small",icon:p(ge),loading:p(U)||p(u),onClick:p(T)},{default:n(()=>[...r[14]||(r[14]=[_(" 刷新 ",-1)])]),_:1},8,["icon","loading","onClick"])])]),ye((M(),B("div",ba,[(M(!0),B(Y,null,Z(V.value,$=>(M(),J(Rt,{key:$.id,vehicle:$,selected:p(y)===$.id,"can-write":o.value,onSelect:r[3]||(r[3]=De=>y.value=De),onMaintenanceChanged:p(T)},null,8,["vehicle","selected","can-write","onMaintenanceChanged"]))),128)),!V.value.length&&!p(U)?(M(),J(Be,{key:0,description:"无匹配车辆"})):re("",!0)])),[[Te,p(U)&&!p(v).length]]),t(jt,{cars:p(v),"can-write":o.value,onSaved:K},null,8,["cars","can-write"]),r[15]||(r[15]=l("p",{class:"footnote"},"故障率 = 报警占用时长 ÷ 自上线以来运行时长(SimpleLite 进程内累计)",-1))])]),_:1}),t(se,{name:"maintenance",label:"维护策略",lazy:""},{default:n(()=>[l("div",ha,[t(Gt)])]),_:1}),t(se,{name:"fleet",label:"车队生命周期",lazy:""},{default:n(()=>[l("div",wa,[t(Kt)])]),_:1})]),_:1},8,["modelValue"])])}}}),Xa=de(ga,[["__scopeId","data-v-0caa3fa5"]]);export{Xa as default};
|