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