camera-preview.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /** 相机预览的接口 */
  2. // cameraPreview/getList
  3. import { FenceDisplayStatus } from '@/types/camera/constant';
  4. import { http } from '@/utils/http/axios';
  5. import qs from 'qs';
  6. /** 相机树的结点类型 */
  7. export enum CameraTreeNodeType {
  8. /** 公司 */
  9. company = 'company',
  10. /** 车间 */
  11. workshop = 'workshop',
  12. /** 工位 */
  13. workspace = 'workspace',
  14. /** 相机 */
  15. camera = 'camera',
  16. }
  17. export interface CameraTree {
  18. id: number;
  19. name: string;
  20. code: string;
  21. children: CameraTree[];
  22. nodeType: CameraTreeNodeType;
  23. pushstreamIp: string;
  24. integrationState: number;
  25. }
  26. export interface CameraQueryForm {
  27. isEnableAlgo: boolean; // 是否添加算法:0-未勾选该条件、1-已添加
  28. isEnableRender: boolean; // 是否开启渲染:0-未勾选该条件、1-已开启
  29. queryString: string; // 搜索条件
  30. }
  31. /** 获取摄像头所在的树状结构 */
  32. export const getCameraTree = (param?: CameraQueryForm) => {
  33. return http.request<CameraTree[]>({
  34. url: '/admin/cameraPreview/queryCameraTreeByCondition',
  35. method: 'post',
  36. data: param,
  37. });
  38. };
  39. // 适用于Playback.vue/CameraTreeOldVersion.vue
  40. export const getCameraTreeOldVersion = () => {
  41. return http.request<CameraTree[]>(
  42. {
  43. url: '/cameraPreview/getList',
  44. method: 'get',
  45. },
  46. { ignoreTargetTenantId: true },
  47. );
  48. };
  49. /**
  50. * v4: 查询完整的相机树
  51. */
  52. export const getFullCameraTree = () => {
  53. return http.request<CameraTree[]>({
  54. url: '/admin/cameraPreview/queryCameraTree',
  55. method: 'GET',
  56. });
  57. };
  58. /** 算法是否启用 */
  59. export enum ALGO_ENABLED_STATUS {
  60. // 0代表启用
  61. enabled = 0,
  62. disabled = 1,
  63. }
  64. /** 电子围栏是否启用 */
  65. export enum FENCE_ENBALED_STATUS {
  66. enabled = 0,
  67. disabled = 1,
  68. }
  69. export interface AlgoItem {
  70. id: number;
  71. name: string;
  72. code?: string;
  73. showName?: string;
  74. remark?: string;
  75. url?: string;
  76. pushStatement?: string;
  77. pushLinkPrompt?: string;
  78. status?: ALGO_ENABLED_STATUS;
  79. createdAt?: string;
  80. updatedAt?: string;
  81. extra: string;
  82. }
  83. /**
  84. * v4: 获取所有算法列表
  85. */
  86. export const getAllAlgosApi = () => {
  87. return http.request<AlgoItem[]>({
  88. url: '/admin/algo/queryAlgoInfo',
  89. method: 'get',
  90. });
  91. };
  92. /** 根据相机code获取算法列表 */
  93. export const getAlgosByCameraCode = (cameraCode: string) => {
  94. return http.request<AlgoItem[]>({
  95. url: `/cameraPreview/getAlgoListWithCamera?cameraCode=${cameraCode}`,
  96. method: 'get',
  97. });
  98. };
  99. /**
  100. * v4: 根据相机ID获取绑定的算法
  101. */
  102. export const getAlgosByCameraId = (cameraId: number) => {
  103. return http.request<AlgoItem[]>({
  104. url: `/admin/algo/queryAllAlgoInfoByCameraId?cameraId=${cameraId}`,
  105. method: 'POST',
  106. });
  107. };
  108. /** 相机关联的算法信息 */
  109. export interface CameraAlgoItem {
  110. id?: number;
  111. algoId: number;
  112. cameraId?: number;
  113. code: string;
  114. name: string;
  115. detectionFrequency: number;
  116. detectionTime: string;
  117. electronicFence: number;
  118. status: ALGO_ENABLED_STATUS;
  119. algoInfo: AlgoItem;
  120. extra: string;
  121. }
  122. /** 查询某个camera下的所有算法 */
  123. export const getCameraAlgoListApi = (cameraId: number): Promise<CameraAlgoItem[]> => {
  124. return http.request({
  125. url: `/admin/algo/queryAllAlgoInfoByCameraId?cameraId=${cameraId}`,
  126. method: 'post',
  127. });
  128. };
  129. interface SaveCameraAlgoParam {
  130. algoId: number;
  131. cameraId: number;
  132. detectionFrequency?: number;
  133. detectionTime?: string;
  134. /** 电子围栏开启还是关闭 */
  135. electronicFence?: 0 | 1;
  136. /** 算法开启还是关闭 */
  137. status?: 0 | 1;
  138. }
  139. interface CreateCameraAlgoParam {
  140. algoIds: number[];
  141. cameraId: number;
  142. }
  143. /** 保存相机的某个算法 */
  144. export const createCameraAlgoApi = (param: CreateCameraAlgoParam) => {
  145. return http.request({
  146. url: '/admin/algo/saveCameraAlgoWithConfig',
  147. data: param,
  148. method: 'post',
  149. });
  150. };
  151. /** 开启或者关闭算法 */
  152. export const updateCameraAlgoRelStatus = (param: SaveCameraAlgoParam & { id: number }) => {
  153. return http.request({
  154. url: '/admin/algo/updateCameraAlgoRelStatus',
  155. data: param,
  156. method: 'put',
  157. });
  158. };
  159. /** 更新相机的某个算法 */
  160. export const updateCameraAlgoApi = (param: SaveCameraAlgoParam & { id: number }) => {
  161. return http.request({
  162. url: '/admin/algo/updateCameraAlgoRel',
  163. data: param,
  164. method: 'put',
  165. });
  166. };
  167. /** 开启/关闭相机的某个算法(为日志区分而新增的接口) */
  168. export const updateCameraAlgoStatusApi = (param: SaveCameraAlgoParam & { id: number }) => {
  169. return http.request({
  170. url: '/admin/algo/updateCameraAlgoRelStatus',
  171. data: param,
  172. method: 'put',
  173. });
  174. };
  175. /** 删除相机的某个算法 */
  176. export const deleteCameraAlgoApi = (params: { cameraId: number; algoId: number }) => {
  177. const paramString = qs.stringify(params);
  178. return http.request({
  179. url: '/admin/algo/deleteAlgo?' + paramString,
  180. method: 'delete',
  181. });
  182. };
  183. export interface GetFenceParams {
  184. algoId: number;
  185. cameraId: number;
  186. presetToken: string;
  187. }
  188. /** 查询电子围栏 */
  189. export const getFenceApi = (params: GetFenceParams): Promise<{ id: number; electronicFence: string }> => {
  190. return http.request({
  191. url: '/admin/algo/queryFence',
  192. method: 'POST',
  193. params,
  194. });
  195. };
  196. // export interface SaveFenceParams {
  197. // algoId: number;
  198. // cameraId: number;
  199. // electronicFencePolygon: string;
  200. // presetToken: string;
  201. // }
  202. /** 添加电子围栏 */
  203. // export const saveFenceApi = (data: SaveFenceParams) => {
  204. // return http.request({
  205. // url: '/admin/cameraPreview/saveFence',
  206. // method: 'post',
  207. // data,
  208. // });
  209. // };
  210. export interface SaveFenceParams {
  211. /*相机id */
  212. cameraId: number;
  213. /*算法id */
  214. algoId: number;
  215. /*摄像头预置位token */
  216. presetToken: string;
  217. /*电子围栏标签 */
  218. fenceLabel?: string;
  219. /*电子围栏名称 */
  220. fenceName?: string;
  221. /*电子围栏点位信息 */
  222. fencePolygon: string;
  223. }
  224. export const saveFenceApi = (data: SaveFenceParams) => {
  225. return http.request({
  226. url: '/admin/algo/saveFence',
  227. method: 'post',
  228. data,
  229. });
  230. };
  231. export interface DeleteFenceParams {
  232. /*相机id */
  233. cameraId: number;
  234. /*算法id */
  235. algoId: number;
  236. /*摄像头预置位token */
  237. presetToken: string;
  238. fenceId: number;
  239. }
  240. /** 删除单个电子围栏 */
  241. export const deleteFenceApi = (data: DeleteFenceParams) => {
  242. return http.request({
  243. url: '/admin/algo/deleteFence',
  244. method: 'post',
  245. data,
  246. });
  247. };
  248. export interface UpdateFenceParams {
  249. /*相机id */
  250. cameraId: number;
  251. /*算法id */
  252. algoId: number;
  253. /*摄像头预置位token */
  254. presetToken: string;
  255. /*电子围栏id */
  256. fenceId: number;
  257. /*电子围栏标签 */
  258. fenceLabel?: string;
  259. /*电子围栏名称 */
  260. fenceName?: string;
  261. /*电子围栏点位信息 */
  262. fencePolygon?: string;
  263. /*是否开启(该算法电子围栏总开关) */
  264. isDisabled?: boolean;
  265. }
  266. /** 编辑电子围栏 */
  267. export const editFenceApi = (data: UpdateFenceParams) => {
  268. return http.request({
  269. url: '/admin/algo/updateFence',
  270. method: 'post',
  271. data,
  272. });
  273. };
  274. // /** 删除电子围栏 */
  275. // export const deleteFenceApi = (cameraAlgoPresetRelId: number) => {
  276. // return http.request({
  277. // url: `/cameraPreview/deleteFence?cameraAlgoPresetRelId=${cameraAlgoPresetRelId}`,
  278. // method: 'delete',
  279. // });
  280. // };
  281. interface CreatePresetParam {
  282. presetName: string;
  283. cameraId: number;
  284. }
  285. /** 创建预置位 */
  286. export const createPresetApi = (data: CreatePresetParam) => {
  287. return http.request({
  288. url: `/camera/createPreset`,
  289. method: 'post',
  290. data,
  291. });
  292. };
  293. interface UpdatePresetNameParam {
  294. presetToken: string;
  295. presetName: string;
  296. cameraId: number;
  297. }
  298. /** 修改预置位名称 */
  299. export const changePresetNameApi = (data: UpdatePresetNameParam) => {
  300. return http.request({
  301. url: `/camera/changePresetName`,
  302. method: 'post',
  303. data,
  304. });
  305. };
  306. /** 删除预置位 */
  307. export const deletePresetApi = (data: { presetToken: string; cameraId: number }) => {
  308. return http.request({
  309. url: `/camera/deletePreset`,
  310. method: 'post',
  311. data,
  312. });
  313. };
  314. interface PresetDetailItem {
  315. name: string;
  316. token: string;
  317. ptzposition: {
  318. panTilt: {
  319. x: number;
  320. y: number;
  321. space: null;
  322. };
  323. zoom: {
  324. x: number;
  325. space: null;
  326. };
  327. };
  328. }
  329. /** 获取预置位列表 */
  330. export const getPresetListApi = (cameraId: number) => {
  331. return http.request<PresetDetailItem[]>(
  332. {
  333. url: `/onvif/getPresets`,
  334. // url: `/admin/algo/queryCameraPreset`,
  335. method: 'get',
  336. params: { cameraId },
  337. },
  338. {
  339. isShowErrorMessage: false,
  340. },
  341. );
  342. };
  343. /** 跳转到对应的预置位 */
  344. export const goToPresetApi = (data: { presetToken: string; cameraId: number }) => {
  345. return http.request({
  346. url: `/camera/gotoPreset`,
  347. method: 'post',
  348. data,
  349. });
  350. };
  351. export interface CameraAlgoPresetResp {
  352. algoId: string;
  353. algoCode: string;
  354. cameraId: string;
  355. cameraCode: string;
  356. presetToken: string;
  357. electronicFencePolygon: string;
  358. status: number;
  359. }
  360. /** 获取平台相机展示电子围栏的预置位和算法 */
  361. export const getAppCameraAlgoPreset = (cameraId: number): Promise<CameraAlgoPresetResp> => {
  362. return http.request({
  363. url: `/admin/algo/queryCameraPreset?cameraId=${cameraId}`,
  364. method: 'get',
  365. });
  366. };
  367. interface CameraMoveParam {
  368. cameraId: number;
  369. x: number;
  370. zoom: number;
  371. y: number;
  372. }
  373. /** 移动相机 */
  374. export const cameraMoveApi = (data: CameraMoveParam) => {
  375. return http.request({
  376. url: `/camera/move`,
  377. method: 'post',
  378. data,
  379. });
  380. };
  381. interface SaveCameraParams {
  382. cameraId: number;
  383. // 视频录制结束时间(格式"HH:mm")
  384. endAt: string;
  385. // 视频录制周期,单位是天;
  386. period: number;
  387. // 视频录制开始时间(格式"HH:mm")
  388. startAt: string;
  389. /** 分辨率 */
  390. resolution: number;
  391. }
  392. export const saveCameraParamsApi = (data: SaveCameraParams) => {
  393. return http.request({
  394. url: `/cameraPreview/saveNvr`,
  395. method: 'put',
  396. data,
  397. });
  398. };
  399. interface RenderPara {
  400. render: number | string;
  401. cameraId: number;
  402. }
  403. //相机是否选择算法渲染
  404. export const renderCamera = (data: RenderPara) => {
  405. return http.request(
  406. {
  407. url: `/admin/cameraPreview/updateRender`,
  408. method: 'put',
  409. data,
  410. },
  411. {
  412. isShowErrorMessage: false,
  413. },
  414. );
  415. };
  416. interface PresetType {
  417. algoId: number;
  418. cameraId: number;
  419. presetToken: string;
  420. }
  421. //选择相机算法预设
  422. export const choosePreset = (data: PresetType) => {
  423. return http.request({
  424. url: `/admin/algo/choosePreset`,
  425. method: 'put',
  426. data,
  427. });
  428. };
  429. interface AlgoInfoType {
  430. code: string;
  431. id: number;
  432. presetInfoList?: AlgoPresetType[];
  433. cameraCode: string;
  434. cameraId: number;
  435. name: string;
  436. }
  437. interface AlgoPresetType {
  438. electronicFencePolygon: string;
  439. presetToken: string;
  440. status: number;
  441. }
  442. /**
  443. * v4: 查询指定相机的算法预设列表
  444. * @param cameraId
  445. * @returns
  446. */
  447. export const getCameraAlgoPresetList = (cameraId: number): Promise<{ algoInfoVOList: AlgoInfoType[] }> => {
  448. return http.request({
  449. url: `/admin/algo/queryCameraAlgoPresetList?cameraId=${cameraId}`,
  450. method: 'get',
  451. });
  452. };
  453. interface UpdateFenceType {
  454. cameraCode: string;
  455. isDisplayFence: FenceDisplayStatus;
  456. }
  457. // 开启-关闭平台显示电子围栏
  458. export const updateFenceDisplayStatus = (data: UpdateFenceType) => {
  459. return http.request({
  460. url: `/admin/algo/updateFenceDisplayStatus`,
  461. method: 'put',
  462. data,
  463. });
  464. };
  465. /**
  466. * v4: 根据相机id查询相机detail
  467. * @param id
  468. * @returns
  469. */
  470. export const getCameraDeatilById = (id: number) => {
  471. return http.request({
  472. url: `/admin/cameraPreview/queryCameraDetailById?id=${id}`,
  473. method: 'post',
  474. });
  475. };