From fd0e3fd03817d6610c52b09fe27cccf0d3f96438 Mon Sep 17 00:00:00 2001 From: yaowanxin <3588231647@qq.com> Date: 星期二, 12 八月 2025 16:26:11 +0800 Subject: [PATCH] Merge branch 'dev_ai' of http://114.132.189.42:9002/r/product-inventory-management into ywx --- src/views/personnelManagement/payrollManagement/components/formDia.vue | 315 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 315 insertions(+), 0 deletions(-) diff --git a/src/views/personnelManagement/payrollManagement/components/formDia.vue b/src/views/personnelManagement/payrollManagement/components/formDia.vue new file mode 100644 index 0000000..6dbc326 --- /dev/null +++ b/src/views/personnelManagement/payrollManagement/components/formDia.vue @@ -0,0 +1,315 @@ +<template> + <div> + <el-dialog + v-model="dialogFormVisible" + :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'" + width="50%" + @close="closeDia" + > + <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鏈堜唤锛�" prop="payDate"> + <el-date-picker + v-model="form.payDate" + type="month" + value-format="YYYY-MM-DD" + format="YYYY-MM" + placeholder="璇烽�夋嫨鏈堜唤" + clearable + :disabled="operationType === 'edit'" + style="width: 100%" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="濮撳悕锛�" prop="staffId"> + <el-select v-model="form.staffId" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect" :disabled="operationType === 'edit'"> + <el-option + v-for="item in personList" + :key="item.id" + :label="item.staffName" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="搴斿嚭鍕ゅぉ鏁帮細" prop="shouldAttendedNum"> + <el-input v-model="form.shouldAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹為檯鍑哄嫟澶╂暟锛�" prop="actualAttendedNum"> + <el-input v-model="form.actualAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍩烘湰宸ヨ祫锛�" prop="basicSalary"> + <el-input v-model="form.basicSalary" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="宀椾綅宸ヨ祫锛�" prop="postSalary"> + <el-input v-model="form.postSalary" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍏ョ鑱岀己鍕ゆ墸娆撅細" prop="deductionAbsenteeism"> + <el-input v-model="form.deductionAbsenteeism" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鐥呭亣鎵f锛�" prop="sickLeaveDeductions"> + <el-input v-model="form.sickLeaveDeductions" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="浜嬪亣鎵f锛�" prop="deductionPersonalLeave"> + <el-input v-model="form.deductionPersonalLeave" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="蹇樿鎵撳崱鎵f锛�" prop="forgetClockDeduct"> + <el-input v-model="form.forgetClockDeduct" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="缁╂晥寰楀垎锛�" prop="performanceScore"> + <el-input v-model="form.performanceScore" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缁╂晥宸ヨ祫锛�" prop="performancePay"> + <el-input v-model="form.performancePay" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="搴斿彂鍚堣锛�" prop="payableWages"> + <el-input v-model="form.payableWages" placeholder="璇疯緭鍏�" clearable type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="绀句繚涓汉锛�" prop="socialSecurityIndividuals"> + <el-input v-model="form.socialSecurityIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="绀句繚鍏徃锛�" prop="socialSecurityCompanies"> + <el-input v-model="form.socialSecurityCompanies" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="绀句繚鍚堣锛�" prop="socialSecurityTotal"> + <el-input v-model="form.socialSecurityTotal" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍏Н閲戜釜浜猴細" prop="providentFundIndividuals"> + <el-input v-model="form.providentFundIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍏Н閲戝叕鍙革細" prop="providentFundCompany"> + <el-input v-model="form.providentFundCompany" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍏Н閲戝悎璁★細" prop="providentFundTotal"> + <el-input v-model="form.providentFundTotal" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="搴旂◣宸ヨ祫锛�" prop="taxableWaget"> + <el-input v-model="form.taxableWaget" :precision="0" :step="1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="涓汉鎵�寰楃◣锛�" prop="personalIncomeTax"> + <el-input v-model="form.personalIncomeTax" :step="0.1" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹炲彂宸ヨ祫锛�" prop="actualWages"> + <el-input v-model="form.actualWages" style="width: 100%" type="number"/> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭</el-button> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import {ref} from "vue"; +import {getStaffJoinInfo, getStaffOnJob, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js"; +import {compensationAdd, compensationUpdate} from "@/api/personnelManagement/payrollManagement.js"; +const { proxy } = getCurrentInstance() +const emit = defineEmits(['close']) + +const dialogFormVisible = ref(false); +const operationType = ref('') +const data = reactive({ + form: { + payDate: "", + staffId: "", + name: "", + shouldAttendedNum: "", + actualAttendedNum: "", + basicSalary: "", + postSalary: "", + deductionAbsenteeism: "", + sickLeaveDeductions: "", + deductionPersonalLeave: "", + forgetClockDeduct: "", + performanceScore: "", + performancePay: "", + payableWages: "", + socialSecurityIndividuals: "", + socialSecurityCompanies: "", + socialSecurityTotal: "", + providentFundIndividuals: "", + providentFundCompany: "", + providentFundTotal: "", + taxableWaget: "", + personalIncomeTax: "", + actualWages: "", + }, + rules: { + payDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },], + staffId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },], + staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + shouldAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + actualAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + basicSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + postSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + deductionAbsenteeism: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + sickLeaveDeductions: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + deductionPersonalLeave: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + forgetClockDeduct: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + performanceScore: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + performancePay: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + payableWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + socialSecurityIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + socialSecurityCompanies: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + socialSecurityTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + providentFundIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + providentFundCompany: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + providentFundTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + taxableWaget: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + personalIncomeTax: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + actualWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], + }, +}); +const { form, rules } = toRefs(data); +const personList = ref([]); + +// 鎵撳紑寮规 +const openDialog = (type, row) => { + operationType.value = type; + dialogFormVisible.value = true; + getStaffOnJob().then(res => { + personList.value = res.data + }) + form.value = {} + if (operationType.value === 'edit') { + getStaffJoinInfo(row.id).then(res => { + form.value = {...row} + form.value.payDate = form.value.payDate + '-01' + }) + } +} +const handleSelect = (value) => { + console.log('value', value) + const index = personList.value.findIndex(row => row.id === value) + if (index > -1) { + form.value.name = personList.value[index].staffName + } +} +// 鎻愪氦浜у搧琛ㄥ崟 +const submitForm = () => { + proxy.$refs.formRef.validate(valid => { + if (valid) { + form.value.staffState = 1 + if (operationType.value === "add") { + compensationAdd(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } else { + compensationUpdate(form.value).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + }) + } + } + }) +} +// 璁$畻鍚堝悓骞撮檺 +const calculateContractTerm = () => { + if (form.value.contractStartTime && form.value.contractEndTime) { + const startDate = new Date(form.value.contractStartTime); + const endDate = new Date(form.value.contractEndTime); + + if (endDate > startDate) { + // 璁$畻骞翠唤宸� + const yearDiff = endDate.getFullYear() - startDate.getFullYear(); + const monthDiff = endDate.getMonth() - startDate.getMonth(); + const dayDiff = endDate.getDate() - startDate.getDate(); + + let years = yearDiff; + + // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞� + if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { + years = yearDiff - 1; + } + + form.value.contractTerm = Math.max(0, years); + } else { + form.value.contractTerm = 0; + } + } else { + form.value.contractTerm = 0; + } +}; + +// 鍏抽棴寮规 +const closeDia = () => { + proxy.resetForm("formRef"); + dialogFormVisible.value = false; + emit('close') +}; +defineExpose({ + openDialog, +}); +</script> + +<style scoped> + +</style> \ No newline at end of file -- Gitblit v1.9.3