camera-preview.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  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. electronicFence: string;
  135. status: 0 | 1;
  136. }
  137. interface CreateCameraAlgoParam {
  138. algoIds: number[];
  139. cameraId: number;
  140. }
  141. /** 保存相机的某个算法 */
  142. export const createCameraAlgoApi = (param: CreateCameraAlgoParam) => {
  143. return http.request({
  144. url: '/admin/algo/saveCameraAlgoWithConfig',
  145. data: param,
  146. method: 'post',
  147. });
  148. };
  149. /** 开启或者关闭算法 */
  150. export const updateCameraAlgoRelStatus = (param: SaveCameraAlgoParam & { id: number }) => {
  151. return http.request({
  152. url: '/admin/algo/updateCameraAlgoRelStatus',
  153. data: param,
  154. method: 'put',
  155. });
  156. };
  157. /** 更新相机的某个算法 */
  158. export const updateCameraAlgoApi = (param: SaveCameraAlgoParam & { id: number }) => {
  159. return http.request({
  160. url: '/admin/algo/updateCameraAlgoRel',
  161. data: param,
  162. method: 'put',
  163. });
  164. };
  165. /** 开启/关闭相机的某个算法(为日志区分而新增的接口) */
  166. export const updateCameraAlgoStatusApi = (param: SaveCameraAlgoParam & { id: number }) => {
  167. return http.request({
  168. url: '/admin/algo/updateCameraAlgoRelStatus',
  169. data: param,
  170. method: 'put',
  171. });
  172. };
  173. /** 删除相机的某个算法 */
  174. export const deleteCameraAlgoApi = (params: { cameraId: number; algoId: number }) => {
  175. const paramString = qs.stringify(params);
  176. return http.request({
  177. url: '/admin/algo/deleteAlgo?' + paramString,
  178. method: 'delete',
  179. });
  180. };
  181. export interface GetFenceParams {
  182. algoId: number;
  183. cameraId: number;
  184. presetToken: string;
  185. }
  186. /** 查询电子围栏 */
  187. export const getFenceApi = (params: GetFenceParams): Promise<{ id: number; electronicFence: string }> => {
  188. return http.request({
  189. url: '/admin/algo/queryFence',
  190. method: 'POST',
  191. params,
  192. });
  193. };
  194. // export interface SaveFenceParams {
  195. // algoId: number;
  196. // cameraId: number;
  197. // electronicFencePolygon: string;
  198. // presetToken: string;
  199. // }
  200. /** 添加电子围栏 */
  201. // export const saveFenceApi = (data: SaveFenceParams) => {
  202. // return http.request({
  203. // url: '/admin/cameraPreview/saveFence',
  204. // method: 'post',
  205. // data,
  206. // });
  207. // };
  208. export interface SaveFenceParams {
  209. /*相机id */
  210. cameraId: number;
  211. /*算法id */
  212. algoId: number;
  213. /*摄像头预置位token */
  214. presetToken: string;
  215. /*电子围栏标签 */
  216. fenceLabel?: string;
  217. /*电子围栏名称 */
  218. fenceName?: string;
  219. /*电子围栏点位信息 */
  220. fencePolygon: string;
  221. }
  222. export const saveFenceApi = (data: SaveFenceParams) => {
  223. return http.request({
  224. url: '/admin/algo/saveFence',
  225. method: 'post',
  226. data,
  227. });
  228. };
  229. export interface DeleteFenceParams {
  230. /*相机id */
  231. cameraId: number;
  232. /*算法id */
  233. algoId: number;
  234. /*摄像头预置位token */
  235. presetToken: string;
  236. fenceId: number;
  237. }
  238. /** 删除单个电子围栏 */
  239. export const deleteFenceApi = (data: DeleteFenceParams) => {
  240. return http.request({
  241. url: '/admin/algo/deleteFence',
  242. method: 'post',
  243. data,
  244. });
  245. };
  246. export interface UpdateFenceParams {
  247. /*相机id */
  248. cameraId: number;
  249. /*算法id */
  250. algoId: number;
  251. /*摄像头预置位token */
  252. presetToken: string;
  253. /*电子围栏id */
  254. fenceId: number;
  255. /*电子围栏标签 */
  256. fenceLabel?: string;
  257. /*电子围栏名称 */
  258. fenceName?: string;
  259. /*电子围栏点位信息 */
  260. fencePolygon: string;
  261. /*是否开启(该算法电子围栏总开关) */
  262. isDisabled?: boolean;
  263. }
  264. /** 编辑电子围栏 */
  265. export const editFenceApi = (data: UpdateFenceParams) => {
  266. return http.request({
  267. url: '/admin/algo/updateFence',
  268. method: 'post',
  269. data,
  270. });
  271. };
  272. // /** 删除电子围栏 */
  273. // export const deleteFenceApi = (cameraAlgoPresetRelId: number) => {
  274. // return http.request({
  275. // url: `/cameraPreview/deleteFence?cameraAlgoPresetRelId=${cameraAlgoPresetRelId}`,
  276. // method: 'delete',
  277. // });
  278. // };
  279. interface CreatePresetParam {
  280. presetName: string;
  281. cameraId: number;
  282. }
  283. /** 创建预置位 */
  284. export const createPresetApi = (data: CreatePresetParam) => {
  285. return http.request({
  286. url: `/camera/createPreset`,
  287. method: 'post',
  288. data,
  289. });
  290. };
  291. interface UpdatePresetNameParam {
  292. presetToken: string;
  293. presetName: string;
  294. cameraId: number;
  295. }
  296. /** 修改预置位名称 */
  297. export const changePresetNameApi = (data: UpdatePresetNameParam) => {
  298. return http.request({
  299. url: `/camera/changePresetName`,
  300. method: 'post',
  301. data,
  302. });
  303. };
  304. /** 删除预置位 */
  305. export const deletePresetApi = (data: { presetToken: string; cameraId: number }) => {
  306. return http.request({
  307. url: `/camera/deletePreset`,
  308. method: 'post',
  309. data,
  310. });
  311. };
  312. interface PresetDetailItem {
  313. name: string;
  314. token: string;
  315. ptzposition: {
  316. panTilt: {
  317. x: number;
  318. y: number;
  319. space: null;
  320. };
  321. zoom: {
  322. x: number;
  323. space: null;
  324. };
  325. };
  326. }
  327. /** 获取预置位列表 */
  328. export const getPresetListApi = (cameraId: number) => {
  329. return http.request<PresetDetailItem[]>(
  330. {
  331. url: `/onvif/getPresets`,
  332. // url: `/admin/algo/queryCameraPreset`,
  333. method: 'get',
  334. params: { cameraId },
  335. },
  336. {
  337. isShowErrorMessage: false,
  338. },
  339. );
  340. };
  341. /** 跳转到对应的预置位 */
  342. export const goToPresetApi = (data: { presetToken: string; cameraId: number }) => {
  343. return http.request({
  344. url: `/camera/gotoPreset`,
  345. method: 'post',
  346. data,
  347. });
  348. };
  349. export interface CameraAlgoPresetResp {
  350. algoId: string;
  351. algoCode: string;
  352. cameraId: string;
  353. cameraCode: string;
  354. presetToken: string;
  355. electronicFencePolygon: string;
  356. status: number;
  357. }
  358. /** 获取平台相机展示电子围栏的预置位和算法 */
  359. export const getAppCameraAlgoPreset = (cameraId: number): Promise<CameraAlgoPresetResp> => {
  360. return http.request({
  361. url: `/admin/algo/queryCameraPreset?cameraId=${cameraId}`,
  362. method: 'get',
  363. });
  364. };
  365. interface CameraMoveParam {
  366. cameraId: number;
  367. x: number;
  368. zoom: number;
  369. y: number;
  370. }
  371. /** 移动相机 */
  372. export const cameraMoveApi = (data: CameraMoveParam) => {
  373. return http.request({
  374. url: `/camera/move`,
  375. method: 'post',
  376. data,
  377. });
  378. };
  379. interface SaveCameraParams {
  380. cameraId: number;
  381. // 视频录制结束时间(格式"HH:mm")
  382. endAt: string;
  383. // 视频录制周期,单位是天;
  384. period: number;
  385. // 视频录制开始时间(格式"HH:mm")
  386. startAt: string;
  387. /** 分辨率 */
  388. resolution: number;
  389. }
  390. export const saveCameraParamsApi = (data: SaveCameraParams) => {
  391. return http.request({
  392. url: `/cameraPreview/saveNvr`,
  393. method: 'put',
  394. data,
  395. });
  396. };
  397. interface RenderPara {
  398. render: number | string;
  399. cameraId: number;
  400. }
  401. //相机是否选择算法渲染
  402. export const renderCamera = (data: RenderPara) => {
  403. return http.request(
  404. {
  405. url: `/admin/cameraPreview/updateRender`,
  406. method: 'put',
  407. data,
  408. },
  409. {
  410. isShowErrorMessage: false,
  411. },
  412. );
  413. };
  414. interface PresetType {
  415. algoId: number;
  416. cameraId: number;
  417. presetToken: string;
  418. }
  419. //选择相机算法预设
  420. export const choosePreset = (data: PresetType) => {
  421. return http.request({
  422. url: `/admin/algo/choosePreset`,
  423. method: 'put',
  424. data,
  425. });
  426. };
  427. interface AlgoInfoType {
  428. code: string;
  429. id: number;
  430. presetInfoList?: AlgoPresetType[];
  431. cameraCode: string;
  432. cameraId: number;
  433. name: string;
  434. }
  435. interface AlgoPresetType {
  436. electronicFencePolygon: string;
  437. presetToken: string;
  438. status: number;
  439. }
  440. /**
  441. * v4: 查询指定相机的算法预设列表
  442. * @param cameraId
  443. * @returns
  444. */
  445. export const getCameraAlgoPresetList = (cameraId: number): Promise<{ algoInfoVOList: AlgoInfoType[] }> => {
  446. return http.request({
  447. url: `/admin/algo/queryCameraAlgoPresetList?cameraId=${cameraId}`,
  448. method: 'get',
  449. });
  450. };
  451. interface UpdateFenceType {
  452. cameraCode: string;
  453. isDisplayFence: FenceDisplayStatus;
  454. }
  455. // 开启-关闭平台显示电子围栏
  456. export const updateFenceDisplayStatus = (data: UpdateFenceType) => {
  457. return http.request({
  458. url: `/admin/algo/updateFenceDisplayStatus`,
  459. method: 'put',
  460. data,
  461. });
  462. };
  463. /**
  464. * v4: 根据相机id查询相机detail
  465. * @param id
  466. * @returns
  467. */
  468. export const getCameraDeatilById = (id: number) => {
  469. return http.request({
  470. url: `/admin/cameraPreview/queryCameraDetailById?id=${id}`,
  471. method: 'post',
  472. });
  473. };