提交 b9563e0c 作者: 王梅颖

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

...@@ -25,16 +25,15 @@ export default { ...@@ -25,16 +25,15 @@ export default {
uavData: { uavData: {
type: Object, type: Object,
default: () => {}, default: () => {},
},
obstacle: {
type: Object,
default: () => {}
} }
}, },
data() { data() {
return {}; return {};
}, },
computed: { computed: {
obstacle() {
return this.uavData?.obstacle;
},
/** /**
* 触发方向列表 * 触发方向列表
*/ */
...@@ -53,7 +52,7 @@ export default { ...@@ -53,7 +52,7 @@ export default {
return { return {
angle: i * 10, //角度 angle: i * 10, //角度
distance: distance, //距离 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 Control_API } from './modules/uav_control';
export { default as flightTaskAPI } from './modules/flightTask'; export { default as AirLine } from './modules/airLine';
export { default as AirLine } from './modules/air-line';
export { default as Map } from './modules/map'; export { default as Map } from './modules/map';
export { default as AI_API} from './modules/ai'; export { default as AI_API} from './modules/ai';
export { default as ViewLibrary } from './modules/viewLibrary'; 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 { ...@@ -13,15 +13,6 @@ class Control_API {
}); });
} }
// 获取无人机列表
static getUavDataList(params) {
return request({
url: "/dms/uav/page",
method: "get",
params,
});
}
// 获取航线列表 // 获取航线列表
static getUavRouteList(params) { static getUavRouteList(params) {
return request({ return request({
...@@ -32,40 +23,6 @@ class Control_API { ...@@ -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){ static uploadFile(data){
return request({ return request({
url: `/admin-api/infra/file/upload`, url: `/admin-api/infra/file/upload`,
...@@ -73,29 +30,6 @@ class Control_API { ...@@ -73,29 +30,6 @@ class Control_API {
data, 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小时短时天气预报 // 获取1小时短时天气预报
static getUavShortForEcast(params) { static getUavShortForEcast(params) {
return request_uav({ return request_uav({
...@@ -112,84 +46,9 @@ class Control_API { ...@@ -112,84 +46,9 @@ class Control_API {
params, 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) { static setUavControlOn(params) {
return request({ return request({
// url: `/dms/uav/takeOver/${params.id}`,
url: `/admin-api/uas/device/controlUav`, url: `/admin-api/uas/device/controlUav`,
method: 'post', method: 'post',
params params
...@@ -228,6 +87,15 @@ class Control_API { ...@@ -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; export default Control_API;
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
<el-form-item label="预计飞行时间">{{time}}</el-form-item> <el-form-item label="预计飞行时间">{{time}}</el-form-item>
</el-form> </el-form>
<div class="ae-btns"> <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> <el-button type="danger" @click="onDel">删除航点</el-button>
</div> </div>
</div> </div>
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
</template> </template>
<script> <script>
import { Map } from "../../../../../../../../../../../../api"; import { Map, AirLine } from "../../../../../../../../../../../../api";
import { mapState } from "vuex"; import { mapState } from "vuex";
import Utils from "../../../../../../../../../../../../components/cesiumLayer/lib/cesium/utils"; import Utils from "../../../../../../../../../../../../components/cesiumLayer/lib/cesium/utils";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
...@@ -124,10 +124,11 @@ export default { ...@@ -124,10 +124,11 @@ export default {
positions: [], //航点坐标集合 positions: [], //航点坐标集合
isPickAddress: false, //是否通过目标位置对地理信息 isPickAddress: false, //是否通过目标位置对地理信息
showActions: false, // 打开航点动作 showActions: false, // 打开航点动作
saveLoading: false,
}; };
}, },
computed: { computed: {
...mapState("MMCFlightControlCenter", ["cesiumViewer"]), ...mapState("MMCFlightControlCenter", ["cesiumViewer", "userInfo"]),
...mapState("MMCFlightControlCenter/hangar", ["hangar"]), ...mapState("MMCFlightControlCenter/hangar", ["hangar"]),
// 当前的表单 // 当前的表单
curForm() { curForm() {
...@@ -189,15 +190,19 @@ export default { ...@@ -189,15 +190,19 @@ export default {
this.onPickPoint, this.onPickPoint,
Cesium.ScreenSpaceEventType.LEFT_DOWN Cesium.ScreenSpaceEventType.LEFT_DOWN
); );
// todo 连续两次创建航线后销毁cesium会崩溃, 原因未知, 改为隐藏
// 直接销毁会报错 /* this.$nextTick(() => {
this.$nextTick(() => { let list = this.cesiumViewer?.dataSources?.getByName(this.dataSourceName);
this.cesiumViewer.dataSources.remove(this.dataSource); for (let i = 0; i < list.length; i++) {
}); let dataSource = list[i];
this.cesiumViewer.dataSources.remove(dataSource);
}
}); */
this.dataSource.show = false;
}, },
methods: { methods: {
// 保存航线 // 保存航线
onSave() { async onSave() {
if (!this.name) { if (!this.name) {
this.$message.warning("请输入航线名称"); this.$message.warning("请输入航线名称");
return; return;
...@@ -238,7 +243,47 @@ export default { ...@@ -238,7 +243,47 @@ export default {
waypointActions: actions, 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: { airway: {
content: waypoints, content: waypoints,
distance: this.distance, distance: this.distance,
...@@ -251,7 +296,7 @@ export default { ...@@ -251,7 +296,7 @@ export default {
this.$emit("addDone", data.id); this.$emit("addDone", data.id);
this.$emit("close"); this.$emit("close");
}, },
}); }); */
}, },
/** /**
* 动作保存 * 动作保存
...@@ -563,6 +608,7 @@ export default { ...@@ -563,6 +608,7 @@ export default {
position: absolute; position: absolute;
top: -50px; top: -50px;
width: 450px; width: 450px;
z-index: 2;
.dialog-content { .dialog-content {
display: flex; display: flex;
......
<template> <template>
<div class="task-add dialog1027" v-interact> <div class="task-add dialog1027" v-interact>
<div class="dialog-header"> <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 class="dialog-header__close" @click="$emit('close')">关闭</div>
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <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 <el-date-picker
v-model="form.date" v-model="form.date"
type="daterange" type="daterange"
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
:picker-options="pickerOptions" :picker-options="pickerOptions"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="执行时间" prop="time" required> <el-form-item label="执行时间" prop="time">
<el-time-picker <el-time-picker
is-range is-range
v-model="form.time" v-model="form.time"
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
value-format="HH:mm:ss" value-format="HH:mm:ss"
></el-time-picker> ></el-time-picker>
</el-form-item> </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-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-option :label="item.name" :value="item.id" v-for="(item, index) in airwayList"></el-option>
</el-select> </el-select>
......
...@@ -70,6 +70,7 @@ export default { ...@@ -70,6 +70,7 @@ export default {
return { return {
showTaskAdd: false, showTaskAdd: false,
taskListAll: [], taskListAll: [],
lastMsg: null
}; };
}, },
computed: { computed: {
...@@ -79,6 +80,30 @@ export default { ...@@ -79,6 +80,30 @@ export default {
"hangar", "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() { created() {
this.rootNode.$emit("hangarTaskTabChange", { this.rootNode.$emit("hangarTaskTabChange", {
type: 3, type: 3,
...@@ -131,18 +156,22 @@ export default { ...@@ -131,18 +156,22 @@ export default {
}, },
async onDelAirway(item) { async onDelAirway(item) {
try { try {
if (item.loading) {
return;
}
await this.$confirm("请确认是否删除该任务?", "安全确认", { await this.$confirm("请确认是否删除该任务?", "安全确认", {
cancelButtonText: "取消", cancelButtonText: "取消",
confirmButtonText: "确定", confirmButtonText: "确定",
customClass: "uav_controlPane", customClass: "uav_controlPane",
showClose: false, showClose: false,
}); });
item.loading = true;
this.rootNode.$emit("taskDel", { this.rootNode.$emit("taskDel", {
task: item, task: item,
type: 3, // 1: 日常任务 2: 定时任务 3:周期任务 type: 3, // 1: 日常任务 2: 定时任务 3:周期任务
callback: () => { callback: () => {
this.getTaskList(); this.getTaskList();
} },
}); });
} catch (e) { } catch (e) {
console.log(e); console.log(e);
...@@ -151,9 +180,9 @@ export default { ...@@ -151,9 +180,9 @@ export default {
onTaskAddClose() { onTaskAddClose() {
this.showTaskAdd = false; this.showTaskAdd = false;
}, },
onAddDone(){ onAddDone() {
this.getTaskList(); this.getTaskList();
} },
}, },
}; };
</script> </script>
...@@ -228,6 +257,10 @@ export default { ...@@ -228,6 +257,10 @@ export default {
.icon { .icon {
cursor: pointer; cursor: pointer;
&.loading {
opacity: 0.5;
}
} }
} }
} }
......
...@@ -14,7 +14,12 @@ ...@@ -14,7 +14,12 @@
</el-tooltip> </el-tooltip>
</div> </div>
<div class="row__column flex2"> <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> <span>{{item.taskStartTime}}</span>
</el-tooltip> </el-tooltip>
</div> </div>
...@@ -65,6 +70,7 @@ export default { ...@@ -65,6 +70,7 @@ export default {
return { return {
showTaskAdd: false, showTaskAdd: false,
taskListAll: [], taskListAll: [],
lastMsg: null,
}; };
}, },
computed: { computed: {
...@@ -75,6 +81,30 @@ export default { ...@@ -75,6 +81,30 @@ export default {
"taskList", "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() { created() {
this.rootNode.$emit("hangarTaskTabChange", { this.rootNode.$emit("hangarTaskTabChange", {
type: 2, type: 2,
...@@ -127,18 +157,22 @@ export default { ...@@ -127,18 +157,22 @@ export default {
}, },
async onDelAirway(item) { async onDelAirway(item) {
try { try {
if (item.loading) {
return;
}
await this.$confirm("请确认是否删除该任务?", "安全确认", { await this.$confirm("请确认是否删除该任务?", "安全确认", {
cancelButtonText: "取消", cancelButtonText: "取消",
confirmButtonText: "确定", confirmButtonText: "确定",
customClass: "uav_controlPane", customClass: "uav_controlPane",
showClose: false, showClose: false,
}); });
item.loading = true;
this.rootNode.$emit("taskDel", { this.rootNode.$emit("taskDel", {
task: item, task: item,
type: 2, // 1: 日常任务 2: 定时任务 3:周期任务 type: 2, // 1: 日常任务 2: 定时任务 3:周期任务
callback: () => { callback: () => {
this.getTaskList(); this.getTaskList();
} },
}); });
} catch (e) { } catch (e) {
console.log(e); console.log(e);
...@@ -147,9 +181,9 @@ export default { ...@@ -147,9 +181,9 @@ export default {
onTaskAddClose() { onTaskAddClose() {
this.showTaskAdd = false; this.showTaskAdd = false;
}, },
onAddDone(){ onAddDone() {
this.getTaskList(); this.getTaskList();
} },
}, },
}; };
</script> </script>
...@@ -224,6 +258,10 @@ export default { ...@@ -224,6 +258,10 @@ export default {
.icon { .icon {
cursor: pointer; cursor: pointer;
&.loading {
opacity: 0.5;
}
} }
} }
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<div class="left-bar-item__text">任务</div> <div class="left-bar-item__text">任务</div>
</div> </div>
<AirwayList class="task-list" v-if="openTask"></AirwayList> <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" /> <img class="left-bar-item__icon" src="./assets/images/ai.svg" />
<div class="left-bar-item__text">智能识别</div> <div class="left-bar-item__text">智能识别</div>
</div> </div>
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
@close="openTraffic = false" @close="openTraffic = false"
/> />
<Jm v-if="openModeling" :device="device" class="jm-dialog" @close="openModeling = false"></Jm> <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"> <div class="left-video" :class="{collapse: playerCollapse}" v-if="hangar && showPanel && listCollapse">
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<div class="title"> <div class="title">
<img src="../../../../../../../../assets/images/mount_head.png" /> <img src="../../../../../../../../assets/images/mount_head.png" />
<div class="dialog-header__title">运行监控日志</div> <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>
<div style="display: flex"> <div style="display: flex">
<div class="icon-box" @click="onClear"> <div class="icon-box" @click="onClear">
...@@ -153,7 +153,7 @@ export default { ...@@ -153,7 +153,7 @@ export default {
}, },
}); });
}, },
getprocessStatus(val) { getProcessStatus(val) {
let title = ""; let title = "";
if (val == 0) { if (val == 0) {
title = "待机中"; title = "待机中";
...@@ -175,6 +175,10 @@ export default { ...@@ -175,6 +175,10 @@ export default {
title = "正在执行电池检查流程"; title = "正在执行电池检查流程";
} else if (val == 9) { } else if (val == 9) {
title = "正在执行关仓流程"; title = "正在执行关仓流程";
} else if (val == 10) {
title = "正在执行回中器操作";
} else if (val == 99) {
title = "正在执行飞行任务";
} else { } else {
title = "暂无"; title = "暂无";
} }
......
...@@ -86,7 +86,7 @@ ...@@ -86,7 +86,7 @@
</template> </template>
<script> <script>
import { Map } from "../../../../../../../../../../api"; import { Map, AirLine } from "../../../../../../../../../../api";
import { mapState } from "vuex"; import { mapState } from "vuex";
import Utils from "../../../../../../../../../../components/cesiumLayer/lib/cesium/utils"; import Utils from "../../../../../../../../../../components/cesiumLayer/lib/cesium/utils";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
...@@ -220,7 +220,7 @@ export default { ...@@ -220,7 +220,7 @@ export default {
}) })
}, },
// 保存航线 // 保存航线
onSave() { async onSave() {
if (!this.name) { if (!this.name) {
this.$message.warning("请输入航线名称"); this.$message.warning("请输入航线名称");
return; return;
...@@ -264,7 +264,46 @@ export default { ...@@ -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: { airway: {
content: waypoints, content: waypoints,
distance: this.distance, distance: this.distance,
...@@ -280,7 +319,7 @@ export default { ...@@ -280,7 +319,7 @@ export default {
} }
this.saveLoading = false; this.saveLoading = false;
}, },
}); }); */
}, },
/** /**
* 动作保存 * 动作保存
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
</div> </div>
<TaskList class="task-list" v-if="!useAirway && openTask"></TaskList> <TaskList class="task-list" v-if="!useAirway && openTask"></TaskList>
<AirwayList class="task-list" v-if="useAirway && openTask"></AirwayList> <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" /> <img class="left-bar-item__icon" src="./assets/images/ai.svg" />
<div class="left-bar-item__text">智能识别</div> <div class="left-bar-item__text">智能识别</div>
</div> </div>
...@@ -19,15 +19,6 @@ ...@@ -19,15 +19,6 @@
<img class="left-bar-item__icon" src="./assets/images/car.svg" /> <img class="left-bar-item__icon" src="./assets/images/car.svg" />
<div class="left-bar-item__text">车辆识别</div> <div class="left-bar-item__text">车辆识别</div>
</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" /> <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" /> <Car v-if="openPlate" class="ai-dialog" :uavId="uav.deviceId" @close="openPlate = false" />
<Traffic <Traffic
...@@ -37,7 +28,7 @@ ...@@ -37,7 +28,7 @@
@close="openTraffic = false" @close="openTraffic = false"
/> />
<Jm v-if="openModeling" :device="device" class="jm-dialog" @close="openModeling = false"></Jm> <Jm v-if="openModeling" :device="device" class="jm-dialog" @close="openModeling = false"></Jm>
</div> </div> -->
</div> </div>
</template> </template>
......
...@@ -7,13 +7,13 @@ ...@@ -7,13 +7,13 @@
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<el-table :data="list"> <el-table :data="list">
<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="name"></el-table-column> <el-table-column label="无人机所属单位" align="center" prop="deviceDeptName"></el-table-column>
<el-table-column label="接管状态" align="center" prop="name"></el-table-column> <el-table-column label="接管状态" align="center" prop="takeStats"></el-table-column>
<el-table-column label="当前控制单位" align="center" prop="name"></el-table-column> <el-table-column label="当前控制单位" align="center" prop="takeUserName"></el-table-column>
<el-table-column label="操作" align="center" prop="name"> <el-table-column label="操作" align="center" prop="name">
<template slot-scope="scope"> <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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
</template> </template>
<script> <script>
import { Control_API } from "../../../../../../../api";
export default { export default {
name: "TakeOverRecords", name: "TakeOverRecords",
data() { data() {
...@@ -29,8 +31,30 @@ export default { ...@@ -29,8 +31,30 @@ export default {
list: [], list: [],
}; };
}, },
mounted() {
this.init();
},
methods: { 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> </script>
......
...@@ -173,6 +173,14 @@ function initUavRealTimeData() { ...@@ -173,6 +173,14 @@ function initUavRealTimeData() {
down45Link 4/5G下行速率,单位字节/秒 Long down45Link 4/5G下行速率,单位字节/秒 Long
} */ } */
flightMode: "UNKNOWN", flightMode: "UNKNOWN",
uploadAirline: { //上传的航线
finishedAction: '', //航点任务完成后,飞机将采取的行动
headingMode: '', //飞机在航点之间移动时的航向模式
isExitMissionOnRCSignalLostEnabled: Boolean, //飞机在航点之间移动时的航向模式
maxFlightSpeed: 0, //航线飞行最大速度,px4无人机默认最大12m
autoFlightSpeed: 0, //航线飞行速度默认5m
waypointList: null
},
}; };
} }
...@@ -197,6 +205,7 @@ const state = { ...@@ -197,6 +205,7 @@ const state = {
showPlayer: false, //显示播放器 showPlayer: false, //显示播放器
showPanel: false, //显示数据面板 showPanel: false, //显示数据面板
isQingLiu: null, // 当前视频播放的是否为清流 isQingLiu: null, // 当前视频播放的是否为清流
waitAirlineUpload: false, //是否正在等待航线上传
}; };
const mutations = { const mutations = {
...@@ -231,7 +240,10 @@ const actions = { ...@@ -231,7 +240,10 @@ const actions = {
commit("setState", { key: "mountList", value: [] }); commit("setState", { key: "mountList", value: [] });
commit("setState", { key: "selectMount", value: null }); commit("setState", { key: "selectMount", value: null });
commit("setState", { key: "showVideo", value: false }); commit("setState", { key: "showVideo", value: false });
commit("setState", { key: "uavRealTimeData", value: initUavRealTimeData() }); commit("setState", {
key: "uavRealTimeData",
value: initUavRealTimeData(),
});
positions = []; positions = [];
}, },
...@@ -298,6 +310,7 @@ const actions = { ...@@ -298,6 +310,7 @@ const actions = {
const type275 = data[275]?.data; // 健康管理 const type275 = data[275]?.data; // 健康管理
const type270 = data[270]?.data; // 飞控应答消息 const type270 = data[270]?.data; // 飞控应答消息
const type260 = data[260]?.data; // 无人机提示信息 const type260 = data[260]?.data; // 无人机提示信息
const type261 = data[261]?.data; // 航线上传完成信息
let msgList = state.uavRealTimeData.msgList || []; let msgList = state.uavRealTimeData.msgList || [];
...@@ -308,10 +321,10 @@ const actions = { ...@@ -308,10 +321,10 @@ const actions = {
); );
if (!findMsg) { if (!findMsg) {
msgList.push({ msgList.push({
grade: 'AUTO', grade: "AUTO",
text: type270.text, text: type270.text,
time: moment(type270.timestamp).format("YYYY-MM-DD HH:mm:ss"), time: moment(type270.timestamp).format("YYYY-MM-DD HH:mm:ss"),
timestamp: type270.timestamp timestamp: type270.timestamp,
}); });
} }
} }
...@@ -322,10 +335,23 @@ const actions = { ...@@ -322,10 +335,23 @@ const actions = {
); );
if (!findMsg) { if (!findMsg) {
msgList.push({ 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, text: type260.msg,
time: moment(type260.timestamp).format("YYYY-MM-DD HH:mm:ss"), time: moment(type260.timestamp).format("YYYY-MM-DD HH:mm:ss"),
timestamp: type260.timestamp timestamp: type260.timestamp,
}); });
} }
} }
...@@ -363,6 +389,7 @@ const actions = { ...@@ -363,6 +389,7 @@ const actions = {
batteryList, batteryList,
msg: type270, msg: type270,
msgList, msgList,
uploadAirline: type261,
}, },
}); });
...@@ -638,7 +665,7 @@ const actions = { ...@@ -638,7 +665,7 @@ const actions = {
* 一键起飞 * 一键起飞
* @param {function} data.callback //完成回调 * @param {function} data.callback //完成回调
*/ */
async takeOff({ state }, data) { async takeOff({ state, commit }, data) {
console.log(state.airlineData, data); console.log(state.airlineData, data);
if (state.uav.network == 2) { if (state.uav.network == 2) {
try { try {
...@@ -682,24 +709,49 @@ const actions = { ...@@ -682,24 +709,49 @@ const actions = {
callback() {}, callback() {},
}); });
// 更改任务状态
// 起飞指令 // 起飞指令
setTimeout(() => { commit("setState", {
window.$mmc.$store.dispatch("MMCMQTT/publish", { key: "waitAirlineUpload",
topic: "PX4/OBTAIN/" + state.uav.deviceId, value: true,
data: { });
type: window.$mmc.$store.state.MMCMQTT.orders.航线一键起飞, let time = setInterval(() => {
if (state.uavRealTimeData.uploadAirline) {
clearInterval(time);
window.$mmc.$store.dispatch("MMCMQTT/publish", {
topic: "PX4/OBTAIN/" + state.uav.deviceId,
data: { data: {
taskId: state.airlineData.id, type: window.$mmc.$store.state.MMCMQTT.orders.航线一键起飞,
seq: 0, data: {
taskId: state.airlineData.id,
seq: 0,
},
}, },
}, callback() {
callback() { data?.callback && data.callback(true, flightSortieId.data);
data?.callback && data.callback(true, flightSortieId.data); },
}, });
}); // 清空261数据
}, 3000); 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) { } catch (e) {
console.log("一键起飞失败", e); console.log("一键起飞失败", e);
data?.callback && data.callback(false); data?.callback && data.callback(false);
...@@ -1180,7 +1232,7 @@ const actions = { ...@@ -1180,7 +1232,7 @@ const actions = {
data: { data: {
// taskID: data.taskID, // taskID: data.taskID,
videoID: 1, videoID: 1,
/* name: data.name, /* name: data.name,
dbID: data.dbID, */ dbID: data.dbID, */
}, },
}, },
...@@ -1272,17 +1324,17 @@ const actions = { ...@@ -1272,17 +1324,17 @@ const actions = {
}, },
// 键盘控制 // 键盘控制
keyControl({ state }, data) { keyControl({ state }, data) {
console.log(data, '键盘控制'); console.log(data, "键盘控制");
if (state.uav.network == 2) { if (state.uav.network == 2) {
window.$mmc.$store.dispatch('MMCMQTT/publish', { window.$mmc.$store.dispatch("MMCMQTT/publish", {
topic: 'PX4/OBTAIN/' + state.uav.deviceId, topic: "PX4/OBTAIN/" + state.uav.deviceId,
data: { data: {
type: 538, type: 538,
data: data data: data,
}, },
callback() { callback() {
data.callback && data.callback(true); data.callback && data.callback(true);
} },
}); });
} }
}, },
......
import orders from "./orders"; import orders from "./orders";
import dayjs from 'dayjs';
export default { export default {
namespaced: true, namespaced: true,
...@@ -114,6 +115,8 @@ export default { ...@@ -114,6 +115,8 @@ export default {
if (!state.dataSet[deviceHardId]) { if (!state.dataSet[deviceHardId]) {
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; state.dataSet[deviceHardId] = metadata;
commit("setDataSet", state.dataSet); commit("setDataSet", state.dataSet);
} }
......
import mqtt from "mqtt/dist/mqtt"; import mqtt from "mqtt/dist/mqtt";
import orders from "./orders"; import orders from "./orders";
import dayjs from 'dayjs';
function uint8array2json(uint8array) { function uint8array2json(uint8array) {
if (!uint8array || !uint8array.length) { if (!uint8array || !uint8array.length) {
...@@ -81,6 +82,7 @@ export default { ...@@ -81,6 +82,7 @@ export default {
} }
data.$time = Date.now(); // 打上时间戳 data.$time = Date.now(); // 打上时间戳
data.$timeStr = dayjs(data.$time).format('YYYY-MM-DD hh:mm:ss');
state.dataSet[deviceHardId][data.type] = data; state.dataSet[deviceHardId][data.type] = data;
commit("setDataSet", state.dataSet); commit("setDataSet", state.dataSet);
}); });
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论