From ca1cbb4d2ffb48095d5b2625788efd4e08a5eff8 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 20 一月 2026 14:07:24 +0800
Subject: [PATCH] 湟水峡 1.采购模块不要项目名称 2.加一个有待回款登记的提示 3.回款登记、付款登记改成和销售订单价格关联,并且可以多个一起回款或付款 4.合同管理不要下载合同了,跟合同相关的字段可以去掉了

---
 src/views/index.vue                                                     |   25 
 src/views/personnelManagement/onboarding/components/formDia.vue         |   38 +
 src/views/procurementManagement/procurementInvoiceLedger/index.vue      |    5 
 src/api/collaborativeApproval/vehicleManagement.js                      |   78 ++
 src/views/salesManagement/receiptPayment/index.vue                      |  332 ++++++----
 src/views/personnelManagement/employeeRecord/components/formDia.vue     |   85 +-
 src/views/procurementManagement/invoiceEntry/index.vue                  |   12 
 src/components/PIMTable/PIMTable.vue                                    |    5 
 src/views/procurementManagement/paymentEntry/index.vue                  |  335 +++++-----
 src/views/salesManagement/salesLedger/index.vue                         |    4 
 src/views/personnelManagement/contractManagement/index.vue              |   38 -
 src/views/salesManagement/invoiceRegistration/index.vue                 |    7 
 src/views/personnelManagement/dimission/components/formDia.vue          |   12 
 src/views/procurementManagement/procurementLedger/index.vue             |   29 
 src/views/procurementManagement/invoiceEntry/indexOld.vue               |   15 
 src/views/personnelManagement/contractManagement/components/formDia.vue |    1 
 src/api/viewIndex.js                                                    |    8 
 src/views/collaborativeApproval/vehicleManagement/index.vue             |  662 ++++++++++++++++++++++
 src/views/procurementManagement/invoiceEntry/components/Modal.vue       |   14 
 src/views/salesManagement/receiptPaymentHistory/index.vue               |   11 
 src/views/personnelManagement/onboarding/index.vue                      |    4 
 21 files changed, 1,233 insertions(+), 487 deletions(-)

diff --git a/src/api/collaborativeApproval/vehicleManagement.js b/src/api/collaborativeApproval/vehicleManagement.js
new file mode 100644
index 0000000..452f0fe
--- /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: "/vehicleManagement/getList",
+    method: "get",
+    params: {
+      ...page,
+      ...query
+    },
+  });
+}
+
+// 鏂板杞﹁締
+export function addVehicle(data) {
+  return request({
+    url: "/vehicleManagement/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// 淇敼杞﹁締
+export function updateVehicle(data) {
+  return request({
+    url: "/vehicleManagement/update",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍒犻櫎杞﹁締
+export function delVehicle(query) {
+  return request({
+    url: "/vehicleManagement/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: "/vehicleManagement/useVehicle",
+    method: "post",
+    data: data,
+  });
+}
+
+// 杩樿溅
+export function returnVehicle(data) {
+  return request({
+    url: "/vehicleManagement/returnVehicle",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏌ヨ杞﹁締浣跨敤璁板綍
+export function getVehicleUsageRecords(page, query) {
+  return request({
+    url: "/vehicleManagement/getUsageRecords",
+    method: "get",
+    params: {
+      ...page,
+      ...query
+    },
+  });
+}
diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js
index 2d85171..e3ccb48 100644
--- a/src/api/viewIndex.js
+++ b/src/api/viewIndex.js
@@ -44,4 +44,12 @@
         url: '/sales/ledger/getAmountHalfYear',
         method: 'get'
     })
+}
+
+// 棣栭〉-寰呭洖娆炬彁閱�
+export const overdueReceivable = () => {
+    return request({
+        url: '/home/overdueReceivable',
+        method: 'get'
+    })
 }
\ No newline at end of file
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index 1fa1695..0ad551f 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -204,6 +204,7 @@
     </el-table-column>
   </el-table>
   <pagination
+    v-if="showPagination"
     :total="page.total"
     :layout="page.layout"
     :page="page.current"
@@ -316,6 +317,10 @@
     type: [String, Object],
     default: () => ({ width: "100%" }),
   },
+  showPagination: {
+    type: Boolean,
+    default: true,
+  },
 });
 
 // Data
diff --git a/src/views/collaborativeApproval/vehicleManagement/index.vue b/src/views/collaborativeApproval/vehicleManagement/index.vue
new file mode 100644
index 0000000..6725a39
--- /dev/null
+++ b/src/views/collaborativeApproval/vehicleManagement/index.vue
@@ -0,0 +1,662 @@
+<template>
+  <div class="app-container">
+    <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"
+            @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.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>
+        </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"
+        :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"
+      >
+        <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'"
+            @click="openReturnForm(row)">杩樿溅</el-button>
+          <el-button link type="primary" size="small" @click="viewUsageRecords(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="plateNumber">
+              <el-input v-model="form.plateNumber" 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="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-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.odometer" :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.plateNumber : ''" 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="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-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-select>
+            </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.plateNumber : ''" 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>
+          </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%"
+                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>
+        <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="{ 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 pagination from "@/components/PIMTable/Pagination.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 page = reactive({
+  current: 1,
+  size: 100,
+});
+const total = ref(0);
+
+// 鎼滅储琛ㄥ崟
+const data = reactive({
+  searchForm: {
+    plateNumber: "",
+    color: "",
+    brand: "",
+    status: "",
+  },
+  form: {
+    plateNumber: "",
+    color: "",
+    brand: "",
+    status: "idle",
+    odometer: 0,
+    remark: "",
+  },
+  rules: {
+    plateNumber: [{ required: true, message: "璇疯緭鍏ヨ溅鐗屽彿", trigger: "blur" }],
+    color: [{ required: true, message: "璇疯緭鍏ラ鑹�", trigger: "blur" }],
+    brand: [{ required: true, message: "璇疯緭鍏ュ搧鐗�", trigger: "blur" }],
+    status: [{ 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: {
+    vehicleId: "",
+    destination: "",
+    odometer: 0,
+    travelDistance: 0,
+    userId: "",
+    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" }],
+  },
+});
+const { useForm, useRules } = toRefs(useVehicleFormData);
+
+// 杩樿溅琛ㄥ崟
+const returnFormVisible = ref(false);
+const currentReturnRow = ref(null);
+const returnFormData = reactive({
+  returnForm: {
+    vehicleId: "",
+    returnTime: "",
+    odometer: 0,
+    userId: "",
+    remark: "",
+  },
+  returnRules: {
+    returnTime: [{ required: true, message: "璇烽�夋嫨杩樿溅鏃堕棿", trigger: "change" }],
+    odometer: [{ required: true, message: "璇疯緭鍏ヨ〃鏄鹃噷绋�", trigger: "blur" }],
+    userId: [{ required: true, message: "璇烽�夋嫨浣跨敤浜�", trigger: "change" }],
+  },
+});
+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 currentVehicleId = ref(null);
+
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const operationType = ref("");
+const dialogFormVisible = ref(false);
+const currentId = ref("");
+
+// 琛ㄦ牸鍒楅厤缃�
+const tableColumns = ref([
+  { label: "杞︾墝鍙�", prop: "plateNumber", width: "120" },
+  { label: "棰滆壊", prop: "color", width: "100" },
+  { label: "鍝佺墝", prop: "brand", width: "120" },
+  {
+    label: "浣跨敤鐘舵��",
+    prop: "status",
+    width: "100",
+    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";
+      return "info";
+    },
+  },
+  { label: "褰撳墠浣跨敤浜�", prop: "currentUser", width: "120" },
+  { label: "琛ㄦ樉閲岀▼(km)", prop: "odometer", width: "120" },
+  { label: "鍒涘缓鏃堕棿", prop: "createTime", width: "180" },
+  {
+    label: "鎿嶄綔",
+    dataType: "slot",
+    slot: "operation",
+    align: "center",
+    fixed: "right",
+    width: "250",
+  },
+]);
+
+// 浣跨敤璁板綍琛ㄦ牸鍒楅厤缃�
+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 handleQuery = () => {
+  page.current = 1;
+  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.records || res.data || [];
+      total.value = res.total || 0;
+    })
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
+
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = async (type, row) => {
+  operationType.value = type;
+  form.value = {
+    plateNumber: "",
+    color: "",
+    brand: "",
+    status: "idle",
+    odometer: 0,
+    remark: "",
+  };
+  
+  let userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+
+  if (type !== "add") {
+    currentId.value = row.id;
+    getVehicleById(row.id).then((res) => {
+      form.value = { ...res.data || res };
+    });
+  }
+  dialogFormVisible.value = true;
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs["formRef"].validate((valid) => {
+    if (valid) {
+      if (operationType.value === "add") {
+        addVehicle(form.value).then((res) => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          closeDia();
+          getList();
+        });
+      } else {
+        form.value.id = currentId.value;
+        updateVehicle(form.value).then((res) => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          closeDia();
+          getList();
+        });
+      }
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
+
+// 鎵撳紑鍙戣揣寮规
+const openUseForm = async (row) => {
+  currentUseRow.value = row;
+  useForm.value = {
+    vehicleId: row.id,
+    destination: "",
+    odometer: row.odometer || 0,
+    travelDistance: 0,
+    userId: "",
+    remark: "",
+  };
+  
+  let userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+  
+  useFormVisible.value = true;
+};
+
+// 鎻愪氦浣跨敤杞﹁締琛ㄥ崟
+const submitUseForm = () => {
+  proxy.$refs["useFormRef"].validate((valid) => {
+    if (valid) {
+      useVehicle(useForm.value).then((res) => {
+        proxy.$modal.msgSuccess("浣跨敤杞﹁締鎴愬姛");
+        closeUseDia();
+        getList();
+      });
+    }
+  });
+};
+
+// 鍏抽棴浣跨敤杞﹁締寮规
+const closeUseDia = () => {
+  proxy.resetForm("useFormRef");
+  useFormVisible.value = false;
+  currentUseRow.value = null;
+};
+
+// 鎵撳紑杩樿溅寮规
+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: "",
+    remark: "",
+  };
+  
+  let userLists = await userListNoPage();
+  userList.value = userLists.data || [];
+  
+  returnFormVisible.value = true;
+};
+
+// 鎻愪氦杩樿溅琛ㄥ崟
+const submitReturnForm = () => {
+  proxy.$refs["returnFormRef"].validate((valid) => {
+    if (valid) {
+      returnVehicle(returnForm.value).then((res) => {
+        proxy.$modal.msgSuccess("杩樿溅鎴愬姛");
+        closeReturnDia();
+        getList();
+      });
+    }
+  });
+};
+
+// 鍏抽棴杩樿溅寮规
+const closeReturnDia = () => {
+  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;
+};
+
+// 瀵煎嚭
+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((res) => {
+        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>
diff --git a/src/views/index.vue b/src/views/index.vue
index 615b4bb..66e1a45 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -161,12 +161,14 @@
 import Echarts from "@/components/Echarts/echarts.vue";
 import * as echarts from 'echarts';
 import useUserStore from "@/store/modules/user.js";
+import { ElNotification } from 'element-plus'
 import {
 	analysisCustomerContractAmounts, getAmountHalfYear,
 	getBusiness,
 	homeTodos,
 	qualityStatistics,
-	statisticsReceivablePayable
+	statisticsReceivablePayable,
+	overdueReceivable
 } from "@/api/viewIndex.js";
 
 const userStore = useUserStore()
@@ -347,10 +349,31 @@
 	getBusinessData()
 	analysisCustomer()
 	todoInfoS()
+	notifyOverdueReceivable()
 	statisticsReceivable()
 	qualityStatisticsInfo()
 	getAmountHalfYearNum()
 })
+
+// 寰呭洖娆炬彁閱�
+const notifyOverdueReceivable = async () => {
+	try {
+		const res = await overdueReceivable()
+		const data = res.data
+
+		if (data > 0) {
+			ElNotification({
+				title: '寰呭洖娆炬彁閱�',
+				message: `褰撳墠鏈�${data}鏉″緟鍥炴`,
+				type: 'warning',
+				duration: 6000,
+			})
+		}
+	} catch (e) {
+		// 涓嶅奖鍝嶉椤垫甯稿姞杞�
+		console.error('overdueReceivable error:', e)
+	}
+}
 // 鏁版嵁缁熻
 const getBusinessData = () => {
 	getBusiness().then((res) => {
diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
index 3c9674c..a124c1b 100644
--- a/src/views/personnelManagement/contractManagement/components/formDia.vue
+++ b/src/views/personnelManagement/contractManagement/components/formDia.vue
@@ -11,6 +11,7 @@
           :column="tableColumn"
           :tableData="tableData"
           :tableLoading="tableLoading"
+          :showPagination="false"
           height="600"
       ></PIMTable>
       <template #footer>
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
index f691bf3..30aefb9 100644
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ b/src/views/personnelManagement/contractManagement/index.vue
@@ -74,7 +74,7 @@
 import { onMounted, ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
 import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
 import { ElMessageBox } from "element-plus";
-import { staffOnJobListPage, staffOnJobExportCopy } from "@/api/personnelManagement/employeeRecord.js";
+import { staffOnJobListPage } from "@/api/personnelManagement/employeeRecord.js";
 import dayjs from "dayjs";
 import { getToken } from "@/utils/auth.js";
 import FilesDia from "./filesDia.vue";
@@ -183,7 +183,7 @@
     label: "鎿嶄綔",
     align: "center",
     fixed: 'right',
-    width: 180,
+    width: 130,
     operation: [
       {
         name: "璇︽儏",
@@ -197,13 +197,6 @@
         type: "text",
         clickFun: (row) => {
           openFilesFormDia(row);
-        },
-      },
-      {
-        name: "涓嬭浇鍚堝悓",
-        type: "text",
-        clickFun: (row) => {
-          handleDownloadContract(row);
         },
       },
     ],
@@ -283,33 +276,6 @@
     })
     .catch(() => {
       proxy.$modal.msg("宸插彇娑�");
-    });
-};
-// 涓嬭浇鍚堝悓
-const handleDownloadContract = (row) => {
-  const fileName = `${row.staffName || "鍚堝悓"}鍔冲姩鍚堝悓.docx`;
-  proxy.$modal?.loading?.("姝e湪鐢熸垚鍚堝悓锛岃绋嶅��...");
-  staffOnJobExportCopy({ ...row })
-    .then((res) => {
-      proxy.$modal?.closeLoading?.();
-      if (res?.code === 200 && res?.msg) {
-        const javaApi = proxy.javaApi || import.meta.env.VITE_JAVA_API || "";
-        const downloadPath = res.msg.startsWith("/") ? res.msg : `/${res.msg}`;
-        const downloadUrl = `${javaApi}${downloadPath}`;
-        const link = document.createElement("a");
-        link.href = downloadUrl;
-        link.download = fileName;
-        link.target = "_blank";
-        document.body.appendChild(link);
-        link.click();
-        document.body.removeChild(link);
-      } else {
-        proxy.$modal.msgError(res?.msg || "鍚堝悓鐢熸垚澶辫触");
-      }
-    })
-    .catch(() => {
-      proxy.$modal?.closeLoading?.();
-      proxy.$modal.msgError("鍚堝悓鐢熸垚澶辫触锛岃绋嶅悗閲嶈瘯");
     });
 };
 const upload = reactive({
diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue
index d77eb90..01bd35f 100644
--- a/src/views/personnelManagement/dimission/components/formDia.vue
+++ b/src/views/personnelManagement/dimission/components/formDia.vue
@@ -13,7 +13,7 @@
           <el-col :span="12">
             <div class="info-item">
               <span class="info-label">濮撳悕锛�</span>
-              <el-select v-model="form.staffName" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">
+              <el-select v-model="form.staffName" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect" filterable>
                 <el-option
                   v-for="item in personList"
                   :key="item.id"
@@ -112,7 +112,7 @@
           <el-col :span="12">
             <div class="info-item">
               <span class="info-label">鍚堝悓缁撴潫鏃ユ湡锛�</span>
-              <span class="info-value">{{ form.contractEndTime || '-' }}</span>
+              <span class="info-value">{{ form.contractExpireTime || '-' }}</span>
             </div>
           </el-col>
         </el-row>
@@ -183,7 +183,7 @@
     emergencyContactPhone: "",
     contractTerm: 0,
     contractStartTime: "",
-    contractEndTime: "",
+    contractExpireTime: "",
     dimissionDate: "",
     dimissionReason: "",
     staffState: "",
@@ -245,7 +245,7 @@
     emergencyContactPhone: "",
     contractTerm: 0,
     contractStartTime: "",
-    contractEndTime: "",
+    contractExpireTime: "",
     dimissionDate: "",
     dimissionReason: "",
     staffState: "",
@@ -286,7 +286,7 @@
       emergencyContactPhone,
       contractTerm,
       contractStartTime,
-      contractEndTime,
+      contractExpireTime,
       staffName
     } = obj
     // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
@@ -305,7 +305,7 @@
       emergencyContactPhone,
       contractTerm,
       contractStartTime,
-      contractEndTime,
+      contractExpireTime,
       staffName
     }
   }
diff --git a/src/views/personnelManagement/employeeRecord/components/formDia.vue b/src/views/personnelManagement/employeeRecord/components/formDia.vue
index 6f66f9b..c20877d 100644
--- a/src/views/personnelManagement/employeeRecord/components/formDia.vue
+++ b/src/views/personnelManagement/employeeRecord/components/formDia.vue
@@ -6,52 +6,53 @@
         width="70%"
         @close="closeDia"
     >
+      <!-- 鎸夌収鍏ヨ亴鏂板寮圭獥瀛楁灞曠ず鍩虹淇℃伅鍜屽悎鍚屼俊鎭� -->
       <el-descriptions class="detail-descriptions" :column="2" border size="small">
-        <el-descriptions-item label="鍛樺伐缂栧彿">{{ formData.staffNo || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="濮撳悕">{{ formData.staffName || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鎬у埆">{{ formData.sex || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="骞撮緞">{{ formData.age || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="韬唤璇佸彿">{{ formData.identityCard || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鎴风睄浣忓潃" :span="2">{{ formData.nativePlace || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鐜颁綇鍧�" :span="2">{{ formData.adress || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="宀椾綅">{{ formData.postJob || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="绗竴瀛﹀巻">{{ formData.firstStudy || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="涓撲笟">{{ formData.profession || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鑱旂郴鐢佃瘽">{{ formData.phone || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="绱ф�ヨ仈绯讳汉">{{ formData.emergencyContact || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="绱ф�ヨ仈绯讳汉鐢佃瘽">{{ formData.emergencyContactPhone || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鍚堝悓绛捐鏃ユ湡">{{ formData.signDate || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="鍔冲姩鍚堝悓鏈熼檺閫夋嫨">
-          <span v-if="formData.dateSelect === 'A'">A銆佹湁鍥哄畾鏈熼檺</span>
-          <span v-else-if="formData.dateSelect === 'B'">B銆佹棤鍥哄畾鏈熼檺</span>
-          <span v-else-if="formData.dateSelect === 'C'">C銆佷互瀹屾垚涓�瀹氬伐浣滀换鍔′负鏈熼檺</span>
-          <span v-else>-</span>
+        <el-descriptions-item label="鍛樺伐缂栧彿">
+          {{ formData.staffNo || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="鍚堝悓骞撮檺">{{ formattedContractTerm }}</el-descriptions-item>
-        <el-descriptions-item label="璇曠敤鏈熷紑濮嬫棩鏈�" v-if="formData.dateSelect === 'A' || formData.dateSelect === 'B'">
-          {{ formData.trialStartDate || '-' }}
+        <el-descriptions-item label="濮撳悕">
+          {{ formData.staffName || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="璇曠敤鏈熺粨鏉熸棩鏈�" v-if="formData.dateSelect === 'A' || formData.dateSelect === 'B'">
-          {{ formData.trialEndDate || '-' }}
+        <el-descriptions-item label="鎬у埆">
+          {{ formData.sex || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="璇曠敤鏈熷伐璧�" v-if="formData.dateSelect === 'A' || formData.dateSelect === 'B'">
-          {{ formData.proSalary ? formData.proSalary.toFixed(2) : '-' }}
+        <el-descriptions-item label="骞撮緞">
+          {{ formData.age || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="鍚堝悓寮�濮嬫棩鏈�">{{ calculatedContractStart }}</el-descriptions-item>
-        <el-descriptions-item label="鍚堝悓缁撴潫鏃ユ湡">{{ formData.contractEndTime || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="宸ヨ祫鎶ラ叕" :span="2">
-          <span v-if="formData.salarySelect === 'A'">
-            A銆佷箼鏂圭殑宸ヨ祫鎶ラ叕鎸夌収鐢叉柟渚濇硶鍒跺畾鐨勮绔犲埗搴︿腑鐨勫唴閮ㄥ伐璧勫垎閰嶅姙娉曠‘瀹氾紝鏍规嵁涔欐柟鐨勫伐浣滃矖浣嶇‘瀹氬叾姣忔湀宸ヨ祫銆�
-          </span>
-          <span v-else-if="formData.salarySelect === 'B'">
-            B銆佺敳鏂瑰涔欐柟瀹炶鍩烘湰宸ヨ祫鍜岀哗鏁堝伐璧勭浉缁撳悎鐨勫唴閮ㄥ伐璧勫垎閰嶅姙娉曪紝涔欐柟鐨勬敹鍏ュ寘鎷熀鏈伐璧勩�佽椁愩�佷氦閫氥�佺敓娲讳綇瀹跨瓑鍚勯」琛ュ姪锛屽鏈夊彉鍔ㄦ牴鎹唴閮ㄥ伐璧勫垎閰嶅姙娉曡皟鏁村叾宸ヨ祫锛涚哗鏁堝伐璧勬牴鎹箼鏂圭殑宸ヤ綔涓氱哗銆佸姵鍔ㄦ垚鏋滃拰瀹為檯璐$尞鎸夌収鍐呴儴鍒嗛厤鍔炴硶鑰冩牳纭畾銆�
-          </span>
-          <span v-else-if="formData.salarySelect === 'C'">
-            C銆佺敳鏂瑰疄琛岃浠跺伐璧勫埗锛屼互鐢叉柟鎺ュ埌璁㈠崟鍙婂叕鍙哥敓浜ц鍒掞紝鎸夌収瀹氶鍜岃浠跺崟浠凤紝鏍规嵁涔欐柟瀹屾垚鐨勪笟缁╋紝鎸夋椂瓒抽鏀粯涔欐柟鐨勫伐璧勬姤閰��
-          </span>
-          <span v-else>-</span>
+        <el-descriptions-item label="鎴风睄浣忓潃" :span="2">
+          {{ formData.nativePlace || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="绂忓埄寰呴亣" :span="2">{{ formData.remark || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鐜颁綇鍧�" :span="2">
+          {{ formData.adress || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="宀椾綅">
+          {{ formData.postJob || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="绗竴瀛﹀巻">
+          {{ formData.firstStudy || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="涓撲笟">
+          {{ formData.profession || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鑱旂郴鐢佃瘽">
+          {{ formData.phone || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="绱ф�ヨ仈绯讳汉">
+          {{ formData.emergencyContact || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="绱ф�ヨ仈绯讳汉鐢佃瘽">
+          {{ formData.emergencyContactPhone || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鍚堝悓寮�濮嬫棩鏈�">
+          {{ formData.contractStartTime || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鍚堝悓缁撴潫鏃ユ湡">
+          {{ formData.contractExpireTime || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鍚堝悓骞撮檺">
+          {{ formattedContractTerm }}
+        </el-descriptions-item>
       </el-descriptions>
       <template #footer>
         <div class="dialog-footer">
@@ -90,7 +91,7 @@
   signDate: "",
   salarySelect: "",
   contractStartTime: "",
-  contractEndTime: "",
+  contractExpireTime: "",
   contractTerm: null,
   remark: "",
 });
@@ -108,7 +109,7 @@
 });
 
 const calculatedContractStart = computed(() => {
-  const endDate = formData.contractEndTime;
+  const endDate = formData.contractExpireTime;
   const termValue = formData.contractTerm;
   const numberValue = Number(termValue);
   if (!endDate || isNaN(numberValue)) {
diff --git a/src/views/personnelManagement/onboarding/components/formDia.vue b/src/views/personnelManagement/onboarding/components/formDia.vue
index 299ff99..d775e6b 100644
--- a/src/views/personnelManagement/onboarding/components/formDia.vue
+++ b/src/views/personnelManagement/onboarding/components/formDia.vue
@@ -83,11 +83,11 @@
               <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
-<!--          <el-col :span="12">-->
-<!--            <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTermcontractTerm">-->
-<!--              <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/>-->
-<!--            </el-form-item>-->
-<!--          </el-col>-->
+         <el-col :span="12">
+           <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
+             <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/>
+           </el-form-item>
+         </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -100,6 +100,7 @@
                   format="YYYY-MM-DD"
                   clearable
                   style="width: 100%"
+                  @change="calculateContractTerm"
               />
             </el-form-item>
           </el-col>
@@ -113,6 +114,7 @@
                   format="YYYY-MM-DD"
                   clearable
                   style="width: 100%"
+                  @change="calculateContractTerm"
               />
             </el-form-item>
           </el-col>
@@ -129,7 +131,7 @@
 </template>
 
 <script setup>
-import {ref} from "vue";
+import {ref, reactive, toRefs, getCurrentInstance} from "vue";
 import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
@@ -183,8 +185,28 @@
     getStaffJoinInfo(row.id).then(res => {
       form.value = {...res.data}
       // 缂栬緫鏃朵篃璁$畻涓�娆″悎鍚屽勾闄�
-      // calculateContractTerm();
+      calculateContractTerm();
     })
+  } else {
+    // 鏂板鏃堕噸缃〃鍗�
+    form.value = {
+      staffNo: "",
+      staffName: "",
+      sex: "",
+      nativePlace: "",
+      postJob: "",
+      adress: "",
+      firstStudy: "",
+      profession: "",
+      age: 0,
+      phone: "",
+      emergencyContact: "",
+      emergencyContactPhone: "",
+      contractTerm: 0,
+      contractStartTime: "",
+      contractEndTime: "",
+      staffState: "",
+    };
   }
 }
 // 鎻愪氦浜у搧琛ㄥ崟
@@ -212,7 +234,7 @@
     const startDate = new Date(form.value.contractStartTime);
     const endDate = new Date(form.value.contractEndTime);
     
-    if (endDate > startDate) {
+    if (endDate >= startDate) {
       // 璁$畻骞翠唤宸�
       const yearDiff = endDate.getFullYear() - startDate.getFullYear();
       const monthDiff = endDate.getMonth() - startDate.getMonth();
diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue
index a0c168e..9151a6c 100644
--- a/src/views/personnelManagement/onboarding/index.vue
+++ b/src/views/personnelManagement/onboarding/index.vue
@@ -57,8 +57,8 @@
 <script setup>
 import { Search } from "@element-plus/icons-vue";
 import {onMounted, ref} from "vue";
-// import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
-import FormDia from "@/views/personnelManagement/onboarding/components/formDiaXJHT.vue"; // 鏂扮枂椋熷搧鍏徃鐢ㄧ殑琛ㄥ崟
+import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
+// import FormDia from "@/views/personnelManagement/onboarding/components/formDiaXJHT.vue"; // 鏂扮枂椋熷搧鍏徃鐢ㄧ殑琛ㄥ崟
 import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
 import {ElMessageBox} from "element-plus";
 import dayjs from "dayjs";
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index 76e753a..29bb812 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -24,16 +24,6 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-            <el-input
-              v-model="form.projectName"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
           <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
             <el-input
               v-model="form.invoiceNumber"
@@ -197,7 +187,6 @@
   purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
   salesContractNo: undefined, // 閿�鍞悎鍚屽彿
   supplierName: undefined, // 渚涘簲鍟嗗悕绉�
-  projectName: undefined, // 椤圭洰鍚嶇О
   invoiceNumber: undefined, // 鍙戠エ鍙�
   invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
   issUerId: userStore.id, // 褰曞叆浜�
@@ -370,7 +359,6 @@
               id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
               purchaseLedgerNo: contract.purchaseContractNumber, // 娣诲姞閲囪喘鍚堝悓鍙�
               supplierName: contract.supplierName, // 娣诲姞渚涘簲鍟嗗悕绉�
-              projectName: contract.projectName // 娣诲姞椤圭洰鍚嶇О
             });
           });
         }
@@ -383,7 +371,6 @@
       form.entryDate = dayjs().format("YYYY-MM-DD");
       form.enterDate = dayjs().format("YYYY-MM-DD");
       form.salesContractNo = results[0].data.salesContractNo;
-      form.projectName = results[0].data.projectName;
       form.supplierName = results[0].data.supplierName;
       // 淇濈暀褰曞叆浜轰俊鎭�
       form.issUerId = userStore.id;
@@ -530,7 +517,6 @@
           purchaseContractNumber: contract.purchaseContractNumber, // 浣跨敤瀹為檯鐨勯噰璐悎鍚屽彿
           salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
           supplierName: contract.supplierName, // 浣跨敤瀹為檯鐨勪緵搴斿晢鍚嶇О
-          projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
           
           // 浜у搧鏁版嵁
           productData: proxy.HaveJson(contractProductData),
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 3649d7e..ccbd9f0 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -28,13 +28,6 @@
               clearable
           />
         </el-form-item>
-        <el-form-item label="椤圭洰鍚嶇О">
-          <el-input
-              v-model="filters.projectName"
-              placeholder="璇疯緭鍏ラ」鐩悕绉�"
-              clearable
-          />
-        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
           <el-button @click="resetFilters"> 閲嶇疆 </el-button>
@@ -142,11 +135,6 @@
       label: "渚涘簲鍟嗗悕绉�",
       prop: "supplierName",
       width:300
-    },
-    {
-      label: "椤圭洰鍚嶇О",
-      prop: "projectName",
-      width:400
     },
     {
       label: "褰曞叆浜�",
diff --git a/src/views/procurementManagement/invoiceEntry/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue
index 1b4c6b9..3f841dd 100644
--- a/src/views/procurementManagement/invoiceEntry/indexOld.vue
+++ b/src/views/procurementManagement/invoiceEntry/indexOld.vue
@@ -105,11 +105,6 @@
           show-overflow-tooltip
         />
         <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          show-overflow-tooltip
-        />
-        <el-table-column
           label="鍚堝悓閲戦(鍏�)"
           prop="contractAmount"
           show-overflow-tooltip
@@ -189,16 +184,6 @@
             <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
               <el-input
                 v-model="form.supplierName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
                 placeholder="鑷姩濉厖"
                 clearable
                 disabled
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 4da6ac9..511ee2b 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -28,7 +28,7 @@
           <el-col :span="4">
             <el-form-item style="float: right; margin-right: unset">
               <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-              <el-button type="primary" @click="openForm('add')">
+              <el-button type="primary" @click="openForm()">
                 鏂板浠樻
               </el-button>
 <!--              <el-button type="danger" plain @click="handleDelete">-->
@@ -132,132 +132,68 @@
     </div>
     <el-dialog
       v-model="dialogFormVisible"
-      :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'"
-      width="60%"
+      title="鏂板浠樻鐧昏"
+      width="80%"
       @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="purchaseContractNumber">
-              <el-input
-                v-model="form.purchaseContractNumber"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input
-                v-model="form.supplierName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-              <el-input
-                v-model="form.invoiceNumber"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-              <el-input
-                v-model="form.invoiceAmount"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏈浠樻閲戦锛�" prop="currentPaymentAmount">
-              <el-input-number :step="0.01" :min="0" style="width: 100%"
-															 :precision="2"
-                v-model="form.currentPaymentAmount"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡锛�" prop="paymentMethod">
-              <el-select
-                v-model="form.paymentMethod"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option label="鐢垫眹" value="鐢垫眹" />
-                <el-option label="鎵垮厬" value="鎵垮厬" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="浠樻鏃ユ湡锛�" prop="paymentDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.paymentDate"
-								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="鐧昏浜猴細" prop="registrant">
-							<el-input
-								v-model="form.registrant"
-								placeholder="璇疯緭鍏�"
-								clearable
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-          <el-col :span="12">
-            <el-form-item label="鐧昏鏃ユ湡锛�" prop="registrationtDate">
-              <el-input
-                v-model="form.registrationtDate"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+      <el-table :data="dialogTableData" border style="width: 100%" max-height="500px">
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip width="200" />
+        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip width="200" />
+        <el-table-column label="鍙戠エ鍙�" prop="invoiceNumber" show-overflow-tooltip width="180" />
+        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceAmount" width="150">
+          <template #default="{ row }">
+            {{ row.invoiceAmount ? parseFloat(row.invoiceAmount).toFixed(2) : "0.00" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="寰呬粯娆鹃噾棰�(鍏�)" prop="unPaymentAmountTotal" width="150">
+          <template #default="{ row }">
+            <el-text type="danger">
+              {{ row.unPaymentAmountTotal ? parseFloat(row.unPaymentAmountTotal).toFixed(2) : "0.00" }}
+            </el-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏈浠樻閲戦(鍏�)" width="180">
+          <template #default="scope">
+            <el-input-number
+              :step="0.01"
+              :min="0"
+              :max="Number(scope.row.unPaymentAmountTotal || 0)"
+              style="width: 100%"
+              :precision="2"
+              v-model="scope.row.currentPaymentAmount"
+              placeholder="璇疯緭鍏�"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="浠樻鏂瑰紡" width="150">
+          <template #default="scope">
+            <el-select v-model="scope.row.paymentMethod" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+              <el-option label="鐢垫眹" value="鐢垫眹" />
+              <el-option label="鎵垮厬" value="鎵垮厬" />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="浠樻鏃ユ湡" width="180">
+          <template #default="scope">
+            <el-date-picker
+              style="width: 100%"
+              v-model="scope.row.paymentDate"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              type="date"
+              placeholder="璇烽�夋嫨"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏浜�" width="120">
+          <template #default="scope">
+            <el-input v-model="scope.row.registrant" placeholder="鑷姩濉厖" disabled />
+          </template>
+        </el-table-column>
+      </el-table>
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" @click="submitForm">纭</el-button>
@@ -274,11 +210,7 @@
 import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user.js";
 import {
-  byPurchaseId,
   paymentRegistrationAdd,
-  paymentRegistrationDel,
-  paymentRegistrationEdit,
-  getTicketNo,
 } from "@/api/procurementManagement/paymentEntry.js";
 import {
 	delPaymentRegistration,
@@ -365,9 +297,9 @@
 	total: 0,
 });
 
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
+// 寮规鏁版嵁
 const dialogFormVisible = ref(false);
+const dialogTableData = ref([]);
 const data = reactive({
   searchForm: {
     supplierNameOrContractNo: "",
@@ -491,7 +423,8 @@
 		currentPaymentAmount: row.currentPaymentAmount,
 		paymentMethod: row.paymentMethod,
 	};
-	updatePaymentRegistration(updateData).then((res) => {
+	// 瀛愯〃缂栬緫淇濆瓨鎸夋暟缁勬彁浜わ紙涓庢壒閲忕櫥璁颁繚鎸佷竴鑷达級
+	updatePaymentRegistration([updateData]).then(() => {
 		row.editType = !row.editType;
 		getList();
 		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
@@ -502,57 +435,117 @@
   selectedRows.value = selection;
 };
 // 鎵撳紑寮规
-const openForm = (type, row) => {
-  if (selectedRows.value.length !== 1) {
-    proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�");
+const openForm = () => {
+  // 鑷冲皯閫夋嫨涓�鏉℃暟鎹�
+  if (selectedRows.value.length === 0) {
+    proxy.$modal?.msgError ? proxy.$modal.msgError("璇烽�夋嫨鏁版嵁") : proxy.$message.error("璇烽�夋嫨鏁版嵁");
     return;
   }
-	if (selectedRows.value[0].unPaymentAmountTotal == 0) {
-		proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
-		return;
-	}
-  operationType.value = type;
-  form.value = {};
-  form.value = { ...selectedRows.value[0] };
-  form.value.ticketRegistrationId = selectedRows.value[0].id;
-  form.value.id = null;
-  // 鏌ヨ閲囪喘鍚堝悓鍙�
-  form.value.registrationtDate = getCurrentDate();
-  form.value.paymentDate = getCurrentDate();
-  form.value.registrant = userStore.name;
+
+  // 鏍¢獙鏄惁涓虹浉鍚屼緵搴斿晢鍚嶇О
+  const firstSupplierName = selectedRows.value[0].supplierName;
+  const isSameSupplier = selectedRows.value.every(
+    (item) => item.supplierName === firstSupplierName
+  );
+  if (!isSameSupplier) {
+    proxy.$modal?.msgError
+      ? proxy.$modal.msgError("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鏁版嵁杩涜浠樻鐧昏")
+      : proxy.$message.error("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鏁版嵁杩涜浠樻鐧昏");
+    return;
+  }
+
+  // 杩囨护鍑烘湁寰呬粯娆鹃噾棰濈殑璁板綍
+  const validRows = selectedRows.value.filter(
+    (item) => Number(item.unPaymentAmountTotal) > 0
+  );
+  if (validRows.length === 0) {
+    proxy.$modal?.msgWarning
+      ? proxy.$modal.msgWarning("鎵�閫夋暟鎹潎鏃犻渶鍐嶄粯娆�")
+      : proxy.$message.warning("鎵�閫夋暟鎹潎鏃犻渶鍐嶄粯娆�");
+    return;
+  }
+
+  const today = getCurrentDate();
+  dialogTableData.value = validRows.map((row) => {
+    return {
+      ...row,
+      // 鍚庣鍏宠仈鈥滄潵绁ㄥ彴璐�/鐧昏鍗曗�濈殑瀛楁锛堝師閫昏緫锛歵icketRegistrationId = row.id锛�
+      ticketRegistrationId: row.id,
+      id: null,
+      currentPaymentAmount: row.unPaymentAmountTotal || "",
+      paymentMethod: "",
+      paymentDate: today,
+      registrationtDate: today,
+      registrant: userStore.nickName || userStore.name,
+    };
+  });
+
   dialogFormVisible.value = true;
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      if (operationType.value === "edit") {
-        submitEdit();
-      } else {
-        submitAdd();
-      }
-    }
+  // 鏍¢獙琛ㄦ牸鏁版嵁
+  const invalidRows = dialogTableData.value.filter((row) => {
+    return (
+      !row.currentPaymentAmount ||
+      Number(row.currentPaymentAmount) <= 0 ||
+      !row.paymentMethod ||
+      !row.paymentDate
+    );
   });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
-  paymentRegistrationAdd(form.value).then((res) => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeDia();
-    getList();
+  if (invalidRows.length > 0) {
+    proxy.$modal?.msgError
+      ? proxy.$modal.msgError("璇峰畬鍠勬墍鏈夊繀濉」锛氫粯娆鹃噾棰濄�佷粯娆炬柟寮忋�佷粯娆炬棩鏈�")
+      : proxy.$message.error("璇峰畬鍠勬墍鏈夊繀濉」锛氫粯娆鹃噾棰濄�佷粯娆炬柟寮忋�佷粯娆炬棩鏈�");
+    return;
+  }
+
+  // 鏍¢獙浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�
+  const exceedRows = dialogTableData.value.filter((row) => {
+    return Number(row.currentPaymentAmount) > Number(row.unPaymentAmountTotal);
   });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
-  paymentRegistrationEdit(form.value).then((res) => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeDia();
-    getList();
+  if (exceedRows.length > 0) {
+    proxy.$modal?.msgError
+      ? proxy.$modal.msgError("浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�")
+      : proxy.$message.error("浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�");
+    return;
+  }
+
+  // 缁勮鏁扮粍鎵归噺鎻愪氦锛堝鏋滃悗绔笉鏀寔鏁扮粍锛屼細璧板厹搴曞惊鐜彁浜わ級
+  const submitDataList = dialogTableData.value.map((row) => {
+    return {
+      ticketRegistrationId: row.ticketRegistrationId,
+      purchaseLedgerId: row.purchaseLedgerId,
+      purchaseContractNumber: row.purchaseContractNumber,
+      salesContractNo: row.salesContractNo,
+      supplierName: row.supplierName,
+      invoiceNumber: row.invoiceNumber,
+      invoiceAmount: row.invoiceAmount,
+      taxRate: row.taxRate,
+      currentPaymentAmount: row.currentPaymentAmount,
+      paymentMethod: row.paymentMethod,
+      paymentDate: row.paymentDate,
+      registrant: row.registrant,
+      registrationtDate: row.registrationtDate,
+      id: null,
+    };
   });
+
+  paymentRegistrationAdd(submitDataList)
+    .then(() => {
+      proxy.$modal?.msgSuccess
+        ? proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
+        : proxy.$message.success("鎻愪氦鎴愬姛");
+      closeDia();
+      getList();
+    })
+    .catch((e) => {
+      console.error("鎻愪氦澶辫触:", e);
+    });
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
+  dialogTableData.value = [];
   dialogFormVisible.value = false;
 };
 // 鍒犻櫎
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
index 439837b..330b092 100644
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -162,11 +162,6 @@
       width: 150,
     },
     {
-      label: "椤圭洰鍚嶇О",
-      prop: "projectName",
-      width: 240,
-    },
-    {
       label: "渚涘簲鍟嗗悕绉�",
       prop: "supplierName",
       width: 240,
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index aaab9df..73b56af 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -21,10 +21,6 @@
             <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
                       @change="handleQuery" />
           </el-form-item>
-          <el-form-item label="椤圭洰鍚嶇О锛�">
-            <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
-                      @change="handleQuery" />
-          </el-form-item>
           <el-form-item label="褰曞叆鏃ユ湡锛�">
             <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
                             placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
@@ -109,12 +105,6 @@
           label="渚涘簲鍟嗗悕绉�"
           width="240"
           prop="supplierName"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          width="420"
           show-overflow-tooltip
         />
         <el-table-column
@@ -229,15 +219,6 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
         </el-row>
 				<el-row :gutter="30">
 					<el-col :span="12">
@@ -297,8 +278,8 @@
           <el-col :span="12">
             <el-form-item label="鏄惁寮�绁�" prop="isInvoice">
               <el-select v-model="form.isInvoice" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="鏄�" value="1" />
-                <el-option label="鍚�" value="2" />
+                <el-option label="鏄�" :value="1" />
+                <el-option label="鍚�" :value="2" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -604,11 +585,6 @@
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�">
-              <el-input v-model="scanForm.projectName" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
             <el-form-item label="鎵爜鏃堕棿锛�">
               <el-input v-model="scanForm.scanTime" disabled />
             </el-form-item>
@@ -727,7 +703,6 @@
     supplierName: "", // 渚涘簲鍟嗗悕绉�
     purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
     salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
-    projectName: "", // 椤圭洰鍚嶇О
     entryDate: null, // 褰曞叆鏃ユ湡
     entryDateStart: undefined,
     entryDateEnd: undefined,
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 2f66a02..d83ab21 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -563,7 +563,8 @@
         result.productData.forEach(item => {
           allProductData.push({
             ...item,
-            id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+            // 淇濈暀鍘熸湁浜у搧 id锛屼笉鍐嶈鐩栵紱棰濆鎸備笂鎵�灞炲悎鍚� id
+            salesLedgerId: contractId,
             salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
             customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
             customerContractNo: contract.customerContractNo // 娣诲姞瀹㈡埛鍚堝悓鍙�
@@ -592,8 +593,8 @@
     if (valid) {
       // 缁熶竴灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽崟涓拰鎵归噺閮戒娇鐢ㄦ暟缁勬牸寮�
       const submitData = selectedRows.value.map(contract => {
-        // 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
-        const contractProductData = productData.value.filter(item => 
+        // 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹紙鏍规嵁 salesLedgerId 鍏宠仈鍚堝悓锛�
+        const contractProductData = productData.value.filter(item =>
           item.salesLedgerId === contract.id
         );
         
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index fb4695e..18292b2 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -205,125 +205,125 @@
     <el-dialog
       v-model="dialogFormVisible"
       title="鏂板鍥炴椤甸潰"
-      width="70%"
+      width="90%"
       @close="closeDia"
     >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
+      <el-table
+        :data="dialogTableData"
+        border
+        style="width: 100%"
+        max-height="500px"
       >
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩濉厖"
-                disabled
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+          width="200"
+        />
+        <el-table-column
+          label="瀹㈡埛鍚嶇О"
+          prop="customerName"
+          show-overflow-tooltip
+          width="200"
+        />
+        <el-table-column
+          label="浜у搧澶х被"
+          prop="productCategory"
+          show-overflow-tooltip
+          width="120"
+        />
+        <el-table-column
+          label="瑙勬牸鍨嬪彿"
+          prop="specification"
+          show-overflow-tooltip
+          width="150"
+        />
+        <el-table-column
+          label="鍙戠エ鍙�"
+          prop="invoiceNo"
+          show-overflow-tooltip
+          width="180"
+        />
+        <el-table-column
+          label="鍙戠エ閲戦(鍏�)"
+          prop="invoiceTotal"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+          width="150"
+        />
+        <el-table-column
+          label="绋庣巼(%)"
+          prop="taxRate"
+          show-overflow-tooltip
+          width="100"
+        />
+        <el-table-column
+          label="寰呭洖娆鹃噾棰�(鍏�)"
+          prop="noReceiptAmount"
+          show-overflow-tooltip
+          width="150"
+        >
+          <template #default="{ row }">
+            <el-text type="danger">
+              {{ formattedNumber(row, null, row.noReceiptAmount) }}
+            </el-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏈鍥炴閲戦(鍏�)" width="180">
+          <template #default="scope">
+            <el-input-number
+              :step="0.01"
+              :min="0"
+              :max="scope.row.noReceiptAmount"
+              style="width: 100%"
+              :precision="2"
+              v-model="scope.row.receiptPaymentAmount"
+              placeholder="璇疯緭鍏�"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鍥炴鏂瑰紡" width="150">
+          <template #default="scope">
+            <el-select
+              v-model="scope.row.receiptPaymentType"
+              placeholder="璇烽�夋嫨"
+              clearable
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in receipt_payment_type"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
               />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input
-                v-model="form.customerName"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
-              <el-input
-                v-model="form.invoiceNo"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
-              <el-input
-                type="number"
-                v-model="form.invoiceTotal"
-                placeholder="鑷姩濉厖"
-                :step="0.01"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="绋庣巼锛�" prop="taxRate">
-              <el-input
-                type="number"
-                v-model="form.taxRate"
-                placeholder="鑷姩濉厖"
-                :step="0.01"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏈鍥炴閲戦锛�" prop="receiptPaymentAmount">
-              <el-input-number :step="0.01" :min="0" style="width: 100%"
-															 :precision="2"
-                v-model="form.receiptPaymentAmount"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍥炴褰㈠紡锛�" prop="receiptPaymentType">
-              <el-select
-                v-model="form.receiptPaymentType"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option
-                  v-for="item in receipt_payment_type"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="鍥炴鏃ユ湡锛�" prop="receiptPaymentDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.receiptPaymentDate"
-								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="鐧昏浜猴細" prop="registrant">
-							<el-input
-								v-model="form.registrant"
-								placeholder="璇疯緭鍏�"
-								clearable
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-      </el-form>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍥炴鏃ユ湡" width="180">
+          <template #default="scope">
+            <el-date-picker
+              style="width: 100%"
+              v-model="scope.row.receiptPaymentDate"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              type="date"
+              placeholder="璇烽�夋嫨"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏浜�" width="120">
+          <template #default="scope">
+            <el-input
+              v-model="scope.row.registrant"
+              placeholder="鑷姩濉厖"
+              disabled
+            />
+          </template>
+        </el-table-column>
+      </el-table>
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" @click="submitForm">纭</el-button>
@@ -340,7 +340,6 @@
 import {
   receiptPaymentSaveOrUpdate,
   bindInvoiceNoRegPage,
-  invoiceInfo,
   receiptPaymentHistoryListNoPage,
   receiptPaymentDel,
 } from "../../../api/salesManagement/receiptPayment.js";
@@ -362,6 +361,7 @@
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const dialogFormVisible = ref(false);
+const dialogTableData = ref([]);
 const data = reactive({
   searchForm: {
     searchText: "",
@@ -490,38 +490,97 @@
 };
 // 鎵撳紑寮规
 const openForm = () => {
-  form.value = {};
-  if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�");
+  // 鑷冲皯閫夋嫨涓�鏉℃暟鎹�
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨鏁版嵁");
     return;
   }
-  if (selectedRows.value[0].noReceiptAmount == 0) {
-    proxy.$modal.msgWarning("鏃犻渶鍐嶅洖娆�");
+
+  // 鏍¢獙鏄惁涓虹浉鍚岄攢鍞悎鍚屽彿
+  const firstContractNo = selectedRows.value[0].salesContractNo;
+  const isSameContract = selectedRows.value.every(
+    (item) => item.salesContractNo === firstContractNo
+  );
+  if (!isSameContract) {
+    proxy.$modal.msgError("璇烽�夋嫨鐩稿悓閿�鍞悎鍚屽彿鐨勬暟鎹繘琛屽洖娆�");
     return;
   }
-  invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
-    form.value = { ...res.data };
-    form.value.invoiceLedgerId = form.value.id;
-    form.value.id = "";
-    form.value.registrant = userStore.nickName;
+
+  // 杩囨护鍑烘湁寰呭洖娆鹃噾棰濈殑璁板綍
+  const validRows = selectedRows.value.filter(
+    (item) => Number(item.noReceiptAmount) > 0
+  );
+  if (validRows.length === 0) {
+    proxy.$modal.msgWarning("鎵�閫夋暟鎹潎鏃犻渶鍐嶅洖娆�");
+    return;
+  }
+
+  // 鐩存帴浣跨敤澶栭儴琛ㄦ牸鏁版嵁锛屼负姣忔潯璁板綍娣诲姞鍥炴鐩稿叧瀛楁
+  dialogTableData.value = validRows.map((row) => {
+    return {
+      ...row,
+      invoiceLedgerId: row.id,
+      receiptPaymentAmount: row.noReceiptAmount || "",
+      receiptPaymentType: "",
+      receiptPaymentDate: "",
+      registrant: userStore.nickName,
+    };
   });
+
   dialogFormVisible.value = true;
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      receiptPaymentSaveOrUpdate(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
-    }
+  // 鏍¢獙琛ㄦ牸鏁版嵁
+  const invalidRows = dialogTableData.value.filter((row) => {
+    return (
+      !row.receiptPaymentAmount ||
+      row.receiptPaymentAmount <= 0 ||
+      !row.receiptPaymentType ||
+      !row.receiptPaymentDate
+    );
   });
+
+  if (invalidRows.length > 0) {
+    proxy.$modal.msgError("璇峰畬鍠勬墍鏈夊繀濉」锛氬洖娆鹃噾棰濄�佸洖娆炬柟寮忋�佸洖娆炬棩鏈�");
+    return;
+  }
+
+  // 鏍¢獙鍥炴閲戦涓嶈兘瓒呰繃寰呭洖娆鹃噾棰�
+  const exceedRows = dialogTableData.value.filter((row) => {
+    return Number(row.receiptPaymentAmount) > Number(row.noReceiptAmount);
+  });
+
+  if (exceedRows.length > 0) {
+    proxy.$modal.msgError("鍥炴閲戦涓嶈兘瓒呰繃寰呭洖娆鹃噾棰�");
+    return;
+  }
+
+  // 缁勫悎鎴愭暟缁勬壒閲忔彁浜�
+  const submitDataList = dialogTableData.value.map((row) => {
+    return {
+      invoiceLedgerId: row.invoiceLedgerId,
+      receiptPaymentAmount: row.receiptPaymentAmount,
+      receiptPaymentType: row.receiptPaymentType,
+      receiptPaymentDate: row.receiptPaymentDate,
+      registrant: row.registrant,
+    };
+  });
+
+  receiptPaymentSaveOrUpdate(submitDataList)
+    .then(() => {
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      closeDia();
+      getList();
+    })
+    .catch((error) => {
+      console.error("鎻愪氦澶辫触:", error);
+      proxy.$modal.msgError("鎻愪氦澶辫触锛岃閲嶈瘯");
+    });
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
+  dialogTableData.value = [];
   dialogFormVisible.value = false;
 };
 
@@ -562,7 +621,8 @@
     receiptPaymentType: row.receiptPaymentType,
     receiptPaymentAmount: row.receiptPaymentAmount,
   };
-  receiptPaymentSaveOrUpdate(updateData).then((res) => {
+  // 瀛愯〃缂栬緫淇濆瓨涔熸寜鏁扮粍鎻愪氦锛堜笌鎵归噺鏂板淇濇寔涓�鑷达級
+  receiptPaymentSaveOrUpdate([updateData]).then((res) => {
     row.editType = !row.editType;
 		getList();
 		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
index 862562e..b8e0235 100644
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ b/src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -84,13 +84,10 @@
     prop: "receiptPaymentType",
     dataType: "tag",
     formatData: (params) => {
-      if (params == 0) {
-        return "鐢垫眹";
-      } else if (params == 1) {
-        return "鎵垮厬";
-      } else {
-        return null;
-      }
+      const dictItem = receipt_payment_type.value?.find(
+        (item) => item.value == params
+      );
+      return dictItem ? dictItem.label : null;
     },
     formatType: (params) => {
       return "info";
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 6b5a5bc..8980d24 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -137,8 +137,8 @@
           <el-col :span="12">
             <el-form-item label="鏄惁寮�绁�" prop="isInvoice">
               <el-select v-model="form.isInvoice" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="鏄�" value="1" />
-                <el-option label="鍚�" value="2" />
+                <el-option label="鏄�" :value="1" />
+                <el-option label="鍚�" :value="2" />
               </el-select>
             </el-form-item>
           </el-col>

--
Gitblit v1.9.3