// 汇聚门户(跨站点汇总)接口。 // 这些接口由中心端后端提供,返回"所有站"的汇总数据; // 与单站业务接口不同,它们不依赖当前登录用户所属站。 // 后端未就绪时页面以空态展示,不影响其它功能。 import axios from "axios"; import request from "@/utils/request"; import { limitVideoRequest } from "@/utils/videoRequestLimit"; // 场站列表 // 返回 data: [{ id, stationCode, stationName, baseUrl, portalUrl, enabled }] export function getStationList(query, config = {}) { return request({ url: "/agg/station/all", method: "get", params: query, noAlert: true, cancelToken: config.cancelToken }); } // 本轮巡检任务统计(表计/外观/红外) // 返回 data: [{ algCategory, inspectedTaskCount, completedTaskCount, defectCount, ... }] export function getInspectionOverview(query, config = {}) { return request({ url: "/agg/statistic/inspection", method: "get", params: query, noAlert: true, cancelToken: config.cancelToken }); } // 缺陷发现趋势(最近 12 个月或 4 个季度) // 返回 data: [{ date, minorCount, generalCount, seriousCount, urgentCount, ... }] export function getDefectTrend(query, config = {}) { return request({ url: "/agg/statistic/defect", method: "get", params: query, noAlert: true, cancelToken: config.cancelToken }); } // 通道设备来源统计 // 返回 data: { totalCount, deviceSourceCounts: [{ deviceSource, count }] } export function getChannelStats(query, config = {}) { return request({ url: "/agg/statistic/channel", method: "get", params: query, noAlert: true, cancelToken: config.cancelToken }); } // 通道树 // 返回 data: 区域、巡检设备、通道三级树 export function getChannelTree(query, config = {}) { return request({ url: "/agg/tree/channel", method: "get", params: query, noAlert: true, skipWorkspaceStation: !!config.skipWorkspaceStation, cancelToken: config.cancelToken }); } // 汇聚侧实时视频启动 // 返回 data: { stationCode, cameraCode, streamId, hls, flv, status } // 拉流会占住浏览器到同一地址的连接,必须可取消,否则切页后连接一直 pending。 export function startRealtimeVideo(query, options = {}) { const { stationCode, ...data } = query || {}; const source = axios.CancelToken.source(); const promise = limitVideoRequest(registerAbort => { registerAbort(() => source.cancel("video request cancelled")); return request({ url: "/agg/video/realtime/start", method: "post", timeout: 8000, params: { stationCode }, data, noAlert: true, cancelToken: source.token }); }, options.lane || "default"); return promise; } // 汇聚侧实时视频停止 // 入参按后端要求传 stationCode + cameraCode。 // 停流不进拉流队列:离开首页时拉流可能还占着名额,停流再排队就会和业务请求一起卡住。 export function stopRealtimeVideo(query) { const { stationCode, ...data } = query || {}; return request({ url: "/agg/video/realtime/stop", method: "post", params: { stationCode }, data, noAlert: true }); } // 汇聚侧云台控制:按摄像头所属站点代理转发 // stationCode 取当前控制摄像头所在站(而非顶部站名筛选),以查询串方式传递 // 雨刷也走这条接口:开 27、关 28,与方向/变倍/聚焦/光圈同一套控制码 export function aggPtzControl(payload) { const { stationCode, ...data } = payload || {}; return request({ url: "/agg/proxy/patrol/preset/ptzControl", method: "post", params: { stationCode }, data, noAlert: true }); } // 汇聚侧预置位列表:路径与单站一致(cameraCode 按 # 拆成 device/domain 放路径上),仅追加 ?stationCode export function aggPresetList(payload) { const { stationCode, cameraCode } = payload || {}; const value = String(cameraCode || ""); const separatorIndex = value.indexOf("#"); if (separatorIndex <= 0 || separatorIndex === value.length - 1) { return Promise.reject(new Error("摄像机编码格式不正确")); } const device = encodeURIComponent(value.slice(0, separatorIndex)); const domain = encodeURIComponent(value.slice(separatorIndex + 1)); return request({ url: `/agg/proxy/patrol/preset/presetList/${device}/${domain}`, method: "get", params: { stationCode }, noAlert: true }); } // 汇聚侧预置位保存:按摄像头所属站点代理转发 export function aggPresetCreate(payload) { const { stationCode, ...data } = payload || {}; return request({ url: "/agg/proxy/patrol/preset/presetCreate", method: "post", params: { stationCode }, data, noAlert: true }); }