From 4a78d51059d8cdd23f60603b42bd8b34e0472498 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 16 四月 2026 16:14:11 +0800
Subject: [PATCH] 湟水峡 1.部署修改

---
 src/api/collaborativeApproval/vehicleManagement.js          |   78 +++++
 multiple/config.json                                        |   20 
 multiple/assets/favicon/HSXico.ico                          |    0 
 multiple/assets/screen/HXSJView.png                         |    0 
 src/views/collaborativeApproval/vehicleManagement/index.vue |  713 ++++++++++++++++++++++++++++++++++++++++++++++++++
 multiple/assets/logo/HSXLogo.png                            |    0 
 6 files changed, 801 insertions(+), 10 deletions(-)

diff --git a/multiple/assets/favicon/HSXico.ico b/multiple/assets/favicon/HSXico.ico
new file mode 100644
index 0000000..500081c
--- /dev/null
+++ b/multiple/assets/favicon/HSXico.ico
Binary files differ
diff --git a/multiple/assets/logo/HSXLogo.png b/multiple/assets/logo/HSXLogo.png
new file mode 100644
index 0000000..c4150c4
--- /dev/null
+++ b/multiple/assets/logo/HSXLogo.png
Binary files differ
diff --git a/multiple/assets/screen/HXSJView.png b/multiple/assets/screen/HXSJView.png
new file mode 100644
index 0000000..02dde1c
--- /dev/null
+++ b/multiple/assets/screen/HXSJView.png
Binary files differ
diff --git a/multiple/config.json b/multiple/config.json
index 088557f..cbb3492 100644
--- a/multiple/config.json
+++ b/multiple/config.json
@@ -3,19 +3,19 @@
     "env": {
       "VITE_APP_TITLE": "鑺浜戯紙绠$悊淇℃伅绯荤粺锛�"
     },
-    "screen": "screen/PCDZView.png",
-    "logo": "logo/Logo.png",
-    "favicon": "favicon/favicon.ico"
+    "screen": "screen/JZYJView.png",
+    "logo": "logo/HYSNLogo.png",
+    "favicon": "favicon/HYSNico.ico"
   },
-  "TEST": {
+  "HSX": {
     "env": {
-      "VITE_APP_TITLE": "宸ュ巶鏁板瓧鍖朚OM绯荤粺",
-      "VITE_BASE_API": "http://1.15.17.182:9003",
-      "VITE_JAVA_API": "http://1.15.17.182:9002"
+      "VITE_APP_TITLE": "婀熸按宄″啘涓氬彂灞曚俊鎭鐞嗙郴缁�",
+      "VITE_BASE_API": "http://114.132.189.42:9030",
+      "VITE_JAVA_API": "http://114.132.189.42:9098"
     },
-    "screen": "screen/login-background.png",
-    "logo": "logo/Logo.png",
-    "favicon": "favicon/favicon.ico"
+    "screen": "screen/HSXView.png",
+    "logo": "logo/HSXLogo.png",
+    "favicon": "favicon/HSXico.ico"
   },
   "screen": "/src/assets/images/login-background.png",
   "logo": "/src/assets/logo/logo.png",
diff --git a/src/api/collaborativeApproval/vehicleManagement.js b/src/api/collaborativeApproval/vehicleManagement.js
new file mode 100644
index 0000000..ce8447d
--- /dev/null
+++ b/src/api/collaborativeApproval/vehicleManagement.js
@@ -0,0 +1,78 @@
+import request from "@/utils/request";
+
+// 鏌ヨ杞﹁締鍒楄〃
+export function listVehicle(page, query) {
+  return request({
+    url: "/carInfo/listPage",
+    method: "get",
+    params: {
+      ...page,
+      ...query,
+    },
+  });
+}
+
+// 鏂板杞﹁締
+export function addVehicle(data) {
+  return request({
+    url: "/carInfo/add",
+    method: "post",
+    data,
+  });
+}
+
+// 淇敼杞﹁締
+export function updateVehicle(data) {
+  return request({
+    url: "/carInfo/update",
+    method: "post",
+    data,
+  });
+}
+
+// 鍒犻櫎杞﹁締
+export function delVehicle(query) {
+  return request({
+    url: "/carInfo/delete",
+    method: "delete",
+    data: query,
+  });
+}
+
+// 鏍规嵁 id 鏌ヨ杞﹁締
+export function getVehicleById(id) {
+  return request({
+    url: `/vehicleManagement/getById/${id}`,
+    method: "get",
+  });
+}
+
+// 浣跨敤杞﹁締
+export function useVehicle(data) {
+  return request({
+    url: "/carInfoRecord/add",
+    method: "post",
+    data,
+  });
+}
+
+// 杩樿溅
+export function returnVehicle(data) {
+  return request({
+    url: "/carInfoRecord/update",
+    method: "post",
+    data,
+  });
+}
+
+// 浣跨敤璁板綍
+export function getVehicleUsageRecords(page, query) {
+  return request({
+    url: "/carInfoRecord/list",
+    method: "get",
+    params: {
+      ...page,
+      ...query,
+    },
+  });
+}
diff --git a/src/views/collaborativeApproval/vehicleManagement/index.vue b/src/views/collaborativeApproval/vehicleManagement/index.vue
new file mode 100644
index 0000000..85245bc
--- /dev/null
+++ b/src/views/collaborativeApproval/vehicleManagement/index.vue
@@ -0,0 +1,713 @@
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <el-form :model="searchForm" :inline="true">
+        <el-form-item label="杞︾墝鍙凤細">
+          <el-input v-model="searchForm.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable prefix-icon="Search"
+            @change="handleQuery" />
+        </el-form-item>
+        <el-form-item label="棰滆壊锛�">
+          <el-input v-model="searchForm.color" placeholder="璇疯緭鍏ラ鑹�" clearable prefix-icon="Search"
+            @change="handleQuery" />
+        </el-form-item>
+        <el-form-item label="鍝佺墝锛�">
+          <el-input v-model="searchForm.brand" placeholder="璇疯緭鍏ュ搧鐗�" clearable prefix-icon="Search"
+            @change="handleQuery" />
+        </el-form-item>
+        <el-form-item label="浣跨敤鐘舵�侊細">
+          <el-select v-model="searchForm.usageStatus" placeholder="璇烽�夋嫨" clearable @change="handleQuery" style="width: 200px">
+            <el-option label="绌洪棽" value="绌洪棽" />
+            <el-option label="浣跨敤涓�" value="浣跨敤涓�" />
+            <el-option label="缁翠慨涓�" value="缁翠慨涓�" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="table_list">
+      <div class="actions">
+        <div></div>
+        <div>
+          <el-button type="primary" @click="openForm('add')">
+            鏂板杞﹁締
+          </el-button>
+<!--          <el-button @click="handleOut">瀵煎嚭</el-button>-->
+          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+        </div>
+      </div>
+      <PIMTable
+        :table-data="tableData"
+        :column="tableColumns"
+        :is-selection="true"
+        :border="true"
+        :row-key="'id'"
+        :expand-row-keys="expandRowKeys"
+        :table-loading="tableLoading"
+        :table-style="{ width: '100%', height: 'calc(100vh - 21.5em)' }"
+        :page="{
+          current: page.current,
+          size: page.size,
+          total: total,
+          layout: 'total, sizes, prev, pager, next, jumper'
+        }"
+        @selection-change="handleSelectionChange"
+        @pagination="paginationChange"
+        @expand-change="handleExpandChange"
+      >
+        <template #expand="{ row }">
+          <div class="expand-wrapper">
+            <el-skeleton v-if="expandChildLoading[row.id]" animated :rows="3" />
+            <template v-else>
+              <el-empty v-if="!(expandChildData[row.id] && expandChildData[row.id].length)" description="鏆傛棤浣跨敤璁板綍" />
+              <el-table
+                v-else
+                :data="expandChildData[row.id]"
+                size="small"
+                border
+                style="width: 100%"
+                :header-cell-style="{ background: '#F7F8FA' }"
+              >
+                <el-table-column prop="userName" label="浣跨敤浜�" width="140" />
+                <el-table-column prop="desc" label="鐩殑鍦�" width="180" />
+                <el-table-column prop="useTime" label="浣跨敤鏃堕棿" width="180" />
+                <el-table-column prop="carReturnDate" label="杩樿溅鏃堕棿" width="180" />
+                <el-table-column prop="odometerBefore" label="浣跨敤鍓嶉噷绋�(km)" width="140" />
+                <el-table-column prop="odometerAfter" label="杩樿溅鏃堕噷绋�(km)" width="140" />
+                <el-table-column prop="thisTripMileage" label="鏈琛岄┒閲岀▼(km)" width="160" />
+              </el-table>
+            </template>
+          </div>
+        </template>
+        <template #operation="{ row }">
+          <el-button link type="primary" size="small" @click="openForm('edit', row)">缂栬緫</el-button>
+          <el-button link type="primary" size="small" v-if="row.usageStatus === '绌洪棽'" @click="openUseForm(row)">鐢ㄨ溅</el-button>
+          <el-button link type="primary" size="small" v-if="row.usageStatus === '浣跨敤涓�'" @click="openReturnForm(row)">杩樿溅</el-button>
+          <el-button link type="primary" size="small" @click="openUsageRecordsDialog(row)">浣跨敤璁板綍</el-button>
+        </template>
+      </PIMTable>
+    </div>
+
+    <!-- 鏂板/缂栬緫杞﹁締寮圭獥 -->
+    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板杞﹁締' : '缂栬緫杞﹁締'" width="50%"
+      @close="closeDia">
+      <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef">
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="杞︾墝鍙凤細" prop="carNo">
+              <el-input v-model="form.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="棰滆壊锛�" prop="color">
+              <el-input v-model="form.color" placeholder="璇疯緭鍏ラ鑹�" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍝佺墝锛�" prop="brand">
+              <el-input v-model="form.brand" placeholder="璇疯緭鍏ュ搧鐗�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浣跨敤鐘舵�侊細" prop="usageStatus">
+              <el-select v-model="form.usageStatus" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+                <el-option label="绌洪棽" value="绌洪棽" />
+                <el-option label="浣跨敤涓�" value="浣跨敤涓�" />
+                <el-option label="缁翠慨涓�" value="缁翠慨涓�" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="琛ㄦ樉閲岀▼(km)锛�">
+              <el-input-number v-model="form.odometerMileage" :min="0" :precision="2" style="width: 100%"
+                placeholder="璇疯緭鍏ヨ〃鏄鹃噷绋�" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�">
+              <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" clearable type="textarea" :rows="3" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 浣跨敤杞﹁締寮圭獥 -->
+    <el-dialog v-model="useFormVisible" title="浣跨敤杞﹁締" width="50%" @close="closeUseDia">
+      <el-form :model="useForm" label-width="140px" label-position="top" :rules="useRules" ref="useFormRef">
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="杞︾墝鍙凤細">
+              <el-input :value="currentUseRow ? currentUseRow.carNo : ''" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鐩殑鍦帮細" prop="destination">
+              <el-input v-model="useForm.destination" placeholder="璇疯緭鍏ョ洰鐨勫湴" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鍊熺敤鏃堕棿锛�" prop="carRentalDate">
+              <el-date-picker
+                style="width: 100%"
+                v-model="useForm.carRentalDate"
+                type="date"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                placeholder="璇烽�夋嫨鍊熺敤鏃堕棿"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="浣跨敤浜猴細" prop="userName">
+              <el-select v-model="useForm.userName" placeholder="璇烽�夋嫨浣跨敤浜�" clearable filterable>
+                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="琛ㄦ樉閲岀▼(km)锛�" prop="odometerMileage">
+              <el-input-number v-model="useForm.odometerMileage" :min="0" :precision="2" style="width: 100%"
+                placeholder="璇疯緭鍏ヨ〃鏄鹃噷绋�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈棰勮琛岄┒閲岀▼(km)锛�" prop="thisTripMileage">
+              <el-input-number v-model="useForm.thisTripMileage" :min="0" :precision="2" style="width: 100%"
+                placeholder="璇疯緭鍏ユ湰娆¢璁¤椹堕噷绋�" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�">
+              <el-input v-model="useForm.remark" placeholder="璇疯緭鍏ュ娉�" clearable type="textarea" :rows="3" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitUseForm">纭</el-button>
+          <el-button @click="closeUseDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 杩樿溅寮圭獥 -->
+    <el-dialog v-model="returnFormVisible" title="杩樿溅" width="50%" @close="closeReturnDia">
+      <el-form :model="returnForm" label-width="140px" label-position="top" :rules="returnRules" ref="returnFormRef">
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="杞︾墝鍙凤細">
+              <el-input :value="currentReturnRow ? currentReturnRow.carNo : ''" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="杩樿溅鏃堕棿锛�" prop="carReturnDate">
+              <el-date-picker style="width: 100%" v-model="returnForm.carReturnDate" value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨杩樿溅鏃堕棿" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="琛ㄦ樉閲岀▼(km)锛�" prop="odometerMileage">
+              <el-input-number v-model="returnForm.odometerMileage" :min="0" :precision="2" style="width: 100%"
+                placeholder="璇疯緭鍏ヨ〃鏄鹃噷绋�" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�">
+              <el-input v-model="returnForm.remark" placeholder="璇疯緭鍏ュ娉�" clearable type="textarea" :rows="3" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitReturnForm">纭</el-button>
+          <el-button @click="closeReturnDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 浣跨敤璁板綍寮圭獥 -->
+    <el-dialog v-model="usageRecordsVisible" title="浣跨敤璁板綍" width="70%" @close="closeUsageRecords">
+      <PIMTable
+        :table-data="usageRecordsData"
+        :column="usageRecordsColumns"
+        :border="true"
+        :table-loading="usageRecordsLoading"
+				:table-style="{ height: 'calc(100vh - 24em)', width: '100%' }"
+        :page="{
+          current: usageRecordsPage.current,
+          size: usageRecordsPage.size,
+          total: usageRecordsTotal,
+          layout: 'total, sizes, prev, pager, next, jumper'
+        }"
+        @pagination="usageRecordsPaginationChange"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
+import PIMTable from "@/components/PIMTable/PIMTable.vue";
+import { ElMessageBox } from "element-plus";
+import useUserStore from "@/store/modules/user";
+import { userListNoPage } from "@/api/system/user.js";
+import {
+  listVehicle,
+  addVehicle,
+  updateVehicle,
+  delVehicle,
+  getVehicleById,
+  useVehicle,
+  returnVehicle,
+  getVehicleUsageRecords,
+} from "@/api/collaborativeApproval/vehicleManagement.js";
+import useFormData from "@/hooks/useFormData.js";
+import dayjs from "dayjs";
+
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const selectedRows = ref([]);
+const userList = ref([]);
+const tableLoading = ref(false);
+const expandRowKeys = ref([]);
+const page = reactive({
+  current: 1,
+  size: 100,
+});
+const total = ref(0);
+
+// 浣跨敤璁板綍寮圭獥
+const usageRecordsVisible = ref(false);
+const usageRecordsData = ref([]);
+const usageRecordsLoading = ref(false);
+const usageRecordsPage = reactive({
+  current: 1,
+  size: 10,
+});
+const usageRecordsTotal = ref(0);
+const usageRecordsColumns = ref([
+  { label: "浣跨敤浜�", prop: "userName", width: "120" },
+  { label: "鐩殑鍦�", prop: "destination", width: "150" },
+  { label: "鍊熺敤鏃堕棿", prop: "carRentalDate", },
+  { label: "杩樿溅鏃堕棿", prop: "carReturnDate",},
+  { label: "浣跨敤鍓嶉噷绋�(km)", prop: "odometerMileage", },
+  { label: "鏈琛岄┒閲岀▼(km)", prop: "thisTripMileage",},
+]);
+
+// 鎼滅储琛ㄥ崟
+const data = reactive({
+  searchForm: {
+    carNo: "",
+    color: "",
+    brand: "",
+		usageStatus: "",
+  },
+  form: {
+    carNo: "",
+    color: "",
+    brand: "",
+		usageStatus: "绌洪棽",
+    odometerMileage: 0,
+    remark: "",
+  },
+  rules: {
+    carNo: [{ required: true, message: "璇疯緭鍏ヨ溅鐗屽彿", trigger: "blur" }],
+    color: [{ required: true, message: "璇疯緭鍏ラ鑹�", trigger: "blur" }],
+    brand: [{ required: true, message: "璇疯緭鍏ュ搧鐗�", trigger: "blur" }],
+		usageStatus: [{ required: true, message: "璇烽�夋嫨浣跨敤鐘舵��", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+const { form: searchForm } = useFormData(data.searchForm);
+
+// 浣跨敤杞﹁締琛ㄥ崟
+const useFormVisible = ref(false);
+const currentUseRow = ref(null);
+const useVehicleFormData = reactive({
+  useForm: {
+    carInfoId: "",
+    destination: "",
+    carRentalDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: 0,
+    thisTripMileage: 0,
+    userName: "",
+    remark: "",
+  },
+  useRules: {
+    destination: [{ required: true, message: "璇疯緭鍏ョ洰鐨勫湴", trigger: "blur" }],
+    carRentalDate: [{ required: true, message: "璇烽�夋嫨鍊熺敤鏃堕棿", trigger: "change" }],
+    odometerMileage: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
+    thisTripMileage: [{ required: true, message: "璇疯緭鍏ユ湰娆¤椹堕噷绋�", trigger: "blur" }],
+    userName: [{ required: true, message: "璇烽�夋嫨浣跨敤浜�", trigger: "change" }],
+  },
+});
+const { useForm, useRules } = toRefs(useVehicleFormData);
+
+// 杩樿溅琛ㄥ崟
+const returnFormVisible = ref(false);
+const currentReturnRow = ref(null);
+const returnFormData = reactive({
+  returnForm: {
+    carInfoId: "",
+    carReturnDate: "",
+    odometerMileage: 0,
+    remark: "",
+  },
+  returnRules: {
+    carReturnDate: [{ required: true, message: "璇烽�夋嫨杩樿溅鏃堕棿", trigger: "change" }],
+    odometerMileage: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
+  },
+});
+const { returnForm, returnRules } = toRefs(returnFormData);
+
+const expandChildData = reactive({});
+const expandChildLoading = reactive({});
+
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const operationType = ref("");
+const dialogFormVisible = ref(false);
+const currentId = ref("");
+
+// 琛ㄦ牸鍒楅厤缃�
+const tableColumns = ref([
+  { label: "杞︾墝鍙�", prop: "carNo", width: "120" },
+  { label: "棰滆壊", prop: "color", width: "100" },
+  { label: "鍝佺墝", prop: "brand", width: "120" },
+  {
+    label: "浣跨敤鐘舵��",
+    prop: "usageStatus",
+    dataType: "tag",
+    formatType: (val) => {
+      if (val === "绌洪棽") return "success";
+      if (val === "浣跨敤涓�") return "warning";
+      if (val === "缁翠慨涓�") return "danger";
+      return "info";
+    },
+  },
+  { label: "褰撳墠浣跨敤浜�", prop: "currentUserName", },
+  { label: "琛ㄦ樉閲岀▼(km)", prop: "odometerMileage",},
+  { label: "鍒涘缓鏃堕棿", prop: "createTime", width: "180" },
+  {
+    label: "鎿嶄綔",
+    dataType: "slot",
+    slot: "operation",
+    align: "center",
+    fixed: "right",
+    width: "180",
+  },
+]);
+
+// 鏌ヨ鍒楄〃
+const handleQuery = () => {
+  page.current = 1;
+  expandRowKeys.value = [];
+  getList();
+};
+
+const paginationChange = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+
+const getList = () => {
+  tableLoading.value = true;
+  listVehicle(page, searchForm)
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      total.value = res.data.total || 0;
+    })
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
+
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 灞曞紑瀛愯〃鏁版嵁
+const handleExpandChange = (row, expandedRows) => {
+  expandRowKeys.value = expandedRows.map((item) => item.id);
+  if (expandRowKeys.value.includes(row.id)) {
+    loadChildRecords(row.id);
+  }
+};
+
+const loadChildRecords = (carInfoId) => {
+  if (expandChildLoading[carInfoId]) return;
+  expandChildLoading[carInfoId] = true;
+  getVehicleUsageRecords({ current: 1, size: 20 }, { carInfoId })
+    .then((res) => {
+      expandChildData[carInfoId] = res.records || res.data || [];
+    })
+    .finally(() => {
+      expandChildLoading[carInfoId] = false;
+    });
+};
+
+// 鎵撳紑寮规
+const openForm = async (type, row) => {
+  operationType.value = type;
+  form.value = {
+    carNo: "",
+    color: "",
+    brand: "",
+		usageStatus: "绌洪棽",
+    odometerMileage: 0,
+    remark: "",
+  };
+
+  const userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+
+  if (type !== "add") {
+    currentId.value = row.id;
+    // 鐩存帴浣跨敤琛ㄦ牸琛屾暟鎹紝涓嶅啀璋冪敤API
+    form.value = { ...row };
+  }
+  dialogFormVisible.value = true;
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs["formRef"].validate((valid) => {
+    if (valid) {
+      if (operationType.value === "add") {
+        addVehicle(form.value).then(() => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          closeDia();
+          getList();
+        });
+      } else {
+        form.value.id = currentId.value;
+        updateVehicle(form.value).then(() => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          closeDia();
+          getList();
+        });
+      }
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+  currentId.value = "";
+};
+
+// 鎵撳紑浣跨敤杞﹁締寮规
+const openUseForm = async (row) => {
+  currentUseRow.value = row;
+  useForm.value = {
+    carInfoId: row.id,
+    destination: "",
+    carRentalDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: row.odometerMileage || 0,
+    thisTripMileage: 0,
+    userName: "",
+    remark: "",
+  };
+
+  const userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+
+  useFormVisible.value = true;
+};
+
+// 鎻愪氦浣跨敤杞﹁締琛ㄥ崟
+const submitUseForm = () => {
+  proxy.$refs["useFormRef"].validate((valid) => {
+    if (valid) {
+      useVehicle(useForm.value).then(() => {
+        proxy.$modal.msgSuccess("浣跨敤杞﹁締鎴愬姛");
+        closeUseDia();
+        getList();
+      });
+    }
+  });
+};
+
+// 鍏抽棴浣跨敤杞﹁締寮规
+const closeUseDia = () => {
+  try {
+    proxy.resetForm("useFormRef");
+  } catch (error) {
+    console.error("Error resetting form:", error);
+  }
+  useFormVisible.value = false;
+  currentUseRow.value = null;
+};
+
+// 鎵撳紑浣跨敤璁板綍寮圭獥
+const openUsageRecordsDialog = async (row) => {
+  usageRecordsVisible.value = true;
+  usageRecordsPage.current = 1;
+  loadUsageRecords(row.id);
+};
+
+// 鍔犺浇浣跨敤璁板綍
+const loadUsageRecords = (carInfoId) => {
+  usageRecordsLoading.value = true;
+  getVehicleUsageRecords(usageRecordsPage, { carInfoId: carInfoId })
+    .then((res) => {
+      usageRecordsData.value = res.data.records;
+      usageRecordsTotal.value = res.data.total || 0;
+    })
+    .finally(() => {
+      usageRecordsLoading.value = false;
+    });
+};
+
+// 浣跨敤璁板綍鍒嗛〉
+const usageRecordsPaginationChange = (obj) => {
+  usageRecordsPage.current = obj.page;
+  usageRecordsPage.size = obj.limit;
+  loadUsageRecords(currentUseRow.value.id);
+};
+
+// 鍏抽棴浣跨敤璁板綍寮圭獥
+const closeUsageRecords = () => {
+  usageRecordsVisible.value = false;
+};
+
+// 鎵撳紑杩樿溅寮规
+const openReturnForm = async (row) => {
+  currentReturnRow.value = row;
+  returnForm.value = {
+    carInfoId: row.id,
+    carReturnDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: row.odometerMileage || 0,
+    remark: "",
+  };
+
+  const userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+
+  returnFormVisible.value = true;
+};
+
+// 鎻愪氦杩樿溅琛ㄥ崟
+const submitReturnForm = () => {
+  proxy.$refs["returnFormRef"].validate((valid) => {
+    if (valid) {
+      // 鑷姩璁剧疆浣跨敤鐘舵�佷负绌洪棽骞舵坊鍔犺溅杈嗚褰旾D
+      const formData = { 
+        ...returnForm.value, 
+        usageStatus: "绌洪棽",
+        id: currentReturnRow.value.carInfoRecordId
+      };
+      returnVehicle(formData).then(() => {
+        proxy.$modal.msgSuccess("杩樿溅鎴愬姛");
+        closeReturnDia();
+        getList();
+      });
+    }
+  });
+};
+
+// 鍏抽棴杩樿溅寮规
+const closeReturnDia = () => {
+  proxy.resetForm("returnFormRef");
+  returnFormVisible.value = false;
+  currentReturnRow.value = null;
+};
+
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.download("/vehicleManagement/export", {}, "杞﹁締绠$悊.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
+
+// 鍒犻櫎
+const handleDelete = () => {
+  let ids = [];
+  if (selectedRows.value.length > 0) {
+    ids = selectedRows.value.map((item) => item.id);
+  } else {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      delVehicle(ids).then(() => {
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        getList();
+      });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+.ml-10 {
+  margin-left: 10px;
+}
+
+.table_list {
+  margin-top: unset;
+}
+
+.actions {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+</style>

--
Gitblit v1.9.3