123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <template>
- <div class="tab-content h-full">
- <div class="subtitle"><span></span> <el-button type="primary" v-auth="'add'" size="small" @click="addDevice()">添加监控</el-button></div>
- <el-table :data="tableData" style="width: 100%" v-loading="loading" max-height="calc(100vh - 280px)">
- <el-table-column prop="name" label="设备名称" min-width="130" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="deviceId" label="设备ID" min-width="210" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="name" label="通道名称" min-width="140" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="model" label="型号" width="100" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="manufacturer" label="厂商" width="100" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="liveStatus" label="状态" width="100" align="center" :formatter="formatLiveStatus" show-overflow-tooltip></el-table-column>
- <el-table-column prop="keepAliveTime" label="最后心跳时间" :formatter="formatTime" width="170" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="registerTime" label="注册时间" :formatter="formatTime" width="170" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="updateAt" label="更新时间" :formatter="formatTime" width="170" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column label="操作" width="120" align="center" fixed="right">
- <template #default="scope">
- <el-button size="small" text type="primary" v-auth="'detail'" @click="view(scope.row)">查看监控</el-button>
- <el-button size="small" text type="warning" v-auth="'del'" @click="onDel(scope.row)">解绑</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-dialog title="添加监控" v-model="isShowDialog" width="400">
- <el-form v-if="isShowDialog">
- <el-form-item label="监控" style="margin-bottom: 0">
- <el-select v-model="form.resourcesKey" filterable placeholder="选择监控" :clearable="false" style="width: 100%">
- <el-option v-for="item in options" :disabled="item.disabled" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="onCancel">取 消</el-button>
- <el-button type="primary" @click="onSubmit">确 定</el-button>
- </span>
- </template>
- </el-dialog>
- <el-dialog title="预览监控" v-model="isShowPreviewDialog" width="90vh">
- <template #header>
- <span class="dialog-footer">
- <el-button type="primary" size="small" @click="openToNewWindow">新窗口预览</el-button>
- </span>
- </template>
- <iframe v-if="isShowPreviewDialog" :src="previewUrl" style="width: 100%; height: 50vh"></iframe>
- </el-dialog>
- </div>
- </template>
- <script lang="ts" setup>
- import { reactive, ref } from "vue";
- import api from "/@/api/projects";
- import { useRoute } from "vue-router";
- import { dayjs, ElMessage, ElMessageBox } from "element-plus";
- import axios from "axios";
- import { getMediaOrigin } from "/@/utils/origin";
- const route = useRoute();
- const props = defineProps({ resourcesTypes: Number });
- const isShowDialog = ref(false);
- const isShowPreviewDialog = ref(false);
- const loading = ref(false);
- const previewUrl = ref("");
- const options = ref<any[]>([]);
- const tableData = ref<any[]>([]);
- const channels = ref<any[]>([]);
- const resourcesTypes = props.resourcesTypes!;
- const projectsCode = route.params.id;
- const baseForm = {
- resourcesKey: "",
- projectsCode,
- resourcesTypes,
- };
- const form = reactive({
- ...baseForm,
- });
- getOptions();
- function getSourceList() {
- api.getProjectResourcesByCode({ projectsCode }).then((res: any) => {
- const ids = (res || []).filter((item: any) => item.resourcesTypes === resourcesTypes).map((item: any) => item.resourcesKey);
- const tableDataList: any[] = [];
- ids.forEach((id: string) => {
- const [deviceID, channelID] = id.split("-");
- const channel = channels.value.find((channel: any) => channel.deviceId === deviceID && channel.channelId === channelID);
- if (channel) {
- options.value.find((item: any) => item.value === id).disabled = true;
- tableDataList.push(channel);
- }
- });
- tableData.value = tableDataList;
- });
- }
- function getOptions() {
- // 获取流媒体设备列表,拼接成通道列表 设备ID-通道ID
- axios.get(getMediaOrigin("/gb28181/api/list?page=1&count=1000&format=json")).then((res: any) => {
- const optionsList: any[] = [];
- const channelsList: any[] = [];
- res.data.data.forEach((item: any) => {
- item.channels.forEach((channel: any) => {
- optionsList.push({ label: item.name + " - " + channel.name, value: item.deviceId + "-" + channel.channelId });
- channelsList.push({
- ...channel,
- name: item.name,
- netAddr: item.netAddr,
- registerTime: item.registerTime,
- updateAt: item.updateAt,
- keepAliveTime: item.keepAliveTime,
- deviceId: channel.deviceId,
- });
- });
- });
- options.value = optionsList;
- channels.value = channelsList;
- getSourceList();
- });
- }
- function onCancel() {
- Object.assign(form, baseForm);
- isShowDialog.value = false;
- }
- function onSubmit() {
- if (!form.resourcesKey) return ElMessage("请先选择监控");
- api.bindResources(form).then(() => {
- onCancel();
- getSourceList();
- ElMessage.success("添加成功");
- });
- }
- function addDevice() {
- isShowDialog.value = true;
- }
- function view(row: any) {
- previewUrl.value = import.meta.env.VITE_SERVER_ORIGIN + "/plugin/media/index.html?ID=" + row.channelId + "&DeviceID=" + row.deviceId + "#/0/screen-preview";
- isShowPreviewDialog.value = true;
- }
- function openToNewWindow() {
- window.open(previewUrl.value);
- isShowPreviewDialog.value = false;
- }
- function onDel(row: any) {
- ElMessageBox.confirm(`确定要解绑该监控?`, "提示", {
- confirmButtonText: "确认",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- api
- .unbindResources({
- projectsCode,
- resourcesTypes,
- resourcesKey: row.ID + "-" + row.deviceId,
- })
- .then(() => {
- getSourceList();
- ElMessage.success("解绑成功");
- });
- });
- }
- function formatTime(row: any, column: any) {
- return dayjs(row[column.property]).format("YYYY-MM-DD HH:mm:ss");
- }
- function formatLiveStatus(row: any, column: any) {
- // 0 代表空闲,1 代表正在调用 invite,2 代表正在拉流
- return row[column.property] === 0 ? "空闲" : row[column.property] === 1 ? "调用中" : "拉流中";
- }
- </script>
|