From 9db53388d92d63ff029f932fb8a96e190f5dcf3f Mon Sep 17 00:00:00 2001
From: rain <1679827795@qq.com>
Date: Sat, 01 Mar 2025 17:48:45 +0800
Subject: [PATCH] 航线任务页面
---
src/views/resource/wayline.vue | 310 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/api/resource/wayline.js | 33 +++++
2 files changed, 343 insertions(+), 0 deletions(-)
diff --git a/src/api/resource/wayline.js b/src/api/resource/wayline.js
new file mode 100644
index 0000000..7e69280
--- /dev/null
+++ b/src/api/resource/wayline.js
@@ -0,0 +1,33 @@
+import request from '@/axios';
+
+
+export const getJobsByUser = (workspace_id, page, page_size, status = '', startTime = null, endTime = null, name = null) => {
+ return request({
+ url: `/drone-yw/wayline/api/v1/workspaces/jobsByUser`,
+ method: 'get',
+ params: {
+ page,
+ workspace_id,
+ page_size,
+ status,
+ startTime,
+ endTime,
+ name,
+ },
+ });
+};
+
+// export const getJobsByWorkspace = (workspace_id, page, page_size, status = '', startTime = null, endTime = null, name = null) => {
+// return request({
+// url: `/drone-yw/wayline/api/v1/workspaces/${workspace_id}/jobs`,
+// method: 'get',
+// params: {
+// page,
+// page_size,
+// status,
+// startTime,
+// endTime,
+// name,
+// },
+// });
+// };
\ No newline at end of file
diff --git a/src/views/resource/wayline.vue b/src/views/resource/wayline.vue
new file mode 100644
index 0000000..d357751
--- /dev/null
+++ b/src/views/resource/wayline.vue
@@ -0,0 +1,310 @@
+<template>
+ <basic-container>
+ <avue-crud
+ :option="option"
+ :table-loading="loading"
+ :data="data"
+ v-model:page="page"
+ :permission="permissionList"
+ v-model="form"
+ ref="crud"
+ @search-change="searchChange"
+ @search-reset="searchReset"
+ @selection-change="selectionChange"
+ @current-change="currentChange"
+ @size-change="sizeChange"
+ @refresh-change="refreshChange"
+ @on-load="onLoad">
+ </avue-crud>
+ </basic-container>
+</template>
+
+<script>
+import { getJobsByUser } from '@/api/resource/wayline';
+import { getAirportList } from '@/api/device/device';
+import { mapGetters } from 'vuex';
+import func from '@/utils/func';
+
+export default {
+ data() {
+ // 计算默认的开始和结束日期
+ const endDate = new Date(); // 当前日期
+ const startDate = new Date(); // 一个月前的日期
+ startDate.setMonth(startDate.getMonth() - 1);
+
+ // 格式化为 YYYY-MM-DD 字符串
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
+
+ return {
+ form: {},
+ // 初始化 query,设置默认时间范围
+ query: {
+ daterange: [defaultStartDate, defaultEndDate]
+ },
+ loading: true,
+ page: {
+ pageSize: 10,
+ currentPage: 1,
+ total: 0,
+ },
+ selectionList: [],
+ selectedWorkspaceId: null,
+ option: {
+ height: 'auto',
+ calcHeight: 32,
+ tip: false,
+ searchShow: true,
+ searchMenuSpan: 6,
+ border: true,
+ index: true,
+ selection: true,
+ dialogClickModal: false,
+ menu: false, // 禁用默认操作列
+ column: [
+ {
+ label: '机场选择',
+ prop: 'dock_name',
+ type: 'select',
+ search: true,
+ searchSpan: 5,
+ dicData: [],
+ props: {
+ label: 'nickname',
+ value: 'nickname',
+ },
+ hide: true,
+ },
+ {
+ label: '任务名称',
+ prop: 'job_name',
+ search: true,
+ searchSpan: 6,
+ },
+ {
+ label: '时间范围',
+ prop: 'daterange',
+ type: 'daterange',
+ search: true,
+ searchRange: true,
+ searchSpan: 6,
+ format: 'YYYY-MM-DD', // 显示格式
+ valueFormat: 'YYYY-MM-DD', // 值格式
+ startPlaceholder: '开始时间',
+ endPlaceholder: '结束时间',
+ searchValue: [defaultStartDate, defaultEndDate], // 设置搜索表单默认值
+ hide: true // 隐藏在表格中,只保留在搜索框
+ },
+ {
+ label: '机场名称',
+ prop: 'dock_name',
+ },
+ {
+ label: '用户名',
+ prop: 'username',
+ },
+ {
+ label: '执行时间',
+ prop: 'begin_time',
+ formatter: (row) => this.formatTime(row.begin_time),
+ },
+ {
+ label: '完成时间',
+ prop: 'completed_time',
+ formatter: (row) => this.formatTime(row.completed_time),
+ },
+ {
+ label: '错误原因',
+ prop: 'reason',
+ formatter: (row) => {
+ return [4, 5].includes(row.status) ? row.reason || '未知' : '';
+ },
+ },
+ ],
+ },
+ data: [],
+ };
+ },
+ computed: {
+ ...mapGetters(['permission']),
+ permissionList() {
+ return {
+ addBtn: false,
+ editBtn: false,
+ viewBtn: this.validData(this.permission.attach_view, false),
+ delBtn: this.validData(this.permission.attach_delete, false),
+ };
+ },
+ ids() {
+ let ids = [];
+ this.selectionList.forEach(ele => {
+ ids.push(ele.job_id);
+ });
+ return ids.join(',');
+ },
+ },
+ mounted() {
+ this.loadAirportList();
+ // 初始化时手动触发搜索,以确保默认值生效
+ this.$refs.crud.searchChange(this.query);
+ this.onLoad(this.page, this.query);
+ },
+ methods: {
+ loadAirportList() {
+ getAirportList().then(res => {
+ const airportData = res.data.data || [];
+ const airportColumn = this.option.column.find(col => col.prop === 'dock_name');
+ if (airportColumn) {
+ airportColumn.dicData = airportData.map(item => ({
+ nickname: item.nickname,
+ workspace_id: item.workspace_id,
+ }));
+ }
+ }).catch(error => {
+ // 处理错误
+ });
+ },
+ searchReset() {
+ // 重置时恢复默认时间范围
+ const endDate = new Date();
+ const startDate = new Date();
+ startDate.setMonth(startDate.getMonth() - 1);
+ const defaultStartDate = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}`;
+ const defaultEndDate = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-${String(endDate.getDate()).padStart(2, '0')}`;
+ this.query = {
+ daterange: [defaultStartDate, defaultEndDate]
+ };
+ this.selectedWorkspaceId = null;
+ // 更新 searchValue 以确保界面重置后显示默认值
+ const daterangeColumn = this.option.column.find(col => col.prop === 'daterange');
+ daterangeColumn.searchValue = [defaultStartDate, defaultEndDate];
+ this.onLoad(this.page, this.query);
+ },
+ searchChange(params, done) {
+ this.query = params;
+ this.page.currentPage = 1;
+
+ const airportColumn = this.option.column.find(col => col.prop === 'dock_name');
+ const selectedAirport = airportColumn.dicData.find(item => item.nickname === params.dock_name);
+ this.selectedWorkspaceId = selectedAirport ? selectedAirport.workspace_id : null;
+
+ const { daterange } = params;
+ let startTime = null;
+ let endTime = null;
+ if (daterange && Array.isArray(daterange) && daterange.length === 2) {
+ startTime = this.formatTime(daterange[0]);
+ endTime = this.formatTime(daterange[1]);
+ }
+
+ if (startTime && isNaN(new Date(startTime).getTime())) {
+ startTime = null;
+ }
+ if (endTime && isNaN(new Date(endTime).getTime())) {
+ endTime = null;
+ }
+
+ this.onLoad(this.page, params);
+ if (done) done();
+ },
+ selectionChange(list) {
+ this.selectionList = list;
+ },
+ selectionClear() {
+ this.selectionList = [];
+ this.$refs.crud.toggleSelection();
+ },
+ currentChange(currentPage) {
+ this.page.currentPage = currentPage;
+ this.onLoad(this.page, this.query);
+ },
+ sizeChange(pageSize) {
+ this.page.pageSize = pageSize;
+ this.onLoad(this.page, this.query);
+ },
+ refreshChange() {
+ this.onLoad(this.page, this.query);
+ },
+ onLoad(page, params = {}) {
+ this.loading = true;
+
+ const workspaceId = this.selectedWorkspaceId || null;
+ const { daterange } = params;
+ let startTime = null;
+ let endTime = null;
+
+ if (daterange && Array.isArray(daterange) && daterange.length === 2) {
+ startTime = this.formatTime(daterange[0]);
+ endTime = this.formatTime(daterange[1]);
+ }
+
+ if (startTime && isNaN(new Date(startTime).getTime())) {
+ startTime = null;
+ }
+ if (endTime && isNaN(new Date(endTime).getTime())) {
+ endTime = null;
+ }
+
+ getJobsByUser(
+ workspaceId,
+ page.currentPage,
+ page.pageSize,
+ params.status || '',
+ startTime,
+ endTime,
+ params.job_name || null
+ ).then(res => {
+ const responseData = res.data;
+
+ if (responseData && responseData.data && Array.isArray(responseData.data.list)) {
+ this.page.total = responseData.data.pagination.total || responseData.data.list.length;
+ this.data = responseData.data.list.map(item => ({
+ job_id: item.job_id,
+ job_name: item.job_name,
+ dock_name: item.dock_name,
+ status: item.status,
+ username: item.username,
+ workspace_id: item.workspace_id,
+ reason: item.reason,
+ begin_time: item.begin_time,
+ completed_time: item.completed_time,
+ }));
+ } else {
+ this.data = [];
+ this.page.total = 0;
+ }
+
+ this.loading = false;
+ this.selectionClear();
+ }).catch(error => {
+ this.loading = false;
+ this.data = [];
+ this.page.total = 0;
+ });
+ },
+ formatTime(time) {
+ if (!time) return '';
+ let date;
+ if (typeof time === 'number') {
+ date = new Date(time < 10000000000 ? time * 1000 : time);
+ } else if (typeof time === 'string') {
+ date = new Date(time);
+ }
+ if (isNaN(date.getTime())) {
+ return null;
+ }
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ },
+ validData(val, def) {
+ return typeof val !== 'undefined' ? val : def;
+ },
+ },
+};
+</script>
+
+<style></style>
\ No newline at end of file
--
Gitblit v1.9.3