index.vue 2.92 KB
<template>
  <BasicTable
    class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700 p-4"
    @register="registerTable"
  >
    <template #hasAudio="{ record }">
      <Switch
        :checked="record.status === 1"
        :loading="record.pendingStatus"
        checkedChildren="开启"
        unCheckedChildren="关闭"
        @change="(checked: boolean) => handleTurnVideo(checked, record)"
      />
    </template>
    <template #action="{ record }">
      <TableAction
        :actions="[
          {
            label: '播放',
            auth: 'api:yt:sceneLinkage:get',
            icon: 'ant-design:play-circle-outlined',
            onClick: handlePlay.bind(null, record),
          },
          {
            label: '停止点播',
            auth: 'api:yt:sceneLinkage:get',
            icon: 'ant-design:pause-outlined',
            onClick: handleStopPlay.bind(null, record),
          },
        ]"
      />
    </template>
  </BasicTable>
  <VideoModal @register="registerModal" />
</template>

<script lang="ts" setup>
  import { configColumns, searchFormSchema } from './config';
  import { BasicTable, useTable, TableAction } from '/@/components/Table';
  import { Switch } from 'ant-design-vue';
  import { DeviceRecord } from '/@/api/device/model/deviceModel';
  import VideoModal from './videoModal.vue';
  import { useModal } from '/@/components/Modal';
  import { useMessage } from '/@/hooks/web/useMessage';
  import { getVideoChannelList } from '/@/api/device/videoChannel';
  import { stopOnDemandVideoApiGet } from '/@/api/camera/cameraManager';

  const props = defineProps<{ deviceDetail: DeviceRecord }>();

  const { createMessage } = useMessage();

  const [registerModal, { openModal }] = useModal();

  const [registerTable, { setProps, setSelectedRowKeys, reload }] = useTable({
    api: getVideoChannelList,
    columns: configColumns,
    showTableSetting: true,
    bordered: true,
    showIndexColumn: false,
    beforeFetch: (params: Recordable) => {
      return { ...params, tbDeviceId: props.deviceDetail.tbDeviceId };
    },
    formConfig: {
      labelWidth: 120,
      schemas: searchFormSchema,
    },
    useSearchForm: true,
  });

  const handleTurnVideo = async (checked: Boolean, _record: Recordable) => {
    setProps({
      loading: true,
    });
    setSelectedRowKeys([]);
    const newStatus = checked ? 1 : 0;
    try {
      if (newStatus) createMessage.success('开启成功');
      else createMessage.success('关闭成功');
    } finally {
      setProps({
        loading: false,
      });
      reload();
    }
  };

  const handlePlay = (record: Recordable) => {
    openModal(true, {
      record,
      ifShowGBT: true,
    });
  };

  //停止点播
  const handleStopPlay = async (record: Recordable) => {
    if (!record) return;
    const { deviceId, channelId } = record;
    if (await stopOnDemandVideoApiGet(deviceId, channelId)) {
      createMessage.success('已停止点播');
    }
  };
</script>