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