You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xy-frontend/src/views/realTimeMonitor/components/takeVideoButton.vue

317 lines
8.3 KiB
Vue

<template>
<div class="videobtnbox">
<!-- <el-button type="primary" @click="handleTakePic" :loading="picLoading"
>主动录像
</el-button> -->
<el-dropdown trigger="click" @command="handleCommandpic">
<el-button type="primary" :loading="picLoading">
主动录像<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="picdropStyle">
<el-dropdown-item
:command="item.channelid"
v-for="(item, index) in channelIdList"
:key="index"
>{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
<el-dialog
class="videoDialog"
title="配置参数"
:visible.sync="videoVisible"
>
<el-form :model="videoForm" label-width="94px" ref="videoRef">
<el-form-item label="码流类型">
<el-select v-model="videoForm.stream">
<el-option label="主码流" value="0"></el-option>
<el-option label="从码流" value="1"></el-option>
<el-option label="第3码流" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item
label="时间 s(秒)"
prop="time"
:rules="[
{ required: true, message: '时间不能为空' },
{ type: 'number', message: '时间必须为数字值' },
]"
>
<el-input-number
v-model="videoForm.time"
:min="1"
:max="60"
></el-input-number>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="videoVisible = false">取 消</el-button>
<el-button type="primary" @click="anVideoFn">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getTermStatus,
setTermCamera,
getTakePicStatusJoggle,
getTakePicPhotoStatusJoggle,
} from "@/utils/api/index";
export default {
data() {
return {
picLoading: false,
statusTimer: null,
statusNum: 0,
picPimer: null,
picNum: 0,
videoVisible: false,
pzchannelId: "",
videoForm: {
stream: "0",
time: 20,
},
};
},
watch: {
// protocol: {
// handler(newVal, oldVal) {},
// deep: true,
// immediate: true,
// },
termId: {
handler(newVal, oldVal) {
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
this.picLoading = false;
},
deep: true,
immediate: true,
},
// channelId: {
// handler(newVal, oldVal) {},
// deep: true,
// immediate: true,
// },
},
computed: {
termId() {
return this.$store.state.termId;
},
channelIdList() {
return this.$store.state.channelIdList;
},
protocol() {
return this.$store.state.protocol;
},
},
methods: {
handleCommandpic(command) {
console.log(command);
this.pzchannelId = command;
this.picLoading = true;
getTermStatus({ termId: this.termId }).then((res) => {
console.log(res);
if (res.data.isonline) {
console.log(this.protocol);
if (this.protocol == "65281") {
this.videoVisible = true;
} else {
this.picLoading = true;
let params = [
{
name: "act",
value: "capture",
},
{
name: "channel",
value: command,
},
{
name: "preset",
value: 255,
},
{
name: "type",
value: 1,
},
];
this.setTermFn(params);
}
} else {
this.picLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
anVideoFn() {
this.$refs.videoRef.validate((valid) => {
if (valid) {
this.videoVisible = false;
this.picLoading = true;
let params = [
{
name: "act",
value: "capture",
},
{
name: "channel",
value: this.pzchannelId,
},
{
name: "preset",
value: 255,
},
{
name: "type",
value: 1,
},
{
name: "stream",
value: this.videoForm.stream,
},
{
name: "videoTime",
value: this.videoForm.time,
},
];
this.setTermFn(params);
} else {
return false;
}
});
},
//下发命令
setTermFn(val) {
setTermCamera({
termId: this.termId,
list: val,
})
.then((res) => {
console.log(res);
this.getTakePicStatus(res.data);
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusTimer = window.setInterval(() => {
this.getTakePicStatus(res.data);
this.statusNum++;
}, 3000);
})
.catch((err) => {});
},
//查询命令是否下发成功
getTakePicStatus(val) {
console.log(val);
getTakePicStatusJoggle({
requestid: val.requestId,
termId: this.termId,
photoTime: new Date(val.date).getTime(),
})
.then((res) => {
console.log(res);
//res.data 0 状态未知 1 成功 2失败
if (res.data.cmaStatus != 1 && this.statusNum >= 5) {
this.clearFn();
this.$message({
duration: 1500,
showClose: true,
message: "下发指令超时,请重试!",
type: "warning",
});
} else if (res.data.cmaStatus == 1 || res.data.picStatus == true) {
this.clearFn();
this.$message({
duration: 1500,
showClose: true,
message: "下发指令成功!",
type: "success",
});
clearInterval(this.picPimer);
this.picPimer = null;
this.picPimer = window.setInterval(() => {
this.newPicApi(val);
this.picNum++;
}, 8000);
}
})
.catch((err) => {
console.log(err); //代码错误、请求失败捕获
});
},
//获取最新的图片
newPicApi(val) {
getTakePicPhotoStatusJoggle({
requestid: val.requestId,
termId: this.termId,
photoTime: new Date(val.date).getTime(),
}).then((res) => {
console.log(res.data);
if (res.data == true && this.picNum < 10) {
// console.log(this.$parent.$parent);
this.$parent.$parent.getPhotoList(
-1,
new Date(val.date).getTime(),
this.termId
); //获取图片列表是传当前设备的 id 和termid
this.$message({
duration: 1500,
showClose: true,
message: "已返回最新视频!",
type: "success",
});
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
console.log("已返回最新视频!");
} else if (res.data == false && this.picNum > 10) {
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
}
});
},
clearFn() {
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
this.picLoading = false;
},
},
};
</script>
<style lang="less">
.videobtnbox {
.videoDialog {
.el-dialog {
width: 380px;
}
.el-input,
.el-input-number {
width: 214px;
}
.dialog-footer {
.el-button--default,
.el-button--primary {
width: 80px !important;
}
.el-button + .el-button {
margin-left: 10px !important;
}
}
}
}
</style>