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/views/personnelManagement/socialSecuritySet/components/formDia.vue | 178 ++++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 139 insertions(+), 39 deletions(-)
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;
--
Gitblit v1.9.3