From ed11371f7f98b0bf4a4212f4311bb39996fdd3be Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期二, 27 十月 2026 14:29:06 +0800
Subject: [PATCH] fix(环保门禁): 上传返回的 fileName 缺 /profile 前缀、url 拼错(IP后无斜杠),前端自己规范成 /profile/upload/... 相对路径

---
 src/views/environmentAccess/accessManagement/index.vue |  523 +++++++++++++++++++++++----------------------------------
 1 files changed, 209 insertions(+), 314 deletions(-)

diff --git a/src/views/environmentAccess/accessManagement/index.vue b/src/views/environmentAccess/accessManagement/index.vue
index 587dc78..830964c 100644
--- a/src/views/environmentAccess/accessManagement/index.vue
+++ b/src/views/environmentAccess/accessManagement/index.vue
@@ -1,347 +1,242 @@
 <template>
   <div class="app-container">
-    <el-form :model="filters" :inline="true">
-      <el-form-item label="闂ㄧ鍚嶇О">
-        <el-input
-          v-model="filters.name"
-          style="width: 240px"
-          placeholder="璇疯緭鍏ラ棬绂佸悕绉�"
-          clearable
-          :prefix-icon="Search"
-          @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item label="闂ㄧ鐘舵��">
-        <el-select
-          v-model="filters.status"
-          style="width: 240px"
-          placeholder="璇烽�夋嫨闂ㄧ鐘舵��"
-          clearable
-          @change="getTableData"
-        >
-          <el-option label="姝e父" value="1"></el-option>
-          <el-option label="寮傚父" value="0"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鍖哄煙">
-        <el-input
-          v-model="filters.area"
-          style="width: 240px"
-          placeholder="璇疯緭鍏ュ尯鍩�"
-          clearable
-          :prefix-icon="Search"
-          @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
+    <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+      <el-tab-pane label="杩涘嚭鍘傝溅杈�" name="1" />
+      <el-tab-pane label="鍘傚唴杞﹁締浣跨敤" name="2" />
+      <el-tab-pane label="闈為亾璺Щ鍔ㄦ満姊�" name="3" />
+      <el-tab-pane label="璁惧鏁呴殰" name="defect" />
+    </el-tabs>
+
+    <!-- 杞﹁締/鏈烘 -->
+    <template v-if="activeTab !== 'defect'">
+      <div class="search_form">
         <div>
-          <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
-          <el-button type="danger" icon="Delete" :disabled="multipleList.length <= 0" @click="batchDelete">鎵归噺鍒犻櫎</el-button>
+          <span class="search_title">杞︾墝/鏈烘缂栧彿锛�</span>
+          <el-input v-model="searchForm.plateNo" style="width: 200px" placeholder="璇疯緭鍏�" clearable @change="handleQuery" />
+          <span class="search_title ml10">浣跨敤浜猴細</span>
+          <el-input v-model="searchForm.driverName" style="width: 160px" placeholder="璇疯緭鍏�" clearable @change="handleQuery" />
+          <span class="search_title ml10">鏃堕棿锛�</span>
+          <el-date-picker v-model="searchForm.dateRange" type="daterange" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
+            start-placeholder="寮�濮�" end-placeholder="缁撴潫" clearable @change="changeRange" />
+          <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        </div>
+        <div>
+          <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
         </div>
       </div>
-      <PIMTable
-        rowKey="id"
-        isSelection
-        :column="columns"
-        :tableData="dataList"
-        :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-      </PIMTable>
-    </div>
-    <!-- 鏂板缂栬緫寮圭獥 -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
-      <el-form :model="formData" label-width="100px">
-        <el-form-item label="闂ㄧ鍚嶇О" required>
-          <el-input v-model="formData.name" placeholder="璇疯緭鍏ラ棬绂佸悕绉�"></el-input>
-        </el-form-item>
-        <el-form-item label="鍖哄煙" required>
-          <el-input v-model="formData.area" placeholder="璇疯緭鍏ュ尯鍩�"></el-input>
-        </el-form-item>
-        <el-form-item label="浣嶇疆" required>
-          <el-input v-model="formData.location" placeholder="璇疯緭鍏ュ叿浣撲綅缃�"></el-input>
-        </el-form-item>
-        <el-form-item label="鐘舵��" required>
-          <el-select v-model="formData.status" placeholder="璇烽�夋嫨鐘舵��">
-            <el-option label="姝e父" value="1"></el-option>
-            <el-option label="寮傚父" value="0"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鎻忚堪">
-          <el-input v-model="formData.description" type="textarea" rows="3" placeholder="璇疯緭鍏ユ弿杩颁俊鎭�"></el-input>
-        </el-form-item>
+      <div class="table_list">
+        <PIMTable rowKey="id" :column="vehicleColumns" :tableData="tableData" :page="page" :isSelection="true"
+          @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"></PIMTable>
+      </div>
+    </template>
+
+    <!-- 璁惧鏁呴殰 -->
+    <template v-else>
+      <div class="search_form">
+        <div>
+          <span class="search_title">璁惧鍙拌处ID锛�</span>
+          <el-input v-model="defectSearch.deviceLedgerId" style="width: 200px" placeholder="璇疯緭鍏�" clearable @change="handleQuery" />
+          <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        </div>
+        <div>
+          <el-button type="primary" @click="openDefect('add')">鏂板</el-button>
+          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+        </div>
+      </div>
+      <div class="table_list">
+        <PIMTable rowKey="id" :column="defectColumns" :tableData="tableData" :page="page" :isSelection="true"
+          @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"></PIMTable>
+      </div>
+    </template>
+
+    <!-- 杞﹁締寮圭獥 -->
+    <el-dialog v-model="dialogVisible" :title="operationType === 'add' ? '鏂板' : '缂栬緫'" width="60%" @close="closeDia">
+      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <el-row :gutter="30">
+          <el-col :span="12"><el-form-item label="杞︾墝/鏈烘缂栧彿锛�" prop="plateNo"><el-input v-model="form.plateNo" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+          <el-col :span="12"><el-form-item label="杞﹁締/鏈烘鍨嬪彿锛�" prop="vehicleModel"><el-input v-model="form.vehicleModel" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12"><el-form-item label="浣跨敤浜猴細" prop="driverName"><el-input v-model="form.driverName" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+          <el-col :span="12"><el-form-item label="鑱旂郴鐢佃瘽锛�" prop="driverPhone"><el-input v-model="form.driverPhone" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12"><el-form-item label="鐢ㄩ�旓細" prop="usePurpose"><el-input v-model="form.usePurpose" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+          <el-col :span="12"><el-form-item label="鏃堕棿锛�" prop="occurTime">
+            <el-date-picker v-model="form.occurTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨" style="width:100%" />
+          </el-form-item></el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12" v-if="activeTab === '1'"><el-form-item label="鏂瑰悜锛�" prop="direction">
+            <el-select v-model="form.direction" placeholder="璇烽�夋嫨" style="width:100%">
+              <el-option label="杩涘巶" :value="1" /><el-option label="鍑哄巶" :value="0" />
+            </el-select>
+          </el-form-item></el-col>
+          <el-col :span="12"><el-form-item label="鐘舵�侊細" prop="status"><el-input v-model="form.status" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24"><el-form-item label="澶囨敞锛�" prop="remark"><el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏�" /></el-form-item></el-col>
+        </el-row>
       </el-form>
       <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-          <el-button type="primary" @click="saveData">纭畾</el-button>
-        </span>
+        <el-button type="primary" @click="submitForm">纭</el-button>
+        <el-button @click="closeDia">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 璁惧鏁呴殰寮圭獥 -->
+    <el-dialog v-model="defectVisible" :title="defectType === 'add' ? '鏂板璁惧鏁呴殰' : '缂栬緫璁惧鏁呴殰'" width="50%">
+      <el-form :model="defectForm" label-width="140px" label-position="top">
+        <el-form-item label="璁惧鍙拌处ID锛�"><el-input-number v-model="defectForm.deviceLedgerId" :min="0" style="width:100%" /></el-form-item>
+        <el-form-item label="缂洪櫡鎻忚堪锛�"><el-input v-model="defectForm.defectDescription" type="textarea" :rows="3" /></el-form-item>
+        <el-form-item label="鐘舵�侊細">
+          <el-select v-model="defectForm.status" style="width:100%">
+            <el-option label="鏈秷闄�" value="0" /><el-option label="宸叉秷闄�" value="1" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="娑堥櫎鏃堕棿锛�"><el-date-picker v-model="defectForm.eliminateTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" style="width:100%" /></el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="primary" @click="submitDefect">纭</el-button>
+        <el-button @click="defectVisible = false">鍙栨秷</el-button>
       </template>
     </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, computed, onMounted } from 'vue';
-import { Search, Plus, Delete } from '@element-plus/icons-vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
-import dayjs from 'dayjs';
+import { Search } from "@element-plus/icons-vue";
+import { ref, reactive, toRefs, onMounted, getCurrentInstance } from "vue";
+import { ElMessageBox } from "element-plus";
+import {
+  listVehicle, addVehicle, updateVehicle, deleteVehicle,
+  listDefect, addDefect, updateDefect, deleteDefect,
+} from "@/api/environmentAccess/accessVehicle.js";
 
-// 瀹氫箟鍋囨暟鎹�
-const mockData = [
-  { id: 1, name: '涓滈棬闂ㄧ', area: '鐢熶骇鍖�', location: '涓滈棬鍏ュ彛', status: '1', lastUpdate: '2025-12-30 08:30:00', description: '涓昏鐢ㄤ簬鍛樺伐涓婁笅鐝�氳' },
-  { id: 2, name: '瑗块棬闂ㄧ', area: '浠撳偍鍖�', location: '瑗块棬鍏ュ彛', status: '1', lastUpdate: '2025-12-30 09:15:00', description: '涓昏鐢ㄤ簬鐗╂祦杞﹁締閫氳' },
-  { id: 3, name: '鍗楅棬闂ㄧ', area: '鍔炲叕鍖�', location: '鍗楅棬鍏ュ彛', status: '0', lastUpdate: '2025-12-30 10:20:00', description: '涓昏鐢ㄤ簬璁垮閫氳锛屽綋鍓嶆晠闅�' },
-  { id: 4, name: '鍖楅棬闂ㄧ', area: '鐢熶骇鍖�', location: '鍖楅棬鍏ュ彛', status: '1', lastUpdate: '2025-12-30 11:45:00', description: '涓昏鐢ㄤ簬鍘熸潗鏂欒繍杈撹溅杈嗛�氳' },
-  { id: 5, name: '涓帶瀹ら棬绂�', area: '涓帶鍖�', location: '涓帶瀹ら棬鍙�', status: '1', lastUpdate: '2025-12-30 13:20:00', description: '浠呴檺鎺堟潈浜哄憳杩涘叆' },
-];
+const { proxy } = getCurrentInstance();
+const activeTab = ref("1");
 
-// 鍝嶅簲寮忔暟鎹�
-const filters = reactive({
-  name: '',
-  status: '',
-  area: ''
-});
+const dirText = (d) => (d == 1 ? "杩涘巶" : d == 0 ? "鍑哄巶" : "");
+const defectStatusText = (s) => (s == 0 ? "鏈秷闄�" : s == 1 ? "宸叉秷闄�" : (s ?? ""));
 
-const dataList = ref([]);
-const pagination = reactive({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0
-});
+const vehicleColumns = ref([
+  { label: "杞︾墝/鏈烘缂栧彿", prop: "plateNo" },
+  { label: "杞﹁締/鏈烘鍨嬪彿", prop: "vehicleModel" },
+  { label: "浣跨敤浜�", prop: "driverName" },
+  { label: "鑱旂郴鐢佃瘽", prop: "driverPhone", width: 140 },
+  { label: "鐢ㄩ��", prop: "usePurpose" },
+  { label: "鏃堕棿", prop: "occurTime", width: 170 },
+  { label: "鏂瑰悜", prop: "direction", width: 80, dataType: "tag", formatData: (p) => dirText(p), formatType: () => "primary" },
+  { label: "鐘舵��", prop: "status", width: 90 },
+  { label: "澶囨敞", prop: "remark", showOverflowTooltip: true },
+  {
+    dataType: "action", label: "鎿嶄綔", align: "center", fixed: "right", width: 100,
+    operation: [{ name: "缂栬緫", type: "text", clickFun: (row) => openForm("edit", row) }],
+  },
+]);
 
-const multipleList = ref([]);
+const defectColumns = ref([
+  { label: "璁惧鍙拌处ID", prop: "deviceLedgerId", width: 120 },
+  { label: "缂洪櫡鎻忚堪", prop: "defectDescription", showOverflowTooltip: true },
+  { label: "鐘舵��", prop: "status", width: 100, dataType: "tag", formatData: (p) => defectStatusText(p), formatType: (p) => (p == 1 ? "success" : "danger") },
+  { label: "娑堥櫎鏃堕棿", prop: "eliminateTime", width: 170 },
+  { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 170 },
+  {
+    dataType: "action", label: "鎿嶄綔", align: "center", fixed: "right", width: 100,
+    operation: [{ name: "缂栬緫", type: "text", clickFun: (row) => openDefect("edit", row) }],
+  },
+]);
+
+const data = reactive({ searchForm: { plateNo: "", driverName: "", dateRange: [], entryDateStart: "", entryDateEnd: "" } });
+const { searchForm } = toRefs(data);
+const defectSearch = ref({ deviceLedgerId: "" });
+
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({ current: 1, size: 100, total: 0 });
+
+// 杞﹁締寮圭獥
 const dialogVisible = ref(false);
-const dialogTitle = ref('鏂板闂ㄧ');
-const formData = reactive({
-  id: '',
-  name: '',
-  area: '',
-  location: '',
-  status: '1',
-  description: ''
-});
+const operationType = ref("add");
+const formRef = ref();
+const form = ref({});
+const rules = { plateNo: [{ required: true, message: "璇疯緭鍏ヨ溅鐗�/鏈烘缂栧彿", trigger: "blur" }] };
 
-// 琛ㄦ牸鍒楅厤缃�
-const columns = [
-  {
-    label: '闂ㄧ鍚嶇О',
-    align: 'center',
-    prop: 'name',
-  },
-  {
-    label: '鍖哄煙',
-    align: 'center',
-    prop: 'area',
-  },
-  {
-    label: '浣嶇疆',
-    align: 'center',
-    prop: 'location',
-  },
-  {
-    label: '鐘舵��',
-    align: 'center',
-    prop: 'status',
-    formatter: (row) => {
-      return row.status === '1' ? '<el-tag type="success">姝e父</el-tag>' : '<el-tag type="danger">寮傚父</el-tag>';
-    }
-  },
-  {
-    label: '鏈�鍚庢洿鏂�',
-    align: 'center',
-    prop: 'lastUpdate',
-  },
-  {
-    label: '鎻忚堪',
-    align: 'center',
-    prop: 'description',
-  },
-  {
-    dataType: 'action',
-    label: '鎿嶄綔',
-    align: 'center',
-    fixed: 'right',
-    width: 140,
-    operation: [
-      {
-        name: '缂栬緫',
-        type: 'text',
-        clickFun: (row) => {
-          edit(row);
-        },
-      },
-      {
-        name: '鍒犻櫎',
-        type: 'text',
-        clickFun: (row) => {
-          deleteRow(row.id);
-        },
-      },
-    ],
-  },
-];
+// 鏁呴殰寮圭獥
+const defectVisible = ref(false);
+const defectType = ref("add");
+const defectForm = ref({});
 
-// 杩囨护鍚庣殑鏁版嵁
-const filteredData = computed(() => {
-  return mockData.filter(item => {
-    const nameMatch = !filters.name || item.name.includes(filters.name);
-    const statusMatch = !filters.status || item.status === filters.status;
-    const areaMatch = !filters.area || item.area.includes(filters.area);
-    return nameMatch && statusMatch && areaMatch;
-  });
-});
-
-// 鑾峰彇琛ㄦ牸鏁版嵁
-const getTableData = () => {
-  pagination.total = filteredData.value.length;
-  const start = (pagination.currentPage - 1) * pagination.pageSize;
-  const end = start + pagination.pageSize;
-  dataList.value = filteredData.value.slice(start, end);
+const changeRange = (v) => {
+  searchForm.value.entryDateStart = v?.[0] || "";
+  searchForm.value.entryDateEnd = v?.[1] || "";
+  getList();
 };
+const handleTabChange = () => { page.current = 1; getList(); };
+const handleQuery = () => { page.current = 1; getList(); };
+const pagination = (obj) => { page.current = obj.page; page.size = obj.limit; getList(); };
+const handleSelectionChange = (s) => { selectedRows.value = s; };
 
-// 閲嶇疆杩囨护鍣�
-const resetFilters = () => {
-  filters.name = '';
-  filters.status = '';
-  filters.area = '';
-  pagination.currentPage = 1;
-  getTableData();
-};
-
-// 鍒嗛〉鍙樺寲
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  getTableData();
-};
-
-// 澶氶�夊鐞�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
-
-// 鏂板
-const add = () => {
-  dialogTitle.value = '鏂板闂ㄧ';
-  formData.id = '';
-  formData.name = '';
-  formData.area = '';
-  formData.location = '';
-  formData.status = '1';
-  formData.description = '';
-  dialogVisible.value = true;
-};
-
-// 缂栬緫
-const edit = (row) => {
-  dialogTitle.value = '缂栬緫闂ㄧ';
-  formData.id = row.id;
-  formData.name = row.name;
-  formData.area = row.area;
-  formData.location = row.location;
-  formData.status = row.status;
-  formData.description = row.description;
-  dialogVisible.value = true;
-};
-
-// 淇濆瓨鏁版嵁
-const saveData = () => {
-  if (!formData.name || !formData.area || !formData.location) {
-    ElMessage.warning('璇峰~鍐欏繀濉瓧娈�');
-    return;
-  }
-
-  const currentTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
-  if (formData.id) {
-    // 缂栬緫
-    const index = mockData.findIndex(item => item.id === formData.id);
-    if (index !== -1) {
-      mockData[index] = {
-        ...formData,
-        lastUpdate: currentTime
-      };
-      ElMessage.success('缂栬緫鎴愬姛');
-    }
+const getList = () => {
+  tableLoading.value = true;
+  if (activeTab.value === "defect") {
+    listDefect({ ...defectSearch.value, ...page }).then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      page.total = res.data.total;
+    }).catch(() => { tableLoading.value = false; });
   } else {
-    // 鏂板
-    const newId = Math.max(...mockData.map(item => item.id), 0) + 1;
-    mockData.unshift({
-      ...formData,
-      id: newId,
-      lastUpdate: currentTime
-    });
-    ElMessage.success('鏂板鎴愬姛');
+    const p = { ...searchForm.value, vehicleType: Number(activeTab.value), ...page };
+    delete p.dateRange;
+    listVehicle(p).then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      page.total = res.data.total;
+    }).catch(() => { tableLoading.value = false; });
   }
-  dialogVisible.value = false;
-  getTableData();
 };
 
-// 鍒犻櫎
-const deleteRow = (id) => {
-  ElMessageBox.confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ラ棬绂佽褰�, 鏄惁缁х画?', '鎻愮ず', {
-    confirmButtonText: '纭畾',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === id);
-    if (index !== -1) {
-      mockData.splice(index, 1);
-      ElMessage.success('鍒犻櫎鎴愬姛');
-      getTableData();
-    }
-  }).catch(() => {});
+const openForm = (type, row) => {
+  operationType.value = type;
+  form.value = type === "add" ? { vehicleType: Number(activeTab.value) } : { ...row };
+  dialogVisible.value = true;
+};
+const closeDia = () => { proxy.resetForm("formRef"); dialogVisible.value = false; };
+const submitForm = () => {
+  formRef.value.validate((valid) => {
+    if (!valid) return;
+    form.value.vehicleType = Number(activeTab.value);
+    const p = operationType.value === "add" ? addVehicle(form.value) : updateVehicle(form.value);
+    p.then(() => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); closeDia(); getList(); });
+  });
 };
 
-// 鎵归噺鍒犻櫎
-const batchDelete = () => {
-  if (multipleList.value.length === 0) {
-    ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁');
-    return;
-  }
-
-  ElMessageBox.confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎鎵�閫夐棬绂佽褰�, 鏄惁缁х画?', '鎻愮ず', {
-    confirmButtonText: '纭畾',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }).then(() => {
-    const ids = multipleList.value.map(item => item.id);
-    mockData.forEach((item, index) => {
-      if (ids.includes(item.id)) {
-        mockData.splice(index, 1);
-      }
-    });
-    ElMessage.success('鍒犻櫎鎴愬姛');
-    getTableData();
-    multipleList.value = [];
-  }).catch(() => {});
+const openDefect = (type, row) => {
+  defectType.value = type;
+  defectForm.value = type === "add" ? { status: "0" } : { ...row };
+  defectVisible.value = true;
+};
+const submitDefect = () => {
+  const p = defectType.value === "add" ? addDefect(defectForm.value) : updateDefect(defectForm.value);
+  p.then(() => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); defectVisible.value = false; getList(); });
 };
 
-// 鍒濆鍖栨暟鎹�
-onMounted(() => {
-  getTableData();
-});
+const handleDelete = () => {
+  if (!selectedRows.value.length) { proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); return; }
+  const ids = selectedRows.value.map((i) => i.id);
+  ElMessageBox.confirm("鏄惁纭鍒犻櫎锛�", "鍒犻櫎", { confirmButtonText: "纭", cancelButtonText: "鍙栨秷", type: "warning" })
+    .then(() => {
+      const p = activeTab.value === "defect" ? deleteDefect(ids) : deleteVehicle(ids);
+      p.then(() => { proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); getList(); });
+    }).catch(() => {});
+};
+
+onMounted(() => { getList(); });
 </script>
 
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
+<style scoped lang="scss">
+.ml10 { margin-left: 10px; }
+.table_list { margin-top: unset; }
 </style>

--
Gitblit v1.9.3