// 汇聚门户(跨站点汇总)接口。
|
|
// 这些接口由中心端后端提供,返回"所有站"的汇总数据;
|
|
// 与单站业务接口不同,它们不依赖当前登录用户所属站。
|
|
// 后端未就绪时页面以空态展示,不影响其它功能。
|
|
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
|
|
});
|
|
}
|