|
|
@@ -91,21 +91,45 @@
|
|
|
>
|
|
|
<a-space>
|
|
|
<a-range-picker v-model:value="deviceActionParams.times" />
|
|
|
- <a-select width="80px" v-model:value="deviceActionParams.recordFormat" >
|
|
|
- <a-select-options v-for="item in SpaceController.recordFormat" :key="item" :value="item" >
|
|
|
+ <a-select style="width: 170px;" v-if="activeTabKey === 'record'" v-model:value="deviceActionParams.recordFormat" >
|
|
|
+ <a-select-option v-for="item in SpaceController.recordFormat" :key="item" :value="item" >
|
|
|
{{item}}
|
|
|
- </a-select-options>
|
|
|
+ </a-select-option>
|
|
|
</a-select>
|
|
|
- <a-button type="primary" @click="search">搜索</a-button>
|
|
|
+ <a-select style="width: 170px;" v-if="activeTabKey === 'ai'" v-model:value="deviceActionParams.aiId" >
|
|
|
+ <a-select-option v-for="item in state.aiList" :key="item.aiId" :value="item.aiId" >
|
|
|
+ {{item.aiName}}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ <a-button type="primary" @click="searchDevice">搜索</a-button>
|
|
|
</a-space>
|
|
|
<!-- 视频 图片区域 -->
|
|
|
- <a-row :gutter="[8, 8]" style="margin-top: 20px;" >
|
|
|
- <a-col :span="4" v-for="item in state.deviceMediaList" :key="item" >
|
|
|
- <div class="media-card">
|
|
|
-
|
|
|
- </div>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
+ <a-spin :spinning="state.loading">
|
|
|
+ <a-row :gutter="[8, 8]" style="margin-top: 20px;" >
|
|
|
+ <a-col :span="4" v-for="item in state.deviceMediaList" :key="item" >
|
|
|
+ <div class="media-card">
|
|
|
+ <video
|
|
|
+ v-if="activeTabKey === 'record'"
|
|
|
+ :controls="false"
|
|
|
+ :src="item.recordUrl"
|
|
|
+ ></video>
|
|
|
+ <div v-else-if="activeTabKey === 'thumb'" >
|
|
|
+ <a-image
|
|
|
+ width="100%"
|
|
|
+ height="80px"
|
|
|
+ style="object-fit: cover;display: block;"
|
|
|
+ :src="item.thumbUrl"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div v-else-if="activeTabKey === 'ai'" style="height: 85px;" >
|
|
|
+ <video v-if="item.aiRetType === 'VIDEO'" :controls="false" :src="item.aiRetUrl"></video>
|
|
|
+ <a-image width="100%" height="80px" style="object-fit: cover;display: block;" v-else :controls="false" :src="item.aiRetUrl"></a-image>
|
|
|
+ </div>
|
|
|
+ <div class="craete-time">{{dayjs(item.createAt).format('YYYY/MM/DD HH:mm:ss')}}</div>
|
|
|
+ </div>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-spin>
|
|
|
</a-card>
|
|
|
</modal-pro>
|
|
|
</template>
|
|
|
@@ -113,7 +137,7 @@
|
|
|
import { InputTsx } from '@/components/MicroComponents/index'
|
|
|
import { reactive, onMounted, nextTick, ref, getCurrentInstance, watch } from 'vue'
|
|
|
import { Form } from 'ant-design-vue'
|
|
|
-import { SpaceController } from '@/controller'
|
|
|
+import { OperatorController, SpaceController } from '@/controller'
|
|
|
import { useRoute } from 'vue-router'
|
|
|
import dayjs from 'dayjs'
|
|
|
|
|
|
@@ -235,12 +259,16 @@ const state = reactive<{
|
|
|
visible: boolean,
|
|
|
activeVisible: boolean,
|
|
|
spaceList: CVS.space[]
|
|
|
- deviceMediaList: any[]
|
|
|
+ deviceMediaList: any[],
|
|
|
+ aiList: CVS.Operator[]
|
|
|
+ loading: boolean
|
|
|
}>({
|
|
|
visible: false,
|
|
|
activeVisible: false,
|
|
|
spaceList: [],
|
|
|
- deviceMediaList: []
|
|
|
+ deviceMediaList: [],
|
|
|
+ aiList: [],
|
|
|
+ loading: false
|
|
|
})
|
|
|
|
|
|
const deviceActionParams = reactive({
|
|
|
@@ -250,7 +278,8 @@ const deviceActionParams = reactive({
|
|
|
recordFormat: '',
|
|
|
deviceId: '',
|
|
|
page: 1,
|
|
|
- pageSize: 10
|
|
|
+ pageSize: 10,
|
|
|
+ aiId: null
|
|
|
})
|
|
|
|
|
|
watch(
|
|
|
@@ -287,12 +316,16 @@ const { resetFields, validate, validateInfos } = useForm(deviceState, {
|
|
|
stream: [{ required: true, message: '请填写stream名称' }]
|
|
|
})
|
|
|
|
|
|
+const searchDevice = () => getMedia()
|
|
|
+
|
|
|
const onTabChange = (key: 'record' | 'thumb' | 'ai') => {
|
|
|
activeTabKey.value = key
|
|
|
}
|
|
|
|
|
|
const getMedia = async () => {
|
|
|
+ state.loading = true
|
|
|
const { data, sum } = await deviceActionMap.get(activeTabKey.value)?.get(deviceActionParams as any)
|
|
|
+ state.loading = false
|
|
|
state.deviceMediaList = data
|
|
|
console.log(state.deviceMediaList)
|
|
|
}
|
|
|
@@ -337,19 +370,36 @@ const getSpaceList = async () => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+const getAiList = async () => {
|
|
|
+ state.aiList = await OperatorController.list()
|
|
|
+}
|
|
|
+
|
|
|
const search = () => {
|
|
|
tableProDom.value.reload()
|
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
|
getSpaceList()
|
|
|
+ getAiList()
|
|
|
})
|
|
|
</script>
|
|
|
<style lang='less' scoped >
|
|
|
|
|
|
.media-card {
|
|
|
width: 100%;
|
|
|
- height: 80px;
|
|
|
- background-color: pink;
|
|
|
+ height: 85px !important;
|
|
|
+ background-color: #000;
|
|
|
+ video {
|
|
|
+ width: 100%;
|
|
|
+ height: 85px !important;
|
|
|
+ }
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ height: 85px;
|
|
|
+ display: block;
|
|
|
+ }
|
|
|
+ .craete-time {
|
|
|
+ margin-top: 5px;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|