From f61799441ca81bc63b0ce8b560c87cd56e22e4b2 Mon Sep 17 00:00:00 2001
From: rain <1679827795@qq.com>
Date: Tue, 15 Apr 2025 18:34:22 +0800
Subject: [PATCH] 增加序号绑定,数据导出按选择导出

---
 src/views/tickets/ticket.vue |  161 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 108 insertions(+), 53 deletions(-)

diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 7b61d27..80aad20 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -28,8 +28,9 @@
           </div>
 
           <!-- 表格部分 -->
-          <avue-crud v-model="tableData" :option="option" :data="tableData" v-model:page="page"
-            @size-change="sizeChange" @current-change="handleCurrentChange" :table-loading="loading">
+          <avue-crud ref="avueCrud" v-model="tableData" :option="option" :data="tableData" v-model:page="page"
+            @size-change="sizeChange" @current-change="handleCurrentChange" :table-loading="loading"
+            @selection-change="handleSelectionChange">
             <template #menu-left>
               <el-button
                 v-if="activeTab === 'all' || activeTab === 'myTickets'"
@@ -449,6 +450,9 @@
       option: {
         border: true,
         stripe: true,
+        selection: true, // 添加多选功能
+        index: true,     // 保留序号功能
+        indexLabel: '序号',
         menuWidth: 150,
         searchMenuSpan: 6,
         viewBtn: false,
@@ -458,18 +462,18 @@
         menu: true,
         page: true,
         column: [
-          { label: "序号", prop: "id", width: 70 },
+          // { label: "序号", prop: "id", width: 70 },
           { label: "工单编号", prop: "orderNumber", width: 150 },
           { label: "工单名称", prop: "orderName", width: 150 },
           { label: "所属单位", prop: "department", width: 100 },
           { label: "发起时间", prop: "startTime", width: 160 },
-          { label: "关联算法", prop: "aiType", width: 165 },
+          { label: "关联算法", prop: "aiType", width: 160 },
           { label: "工单类型", prop: "type", width: 108 },
           {
             label: "工单内容",
             prop: "content",
             slot: true,
-            width: 250,
+            width: 233,
             overHidden: true
           },
           { label: "创建人", prop: "creator", width: 100 },
@@ -550,6 +554,7 @@
       fixedStatuses: ["2", "0", "3", "4", "5"], // 固定的五个状态
       userNameToIdMap: {}, // 新增用户名到ID的映射
       workType: 0, // 新增:当前工单work_type
+      selections: [], // 添加选中行数据数组
     };
   },
   created() {
@@ -1171,56 +1176,77 @@
     },
 
     async exportData() {
+      // 修改导出方法,添加选中数据的处理
       try {
         this.loading = true;
-        const currentTab = this.tabs.find(tab => tab.name === this.activeTab);
-
-        // 使用与查询列表相同的参数构造逻辑
-        const params = {
-          word_order_type: this.filters.type || undefined,
-          status: currentTab?.name === 'myTickets' ? undefined :
-            this.filters.status !== "" ? Number(this.filters.status) :
-              currentTab?.value, // 使用当前tab的状态值
-          keyword: this.filters.keyword || undefined,
-          dept_id: this.filters.department || undefined,
-          start_date: this.filters.dateRange?.[0] ? this.formatDate(this.filters.dateRange[0]) : undefined,
-          end_date: this.filters.dateRange?.[1] ? this.formatDate(this.filters.dateRange[1]) : undefined,
-          current: 1,
-          size: 10
-        };
-
-        const response = await getList(params);
-        if (!response?.data?.data?.records) {
-          throw new Error('接口返回数据格式不正确');
-        }
-
-        const { records } = response.data.data;
-
-        // 使用与查询列表相同的过滤逻辑
-        let filteredRecords = records;
-        if (currentTab?.name === 'myTickets') {
-          filteredRecords = records.filter(item =>
-            String(item.create_user_id) === String(item.user_id)
-          );
-        }
-
-        const exportData = filteredRecords.map(item => {
-          const longitude = Number(item.longitude) || 0;
-          const latitude = Number(item.latitude) || 0;
-          return {
-            工单编号: item.event_num || '',
-            工单名称: item.event_name || '',
-            所属单位: item.dept_name || '',
-            发起时间: item.create_time || '',
-            关联算法: item.ai_types || '',
+        
+        // 如果有选中的数据,则只导出选中的数据
+        let exportData = [];
+        if (this.selections.length > 0) {
+          exportData = this.selections.map(item => ({
+            工单编号: item.orderNumber || '',
+            工单名称: item.orderName || '',
+            所属单位: item.department || '',
+            发起时间: item.startTime || '',
+            关联算法: item.aiType || '',
             工单内容: item.address || '',
-            工单类型: this.types.find(t => t.value === item.event_dict_key)?.label || '',
-            经纬度: (!isNaN(longitude) && !isNaN(latitude)) ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}` : '',
-            创建人: item.create_user || '',
-            处理人: item.update_user || '',
-            工单状态: this.mapStatus(Number(item.status || 0))
+            工单类型: item.type || '',
+            经纬度: item.location ? `${item.location[0].toFixed(6)}, ${item.location[1].toFixed(6)}` : '',
+            创建人: item.creator || '',
+            处理人: item.handler || '',
+            工单状态: this.mapStatus(item.status)
+          }));
+        } else {
+          // 原有的导出全部数据的逻辑
+          const currentTab = this.tabs.find(tab => tab.name === this.activeTab);
+
+          // 使用与查询列表相同的参数构造逻辑
+          const params = {
+            word_order_type: this.filters.type || undefined,
+            status: currentTab?.name === 'myTickets' ? undefined :
+              this.filters.status !== "" ? Number(this.filters.status) :
+                currentTab?.value, // 使用当前tab的状态值
+            keyword: this.filters.keyword || undefined,
+            dept_id: this.filters.department || undefined,
+            start_date: this.filters.dateRange?.[0] ? this.formatDate(this.filters.dateRange[0]) : undefined,
+            end_date: this.filters.dateRange?.[1] ? this.formatDate(this.filters.dateRange[1]) : undefined,
+            current: 1,
+            size: 10
           };
-        });
+
+          const response = await getList(params);
+          if (!response?.data?.data?.records) {
+            throw new Error('接口返回数据格式不正确');
+          }
+
+          const { records } = response.data.data;
+
+          // 使用与查询列表相同的过滤逻辑
+          let filteredRecords = records;
+          if (currentTab?.name === 'myTickets') {
+            filteredRecords = records.filter(item =>
+              String(item.create_user_id) === String(item.user_id)
+            );
+          }
+
+          exportData = filteredRecords.map(item => {
+            const longitude = Number(item.longitude) || 0;
+            const latitude = Number(item.latitude) || 0;
+            return {
+              工单编号: item.event_num || '',
+              工单名称: item.event_name || '',
+              所属单位: item.dept_name || '',
+              发起时间: item.create_time || '',
+              关联算法: item.ai_types || '',
+              工单内容: item.address || '',
+              工单类型: this.types.find(t => t.value === item.event_dict_key)?.label || '',
+              经纬度: (!isNaN(longitude) && !isNaN(latitude)) ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}` : '',
+              创建人: item.create_user || '',
+              处理人: item.update_user || '',
+              工单状态: this.mapStatus(Number(item.status || 0))
+            };
+          });
+        }
 
         if (exportData.length === 0) {
           this.$message.warning('没有数据可供导出');
@@ -1547,6 +1573,36 @@
           this.$message.error(error.message || '删除失败,请稍后重试');
         }
       }).catch(() => { });
+    },
+
+    // 添加选择变化处理方法
+    handleSelectionChange(selection) {
+      this.selections = selection;
+      console.log('已选择的行:', selection);
+    },
+
+    // 添加全选方法
+    handleSelectAll(val) {
+      this.$refs.avueCrud.toggleSelection(val);
+    },
+
+    // 添加单行选择方法
+    handleSelect(selection, row) {
+      console.log('选中行变化:', selection, row);
+    },
+
+    // 如果需要手动选中某些行
+    setSelection(rows) {
+      this.$nextTick(() => {
+        rows.forEach(row => {
+          this.$refs.avueCrud.toggleSelection(row, true);
+        });
+      });
+    },
+
+    // 清空选择
+    clearSelection() {
+      this.$refs.avueCrud.clearSelection();
     },
   },
 };
@@ -2039,5 +2095,4 @@
     }
   }
 }
-</style>
-```
\ No newline at end of file
+</style>
\ No newline at end of file

--
Gitblit v1.9.3