无人机管理后台前端(已迁走)
张含笑
2025-09-04 3f1c205f6bbc6fbdfb5494fc484393ca2845f82f
Merge remote-tracking branch 'origin/feature/v5.0/5.0.5' into feature/v5.0/5.0.5
2 files modified
341 ■■■■ changed files
src/views/device/addDevice.vue 230 ●●●● patch | view | raw | blame | history
src/views/device/airport.vue 111 ●●●●● patch | view | raw | blame | history
src/views/device/addDevice.vue
@@ -24,6 +24,9 @@
    getDetail,
} from '@/api/device/workspaces'
import { getList as getSystemNames } from '@/api/system/sysConfig'
import { getRegionTreeAll } from '@/api/job/task';
import { getLazyTree } from '@/api/base/region'
import { mapGetters } from 'vuex'
@@ -36,6 +39,8 @@
    data () {
        return {
            xzqhData: [],
            systemNamesList: [],
            // 用于记录已经创建的websocket,防止重复创建
            webSocketIdSet: new Set(),
            // 用于保存多组websocket
@@ -60,6 +65,7 @@
            },
            selectionList: [],
            option: {
                addTitle: '设备注册',
                menuWidth: 300,
                lazy: true,
                tree: true,
@@ -70,10 +76,13 @@
                searchMenuSpan: 6,
                border: true,
                index: true,
                indexLabel: '序号',
                indexWidth: 60,
                viewBtn: true,
                selection: false,
                excelBtn: false,
                addBtn: true,
                addBtnText: '设备注册',
                dialogClickModal: false,
                grid: false,
@@ -83,7 +92,8 @@
                    {
                        label: '设备名称',// '工作空间名称',
                        prop: 'workspace_name',
                        editDisabled: true,
                        // editDisabled: true,
                        editDisplay: false,
                        searchLabelWidth: 130,
                        search: true,
                        // searchSpan: 4,
@@ -100,7 +110,11 @@
                        label: '系统名称',// '平台名称',
                        prop: 'platform_name',
                        labelWidth: 130,
                        editDisabled: true,
                        width: 180,
                        // editDisabled: true,
                        editDisplay: false,
                        type: 'select',
                        dicData: this.systemNamesDicData,
                        rules: [
                            {
                                required: false,
@@ -111,28 +125,48 @@
                    },
                    {
                        label: '所属单位',
                        prop: 'dept_name',
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        labelWidth: 130,
                        width: 180,
                        rules: [
                        {
                            required: true,
                            message: '请输入所属单位',
                            trigger: 'blur',
                        },
                        ],
                    },
                    {
                        label: '所属单位',
                        prop: 'dept_id',
                        hide: true,
                        type: 'tree',
                        defaultExpandAll: true,
                        search: true,
                        searchSpan: 4,
                        labelWidth: 130,
                        dicUrl: '/blade-system/dept/getTree',
                        props: {
                            label: 'name',
                            value: 'id',
                        label: 'name',
                        value: 'id',
                        },
                        rules: [
                            {
                                required: true,
                                message: '请输入所属单位',
                                trigger: 'blur',
                            },
                        {
                            required: true,
                            message: '请输入所属单位',
                            trigger: 'blur',
                        },
                        ],
                    },
                    {
                        label: '绑定编号',
                        prop: 'bind_code',
                        labelWidth: 130,
                        editDisabled: true,
                        // editDisabled: true,
                        editDisplay: false,
                        rules: [
                            {
                                required: false,
@@ -143,10 +177,12 @@
                    },
                    {
                        label: '设备类型',
                        editDisplay: false,
                        prop: 'type',
                        type: 'radio',
                        labelWidth: 130,
                        value: 0,
                        type: 'select',
                        dicData: [
                            {
                                label: '机场',
@@ -166,39 +202,24 @@
                        ],
                    },
                    {
                        label: '设备描述',// '工作空间描述',
                        prop: 'workspace_desc',
                        labelWidth: 130,
                        // search: true,
                        searchSpan: 4,
                        // editDisabled: true,
                        rules: [
                            {
                                required: true,
                                message: '请输入设备描述',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '创建时间',
                        prop: 'create_time',
                        addDisplay: false,
                        editDisplay: false,
                        label: '设备位置',// '行政区划',
                        prop: 'area_name',
                        // hide: true,
                        overHidden: true,
                        type: 'date',
                        addDisplay: false, //新增显示
                        editDisplay: false, //编辑显示
                        viewDisplay: true, //查看显示
                        labelWidth: 130,
                        width: 160,
                        format: 'YYYY-MM-DD HH:mm:ss',
                        width: 200,
                    },
                    {
                        label: '设备位置',// '行政区划',
                        prop: 'area_code',
                        type: 'cascader',
                        labelWidth: 130,
                        searchSpan: 4,
                        hide: true,
                        search: true,
                        editDisplay: true,
                        viewDisplay: false,
                        props: {
@@ -251,6 +272,35 @@
                        }
                        },
                    },
                    {
                        label: '设备描述',// '工作空间描述',
                        prop: 'workspace_desc',
                        labelWidth: 130,
                        // search: true,
                        searchSpan: 4,
                        // editDisabled: true,
                        rules: [
                            {
                                required: true,
                                message: '请输入设备描述',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '创建时间',
                        prop: 'create_time',
                        addDisplay: false,
                        editDisplay: false,
                        overHidden: true,
                        type: 'date',
                        labelWidth: 130,
                        width: 160,
                        format: 'YYYY-MM-DD HH:mm:ss',
                    },
                ],
            },
@@ -275,6 +325,12 @@
            })
            return ids.join(',')
        },
        systemNamesDicData() {
            return this.systemNamesList.map(item => ({
                label: item.name,
                value: item.id,
            }));
        },
    },
    destroyed () {
        this.websocketMap.forEach((k, v) => {
@@ -285,7 +341,99 @@
            }
        })
    },
    async created() {
        await this.getRegionTreeList();
        await this.getSystemNamesList();
    },
    methods: {
        async getRegionTreeList(code) {
            try {
                const res = await getRegionTreeAll({ parentCode: code });
                return res.data.data; // 返回数据而不是赋值给 this.xzqhData
            } catch (error) {
                console.error('获取区域树数据失败:', error);
                return null;
            }
        },
        async getSystemNamesList() {
            try {
                const res = await getSystemNames(1, 99);
                if (res?.data?.data?.records) {
                    this.systemNamesList = res.data.data.records;
                    // 找到平台名称列的索引
                    const columnIndex = this.option.column.findIndex(col => col.prop === 'platform_name');
                    if (columnIndex !== -1) {
                        // 直接更新 dicData
                        this.option.column[columnIndex].dicData = this.systemNamesList.map(item => ({
                            label: item.name,
                            value: item.id
                        }));
                    }
                }
            } catch (error) {
                console.error('获取系统名称失败:', error);
                this.systemNamesList = [];
            }
        },
        beforeOpen (type, row, index) {
            if (type === 'add') {
                this.form = {
                    workspace_name: '',
                    platform_name: '',
                    dept_name: '',
                    bind_code: '',
                    type: 0,
                    workspace_desc: '',
                    area_name: '',
                    area_code: '',
                }
            }
        },
        async getXZQHList(area_code) {
            try {
                const res = await getLazyTree(area_code);
                return res.data.data; // 返回数据,而不是直接修改 this.xzqhData
            } catch (error) {
                console.error('获取行政区划数据失败:', error);
                return [];
            }
        },
        findNodeById(tree, id) {
            if (tree.id === id) {
                return tree;
            }
            if (tree.childrens && tree.childrens.length > 0) {
                for (const child of tree.childrens) {
                    const found = this.findNodeById(child, id);
                    if (found) return found;
                }
            }
            return null;
        },
        async fetchAreaName(areaCode) {
            if (!areaCode) return '/';
            try {
                const response = await this.getFullAreaCode(areaCode);
                const codes = response.split(',');
                // 获取区域树数据
                const xzqhData = await this.getRegionTreeList(codes[0]);
                if (!xzqhData) return '/';
                const names = [];
                for (const code of codes) {
                    const node = this.findNodeById(xzqhData, code);
                    if (node) {
                        names.push(node.name);
                    }
                }
                return names.join('');
            } catch (error) {
                console.error('获取区域名称失败:', error);
                return '/';
            }
        },
        copyInfo (row, index) {
          const ipAddress = import.meta.env.VITE_APP_DEVICE_IP
@@ -454,6 +602,7 @@
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            const { releaseTimeRange } = this.query
            let values = {
                ...params,
@@ -467,9 +616,14 @@
                }
                values.releaseTimeRange = null
            }
            console.log(values.area_code,this.query)
            values['type'] = 1
            if (values.area_code) {
                values['area_code'] = values.area_code.split(',').pop()
            }
            this.loading = true
            getList(page.currentPage, page.pageSize, values).then(res => {
            getList(page.currentPage, page.pageSize, values).then(async res => {
                const data = res.data.data
                this.page.total = data.total
                // data.records.forEach(e => {
@@ -479,9 +633,15 @@
                //     }
                // });
                this.data = data.records
                for (const row of this.data) {
                if (row.area_code) {
                    row.area_name = await this.fetchAreaName(row.area_code);
                }
                }
                this.loading = false
                this.selectionClear()
            })
        },
        treeLoad (tree, treeNode, resolve) {
            var params = {
src/views/device/airport.vue
@@ -287,6 +287,7 @@
        border: true,
        index: true,
        indexLabel: '序号',
        indexWidth: 60,
        viewBtn: true,
        delBtn: false,
        selection: true,
@@ -322,7 +323,7 @@
          {
            label: '设备类型',
            prop: 'domainTxt',
            editDisabled: true,
            // editDisabled: true,
            editDisplay: false, //编辑显示
            viewDisplay: true, //查看显示
            labelWidth: 130,
@@ -332,7 +333,8 @@
          {
            label: '设备型号',
            prop: 'device_name',
            editDisabled: true,
            // editDisabled: true,
            editDisplay: false, //编辑显示
            viewDisplay: true, //查看显示
            search: false,
            searchSpan: 4,
@@ -353,7 +355,8 @@
            width: 120,
            overHidden: true,
            searchSpan: 4,
            editDisabled: true,
            // editDisabled: true,
            editDisplay: false, //编辑显示
            // rules: [
            //   {
            //     required: true,
@@ -375,23 +378,6 @@
          //     },
          //   ],
          // },
          {
            label: '设备名称',
            prop: 'nickname',
            labelWidth: 130,
            width: 160,
            searchSpan: 4,
            search: true,
            overHidden: true,
            editDisplay: true, //编辑显示
            rules: [
              {
                required: true,
                message: '请输入设备名称',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '设备位置',// '行政区划',
            prop: 'area_name',
@@ -463,6 +449,24 @@
              }
            },
          },
          {
            label: '设备名称',
            prop: 'nickname',
            labelWidth: 130,
            width: 160,
            searchSpan: 4,
            search: true,
            overHidden: true,
            editDisplay: true, //编辑显示
            rules: [
              {
                required: true,
                message: '请输入设备名称',
                trigger: 'blur',
              },
            ],
          },
          // {
          //   label: '设备位置',
          //   prop: 'address',
@@ -484,7 +488,8 @@
            labelWidth: 130,
            width: 160,
            overHidden: true,
            editDisabled: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            // rules: [
            //   {
            //     required: true,
@@ -492,6 +497,25 @@
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            // hide: true,
            label: '保险有效期',
            prop: 'duration_of_insurance',
            labelWidth: 130,
            width: 200,
            type: 'daterange',
            format: 'YYYY-MM-DD',
            valueFormat: 'YYYY-MM-DD HH:mm:ss',
            startPlaceholder: '保险开始日期',
            endPlaceholder: '保险结束日期',
            rules: [
              {
                required: true,
                message: '请选择保险有效期',
                trigger: 'blur',
              },
            ],
          },
          // {
          //   label: '保险有效期',
@@ -511,7 +535,8 @@
            prop: 'traffic_remaining',
            labelWidth: 130,
            width: 100,
            editDisabled: true,
            // editDisabled: true,
            editDisplay: false, //编辑显示
            // rules: [
            //   {
            //     required: true,
@@ -527,7 +552,8 @@
            width: 120,
            type: 'date',
            format: 'YYYY-MM-DD',
            editDisabled: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            // rules: [
            //   {
            //     required: true,
@@ -541,7 +567,8 @@
            prop: 'firmware_version',
            labelWidth: 130,
            width: 110,
            editDisabled: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            // rules: [
            //   {
            //     required: true,
@@ -558,7 +585,8 @@
            hide: true,
            viewDisabled: true,
            addDisabled: true,
            editDisabled: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
@@ -628,32 +656,15 @@
          // },
          {
            // hide: true,
            label: '保险有效期',
            prop: 'duration_of_insurance',
            labelWidth: 130,
            width: 160,
            type: 'daterange',
            format: 'YYYY-MM-DD',
            valueFormat: 'YYYY-MM-DD HH:mm:ss',
            startPlaceholder: '保险开始日期',
            endPlaceholder: '保险结束日期',
            rules: [
              {
                required: true,
                message: '请选择保险有效期',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '在线时间',
            hide: true,
            prop: 'login_time',
            type: 'date',
            editDisplay: true, //编辑显示
            editDisabled: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            viewDisplay: true, //查看显示
            addDisplay: true,
            labelWidth: 130,
@@ -674,8 +685,9 @@
            label: '注册时间',
            prop: 'create_time',
            type: 'date',
            editDisplay: true, //编辑显示
            editDisabled: true,
            hide: true,
            editDisplay: false, //编辑显示
            // editDisabled: true,
            viewDisplay: true, //查看显示
            addDisplay: true,
            overHidden: true,
@@ -1383,6 +1395,9 @@
        values.releaseTimeRange = null
      }
      values['type'] = 1
      if (values.area_code) {
          values['area_code'] = values.area_code.split(',').pop()
      }
      this.loading = true
      getList(page.currentPage, page.pageSize, values).then(res => {
        const data = res.data.data