From 3f1c205f6bbc6fbdfb5494fc484393ca2845f82f Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 04 Sep 2025 15:14:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/feature/v5.0/5.0.5' into feature/v5.0/5.0.5

---
 src/views/device/addDevice.vue |  230 ++++++++++++++++++++++++++++++++-----
 src/views/device/airport.vue   |  111 ++++++++++--------
 2 files changed, 258 insertions(+), 83 deletions(-)

diff --git a/src/views/device/addDevice.vue b/src/views/device/addDevice.vue
index f556b04..4bf099e 100644
--- a/src/views/device/addDevice.vue
+++ b/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 = {
diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index c4ca19c..bd3b139 100644
--- a/src/views/device/airport.vue
+++ b/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

--
Gitblit v1.9.3