提交 b9563e0c 作者: 王梅颖

Merge branch 'v4' of http://git.mmcuav.cn/root/mmc-stl-vue2 into v4

......@@ -25,16 +25,15 @@ export default {
uavData: {
type: Object,
default: () => {},
},
obstacle: {
type: Object,
default: () => {}
}
},
data() {
return {};
},
computed: {
obstacle() {
return this.uavData?.obstacle;
},
/**
* 触发方向列表
*/
......@@ -53,7 +52,7 @@ export default {
return {
angle: i * 10, //角度
distance: distance, //距离
spotPos: distance / this.$store.state.fckernel.obstacle.obsDistance
spotPos: distance / this.obstacle.obsDistance
}
})
......
export { default as Control_API } from './modules/uav_control';
export { default as flightTaskAPI } from './modules/flightTask';
export { default as AirLine } from './modules/air-line';
export { default as AirLine } from './modules/airLine';
export { default as Map } from './modules/map';
export { default as AI_API} from './modules/ai';
export { default as ViewLibrary } from './modules/viewLibrary';
......
import request from "../request";
class AirLine {
/**
* 航线列表
* @param {*} params
* @returns
*/
static lineList(params) {
return request({
url: "/dms/route/page",
method: "get",
params,
});
}
/**
* 航线规划
* @param {*} data
* @returns
*/
static Edit(data) {
return request({
url: "/dms/route/add",
method: "post",
data,
});
}
static routeDelete(id) {
return request({
url: `/dms/route/delete/${id}`,
method: "delete",
});
}
/**
* 航线修改
* @param {*} data
* @returns
*/
static Change(data) {
return request({
url: "/dms/route/update",
method: "put",
data,
});
}
/**
* 航线详情
* @param {*} data
* @returns
*/
static details(params) {
return request({
url: `/tmj/route/getRouteDetail/${params}`,
method: "get",
params,
});
}
/**
* 上传航线
* @param {*} data
* @returns
*/
static upload(data) {
return request({
headers: {
"Content-Type": "multipart/form-data",
},
url: "/dms/route/upload",
method: "post",
data,
});
}
/**
* 上传航线
* @param {*} data
* @returns
*/
static uploadFile(data) {
return request({
headers: {
"Content-Type": "multipart/form-data",
},
url: "/crm/dimensionMark/uploadFile",
method: "post",
data,
});
}
/**
* 上传多条航线
* @param {*} data
* @returns
*/
static uploadRoutes(data) {
return request({
headers: {
"Content-Type": "multipart/form-data",
},
url: "/dms/route/upload",
method: "post",
data,
});
}
/**
* 航线删除
* @param {*} data
* @returns
*/
static deleteRoute(params) {
return request({
url: `/dms/route/delete/${params}`,
method: "delete",
});
}
/**
* 航线详情
* @param {*} params
* @returns
*/
static routeDetail(params) {
return request({
url: "/admin-api/uas/flight-line/get",
method: "get",
params,
}).then(async (res) => {
let content = await window.$mmc.$store.dispatch("MMCFlightControlCenter/apiPointsToFKZXPoints", {
list: res.data.linePointRespVOS,
actionListKey: "pointActionRespVOS",
});
res.data = {
id: res.data.id,
name: res.data.flightName,
organizationName: "无",
status: "可用", //空域状态
safe: res.data.safe ? 1 : 0, // 安全状态1: 安全 , 0: 待确定,
labelName: "无",
//航线数据
content,
};
return res;
});
}
/**
* 飞行日志
* @param {*} params
* @returns
*/
static getSorties(params) {
return request({
url: "/dms/route/id",
method: "get",
params,
});
}
/**
* 飞行日志-历史视频
* @param {*} params
* @returns
*/
static getSortiesHistoryVideo(params) {
return request({
url: "/dms/sortie/history-video",
method: "get",
params,
});
}
/**
* 飞行日志-架次-历史轨迹
* @param {*} params
* @returns
*/
static getSortiesTrajectory(params) {
return request({
url: "/dms/sortie/data",
method: "get",
params,
});
}
}
export default AirLine;
import request from "../request";
// 创建视图数据
export default class AirLine {
/**
* 添加航线
* @param {*} data
* @returns
*/
static add(data) {
return request({
url: '/admin-api/uas/flight-line/create',
method: "post",
data
});
}
}
import request from '../request';
class flightTaskAPI {
/**
* 飞行任务列表 1
* @param {*} data
* @returns
*/
static getFlightList(data) {
return request({
url: `/tmj/task/getTaskList`,
method: 'post',
data
});
}
/**
* 飞行任务列表 3 期
* @param {*} data
* @returns
*/
static tssTaskPage(data) {
return request({
url: `/tss/task/web/page`,
method: 'post',
data
});
}
/**
* 流程选择 3 期
* @param {*} projectId
* @returns
*/
static processProcessBoxProjectId(projectId) {
return request({
url: `/tss/process/processBox/${projectId}`,
method: 'get'
});
}
/**
* 创建飞行任务 3 期
* @param {*} data
* @returns
*/
static tssTask(data) {
return request({
url: `/tss/task`,
method: 'POST',
data
});
}
// 编辑航线 3 期修改航线
static editFlight(data) {
return request({
url: `/tss/task`,
method: 'put',
data
});
}
static reCreateTask(data) {
return request({
url: `/tss/task/reCreate`,
method: 'post',
data
});
}
// 获取无人机列表
static getUav(params) {
return request({
url: `/tmj/device/getDeviceSelect`,
method: 'get',
params
});
}
// 获取无任务无人机列表
static getUnbindUav(params) {
return request({
url: `/tmj/device/getDeviceSelect`,
method: 'get',
params
});
}
// 飞行任务创建任务获取无人机列表
static getUavflyList(params) {
return request({
url: `/dms/uav/page`,
method: 'get',
params
});
}
// 获取组织列表
static getCompany(data) {
return request({
url: `/crm/organization/getOrganizationSelect`,
method: 'get',
data
});
}
// 获取航线
static getflight(data) {
return request({
url: `/tmj/route/getRouteSelect`,
method: 'get',
data
});
}
// 新增航线
static createTask(data) {
return request({
url: `/tmj/task/createTask`,
method: 'post',
data
});
}
/**
* 新增航线
* @param {*} data
* @returns
*/
static addFlight(data) {
return request({
url: '/dms/route/add',
method: 'post',
data
});
}
// 编辑航线
static changeFlight(data) {
return request({
url: `/dms/route/update`,
method: 'put',
data
});
}
// 设备在线状态
static getDeviceOnlineState(data) {
return request({
url: `/tmj/device/deviceIsOnline`,
method: 'post',
data
});
}
// 设备任务状态
static isDeviceHaveTask(data) {
return request({
url: `/tmj/device/deviceHaveTask`,
method: 'post',
data
});
}
// 获取单个无人机数据最后一次上传
static deviceData(data) {
const formData = new FormData();
Object.keys(data).forEach((key) => {
formData.append(key, data[key]);
});
return request({
url: `/tmj/device/deviceData`,
method: 'post',
data: formData
});
}
// 任务列表
static getTaskSelect(data) {
return request({
url: `/tmj/task/getTaskSelect`,
method: 'get',
data
});
}
// 任务开始
static taskStart(params) {
return request({
url: `/tmj/task/startTask`,
method: 'get',
params
});
}
// 任务完成
static taskEnd(params) {
return request({
url: `/tmj/task/endTask`,
method: 'get',
params
});
}
// 图片查询
static getTaskImages(params) {
return request({
url: `/tmj/task/getPhotograph`,
method: 'get',
params
});
}
// 保存图片
static savaTaskImages(data) {
return request({
// headers: {
// "Content-Type": "multipart/form-data",
// },
url: `/tmj/task/photograph`,
method: 'post',
data
});
}
// 导出报告
static getExportToWord(params) {
return request({
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
responseType: 'blob',
url: `/tmj/taskPointExportToWordV1`,
method: 'GET',
params
});
}
// 开始任务
static startTask(params) {
return request({
url: '/tmj/task/startTask',
method: 'GET',
params
});
}
// 删除任务
static deleteTask(data) {
return request({
url: `/tss/task/${data}`,
method: 'DELETE'
});
}
// 审批任务
static approveTask(data) {
return request({
url: `/tss/task/approve`,
method: 'post',
data
});
}
}
export default flightTaskAPI;
......@@ -13,15 +13,6 @@ class Control_API {
});
}
// 获取无人机列表
static getUavDataList(params) {
return request({
url: "/dms/uav/page",
method: "get",
params,
});
}
// 获取航线列表
static getUavRouteList(params) {
return request({
......@@ -32,40 +23,6 @@ class Control_API {
});
}
// 获取架次号
static getFlightSortic({ taskId, deviceHardId }) {
return request({
url: `/tss/task/getFlightSortic/${taskId}/${deviceHardId}`,
method: "get",
});
}
// 无人机详情
static uavDetail(params) {
return request({
url: `/dms/uav/detail/${params.id}`,
method: "get",
});
}
// 飞行日志
static getFlightLog(data) {
return request({
url: `/dms/sortie/flightLog`,
method: "post",
data,
});
}
// 保存图片
static addPhoto(data) {
return request({
url: `/dms/sortie-image/add`,
method: "post",
data,
});
}
static uploadFile(data){
return request({
url: `/admin-api/infra/file/upload`,
......@@ -73,29 +30,6 @@ class Control_API {
data,
});
}
// 保存AI图片
// static addAiPhoto(data) {
// return request({
// url: `/dms/sortie-image/addAi`,
// method: "post",
// data
// });
// }
// 获取所有机构列表
static getAllOrg() {
return request({
url: `/crm/organization/tree`,
method: "get",
});
}
// 获取所有无人机操作日志
static getUavAllLog(params) {
return request_uav({
url: `/api/log/selectUavCmdLikeList`,
method: "get",
params,
});
}
// 获取1小时短时天气预报
static getUavShortForEcast(params) {
return request_uav({
......@@ -112,84 +46,9 @@ class Control_API {
params,
});
}
// 获取树结构-鹰巢
static getUavNestList(params) {
return request({
url: `/dms/nest/getNestList`,
method: "get",
params,
});
}
// 获取任务库列表
static getTaskList(data) {
return request({
url: `/tss/task/list`,
method: "post",
data,
});
}
// 获取任务库内的任务详情
static getTaskDetails(params) {
return request({
url: `/tss/task/${params.id}`,
method: "get",
});
}
// 鹰巢-定时,周期自启动
static startUavNest = (data) =>
request({
url: "/tss/task/start",
method: "POST",
data,
});
// 鹰巢-运行日志
static getUavNestLog = (params) =>
request_uav({
url: `api/log/selectProcessLikeList`,
method: "get",
params,
});
// 获取架次列表
static getSortie(params) {
return request({
url: "/dms/sortie/page",
method: "get",
params,
});
}
// 获取架次图片列表
static getSortieImage(params) {
return request({
url: "/dms/sortie-image/page",
method: "get",
params,
});
}
// 获取架次视频列表
static getSortieVideo(params) {
return request({
url: "/dms/sortie/history-video",
method: "get",
params,
});
}
// 导出成果
static getExportToWordForSortie(params) {
return request({
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
responseType: "blob",
url: `/dms/sortie/export-word`,
method: "GET",
params,
});
}
// 接管无人机
static setUavControlOn(params) {
return request({
// url: `/dms/uav/takeOver/${params.id}`,
url: `/admin-api/uas/device/controlUav`,
method: 'post',
params
......@@ -228,6 +87,15 @@ class Control_API {
});
}
// 获得接管记录
static getTakeRecord(params){
return request({
url: `/admin-api/uas/device/getTakeRecord`,
method: "get",
params
});
}
}
export default Control_API;
......@@ -64,7 +64,7 @@
<el-form-item label="预计飞行时间">{{time}}</el-form-item>
</el-form>
<div class="ae-btns">
<el-button type="primary" @click="onSave">保存</el-button>
<el-button type="primary" @click="onSave" :loading="saveLoading">保存</el-button>
<el-button type="danger" @click="onDel">删除航点</el-button>
</div>
</div>
......@@ -78,7 +78,7 @@
</template>
<script>
import { Map } from "../../../../../../../../../../../../api";
import { Map, AirLine } from "../../../../../../../../../../../../api";
import { mapState } from "vuex";
import Utils from "../../../../../../../../../../../../components/cesiumLayer/lib/cesium/utils";
import { nanoid } from "nanoid";
......@@ -124,10 +124,11 @@ export default {
positions: [], //航点坐标集合
isPickAddress: false, //是否通过目标位置对地理信息
showActions: false, // 打开航点动作
saveLoading: false,
};
},
computed: {
...mapState("MMCFlightControlCenter", ["cesiumViewer"]),
...mapState("MMCFlightControlCenter", ["cesiumViewer", "userInfo"]),
...mapState("MMCFlightControlCenter/hangar", ["hangar"]),
// 当前的表单
curForm() {
......@@ -189,15 +190,19 @@ export default {
this.onPickPoint,
Cesium.ScreenSpaceEventType.LEFT_DOWN
);
// 直接销毁会报错
this.$nextTick(() => {
this.cesiumViewer.dataSources.remove(this.dataSource);
});
// todo 连续两次创建航线后销毁cesium会崩溃, 原因未知, 改为隐藏
/* this.$nextTick(() => {
let list = this.cesiumViewer?.dataSources?.getByName(this.dataSourceName);
for (let i = 0; i < list.length; i++) {
let dataSource = list[i];
this.cesiumViewer.dataSources.remove(dataSource);
}
}); */
this.dataSource.show = false;
},
methods: {
// 保存航线
onSave() {
async onSave() {
if (!this.name) {
this.$message.warning("请输入航线名称");
return;
......@@ -238,7 +243,47 @@ export default {
waypointActions: actions,
};
});
this.rootNode.$emit("airwayAdd", {
//标准化里创建
let airway = {
content: waypoints,
distance: this.distance,
dutyOrganizationId: "",
name: this.name,
speed: this.form[0].speed,
};
try {
let res = await AirLine.add({
flightName: airway.name || `${this.userInfo.username}-巡查}`,
pointCount: airway.content.length,
distance: airway.distance,
sourceType: 1,
linePointSaveReqVOS: airway.content.map((point) => ({
latitude: point.coordinate.latitude,
longitude: point.coordinate.longitude,
altitude: point.altitude,
speed: point.speed,
pointActionSaveReqVOS: point.waypointActions.map((action) => {
let actionValue = [];
actionValue.push(`param1:${action.param1 || ""}`);
actionValue.push(`param2:${action.param2 || ""}`);
actionValue.push(`param3:${action.param3 || ""}`);
actionValue.push(`param4:${action.param4 || ""}`);
return {
actionType: action.actionType,
actionValue: actionValue.join(";"),
};
}),
})),
nestId: this.hangar.id,
});
this.$message.success("创建航线成功");
this.$emit("addDone", res.data);
this.$emit("close");
} catch (e) {}
this.saveLoading = false;
// 通过事件创建会出现重复创建的情况, 改为标准化里创建
/* this.rootNode.$emit("airwayAdd", {
airway: {
content: waypoints,
distance: this.distance,
......@@ -251,7 +296,7 @@ export default {
this.$emit("addDone", data.id);
this.$emit("close");
},
});
}); */
},
/**
* 动作保存
......@@ -563,6 +608,7 @@ export default {
position: absolute;
top: -50px;
width: 450px;
z-index: 2;
.dialog-content {
display: flex;
......
<template>
<div class="task-add dialog1027" v-interact>
<div class="dialog-header">
<div class="dialog-header__title">定时任务</div>
<div class="dialog-header__title">周期任务</div>
<div class="dialog-header__close" @click="$emit('close')">关闭</div>
</div>
<div class="dialog-content">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="执行日期" prop="date" required>
<el-form-item label="执行日期" prop="date">
<el-date-picker
v-model="form.date"
type="daterange"
......@@ -19,7 +19,7 @@
:picker-options="pickerOptions"
></el-date-picker>
</el-form-item>
<el-form-item label="执行时间" prop="time" required>
<el-form-item label="执行时间" prop="time">
<el-time-picker
is-range
v-model="form.time"
......@@ -32,7 +32,7 @@
value-format="HH:mm:ss"
></el-time-picker>
</el-form-item>
<el-form-item label="航线名称" required>
<el-form-item label="航线名称" prop="airwayId">
<el-select v-model="form.airwayId" size="mini" popper-class="mmc" style="width:100%">
<el-option :label="item.name" :value="item.id" v-for="(item, index) in airwayList"></el-option>
</el-select>
......
......@@ -70,6 +70,7 @@ export default {
return {
showTaskAdd: false,
taskListAll: [],
lastMsg: null
};
},
computed: {
......@@ -79,6 +80,30 @@ export default {
"hangar",
]),
},
watch: {
"hangarRealTimeData.msgList": {
immediate: false,
handler(msgList) {
// 起飞后执行刷新任务列表, 获取最新状态
if (msgList.length > 0) {
let msg = msgList[msgList.length - 1];
let keyword = "开始上传航线到无人机";
if (msg) {
if (
!this?.lastMsg?.text?.includes(keyword) &&
msg.text.includes(keyword)
) {
this.getTaskList();
}
this.lastMsg = msg;
}
}
},
},
},
created() {
this.rootNode.$emit("hangarTaskTabChange", {
type: 3,
......@@ -131,18 +156,22 @@ export default {
},
async onDelAirway(item) {
try {
if (item.loading) {
return;
}
await this.$confirm("请确认是否删除该任务?", "安全确认", {
cancelButtonText: "取消",
confirmButtonText: "确定",
customClass: "uav_controlPane",
showClose: false,
});
item.loading = true;
this.rootNode.$emit("taskDel", {
task: item,
type: 3, // 1: 日常任务 2: 定时任务 3:周期任务
callback: () => {
this.getTaskList();
}
},
});
} catch (e) {
console.log(e);
......@@ -151,9 +180,9 @@ export default {
onTaskAddClose() {
this.showTaskAdd = false;
},
onAddDone(){
onAddDone() {
this.getTaskList();
}
},
},
};
</script>
......@@ -228,6 +257,10 @@ export default {
.icon {
cursor: pointer;
&.loading {
opacity: 0.5;
}
}
}
}
......
......@@ -14,7 +14,12 @@
</el-tooltip>
</div>
<div class="row__column flex2">
<el-tooltip class="item" effect="dark" :content="item.taskStartTime" placement="top-start">
<el-tooltip
class="item"
effect="dark"
:content="item.taskStartTime"
placement="top-start"
>
<span>{{item.taskStartTime}}</span>
</el-tooltip>
</div>
......@@ -65,6 +70,7 @@ export default {
return {
showTaskAdd: false,
taskListAll: [],
lastMsg: null,
};
},
computed: {
......@@ -75,6 +81,30 @@ export default {
"taskList",
]),
},
watch: {
"hangarRealTimeData.msgList": {
immediate: false,
handler(msgList) {
// 起飞后执行刷新任务列表, 获取最新状态
if (msgList.length > 0) {
let msg = msgList[msgList.length - 1];
let keyword = "开始上传航线到无人机";
if (msg) {
if (
!this?.lastMsg?.text?.includes(keyword) &&
msg.text.includes(keyword)
) {
this.getTaskList();
}
this.lastMsg = msg;
}
}
},
},
},
created() {
this.rootNode.$emit("hangarTaskTabChange", {
type: 2,
......@@ -127,18 +157,22 @@ export default {
},
async onDelAirway(item) {
try {
if (item.loading) {
return;
}
await this.$confirm("请确认是否删除该任务?", "安全确认", {
cancelButtonText: "取消",
confirmButtonText: "确定",
customClass: "uav_controlPane",
showClose: false,
});
item.loading = true;
this.rootNode.$emit("taskDel", {
task: item,
type: 2, // 1: 日常任务 2: 定时任务 3:周期任务
callback: () => {
this.getTaskList();
}
},
});
} catch (e) {
console.log(e);
......@@ -147,9 +181,9 @@ export default {
onTaskAddClose() {
this.showTaskAdd = false;
},
onAddDone(){
onAddDone() {
this.getTaskList();
}
},
},
};
</script>
......@@ -224,6 +258,10 @@ export default {
.icon {
cursor: pointer;
&.loading {
opacity: 0.5;
}
}
}
}
......
......@@ -5,7 +5,7 @@
<div class="left-bar-item__text">任务</div>
</div>
<AirwayList class="task-list" v-if="openTask"></AirwayList>
<div class="left-bar-item item" @click="onClickAI">
<!-- <div class="left-bar-item item" @click="onClickAI">
<img class="left-bar-item__icon" src="./assets/images/ai.svg" />
<div class="left-bar-item__text">智能识别</div>
</div>
......@@ -27,7 +27,7 @@
@close="openTraffic = false"
/>
<Jm v-if="openModeling" :device="device" class="jm-dialog" @close="openModeling = false"></Jm>
</div>
</div> -->
<!-- 展示视频 -->
<div class="left-video" :class="{collapse: playerCollapse}" v-if="hangar && showPanel && listCollapse">
......
......@@ -4,7 +4,7 @@
<div class="title">
<img src="../../../../../../../../assets/images/mount_head.png" />
<div class="dialog-header__title">运行监控日志</div>
<div effect="dark" class="status">{{ getprocessStatus(hangarRealTimeData.processStatus) }}</div>
<div effect="dark" class="status">{{ getProcessStatus(hangarRealTimeData.processStatus) }}</div>
</div>
<div style="display: flex">
<div class="icon-box" @click="onClear">
......@@ -153,7 +153,7 @@ export default {
},
});
},
getprocessStatus(val) {
getProcessStatus(val) {
let title = "";
if (val == 0) {
title = "待机中";
......@@ -175,6 +175,10 @@ export default {
title = "正在执行电池检查流程";
} else if (val == 9) {
title = "正在执行关仓流程";
} else if (val == 10) {
title = "正在执行回中器操作";
} else if (val == 99) {
title = "正在执行飞行任务";
} else {
title = "暂无";
}
......
......@@ -86,7 +86,7 @@
</template>
<script>
import { Map } from "../../../../../../../../../../api";
import { Map, AirLine } from "../../../../../../../../../../api";
import { mapState } from "vuex";
import Utils from "../../../../../../../../../../components/cesiumLayer/lib/cesium/utils";
import { nanoid } from "nanoid";
......@@ -220,7 +220,7 @@ export default {
})
},
// 保存航线
onSave() {
async onSave() {
if (!this.name) {
this.$message.warning("请输入航线名称");
return;
......@@ -264,7 +264,46 @@ export default {
};
});
this.rootNode.$emit("airwayAdd", {
//标准化里创建
let airway = {
content: waypoints,
distance: this.distance,
dutyOrganizationId: "",
name: this.name,
speed: this.form[0].speed,
};
try {
let res = await AirLine.add({
flightName: airway.name || `${this.userInfo.username}-巡查}`,
pointCount: airway.content.length,
distance: airway.distance,
sourceType: 1,
linePointSaveReqVOS: airway.content.map((point) => ({
latitude: point.coordinate.latitude,
longitude: point.coordinate.longitude,
altitude: point.altitude,
speed: point.speed,
pointActionSaveReqVOS: point.waypointActions.map((action) => {
let actionValue = [];
actionValue.push(`param1:${action.param1 || ""}`);
actionValue.push(`param2:${action.param2 || ""}`);
actionValue.push(`param3:${action.param3 || ""}`);
actionValue.push(`param4:${action.param4 || ""}`);
return {
actionType: action.actionType,
actionValue: actionValue.join(";"),
};
}),
})),
});
this.$message.success("创建航线成功");
this.$emit("addDone", res.data);
this.$emit("close");
} catch (e) {}
this.saveLoading = false;
// 通过事件创建会出现重复创建的情况, 改为标准化里创建
/* this.rootNode.$emit("airwayAdd", {
airway: {
content: waypoints,
distance: this.distance,
......@@ -280,7 +319,7 @@ export default {
}
this.saveLoading = false;
},
});
}); */
},
/**
* 动作保存
......
......@@ -6,7 +6,7 @@
</div>
<TaskList class="task-list" v-if="!useAirway && openTask"></TaskList>
<AirwayList class="task-list" v-if="useAirway && openTask"></AirwayList>
<div class="left-bar-item item" @click="onClickAI">
<!-- <div class="left-bar-item item" @click="onClickAI">
<img class="left-bar-item__icon" src="./assets/images/ai.svg" />
<div class="left-bar-item__text">智能识别</div>
</div>
......@@ -19,15 +19,6 @@
<img class="left-bar-item__icon" src="./assets/images/car.svg" />
<div class="left-bar-item__text">车辆识别</div>
</div>
<!-- <div class="left-bar-item item" @click.stop="switchAI(2)">
<img class="left-bar-item__icon" src="./assets/images/traffic.png" />
<div class="left-bar-item__text">交通指引</div>
</div>
<div class="left-bar-item item" @click.stop="switchAI(3)">
<img class="left-bar-item__icon" src="./assets/images/ksjm.png" />
<div class="left-bar-item__text">快速建模</div>
</div>-->
<Face v-if="openFace" class="ai-dialog" :uavId="uav.deviceId" @close="openFace = false" />
<Car v-if="openPlate" class="ai-dialog" :uavId="uav.deviceId" @close="openPlate = false" />
<Traffic
......@@ -37,7 +28,7 @@
@close="openTraffic = false"
/>
<Jm v-if="openModeling" :device="device" class="jm-dialog" @close="openModeling = false"></Jm>
</div>
</div> -->
</div>
</template>
......
......@@ -7,13 +7,13 @@
</div>
<div class="dialog-content">
<el-table :data="list">
<el-table-column label="无人机名称" align="center" prop="name"></el-table-column>
<el-table-column label="无人机所属单位" align="center" prop="name"></el-table-column>
<el-table-column label="接管状态" align="center" prop="name"></el-table-column>
<el-table-column label="当前控制单位" align="center" prop="name"></el-table-column>
<el-table-column label="无人机名称" align="center" prop="deviceName"></el-table-column>
<el-table-column label="无人机所属单位" align="center" prop="deviceDeptName"></el-table-column>
<el-table-column label="接管状态" align="center" prop="takeStats"></el-table-column>
<el-table-column label="当前控制单位" align="center" prop="takeUserName"></el-table-column>
<el-table-column label="操作" align="center" prop="name">
<template slot-scope="scope">
<el-button @click="onExit" type="text" size="small">退出接管</el-button>
<el-button @click="onExit(scope.row)" type="text" size="small">退出接管</el-button>
</template>
</el-table-column>
</el-table>
......@@ -22,6 +22,8 @@
</template>
<script>
import { Control_API } from "../../../../../../../api";
export default {
name: "TakeOverRecords",
data() {
......@@ -29,8 +31,30 @@ export default {
list: [],
};
},
mounted() {
this.init();
},
methods: {
onExit() {},
async init() {
let res = await Control_API.getTakeRecord({});
this.list = res.data;
console.log('接管记录', this.list);
},
onExit(item) {
this.$confirm("确认退出该用户接管?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(async () => {
await Control_API.setUavControlOff({
deviceId: item.deviceId,
});
this.$message({
type: "success",
message: "操作完成",
});
});
},
},
};
</script>
......
......@@ -173,6 +173,14 @@ function initUavRealTimeData() {
down45Link 4/5G下行速率,单位字节/秒 Long
} */
flightMode: "UNKNOWN",
uploadAirline: { //上传的航线
finishedAction: '', //航点任务完成后,飞机将采取的行动
headingMode: '', //飞机在航点之间移动时的航向模式
isExitMissionOnRCSignalLostEnabled: Boolean, //飞机在航点之间移动时的航向模式
maxFlightSpeed: 0, //航线飞行最大速度,px4无人机默认最大12m
autoFlightSpeed: 0, //航线飞行速度默认5m
waypointList: null
},
};
}
......@@ -197,6 +205,7 @@ const state = {
showPlayer: false, //显示播放器
showPanel: false, //显示数据面板
isQingLiu: null, // 当前视频播放的是否为清流
waitAirlineUpload: false, //是否正在等待航线上传
};
const mutations = {
......@@ -231,7 +240,10 @@ const actions = {
commit("setState", { key: "mountList", value: [] });
commit("setState", { key: "selectMount", value: null });
commit("setState", { key: "showVideo", value: false });
commit("setState", { key: "uavRealTimeData", value: initUavRealTimeData() });
commit("setState", {
key: "uavRealTimeData",
value: initUavRealTimeData(),
});
positions = [];
},
......@@ -298,6 +310,7 @@ const actions = {
const type275 = data[275]?.data; // 健康管理
const type270 = data[270]?.data; // 飞控应答消息
const type260 = data[260]?.data; // 无人机提示信息
const type261 = data[261]?.data; // 航线上传完成信息
let msgList = state.uavRealTimeData.msgList || [];
......@@ -308,10 +321,10 @@ const actions = {
);
if (!findMsg) {
msgList.push({
grade: 'AUTO',
grade: "AUTO",
text: type270.text,
time: moment(type270.timestamp).format("YYYY-MM-DD HH:mm:ss"),
timestamp: type270.timestamp
timestamp: type270.timestamp,
});
}
}
......@@ -322,10 +335,23 @@ const actions = {
);
if (!findMsg) {
msgList.push({
grade: type260.grade <= 2 ? "[危险]" : type260.grade == 3 ? "[错误]" : type260.grade ==4 ? "[警告]" : type260.grade == 5 ? "[通知]" : type260.grade == 6 ? "[正常]" : type260.grade == 7 ? "[调试]" : "AUTO",
grade:
type260.grade <= 2
? "[危险]"
: type260.grade == 3
? "[错误]"
: type260.grade == 4
? "[警告]"
: type260.grade == 5
? "[通知]"
: type260.grade == 6
? "[正常]"
: type260.grade == 7
? "[调试]"
: "AUTO",
text: type260.msg,
time: moment(type260.timestamp).format("YYYY-MM-DD HH:mm:ss"),
timestamp: type260.timestamp
timestamp: type260.timestamp,
});
}
}
......@@ -363,6 +389,7 @@ const actions = {
batteryList,
msg: type270,
msgList,
uploadAirline: type261,
},
});
......@@ -638,7 +665,7 @@ const actions = {
* 一键起飞
* @param {function} data.callback //完成回调
*/
async takeOff({ state }, data) {
async takeOff({ state, commit }, data) {
console.log(state.airlineData, data);
if (state.uav.network == 2) {
try {
......@@ -682,24 +709,49 @@ const actions = {
callback() {},
});
// 更改任务状态
// 起飞指令
setTimeout(() => {
window.$mmc.$store.dispatch("MMCMQTT/publish", {
topic: "PX4/OBTAIN/" + state.uav.deviceId,
data: {
type: window.$mmc.$store.state.MMCMQTT.orders.航线一键起飞,
commit("setState", {
key: "waitAirlineUpload",
value: true,
});
let time = setInterval(() => {
if (state.uavRealTimeData.uploadAirline) {
clearInterval(time);
window.$mmc.$store.dispatch("MMCMQTT/publish", {
topic: "PX4/OBTAIN/" + state.uav.deviceId,
data: {
taskId: state.airlineData.id,
seq: 0,
type: window.$mmc.$store.state.MMCMQTT.orders.航线一键起飞,
data: {
taskId: state.airlineData.id,
seq: 0,
},
},
},
callback() {
data?.callback && data.callback(true, flightSortieId.data);
},
});
}, 3000);
callback() {
data?.callback && data.callback(true, flightSortieId.data);
},
});
// 清空261数据
let dataSet = window.$mmc.$store.state.MMCMQTT.dataSet;
dataSet[state.uav.deviceId][261] = null;
window.$mmc.$store.commit('MMCMQTT/setSate', {
key: 'dataSet',
value: dataSet
})
commit('setState', {
key: 'uavRealTimeData',
value: {
...state.uavRealTimeData,
uploadAirline: null
}
})
}
}, 1000);
// 做个保险, 要是因为各种原因导致没飞起, 超过一分钟删除循环定时器
setTimeout(() => {
clearInterval(time);
}, 60000)
} catch (e) {
console.log("一键起飞失败", e);
data?.callback && data.callback(false);
......@@ -1180,7 +1232,7 @@ const actions = {
data: {
// taskID: data.taskID,
videoID: 1,
/* name: data.name,
/* name: data.name,
dbID: data.dbID, */
},
},
......@@ -1272,17 +1324,17 @@ const actions = {
},
// 键盘控制
keyControl({ state }, data) {
console.log(data, '键盘控制');
console.log(data, "键盘控制");
if (state.uav.network == 2) {
window.$mmc.$store.dispatch('MMCMQTT/publish', {
topic: 'PX4/OBTAIN/' + state.uav.deviceId,
window.$mmc.$store.dispatch("MMCMQTT/publish", {
topic: "PX4/OBTAIN/" + state.uav.deviceId,
data: {
type: 538,
data: data
data: data,
},
callback() {
data.callback && data.callback(true);
}
},
});
}
},
......
import orders from "./orders";
import dayjs from 'dayjs';
export default {
namespaced: true,
......@@ -114,6 +115,8 @@ export default {
if (!state.dataSet[deviceHardId]) {
state.dataSet[deviceHardId] = {};
}
metadata.$time = Date.now(); // 打上时间戳
metadata.$timeStr = dayjs(data.$time).format('YYYY-MM-DD hh:mm:ss');
state.dataSet[deviceHardId] = metadata;
commit("setDataSet", state.dataSet);
}
......
import mqtt from "mqtt/dist/mqtt";
import orders from "./orders";
import dayjs from 'dayjs';
function uint8array2json(uint8array) {
if (!uint8array || !uint8array.length) {
......@@ -81,6 +82,7 @@ export default {
}
data.$time = Date.now(); // 打上时间戳
data.$timeStr = dayjs(data.$time).format('YYYY-MM-DD hh:mm:ss');
state.dataSet[deviceHardId][data.type] = data;
commit("setDataSet", state.dataSet);
});
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论