From 0a9495113009836423b450f3598debd61eefa237 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期二, 10 二月 2026 16:53:09 +0800
Subject: [PATCH] Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New

---
 src/views/personnelManagement/monthlyStatistics/components/formDia.vue |  318 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 318 insertions(+), 0 deletions(-)

diff --git a/src/views/personnelManagement/monthlyStatistics/components/formDia.vue b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
new file mode 100644
index 0000000..c67fdd6
--- /dev/null
+++ b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
@@ -0,0 +1,318 @@
+<template>
+  <el-dialog v-model="dialogVisible"
+             :title="title"
+             width="700px"
+             :close-on-click-modal="false">
+    <el-form ref="formRef"
+             :model="form"
+             :rules="rules"
+             label-width="140px"
+             label-position="top">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="缁熻鏈堜唤"
+                        prop="payDate">
+            <el-date-picker v-model="form.payDate"
+                            type="month"
+                            value-format="YYYY-MM"
+                            format="YYYY-MM"
+                            placeholder="璇烽�夋嫨鏈堜唤"
+                            style="width: 100%"
+                            :disabled="operationType === 'view'" />
+          </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%"
+                       :disabled="operationType === 'view'">
+              <el-option v-for="item in userList"
+                         :key="item.id"
+                         :label="item.staffName"
+                         :value="item.id" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="鍩烘湰宸ヨ祫"
+                        prop="basicSalary">
+            <el-input v-model="form.basicSalary"
+                      type="number"
+                      placeholder="璇疯緭鍏ュ熀鏈伐璧�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璁′欢宸ヨ祫"
+                        prop="pieceworkSalary">
+            <el-input v-model="form.pieceworkSalary"
+                      type="number"
+                      placeholder="璇疯緭鍏ヨ浠跺伐璧�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="璁℃椂宸ヨ祫"
+                        prop="hourlySalary">
+            <el-input v-model="form.hourlySalary"
+                      type="number"
+                      placeholder="璇疯緭鍏ヨ鏃跺伐璧�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍏朵粬鏀跺叆"
+                        prop="otherIncome">
+            <el-input v-model="form.otherIncome"
+                      type="number"
+                      placeholder="璇疯緭鍏ュ叾浠栨敹鍏�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="绀句繚涓汉"
+                        prop="socialSecurityIndividuals">
+            <el-input v-model="form.socialSecurityIndividuals"
+                      type="number"
+                      placeholder="璇疯緭鍏ョぞ淇濅釜浜�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍏Н閲戜釜浜�"
+                        prop="providentFundIndividuals">
+            <el-input v-model="form.providentFundIndividuals"
+                      type="number"
+                      placeholder="璇疯緭鍏ュ叕绉噾涓汉"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="涓汉鎵�寰楃◣"
+                        prop="personalIncomeTax">
+            <el-input v-model="form.personalIncomeTax"
+                      type="number"
+                      placeholder="璇疯緭鍏ヤ釜浜烘墍寰楃◣"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍏朵粬鎵f"
+                        prop="otherDeductions">
+            <el-input v-model="form.otherDeductions"
+                      type="number"
+                      placeholder="璇疯緭鍏ュ叾浠栨墸娆�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="澶囨敞"
+                        prop="remark">
+            <el-input v-model="form.remark"
+                      type="textarea"
+                      placeholder="璇疯緭鍏ュ娉�"
+                      :rows="3"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary"
+                   @click="submitForm"
+                   v-if="operationType !== 'view'">
+          纭畾
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+  import { ref, reactive, computed, onMounted } from "vue";
+  import { ElMessage } from "element-plus";
+  import {
+    monthlyStatisticsAdd,
+    monthlyStatisticsUpdate,
+    staffOnJobList,
+  } from "@/api/personnelManagement/monthlyStatistics.js";
+
+  const props = defineProps({
+    modelValue: {
+      type: Boolean,
+      default: false,
+    },
+    operationType: {
+      type: String,
+      default: "add",
+    },
+    row: {
+      type: Object,
+      default: () => ({}),
+    },
+  });
+
+  const emit = defineEmits(["update:modelValue", "close"]);
+
+  const dialogVisible = computed({
+    get: () => props.modelValue,
+    set: val => emit("update:modelValue", val),
+  });
+
+  const title = computed(() => {
+    if (props.operationType === "add") return "鏂板钖祫鍙拌处";
+    if (props.operationType === "edit") return "缂栬緫钖祫鍙拌处";
+    return "鏌ョ湅钖祫鍙拌处";
+  });
+
+  const formRef = ref();
+  const form = reactive({
+    id: "",
+    payDate: "",
+    staffId: "",
+    basicSalary: 0,
+    pieceworkSalary: 0,
+    hourlySalary: 0,
+    otherIncome: 0,
+    socialSecurityIndividuals: 0,
+    providentFundIndividuals: 0,
+    personalIncomeTax: 0,
+    otherDeductions: 0,
+    payableWages: 0,
+    deductibleWages: 0,
+    actualWages: 0,
+    remark: "",
+  });
+
+  const rules = {
+    payDate: [{ required: true, message: "璇烽�夋嫨缁熻鏈堜唤", trigger: "change" }],
+    staffId: [{ required: true, message: "璇烽�夋嫨鍛樺伐", trigger: "change" }],
+    basicSalary: [{ required: true, message: "璇疯緭鍏ュ熀鏈伐璧�", trigger: "blur" }],
+  };
+
+  const userList = ref([]);
+
+  const loadUserList = () => {
+    // userListNoPage().then(res => {
+    //   userList.value = res.data || [];
+    // });
+    staffOnJobList().then(res => {
+      userList.value = res.data || [];
+    });
+  };
+
+  const openDialog = (type, row) => {
+    // 閲嶇疆琛ㄥ崟
+    Object.assign(form, {
+      id: "",
+      payDate: "",
+      staffId: "",
+      basicSalary: 0,
+      pieceworkSalary: 0,
+      hourlySalary: 0,
+      otherIncome: 0,
+      socialSecurityIndividuals: 0,
+      providentFundIndividuals: 0,
+      personalIncomeTax: 0,
+      otherDeductions: 0,
+      payableWages: 0,
+      deductibleWages: 0,
+      actualWages: 0,
+      remark: "",
+    });
+
+    if (type === "add") {
+      dialogVisible.value = true;
+    } else if (type === "edit" || type === "view") {
+      if (row && row.id) {
+        Object.assign(form, row);
+        dialogVisible.value = true;
+      }
+    }
+  };
+
+  const submitForm = () => {
+    formRef.value.validate(valid => {
+      if (valid) {
+        form.basicSalary = Number(form.basicSalary);
+        form.pieceworkSalary = Number(form.pieceworkSalary);
+        form.hourlySalary = Number(form.hourlySalary);
+        form.otherIncome = Number(form.otherIncome);
+        form.socialSecurityIndividuals = Number(form.socialSecurityIndividuals);
+        form.providentFundIndividuals = Number(form.providentFundIndividuals);
+        form.personalIncomeTax = Number(form.personalIncomeTax);
+        form.otherDeductions = Number(form.otherDeductions);
+
+        // 璁$畻搴斿彂宸ヨ祫銆佸簲鎵e伐璧勫拰瀹炲彂宸ヨ祫
+        const payableWages =
+          form.basicSalary +
+          form.pieceworkSalary +
+          form.hourlySalary +
+          form.otherIncome;
+        const deductibleWages =
+          form.socialSecurityIndividuals +
+          form.providentFundIndividuals +
+          form.personalIncomeTax +
+          form.otherDeductions;
+        const actualWages = payableWages - deductibleWages;
+
+        const submitData = {
+          ...form,
+          payableWages,
+          deductibleWages,
+          actualWages,
+        };
+
+        if (props.operationType === "add") {
+          monthlyStatisticsAdd(submitData).then(res => {
+            if (res.code === 200) {
+              ElMessage.success("鏂板鎴愬姛");
+              dialogVisible.value = false;
+              emit("close");
+            } else {
+              ElMessage.error(res.msg || "鏂板澶辫触");
+            }
+          });
+        } else if (props.operationType === "edit") {
+          monthlyStatisticsUpdate(submitData).then(res => {
+            if (res.code === 200) {
+              ElMessage.success("鏇存柊鎴愬姛");
+              dialogVisible.value = false;
+              emit("close");
+            } else {
+              ElMessage.error(res.msg || "鏇存柊澶辫触");
+            }
+          });
+        }
+      }
+    });
+  };
+
+  onMounted(() => {
+    loadUserList();
+  });
+
+  defineExpose({
+    openDialog,
+  });
+</script>
+
+<style scoped>
+  .dialog-footer {
+    text-align: right;
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3