From c62745c757f758527136e62f1d9d8e576e7bd72f Mon Sep 17 00:00:00 2001
From: ZN <zhang_12370@163.com>
Date: 星期一, 09 三月 2026 10:42:20 +0800
Subject: [PATCH] Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New

---
 src/api/personnelManagement/staffSalaryMain.js                                            |   43 +
 src/views/personnelManagement/socialSecuritySet/index.vue                                 |  101 +++
 src/views/personnelManagement/socialSecuritySet/components/formDia.vue                    |  178 +++++-
 src/views/personnelManagement/employeeRecord/index.vue                                    |   67 -
 src/views/personnelManagement/monthlyStatistics/components/formDia.vue                    |  186 +++++--
 src/views/personnelManagement/employeeRecord/components/EmergencyAndAttachmentSection.vue |   34 
 src/views/personnelManagement/employeeRecord/components/EducationWorkSection.vue          |   74 +-
 src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue              |   98 +--
 src/views/personnelManagement/monthlyStatistics/components/bankSettingDia.vue             |  188 +++++++
 src/views/personnelManagement/employeeRecord/components/JobInfoSection.vue                |   96 +--
 src/api/personnelManagement/socialSecuritySet.js                                          |   10 
 src/views/personnelManagement/employeeRecord/components/BasicInfoSection.vue              |    9 
 src/api/personnelManagement/bank.js                                                       |   34 +
 src/components/Dialog/FormDialog.vue                                                      |   11 
 src/views/personnelManagement/monthlyStatistics/index.vue                                 |  266 ++++++++--
 15 files changed, 1,012 insertions(+), 383 deletions(-)

diff --git a/src/api/personnelManagement/bank.js b/src/api/personnelManagement/bank.js
new file mode 100644
index 0000000..5e83e27
--- /dev/null
+++ b/src/api/personnelManagement/bank.js
@@ -0,0 +1,34 @@
+import request from "@/utils/request";
+
+// 閾惰绠$悊
+export function bankList() {
+  return request({
+    url: "/bank/list",
+    method: "get",
+  });
+}
+
+export function bankAdd(data) {
+  return request({
+    url: "/bank/add",
+    method: "post",
+    data,
+  });
+}
+
+export function bankUpdate(data) {
+  return request({
+    url: "/bank/update",
+    method: "post",
+    data,
+  });
+}
+
+export function bankDelete(ids) {
+  return request({
+    url: "/bank/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
diff --git a/src/api/personnelManagement/socialSecuritySet.js b/src/api/personnelManagement/socialSecuritySet.js
index bea19cd..29637f0 100644
--- a/src/api/personnelManagement/socialSecuritySet.js
+++ b/src/api/personnelManagement/socialSecuritySet.js
@@ -4,7 +4,7 @@
 // 鍒嗛〉鏌ヨ鍒楄〃
 export function socialSecurityListPage(query) {
   return request({
-    url: "/socialSecurity/plan/listPage",
+    url: "/schemeApplicableStaff/listPage",
     method: "get",
     params: query,
   });
@@ -13,7 +13,7 @@
 // 鏌ヨ璇︽儏
 export function socialSecurityInfo(id) {
   return request({
-    url: "/socialSecurity/plan/" + id,
+    url: "/schemeApplicableStaff/" + id,
     method: "get",
   });
 }
@@ -21,7 +21,7 @@
 // 鏂板
 export function socialSecurityAdd(data) {
   return request({
-    url: "/socialSecurity/plan/add",
+    url: "/schemeApplicableStaff/add",
     method: "post",
     data,
   });
@@ -30,7 +30,7 @@
 // 淇敼
 export function socialSecurityUpdate(data) {
   return request({
-    url: "/socialSecurity/plan/update",
+    url: "/schemeApplicableStaff/updateSchemeApplicableStaff",
     method: "post",
     data,
   });
@@ -39,7 +39,7 @@
 // 鍒犻櫎
 export function socialSecurityDelete(ids) {
   return request({
-    url: "/socialSecurity/plan/delete",
+    url: "/schemeApplicableStaff/delete",
     method: "delete",
     data: ids,
   });
diff --git a/src/api/personnelManagement/staffSalaryMain.js b/src/api/personnelManagement/staffSalaryMain.js
new file mode 100644
index 0000000..a42f96b
--- /dev/null
+++ b/src/api/personnelManagement/staffSalaryMain.js
@@ -0,0 +1,43 @@
+import request from "@/utils/request";
+
+// 鍛樺伐宸ヨ祫涓昏〃
+export function staffSalaryMainListPage(params) {
+  return request({
+    url: "/staffSalaryMain/listPage",
+    method: "get",
+    params,
+  });
+}
+
+export function staffSalaryMainCalculateSalary(ids) {
+  return request({
+    url: "/staffSalaryMain/calculateSalary",
+    method: "post",
+    data: ids,
+  });
+}
+
+export function staffSalaryMainAdd(data) {
+  return request({
+    url: "/staffSalaryMain/add",
+    method: "post",
+    data,
+  });
+}
+
+export function staffSalaryMainUpdate(data) {
+  return request({
+    url: "/staffSalaryMain/update",
+    method: "post",
+    data,
+  });
+}
+
+export function staffSalaryMainDelete(ids) {
+  return request({
+    url: "/staffSalaryMain/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
diff --git a/src/components/Dialog/FormDialog.vue b/src/components/Dialog/FormDialog.vue
index 5e21b1d..1425b6d 100644
--- a/src/components/Dialog/FormDialog.vue
+++ b/src/components/Dialog/FormDialog.vue
@@ -8,7 +8,13 @@
     <slot></slot>
     <template #footer>
       <div class="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">纭</el-button>
+        <el-button
+          v-if="showConfirm"
+          type="primary"
+          @click="handleConfirm"
+        >
+          纭
+        </el-button>
         <el-button @click="handleCancel">鍙栨秷</el-button>
       </div>
     </template>
@@ -44,6 +50,9 @@
   set: (val) => emit('update:modelValue', val)
 })
 
+// 璇︽儏妯″紡涓嶅睍绀衡�滅‘璁も�濇寜閽紝鍏跺畠绫诲瀷姝e父鏄剧ず
+const showConfirm = computed(() => props.operationType !== 'detail')
+
 const computedTitle = computed(() => {
   if (typeof props.title === 'function') {
     return props.title(props.operationType)
diff --git a/src/views/personnelManagement/employeeRecord/components/BasicInfoSection.vue b/src/views/personnelManagement/employeeRecord/components/BasicInfoSection.vue
index 22ffb29..da58ea5 100644
--- a/src/views/personnelManagement/employeeRecord/components/BasicInfoSection.vue
+++ b/src/views/personnelManagement/employeeRecord/components/BasicInfoSection.vue
@@ -32,9 +32,9 @@
         </el-form-item>
       </el-col>
       <el-col :span="5">
-        <el-form-item label="鍒悕" prop="aliasName">
+        <el-form-item label="鍒悕" prop="alias">
           <el-input
-            v-model="form.aliasName"
+            v-model="form.alias"
             placeholder="璇疯緭鍏�"
             clearable
             maxlength="50"
@@ -135,10 +135,9 @@
 
     <el-row :gutter="24">
       <el-col :span="10">
-        <el-form-item label="瑙掕壊" prop="roleIds">
+        <el-form-item label="瑙掕壊" prop="roleId">
           <el-select
-            v-model="form.roleIds"
-            multiple
+            v-model="form.roleId"
             placeholder="璇烽�夋嫨"
             clearable
             style="width: 100%"
diff --git a/src/views/personnelManagement/employeeRecord/components/EducationWorkSection.vue b/src/views/personnelManagement/employeeRecord/components/EducationWorkSection.vue
index 10ed6ac..c1470e7 100644
--- a/src/views/personnelManagement/employeeRecord/components/EducationWorkSection.vue
+++ b/src/views/personnelManagement/employeeRecord/components/EducationWorkSection.vue
@@ -8,11 +8,11 @@
           鏁欒偛缁忓巻
         </span>
       </template>
-      <el-table :data="form.educationList" border>
-        <el-table-column label="瀛﹀巻" prop="degree" width="120">
+      <el-table :data="form.staffEducationList" border>
+        <el-table-column label="瀛﹀巻" prop="education" width="120">
           <template #default="{ row }">
             <el-select
-              v-model="row.degree"
+              v-model="row.education"
               placeholder="璇烽�夋嫨"
               clearable
               style="width: 100%"
@@ -25,10 +25,10 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column label="姣曚笟闄㈡牎" prop="school" min-width="160">
+        <el-table-column label="姣曚笟闄㈡牎" prop="schoolName" min-width="160">
           <template #default="{ row }">
             <el-input
-              v-model="row.school"
+              v-model="row.schoolName"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="30"
@@ -36,10 +36,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="鍏ュ鏃堕棿" prop="admissionDate" width="150">
+        <el-table-column label="鍏ュ鏃堕棿" prop="enrollTime" width="150">
           <template #default="{ row }">
             <el-date-picker
-              v-model="row.admissionDate"
+              v-model="row.enrollTime"
               type="date"
               value-format="YYYY-MM-DD"
               format="YYYY-MM-DD"
@@ -49,10 +49,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="姣曚笟鏃堕棿" prop="graduationDate" width="150">
+        <el-table-column label="姣曚笟鏃堕棿" prop="graduateTime" width="150">
           <template #default="{ row }">
             <el-date-picker
-              v-model="row.graduationDate"
+              v-model="row.graduateTime"
               type="date"
               value-format="YYYY-MM-DD"
               format="YYYY-MM-DD"
@@ -73,10 +73,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="瀛︿綅" prop="academicDegree" width="140">
+        <el-table-column label="瀛︿綅" prop="degree" width="140">
           <template #default="{ row }">
             <el-input
-              v-model="row.academicDegree"
+              v-model="row.degree"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="20"
@@ -87,7 +87,7 @@
         <el-table-column label="鎿嶄綔" width="80" align="center">
           <template #default="scope">
             <el-button
-              v-if="form.educationList.length > 1"
+              v-if="form.staffEducationList.length > 1"
               type="primary"
               link
               @click="removeEducationRow(scope.$index)"
@@ -108,11 +108,11 @@
           宸ヤ綔缁忓巻
         </span>
       </template>
-      <el-table :data="form.workExperienceList" border>
-        <el-table-column label="鍓嶅叕鍙�" prop="company" min-width="180">
+      <el-table :data="form.staffWorkExperienceList" border>
+        <el-table-column label="鍓嶅叕鍙�" prop="formerCompany" min-width="180">
           <template #default="{ row }">
             <el-input
-              v-model="row.company"
+              v-model="row.formerCompany"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="30"
@@ -120,10 +120,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="鍓嶅叕鍙搁儴闂�" prop="department" min-width="140">
+        <el-table-column label="鍓嶅叕鍙搁儴闂�" prop="formerDept" min-width="140">
           <template #default="{ row }">
             <el-input
-              v-model="row.department"
+              v-model="row.formerDept"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="20"
@@ -131,10 +131,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="鍓嶅叕鍙歌亴浣�" prop="position" min-width="140">
+        <el-table-column label="鍓嶅叕鍙歌亴浣�" prop="formerPosition" min-width="140">
           <template #default="{ row }">
             <el-input
-              v-model="row.position"
+              v-model="row.formerPosition"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="20"
@@ -168,10 +168,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="宸ヤ綔鎻忚堪" prop="description" min-width="220">
+        <el-table-column label="宸ヤ綔鎻忚堪" prop="workDesc" min-width="220">
           <template #default="{ row }">
             <el-input
-              v-model="row.description"
+              v-model="row.workDesc"
               type="textarea"
               :rows="2"
               placeholder="璇疯緭鍏�"
@@ -184,7 +184,7 @@
         <el-table-column label="鎿嶄綔" width="80" align="center">
           <template #default="scope">
             <el-button
-              v-if="form.workExperienceList.length > 1"
+              v-if="form.staffWorkExperienceList.length > 1"
               type="primary"
               link
               @click="removeWorkRow(scope.$index)"
@@ -211,35 +211,35 @@
 const { form } = toRefs(props);
 
 const addEducationRow = () => {
-  form.value.educationList.push({
-    degree: "",
-    school: "",
-    admissionDate: "",
-    graduationDate: "",
+  form.value.staffEducationList.push({
+    education: "",
+    schoolName: "",
+    enrollTime: "",
+    graduateTime: "",
     major: "",
-    academicDegree: "",
+    degree: "",
   });
 };
 
 const removeEducationRow = (index) => {
-  if (form.value.educationList.length <= 1) return;
-  form.value.educationList.splice(index, 1);
+  if (form.value.staffEducationList.length <= 1) return;
+  form.value.staffEducationList.splice(index, 1);
 };
 
 const addWorkRow = () => {
-  form.value.workExperienceList.push({
-    company: "",
-    department: "",
-    position: "",
+  form.value.staffWorkExperienceList.push({
+    formerCompany: "",
+    formerDept: "",
+    formerPosition: "",
     startDate: "",
     endDate: "",
-    description: "",
+    workDesc: "",
   });
 };
 
 const removeWorkRow = (index) => {
-  if (form.value.workExperienceList.length <= 1) return;
-  form.value.workExperienceList.splice(index, 1);
+  if (form.value.staffWorkExperienceList.length <= 1) return;
+  form.value.staffWorkExperienceList.splice(index, 1);
 };
 </script>
 
diff --git a/src/views/personnelManagement/employeeRecord/components/EmergencyAndAttachmentSection.vue b/src/views/personnelManagement/employeeRecord/components/EmergencyAndAttachmentSection.vue
index b57656b..99cf54d 100644
--- a/src/views/personnelManagement/employeeRecord/components/EmergencyAndAttachmentSection.vue
+++ b/src/views/personnelManagement/employeeRecord/components/EmergencyAndAttachmentSection.vue
@@ -8,11 +8,11 @@
           绱ф�ヨ仈绯讳汉
         </span>
       </template>
-      <el-table :data="form.emergencyContacts" border>
-        <el-table-column label="绱ф�ヨ仈绯讳汉濮撳悕" prop="name" min-width="160">
+      <el-table :data="form.staffEmergencyContactList" border>
+        <el-table-column label="绱ф�ヨ仈绯讳汉濮撳悕" prop="contactName" min-width="160">
           <template #default="{ row }">
             <el-input
-              v-model="row.name"
+              v-model="row.contactName"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="50"
@@ -20,10 +20,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="绱ф�ヨ仈绯讳汉鍏崇郴" prop="relation" min-width="140">
+        <el-table-column label="绱ф�ヨ仈绯讳汉鍏崇郴" prop="contactRelation" min-width="140">
           <template #default="{ row }">
             <el-input
-              v-model="row.relation"
+              v-model="row.contactRelation"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="20"
@@ -31,10 +31,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="绱ф�ヨ仈绯讳汉鎵嬫満" prop="phone" width="160">
+        <el-table-column label="绱ф�ヨ仈绯讳汉鎵嬫満" prop="contactPhone" width="160">
           <template #default="{ row }">
             <el-input
-              v-model="row.phone"
+              v-model="row.contactPhone"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="11"
@@ -42,10 +42,10 @@
             />
           </template>
         </el-table-column>
-        <el-table-column label="绱ф�ヨ仈绯讳汉浣忓潃" prop="address" min-width="220">
+        <el-table-column label="绱ф�ヨ仈绯讳汉浣忓潃" prop="contactAddress" min-width="220">
           <template #default="{ row }">
             <el-input
-              v-model="row.address"
+              v-model="row.contactAddress"
               placeholder="璇疯緭鍏�"
               clearable
               maxlength="50"
@@ -56,7 +56,7 @@
         <el-table-column label="鎿嶄綔" width="80" align="center">
           <template #default="scope">
             <el-button
-              v-if="form.emergencyContacts.length > 1"
+              v-if="form.staffEmergencyContactList.length > 1"
               type="primary"
               link
               @click="removeEmergencyRow(scope.$index)"
@@ -108,17 +108,17 @@
 const { form } = toRefs(props);
 
 const addEmergencyRow = () => {
-  form.value.emergencyContacts.push({
-    name: "",
-    relation: "",
-    phone: "",
-    address: "",
+  form.value.staffEmergencyContactList.push({
+    contactName: "",
+    contactRelation: "",
+    contactPhone: "",
+    contactAddress: "",
   });
 };
 
 const removeEmergencyRow = (index) => {
-  if (form.value.emergencyContacts.length <= 1) return;
-  form.value.emergencyContacts.splice(index, 1);
+  if (form.value.staffEmergencyContactList.length <= 1) return;
+  form.value.staffEmergencyContactList.splice(index, 1);
 };
 </script>
 
diff --git a/src/views/personnelManagement/employeeRecord/components/JobInfoSection.vue b/src/views/personnelManagement/employeeRecord/components/JobInfoSection.vue
index 6cd38e2..d3b8c4c 100644
--- a/src/views/personnelManagement/employeeRecord/components/JobInfoSection.vue
+++ b/src/views/personnelManagement/employeeRecord/components/JobInfoSection.vue
@@ -7,38 +7,12 @@
       </span>
     </template>
 
+    <!-- 绗竴琛岋細鍚堝悓寮�濮� / 鍚堝悓缁撴潫 / 璇曠敤鏈� / 杞 -->
     <el-row :gutter="24">
-      <el-col :span="5">
-        <el-form-item label="宸ュ彿" prop="jobNo">
-          <el-input
-            v-model="form.jobNo"
-            placeholder="璇疯緭鍏�"
-            clearable
-            maxlength="20"
-            show-word-limit
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="5">
-        <el-form-item label="鍛樺伐绫诲瀷" prop="staffType">
-          <el-select
-            v-model="form.staffType"
-            placeholder="璇烽�夋嫨"
-            clearable
-            style="width: 100%"
-          >
-            <el-option label="姝e紡鍛樺伐" value="official" />
-            <el-option label="璇曠敤鍛樺伐" value="probation" />
-            <el-option label="瀹炰範鐢�" value="intern" />
-            <el-option label="鍏艰亴" value="part_time" />
-            <el-option label="鍔冲姟/澶栧寘" value="outsourcing" />
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="5">
-        <el-form-item label="鍏ヨ亴鏃ユ湡" prop="entryDate">
+      <el-col :span="6">
+        <el-form-item label="鍏ヨ亴鏃ユ湡" prop="contractStartTime">
           <el-date-picker
-            v-model="form.entryDate"
+            v-model="form.contractStartTime"
             type="date"
             value-format="YYYY-MM-DD"
             format="YYYY-MM-DD"
@@ -48,10 +22,34 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="5">
+      <el-col :span="6">
+        <el-form-item
+          label="鍚堝悓缁撴潫鏃ユ湡"
+          prop="contractEndTime"
+          required
+          :rules="[
+            {
+              required: true,
+              message: '璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡',
+              trigger: 'change',
+            },
+          ]"
+        >
+          <el-date-picker
+            v-model="form.contractEndTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
         <el-form-item label="璇曠敤鏈燂紙鏈堬級" prop="probationPeriod">
           <el-input-number
-            v-model="form.probationPeriod"
+            v-model="form.proTerm"
             :min="0"
             :max="24"
             :precision="0"
@@ -60,10 +58,10 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="4">
-        <el-form-item label="杞鏃ユ湡" prop="regularDate">
+      <el-col :span="6">
+        <el-form-item label="杞鏃ユ湡" prop="positiveDate">
           <el-date-picker
-            v-model="form.regularDate"
+            v-model="form.positiveDate"
             type="date"
             value-format="YYYY-MM-DD"
             format="YYYY-MM-DD"
@@ -75,6 +73,7 @@
       </el-col>
     </el-row>
 
+    <!-- 绗簩琛岋細閮ㄩ棬 / 宀椾綅 / 鍩烘湰宸ヨ祫 -->
     <el-row :gutter="24">
       <el-col :span="8">
         <el-form-item label="閮ㄩ棬" prop="sysDeptId">
@@ -85,17 +84,6 @@
             :render-after-expand="false"
             placeholder="璇烽�夋嫨"
             style="width: 100%"
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="8">
-        <el-form-item label="鐩存帴涓婄骇" prop="directLeader">
-          <el-input
-            v-model="form.directLeader"
-            placeholder="璇疯緭鍏�"
-            clearable
-            maxlength="50"
-            show-word-limit
           />
         </el-form-item>
       </el-col>
@@ -117,21 +105,7 @@
           </el-select>
         </el-form-item>
       </el-col>
-    </el-row>
-
-    <el-row :gutter="24">
-      <el-col :span="5">
-        <el-form-item label="鑱岀骇" prop="jobLevel">
-          <el-input
-            v-model="form.jobLevel"
-            placeholder="璇疯緭鍏�"
-            clearable
-            maxlength="10"
-            show-word-limit
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="4">
+      <el-col :span="8">
         <el-form-item label="鍩烘湰宸ヨ祫" prop="basicSalary">
           <el-input-number
             v-model="form.basicSalary"
diff --git a/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
index 6c8a911..9bc48df 100644
--- a/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
+++ b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
@@ -67,28 +67,28 @@
   operationType.value === "add" ? "鏂板鍏ヨ亴" : "缂栬緫浜哄憳";
 
 const createEmptyEducation = () => ({
-  degree: "",
-  school: "",
-  admissionDate: "",
-  graduationDate: "",
+  education: "",
+  schoolName: "",
+  enrollTime: "",
+  graduateTime: "",
   major: "",
-  academicDegree: "",
+  degree: "",
 });
 
 const createEmptyWork = () => ({
-  company: "",
-  department: "",
-  position: "",
+  formerCompany: "",
+  formerDept: "",
+  formerPosition: "",
   startDate: "",
   endDate: "",
-  description: "",
+  workDesc: "",
 });
 
 const createEmptyEmergency = () => ({
-  name: "",
-  relation: "",
-  phone: "",
-  address: "",
+  contactName: "",
+  contactRelation: "",
+  contactPhone: "",
+  contactAddress: "",
 });
 
 const createDefaultForm = () => ({
@@ -96,7 +96,7 @@
   // 鍩烘湰淇℃伅
   staffNo: "",
   staffName: "",
-  aliasName: "",
+  alias: "",
   phone: "",
   sex: "",
   birthDate: "",
@@ -112,29 +112,24 @@
   email: "",
   currentAddress: "",
   // 鍦ㄨ亴淇℃伅
-  jobNo: "",
-  staffType: "",
-  entryDate: "",
-  probationPeriod: undefined,
-  regularDate: "",
+  contractStartTime: "",
+  contractEndTime: "",
+  proTerm: undefined,
+  positiveDate: "",
   sysDeptId: undefined,
-  directLeader: "",
   sysPostId: undefined,
-  jobLevel: "",
   basicSalary: undefined,
   // 閾惰鍗′俊鎭�
   bankName: "",
   bankCardNo: "",
   // 鏁欒偛缁忓巻
-  educationList: [createEmptyEducation()],
+  staffEducationList: [createEmptyEducation()],
   // 宸ヤ綔缁忓巻
-  workExperienceList: [createEmptyWork()],
+  staffWorkExperienceList: [createEmptyWork()],
   // 绱ф�ヨ仈绯讳汉
-  emergencyContacts: [createEmptyEmergency()],
-  emergencyContact: "",
-  emergencyContactPhone: "",
-  // 瑙掕壊
-  roleIds: [],
+  staffEmergencyContactList: [createEmptyEmergency()],
+  // 瑙掕壊锛堝崟閫夛級
+  roleId: undefined,
   // 鏉愭枡闄勪欢锛堜粎鍓嶇灞曠ず锛�
   attachments: [],
 });
@@ -149,25 +144,16 @@
     birthDate: [
       { required: true, message: "璇烽�夋嫨鍑虹敓鏃ユ湡", trigger: "change" },
     ],
-    jobNo: [{ required: true, message: "璇疯緭鍏ュ伐鍙�", trigger: "blur" }],
-    staffType: [
-      { required: true, message: "璇烽�夋嫨鍛樺伐绫诲瀷", trigger: "change" },
-    ],
-    entryDate: [
+    contractStartTime: [
       { required: true, message: "璇烽�夋嫨鍏ヨ亴鏃ユ湡", trigger: "change" },
+    ],
+    contractEndTime: [
+      { required: true, message: "璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡", trigger: "change" },
     ],
     sysDeptId: [
       { required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" },
     ],
-    roleIds: [
-      {
-        required: true,
-        type: "array",
-        min: 1,
-        message: "璇疯嚦灏戦�夋嫨涓�涓鑹�",
-        trigger: "change",
-      },
-    ],
+    roleId: [{ required: true, message: "璇烽�夋嫨瑙掕壊", trigger: "change" }],
   },
   postOptions: [],
   deptOptions: [],
@@ -215,12 +201,6 @@
   });
 }
 
-const syncEmergencyToLegacyField = () => {
-  const first = form.value.emergencyContacts?.[0];
-  form.value.emergencyContact = first?.name || "";
-  form.value.emergencyContactPhone = first?.phone || "";
-};
-
 const openDialog = (type, row) => {
   operationType.value = type;
   dialogFormVisible.value = true;
@@ -236,20 +216,23 @@
         ...form.value,
         ...d,
       });
-      if (!Array.isArray(form.value.educationList) || !form.value.educationList.length) {
-        form.value.educationList = [createEmptyEducation()];
+      if (
+        !Array.isArray(form.value.staffEducationList) ||
+        !form.value.staffEducationList.length
+      ) {
+        form.value.staffEducationList = [createEmptyEducation()];
       }
       if (
-        !Array.isArray(form.value.workExperienceList) ||
-        !form.value.workExperienceList.length
+        !Array.isArray(form.value.staffWorkExperienceList) ||
+        !form.value.staffWorkExperienceList.length
       ) {
-        form.value.workExperienceList = [createEmptyWork()];
+        form.value.staffWorkExperienceList = [createEmptyWork()];
       }
       if (
-        !Array.isArray(form.value.emergencyContacts) ||
-        !form.value.emergencyContacts.length
+        !Array.isArray(form.value.staffEmergencyContactList) ||
+        !form.value.staffEmergencyContactList.length
       ) {
-        form.value.emergencyContacts = [createEmptyEmergency()];
+        form.value.staffEmergencyContactList = [createEmptyEmergency()];
       }
       if (form.value.sysPostId === 0) {
         form.value.sysPostId = undefined;
@@ -273,7 +256,8 @@
   if (!form.value.sysDeptId) {
     form.value.sysDeptId = undefined;
   }
-  syncEmergencyToLegacyField();
+  // 鍏煎鍚庣鍙兘浠嶄娇鐢� roleIds 鏁扮粍
+  form.value.roleIds = form.value.roleId ? [form.value.roleId] : [];
   formRef.value?.validate((valid) => {
     if (valid) {
       if (operationType.value === "add") {
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
index 19addfa..e5f2e8b 100644
--- a/src/views/personnelManagement/employeeRecord/index.vue
+++ b/src/views/personnelManagement/employeeRecord/index.vue
@@ -102,67 +102,40 @@
     prop: "staffName",
   },
   {
+    label: "鍒悕",
+    prop: "alias",
+  },
+  {
+    label: "鎵嬫満",
+    prop: "phone",
+    width: 150,
+  },
+  {
     label: "鎬у埆",
     prop: "sex",
   },
   {
-    label: "鎴风睄浣忓潃",
-    prop: "nativePlace",
-  },
-  {
-    label: "閮ㄩ棬",
-    prop: "deptName",
-  },
-  {
-    label: "宀椾綅",
-    prop: "postJob",
-  },
-  {
-    label: "鐜颁綇鍧�",
-    prop: "adress",
-    width:200
-  },
-  {
-    label: "绗竴瀛﹀巻",
-    prop: "firstStudy",
-  },
-  {
-    label: "涓撲笟",
-    prop: "profession",
-    width:100
+    label: "鍑虹敓鏃ユ湡",
+    prop: "birthDate",
+    width: 120,
   },
   {
     label: "骞撮緞",
     prop: "age",
   },
   {
-    label: "鑱旂郴鐢佃瘽",
-    prop: "phone",
-    width:150
+    label: "绫嶈疮",
+    prop: "nativePlace",
   },
   {
-    label: "绱ф�ヨ仈绯讳汉",
-    prop: "emergencyContact",
-    width: 120
+    label: "姘戞棌",
+    prop: "nation",
+    width: 100,
   },
   {
-    label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
-    prop: "emergencyContactPhone",
-    width:150
-  },
-  // {
-  //   label: "鍚堝悓骞撮檺",
-  //   prop: "contractTerm",
-  // },
-  // {
-  //   label: "鍚堝悓寮�濮嬫棩鏈�",
-  //   prop: "contractStartTime",
-  //   width: 120
-  // },
-  {
-    label: "鍚堝悓缁撴潫鏃ユ湡",
-    prop: "contractExpireTime",
-    width: 120
+    label: "濠氬Щ鐘跺喌",
+    prop: "maritalStatus",
+    width: 100,
   },
   {
     dataType: "action",
diff --git a/src/views/personnelManagement/monthlyStatistics/components/bankSettingDia.vue b/src/views/personnelManagement/monthlyStatistics/components/bankSettingDia.vue
new file mode 100644
index 0000000..b5fad15
--- /dev/null
+++ b/src/views/personnelManagement/monthlyStatistics/components/bankSettingDia.vue
@@ -0,0 +1,188 @@
+<template>
+  <FormDialog
+    v-model="dialogVisible"
+    operation-type="edit"
+    title="璁剧疆鍙戞斁閾惰涓嬫媺鏁版嵁"
+    width="640px"
+    @close="handleClose"
+    @confirm="handleConfirm"
+    @cancel="handleCancel"
+  >
+    <el-form ref="formRef" :model="form" label-position="top">
+      <el-row :gutter="16">
+        <el-col :span="24" style="display: flex; justify-content: end; gap: 10px;margin-bottom: 10px">
+          <el-button type="primary" @click="addBank">鏂板閾惰</el-button>
+          <el-button @click="resetToEmpty">娓呯┖</el-button>
+        </el-col>
+      </el-row>
+
+      <el-table :data="form.banks" border style="width: 100%">
+        <el-table-column label="閾惰鍚嶇О" min-width="260">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.bankName"
+              placeholder="渚嬪锛氫腑鍥藉伐鍟嗛摱琛�"
+              clearable
+              maxlength="50"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="90" align="center">
+          <template #default="{ $index }">
+            <el-button type="danger" link @click="removeBank($index)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="margin-top: 10px; color: #909399; font-size: 12px">
+        鎻愮ず锛氳繖閲岀淮鎶ょ殑鏄�滃彂鏀鹃摱琛屸�濅笅鎷夋閫夐」鏁版嵁锛涗繚瀛樺悗鍦ㄦ柊寤�/缂栬緫宸ヨ祫琛ㄤ腑鍙�夋嫨銆�
+      </div>
+    </el-form>
+  </FormDialog>
+</template>
+
+<script setup>
+import { computed, reactive, ref, toRefs, watch, getCurrentInstance } from "vue";
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { bankAdd, bankDelete, bankList, bankUpdate } from "@/api/personnelManagement/bank.js";
+
+const emit = defineEmits(["update:modelValue", "close", "saved"]);
+const props = defineProps({
+  modelValue: { type: Boolean, default: false },
+});
+
+const { proxy } = getCurrentInstance();
+
+const dialogVisible = computed({
+  get: () => props.modelValue,
+  set: (val) => emit("update:modelValue", val),
+});
+
+const formRef = ref(null);
+
+const data = reactive({
+  form: {
+    banks: [],
+  },
+});
+
+const { form } = toRefs(data);
+
+function newKey() {
+  return Math.random().toString(36).slice(2);
+}
+
+const addBank = () => {
+  form.value.banks.push({
+    _key: newKey(),
+    id: undefined,
+    bankName: "",
+    _originBankName: "",
+  });
+};
+
+const removeBank = (index) => {
+  const row = form.value.banks?.[index];
+  if (!row) return;
+  // 鏈惤搴撶殑琛岋細鐩存帴绉婚櫎
+  if (!row.id) {
+    form.value.banks.splice(index, 1);
+    return;
+  }
+  // 宸茶惤搴擄細璋冪敤鍚庣鍒犻櫎
+  bankDelete([row.id]).then(() => {
+    proxy?.$modal?.msgSuccess?.("鍒犻櫎鎴愬姛");
+    form.value.banks.splice(index, 1);
+    emit("saved");
+  });
+};
+
+const resetToEmpty = () => {
+  if (!form.value.banks?.length) return;
+  const ids = form.value.banks.map((b) => b?.id).filter(Boolean);
+  // 鑻ュ叏閮ㄦ槸鏈繚瀛樿锛屽垯浠呮竻绌烘湰鍦�
+  if (!ids.length) {
+    form.value.banks = [];
+    return;
+  }
+  proxy?.$modal
+    ?.confirm?.("纭畾娓呯┖鎵�鏈夐摱琛屽悧锛�")
+    .then(() => bankDelete(ids))
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("娓呯┖鎴愬姛");
+      form.value.banks = [];
+      emit("saved");
+    })
+    .catch(() => {});
+};
+
+const loadSetting = () => {
+  return bankList().then((res) => {
+    const list = Array.isArray(res?.data) ? res.data : [];
+    form.value.banks = list.map((b) => ({
+      _key: newKey(),
+      id: b?.id,
+      bankName: b?.bankName ?? "",
+      _originBankName: b?.bankName ?? "",
+    }));
+  });
+};
+
+const openDialog = () => {
+  loadSetting();
+};
+
+watch(
+  () => dialogVisible.value,
+  (val) => {
+    if (val) openDialog();
+  }
+);
+
+const handleConfirm = () => {
+  const names = (form.value.banks || [])
+    .map((b) => (b?.bankName == null ? "" : String(b.bankName).trim()))
+    .filter((n) => n !== "");
+  const unique = Array.from(new Set(names));
+  if (!unique.length) {
+    proxy?.$modal?.msgWarning?.("璇疯嚦灏戞柊澧炰竴涓摱琛岄�夐」");
+    return;
+  }
+  if (unique.length !== names.length) {
+    proxy?.$modal?.msgWarning?.("閾惰鍚嶇О涓嶅彲閲嶅");
+    return;
+  }
+
+  const rows = form.value.banks.map((b) => ({
+    ...b,
+    bankName: b?.bankName == null ? "" : String(b.bankName).trim(),
+  }));
+
+  const toAdd = rows.filter((b) => !b.id && b.bankName);
+  const toUpdate = rows.filter((b) => b.id && b.bankName && b.bankName !== (b._originBankName ?? ""));
+
+  Promise.all([
+    ...toAdd.map((b) => bankAdd({ bankName: b.bankName })),
+    ...toUpdate.map((b) => bankUpdate({ id: b.id, bankName: b.bankName })),
+  ])
+    .then(() => loadSetting())
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("淇濆瓨鎴愬姛");
+      dialogVisible.value = false;
+      emit("saved", { options: unique });
+    });
+};
+
+const handleCancel = () => {
+  dialogVisible.value = false;
+};
+
+const handleClose = () => {
+  emit("close");
+};
+
+defineExpose({ openDialog });
+</script>
+
+<style scoped></style>
+
diff --git a/src/views/personnelManagement/monthlyStatistics/components/formDia.vue b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
index 0882ba4..eb6dea2 100644
--- a/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
+++ b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
@@ -17,9 +17,9 @@
         <el-form ref="formRef" :model="form" :rules="rules" label-position="top">
           <el-row :gutter="24">
             <el-col :span="6">
-              <el-form-item label="宸ヨ祫涓婚" prop="title">
+              <el-form-item label="宸ヨ祫涓婚" prop="salaryTitle">
                 <el-input
-                  v-model="form.title"
+                  v-model="form.salaryTitle"
                   placeholder="璇疯緭鍏�"
                   clearable
                   maxlength="20"
@@ -45,9 +45,9 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="閫夋嫨宸ヨ祫鏈堜唤" prop="payMonth">
+              <el-form-item label="閫夋嫨宸ヨ祫鏈堜唤" prop="salaryMonth">
                 <el-date-picker
-                  v-model="form.payMonth"
+                  v-model="form.salaryMonth"
                   type="month"
                   value-format="YYYY-MM"
                   format="YYYY-MM"
@@ -64,6 +64,26 @@
                   placeholder="璇疯緭鍏�"
                   clearable
                 />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="6">
+              <el-form-item label="鏀粯閾惰" prop="payBank">
+                <el-select
+                  v-model="form.payBank"
+                  placeholder="璇烽�夋嫨"
+                  clearable
+                  filterable
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="b in bankOptions"
+                    :key="b"
+                    :label="b"
+                    :value="b"
+                  />
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
@@ -92,7 +112,6 @@
         >
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="鍛樺伐濮撳悕" prop="staffName" minWidth="100" />
-          <el-table-column label="瑙掕壊" prop="roleName" minWidth="100" />
           <el-table-column label="閮ㄩ棬" prop="deptName" minWidth="100" />
           <el-table-column label="鍩烘湰宸ヨ祫" minWidth="110">
             <template #default="{ row }">
@@ -108,11 +127,11 @@
           <el-table-column label="璁′欢宸ヨ祫" minWidth="110">
             <template #default="{ row }">
               <el-input
-                v-model.number="row.pieceworkSalary"
+                v-model.number="row.pieceSalary"
                 type="number"
                 placeholder="0"
                 size="small"
-                @input="row.pieceworkSalary = parseNum(row.pieceworkSalary)"
+                @input="row.pieceSalary = parseNum(row.pieceSalary)"
               />
             </template>
           </el-table-column>
@@ -141,22 +160,22 @@
           <el-table-column label="绀句繚涓汉" minWidth="110">
             <template #default="{ row }">
               <el-input
-                v-model.number="row.socialSecurityIndividuals"
+                v-model.number="row.socialPersonal"
                 type="number"
                 placeholder="0"
                 size="small"
-                @input="row.socialSecurityIndividuals = parseNum(row.socialSecurityIndividuals)"
+                @input="row.socialPersonal = parseNum(row.socialPersonal)"
               />
             </template>
           </el-table-column>
           <el-table-column label="鍏Н閲戜釜浜�" minWidth="120">
             <template #default="{ row }">
               <el-input
-                v-model.number="row.providentFundIndividuals"
+                v-model.number="row.fundPersonal"
                 type="number"
                 placeholder="0"
                 size="small"
-                @input="row.providentFundIndividuals = parseNum(row.providentFundIndividuals)"
+                @input="row.fundPersonal = parseNum(row.fundPersonal)"
               />
             </template>
           </el-table-column>
@@ -238,11 +257,12 @@
 import { ArrowUp } from "@element-plus/icons-vue";
 import { listDept } from "@/api/system/dept.js";
 import { staffOnJobList } from "@/api/personnelManagement/monthlyStatistics.js";
+import { bankList } from "@/api/personnelManagement/bank.js";
 import {
-  monthlyStatisticsAdd,
-  monthlyStatisticsUpdate,
-  monthlyStatisticsGet,
-} from "@/api/personnelManagement/monthlyStatistics.js";
+  staffSalaryMainAdd,
+  staffSalaryMainUpdate,
+  staffSalaryMainCalculateSalary,
+} from "@/api/personnelManagement/staffSalaryMain.js";
 
 const emit = defineEmits(["update:modelValue", "close"]);
 const props = defineProps({
@@ -267,6 +287,7 @@
 const deptStaffTree = ref([]);
 const employeeList = ref([]);
 const selectedEmployees = ref([]);
+const bankOptions = ref([]);
 const taxTableData = ref([
   { level: 1, range: "涓嶈秴杩�36000鍏�", rate: 3, quickDeduction: 0 },
   { level: 2, range: "瓒呰繃36000-144000鍏�", rate: 10, quickDeduction: 2520 },
@@ -287,18 +308,28 @@
 const data = reactive({
   form: {
     id: undefined,
-    title: "",
+    salaryTitle: "",
     deptId: undefined,
-    payMonth: "",
+    salaryMonth: "",
     remark: "",
+    payBank: "",
   },
   rules: {
-    title: [{ required: true, message: "璇疯緭鍏ュ伐璧勪富棰�", trigger: "blur" }],
+    salaryTitle: [{ required: true, message: "璇疯緭鍏ュ伐璧勪富棰�", trigger: "blur" }],
     deptId: [{ required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" }],
-    payMonth: [{ required: true, message: "璇烽�夋嫨宸ヨ祫鏈堜唤", trigger: "change" }],
+    salaryMonth: [{ required: true, message: "璇烽�夋嫨宸ヨ祫鏈堜唤", trigger: "change" }],
   },
 });
 const { form, rules } = toRefs(data);
+
+const loadBankOptions = () => {
+  return bankList().then((res) => {
+    const list = Array.isArray(res?.data) ? res.data : [];
+    bankOptions.value = list
+      .map((b) => (b?.bankName == null ? "" : String(b.bankName).trim()))
+      .filter((v) => v !== "");
+  });
+};
 
 // 鎵佸钩鍖栭儴闂ㄦ爲渚涗笅鎷変娇鐢�
 function flattenDept(tree, list = []) {
@@ -358,32 +389,25 @@
 const openDialog = (type, row) => {
   nextTick(() => {
     loadDeptOptions();
+    loadBankOptions();
     employeeList.value = [];
     Object.assign(form.value, {
       id: undefined,
-      title: "",
+      salaryTitle: "",
       deptId: undefined,
-      payMonth: "",
+      salaryMonth: "",
       remark: "",
+      payBank: "",
     });
+    // 缂栬緫锛氬垪琛ㄩ〉宸茶繑鍥炰富琛ㄥ瓧娈碉紱杩欓噷鍙仛鍥炴樉锛堟槑缁嗙敱鈥滅敓鎴愬伐璧勮〃/璁$畻宸ヨ祫鈥濆緱鍒帮級
     if (type === "edit" && row?.id) {
-      monthlyStatisticsGet(row.id).then((res) => {
-        const d = res.data || {};
-        form.value.id = d.id;
-        form.value.title = d.title ?? d.payDateStr ?? "";
-        form.value.deptId = d.deptId;
-        form.value.payMonth = d.payMonth ?? d.payDate ?? d.payDateStr ?? "";
-        form.value.remark = d.remark ?? "";
-        employeeList.value = (d.detailList || d.employeeList || []).map((e) => ({
-          ...e,
-          basicSalary: parseNum(e.basicSalary),
-          pieceworkSalary: parseNum(e.pieceworkSalary),
-          hourlySalary: parseNum(e.hourlySalary),
-          otherIncome: parseNum(e.otherIncome),
-          socialSecurityIndividuals: parseNum(e.socialSecurityIndividuals),
-          providentFundIndividuals: parseNum(e.providentFundIndividuals),
-        }));
-      });
+      form.value.id = row.id;
+      form.value.salaryTitle = row.salaryTitle ?? "";
+      // deptIds 鍚庣鏄瓧绗︿覆锛堝涓敤閫楀彿鍒嗛殧锛夛紱褰撳墠琛ㄥ崟浠嶆槸鍗曢�� deptId
+      form.value.deptId = row.deptIds ? Number(String(row.deptIds).split(",")[0]) : undefined;
+      form.value.salaryMonth = row.salaryMonth ?? "";
+      form.value.remark = row.remark ?? "";
+      form.value.payBank = row.payBank ?? "";
     }
   });
 };
@@ -412,17 +436,23 @@
     if (existIds.has(id)) return;
     existIds.add(id);
     employeeList.value.push({
-      staffId: id,
-      id: id,
+      staffOnJobId: id,
+      id,
       staffName: node.label,
-      roleName: node.roleName ?? node.role ?? "",
+      postName: node.postName ?? node.post ?? "",
       deptName: node.deptName ?? "",
       basicSalary: 0,
-      pieceworkSalary: 0,
+      pieceSalary: 0,
       hourlySalary: 0,
       otherIncome: 0,
-      socialSecurityIndividuals: 0,
-      providentFundIndividuals: 0,
+      socialPersonal: 0,
+      fundPersonal: 0,
+      otherDeduct: 0,
+      salaryTax: 0,
+      grossSalary: 0,
+      deductSalary: 0,
+      netSalary: 0,
+      remark: "",
     });
   });
   addPersonVisible.value = false;
@@ -430,7 +460,7 @@
 
 const removeEmployee = (row) => {
   employeeList.value = employeeList.value.filter(
-    (e) => (e.staffId || e.id) !== (row.staffId || row.id)
+    (e) => (e.staffOnJobId || e.id) !== (row.staffOnJobId || row.id)
   );
 };
 
@@ -443,14 +473,55 @@
     proxy.$modal.msgWarning("璇峰厛鍕鹃�夎鍒犻櫎鐨勫憳宸�");
     return;
   }
-  const ids = new Set(selectedEmployees.value.map((e) => e.staffId || e.id));
+  const ids = new Set(selectedEmployees.value.map((e) => e.staffOnJobId || e.id));
   employeeList.value = employeeList.value.filter(
-    (e) => !ids.has(e.staffId || e.id)
+    (e) => !ids.has(e.staffOnJobId || e.id)
   );
 };
 
 const handleGenerate = () => {
-  proxy.$modal.msgInfo("鐢熸垚宸ヨ祫琛ㄥ姛鑳介渶瀵规帴鍚庣");
+  if (!form.value.deptId) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨閮ㄩ棬");
+    return;
+  }
+  if (!form.value.salaryMonth) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨宸ヨ祫鏈堜唤");
+    return;
+  }
+  if (!employeeList.value?.length) {
+    proxy.$modal.msgWarning("璇峰厛鏂板浜哄憳");
+    return;
+  }
+  const ids = employeeList.value
+    .map((e) => e.staffOnJobId ?? e.staffId ?? e.id)
+    .filter(Boolean);
+  staffSalaryMainCalculateSalary(ids).then((res) => {
+    const list = Array.isArray(res?.data) ? res.data : [];
+    if (!list.length) {
+      proxy.$modal.msgWarning("鏈绠楀埌宸ヨ祫鏁版嵁");
+      return;
+    }
+    employeeList.value = list.map((e) => ({
+      ...e,
+      staffOnJobId: e.staffOnJobId ?? e.staffId ?? e.id,
+      staffName: e.staffName,
+      postName: e.postName,
+      deptName: e.deptName,
+      basicSalary: parseNum(e.basicSalary),
+      pieceSalary: parseNum(e.pieceSalary),
+      hourlySalary: parseNum(e.hourlySalary),
+      otherIncome: parseNum(e.otherIncome),
+      socialPersonal: parseNum(e.socialPersonal),
+      fundPersonal: parseNum(e.fundPersonal),
+      otherDeduct: parseNum(e.otherDeduct),
+      salaryTax: parseNum(e.salaryTax),
+      grossSalary: parseNum(e.grossSalary),
+      deductSalary: parseNum(e.deductSalary),
+      netSalary: parseNum(e.netSalary),
+      remark: e.remark ?? "",
+    }));
+    proxy.$modal.msgSuccess("鐢熸垚鎴愬姛");
+  });
 };
 
 const handleExport = () => {
@@ -476,24 +547,31 @@
     if (!valid) return;
     const payload = {
       ...form.value,
+      deptIds: form.value.deptId ? String(form.value.deptId) : "",
       detailList: employeeList.value.map((e) => ({
-        staffId: e.staffId ?? e.id,
+        staffOnJobId: e.staffOnJobId ?? e.staffId ?? e.id,
         staffName: e.staffName,
         basicSalary: parseNum(e.basicSalary),
-        pieceworkSalary: parseNum(e.pieceworkSalary),
+        pieceSalary: parseNum(e.pieceSalary),
         hourlySalary: parseNum(e.hourlySalary),
         otherIncome: parseNum(e.otherIncome),
-        socialSecurityIndividuals: parseNum(e.socialSecurityIndividuals),
-        providentFundIndividuals: parseNum(e.providentFundIndividuals),
+        socialPersonal: parseNum(e.socialPersonal),
+        fundPersonal: parseNum(e.fundPersonal),
+        otherDeduct: parseNum(e.otherDeduct),
+        salaryTax: parseNum(e.salaryTax),
+        grossSalary: parseNum(e.grossSalary),
+        deductSalary: parseNum(e.deductSalary),
+        netSalary: parseNum(e.netSalary),
+        remark: e.remark ?? "",
       })),
     };
     if (props.operationType === "add") {
-      monthlyStatisticsAdd(payload).then(() => {
+      staffSalaryMainAdd({ ...payload, status: 1 }).then(() => {
         proxy.$modal.msgSuccess("鏂板鎴愬姛");
         closeDia();
       });
     } else {
-      monthlyStatisticsUpdate(payload).then(() => {
+      staffSalaryMainUpdate(payload).then(() => {
         proxy.$modal.msgSuccess("淇敼鎴愬姛");
         closeDia();
       });
diff --git a/src/views/personnelManagement/monthlyStatistics/index.vue b/src/views/personnelManagement/monthlyStatistics/index.vue
index f576ad1..40d450b 100644
--- a/src/views/personnelManagement/monthlyStatistics/index.vue
+++ b/src/views/personnelManagement/monthlyStatistics/index.vue
@@ -10,20 +10,17 @@
           clearable
           @keyup.enter="handleQuery"
         />
-        <span class="search_title ml10">鍗曟嵁鐘舵�侊細</span>
-        <el-select
-          v-model="searchForm.documentStatus"
-          placeholder="璇烽�夋嫨鍗曟嵁鐘舵��"
-          clearable
-          style="width: 180px"
-        >
-          <el-option label="鑽夌" value="draft" />
-          <el-option label="宸叉彁浜�" value="submitted" />
-          <el-option label="宸插鏍�" value="approved" />
+        <span class="search_title ml10">鐘舵�侊細</span>
+        <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 180px">
+          <el-option label="鑽夌" :value="1" />
+          <el-option label="瀹℃牳鏈�氳繃" :value="2" />
+          <el-option label="寰呭鏍�" :value="3" />
+          <el-option label="寰呭彂鏀�" :value="4" />
+          <el-option label="宸插彂鏀�" :value="5" />
         </el-select>
         <span class="search_title ml10">宸ヨ祫鏈堜唤锛�</span>
         <el-date-picker
-          v-model="searchForm.payMonth"
+          v-model="searchForm.salaryMonth"
           type="month"
           value-format="YYYY-MM"
           format="YYYY-MM"
@@ -32,17 +29,6 @@
           clearable
           @change="handleQuery"
         />
-        <span class="search_title ml10">瀹℃牳鐘舵�侊細</span>
-        <el-select
-          v-model="searchForm.approvalStatus"
-          placeholder="璇烽�夋嫨瀹℃牳鐘舵��"
-          clearable
-          style="width: 180px"
-        >
-          <el-option label="寰呭鏍�" value="pending" />
-          <el-option label="宸查�氳繃" value="passed" />
-          <el-option label="宸查┏鍥�" value="rejected" />
-        </el-select>
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
           鎼滅储
         </el-button>
@@ -53,6 +39,7 @@
       <div style="margin-bottom: 10px">
         <el-button type="primary" @click="openForm('add')">鏂板缓宸ヨ祫琛�</el-button>
         <el-button @click="handleDelete">鍒犻櫎</el-button>
+        <el-button @click="openBankSetting">璁剧疆閾惰</el-button>
         <el-button @click="handleExport">瀵煎嚭</el-button>
       </div>
       <PIMTable
@@ -74,12 +61,55 @@
       ref="formDiaRef"
       @close="handleQuery"
     />
+    <bank-setting-dia
+      v-model="bankDialogVisible"
+      ref="bankDiaRef"
+      @saved="handleBankSaved"
+    />
+    <el-dialog v-model="issueDialogVisible" title="宸ヨ祫鍙戞斁" width="720px">
+      <el-form label-position="top">
+        <el-form-item label="鍙戞斁閾惰" required>
+          <el-select
+            v-model="issueForm.bank"
+            placeholder="璇烽�夋嫨鍙戞斁閾惰"
+            clearable
+            filterable
+            style="width: 100%"
+          >
+            <el-option v-for="b in issueBankOptions" :key="b" :label="b" :value="b" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="issueDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="issueLoading" @click="confirmIssue">
+          纭畾
+        </el-button>
+      </template>
+    </el-dialog>
+    <el-dialog v-model="auditDialogVisible" title="宸ヨ祫瀹℃牳" width="720px">
+      <el-form label-position="top">
+        <el-form-item label="瀹℃牳缁撴灉" required>
+          <el-radio-group v-model="auditForm.result">
+            <el-radio :value="4">閫氳繃</el-radio>
+            <el-radio :value="2">涓嶉�氳繃</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="auditDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="auditLoading" @click="confirmAudit">
+          纭畾
+        </el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
 import {
   onMounted,
+  computed,
   ref,
   reactive,
   toRefs,
@@ -87,44 +117,58 @@
   nextTick,
 } from "vue";
 import { ElMessageBox } from "element-plus";
+import Cookies from "js-cookie";
 import FormDia from "./components/formDia.vue";
+import BankSettingDia from "./components/bankSettingDia.vue";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
+import { bankList } from "@/api/personnelManagement/bank.js";
 import {
-  monthlyStatisticsListPage,
-  monthlyStatisticsDelete,
-} from "@/api/personnelManagement/monthlyStatistics.js";
+  staffSalaryMainListPage,
+  staffSalaryMainDelete,
+  staffSalaryMainUpdate,
+} from "@/api/personnelManagement/staffSalaryMain.js";
 
 const data = reactive({
   searchForm: {
     title: "",
-    documentStatus: "",
-    payMonth: "",
-    approvalStatus: "",
+    status: "",
+    salaryMonth: "",
   },
 });
 const { searchForm } = toRefs(data);
 
 const tableColumn = ref([
-  { label: "宸ヨ祫涓婚", prop: "title", minWidth: 140 },
-  { label: "宸ヨ祫鏈堜唤", prop: "payMonth", width: 120 },
-  { label: "鍗曟嵁鐘舵��", prop: "documentStatusName", width: 100 },
-  { label: "瀹℃牳鐘舵��", prop: "approvalStatusName", width: 100 },
-  { label: "宸ヨ祫鎬婚", prop: "totalAmount", width: 120 },
-  { label: "鏀粯閾惰", prop: "paymentBank", width: 120 },
-  { label: "鍙戞斁鏃堕棿", prop: "issueTime", width: 160 },
-  { label: "瀹℃壒浜哄憳", prop: "approver", width: 100 },
+  { label: "宸ヨ祫涓婚", prop: "salaryTitle", minWidth: 140 },
+  { label: "宸ヨ祫鏈堜唤", prop: "salaryMonth", width: 120 },
+  { label: "鐘舵��", prop: "statusName", width: 110 },
+  { label: "宸ヨ祫鎬婚", prop: "totalSalary", width: 120 },
+  { label: "鏀粯閾惰", prop: "payBank", width: 120 },
+  { label: "瀹℃牳浜�", prop: "auditUserName", width: 110 },
   { label: "澶囨敞", prop: "remark", minWidth: 120 },
   {
     dataType: "action",
     label: "鎿嶄綔",
     align: "center",
     fixed: "right",
-    width: 120,
+    width: 180,
     operation: [
       {
         name: "缂栬緫",
         type: "text",
+        showHide: (row) => Number(row?.status) === 1 || Number(row?.status) === 2,
         clickFun: (row) => openForm("edit", row),
+      },
+      {
+        name: "瀹℃牳",
+        type: "text",
+        showHide: (row) => Number(row?.status) === 3,
+        clickFun: (row) => openAudit(row),
+      },
+      {
+        name: "鍙戞斁",
+        type: "text",
+        showHide: (row) => Number(row?.status) === 4,
+        clickFun: (row) => openIssue(row),
       },
     ],
   },
@@ -143,6 +187,47 @@
 const operationType = ref("add");
 const currentRow = ref({});
 const { proxy } = getCurrentInstance();
+const bankSetting = ref({});
+const bankDialogVisible = ref(false);
+const bankDiaRef = ref(null);
+const issueDialogVisible = ref(false);
+const issueLoading = ref(false);
+const issueRow = ref(null);
+const issueForm = reactive({ bank: "" });
+const auditDialogVisible = ref(false);
+const auditLoading = ref(false);
+const auditRow = ref(null);
+const auditForm = reactive({ result: 4 }); // 4=閫氳繃(寰呭彂鏀�) 2=涓嶉�氳繃
+
+const issueBankOptions = computed(() => {
+  const options = Array.isArray(bankSetting.value?.options) ? bankSetting.value.options : [];
+  return options
+    .map((v) => (v == null ? "" : String(v).trim()))
+    .filter((v) => v !== "");
+});
+
+const statusName = (s) => {
+  const n = Number(s);
+  return (
+    {
+      1: "鑽夌",
+      2: "瀹℃牳鏈�氳繃",
+      3: "寰呭鏍�",
+      4: "寰呭彂鏀�",
+      5: "宸插彂鏀�",
+    }[n] || "-"
+  );
+};
+
+const loadBankSetting = () => {
+  return bankList().then((res) => {
+    const list = Array.isArray(res?.data) ? res.data : [];
+    const options = list
+      .map((b) => (b?.bankName == null ? "" : String(b.bankName).trim()))
+      .filter((v) => v !== "");
+    bankSetting.value = { options, defaultBank: "" };
+  });
+};
 
 const handleQuery = () => {
   page.current = 1;
@@ -151,9 +236,8 @@
 
 const handleReset = () => {
   searchForm.value.title = "";
-  searchForm.value.documentStatus = "";
-  searchForm.value.payMonth = "";
-  searchForm.value.approvalStatus = "";
+  searchForm.value.status = "";
+  searchForm.value.salaryMonth = "";
   page.current = 1;
   getList();
 };
@@ -166,27 +250,25 @@
 
 const getList = () => {
   tableLoading.value = true;
-  monthlyStatisticsListPage({
+  staffSalaryMainListPage({
     ...searchForm.value,
     current: page.current,
     size: page.size,
   })
     .then((res) => {
       tableLoading.value = false;
-      const records = res.data?.records ?? [];
+      const records = res.data?.records ?? res.data?.list ?? [];
       // 鍏煎鍚庣瀛楁锛氳嫢鎺ュ彛浠嶈繑鍥炲彴璐︾粨鏋勶紝鍙湪姝ゅ仛鏄犲皠
       tableData.value = records.map((item) => ({
         ...item,
-        title: item.title ?? item.payDateStr ?? "-",
-        payMonth: item.payMonth ?? item.payDateStr ?? item.payDate ?? "-",
-        documentStatusName: item.documentStatusName ?? "-",
-        approvalStatusName: item.approvalStatusName ?? "-",
-        totalAmount: item.totalAmount ?? item.actualWages ?? "-",
-        paymentBank: item.paymentBank ?? "-",
-        issueTime: item.issueTime ?? item.createTime ?? "-",
-        approver: item.approver ?? "-",
+        salaryTitle: item.salaryTitle ?? "-",
+        salaryMonth: item.salaryMonth ?? "-",
+        statusName: statusName(item.status),
+        totalSalary: item.totalSalary ?? "-",
+        payBank: (item.payBank == null ? "" : String(item.payBank).trim()) || "-",
+        auditUserName: item.auditUserName ?? "-",
       }));
-      page.total = res.data?.total ?? 0;
+      page.total = res.data?.total ?? res.data?.count ?? 0;
     })
     .catch(() => {
       tableLoading.value = false;
@@ -206,6 +288,85 @@
   });
 };
 
+const openBankSetting = () => {
+  bankDialogVisible.value = true;
+};
+
+const openAudit = (row) => {
+  auditRow.value = row || null;
+  auditForm.result = 4;
+  auditDialogVisible.value = true;
+};
+
+const openIssue = (row) => {
+  if (!issueBankOptions.value?.length) {
+    proxy?.$modal?.msgWarning?.("璇峰厛鍦ㄢ�滆缃摱琛屸�濅腑缁存姢鍙戞斁閾惰閫夐」");
+    return;
+  }
+  issueRow.value = row || null;
+  const current = row?.payBank && row.payBank !== "-" ? String(row.payBank).trim() : "";
+  issueForm.bank = current;
+  issueDialogVisible.value = true;
+};
+
+const confirmAudit = () => {
+  const row = auditRow.value;
+  if (!row?.id) {
+    auditDialogVisible.value = false;
+    return;
+  }
+  const username = Cookies.get("username") || "";
+  const userIdRaw = Cookies.get("userId");
+  const auditUserId = userIdRaw ? Number(userIdRaw) : undefined;
+  auditLoading.value = true;
+  staffSalaryMainUpdate({
+    id: row.id,
+    status: Number(auditForm.result) === 2 ? 2 : 4,
+    auditUserId,
+    auditUserName: username,
+  })
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("瀹℃牳鎴愬姛");
+      auditDialogVisible.value = false;
+      getList();
+    })
+    .finally(() => {
+      auditLoading.value = false;
+    });
+};
+
+const confirmIssue = () => {
+  const bank = issueForm.bank ? String(issueForm.bank).trim() : "";
+  if (!bank) {
+    proxy?.$modal?.msgWarning?.("璇烽�夋嫨鍙戞斁閾惰");
+    return;
+  }
+  const row = issueRow.value;
+  if (!row?.id) {
+    issueDialogVisible.value = false;
+    return;
+  }
+  issueLoading.value = true;
+  staffSalaryMainUpdate({
+    id: row.id,
+    payBank: bank,
+    status: 5,
+  })
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("鍙戞斁鎴愬姛");
+      issueDialogVisible.value = false;
+      getList();
+    })
+    .finally(() => {
+      issueLoading.value = false;
+    });
+};
+
+const handleBankSaved = () => {
+  loadBankSetting();
+  getList();
+};
+
 const handleDelete = () => {
   if (!selectedRows.value?.length) {
     proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
@@ -218,7 +379,7 @@
     type: "warning",
   })
     .then(() => {
-      monthlyStatisticsDelete(ids).then(() => {
+      staffSalaryMainDelete(ids).then(() => {
         proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
         getList();
       });
@@ -235,6 +396,7 @@
 };
 
 onMounted(() => {
+  loadBankSetting();
   getList();
 });
 </script>
diff --git a/src/views/personnelManagement/socialSecuritySet/components/formDia.vue b/src/views/personnelManagement/socialSecuritySet/components/formDia.vue
index 3feab2d..c473f17 100644
--- a/src/views/personnelManagement/socialSecuritySet/components/formDia.vue
+++ b/src/views/personnelManagement/socialSecuritySet/components/formDia.vue
@@ -15,7 +15,10 @@
           <el-col :span="8">
             <el-form-item label="閫傜敤浜哄憳锛�" prop="deptIds">
               <div class="dept-checkbox-wrap">
-                <el-checkbox-group v-model="form.deptIds">
+                <el-checkbox-group
+                  v-model="form.deptIds"
+                  :disabled="isDetail"
+                >
                   <div
                     v-for="dept in deptList"
                     :key="dept.deptId"
@@ -41,7 +44,12 @@
                 <el-icon class="card-collapse"><ArrowUp /></el-icon>
               </template>
               <el-form-item label="鏂规鏍囬锛�" prop="title">
-                <el-input v-model="form.title" placeholder="璇疯緭鍏�" clearable />
+                <el-input
+                  v-model="form.title"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  :disabled="isDetail"
+                />
               </el-form-item>
               <el-form-item label="澶囨敞锛�" prop="remark">
                 <el-input
@@ -50,6 +58,7 @@
                   :rows="2"
                   placeholder="璇疯緭鍏�"
                   clearable
+                  :disabled="isDetail"
                 />
               </el-form-item>
             </el-card>
@@ -58,7 +67,12 @@
             <el-card class="form-card" shadow="never">
               <template #header>
                 <span class="card-title"><span class="card-title-line">|</span> 淇濋櫓绫诲瀷</span>
-                <el-button type="primary" size="small" @click="addInsuranceBenefit">
+                <el-button
+                  v-if="!isDetail"
+                  type="primary"
+                  size="small"
+                  @click="addInsuranceBenefit"
+                >
                   娣诲姞淇濋櫓绂忓埄
                 </el-button>
               </template>
@@ -72,7 +86,7 @@
                     <div class="insurance-benefit-title">
                       淇濋櫓绂忓埄{{ index + 1 }}
                       <el-button
-                        v-if="form.insuranceBenefits.length > 1"
+                        v-if="!isDetail && form.insuranceBenefits.length > 1"
                         type="danger"
                         link
                         size="small"
@@ -92,6 +106,7 @@
                         placeholder="璇烽�夋嫨"
                         clearable
                         style="width: 100%"
+                        :disabled="isDetail"
                       >
                         <el-option
                           v-for="opt in insuranceTypeOptions"
@@ -102,9 +117,23 @@
                       </el-select>
                     </el-form-item>
                     <el-form-item label="缂磋垂鍩烘暟锛�" label-width="100px">
-                      <div class="checkbox-group-inline">
-                        <el-checkbox v-model="item.baseOnSalary">鏍规嵁鍩烘湰宸ヨ祫缂寸撼</el-checkbox>
-                        <el-checkbox v-model="item.useBasicSalary">璋冪敤鍩烘湰宸ヨ祫</el-checkbox>
+                      <div class="base-salary-wrap">
+                        <el-input
+                          v-model="item.paymentBase"
+                          placeholder="鏍规嵁鍩烘湰宸ヨ祫缂寸撼"
+                          clearable
+                          style="width: 120px"
+                          type="number"
+                          :disabled="isDetail || item.useBasicSalary"
+                          @input="handlePaymentBaseInput(item)"
+                        />
+                        <el-checkbox
+                          v-model="item.useBasicSalary"
+                          @change="handleUseBasicSalaryChange(item)"
+                          :disabled="isDetail"
+                        >
+                          璋冪敤鍩烘湰宸ヨ祫
+                        </el-checkbox>
                       </div>
                     </el-form-item>
                     <el-form-item label="涓汉缂磋垂姣斾緥锛�" label-width="100px">
@@ -115,6 +144,7 @@
                           clearable
                           style="width: 100px"
                           type="number"
+                          :disabled="isDetail"
                         />
                         <span class="ratio-unit">(%)</span>
                         <span class="ratio-plus">+</span>
@@ -124,6 +154,7 @@
                           clearable
                           style="width: 100px"
                           type="number"
+                          :disabled="isDetail"
                         />
                       </div>
                     </el-form-item>
@@ -139,15 +170,11 @@
 </template>
 
 <script setup>
-import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { ref, reactive, toRefs, getCurrentInstance, nextTick, computed } from "vue";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import { ArrowUp } from "@element-plus/icons-vue";
 import { listDept } from "@/api/system/dept.js";
-import {
-  socialSecurityInfo,
-  socialSecurityAdd,
-  socialSecurityUpdate,
-} from "@/api/personnelManagement/socialSecuritySet.js";
+import { socialSecurityAdd, socialSecurityUpdate } from "@/api/personnelManagement/socialSecuritySet.js";
 
 const emit = defineEmits(["close"]);
 const { proxy } = getCurrentInstance();
@@ -157,22 +184,28 @@
 const formRef = ref(null);
 const deptList = ref([]);
 
+const isDetail = computed(() => operationType.value === "detail");
+
 const dialogTitle = () =>
-  operationType.value === "add" ? "鏂板鏂规" : "缂栬緫鏂规";
+  operationType.value === "add"
+    ? "鏂板鏂规"
+    : operationType.value === "edit"
+    ? "缂栬緫鏂规"
+    : "鏂规璇︽儏";
 
 // 淇濋櫓绫诲瀷閫夐」锛堝彲鎸夊瓧鍏告浛鎹級
 const insuranceTypeOptions = [
-  { label: "鍏昏�佷繚闄�", value: "pension" },
-  { label: "鍖荤枟淇濋櫓", value: "medical" },
-  { label: "澶变笟淇濋櫓", value: "unemployment" },
-  { label: "宸ヤ激淇濋櫓", value: "work_injury" },
-  { label: "鐢熻偛淇濋櫓", value: "maternity" },
+  { label: "鍏昏�佷繚闄�", value: "鍏昏�佷繚闄�" },
+  { label: "鍖荤枟淇濋櫓", value: "鍖荤枟淇濋櫓" },
+  { label: "澶变笟淇濋櫓", value: "澶变笟淇濋櫓" },
+  { label: "宸ヤ激淇濋櫓", value: "宸ヤ激淇濋櫓" },
+  { label: "鐢熻偛淇濋櫓", value: "鐢熻偛淇濋櫓" },
 ];
 
 const defaultBenefit = () => ({
   _key: Math.random().toString(36).slice(2),
   insuranceType: "",
-  baseOnSalary: false,
+  paymentBase: "",
   useBasicSalary: false,
   personalRatio: "",
   personalFixed: "",
@@ -231,6 +264,18 @@
   form.value.insuranceBenefits.splice(index, 1);
 };
 
+const handleUseBasicSalaryChange = (item) => {
+  if (item.useBasicSalary) {
+    item.paymentBase = "";
+  }
+};
+
+const handlePaymentBaseInput = (item) => {
+  if (item.paymentBase !== "" && item.paymentBase != null) {
+    item.useBasicSalary = false;
+  }
+};
+
 const resetForm = () => {
   form.value = {
     id: undefined,
@@ -246,32 +291,77 @@
   dialogFormVisible.value = true;
   loadDeptList();
   resetForm();
-  if (type === "edit" && row?.id) {
-    socialSecurityInfo(row.id).then((res) => {
-      const d = res.data || {};
-      form.value.id = d.id;
-      form.value.title = d.title;
-      form.value.remark = d.remark ?? "";
-      form.value.deptIds = d.deptIds ?? [];
-      form.value.insuranceBenefits =
-        (d.insuranceBenefits && d.insuranceBenefits.length)
-          ? d.insuranceBenefits.map((b) => ({
-              ...b,
-              _key: b._key || Math.random().toString(36).slice(2),
-            }))
-          : [defaultBenefit()];
-    });
+  if ((type === "edit" || type === "detail") && row) {
+    const d = row || {};
+    form.value.id = d.id;
+    form.value.title = d.title;
+    form.value.remark = d.remark ?? "";
+    // deptIds 鍚庣鍙兘鏄�楀彿鍒嗛殧瀛楃涓叉垨鏁扮粍锛岃繖閲岀粺涓�杞负鏁扮粍骞跺敖閲忚繕鍘熸暟鍊肩被鍨�
+    if (d.deptIds) {
+      form.value.deptIds = String(d.deptIds)
+        .split(",")
+        .filter((v) => v !== "")
+        .map((v) => {
+          const num = Number(v);
+          return Number.isNaN(num) ? v : num;
+        });
+    } else {
+      form.value.deptIds = [];
+    }
+    const detailList = d.schemeInsuranceDetailList || [];
+    form.value.insuranceBenefits =
+      detailList.length > 0
+        ? detailList.map((b) => ({
+            _key: Math.random().toString(36).slice(2),
+            insuranceType: b.insuranceType || "",
+            paymentBase: b.paymentBase ?? "",
+            useBasicSalary: b.useBasicSalary === 2,
+            personalRatio: b.personalRatio ?? "",
+            personalFixed: b.personalFixed ?? "",
+          }))
+        : [defaultBenefit()];
   }
 };
 
 const submitForm = () => {
+  // 璇︽儏妯″紡涓嬩笉鎻愪氦锛屽彧鍏抽棴寮圭獥
+  if (operationType.value === "detail") {
+    closeDia();
+    return;
+  }
   formRef.value?.validate((valid) => {
     if (!valid) return;
+    const deptIds =
+      Array.isArray(form.value.deptIds) && form.value.deptIds.length
+        ? form.value.deptIds.join(",")
+        : "";
+    const schemeInsuranceDetailList = (form.value.insuranceBenefits || []).map(
+      ({ _key, ...rest }) => ({
+        ...rest,
+        useBasicSalary: rest.useBasicSalary ? 2 : 1,
+      })
+    );
+    const insuranceTypes = schemeInsuranceDetailList
+      .map((item) => item.insuranceType)
+      .filter((v) => v)
+      .join(",");
+    // 閮ㄩ棬鍚嶇О锛屽涓娇鐢ㄩ�楀彿闅斿紑锛堟牴鎹�変腑鐨� deptIds 涓� deptList 璁$畻锛�
+    const deptNames = (deptList.value || [])
+      .filter((d) =>
+        (form.value.deptIds || []).some(
+          (id) => String(id) === String(d.deptId)
+        )
+      )
+      .map((d) => d.deptName)
+      .join(",");
     const submitData = {
-      ...form.value,
-      insuranceBenefits: form.value.insuranceBenefits.map(
-        ({ _key, ...rest }) => rest
-      ),
+      id: form.value.id,
+      title: form.value.title,
+      remark: form.value.remark ?? "",
+      deptIds,
+      insuranceTypes,
+      deptNames,
+      schemeInsuranceDetailList,
     };
     if (operationType.value === "add") {
       socialSecurityAdd(submitData).then(() => {
@@ -356,6 +446,16 @@
   flex-wrap: wrap;
   gap: 16px;
 }
+.base-salary-wrap {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 8px;
+}
+.base-salary-text {
+  color: #606266;
+  font-size: 14px;
+}
 .personal-ratio-wrap {
   display: flex;
   align-items: center;
diff --git a/src/views/personnelManagement/socialSecuritySet/index.vue b/src/views/personnelManagement/socialSecuritySet/index.vue
index 3c66656..2a1ff65 100644
--- a/src/views/personnelManagement/socialSecuritySet/index.vue
+++ b/src/views/personnelManagement/socialSecuritySet/index.vue
@@ -17,8 +17,15 @@
       </div>
     </div>
     <div class="table_list">
-      <div style="margin-bottom: 10px">
+      <div style="margin-bottom: 10px; display: flex; gap: 10px">
         <el-button type="primary" @click="openForm('add')">鏂板鏂规</el-button>
+        <el-button
+          type="danger"
+          @click="handleBatchDelete"
+          :disabled="selectedRows.length === 0"
+        >
+          鎵归噺鍒犻櫎
+        </el-button>
       </div>
       <PIMTable
         rowKey="id"
@@ -26,8 +33,10 @@
         :tableData="tableData"
         :page="page"
         :tableLoading="tableLoading"
-        @pagination="pagination"
         :total="page.total"
+        :isSelection="true"
+        @selection-change="handleSelectionChange"
+        @pagination="pagination"
       />
     </div>
     <form-dia ref="formDiaRef" @close="handleQuery" />
@@ -36,9 +45,13 @@
 
 <script setup>
 import { onMounted, ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
 import FormDia from "./components/formDia.vue";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import { socialSecurityListPage } from "@/api/personnelManagement/socialSecuritySet.js";
+import {
+  socialSecurityListPage,
+  socialSecurityDelete,
+} from "@/api/personnelManagement/socialSecuritySet.js";
 
 const data = reactive({
   searchForm: {
@@ -49,22 +62,35 @@
 
 const tableColumn = ref([
   { label: "涓婚", prop: "title", minWidth: 120 },
-  { label: "淇濋櫓绫诲瀷", prop: "insuranceTypeName", width: 120 },
-  { label: "浣跨敤鑼冨洿", prop: "scopeName", width: 120 },
+  { label: "淇濋櫓绫诲瀷", prop: "insuranceTypes", width: 120 },
+  { label: "浣跨敤鑼冨洿", prop: "deptNames", width: 120 },
   { label: "澶囨敞", prop: "remark", minWidth: 120 },
   { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 160 },
-  { label: "鍒涘缓浜�", prop: "createBy", width: 100 },
+  { label: "鍒涘缓浜�", prop: "createUserName", width: 100 },
   {
     dataType: "action",
     label: "鎿嶄綔",
     align: "center",
     fixed: "right",
-    width: 120,
+    width: 180,
     operation: [
-      {
+    {
         name: "缂栬緫",
         type: "text",
         clickFun: (row) => openForm("edit", row),
+      },
+      {
+        name: "璇︽儏",
+        type: "text",
+        clickFun: (row) => openForm("detail", row),
+      },
+      {
+        name: "鍒犻櫎",
+        type: "text",
+        style: {
+          color: "#F56C6C",
+        },
+        clickFun: (row) => handleDelete(row),
       },
     ],
   },
@@ -72,6 +98,7 @@
 
 const tableData = ref([]);
 const tableLoading = ref(false);
+const selectedRows = ref([]);
 const page = reactive({
   current: 1,
   size: 10,
@@ -113,12 +140,70 @@
     });
 };
 
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
 const openForm = (type, row) => {
   nextTick(() => {
     formDiaRef.value?.openDialog(type, row);
   });
 };
 
+// 鍒犻櫎鏂规锛岄�昏緫涓庡叾瀹冮〉闈繚鎸佷竴鑷达紙纭寮圭獥 + 璋冪敤鍒犻櫎鎺ュ彛 + 鍒锋柊鍒楄〃锛�
+const handleDelete = (row) => {
+  ElMessageBox.confirm(
+    `纭鍒犻櫎鏂规"${row.title}"鍚楋紵`,
+    "鍒犻櫎纭",
+    {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }
+  )
+    .then(() => {
+      socialSecurityDelete([row.id])
+        .then(() => {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getList();
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    })
+    .catch(() => {
+      ElMessage.info("宸插彇娑堝垹闄�");
+    });
+};
+
+// 鎵归噺鍒犻櫎
+const handleBatchDelete = () => {
+  if (!selectedRows.value.length) return;
+  ElMessageBox.confirm(
+    `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃柟妗堝悧锛焋,
+    "鎵归噺鍒犻櫎纭",
+    {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }
+  )
+    .then(() => {
+      const ids = selectedRows.value.map((item) => item.id);
+      socialSecurityDelete(ids)
+        .then(() => {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getList();
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    })
+    .catch(() => {
+      ElMessage.info("宸插彇娑堝垹闄�");
+    });
+};
+
 onMounted(() => {
   getList();
 });

--
Gitblit v1.9.3