提交 a28ce4ad 作者: 翁进城

fix:

1. 样式修正
2. 创建航线时飞行时间改为时分秒
3. 机库创建定时与周期飞行时确认按钮增加loading状态
4. 机库回收流程后刷新无人机视频(已注释)
5. 机库列表mock去除
6. 选中机库后进行定位
7. 挂载拍照提示
8. 视图库机载资源跨域下载
上级 02df1d86
......@@ -61,7 +61,7 @@
<el-button type="text" @click="showActions = true">{{curForm.actions.length}}个动作</el-button>
</el-form-item>
<el-form-item label="航线总里程">{{distance}}m</el-form-item>
<el-form-item label="预计飞行时间">{{time}}s</el-form-item>
<el-form-item label="预计飞行时间">{{time}}</el-form-item>
</el-form>
<div class="ae-btns">
<el-button type="primary" @click="onSave">保存</el-button>
......@@ -84,6 +84,17 @@ import Utils from "../../../../../../../../../../../../components/cesiumLayer/li
import { nanoid } from "nanoid";
import Actions from "./components/actions";
/**
* 秒转时分秒
*/
function convertSecondsToHMS(seconds) {
var hours = Math.floor(seconds / 3600);
var minutes = Math.floor((seconds % 3600) / 60);
var remainingSeconds = seconds % 60;
return hours + "小时 " + minutes + "分钟 " + remainingSeconds + "秒";
}
class Airway {
uuid = nanoid();
speed = "6";
......@@ -141,7 +152,7 @@ export default {
let speed = item.speed || 1;
time += parseInt(item.distance / speed);
});
return time;
return convertSecondsToHMS(time);
},
},
mounted() {
......@@ -182,7 +193,7 @@ export default {
// 直接销毁会报错
this.$nextTick(() => {
this.cesiumViewer.dataSources.remove(this.dataSource);
})
});
},
methods: {
// 保存航线
......@@ -237,9 +248,9 @@ export default {
},
hangar: this.hangar,
callback: (data) => {
this.$emit('addDone', data.id);
this.$emit('close');
}
this.$emit("addDone", data.id);
this.$emit("close");
},
});
},
/**
......
......@@ -40,7 +40,7 @@
</el-form>
</div>
<div class="task-add-btn">
<div class="task-add__btn" @click="onConfirm">确认</div>
<el-button type="primary" size="medium" :loading="confirmLoading" @click="onConfirm">确认</el-button>
</div>
</div>
</template>
......@@ -71,6 +71,7 @@ export default {
},
},
airwayList: [], //航线列表
confirmLoading: false,
};
},
computed: {
......@@ -164,13 +165,17 @@ export default {
onConfirm() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.confirmLoading = true;
this.rootNode.$emit("taskBatchAdd", {
type: 3, //1: 日常任务 2.定时任务 3.周期任务
taskList: [{ ...this.form, airway: this.selectedAirway }], //任务数据
hangar: this.hangar,
callback: () => {
this.$emit("addDone");
this.$emit("close");
callback: ({ code }) => {
this.confirmLoading = false;
if (code === 0) {
this.$emit("addDone");
this.$emit("close");
}
},
}); // 根节点发送机库任务新增事件
} else {
......@@ -211,6 +216,7 @@ export default {
.task-add-btn {
flex-shrink: 0;
text-align: center;
.task-add__btn {
margin: auto;
......
<template>
<div class="task-add dialog1027" :class="{more: showMore}" v-interact>
<div class="task-add-header dialog-header">
<img class="dialog-header__icon" src="../../../../../../assets/images/mount_head.png" />
<div class="header__title dialog-header__title">定时任务</div>
<div class="header-right dialog-header__close">
<div class="header-right__add" @click="onTaskAdd">
......@@ -20,17 +21,8 @@
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions"
></el-date-picker>
<el-select
v-model="item.airwayId"
size="mini"
popper-class="mmc"
placeholder="请选择航线"
>
<el-option
:label="item1.name"
:value="item1.id"
v-for="(item1, index) in airwayList"
></el-option>
<el-select v-model="item.airwayId" size="mini" popper-class="mmc" placeholder="请选择航线">
<el-option :label="item1.name" :value="item1.id" v-for="(item1, index) in airwayList"></el-option>
</el-select>
<el-tooltip content="删除" placement="top">
<span class="icon-shanchu iconfont" @click="onDelTask(index)"></span>
......@@ -45,7 +37,7 @@
</div>
</div>
<div class="task-add-btn">
<div class="task-add__btn" @click="onConfirm">确认</div>
<el-button type="primary" size="medium" :loading="confirmLoading" @click="onConfirm">确认</el-button>
</div>
<div class="task-add-more" @click="showMore = !showMore">
<img src="../../../../assets/images/xb.png" width="15" />
......@@ -76,21 +68,22 @@ export default {
},
},
airwayList: [], //航线列表
confirmLoading: false,
};
},
computed: {
...mapState("MMCFlightControlCenter/hangar", ["hangar"]),
...mapState("MMCFlightControlCenter", ["airwayEntities"]),
},
mounted(){
this.rootNode.$emit('airwayListGet', {
mounted() {
this.rootNode.$emit("airwayListGet", {
pageNo: 1,
pageSize: 100,
hangar: this.hangar,
callback: (data) => {
this.airwayList = data?.records || [];
}
})
},
});
},
methods: {
...mapActions("MMCFlightControlCenter", [
......@@ -151,20 +144,26 @@ export default {
}
});
if (isOk) {
let list = this.list.map(item => {
let find = this.airwayList.find(airway => airway.id === item.airwayId);
let list = this.list.map((item) => {
let find = this.airwayList.find(
(airway) => airway.id === item.airwayId
);
return {
...item,
airway: find
}
})
airway: find,
};
});
this.confirmLoading = true;
this.rootNode.$emit("taskBatchAdd", {
type: 2, //1: 日常任务 2.定时任务 3.周期任务
taskList: list, //任务数据
hangar: this.hangar,
callback: () => {
this.$emit("addDone");
this.$emit("close");
callback: ({ code }) => {
this.confirmLoading = false;
if (code === 0) {
this.$emit("addDone");
this.$emit("close");
}
},
}); // 根节点发送机库任务新增事件
}
......@@ -262,6 +261,7 @@ export default {
.task-add-btn {
flex-shrink: 0;
text-align: center;
.task-add__btn {
width: 92px;
......
<template>
<div>
<Player
@close="$emit('close')"
:url="selectUrl"
:name="name"
:label="label"
/>
<Player ref="player" @close="$emit('close')" :url="selectUrl" :name="name" :label="label" />
<el-select v-model="selectUrl" class="select" popper-class="mmc">
<el-option
v-for="item in streamOptions"
......@@ -33,7 +28,7 @@ export default {
},
computed: {
...mapState("MMCFlightControlCenter/hangar", ["hangar"]),
...mapState("MMCFlightControlCenter/uav", ['uav']),
...mapState("MMCFlightControlCenter/uav", ["uav", "uavRealTimeData"]),
name() {
return `${this.hangar?.uav?.organizationName || ""}机库无人机`;
},
......@@ -81,13 +76,27 @@ export default {
}
return streamOptions;
},
lastMsg: null,
},
watch: {
streamOptions(){
if(this.streamOptions.length > 0){
streamOptions() {
if (this.streamOptions.length > 0) {
this.selectUrl = this.streamOptions[0].url;
}
}
},
/* "uavRealTimeData.msgList": {
immediate: true,
handler(msgList) {
// 刷新视频, 不然卡在视频最后一帧
if (msgList.length > 0) {
let msg = msgList[msgList.length - 1];
if (!this.lastMsg.text.includes('回收流程完毕') && msg.text.includes("回收流程完毕")) {
this.$refs.player.refresh();
}
this.lastMsg = msg;
}
},
}, */
},
mounted() {
this.selectUrl = this.streamOptions[0]?.url || "";
......
......@@ -86,7 +86,7 @@ export default {
inject: ["rootNode"],
data() {
return {
locationEntity: null
locationEntity: null,
};
},
computed: {
......@@ -94,6 +94,11 @@ export default {
...mapState("MMCFlightControlCenter/hangar", ["showPanel", "hangar"]),
...mapState("MMCFlightControlCenter/uav", ["uav"]),
},
watch: {
hangar() {
this.onLocation(this.hangar);
},
},
methods: {
typeName(val) {
let name = "";
......@@ -204,8 +209,12 @@ export default {
},
// 机库定位
onLocation(device) {
if (device.latitude && device.longitude) {
let viewer = this.cesiumViewer;
let viewer = this.cesiumViewer;
if (!device) {
if (this.locationEntity) {
viewer.entities.remove(this.locationEntity);
}
} else if (device.latitude && device.longitude) {
if (this.locationEntity) {
viewer.entities.remove(this.locationEntity);
}
......
......@@ -55,7 +55,7 @@ export default {
components: { Item },
data() {
return {
list: mock/* [] */,
list: /* mock */[],
deviceType: 2, // 设备类型 2鹰巢
timeHandle: null,
searchContent: '',
......
......@@ -61,7 +61,7 @@
<el-button type="text" @click="showActions = true">{{curForm.actions.length}}个动作</el-button>
</el-form-item>
<el-form-item label="航线总里程">{{distance}}m</el-form-item>
<el-form-item label="预计飞行时间">{{time}}s</el-form-item>
<el-form-item label="预计飞行时间">{{time}}</el-form-item>
</el-form>
<div class="ae-btns">
<el-button type="primary" @click="onSave" :loading="saveLoading">保存</el-button>
......@@ -84,6 +84,17 @@ import Utils from "../../../../../../../../../../components/cesiumLayer/lib/cesi
import { nanoid } from "nanoid";
import Actions from "./components/actions";
/**
* 秒转时分秒
*/
function convertSecondsToHMS(seconds) {
var hours = Math.floor(seconds / 3600);
var minutes = Math.floor((seconds % 3600) / 60);
var remainingSeconds = seconds % 60;
return hours + "小时 " + minutes + "分钟 " + remainingSeconds + "秒";
}
class Airway {
uuid = nanoid();
speed = "6";
......@@ -142,7 +153,7 @@ export default {
let speed = item.speed || 1;
time += parseInt(item.distance / speed);
});
return time;
return convertSecondsToHMS(time);
},
},
mounted() {
......
......@@ -69,6 +69,7 @@ export default {
"airlineId",
"selectMount",
"uavRealTimeData",
"isQingLiu"
]),
nxNormal() {
return this.uavRealTimeData?.healthData?.NX?.warningLevel === "NORMAL";
......@@ -88,16 +89,27 @@ export default {
* 挂载指令事件
*/
mountDirective(buffer) {
console.log("挂载指令事件", buffer);
this.$store.dispatch("MMCFlightControlCenter/uav/mountDirective", {
buffer,
mountId: this.selectMount.mountId,
callback: () => {
// this.$message.success('操作完成');
}
});
},
/**
* 挂载拍照
*/
mountTakePhoto(name) {
console.log("挂载拍照 ", name);
console.log("挂载拍照", name);
this.$store.dispatch("MMCFlightControlCenter/uav/takePhotos", {
isQingLiu: this.isQingLiu,
videoID: 1, // 视频通道ID(需保持唯一)
callback: (isOk) => {
isOk && this.$message.success(`拍照完成`);
},
})
},
/**
* 挂载窗口关闭
......
//下载文件
export default function downFile(url) {
fetch(url, {
method: "GET",
responseType: "blob",
})
.then((res) => res.blob())
.then((res) => {
var fileName = getFileName(url)+'.jpg'; //获取文件名
saveFile(res, fileName);
});
}
//保存文件
function saveFile(data, fileName) {
var export_blob = new Blob([data]);
var save_link = document.createElement("a");
document.body.appendChild(save_link);
save_link.style.display = "none";
var urlObject = window.URL.createObjectURL(export_blob);
save_link.href = urlObject;
save_link.download = fileName;
save_link.click();
document.body.removeChild(save_link);
}
//根据url获取文件名
function getFileName(url) {
var num = url.lastIndexOf("/") + 1;
var fileName = url.substring(num);
fileName = decodeURI(fileName.split("?")[0]);
return fileName;
}
......@@ -64,7 +64,7 @@
:initial-index="i"
crossorigin
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</MMCImage>
<LivePlayer
v-else
......@@ -74,7 +74,7 @@
:videoUrl="img"
:autoplay="false"
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</LivePlayer>
</template>
</template>
......@@ -108,7 +108,7 @@
:initial-index="i"
crossorigin
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</MMCImage>
<LivePlayer
v-else
......@@ -118,7 +118,7 @@
:videoUrl="img"
:autoplay="false"
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</LivePlayer>
</template>
</div>
......@@ -153,7 +153,7 @@
:initial-index="i"
crossorigin
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</MMCImage>
<LivePlayer
v-else
......@@ -163,7 +163,7 @@
:videoUrl="img"
:autoplay="false"
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</LivePlayer>
</el-checkbox>
</template>
......@@ -199,7 +199,7 @@
:initial-index="i"
crossorigin
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</MMCImage>
<LivePlayer
v-else
......@@ -209,7 +209,7 @@
:videoUrl="img"
:autoplay="false"
>
<div class="list-item__img-download" @click="onDownload(img)">下载</div>
<div class="list-item__img-download" @click.stop="onDownload(img)">下载</div>
</LivePlayer>
</el-checkbox>
</template>
......@@ -245,7 +245,7 @@ import { ViewLibrary } from "../../../../../../../../api";
import { mapState } from "vuex";
import MMCImage from "../../../../../../../../components/image";
import mock from "./mock";
import download from "downloadjs";
import download from "./download";
import LivePlayer from "@liveqing/liveplayer";
export default {
......@@ -394,12 +394,18 @@ export default {
item.imgList = item.viewLibraryRespVOS
.filter((item1) => {
// 过滤掉对应筛选下没图片链接的数据
return this.aiType == 1 ? item1.fileUrl : item1.aiImageUrl;
if (this.viewLibTab == 0) {
return this.aiType == 1 ? item1.fileUrl : item1.aiImageUrl;
} else {
return item1.fileUrl;
}
})
.map((item1) => {
return this.aiType == 1
? `${item1.fileUrl}`
: `${item1.aiImageUrl}`;
if (this.viewLibTab == 0) {
return this.aiType == 1 ? item1.fileUrl : item1.aiImageUrl;
} else {
return item1.fileUrl;
}
});
});
this.photoList = this.photoList.concat(photoList);
......@@ -445,10 +451,14 @@ export default {
try {
let req = [];
this.checkList.forEach((img) => {
// 绝对路径转相对路径
let arr = img.split('/');
let src = '/' + arr.slice(4).join('/');
debugger
req.push(
ViewLibrary.create({
fileUrl: img,
fileType: 1,
fileUrl: src,
fileType: this.fileType === '图片' ? 0 : 1,
deviceId: this.uav.deviceId,
})
);
......
......@@ -461,7 +461,7 @@ export default {
};
},
computed: {
...mapState("MMCFlightControlCenter/uav", ["uav", "selectMount"]),
...mapState("MMCFlightControlCenter/uav", ["uav", "selectMount", "isQingLiu"]),
/**
* 播放器组件名
*/
......@@ -570,12 +570,12 @@ export default {
immediate: true,
handler(newVal) {
if (newVal === "QingLiuPlayer") {
this.$store.commit("MMCFlightControlCenter/uav", {
this.$store.commit("MMCFlightControlCenter/uav/setState", {
key: "isQingLiu",
value: true,
});
} else {
this.$store.commit("MMCFlightControlCenter/uav", {
this.$store.commit("MMCFlightControlCenter/uav/setState", {
key: "isQingLiu",
value: false,
});
......@@ -778,11 +778,11 @@ export default {
return this.$message.error("拍照失败,NX通信异常!");
}
this.$store.dispatch("MMCFlightControlCenter/uav/takePhotos", {
playerFormat: this.streamSelect,
isQingLiu: this.isQingLiu,
videoID: 1, // 视频通道ID(需保持唯一)
dbID: "929", // 历史记录id
/* dbID: "929", // 历史记录id
name: "z30Pro", // 挂载名称(如果知道挂载名称,将传名称即可,通道号可以不用传)
taskID: "", // 任务ID,可传可不传
taskID: "", // 任务ID,可传可不传 */
callback: (isOk) => {
isOk && this.$message.success(`拍照完成`);
},
......
......@@ -255,7 +255,7 @@ export default {
border: 0;
.hd {
box-sizing: border-box;
padding-left: 32px;
padding-left: 0px;
padding-right: 16px;
background-position: 12px 4px;
height: 32px;
......
......@@ -1178,15 +1178,15 @@ const actions = {
const streamData = {
data: {
data: {
taskID: data.taskID,
// taskID: data.taskID,
videoID: 1,
name: data.name,
dbID: data.dbID,
/* name: data.name,
dbID: data.dbID, */
},
},
type: 528,
};
if (data.playerFormat.toLocaleLowerCase() == "qingliu") {
if (data.isQingLiu) {
streamData.data.messageID = 1016;
} else {
streamData.data.messageID = 1007;
......
......@@ -737,7 +737,7 @@ export default {
},
computed: {
stream() {
return this.$store.state.fckernel.stream;
return this.$store.state.MMCFlightControlCenter.uav.isQingLiu ? 'QingLiu' : '';
},
},
mounted() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论