From ea1cab4a1b6e3177e10651cff65e61493df41fff Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期四, 03 七月 2025 10:53:50 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/product-inventory-management into dev

---
 src/views/personnelManagement/onboarding/components/formDia.vue         |  161 ++-
 src/views/basicData/product/index.vue                                   |   18 
 src/views/personnelManagement/employeeRecord/components/formDia.vue     |   73 +
 src/views/personnelManagement/employeeRecord/index.vue                  |  223 +++++
 src/views/system/user/profile/userAvatar.vue                            |   30 
 src/views/inventoryManagement/issueManagement/index.vue                 |   42 
 src/views/salesManagement/salesLedger/index.vue                         |  486 ++--------
 src/views/personnelManagement/contractManagement/index.vue              |  223 +++++
 src/views/personnelManagement/dimission/components/formDia.vue          |  163 ++-
 src/views/salesManagement/invoiceLedger/index.vue                       |  258 +----
 src/api/personnelManagement/employeeRecord.js                           |   18 
 src/views/personnelManagement/contractManagement/components/formDia.vue |   73 +
 src/views/qualityManagement/metricMaintenance/index.vue                 |  310 +++++++
 src/api/personnelManagement/onboarding.js                               |   42 
 src/components/FileUpload/index.vue                                     |   49 
 src/views/procurementManagement/invoiceEntry/components/Modal.vue       |  112 --
 src/views/salesManagement/salesLedger/fileList.vue                      |   36 
 src/views/personnelManagement/dimission/index.vue                       |  146 ++-
 src/views/personnelManagement/onboarding/index.vue                      |  145 ++-
 19 files changed, 1,640 insertions(+), 968 deletions(-)

diff --git a/src/api/personnelManagement/employeeRecord.js b/src/api/personnelManagement/employeeRecord.js
new file mode 100644
index 0000000..378756a
--- /dev/null
+++ b/src/api/personnelManagement/employeeRecord.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍦ㄨ亴鍛樺伐鍙拌处
+export function staffOnJobListPage(query) {
+    return request({
+        url: '/staff/staffOnJob/listPage',
+        method: 'get',
+        params: query,
+    })
+}
+// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅
+export function staffOnJobInfo(query) {
+    return request({
+        url: '/staff/staffOnJob/staffNo',
+        method: 'get',
+        params: query,
+    })
+}
\ No newline at end of file
diff --git a/src/api/personnelManagement/onboarding.js b/src/api/personnelManagement/onboarding.js
new file mode 100644
index 0000000..7212afa
--- /dev/null
+++ b/src/api/personnelManagement/onboarding.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+// 鏌ヨ浜哄憳鍏ヨ亴鍒楄〃
+export function staffJoinListPage(query) {
+    return request({
+        url: '/staff/staffJoinLeaveRecord/listPage',
+        method: 'get',
+        params: query,
+    })
+}
+// 鏂板浜哄憳鍏ヨ亴
+export function staffJoinAdd(query) {
+    return request({
+        url: '/staff/staffJoinLeaveRecord/add',
+        method: 'post',
+        data: query,
+    })
+}
+// 淇敼浜哄憳鍏ヨ亴
+export function staffJoinUpdate(query) {
+    return request({
+        url: '/staff/staffJoinLeaveRecord/update',
+        method: 'post',
+        data: query,
+    })
+}
+// 鏌ヨ鍛樺伐鍏ヨ亴淇℃伅
+export function getStaffJoinInfo(query) {
+    return request({
+        url: '/staff/staffJoinLeaveRecord/' + query,
+        method: 'get',
+        data: query,
+    })
+}
+// 鍒犻櫎鍛樺伐
+export function staffJoinDel(query) {
+    return request({
+        url: '/staff/staffJoinLeaveRecord/del',
+        method: 'delete',
+        data: query,
+    })
+}
\ No newline at end of file
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index e39a6ed..57e62b7 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,21 +1,8 @@
 <template>
   <div class="upload-file">
-    <el-upload
-      multiple
-      :action="uploadFileUrl"
-      :before-upload="handleBeforeUpload"
-      :file-list="fileList"
-      :data="data"
-      :limit="limit"
-      :on-error="handleUploadError"
-      :on-exceed="handleExceed"
-      :on-success="handleUploadSuccess"
-      :show-file-list="false"
-      :headers="headers"
-      class="upload-file-uploader"
-      ref="fileUpload"
-      v-if="!disabled"
-    >
+    <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :data="data"
+      :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess"
+      :show-file-list="false" :headers="headers" class="upload-file-uploader" ref="fileUpload" v-if="!disabled">
       <!-- 涓婁紶鎸夐挳 -->
       <el-button type="primary">閫夊彇鏂囦欢</el-button>
     </el-upload>
@@ -31,31 +18,13 @@
       鐨勬枃浠�
     </div>
     <!-- 鏂囦欢鍒楄〃 -->
-    <transition-group
-      class="upload-file-list el-upload-list el-upload-list--text"
-      name="el-fade-in-linear"
-      tag="ul"
-    >
-      <li
-        :key="file.uid"
-        class="el-upload-list__item ele-upload-list__item-content"
-        v-for="(file, index) in fileList"
-      >
-        <el-link
-          :href="`${baseUrl}${file.url}`"
-          :underline="false"
-          target="_blank"
-        >
+    <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
+      <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
+        <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
           <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
         </el-link>
         <div class="ele-upload-list__item-content-action">
-          <el-link
-            :underline="false"
-            @click="handleDelete(index)"
-            type="danger"
-            v-if="!disabled"
-            >&nbsp;鍒犻櫎</el-link
-          >
+          <el-link :underline="false" @click="handleDelete(index)" type="danger" v-if="!disabled">&nbsp;鍒犻櫎</el-link>
         </div>
       </li>
     </transition-group>
@@ -264,9 +233,11 @@
   opacity: 0.5;
   background: #c8ebfb;
 }
+
 .upload-file-uploader {
   margin-bottom: 5px;
 }
+
 .upload-file-list .el-upload-list__item {
   border: 1px solid #e4e7ed;
   line-height: 2;
@@ -274,12 +245,14 @@
   position: relative;
   transition: none !important;
 }
+
 .upload-file-list .ele-upload-list__item-content {
   display: flex;
   justify-content: space-between;
   align-items: center;
   color: inherit;
 }
+
 .ele-upload-list__item-content-action .el-link {
   margin-right: 10px;
 }
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index cf83ff4..b17be1f 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -40,7 +40,13 @@
         >
           <template #default="{ node, data }">
             <div class="custom-tree-node">
-              <span>{{ node.label }}</span>
+              <span class="tree-node-content">
+                <el-icon class="orange-icon">
+                  <component :is="data.children && data.children.length > 0
+                  ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
+                </el-icon>
+                {{ data.label }}
+              </span>
               <div>
                 <el-button
                   type="primary"
@@ -476,4 +482,14 @@
   font-size: 14px;
   padding-right: 8px;
 }
+.tree-node-content {
+  display: flex;
+  align-items: center; /* 鍨傜洿灞呬腑 */
+  height: 100%;
+}
+.orange-icon {
+  color: orange;
+  font-size: 18px;
+  margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
+}
 </style>
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
index ef38d41..5b1088a 100644
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ b/src/views/inventoryManagement/issueManagement/index.vue
@@ -40,7 +40,7 @@
       <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
         :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="70%" @close="closeDia">
+    <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="40%" @close="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-form-item label="鍑哄簱鏁伴噺锛�" prop="salesContractNo">
           <el-input v-model="form.salesContractNo" placeholder="璇疯緭鍏�" clearable />
@@ -93,7 +93,6 @@
 const fileList = ref([])
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
 const dialogFormVisible = ref(false)
 const data = reactive({
   searchForm: {
@@ -177,32 +176,31 @@
 
 // 鎵撳紑寮规
 const openForm = async (row) => {
-  operationType.value = type
-  form.value = {}
-  productData.value = []
-  let userLists = await userListNoPage()
-  userList.value = userLists.data
-  customerList().then(res => {
-    customerOption.value = res
-  })
-  console.log('userStore.id', userStore.id)
-  form.value.entryPerson = userStore.id
-  if (type === 'edit') {
-    currentId.value = row.id;
-    getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
-      form.value = { ...res }
-      form.value.entryPerson = Number(res.entryPerson)
-      productData.value = form.value.productData
-      fileList.value = form.value.salesLedgerFiles
-    })
-  }
+  // form.value = {}
+  // productData.value = []
+  // let userLists = await userListNoPage()
+  // userList.value = userLists.data
+  // customerList().then(res => {
+  //   customerOption.value = res
+  // })
+  // console.log('userStore.id', userStore.id)
+  // form.value.entryPerson = userStore.id
+  // if (type === 'edit') {
+  //   currentId.value = row.id;
+  //   getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
+  //     form.value = { ...res }
+  //     form.value.entryPerson = Number(res.entryPerson)
+  //     productData.value = form.value.productData
+  //     fileList.value = form.value.salesLedgerFiles
+  //   })
+  // }
   // let userAll = await userStore.getInfo()
   // userList.value.forEach(element => {
   //   if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
   //     form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
   //   }
   // });
-  form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
+  // form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
   dialogFormVisible.value = true
 }
 
diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
new file mode 100644
index 0000000..6538273
--- /dev/null
+++ b/src/views/personnelManagement/contractManagement/components/formDia.vue
@@ -0,0 +1,73 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        title="璇︽儏"
+        width="70%"
+        @close="closeDia"
+    >
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :tableLoading="tableLoading"
+          height="600"
+      ></PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const tableColumn = ref([
+  {
+    label: "鍚堝悓骞撮檺",
+    prop: "contractTerm",
+  },
+  {
+    label: "鍚堝悓寮�濮嬫棩鏈�",
+    prop: "contractStartTime",
+  },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractEndTime",
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    staffOnJobInfo({staffNo: row.staffNo}).then(res => {
+      tableData.value = res.data
+    })
+  }
+}
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  dialogFormVisible.value = false;
+  emit('close')
+};
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
new file mode 100644
index 0000000..623d675
--- /dev/null
+++ b/src/views/personnelManagement/contractManagement/index.vue
@@ -0,0 +1,223 @@
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <div>
+        <span class="search_title">濮撳悕锛�</span>
+        <el-input
+            v-model="searchForm.staffName"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+        >鎼滅储</el-button
+        >
+      </div>
+      <div>
+        <!--        <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+        <!--        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+          :total="page.total"
+      ></PIMTable>
+    </div>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
+import {ElMessageBox} from "element-plus";
+import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js";
+
+const data = reactive({
+  searchForm: {
+    staffName: "",
+  },
+});
+const { searchForm } = toRefs(data);
+const tableColumn = ref([
+  {
+    label: "鐘舵��",
+    prop: "staffState",
+    dataType: "tag",
+    formatData: (params) => {
+      if (params == 0) {
+        return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
+      } else {
+        return null;
+      }
+    },
+    formatType: (params) => {
+      if (params == 0) {
+        return "danger";
+      } else if (params == 1) {
+        return "primary";
+      } else {
+        return null;
+      }
+    },
+  },
+  {
+    label: "鍛樺伐缂栧彿",
+    prop: "staffNo",
+  },
+  {
+    label: "濮撳悕",
+    prop: "staffName",
+  },
+  {
+    label: "鎬у埆",
+    prop: "sex",
+  },
+  {
+    label: "绫嶈疮",
+    prop: "nativePlace",
+  },
+  {
+    label: "宀椾綅",
+    prop: "postJob",
+  },
+  {
+    label: "瀹跺涵浣忓潃",
+    prop: "adress",
+  },
+  {
+    label: "绗竴瀛﹀巻",
+    prop: "firstStudy",
+  },
+  {
+    label: "涓撲笟",
+    prop: "profession",
+  },
+  {
+    label: "韬唤璇佸彿",
+    prop: "identityCard",
+  },
+  {
+    label: "骞撮緞",
+    prop: "age",
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "phone",
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉",
+    prop: "emergencyContact",
+    width: 120
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "emergencyContactPhone",
+  },
+  {
+    label: "鍚堝悓骞撮檺",
+    prop: "contractTerm",
+  },
+  // {
+  //   label: "鍚堝悓寮�濮嬫棩鏈�",
+  //   prop: "contractStartTime",
+  //   width: 120
+  // },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractExpireTime",
+    width: 120
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    operation: [
+      {
+        name: "璇︽儏",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+    ],
+  },
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  staffOnJobListPage({...page, ...searchForm.value,}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  nextTick(() => {
+    formDia.value?.openDialog(type, row)
+  })
+};
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffOnJob/export", {}, "鍚堝悓绠$悊.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped></style>
diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue
index 68185cc..dc96e2f 100644
--- a/src/views/personnelManagement/dimission/components/formDia.vue
+++ b/src/views/personnelManagement/dimission/components/formDia.vue
@@ -2,104 +2,123 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫浜哄憳'"
+        :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
         width="70%"
         @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/>
+            <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="濮撳悕锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="濮撳悕锛�" prop="staffName">
+              <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鎬у埆锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鎬у埆锛�" prop="sex">
+              <el-select v-model="form.sex">
+                <el-option label="鐢�" value="鐢�" />
+                <el-option label="濂�" value="濂�" />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绫嶈疮锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绫嶈疮锛�" prop="nativePlace">
+              <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="宀椾綅锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="宀椾綅锛�" prop="postJob">
+              <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瀹跺涵浣忓潃锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
+              <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="绗竴瀛﹀巻锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
+              <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="涓撲笟锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="涓撲笟锛�" prop="profession">
+              <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="韬唤璇佸彿锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
+              <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="骞撮緞锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="骞撮緞锛�" prop="age">
+              <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
+              <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
+              <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
+              <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鍚堝悓骞撮檺锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
+              <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
+              <el-date-picker
+                  v-model="form.contractStartTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
+              <el-date-picker
+                  v-model="form.contractEndTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -116,45 +135,87 @@
 
 <script setup>
 import {ref} from "vue";
+import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
 const data = reactive({
-  searchForm: {
-    purchaseContractNumber: "",
-  },
   form: {
-    purchaseContractNumber: "",
-    salesLedgerId: "",
-    projectName: "",
-    recorderId: "",
-    entryDate: "",
-    productData: [],
-    supplierName: "",
-    supplierId: "",
+    staffNo: "",
+    staffName: "",
+    sex: "",
+    nativePlace: "",
+    postJob: "",
+    adress: "",
+    firstStudy: "",
+    profession: "",
+    identityCard: "",
+    age: 0,
+    phone: "",
+    emergencyContact: "",
+    emergencyContactPhone: "",
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+    staffState: "",
   },
   rules: {
-    purchaseContractNumber: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
+    staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
   },
 });
 const { form, rules } = toRefs(data);
 
 // 鎵撳紑寮规
 const openDialog = (type, row) => {
+  operationType.value = type;
   dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    getStaffJoinInfo(row.id).then(res => {
+      form.value = {...res.data}
+    })
+  }
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
-
+  proxy.$refs.formRef.validate(valid => {
+    if (valid) {
+      form.value.staffState = 0
+      if (operationType.value === "add") {
+        staffJoinAdd(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      } else {
+        staffJoinUpdate(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      }
+    }
+  })
 }
 // 鍏抽棴寮规
 const closeDia = () => {
-  // proxy.resetForm("formRef");
+  proxy.resetForm("formRef");
   dialogFormVisible.value = false;
+  emit('close')
 };
 defineExpose({
   openDialog,
diff --git a/src/views/personnelManagement/dimission/index.vue b/src/views/personnelManagement/dimission/index.vue
index 3692930..ccf43da 100644
--- a/src/views/personnelManagement/dimission/index.vue
+++ b/src/views/personnelManagement/dimission/index.vue
@@ -4,9 +4,9 @@
       <div>
         <span class="search_title">濮撳悕锛�</span>
         <el-input
-            v-model="searchForm.customerName"
+            v-model="searchForm.staffName"
             style="width: 240px"
-            placeholder="璇疯緭鍏ュ悕绉版悳绱�"
+            placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
             @change="handleQuery"
             clearable
             :prefix-icon="Search"
@@ -17,6 +17,8 @@
       </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>
     <div class="table_list">
@@ -29,53 +31,45 @@
           @selection-change="handleSelectionChange"
           :tableLoading="tableLoading"
           @pagination="pagination"
-          :total="total"
+          :total="page.total"
       ></PIMTable>
     </div>
-    <form-dia ref="formDia"></form-dia>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
   </div>
 </template>
 
 <script setup>
 import { Search } from "@element-plus/icons-vue";
-import { ref } from "vue";
-import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
+import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import {ElMessageBox} from "element-plus";
 
 const data = reactive({
   searchForm: {
-    customerName: "",
-  },
-  form: {
-    salesLedgerId: "",
-    customerName: "",
-    salesman: "",
-    projectName: "",
-    productData: [],
-  },
-  rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    staffName: "",
   },
 });
-const { searchForm, form, rules } = toRefs(data);
+const { searchForm } = toRefs(data);
 const tableColumn = ref([
   {
     label: "鐘舵��",
-    prop: "paymentDate",
+    prop: "staffState",
     dataType: "tag",
     formatData: (params) => {
       if (params == 0) {
-        return "鍦ㄨ亴";
-      } else if (params == 1) {
         return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
       } else {
         return null;
       }
     },
     formatType: (params) => {
       if (params == 0) {
-        return "primary";
-      } else if (params == 1) {
         return "danger";
+      } else if (params == 1) {
+        return "primary";
       } else {
         return null;
       }
@@ -83,67 +77,84 @@
   },
   {
     label: "鍛樺伐缂栧彿",
-    prop: "supplierName",
+    prop: "staffNo",
   },
   {
     label: "濮撳悕",
-    prop: "currentPaymentAmount",
+    prop: "staffName",
   },
   {
     label: "鎬у埆",
-    prop: "paymentMethod",
+    prop: "sex",
   },
   {
     label: "绫嶈疮",
-    prop: "registrant",
+    prop: "nativePlace",
   },
   {
     label: "宀椾綅",
-    prop: "registrationtDate",
+    prop: "postJob",
   },
   {
     label: "瀹跺涵浣忓潃",
-    prop: "registrationtDate",
+    prop: "adress",
   },
   {
     label: "绗竴瀛﹀巻",
-    prop: "registrationtDate",
+    prop: "firstStudy",
   },
   {
     label: "涓撲笟",
-    prop: "registrationtDate",
+    prop: "profession",
   },
   {
     label: "韬唤璇佸彿",
-    prop: "registrationtDate",
+    prop: "identityCard",
   },
   {
     label: "骞撮緞",
-    prop: "registrationtDate",
+    prop: "age",
   },
   {
     label: "鑱旂郴鐢佃瘽",
-    prop: "registrationtDate",
+    prop: "phone",
   },
   {
     label: "绱ф�ヨ仈绯讳汉",
-    prop: "registrationtDate",
+    prop: "emergencyContact",
+    width: 120
   },
   {
     label: "鑱旂郴鐢佃瘽",
-    prop: "registrationtDate",
+    prop: "emergencyContactPhone",
   },
   {
     label: "鍚堝悓骞撮檺",
-    prop: "registrationtDate",
+    prop: "contractTerm",
   },
   {
     label: "鍚堝悓寮�濮嬫棩鏈�",
-    prop: "registrationtDate",
+    prop: "contractStartTime",
+    width: 120
   },
   {
     label: "鍚堝悓缁撴潫鏃ユ湡",
-    prop: "registrationtDate",
+    prop: "contractEndTime",
+    width: 120
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+    ],
   },
 ]);
 const tableData = ref([]);
@@ -152,8 +163,8 @@
 const page = reactive({
   current: 1,
   size: 100,
+  total: 0,
 });
-const total = ref(0);
 const formDia = ref()
 const { proxy } = getCurrentInstance()
 
@@ -170,14 +181,17 @@
 };
 const getList = () => {
   tableLoading.value = true;
-  
+  staffJoinListPage({...page, ...searchForm.value, staffState: 0}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  console.log("selection", selection);
-  selectedRows.value = selection.filter(
-      (item) => item.salesContractNo !== undefined
-  );
+  selectedRows.value = selection;
 };
 
 // 鎵撳紑寮规
@@ -186,6 +200,48 @@
     formDia.value?.openDialog(type, row)
   })
 };
+
+// 鍒犻櫎
+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(() => {
+        staffJoinDel(ids).then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 0}, "浜哄憳绂昏亴.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+onMounted(() => {
+  getList();
+});
 </script>
 
 <style scoped></style>
diff --git a/src/views/personnelManagement/employeeRecord/components/formDia.vue b/src/views/personnelManagement/employeeRecord/components/formDia.vue
new file mode 100644
index 0000000..6538273
--- /dev/null
+++ b/src/views/personnelManagement/employeeRecord/components/formDia.vue
@@ -0,0 +1,73 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        title="璇︽儏"
+        width="70%"
+        @close="closeDia"
+    >
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :tableLoading="tableLoading"
+          height="600"
+      ></PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const tableColumn = ref([
+  {
+    label: "鍚堝悓骞撮檺",
+    prop: "contractTerm",
+  },
+  {
+    label: "鍚堝悓寮�濮嬫棩鏈�",
+    prop: "contractStartTime",
+  },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractEndTime",
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    staffOnJobInfo({staffNo: row.staffNo}).then(res => {
+      tableData.value = res.data
+    })
+  }
+}
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  dialogFormVisible.value = false;
+  emit('close')
+};
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
new file mode 100644
index 0000000..f1e04db
--- /dev/null
+++ b/src/views/personnelManagement/employeeRecord/index.vue
@@ -0,0 +1,223 @@
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <div>
+        <span class="search_title">濮撳悕锛�</span>
+        <el-input
+            v-model="searchForm.staffName"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+        >鎼滅储</el-button
+        >
+      </div>
+      <div>
+<!--        <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+<!--        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+          :total="page.total"
+      ></PIMTable>
+    </div>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/personnelManagement/employeeRecord/components/formDia.vue";
+import {ElMessageBox} from "element-plus";
+import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js";
+
+const data = reactive({
+  searchForm: {
+    staffName: "",
+  },
+});
+const { searchForm } = toRefs(data);
+const tableColumn = ref([
+  {
+    label: "鐘舵��",
+    prop: "staffState",
+    dataType: "tag",
+    formatData: (params) => {
+      if (params == 0) {
+        return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
+      } else {
+        return null;
+      }
+    },
+    formatType: (params) => {
+      if (params == 0) {
+        return "danger";
+      } else if (params == 1) {
+        return "primary";
+      } else {
+        return null;
+      }
+    },
+  },
+  {
+    label: "鍛樺伐缂栧彿",
+    prop: "staffNo",
+  },
+  {
+    label: "濮撳悕",
+    prop: "staffName",
+  },
+  {
+    label: "鎬у埆",
+    prop: "sex",
+  },
+  {
+    label: "绫嶈疮",
+    prop: "nativePlace",
+  },
+  {
+    label: "宀椾綅",
+    prop: "postJob",
+  },
+  {
+    label: "瀹跺涵浣忓潃",
+    prop: "adress",
+  },
+  {
+    label: "绗竴瀛﹀巻",
+    prop: "firstStudy",
+  },
+  {
+    label: "涓撲笟",
+    prop: "profession",
+  },
+  {
+    label: "韬唤璇佸彿",
+    prop: "identityCard",
+  },
+  {
+    label: "骞撮緞",
+    prop: "age",
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "phone",
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉",
+    prop: "emergencyContact",
+    width: 120
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "emergencyContactPhone",
+  },
+  {
+    label: "鍚堝悓骞撮檺",
+    prop: "contractTerm",
+  },
+  // {
+  //   label: "鍚堝悓寮�濮嬫棩鏈�",
+  //   prop: "contractStartTime",
+  //   width: 120
+  // },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractExpireTime",
+    width: 120
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    operation: [
+      {
+        name: "璇︽儏",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+    ],
+  },
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  staffOnJobListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  nextTick(() => {
+    formDia.value?.openDialog(type, row)
+  })
+};
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍦ㄨ亴鍛樺伐鍙拌处.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped></style>
diff --git a/src/views/personnelManagement/onboarding/components/formDia.vue b/src/views/personnelManagement/onboarding/components/formDia.vue
index c8bd008..4a7dd77 100644
--- a/src/views/personnelManagement/onboarding/components/formDia.vue
+++ b/src/views/personnelManagement/onboarding/components/formDia.vue
@@ -9,97 +9,116 @@
       <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/>
+            <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="濮撳悕锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="濮撳悕锛�" prop="staffName">
+              <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鎬у埆锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鎬у埆锛�" prop="sex">
+              <el-select v-model="form.sex">
+                <el-option label="鐢�" value="鐢�" />
+                <el-option label="濂�" value="濂�" />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绫嶈疮锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绫嶈疮锛�" prop="nativePlace">
+              <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="宀椾綅锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="宀椾綅锛�" prop="postJob">
+              <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瀹跺涵浣忓潃锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
+              <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="绗竴瀛﹀巻锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
+              <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="涓撲笟锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="涓撲笟锛�" prop="profession">
+              <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="韬唤璇佸彿锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
+              <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="骞撮緞锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="骞撮緞锛�" prop="age">
+              <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
+              <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
+              <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
+              <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鍚堝悓骞撮檺锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
+              <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%"/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
+              <el-date-picker
+                  v-model="form.contractStartTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="salesLedgerId">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
+              <el-date-picker
+                  v-model="form.contractEndTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -116,45 +135,87 @@
 
 <script setup>
 import {ref} from "vue";
+import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
 const data = reactive({
-  searchForm: {
-    purchaseContractNumber: "",
-  },
   form: {
-    purchaseContractNumber: "",
-    salesLedgerId: "",
-    projectName: "",
-    recorderId: "",
-    entryDate: "",
-    productData: [],
-    supplierName: "",
-    supplierId: "",
+    staffNo: "",
+    staffName: "",
+    sex: "",
+    nativePlace: "",
+    postJob: "",
+    adress: "",
+    firstStudy: "",
+    profession: "",
+    identityCard: "",
+    age: 0,
+    phone: "",
+    emergencyContact: "",
+    emergencyContactPhone: "",
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+    staffState: "",
   },
   rules: {
-    purchaseContractNumber: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
+    staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
   },
 });
 const { form, rules } = toRefs(data);
 
 // 鎵撳紑寮规
 const openDialog = (type, row) => {
+  operationType.value = type;
   dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    getStaffJoinInfo(row.id).then(res => {
+      form.value = {...res.data}
+    })
+  }
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
-
+  proxy.$refs.formRef.validate(valid => {
+    if (valid) {
+      form.value.staffState = 1
+      if (operationType.value === "add") {
+        staffJoinAdd(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      } else {
+        staffJoinUpdate(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      }
+    }
+  })
 }
 // 鍏抽棴寮规
 const closeDia = () => {
-  // proxy.resetForm("formRef");
+  proxy.resetForm("formRef");
   dialogFormVisible.value = false;
+  emit('close')
 };
 defineExpose({
   openDialog,
diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue
index 2ad1e89..f7ddc71 100644
--- a/src/views/personnelManagement/onboarding/index.vue
+++ b/src/views/personnelManagement/onboarding/index.vue
@@ -4,9 +4,9 @@
       <div>
         <span class="search_title">濮撳悕锛�</span>
         <el-input
-          v-model="searchForm.customerName"
+          v-model="searchForm.staffName"
           style="width: 240px"
-          placeholder="璇疯緭鍏ュ悕绉版悳绱�"
+          placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
           @change="handleQuery"
           clearable
           :prefix-icon="Search"
@@ -17,6 +17,8 @@
       </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>
     <div class="table_list">
@@ -29,53 +31,45 @@
         @selection-change="handleSelectionChange"
         :tableLoading="tableLoading"
         @pagination="pagination"
-        :total="total"
+        :total="page.total"
       ></PIMTable>
     </div>
-    <form-dia ref="formDia"></form-dia>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
   </div>
 </template>
 
 <script setup>
 import { Search } from "@element-plus/icons-vue";
-import { ref } from "vue";
+import {onMounted, ref} from "vue";
 import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
+import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import {ElMessageBox} from "element-plus";
 
 const data = reactive({
   searchForm: {
-    customerName: "",
-  },
-  form: {
-    salesLedgerId: "",
-    customerName: "",
-    salesman: "",
-    projectName: "",
-    productData: [],
-  },
-  rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    staffName: "",
   },
 });
-const { searchForm, form, rules } = toRefs(data);
+const { searchForm } = toRefs(data);
 const tableColumn = ref([
   {
     label: "鐘舵��",
-    prop: "paymentDate",
+    prop: "staffState",
     dataType: "tag",
     formatData: (params) => {
       if (params == 0) {
-        return "鍦ㄨ亴";
-      } else if (params == 1) {
         return "绂昏亴";
+      } else if (params == 1) {
+        return "鍏ヨ亴";
       } else {
         return null;
       }
     },
     formatType: (params) => {
       if (params == 0) {
-        return "primary";
-      } else if (params == 1) {
         return "danger";
+      } else if (params == 1) {
+        return "primary";
       } else {
         return null;
       }
@@ -83,67 +77,85 @@
   },
   {
     label: "鍛樺伐缂栧彿",
-    prop: "supplierName",
+    prop: "staffNo",
   },
   {
     label: "濮撳悕",
-    prop: "currentPaymentAmount",
+    prop: "staffName",
   },
   {
     label: "鎬у埆",
-    prop: "paymentMethod",
+    prop: "sex",
   },
   {
     label: "绫嶈疮",
-    prop: "registrant",
+    prop: "nativePlace",
   },
   {
     label: "宀椾綅",
-    prop: "registrationtDate",
+    prop: "postJob",
   },
   {
     label: "瀹跺涵浣忓潃",
-    prop: "registrationtDate",
+    prop: "adress",
   },
   {
     label: "绗竴瀛﹀巻",
-    prop: "registrationtDate",
+    prop: "firstStudy",
   },
   {
     label: "涓撲笟",
-    prop: "registrationtDate",
+    prop: "profession",
   },
   {
     label: "韬唤璇佸彿",
-    prop: "registrationtDate",
+    prop: "identityCard",
   },
   {
     label: "骞撮緞",
-    prop: "registrationtDate",
+    prop: "age",
   },
   {
     label: "鑱旂郴鐢佃瘽",
-    prop: "registrationtDate",
+    prop: "phone",
   },
   {
     label: "绱ф�ヨ仈绯讳汉",
-    prop: "registrationtDate",
+    prop: "emergencyContact",
+    width: 120
   },
   {
     label: "鑱旂郴鐢佃瘽",
-    prop: "registrationtDate",
+    prop: "emergencyContactPhone",
   },
   {
     label: "鍚堝悓骞撮檺",
-    prop: "registrationtDate",
+    prop: "contractTerm",
   },
   {
     label: "鍚堝悓寮�濮嬫棩鏈�",
-    prop: "registrationtDate",
+    prop: "contractStartTime",
+    width: 120
   },
   {
     label: "鍚堝悓缁撴潫鏃ユ湡",
-    prop: "registrationtDate",
+    prop: "contractEndTime",
+    width: 120
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+    ],
   },
 ]);
 const tableData = ref([]);
@@ -152,8 +164,8 @@
 const page = reactive({
   current: 1,
   size: 100,
+  total: 0,
 });
-const total = ref(0);
 const formDia = ref()
 const { proxy } = getCurrentInstance()
 
@@ -170,14 +182,17 @@
 };
 const getList = () => {
   tableLoading.value = true;
-  
+  staffJoinListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  console.log("selection", selection);
-  selectedRows.value = selection.filter(
-    (item) => item.salesContractNo !== undefined
-  );
+  selectedRows.value = selection;
 };
 
 // 鎵撳紑寮规
@@ -186,6 +201,48 @@
     formDia.value?.openDialog(type, row)
   })
 };
+
+// 鍒犻櫎
+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(() => {
+        staffJoinDel(ids).then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+onMounted(() => {
+  getList();
+});
 </script>
 
 <style scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index 7e38af6..3296bb3 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -1,12 +1,6 @@
 <template>
   <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
-    <el-form
-      ref="formRef"
-      :model="form"
-      :rules="rules"
-      label-width="120px"
-      label-position="top"
-    >
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="120px" label-position="top">
       <el-row :gutter="30">
         <el-col :span="12">
           <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
@@ -15,131 +9,61 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-            <el-input
-              v-model="form.salesContractNo"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
+            <el-input v-model="form.salesContractNo" placeholder="鑷姩濉厖" clearable disabled />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-            <el-input
-              v-model="form.supplierName"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
+            <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
-            />
+            <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"
-              placeholder="璇疯緭鍏�"
-              clearable
-            />
+            <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" clearable />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-            <el-input
-              type="number"
-              :step="0.01"
-              :min="0"
-              v-model="form.invoiceAmount"
-              placeholder="鑷姩濉厖"
-              clearable
-              :disabled="true"
-            />
+            <el-input type="number" :step="0.01" :min="0" v-model="form.invoiceAmount" placeholder="鑷姩濉厖" clearable />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="褰曞叆浜猴細" prop="issUer">
-            <el-input
-              v-model="form.issUer"
-              placeholder="璇疯緭鍏�"
-              clearable
-              disabled
-            />
+            <el-input v-model="form.issUer" placeholder="璇疯緭鍏�" clearable disabled />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
-            <el-date-picker
-              style="width: 100%"
-              v-model="form.entryDate"
-              type="date"
-              clearable
-            />
+            <el-date-picker style="width: 100%" v-model="form.entryDate" type="date" clearable />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="涓婁紶闄勪欢">
-            <FileUpload
-              :showTip="false"
-              accept="*"
-              :autoUpload="true"
-              :action="action"
-              :headers="{
-                Authorization: 'Bearer ' + getToken(),
-              }"
-              :limit="10"
-              @success="uploadSuccess"
-              @remove="removeFile"
-            />
+            <FileUpload :showTip="false" accept="*" :autoUpload="true" :action="action" :headers="{
+              Authorization: 'Bearer ' + getToken(),
+            }" :limit="10" @success="uploadSuccess" @remove="removeFile" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
-            <el-date-picker
-              style="width: 100%"
-              v-model="form.enterDate"
-              type="date"
-              clearable
-            />
+            <el-date-picker style="width: 100%" v-model="form.enterDate" type="date" clearable />
           </el-form-item>
         </el-col>
       </el-row>
       <el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="form.productData"
-        height="auto"
-      >
+      <PIMTable rowKey="id" :column="columns" :tableData="form.productData" height="auto">
         <template #ticketsNumRef="{ row }">
-          <el-input-number
-            v-model="row.ticketsNum"
-            placeholder="璇烽�夋嫨"
-            :min="0"
-            :step="0.1"
-            clearable
-            style="width: 100%"
-            @change="invoiceNumBlur(row)"
-          />
+          <el-input-number v-model="row.ticketsNum" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable style="width: 100%"
+            @change="invoiceNumBlur(row)" />
         </template>
         <template #ticketsAmountRef="{ row }">
-          <el-input-number
-            v-model="row.ticketsAmount"
-            placeholder="璇烽�夋嫨"
-            :min="0"
-            :step="0.1"
-            clearable
-            style="width: 100%"
-            @change="invoiceAmountBlur(row)"
-          />
+          <el-input-number v-model="row.ticketsAmount" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable
+            style="width: 100%" @change="invoiceAmountBlur(row)" />
         </template>
       </PIMTable>
     </el-form>
@@ -412,6 +336,8 @@
       if (code == 200) {
         closeModal();
       }
+    } else {
+      modalLoading.value = false;
     }
   });
 };
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
new file mode 100644
index 0000000..1c2b207
--- /dev/null
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -0,0 +1,310 @@
+<template>
+  <div class="app-container product-view">
+    <div class="left">
+      <div>
+        <el-input
+            v-model="search"
+            style="width: 210px"
+            placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
+            @change="searchFilter"
+            @clear="searchFilter"
+            clearable
+            prefix-icon="Search"
+        />
+      </div>
+      <div ref="containerRef">
+        <el-tree
+            ref="tree"
+            v-loading="treeLoad"
+            :data="list"
+            @node-click="handleNodeClick"
+            :expand-on-click-node="false"
+            default-expand-all
+            :default-expanded-keys="expandedKeys"
+            :draggable="true"
+            :filter-node-method="filterNode"
+            :props="{ children: 'children', label: 'label' }"
+            highlight-current
+            node-key="id"
+            style="
+            height: calc(100vh - 190px);
+            overflow-y: scroll;
+            scrollbar-width: none;
+          "
+        >
+          <template #default="{ node, data }">
+            <div class="custom-tree-node">
+              <span class="tree-node-content">
+                <el-icon class="orange-icon">
+                  <component :is="data.children && data.children.length > 0
+                  ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
+                </el-icon>
+                {{ data.label }}
+              </span>
+            </div>
+          </template>
+        </el-tree>
+      </div>
+    </div>
+    <div class="right">
+      <div style="margin-bottom: 10px">
+        <el-button type="primary" @click="openModelDia('add')">
+          鏂板妫�娴嬫寚鏍�
+        </el-button>
+        <ImportExcel @uploadSuccess="getModelList" />
+        <el-button
+            type="danger"
+            @click="handleDelete"
+            style="margin-left: 10px"
+            plain
+        >
+          鍒犻櫎
+        </el-button>
+      </div>
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+          :total="total"
+      ></PIMTable>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {delProductModel, modelListPage, productTreeList} from "@/api/basicData/product.js";
+import ImportExcel from "@/views/basicData/product/ImportExcel/index.vue";
+import {ElMessageBox} from "element-plus";
+
+// 鏍�
+const search = ref("");
+const treeLoad = ref(false);
+const list = ref([]);
+const expandedKeys = ref([]);
+const currentId = ref("");
+const currentParentId = ref("");
+// 鎸囨爣琛ㄦ牸
+const tableData = ref([]);
+const tableLoading = ref(false);
+const total = ref(0);
+const page = reactive({
+  current: 1,
+  size: 10,
+});
+const tableColumn = ref([
+  {
+    label: "瑙勬牸鍨嬪彿",
+    prop: "model",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "unit",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "unit",
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openModelDia("edit", row);
+        },
+      },
+    ],
+  },
+]);
+// 鎸囨爣寮规
+const modelDia = ref(false);
+const modelOperationType = ref("");
+const data = reactive({
+  form: {
+    productName: "",
+  },
+  rules: {
+    productName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+  },
+  modelForm: {
+    model: "",
+    unit: "",
+  },
+  modelRules: {
+    model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+  },
+});
+const { form, rules, modelForm, modelRules } = toRefs(data);
+
+// 鏌ヨ浜у搧鏍�
+const getProductTreeList = () => {
+  treeLoad.value = true;
+  productTreeList()
+      .then((res) => {
+        list.value = res;
+        list.value.forEach((a) => {
+          expandedKeys.value.push(a.label);
+        });
+        treeLoad.value = false;
+      })
+      .catch((err) => {
+        treeLoad.value = false;
+      });
+};
+// 杩囨护浜у搧鏍�
+const searchFilter = () => {
+  proxy.$refs.tree.filter(search.value);
+};
+// 閫夋嫨浜у搧
+const handleNodeClick = (val, node, el) => {
+  // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
+  currentId.value = val.id;
+  currentParentId.value = val.parentId;
+  getModelList();
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+// 鏌ヨ鎸囨爣鏁版嵁
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getModelList();
+};
+const getModelList = () => {
+  tableLoading.value = true;
+  modelListPage({
+    id: currentId.value,
+    current: page.current,
+    size: page.size,
+  }).then((res) => {
+    console.log("res", res);
+    tableData.value = res.records;
+    total.value = res.total;
+    tableLoading.value = false;
+  });
+};
+// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
+const filterNode = (value, data, node) => {
+  if (!value) {
+    //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
+    return true;
+  }
+  // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
+  let val = value.toLowerCase();
+  return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
+};
+// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
+const chooseNode = (value, data, node) => {
+  if (data.label.indexOf(value) !== -1) {
+    return true;
+  }
+  const level = node.level;
+  // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
+  if (level === 1) {
+    return false;
+  }
+  // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
+  let parentData = node.parent;
+  // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
+  let index = 0;
+  while (index < level - 1) {
+    // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
+    if (parentData.data.label.indexOf(value) !== -1) {
+      return true;
+    }
+    // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
+    parentData = parentData.parent;
+    index++;
+  }
+  // 娌″尮閰嶅埌杩斿洖false
+  return false;
+};
+// 鎵撳紑鎸囨爣寮规
+const openModelDia = (type, data) => {
+  modelOperationType.value = type;
+  modelDia.value = true;
+  modelForm.value.model = "";
+  modelForm.value.model = "";
+  modelForm.value.id = "";
+  if (type === "edit") {
+    modelForm.value = { ...data };
+  }
+};
+// 鍒犻櫎鎸囨爣
+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(() => {
+    tableLoading.value = true;
+    delProductModel(ids).then((res) => {
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      getModelList();
+    }).finally(() => {
+      tableLoading.value = false;
+    });
+  }).catch(() => {
+    proxy.$modal.msg("宸插彇娑�");
+  });
+};
+getProductTreeList();
+</script>
+
+<style scoped>
+.product-view {
+  display: flex;
+}
+.left {
+  width: 380px;
+  padding: 16px;
+  background: #ffffff;
+}
+.right {
+  width: calc(100% - 380px);
+  padding: 16px;
+  margin-left: 20px;
+  background: #ffffff;
+}
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 8px;
+}
+.tree-node-content {
+  display: flex;
+  align-items: center; /* 鍨傜洿灞呬腑 */
+  height: 100%;
+}
+.orange-icon {
+  color: orange;
+  font-size: 18px;
+  margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
+}
+</style>
\ No newline at end of file
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
index 194b86c..e54abf1 100644
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ b/src/views/salesManagement/invoiceLedger/index.vue
@@ -3,40 +3,17 @@
     <div class="search_form">
       <el-form :inline="true" :model="searchForm">
         <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�">
-          <el-input
-            v-model="searchForm.searchText"
-            style="width: 240px"
-            placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�"
-            @change="handleQuery"
-            clearable
-            :prefix-icon="Search"
-          />
+          <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�"
+            @change="handleQuery" clearable :prefix-icon="Search" />
         </el-form-item>
         <el-form-item label="寮�绁ㄦ棩鏈�">
-          <el-date-picker
-            style="width: 240px"
-            v-model="searchForm.invoiceDate"
-            value-format="YYYY-MM-DD"
-            format="YYYY-MM-DD"
-            type="daterange"
-            start-placeholder="寮�濮嬫椂闂�"
-            end-placeholder="缁撴潫鏃堕棿"
-            clearable
-            @change="changeDateRange"
-            @clear="clearRange"
-          />
+          <el-date-picker style="width: 240px" v-model="searchForm.invoiceDate" value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
+            @change="changeDateRange" @clear="clearRange" />
         </el-form-item>
         <el-form-item label="褰曞叆鏃ユ湡">
-          <el-date-picker
-            style="width: 100%"
-            v-model="searchForm.createTimeStart"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            format="YYYY-MM-DD"
-            type="date"
-            placeholder="璇烽�夋嫨"
-            clearable
-            @change="handleQuery"
-          />
+          <el-date-picker style="width: 100%" v-model="searchForm.createTimeStart" value-format="YYYY-MM-DD HH:mm:ss"
+            format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable @change="handleQuery" />
         </el-form-item>
         <el-form-item label="涓嶆樉绀烘湁鍙戠エ琛�">
           <el-checkbox v-model="searchForm.status" @change="handleQuery" />
@@ -49,143 +26,46 @@
       </el-form>
     </div>
     <div class="table_list">
-      <el-table
-        :data="tableData"
-        border
-        v-loading="tableLoading"
-        @selection-change="handleSelectionChange"
-        :row-key="(row) => row.id"
-        show-summary
-        :summary-method="summarizeMainTable"
-        height="calc(100vh - 18.5em)"
-      >
+      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
+        :row-key="(row) => row.id" show-summary :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="salesContractNo"
-          show-overflow-tooltip
-          width="180"
-        />
-        <el-table-column
-          label="瀹㈡埛鍚堝悓鍙�"
-          prop="customerContractNo"
-          show-overflow-tooltip
-          width="180"
-        />
-        <el-table-column
-          label="瀹㈡埛鍚嶇О"
-          prop="customerName"
-          show-overflow-tooltip
-          width="240"
-        />
-        <el-table-column label="椤圭洰" prop="projectName" width="150" />
-        <el-table-column label="浜у搧澶х被" prop="productCategory" />
-        <el-table-column
-          label="瑙勬牸鍨嬪彿"
-          prop="specificationModel"
-          width="300"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="鍙戠エ鍙�"
-          prop="invoiceNo"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="鍙戠エ閲戦(鍏�)"
-          prop="invoiceTotal"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-          width="120"
-        />
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
+        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip width="180" />
+        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
+        <el-table-column label="椤圭洰" prop="projectName" width="200" />
+        <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
+        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="300" show-overflow-tooltip />
+        <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
+        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"
+          width="120" />
         <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
-        <el-table-column
-          label="褰曞叆浜�"
-          prop="invoicePerson"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="褰曞叆鏃ユ湡"
-          prop="createTime"
-          show-overflow-tooltip
-          :formatter="formatDate"
-          width="180"
-        />
-        <el-table-column
-          label="寮�绁ㄦ棩鏈�"
-          prop="invoiceDate"
-          show-overflow-tooltip
-          width="120"
-        />
-        <el-table-column
-          label="鍙戠エ"
-          prop="invoiceFileName"
-          width="120"
-          align="center"
-          show-overflow-tooltip
-        >
+        <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
+        <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" />
+        <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip>
           <template #default="scope">
-            <el-button
-              v-if="scope.row.invoiceFileName"
-              text
-              bg
-              type="primary"
-              @click="handleFile(scope.row.commonFiles)"
-            >
+            <el-button v-if="scope.row.invoiceFileName" text bg type="primary"
+              @click="handleFile(scope.row.commonFiles)">
               鏌ョ湅闄勪欢
             </el-button>
-            <el-button
-              v-else
-              link
-              type="primary"
-              @click="handleDownload(scope.row)"
-            >
+            <el-button v-else link type="primary" @click="handleDownload(scope.row)">
               涓婁紶
             </el-button>
           </template>
         </el-table-column>
         <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
           <template #default="scope">
-            <el-button
-              link
-              type="primary"
-              size="small"
-              @click="openForm(scope.row)"
-              >缂栬緫</el-button
-            >
-            <el-button
-              link
-              type="primary"
-              size="small"
-              @click="delInvoiceLedger(scope.row)"
-              >鍒犻櫎</el-button
-            >
+            <el-button link type="primary" size="small" @click="openForm(scope.row)">缂栬緫</el-button>
+            <el-button link type="primary" size="small" @click="delInvoiceLedger(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"
-      />
+      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog
-      v-model="dialogFormVisible"
-      title="寮�绁ㄥ彴璐﹂〉闈�"
-      width="70%"
-      @close="closeDia"
-    >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
-      >
+    <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" width="70%" @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="salesContractNo">
@@ -194,79 +74,41 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input
-                v-model="form.customerName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
+              <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable 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="璇疯緭鍏�"
-                clearable
-              />
+              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
-              <el-input
-                type="number"
-                :step="0.01"
-                v-model="form.invoiceTotal"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+              <el-input type="number" :step="0.01" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson">
-              <el-input
-                v-model="form.invoicePerson"
-                placeholder="璇疯緭鍏�"
-                clearable
-                disabled
-              />
+              <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.invoiceDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
+              <el-date-picker style="width: 100%" v-model="form.invoiceDate" value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-              <el-upload
-                v-model:file-list="fileList"
-                :action="upload.url"
-                multiple
-                ref="fileUpload"
-                auto-upload
-                :headers="upload.headers"
-                accept=".pdf"
-                :limit="1"
-                :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError"
-                :on-success="handleUploadSuccess"
-                :on-remove="handleRemove"
-              >
+              <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
+                :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
+                :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove">
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
                   <!--                  鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
@@ -288,22 +130,10 @@
       <el-row :gutter="30">
         <el-col :span="24">
           <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-            <el-upload
-              v-model:file-list="fileList"
-              :action="upload.url"
-              multiple
-              ref="fileUpload"
-              auto-upload
-              :headers="upload.headers"
-              accept=".pdf"
-              :limit="1"
-              style="width: 100%"
-              :on-exceed="handleExceed"
-              :before-upload="handleBeforeUpload"
-              :on-error="handleUploadError"
-              :on-success="handleUploadSuccess"
-              :on-remove="handleRemove"
-            >
+            <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
+              :headers="upload.headers" accept=".pdf" :limit="10" style="width: 100%" :on-exceed="handleExceed"
+              :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess"
+              :on-remove="handleRemove">
               <el-button type="primary">涓婁紶</el-button>
               <template #tip>
                 <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div>
diff --git a/src/views/salesManagement/salesLedger/fileList.vue b/src/views/salesManagement/salesLedger/fileList.vue
new file mode 100644
index 0000000..d1c0cdd
--- /dev/null
+++ b/src/views/salesManagement/salesLedger/fileList.vue
@@ -0,0 +1,36 @@
+<template>
+  <el-dialog v-model="dialogVisible" title="闄勪欢" width="30%" :before-close="handleClose">
+    <el-table :data="tableData" border height="40vh">
+      <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip />
+      <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center">
+        <template #default="scope">
+          <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+
+const dialogVisible = ref(false)
+const tableData = ref([])
+const { proxy } = getCurrentInstance();
+const handleClose = () => {
+  dialogVisible.value = false
+}
+const open = (list) => {
+  dialogVisible.value = true
+  tableData.value = list
+}
+const downLoadFile = (row) => {
+  proxy.$download.name(row.url);
+
+}
+defineExpose({
+  open
+})
+</script>
+
+<style></style>
\ No newline at end of file
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 7ed2f28..893c02b 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -3,51 +3,24 @@
     <div class="search_form">
       <el-form :model="searchForm" :inline="true">
         <el-form-item label="瀹㈡埛鍚嶇О锛�">
-          <el-input
-            v-model="searchForm.customerContractNo"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            @change="handleQuery"
-          />
+          <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+            @change="handleQuery" />
         </el-form-item>
         <el-form-item label="瀹㈡埛鍚堝悓鍙凤細">
-          <el-input
-            v-model="searchForm.customerContractNo"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            @change="handleQuery"
-          />
+          <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+            @change="handleQuery" />
         </el-form-item>
         <el-form-item label="閿�鍞悎鍚屽彿锛�">
-          <el-input
-            v-model="searchForm.salesContractNo"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            @change="handleQuery"
-          />
+          <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-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"
-          />
+          <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+            placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
@@ -65,177 +38,61 @@
           <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
         </div>
       </div>
-      <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"
-        @expand-change="expandChange"
-        height="calc(100vh - 18.5em)"
-      >
+      <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" @expand-change="expandChange" height="calc(100vh - 18.5em)">
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table
-              :data="props.row.children"
-              border
-              show-summary
-              :summary-method="summarizeChildrenTable"
-            >
-              <el-table-column
-                align="center"
-                label="搴忓彿"
-                type="index"
-                width="60"
-              />
+            <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
+              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <el-table-column
-                label="鍚◣鍗曚环(鍏�)"
-                prop="taxInclusiveUnitPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="鍚◣鎬讳环(鍏�)"
-                prop="taxInclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="涓嶅惈绋庢�讳环(鍏�)"
-                prop="taxExclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
+              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
+              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
+              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
-          label="閿�鍞悎鍚屽彿"
-          prop="salesContractNo"
-          width="180"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="瀹㈡埛鍚堝悓鍙�"
-          prop="customerContractNo"
-          width="180"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="瀹㈡埛鍚嶇О"
-          prop="customerName"
-          width="300"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="涓氬姟鍛�"
-          prop="salesman"
-          width="100"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          width="180"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="浠樻鏂瑰紡"
-          prop="paymentMethod"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="鍚堝悓閲戦(鍏�)"
-          prop="contractAmount"
-          width="180"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-        />
-        <el-table-column
-          label="褰曞叆浜�"
-          prop="entryPersonName"
-          width="100"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="褰曞叆鏃ユ湡"
-          prop="entryDate"
-          width="120"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="绛捐鏃ユ湡"
-          prop="executionDate"
-          width="120"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          fixed="right"
-          label="鎿嶄綔"
-          min-width="60"
-          align="center"
-        >
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
+        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" width="180" show-overflow-tooltip />
+        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
+        <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
+        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
+        <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
+        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="180" show-overflow-tooltip
+          :formatter="formattedNumber" />
+        <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
+        <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip />
+        <el-table-column fixed="right" label="鎿嶄綔" min-width="100" align="center">
           <template #default="scope">
-            <el-button
-              link
-              type="primary"
-              size="small"
-              @click="openForm('edit', scope.row)"
-              >缂栬緫</el-button
-            >
+            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button>
+            <el-button link type="primary" size="small" @click="downLoadFile(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"
-      />
+      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog
-      v-model="dialogFormVisible"
-      :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
-      width="70%"
-      @close="closeDia"
-    >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
-      >
+    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" width="70%"
+      @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="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩鐢熸垚"
-                clearable
-                disabled
-              />
+              <el-input v-model="form.salesContractNo" placeholder="鑷姩鐢熸垚" clearable disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="涓氬姟鍛橈細" prop="salesman">
               <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable>
-                <el-option
-                  v-for="item in userList"
-                  :key="item.nickName"
-                  :label="item.nickName"
-                  :value="item.nickName"
-                />
+                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
+                  :value="item.nickName" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -243,26 +100,13 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo">
-              <el-input
-                v-model="form.customerContractNo"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+              <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
-              <el-select
-                v-model="form.customerId"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option
-                  v-for="item in customerOption"
-                  :key="item.id"
-                  :label="item.customerName"
-                  :value="item.id"
-                >
+              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable>
+                <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
                   {{
                     item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
                   }}
@@ -274,28 +118,13 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+              <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
-              <el-select
-                v-model="form.entryPerson"
-                placeholder="璇烽�夋嫨"
-                clearable
-                @change="changs"
-                disabled
-              >
-                <el-option
-                  v-for="item in userList"
-                  :key="item.userId"
-                  :label="item.nickName"
-                  :value="item.userId"
-                />
+              <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled>
+                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -303,132 +132,61 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.entryDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-                disabled
-              />
+              <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
+                type="date" placeholder="璇烽�夋嫨" clearable disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.executionDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
+              <el-date-picker style="width: 100%" v-model="form.executionDate" 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="浠樻鏂瑰紡">
-              <el-input
-                v-model="form.paymentMethod"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+              <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
-            <el-button type="primary" @click="openProductForm('add')"
-              >娣诲姞</el-button
-            >
-            <el-button plain type="danger" @click="deleteProduct"
-              >鍒犻櫎</el-button
-            >
+            <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button>
+            <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button>
           </el-form-item>
         </el-row>
-        <el-table
-          :data="productData"
-          border
-          @selection-change="productSelected"
-          show-summary
-          :summary-method="summarizeMainTable"
-        >
+        <el-table :data="productData" border @selection-change="productSelected" show-summary
+          :summary-method="summarizeMainTable">
           <el-table-column align="center" type="selection" width="55" />
-          <el-table-column
-            align="center"
-            label="搴忓彿"
-            type="index"
-            width="60"
-          />
+          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" />
           <el-table-column label="鏁伴噺" prop="quantity" />
           <el-table-column label="绋庣巼(%)" prop="taxRate" />
-          <el-table-column
-            label="鍚◣鍗曚环(鍏�)"
-            prop="taxInclusiveUnitPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column
-            label="鍚◣鎬讳环(鍏�)"
-            prop="taxInclusiveTotalPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column
-            label="涓嶅惈绋庢�讳环(鍏�)"
-            prop="taxExclusiveTotalPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column
-            fixed="right"
-            label="鎿嶄綔"
-            min-width="60"
-            align="center"
-          >
+          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
+          <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
+          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+          <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
             <template #default="scope">
-              <el-button
-                link
-                type="primary"
-                size="small"
-                @click="openProductForm('edit', scope.row)"
-                >缂栬緫</el-button
-              >
+              <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row)">缂栬緫</el-button>
             </template>
           </el-table-column>
         </el-table>
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="澶囨敞路锛�" prop="remark">
-              <el-input
-                v-model="form.remark"
-                placeholder="璇疯緭鍏�"
-                clearable
-                type="textarea"
-                :rows="2"
-              />
+              <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-              <el-upload
-                v-model:file-list="fileList"
-                :action="upload.url"
-                multiple
-                ref="fileUpload"
-                auto-upload
-                :headers="upload.headers"
-                :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError"
-                :on-success="handleUploadSuccess"
-                :on-remove="handleRemove"
-              >
+              <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
+                :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
+                :on-success="handleUploadSuccess" :on-remove="handleRemove">
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
                   <div class="el-upload__tip">
@@ -448,53 +206,25 @@
         </div>
       </template>
     </el-dialog>
-    <el-dialog
-      v-model="productFormVisible"
-      :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
-      width="40%"
-      @close="closeProductDia"
-    >
-      <el-form
-        :model="productForm"
-        label-width="140px"
-        label-position="top"
-        :rules="productRules"
-        ref="productFormRef"
-      >
+    <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%"
+      @close="closeProductDia">
+      <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
               <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
               </el-select> -->
-              <el-tree-select
-                v-model="productForm.productCategory"
-                placeholder="璇烽�夋嫨"
-                clearable
-                check-strictly
-                @change="getModels"
-                :data="productOptions"
-                :render-after-expand="false"
-                style="width: 100%"
-              />
+              <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable check-strictly
+                @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select
-                v-model="productForm.productModelId"
-                placeholder="璇烽�夋嫨"
-                clearable
-                @change="getProductModel"
-              >
-                <el-option
-                  v-for="item in modelOptions"
-                  :key="item.id"
-                  :label="item.model"
-                  :value="item.id"
-                />
+              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
+                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -502,46 +232,25 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input
-                v-model="productForm.unit"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+              <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏁伴噺锛�" prop="quantity">
-              <el-input
-                type="number"
-                :step="0.1"
-                :min="0"
-                v-model="productForm.quantity"
-                placeholder="璇疯緭鍏�"
-                clearable
-                @change="mathNum"
-              />
+              <el-input type="number" :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable
+                @change="mathNum" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
-              <el-input
-                v-model="productForm.taxInclusiveUnitPrice"
-                placeholder="璇疯緭鍏�"
-                clearable
-                @change="mathNum"
-              />
+              <el-input v-model="productForm.taxInclusiveUnitPrice" placeholder="璇疯緭鍏�" clearable @change="mathNum" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
-              <el-select
-                v-model="productForm.taxRate"
-                placeholder="璇烽�夋嫨"
-                clearable
-                @change="mathNum"
-              >
+              <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum">
                 <el-option label="1" value="1" />
                 <el-option label="6" value="6" />
                 <el-option label="13" value="13" />
@@ -552,36 +261,19 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
-              <el-input
-                v-model="productForm.taxInclusiveTotalPrice"
-                placeholder="璇疯緭鍏�"
-                clearable
-                disabled
-              />
+              <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="涓嶅惈绋庢�讳环(鍏�)锛�"
-              prop="taxExclusiveTotalPrice"
-            >
-              <el-input
-                v-model="productForm.taxExclusiveTotalPrice"
-                placeholder="璇疯緭鍏�"
-                clearable
-                disabled
-              />
+            <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
+              <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
-              <el-select
-                v-model="productForm.invoiceType"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
+              <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
                 <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
                 <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
               </el-select>
@@ -596,6 +288,7 @@
         </div>
       </template>
     </el-dialog>
+    <FileList ref="fileListRef" />
   </div>
 </template>
 
@@ -606,6 +299,7 @@
 import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user";
 import { userListNoPage } from "@/api/system/user.js";
+import FileList from "./fileList.vue";
 import {
   ledgerListPage,
   productList,
@@ -1112,6 +806,18 @@
       );
   }
 };
+/**
+ * 涓嬭浇鏂囦欢
+ *
+ * @param row 涓嬭浇鏂囦欢鐨勭浉鍏充俊鎭璞�
+ */
+const fileListRef = ref(null)
+const downLoadFile = (row) => {
+  getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
+    fileListRef.value.open(res.salesLedgerFiles)
+  });
+
+}
 getList();
 </script>
 
@@ -1119,9 +825,11 @@
 .ml-10 {
   margin-left: 10px;
 }
+
 .table_list {
   margin-top: unset;
 }
+
 .actions {
   display: flex;
   justify-content: space-between;
diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue
index ae36e39..ff1c9ef 100644
--- a/src/views/system/user/profile/userAvatar.vue
+++ b/src/views/system/user/profile/userAvatar.vue
@@ -4,18 +4,9 @@
     <el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
       <el-row>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
-          <vue-cropper
-            ref="cropper"
-            :img="options.img"
-            :info="true"
-            :autoCrop="options.autoCrop"
-            :autoCropWidth="options.autoCropWidth"
-            :autoCropHeight="options.autoCropHeight"
-            :fixedBox="options.fixedBox"
-            :outputType="options.outputType"
-            @realTime="realTime"
-            v-if="visible"
-          />
+          <vue-cropper ref="cropper" :img="options.img" :info="true" :autoCrop="options.autoCrop"
+            :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :fixedBox="options.fixedBox"
+            :outputType="options.outputType" @realTime="realTime" v-if="visible" />
         </el-col>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
           <div class="avatar-upload-preview">
@@ -26,15 +17,12 @@
       <br />
       <el-row>
         <el-col :lg="2" :md="2">
-          <el-upload
-            action="#"
-            :http-request="requestUpload"
-            :show-file-list="false"
-            :before-upload="beforeUpload"
-          >
+          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
             <el-button>
               閫夋嫨
-              <el-icon class="el-icon--right"><Upload /></el-icon>
+              <el-icon class="el-icon--right">
+                <Upload />
+              </el-icon>
             </el-button>
           </el-upload>
         </el-col>
@@ -94,7 +82,7 @@
 }
 
 /** 瑕嗙洊榛樿涓婁紶琛屼负 */
-function requestUpload() {}
+function requestUpload() { }
 
 /** 鍚戝乏鏃嬭浆 */
 function rotateLeft() {
@@ -133,7 +121,7 @@
     formData.append("avatarfile", data, options.filename)
     uploadAvatar(formData).then(response => {
       open.value = false
-      options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl
+      options.img = import.meta.env.VITE_APP_BASE_API + '/profile/' + response.imgUrl
       userStore.avatar = options.img
       proxy.$modal.msgSuccess("淇敼鎴愬姛")
       visible.value = false

--
Gitblit v1.9.3