同步 simple-platform-vue 构建产物与 index.html 入口哈希。 Co-authored-by: Cursor <cursoragent@cursor.com>
2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{aG as J,b7 as I,aC as B,b1 as T,az as n,aF as o,_ as oe,bo as v,bK as ie,bH as c,r as Q,br as u,a$ as re,K as X,J as Y,aE as M,I as Z,a7 as ce,bA as ue,Q as ee,ay as de,au as fe,bF as me,aw as ve,av as d,Y as F,X as G,aj as te,aS as pe,b5 as he,b6 as _e,bn as q,bf as E,bt as be,bI as we,by as ge,ah as j,bh as W,aA as K,aB as ye,R as Ce,a3 as Ie,bl as Me,Z as xe,al as Ae,bg as $e,L as ke}from"./index-D5OuyicD.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 */import{r as Pe}from"./reflection-BmVSriDn.js";import{l as Ve}from"./projection-BVk2tEkj.js";import{u as Le}from"./useProjectionStream-DvMLcpMm.js";const Be={online:"OnlineCar",offline:"OfflineCar",repair:"Repair",blown:"Blown"};async function ne(l,i){const a=Be[i];if(!a)return!1;try{return await Pe.execute("car",l,a),!0}catch{return!1}}function Ee(l,i){const a=l??(i?`http://${i}:8081`:null);a&&window.open(a,"_blank","noopener,noreferrer")}const Se={class:"battery-strip"},De={class:"card-head"},He={class:"title-block"},Oe={class:"vid"},ze=["title"],Te={class:"card-body"},Ue={class:"thumb"},Fe={class:"metrics"},Re={class:"metric-row"},Ne={class:"value mono"},je={class:"metric-row"},We={class:"metric-row"},Ke={class:"metric-row"},Ge={class:"value"},qe={class:"metric-row"},Je={class:"value"},Qe={class:"icon-grid"},Xe={class:"icon-cell",title:"CPU"},Ye={class:"icon-cell",title:"内存"},Ze={class:"icon-cell",title:"报警"},et={class:"icon-cell",title:"连接"},tt={class:"card-foot"},nt=J({__name:"VehicleHealthCard",props:{vehicle:{},selected:{type:Boolean},canWrite:{type:Boolean}},emits:["select","maintenanceChanged"],setup(l,{emit:i}){const a=l,w=i,x={idle:"空闲",running:"运行",charging:"充电",paused:"暂停",fault:"故障",offline:"离线"},A=d(()=>x[a.vehicle.state]??a.vehicle.state),p=d(()=>{const t=a.vehicle.batterySoc??0,e=t>1?t:t*100;return Math.max(0,Math.min(100,Math.round(e)))}),S=d(()=>{const t=p.value;return t<20?"#f56c6c":t<50?"#e6a23c":"#67c23a"}),g=d(()=>a.vehicle.maintenanceMode==="online"),D=d(()=>({"is-selected":a.selected,"is-alarm":a.vehicle.isAlarmActive,"is-offline":a.vehicle.maintenanceMode==="offline"||a.vehicle.state==="offline","is-maintenance":a.vehicle.maintenanceMode==="repair"||a.vehicle.maintenanceMode==="blown","is-unreachable":a.vehicle.reachable===!1})),H=d(()=>{const t=a.vehicle.latencyMs;return t==null?"—":a.vehicle.reachable===!1?"超时":`${t} ms`}),O=d(()=>{const t=a.vehicle.latencyMs;return a.vehicle.reachable===!1?"danger":t!=null&&t>80?"warn":""}),$=d(()=>{const t=a.vehicle.faultRatePercent;return t==null?"—":`${t.toFixed(2)}%`}),k=d(()=>{const t=a.vehicle.faultRatePercent??0;return t>=5?"danger":t>=1?"warn":""}),y=d(()=>{const t=a.vehicle.cpuPercent;return t!=null?`${Math.round(t)}%`:"—"}),C=d(()=>{const t=a.vehicle.memPercent;return t!=null?`${Math.round(t)}%`:"—"});function V(){w("select",a.vehicle.id)}function L(t){t.target.closest(".head-actions")||Ee(a.vehicle.onboardUrl,a.vehicle.ip)}async function _(t){const e=a.vehicle.rawId??parseInt(a.vehicle.id.replace(/\D/g,""),10);if(!Number.isFinite(e))return;await ne(e,t)?(G.success("维护状态已更新"),w("maintenanceChanged")):G.error("维护操作失败")}async function s(t){if(!a.canWrite)return;const e=t?"online":"offline";try{await F.confirm(t?"确认将车辆上线?":"确认将车辆下线维护?","维护确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await _(e)}catch{}}async function f(t){if(!a.canWrite)return;const e=t;if(e==="blown"){try{await F.confirm("返厂检修将停止调度并清空站点,确认?","危险操作",{type:"error",confirmButtonText:"确定",cancelButtonText:"取消"}),await _(e)}catch{}return}if(e==="repair"){try{await F.confirm("现场检修:不调度但仍刷新状态,确认?","维护确认",{type:"warning"}),await _(e)}catch{}return}await _(e)}return(t,e)=>{const r=oe,b=Q,h=Y,R=X,U=Z,z=ce,P=ee;return I(),B("div",{class:T(["vehicle-health-card",D.value]),onClick:V,onDblclick:L},[n("div",Se,[o(r,{percentage:p.value,"stroke-width":4,"show-text":!1,color:S.value},null,8,["percentage","color"])]),n("div",De,[n("div",He,[n("span",Oe,v(l.vehicle.id),1),n("span",{class:"vname",title:l.vehicle.name},v(l.vehicle.name),9,ze)]),n("div",{class:"head-actions",onClick:e[1]||(e[1]=ie(()=>{},["stop"]))},[o(U,{trigger:"click",onCommand:f},{dropdown:c(()=>[o(R,null,{default:c(()=>[o(h,{command:"online"},{default:c(()=>[...e[2]||(e[2]=[M("上线",-1)])]),_:1}),o(h,{command:"offline"},{default:c(()=>[...e[3]||(e[3]=[M("下线维护",-1)])]),_:1}),o(h,{command:"repair"},{default:c(()=>[...e[4]||(e[4]=[M("现场检修",-1)])]),_:1}),o(h,{command:"blown",divided:""},{default:c(()=>[...e[5]||(e[5]=[M("返厂检修",-1)])]),_:1})]),_:1})]),default:c(()=>[o(b,{size:"small",text:"",icon:u(re)},null,8,["icon"])]),_:1}),o(z,{"model-value":g.value,size:"small",disabled:!l.canWrite,"inline-prompt":"","active-text":"开","inactive-text":"关",onChange:e[0]||(e[0]=N=>s(!!N))},null,8,["model-value","disabled"])])]),n("div",Te,[n("div",Ue,[o(P,{size:36},{default:c(()=>[o(u(ue))]),_:1})]),n("div",Fe,[n("div",Re,[e[6]||(e[6]=n("span",{class:"label"},"IP",-1)),n("span",Ne,v(l.vehicle.ip??"—"),1)]),n("div",je,[e[7]||(e[7]=n("span",{class:"label"},"延迟",-1)),n("span",{class:T(["value",O.value])},v(H.value),3)]),n("div",We,[e[8]||(e[8]=n("span",{class:"label"},"故障率",-1)),n("span",{class:T(["value",k.value])},v($.value),3)]),n("div",Ke,[e[9]||(e[9]=n("span",{class:"label"},"群组",-1)),n("span",Ge,v(l.vehicle.group??"—"),1)]),n("div",qe,[e[10]||(e[10]=n("span",{class:"label"},"状态",-1)),n("span",Je,v(l.vehicle.lstatus??A.value),1)])])]),n("div",Qe,[n("div",Xe,[o(P,null,{default:c(()=>[o(u(de))]),_:1}),n("span",null,v(y.value),1)]),n("div",Ye,[o(P,null,{default:c(()=>[o(u(fe))]),_:1}),n("span",null,v(C.value),1)]),n("div",Ze,[o(P,{class:T({"is-alarm":l.vehicle.isAlarmActive})},{default:c(()=>[o(u(me))]),_:1},8,["class"]),n("span",null,v(l.vehicle.isAlarmActive?"报警":"正常"),1)]),n("div",et,[o(P,{class:T({"is-down":l.vehicle.reachable===!1})},{default:c(()=>[o(u(ve))]),_:1},8,["class"]),n("span",null,v(l.vehicle.reachable===!1?"不可达":"可达"),1)])]),n("div",tt,[n("span",null,"电量 "+v(p.value)+"%",1),e[11]||(e[11]=n("span",{class:"hint"},"双击打开车载界面",-1))])],34)}}}),at=te(nt,[["__scopeId","data-v-30c5a691"]]);async function lt(){const{data:l}=await pe.get("/sl/projection/fleet/health");return Array.isArray(l)?l:[]}const st=5e3,ot=2e4;function it(l){const i=(l.lstatus??"").toLowerCase();return/返厂|blown/.test(i)?"blown":/现场检修|repair/.test(i)?"repair":/下线|offline/.test(i)||l.state==="offline"?"offline":"online"}function rt(l,i){return{...l,ip:i?.ip??l.ip,onboardUrl:i?.onboardUrl??l.onboardUrl??(l.ip?`http://${l.ip}:8081`:void 0),latencyMs:i?.latencyMs,reachable:i?.reachable,faultRatePercent:i?.faultRatePercent,isAlarmActive:i?.isAlarmActive??l.state==="fault",cpuPercent:i?.cpuPercent,memPercent:i?.memPercent,maintenanceMode:it(l)}}function ct(){const l=q([]),i=q([]),a=E(!1),w=E(!1),x=E(null);let A=null,p=null;const S=d(()=>{const s=new Map;for(const f of i.value)s.set(f.carId,f);return s}),g=d(()=>l.value.map(s=>{const f=s.rawId??parseInt(s.id.replace(/\D/g,""),10),t=Number.isFinite(f)?S.value.get(f):void 0;return rt(s,t)})),D=d(()=>g.value.length),H=d(()=>g.value.filter(s=>s.state!=="offline"&&s.maintenanceMode==="online").length),O=d(()=>g.value.filter(s=>s.maintenanceMode==="offline"||s.maintenanceMode==="repair"||s.maintenanceMode==="blown").length),$=d(()=>g.value.filter(s=>s.isAlarmActive).length),k=d(()=>g.value.filter(s=>s.reachable===!1).length);async function y(){a.value=!0;try{l.value=await Ve()}finally{a.value=!1}}async function C(){w.value=!0;try{i.value=await lt()}finally{w.value=!1}}async function V(){await Promise.all([y(),C()])}function L(s,f){const t=l.value.findIndex(r=>(r.rawId??parseInt(r.id.replace(/\D/g,""),10))===s);if(t<0)return;const e=[...l.value];e[t]={...e[t],...f,lastUpdate:new Date().toISOString()},l.value=e}const _=Le({extraEventKinds:["alarm","car-state"],autoConnect:!0});return _.on(s=>{if(s.kind==="car-state"&&s.payload&&typeof s.payload=="object"){const f=s.payload,t=f.rawId;t!=null&&L(t,{state:f.state,lstatus:f.lstatus})}if(s.kind==="alarm"&&s.payload&&typeof s.payload=="object"){const f=s.payload;if(f.carId!=null){const t=f.action==="raise"||f.action==="update",e=i.value.findIndex(r=>r.carId===f.carId);if(e>=0){const r=[...i.value];r[e]={...r[e],isAlarmActive:t},i.value=r}L(f.carId,{state:t?"fault":void 0})}}}),he(()=>{V(),A=setInterval(()=>void y(),st),p=setInterval(()=>void C(),ot)}),_e(()=>{A&&clearInterval(A),p&&clearInterval(p),_.disconnect()}),{cardModels:g,loading:a,healthLoading:w,selectedId:x,totalCount:D,onlineCount:H,maintenanceCount:O,alarmCount:$,unreachableCount:k,refreshAll:V,loadCars:y,loadHealth:C}}const ut={class:"vehicle-hub-page"},dt={class:"hub-toolbar"},ft={class:"stats-row"},mt={class:"stat"},vt={class:"num"},pt={class:"stat online"},ht={class:"num"},_t={class:"stat warn"},bt={class:"num"},wt={class:"stat danger"},gt={class:"num"},yt={class:"stat muted"},Ct={class:"num"},It={class:"filters-row"},Mt={class:"card-grid"},xt=J({__name:"VehicleHubView",setup(l){const i=be(),a=d(()=>i.scope==="Platform"||(i.effectivePermissions?.allowedOps??[]).includes("*")),{cardModels:w,loading:x,healthLoading:A,selectedId:p,totalCount:S,onlineCount:g,maintenanceCount:D,alarmCount:H,unreachableCount:O,refreshAll:$}=ct(),k=E(""),y=E(""),C=E(""),V=[{value:"idle",label:"空闲"},{value:"running",label:"运行"},{value:"charging",label:"充电"},{value:"paused",label:"暂停"},{value:"fault",label:"故障"},{value:"offline",label:"离线"}],L=d(()=>{const t=new Set;for(const e of w.value)e.group&&t.add(e.group);return[...t]}),_=d(()=>{const t=k.value.trim().toLowerCase(),e=t?t.split(/\s+/).filter(Boolean):[];return w.value.filter(r=>{if(y.value&&r.state!==y.value||C.value&&r.group!==C.value)return!1;if(!e.length)return!0;const b=[r.id,r.name,r.ip,r.group,r.lstatus].filter(Boolean).join(" ").toLowerCase();return e.every(h=>b.includes(h))})}),s=d(()=>p.value?[p.value]:[]);async function f(t){const e=t,r=_.value.filter(b=>p.value?b.id===p.value:!0);if(r.length)try{await F.confirm(`对 ${r.length} 辆车执行「${t}」?`,"批量维护",{type:"warning"});for(const b of r){const h=b.rawId??parseInt(b.id.replace(/\D/g,""),10);Number.isFinite(h)&&await ne(h,e)}G.success("批量操作已提交"),await $()}catch{}}return(t,e)=>{const r=Ce,b=xe,h=Ie,R=ee,U=Q,z=Y,P=X,N=Z,ae=ke,le=ge;return I(),B("div",ut,[n("div",dt,[n("div",ft,[n("div",mt,[n("span",vt,v(u(S)),1),e[4]||(e[4]=n("span",{class:"label"},"总数",-1))]),n("div",pt,[n("span",ht,v(u(g)),1),e[5]||(e[5]=n("span",{class:"label"},"在线",-1))]),n("div",_t,[n("span",bt,v(u(D)),1),e[6]||(e[6]=n("span",{class:"label"},"维护中",-1))]),n("div",wt,[n("span",gt,v(u(H)),1),e[7]||(e[7]=n("span",{class:"label"},"报警",-1))]),n("div",yt,[n("span",Ct,v(u(O)),1),e[8]||(e[8]=n("span",{class:"label"},"不可达",-1))])]),n("div",It,[o(r,{modelValue:k.value,"onUpdate:modelValue":e[0]||(e[0]=m=>k.value=m),size:"small",clearable:"",placeholder:"搜索 ID / 名称 / IP",class:"search-input","prefix-icon":u(Me)},null,8,["modelValue","prefix-icon"]),o(h,{modelValue:y.value,"onUpdate:modelValue":e[1]||(e[1]=m=>y.value=m),size:"small",clearable:"",placeholder:"状态",class:"filter-select"},{default:c(()=>[(I(),B(j,null,W(V,m=>o(b,{key:m.value,label:m.label,value:m.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),o(h,{modelValue:C.value,"onUpdate:modelValue":e[2]||(e[2]=m=>C.value=m),size:"small",clearable:"",placeholder:"群组",class:"filter-select"},{default:c(()=>[(I(!0),B(j,null,W(L.value,m=>(I(),K(b,{key:m,label:m,value:m},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),o(N,{disabled:!a.value||!s.value.length,onCommand:f},{dropdown:c(()=>[o(P,null,{default:c(()=>[o(z,{command:"online"},{default:c(()=>[...e[10]||(e[10]=[M("批量上线",-1)])]),_:1}),o(z,{command:"offline"},{default:c(()=>[...e[11]||(e[11]=[M("批量下线",-1)])]),_:1}),o(z,{command:"repair"},{default:c(()=>[...e[12]||(e[12]=[M("批量现场检修",-1)])]),_:1})]),_:1})]),default:c(()=>[o(U,{size:"small",disabled:!a.value||!s.value.length},{default:c(()=>[e[9]||(e[9]=M(" 批量维护 ",-1)),o(R,{class:"el-icon--right"},{default:c(()=>[o(u(Ae))]),_:1})]),_:1},8,["disabled"])]),_:1},8,["disabled"]),o(U,{size:"small",icon:u($e),loading:u(x)||u(A),onClick:u($)},{default:c(()=>[...e[13]||(e[13]=[M(" 刷新 ",-1)])]),_:1},8,["icon","loading","onClick"])])]),we((I(),B("div",Mt,[(I(!0),B(j,null,W(_.value,m=>(I(),K(at,{key:m.id,vehicle:m,selected:u(p)===m.id,"can-write":a.value,onSelect:e[3]||(e[3]=se=>p.value=se),onMaintenanceChanged:u($)},null,8,["vehicle","selected","can-write","onMaintenanceChanged"]))),128)),!_.value.length&&!u(x)?(I(),K(ae,{key:0,description:"无匹配车辆"})):ye("",!0)])),[[le,u(x)&&!u(w).length]]),e[14]||(e[14]=n("p",{class:"footnote"},"故障率 = 报警占用时长 ÷ 自上线以来运行时长(SimpleLite 进程内累计)",-1))])}}}),Nt=te(xt,[["__scopeId","data-v-16eb28f6"]]);export{Nt as default};
|