From ab2551ae934556006ecf933c94c58f3f0748e54e Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Tue, 29 Jul 2025 15:52:35 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/views/tickets/ticket.vue   |   68 +++++++++++++++++-----
 src/views/device/addDevice.vue |   98 +++++++++++++++++++++++++++++++-
 2 files changed, 148 insertions(+), 18 deletions(-)

diff --git a/src/views/device/addDevice.vue b/src/views/device/addDevice.vue
index a1c4833..b4d7684 100644
--- a/src/views/device/addDevice.vue
+++ b/src/views/device/addDevice.vue
@@ -194,6 +194,64 @@
                         format: 'YYYY-MM-DD HH:mm:ss',
 
                     },
+                    {
+                        label: '行政区划',
+                        prop: 'area_code',
+                        type: 'cascader',
+                        labelWidth: 130,
+                        hide: true,
+                        editDisplay: true,
+                        viewDisplay: false,
+                        props: {
+                        label: 'title',
+                        value: 'value',
+                        emitPath: false,
+                        checkStrictly: true,
+                        multiple: false,
+                        expandTrigger: 'hover',
+                        },
+                        dataType: 'string',
+                        rules: [
+                        {
+                            required: true,
+                            message: '请选择行政区划',
+                            trigger: 'change',
+                        },
+                        ],
+                        lazy: true,
+                        lazyLoad (node, resolve) {
+                        let level = node.level
+                        let list = []
+                        let callback = () => {
+                            resolve(
+                            (list || []).map(ele => ({
+                                ...ele,
+                                value: ele.value,
+                                leaf: level >= 2,
+                            }))
+                            )
+                        }
+
+                        if (level === 0) {
+                            getLazyTree('000000000000').then(res => {
+                            list = res.data.data
+                            callback()
+                            })
+                        } else if (level === 1) {
+                            getLazyTree(node.value).then(res => {
+                            list = res.data.data
+                            callback()
+                            })
+                        } else if (level === 2) {
+                            getLazyTree(node.value).then(res => {
+                            list = res.data.data
+                            callback()
+                            })
+                        } else {
+                            callback()
+                        }
+                        },
+                    },
 
                 ],
             },
@@ -258,6 +316,14 @@
         },
 
         rowSave (row, done, loading) {
+            let areaCode = row.area_code
+            if (Array.isArray(areaCode)) {
+                areaCode = areaCode[areaCode.length - 1]
+            } else if (typeof areaCode === 'string' && areaCode.includes(',')) {
+                const codes = areaCode.split(',')
+                areaCode = codes[codes.length - 1]
+            }
+            row.area_code = areaCode || null
             add(row).then(
                 () => {
                     this.onLoad(this.page)
@@ -274,7 +340,11 @@
             )
         },
         rowUpdate (row, index, done, loading) {
-            update(row).then(
+            const submitData = {
+                ...row,
+                area_code: row.area_code.split(',').pop(),
+            }
+            update(submitData).then(
                 () => {
                     this.onLoad(this.page)
                     this.$message({
@@ -345,10 +415,32 @@
                     this.$refs.crud.toggleSelection()
                 })
         },
+        async getFullAreaCode (areaCode) {
+            if (!areaCode) return ''
+
+            const code = areaCode.toString()
+
+            if (code.includes(',')) return code
+
+            if (code.endsWith('0000000000')) {
+                return code
+            } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
+                const provinceCode = code.substring(0, 2) + '0000000000'
+                return `${provinceCode},${code}`
+            } else {
+                const provinceCode = code.substring(0, 2) + '0000000000'
+                const cityCode = code.substring(0, 4) + '00000000'
+                return `${provinceCode},${cityCode},${code}`
+            }
+        },
         beforeOpen (done, type) {
             if (['edit', 'view'].includes(type)) {
-                getDetail(this.form.id).then(res => {
-                    this.form = res.data.data
+                getDetail(this.form.id).then(async res => {
+                    const data = res.data.data
+                     this.form = {
+                        ...data,
+                        area_code: await this.getFullAreaCode(data.area_code),
+                     }
                 })
             }
             done()
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index c88e6e7..bbd330d 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -208,7 +208,8 @@
             </el-col>
             <el-col :span="12">
               <el-form-item label="工单类型" prop="type">
-                <el-select v-model="form.type" placeholder="请选择工单类型" class="full-width">
+
+                <el-select  @change="handleTypeChange" v-model="form.type" placeholder="请选择工单类型" class="full-width" >
                   <el-option
                     v-for="item in types"
                     :key="item.value"
@@ -265,6 +266,7 @@
                   multiple
                   placeholder="请选择关联算法"
                   class="full-width"
+                  :disabled="!form.type"
                 >
                   <el-option
                     v-for="item in algorithms"
@@ -363,7 +365,9 @@
           <el-button type="infoprimary" plain :loading="draftLoading" @click="saveDraft"
             >存草稿</el-button
           >
-          <el-button @click="dialogVisible = false">取 消</el-button>
+
+
+          <el-button  @click="handleCancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -911,6 +915,7 @@
       },
       departments: [],
       types: [],
+      allAlgorithms: [],
       handlers: [
         { label: '处理人A', value: 'handlerA' },
         { label: '处理人B', value: 'handlerB' },
@@ -1393,7 +1398,7 @@
         const subAreaCode = areaCode ? areaCode.substring(0, 6) : '';
         const adcodeObj = getAdcodeObj(geoJson, 'adcode', subAreaCode);
 
-        console.log('区域代码:', subAreaCode);
+       // console.log('区域代码:', subAreaCode);
 
         // 直接从返回对象中获取正确的路径
         const center = adcodeObj?.payload?.objects?.collection?.geometries?.[0]?.properties?.center;
@@ -1479,7 +1484,8 @@
     async fetchDropdownData() {
       try {
         const response = await getTicketInfo();
-        const { dept_data, event_type, ai_type } = response.data.data;
+
+        const { dept_data, event_type, ai_type,info } = response.data.data;
 
         this.departments = dept_data.map(item => ({
           label: item.dept_name,
@@ -1498,16 +1504,19 @@
 
         const columnType = this.findObject(this.option.column, 'type');
         columnType.dicData = this.types;
+        this.allAlgorithms  = info
 
+        // console.log('工单类型',this.types);
+        // console.log('关联算法',this.allAlgorithms );
         // 确保算法数据的映射一致
-        this.algorithms =
-          ai_type?.map(item => ({
-            dict_key: item.dict_key,
-            dict_value: item.dict_value,
-            // 同时添加 label 和 value 以兼容两处使用
-            label: item.dict_value,
-            value: item.dict_key,
-          })) || [];
+        // this.algorithms =
+        //   ai_type?.map(item => ({
+        //     dict_key: item.dict_key,
+        //     dict_value: item.dict_value,
+        //     // 同时添加 label 和 value 以兼容两处使用
+        //     label: item.dict_value,
+        //     value: item.dict_key,
+        //   })) || [];
 
         // 构建用户ID和名称的映射关系
         this.userNameToIdMap = {};
@@ -1519,6 +1528,33 @@
       } catch (error) {
         this.$message.error('加载下拉框数据失败');
       }
+    },
+    // 工单类型变化时触发
+    handleTypeChange(typeValue) {
+      if (!typeValue) {
+        // 未选择类型时清空算法列表
+        this.algorithms = [];
+        return;
+      }
+
+      const matchedCategory = this.allAlgorithms.find(
+        category => category.dict_key === typeValue 
+      );
+
+      if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
+        // 无匹配的算法时清空
+        this.algorithms = [];
+        this.$message.info('该工单类型暂无关联算法');
+        return;
+      }
+
+      this.algorithms = matchedCategory.algorithms.map(algo => ({
+        label: algo.dict_value, 
+        value: algo.dict_key,
+        dict_key: algo.dict_key,
+        dict_value: algo.dict_value
+      }));
+
     },
 
     async fetchTableData() {
@@ -1773,7 +1809,10 @@
         this.draftLoading = false;
       }
     },
-
+    handleCancel (){
+      this.resetForm();
+       this.dialogVisible = false;
+},
     handleLocationChange(val) {
       let locationValue = val.value;
       if (locationValue && locationValue.length >= 2) {
@@ -2434,8 +2473,7 @@
 
       // 获取工单类型值 - 从types中找到匹配的值
       const typeValue =
-        this.types.find(t => t.label === row.type)?.value || row.work_order_type_dict_key;
-
+        this.types.find(t => t.value === row.type)?.value || row.work_order_type_dict_key;
       // 获取处理人ID - 使用userNameToIdMap映射
       const handlerId = this.userNameToIdMap[row.handler] || row.handler;
 

--
Gitblit v1.9.3