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