From c9e78ad7be4006bfd62e728b249e68a7366d2e38 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 21 一月 2026 17:27:18 +0800
Subject: [PATCH] 湟水峡 1.生产报工单价默认值修改 2.车辆管理页面开发和联调 3.生产管理模块修改 4.发货前端页面开发

---
 src/api/collaborativeApproval/vehicleManagement.js          |   14 
 src/assets/styles/index.scss                                |    3 
 src/views/inventoryManagement/receiptManagement/index.vue   |   82 ------
 src/views/inventoryManagement/issueManagement/index.vue     |   70 -----
 src/views/salesManagement/salesLedger/index.vue             |   69 +++++
 src/views/collaborativeApproval/vehicleManagement/index.vue |  372 +++++++++++++++++-------------
 src/views/inventoryManagement/dispatchLog/index.vue         |   61 -----
 7 files changed, 289 insertions(+), 382 deletions(-)

diff --git a/src/api/collaborativeApproval/vehicleManagement.js b/src/api/collaborativeApproval/vehicleManagement.js
index 0478101..ce8447d 100644
--- a/src/api/collaborativeApproval/vehicleManagement.js
+++ b/src/api/collaborativeApproval/vehicleManagement.js
@@ -3,7 +3,7 @@
 // 鏌ヨ杞﹁締鍒楄〃
 export function listVehicle(page, query) {
   return request({
-    url: "/vehicleManagement/getList",
+    url: "/carInfo/listPage",
     method: "get",
     params: {
       ...page,
@@ -15,7 +15,7 @@
 // 鏂板杞﹁締
 export function addVehicle(data) {
   return request({
-    url: "/vehicleManagement/add",
+    url: "/carInfo/add",
     method: "post",
     data,
   });
@@ -24,7 +24,7 @@
 // 淇敼杞﹁締
 export function updateVehicle(data) {
   return request({
-    url: "/vehicleManagement/update",
+    url: "/carInfo/update",
     method: "post",
     data,
   });
@@ -33,7 +33,7 @@
 // 鍒犻櫎杞﹁締
 export function delVehicle(query) {
   return request({
-    url: "/vehicleManagement/delete",
+    url: "/carInfo/delete",
     method: "delete",
     data: query,
   });
@@ -50,7 +50,7 @@
 // 浣跨敤杞﹁締
 export function useVehicle(data) {
   return request({
-    url: "/vehicleManagement/useVehicle",
+    url: "/carInfoRecord/add",
     method: "post",
     data,
   });
@@ -59,7 +59,7 @@
 // 杩樿溅
 export function returnVehicle(data) {
   return request({
-    url: "/vehicleManagement/returnVehicle",
+    url: "/carInfoRecord/update",
     method: "post",
     data,
   });
@@ -68,7 +68,7 @@
 // 浣跨敤璁板綍
 export function getVehicleUsageRecords(page, query) {
   return request({
-    url: "/vehicleManagement/getUsageRecords",
+    url: "/carInfoRecord/list",
     method: "get",
     params: {
       ...page,
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index 86ba8dd..a14f968 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -138,7 +138,8 @@
 .table_list {
   height: calc(100vh - 11em);
   background: #fff;
-  padding: 18px
+  padding: 18px;
+  margin-top: 16px;
 }
 .components-container {
   margin: 30px 50px;
diff --git a/src/views/collaborativeApproval/vehicleManagement/index.vue b/src/views/collaborativeApproval/vehicleManagement/index.vue
index 51e4cd5..acbf408 100644
--- a/src/views/collaborativeApproval/vehicleManagement/index.vue
+++ b/src/views/collaborativeApproval/vehicleManagement/index.vue
@@ -3,7 +3,7 @@
     <div class="search_form">
       <el-form :model="searchForm" :inline="true">
         <el-form-item label="杞︾墝鍙凤細">
-          <el-input v-model="searchForm.plateNumber" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable prefix-icon="Search"
+          <el-input v-model="searchForm.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable prefix-icon="Search"
             @change="handleQuery" />
         </el-form-item>
         <el-form-item label="棰滆壊锛�">
@@ -15,10 +15,10 @@
             @change="handleQuery" />
         </el-form-item>
         <el-form-item label="浣跨敤鐘舵�侊細">
-          <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨" clearable @change="handleQuery" style="width: 200px">
-            <el-option label="绌洪棽" value="idle" />
-            <el-option label="浣跨敤涓�" value="in_use" />
-            <el-option label="缁翠慨涓�" value="maintenance" />
+          <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>
@@ -33,7 +33,7 @@
           <el-button type="primary" @click="openForm('add')">
             鏂板杞﹁締
           </el-button>
-          <el-button @click="handleOut">瀵煎嚭</el-button>
+<!--          <el-button @click="handleOut">瀵煎嚭</el-button>-->
           <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
         </div>
       </div>
@@ -42,8 +42,10 @@
         :column="tableColumns"
         :is-selection="true"
         :border="true"
+        :row-key="'id'"
+        :expand-row-keys="expandRowKeys"
         :table-loading="tableLoading"
-        :table-style="{ width: '100%', height: 'calc(100vh - 18.5em)' }"
+        :table-style="{ width: '100%', height: 'calc(100vh - 21.5em)' }"
         :page="{
           current: page.current,
           size: page.size,
@@ -52,14 +54,39 @@
         }"
         @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.status === 'idle'"
-            @click="openUseForm(row)">浣跨敤杞﹁締</el-button>
-          <el-button link type="primary" size="small" v-if="row.status === 'in_use'"
+          <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="viewUsageRecords(row)">浣跨敤璁板綍</el-button>
+          <el-button link type="primary" size="small" @click="openUsageRecordsDialog(row)">浣跨敤璁板綍</el-button>
         </template>
       </PIMTable>
     </div>
@@ -70,8 +97,8 @@
       <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="plateNumber">
-              <el-input v-model="form.plateNumber" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable />
+            <el-form-item label="杞︾墝鍙凤細" prop="carNo">
+              <el-input v-model="form.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -87,11 +114,11 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="浣跨敤鐘舵�侊細" prop="status">
-              <el-select v-model="form.status" placeholder="璇烽�夋嫨" clearable style="width: 100%">
-                <el-option label="绌洪棽" value="idle" />
-                <el-option label="浣跨敤涓�" value="in_use" />
-                <el-option label="缁翠慨涓�" value="maintenance" />
+            <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>
@@ -99,7 +126,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="琛ㄦ樉閲岀▼(km)锛�">
-              <el-input-number v-model="form.odometer" :min="0" :precision="2" style="width: 100%"
+              <el-input-number v-model="form.odometerMileage" :min="0" :precision="2" style="width: 100%"
                 placeholder="璇疯緭鍏ヨ〃鏄鹃噷绋�" clearable />
             </el-form-item>
           </el-col>
@@ -126,7 +153,7 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="杞︾墝鍙凤細">
-              <el-input :value="currentUseRow ? currentUseRow.plateNumber : ''" disabled />
+              <el-input :value="currentUseRow ? currentUseRow.carNo : ''" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -138,25 +165,40 @@
           </el-col>
         </el-row>
         <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="琛ㄦ樉閲岀▼(km)锛�" prop="odometer">
-              <el-input-number v-model="useForm.odometer" :min="0" :precision="2" style="width: 100%"
-                placeholder="璇疯緭鍏ヨ〃鏄鹃噷绋�" clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏈琛岄┒閲岀▼(km)锛�" prop="travelDistance">
-              <el-input-number v-model="useForm.travelDistance" :min="0" :precision="2" style="width: 100%"
-                placeholder="璇疯緭鍏ユ湰娆¤椹堕噷绋�" clearable />
+          <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="userId">
-              <el-select v-model="useForm.userId" placeholder="璇烽�夋嫨浣跨敤浜�" clearable filterable>
-                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+            <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>
@@ -182,30 +224,23 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="杞︾墝鍙凤細">
-              <el-input :value="currentReturnRow ? currentReturnRow.plateNumber : ''" disabled />
+              <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="returnTime">
-              <el-date-picker style="width: 100%" v-model="returnForm.returnTime" value-format="YYYY-MM-DD HH:mm:ss"
-                format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="璇烽�夋嫨杩樿溅鏃堕棿" clearable />
+            <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="12">
-            <el-form-item label="琛ㄦ樉閲岀▼(km)锛�" prop="odometer">
-              <el-input-number v-model="returnForm.odometer" :min="0" :precision="2" style="width: 100%"
+          <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-col :span="12">
-            <el-form-item label="浣跨敤浜猴細" prop="userId">
-              <el-select v-model="returnForm.userId" placeholder="璇烽�夋嫨浣跨敤浜�" clearable filterable>
-                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
-              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -232,7 +267,7 @@
         :column="usageRecordsColumns"
         :border="true"
         :table-loading="usageRecordsLoading"
-        :table-style="{ width: '100%' }"
+				:table-style="{ height: 'calc(100vh - 24em)', width: '100%' }"
         :page="{
           current: usageRecordsPage.current,
           size: usageRecordsPage.size,
@@ -270,33 +305,52 @@
 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: {
-    plateNumber: "",
+    carNo: "",
     color: "",
     brand: "",
-    status: "",
+		usageStatus: "",
   },
   form: {
-    plateNumber: "",
+    carNo: "",
     color: "",
     brand: "",
-    status: "idle",
-    odometer: 0,
+		usageStatus: "绌洪棽",
+    odometerMileage: 0,
     remark: "",
   },
   rules: {
-    plateNumber: [{ required: true, message: "璇疯緭鍏ヨ溅鐗屽彿", trigger: "blur" }],
+    carNo: [{ required: true, message: "璇疯緭鍏ヨ溅鐗屽彿", trigger: "blur" }],
     color: [{ required: true, message: "璇疯緭鍏ラ鑹�", trigger: "blur" }],
     brand: [{ required: true, message: "璇疯緭鍏ュ搧鐗�", trigger: "blur" }],
-    status: [{ required: true, message: "璇烽�夋嫨浣跨敤鐘舵��", trigger: "change" }],
+		usageStatus: [{ required: true, message: "璇烽�夋嫨浣跨敤鐘舵��", trigger: "change" }],
   },
 });
 const { form, rules } = toRefs(data);
@@ -307,18 +361,20 @@
 const currentUseRow = ref(null);
 const useVehicleFormData = reactive({
   useForm: {
-    vehicleId: "",
+    carInfoId: "",
     destination: "",
-    odometer: 0,
-    travelDistance: 0,
-    userId: "",
+    carRentalDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: 0,
+    thisTripMileage: 0,
+    userName: "",
     remark: "",
   },
   useRules: {
     destination: [{ required: true, message: "璇疯緭鍏ョ洰鐨勫湴", trigger: "blur" }],
-    odometer: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
-    travelDistance: [{ required: true, message: "璇疯緭鍏ユ湰娆¤椹堕噷绋�", trigger: "blur" }],
-    userId: [{ required: true, message: "璇烽�夋嫨浣跨敤浜�", trigger: "change" }],
+    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);
@@ -328,40 +384,20 @@
 const currentReturnRow = ref(null);
 const returnFormData = reactive({
   returnForm: {
-    vehicleId: "",
-    returnTime: "",
-    odometer: 0,
-    userId: "",
+    carInfoId: "",
+    carReturnDate: "",
+    odometerMileage: 0,
     remark: "",
   },
   returnRules: {
-    returnTime: [{ required: true, message: "璇烽�夋嫨杩樿溅鏃堕棿", trigger: "change" }],
-    odometer: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
-    userId: [{ required: true, message: "璇烽�夋嫨浣跨敤浜�", trigger: "change" }],
+    carReturnDate: [{ required: true, message: "璇烽�夋嫨杩樿溅鏃堕棿", trigger: "change" }],
+    odometerMileage: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
   },
 });
 const { returnForm, returnRules } = toRefs(returnFormData);
 
-// 浣跨敤璁板綍
-const usageRecordsVisible = ref(false);
-const usageRecordsData = ref([]);
-const usageRecordsLoading = ref(false);
-const usageRecordsPage = reactive({
-  current: 1,
-  size: 100,
-});
-const usageRecordsTotal = ref(0);
-const usageRecordsColumns = ref([
-  { label: "杞︾墝鍙�", prop: "plateNumber", width: "120" },
-  { label: "浣跨敤浜�", prop: "userName", width: "120" },
-  { label: "鐩殑鍦�", prop: "destination", width: "150" },
-  { label: "浣跨敤鏃堕棿", prop: "useTime", width: "180" },
-  { label: "杩樿溅鏃堕棿", prop: "returnTime", width: "180" },
-  { label: "浣跨敤鍓嶉噷绋�(km)", prop: "odometerBefore", width: "130" },
-  { label: "杩樿溅鏃堕噷绋�(km)", prop: "odometerAfter", width: "130" },
-  { label: "鏈琛岄┒閲岀▼(km)", prop: "travelDistance", width: "140" },
-]);
-const currentVehicleId = ref(null);
+const expandChildData = reactive({});
+const expandChildLoading = reactive({});
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref("");
@@ -370,29 +406,22 @@
 
 // 琛ㄦ牸鍒楅厤缃�
 const tableColumns = ref([
-  { label: "杞︾墝鍙�", prop: "plateNumber", width: "120" },
+  { label: "杞︾墝鍙�", prop: "carNo", width: "120" },
   { label: "棰滆壊", prop: "color", width: "100" },
   { label: "鍝佺墝", prop: "brand", width: "120" },
   {
     label: "浣跨敤鐘舵��",
-    prop: "status",
-    width: "100",
+    prop: "usageStatus",
     dataType: "tag",
-    formatData: (val) => {
-      if (val === "idle") return "绌洪棽";
-      if (val === "in_use") return "浣跨敤涓�";
-      if (val === "maintenance") return "缁翠慨涓�";
-      return val || "-";
-    },
     formatType: (val) => {
-      if (val === "idle") return "success";
-      if (val === "in_use") return "warning";
-      if (val === "maintenance") return "danger";
+      if (val === "绌洪棽") return "success";
+      if (val === "浣跨敤涓�") return "warning";
+      if (val === "缁翠慨涓�") return "danger";
       return "info";
     },
   },
-  { label: "褰撳墠浣跨敤浜�", prop: "currentUser", width: "120" },
-  { label: "琛ㄦ樉閲岀▼(km)", prop: "odometer", width: "120" },
+  { label: "褰撳墠浣跨敤浜�", prop: "currentUserName", },
+  { label: "琛ㄦ樉閲岀▼(km)", prop: "odometerMileage",},
   { label: "鍒涘缓鏃堕棿", prop: "createTime", width: "180" },
   {
     label: "鎿嶄綔",
@@ -400,13 +429,14 @@
     slot: "operation",
     align: "center",
     fixed: "right",
-    width: "250",
+    width: "180",
   },
 ]);
 
 // 鏌ヨ鍒楄〃
 const handleQuery = () => {
   page.current = 1;
+  expandRowKeys.value = [];
   getList();
 };
 
@@ -421,8 +451,8 @@
   listVehicle(page, searchForm)
     .then((res) => {
       tableLoading.value = false;
-      tableData.value = res.records || res.data || [];
-      total.value = res.total || 0;
+      tableData.value = res.data.records;
+      total.value = res.data.total || 0;
     })
     .catch(() => {
       tableLoading.value = false;
@@ -434,15 +464,35 @@
   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 = {
-    plateNumber: "",
+    carNo: "",
     color: "",
     brand: "",
-    status: "idle",
-    odometer: 0,
+		usageStatus: "绌洪棽",
+    odometerMileage: 0,
     remark: "",
   };
 
@@ -451,9 +501,8 @@
 
   if (type !== "add") {
     currentId.value = row.id;
-    getVehicleById(row.id).then((res) => {
-      form.value = { ...(res.data || res) };
-    });
+    // 鐩存帴浣跨敤琛ㄦ牸琛屾暟鎹紝涓嶅啀璋冪敤API
+    form.value = { ...row };
   }
   dialogFormVisible.value = true;
 };
@@ -484,17 +533,19 @@
 const closeDia = () => {
   proxy.resetForm("formRef");
   dialogFormVisible.value = false;
+  currentId.value = "";
 };
 
 // 鎵撳紑浣跨敤杞﹁締寮规
 const openUseForm = async (row) => {
   currentUseRow.value = row;
   useForm.value = {
-    vehicleId: row.id,
+    carInfoId: row.id,
     destination: "",
-    odometer: row.odometer || 0,
-    travelDistance: 0,
-    userId: "",
+    carRentalDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: row.odometerMileage || 0,
+    thisTripMileage: 0,
+    userName: "",
     remark: "",
   };
 
@@ -519,19 +570,54 @@
 
 // 鍏抽棴浣跨敤杞﹁締寮规
 const closeUseDia = () => {
-  proxy.resetForm("useFormRef");
+  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 = {
-    vehicleId: row.id,
-    returnTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
-    odometer: row.odometer || 0,
-    userId: "",
+    carInfoId: row.id,
+    carReturnDate: dayjs().format("YYYY-MM-DD"),
+    odometerMileage: row.odometerMileage || 0,
     remark: "",
   };
 
@@ -545,7 +631,13 @@
 const submitReturnForm = () => {
   proxy.$refs["returnFormRef"].validate((valid) => {
     if (valid) {
-      returnVehicle(returnForm.value).then(() => {
+      // 鑷姩璁剧疆浣跨敤鐘舵�佷负绌洪棽骞舵坊鍔犺溅杈嗚褰旾D
+      const formData = { 
+        ...returnForm.value, 
+        usageStatus: "绌洪棽",
+        id: currentReturnRow.value.carInfoRecordId
+      };
+      returnVehicle(formData).then(() => {
         proxy.$modal.msgSuccess("杩樿溅鎴愬姛");
         closeReturnDia();
         getList();
@@ -559,42 +651,6 @@
   proxy.resetForm("returnFormRef");
   returnFormVisible.value = false;
   currentReturnRow.value = null;
-};
-
-// 鏌ョ湅浣跨敤璁板綍
-const viewUsageRecords = (row) => {
-  currentVehicleId.value = row.id;
-  usageRecordsPage.current = 1;
-  getUsageRecords();
-  usageRecordsVisible.value = true;
-};
-
-// 鑾峰彇浣跨敤璁板綍
-const getUsageRecords = () => {
-  usageRecordsLoading.value = true;
-  getVehicleUsageRecords(usageRecordsPage, { vehicleId: currentVehicleId.value })
-    .then((res) => {
-      usageRecordsLoading.value = false;
-      usageRecordsData.value = res.records || res.data || [];
-      usageRecordsTotal.value = res.total || 0;
-    })
-    .catch(() => {
-      usageRecordsLoading.value = false;
-    });
-};
-
-// 浣跨敤璁板綍鍒嗛〉
-const usageRecordsPaginationChange = (obj) => {
-  usageRecordsPage.current = obj.page;
-  usageRecordsPage.size = obj.limit;
-  getUsageRecords();
-};
-
-// 鍏抽棴浣跨敤璁板綍寮规
-const closeUsageRecords = () => {
-  usageRecordsVisible.value = false;
-  usageRecordsData.value = [];
-  currentVehicleId.value = null;
 };
 
 // 瀵煎嚭
diff --git a/src/views/inventoryManagement/dispatchLog/index.vue b/src/views/inventoryManagement/dispatchLog/index.vue
index 12e6fcf..f41fe86 100644
--- a/src/views/inventoryManagement/dispatchLog/index.vue
+++ b/src/views/inventoryManagement/dispatchLog/index.vue
@@ -128,67 +128,6 @@
 					/>
 				</div>
 			</el-tab-pane>
-
-      <el-tab-pane label="鐢熶骇鍑哄簱" name="semiProduct">
-        <div class="search_form">
-          <div>
-            <span class="search_title ml10">鍑哄簱鏃ユ湡锛�</span>
-            <el-date-picker
-                v-model="searchForm.timeStr"
-                type="date"
-                placeholder="璇烽�夋嫨鏃ユ湡"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                clearable
-                @change="handleQuery"
-            />
-            <span class="search_title ml10">浜у搧澶х被锛�</span>
-            <el-input
-                v-model="searchForm.productCategory"
-                style="width: 240px"
-                placeholder="璇疯緭鍏�"
-                clearable
-            />
-            <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
-          </div>
-          <div>
-            <el-button @click="handleOut">瀵煎嚭</el-button>
-            <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
-            <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
-          </div>
-        </div>
-        <div class="table_list">
-          <el-table
-              :data="tableData"
-              border
-              v-loading="tableLoading"
-              @selection-change="handleSelectionChange"
-              :expand-row-keys="expandedRowKeys"
-              :row-key="(row) => row.id"
-              show-summary
-              style="width: 100%"
-              :summary-method="summarizeMainTable"
-              height="calc(100vh - 18.5em)"
-          >
-            <el-table-column align="center" type="selection" width="55" />
-            <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-            <el-table-column label="鍑哄簱鏃ユ湡" prop="createTime" width="220" show-overflow-tooltip />
-            <el-table-column label="浜у搧澶х被" prop="productCategory" show-overflow-tooltip />
-            <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" show-overflow-tooltip />
-            <el-table-column label="鍗曚綅" prop="unit" width="100" show-overflow-tooltip />
-            <el-table-column label="鍑哄簱鏁伴噺" prop="inboundNum" width="220" show-overflow-tooltip />
-            <el-table-column label="鍑哄簱浜�" prop="createBy" width="220" show-overflow-tooltip />
-          </el-table>
-          <pagination
-              v-show="total > 0"
-              :total="total"
-              layout="total, sizes, prev, pager, next, jumper"
-              :page="page.current"
-              :limit="page.size"
-              @pagination="paginationSemiProductChange"
-          />
-        </div>
-      </el-tab-pane>
 		</el-tabs>
 
 		<!-- 鎵撳嵃棰勮寮圭獥 -->
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
index 6f82adc..c221342 100644
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ b/src/views/inventoryManagement/issueManagement/index.vue
@@ -152,76 +152,6 @@
                       @pagination="paginationChange" />
         </div>
       </el-tab-pane>
-      <el-tab-pane label="鐢熶骇鍑哄簱"
-                   name="product">
-        <div class="search_form">
-          <div>
-            <span class="search_title ml10">浜у搧澶х被锛�</span>
-            <el-input v-model="searchForm.productCategory"
-                      style="width: 240px"
-                      placeholder="璇疯緭鍏�"
-                      clearable />
-            <el-button type="primary"
-                       @click="handleQuery"
-                       style="margin-left: 10px">鎼滅储</el-button>
-          </div>
-          <div>
-            <el-button @click="handleOut">瀵煎嚭</el-button>
-          </div>
-        </div>
-        <div class="table_list">
-          <el-table :data="tableData"
-                    border
-                    v-loading="tableLoading"
-                    @selection-change="handleSelectionChange"
-                    :expand-row-keys="expandedRowKeys"
-                    :row-key="row => row.id"
-                    show-summary
-                    style="width: 100%"
-                    :summary-method="summarizeMainTable"
-                    height="calc(100vh - 18.5em)">
-            <el-table-column align="center"
-                             type="selection"
-                             width="55" />
-            <el-table-column align="center"
-                             label="搴忓彿"
-                             type="index"
-                             width="60" />
-            <el-table-column label="浜у搧澶х被"
-                             prop="productCategory"
-                             show-overflow-tooltip />
-            <el-table-column label="瑙勬牸鍨嬪彿"
-                             prop="specificationModel"
-                             show-overflow-tooltip />
-            <el-table-column label="鍗曚綅"
-                             prop="unit"
-                             width="70"
-                             show-overflow-tooltip />
-            <el-table-column label="鍓╀綑搴撳瓨"
-                             prop="inboundNum0"
-                             width="90"
-                             show-overflow-tooltip />
-            <el-table-column fixed="right"
-                             label="鎿嶄綔"
-                             min-width="60"
-                             align="center">
-              <template #default="scope">
-                <el-button link
-                           :disabled="scope.row.inboundNum0 <= 0"
-                           type="primary"
-                           size="small"
-                           @click="openForm(scope.row);">棰嗙敤</el-button>
-              </template>
-            </el-table-column>
-          </el-table>
-          <pagination v-show="total > 0"
-                      :total="total"
-                      layout="total, sizes, prev, pager, next, jumper"
-                      :page="page.current"
-                      :limit="page.size"
-                      @pagination="paginationChange" />
-        </div>
-      </el-tab-pane>
     </el-tabs>
     <el-dialog v-model="dialogFormVisible"
                :title="getDialogTitle()"
diff --git a/src/views/inventoryManagement/receiptManagement/index.vue b/src/views/inventoryManagement/receiptManagement/index.vue
index 9aebae4..3258d76 100644
--- a/src/views/inventoryManagement/receiptManagement/index.vue
+++ b/src/views/inventoryManagement/receiptManagement/index.vue
@@ -206,88 +206,6 @@
                       @pagination="paginationChange"/>
         </div>
       </el-tab-pane>
-      <el-tab-pane label="鐢熶骇鍏ュ簱"
-                   name="product">
-        <div class="search_form">
-          <div>
-            <span class="search_title ml10">鍏ュ簱鏃ユ湡锛�</span>
-            <el-date-picker v-model="searchForm.timeStr"
-                            type="date"
-                            placeholder="璇烽�夋嫨鏃ユ湡"
-                            value-format="YYYY-MM-DD"
-                            format="YYYY-MM-DD"
-                            clearable
-                            @change="handleQuery"/>
-            <span class="search_title ml10">浜у搧澶х被锛�</span>
-            <el-input v-model="searchForm.productCategory"
-                      style="width: 240px"
-                      placeholder="璇疯緭鍏�"
-                      clearable/>
-            <el-button type="primary"
-                       @click="handleQuery"
-                       style="margin-left: 10px">鎼滅储
-            </el-button>
-          </div>
-          <div>
-            <el-button type="primary"
-                       @click="openForm('add', 'purchase')">鏂板鍏ュ簱
-            </el-button>
-            <el-button @click="handleOut">瀵煎嚭</el-button>
-            <el-button type="danger"
-                       plain
-                       @click="handleDelete">鍒犻櫎
-            </el-button>
-          </div>
-        </div>
-        <div class="table_list">
-          <el-table :data="tableData"
-                    border
-                    v-loading="tableLoading"
-                    @selection-change="handleSelectionChange"
-                    :expand-row-keys="expandedRowKeys"
-                    :row-key="row => row.id"
-                    show-summary
-                    style="width: 100%"
-                    :summary-method="summarizeMainTable"
-                    height="calc(100vh - 18.5em)">
-            <el-table-column align="center"
-                             type="selection"
-                             width="55"/>
-            <el-table-column align="center"
-                             label="搴忓彿"
-                             type="index"
-                             width="60"/>
-            <el-table-column label="鍏ュ簱鏃堕棿"
-                             prop="createTime"
-                             width="100"
-                             show-overflow-tooltip/>
-            <el-table-column label="浜у搧澶х被"
-                             prop="productCategory"
-                             show-overflow-tooltip/>
-            <el-table-column label="瑙勬牸鍨嬪彿"
-                             prop="specificationModel"
-                             show-overflow-tooltip/>
-            <el-table-column label="鍗曚綅"
-                             prop="unit"
-                             width="220"
-                             show-overflow-tooltip/>
-            <el-table-column label="鍏ュ簱鏁伴噺"
-                             prop="inboundNum"
-                             width="220"
-                             show-overflow-tooltip/>
-            <el-table-column label="鍏ュ簱浜�"
-                             prop="createBy"
-                             width="220"
-                             show-overflow-tooltip/>
-          </el-table>
-          <pagination v-show="total > 0"
-                      :total="total"
-                      layout="total, sizes, prev, pager, next, jumper"
-                      :page="page.current"
-                      :limit="page.size"
-                      @pagination="pageProductChange"/>
-        </div>
-      </el-tab-pane>
     </el-tabs>
     <form-dia ref="formDia"
               @close="handleQuery"
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 637d528..a1bed58 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -426,6 +426,21 @@
 			<el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules" ref="deliveryFormRef">
 				<el-row :gutter="30">
 					<el-col :span="24">
+						<el-form-item label="鍙戣揣绫诲瀷锛�" prop="shippingType">
+							<el-select
+								v-model="deliveryForm.shippingType"
+								placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
+								style="width: 100%"
+								@change="handleShippingTypeChange"
+							>
+								<el-option label="璐ц溅" value="truck" />
+								<el-option label="蹇��" value="express" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="24">
 						<el-form-item label="鍙戣揣鏃ユ湡锛�" prop="shippingDate">
 							<el-date-picker
 								style="width: 100%"
@@ -440,11 +455,20 @@
 					</el-col>
 				</el-row>
 				<el-row :gutter="30">
-					<el-col :span="24">
+					<el-col :span="24" v-if="deliveryForm.shippingType === 'truck'">
 						<el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="shippingCarNumber">
 							<el-input
 								v-model="deliveryForm.shippingCarNumber"
 								placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="24" v-else>
+						<el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
+							<el-input
+								v-model="deliveryForm.expressCompany"
+								placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
 								clearable
 							/>
 						</el-form-item>
@@ -597,15 +621,23 @@
 const currentDeliveryRow = ref(null);
 const deliveryFormData = reactive({
   deliveryForm: {
+    shippingType: "truck", // truck: 璐ц溅, express: 蹇��
     shippingDate: "",
     shippingCarNumber: "",
+    expressCompany: "",
   },
   deliveryRules: {
+    shippingType: [
+      { required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }
+    ],
     shippingDate: [
       { required: true, message: "璇烽�夋嫨鍙戣揣鏃ユ湡", trigger: "change" }
     ],
     shippingCarNumber: [
-      { required: true, message: "璇疯緭鍏ュ彂璐ц溅鐗屽彿", trigger: "blur" }
+      { validator: (_, value, callback) => validateShippingCarNumber(value, callback), trigger: "blur" }
+    ],
+    expressCompany: [
+      { validator: (_, value, callback) => validateExpressCompany(value, callback), trigger: "blur" }
     ],
   },
 });
@@ -1413,6 +1445,20 @@
   return total.toFixed(2);
 };
 
+// 鍙戣揣绫诲瀷鏍¢獙锛氳揣杞︽椂瑕佹眰杞︾墝锛屽揩閫掓椂瑕佹眰蹇�掑叕鍙�
+const validateShippingCarNumber = (value, callback) => {
+  if (deliveryForm.value.shippingType === "truck") {
+    if (!value) return callback(new Error("璇疯緭鍏ュ彂璐ц溅鐗屽彿"));
+  }
+  callback();
+};
+const validateExpressCompany = (value, callback) => {
+  if (deliveryForm.value.shippingType === "express") {
+    if (!value) return callback(new Error("璇疯緭鍏ュ揩閫掑叕鍙�"));
+  }
+  callback();
+};
+
 const mathNum = () => {
   console.log("productForm.value", productForm.value);
   if (!productForm.value.taxInclusiveUnitPrice) {
@@ -1612,6 +1658,12 @@
   //   ElMessage.error(err.msg);
   // });
 	currentDeliveryRow.value = row;
+  deliveryForm.value = {
+    shippingType: "truck",
+    shippingDate: getCurrentDate(),
+    shippingCarNumber: "",
+    expressCompany: "",
+  };
 	deliveryFormVisible.value = true;
 };
 
@@ -1621,8 +1673,10 @@
     if (valid) {
       addShippingInfo({
         salesLedgerId: currentDeliveryRow.value.id,
+        shippingType: deliveryForm.value.shippingType,
         shippingDate: deliveryForm.value.shippingDate,
-        shippingCarNumber: deliveryForm.value.shippingCarNumber,
+        shippingCarNumber: deliveryForm.value.shippingType === "truck" ? deliveryForm.value.shippingCarNumber : "",
+        expressCompany: deliveryForm.value.shippingType === "express" ? deliveryForm.value.expressCompany : "",
       })
         .then(() => {
           proxy.$modal.msgSuccess("鍙戣揣鎴愬姛");
@@ -1643,6 +1697,15 @@
   currentDeliveryRow.value = null;
 };
 
+// 鍙戣揣绫诲瀷鍒囨崲鏃舵竻绌哄搴斿瓧娈�
+const handleShippingTypeChange = (val) => {
+  if (val === "truck") {
+    deliveryForm.value.expressCompany = "";
+  } else {
+    deliveryForm.value.shippingCarNumber = "";
+  }
+};
+
 onMounted(() => {
 	getList();
 });

--
Gitblit v1.9.3