From 2cc572c2a3c6efac102b141c574bceddbfc0d68e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 09 三月 2026 16:18:10 +0800
Subject: [PATCH] 进销存系统升级 1.部署修改

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

diff --git a/src/views/personnelManagement/monthlyStatistics/components/formDia.vue b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
index 0882ba4..e3105d2 100644
--- a/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
+++ b/src/views/personnelManagement/monthlyStatistics/components/formDia.vue
@@ -1,11 +1,11 @@
 <template>
-  <el-dialog
+  <FormDialog
     v-model="dialogVisible"
     :title="operationType === 'add' ? '鏂板缓宸ヨ祫琛�' : '缂栬緫宸ヨ祫琛�'"
     width="90%"
-    :close-on-click-modal="false"
-    destroy-on-close
     @close="closeDia"
+    @confirm="submitForm"
+    @cancel="closeDia"
   >
     <div class="form-dia-body">
       <!-- 鍩虹璧勬枡 -->
@@ -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"
@@ -28,11 +28,14 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="閫夋嫨閮ㄩ棬" prop="deptId">
+              <el-form-item label="閫夋嫨閮ㄩ棬" prop="deptIds">
                 <el-select
-                  v-model="form.deptId"
+                  v-model="form.deptIds"
                   placeholder="璇烽�夋嫨"
                   clearable
+                  multiple
+                  collapse-tags
+                  collapse-tags-tooltip
                   style="width: 100%"
                 >
                   <el-option
@@ -45,9 +48,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 +67,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 +115,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 +130,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 +163,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>
@@ -170,12 +192,7 @@
       </div>
     </div>
 
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button @click="closeDia">鍙栨秷</el-button>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-      </div>
-    </template>
+
 
     <!-- 鏂板浜哄憳寮圭獥 -->
     <el-dialog
@@ -230,19 +247,21 @@
         />
       </el-table>
     </el-dialog>
-  </el-dialog>
+  </FormDialog>
 </template>
 
 <script setup>
 import { ref, reactive, toRefs, computed, getCurrentInstance, nextTick } from "vue";
 import { ArrowUp } from "@element-plus/icons-vue";
+import FormDialog from "@/components/Dialog/FormDialog.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 +286,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 +307,28 @@
 const data = reactive({
   form: {
     id: undefined,
-    title: "",
-    deptId: undefined,
-    payMonth: "",
+    salaryTitle: "",
+    deptIds: [],
+    salaryMonth: "",
     remark: "",
+    payBank: "",
   },
   rules: {
-    title: [{ required: true, message: "璇疯緭鍏ュ伐璧勪富棰�", trigger: "blur" }],
-    deptId: [{ required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" }],
-    payMonth: [{ required: true, message: "璇烽�夋嫨宸ヨ祫鏈堜唤", trigger: "change" }],
+    salaryTitle: [{ required: true, message: "璇疯緭鍏ュ伐璧勪富棰�", trigger: "blur" }],
+    deptIds: [{ 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 +388,27 @@
 const openDialog = (type, row) => {
   nextTick(() => {
     loadDeptOptions();
+    loadBankOptions();
     employeeList.value = [];
     Object.assign(form.value, {
       id: undefined,
-      title: "",
-      deptId: undefined,
-      payMonth: "",
+      salaryTitle: "",
+      deptIds: [],
+      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.deptIds = row.deptIds
+        ? String(row.deptIds).split(",").map((id) => Number(id.trim())).filter(Boolean)
+        : [];
+      form.value.salaryMonth = row.salaryMonth ?? "";
+      form.value.remark = row.remark ?? "";
+      form.value.payBank = row.payBank ?? "";
     }
   });
 };
@@ -412,17 +437,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 +461,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 +474,52 @@
     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.deptIds?.length) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨閮ㄩ棬");
+    return;
+  }
+  if (!form.value.salaryMonth) {
+    proxy.$modal.msgWarning("璇峰厛閫夋嫨宸ヨ祫鏈堜唤");
+    return;
+  }
+  const payload = {
+    ids: form.value.deptIds,
+    date: form.value.salaryMonth,
+  };
+  staffSalaryMainCalculateSalary(payload).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 = () => {
@@ -475,25 +544,38 @@
   formRef.value?.validate((valid) => {
     if (!valid) return;
     const payload = {
-      ...form.value,
-      detailList: employeeList.value.map((e) => ({
-        staffId: e.staffId ?? e.id,
+      id: form.value.id,
+      salaryTitle: form.value.salaryTitle,
+      deptIds: form.value.deptIds?.length ? form.value.deptIds.join(",") : "",
+      salaryMonth: form.value.salaryMonth,
+      remark: form.value.remark,
+      payBank: form.value.payBank,
+      staffSalaryDetailList: employeeList.value.map((e) => ({
+        staffOnJobId: e.staffOnJobId ?? e.staffId ?? e.id,
         staffName: e.staffName,
+        postName: e.postName ?? "",
+        deptName: e.deptName ?? "",
         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();
       });

--
Gitblit v1.9.3