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/monthlyStatistics/index.vue |  266 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 214 insertions(+), 52 deletions(-)

diff --git a/src/views/personnelManagement/monthlyStatistics/index.vue b/src/views/personnelManagement/monthlyStatistics/index.vue
index f576ad1..40d450b 100644
--- a/src/views/personnelManagement/monthlyStatistics/index.vue
+++ b/src/views/personnelManagement/monthlyStatistics/index.vue
@@ -10,20 +10,17 @@
           clearable
           @keyup.enter="handleQuery"
         />
-        <span class="search_title ml10">鍗曟嵁鐘舵�侊細</span>
-        <el-select
-          v-model="searchForm.documentStatus"
-          placeholder="璇烽�夋嫨鍗曟嵁鐘舵��"
-          clearable
-          style="width: 180px"
-        >
-          <el-option label="鑽夌" value="draft" />
-          <el-option label="宸叉彁浜�" value="submitted" />
-          <el-option label="宸插鏍�" value="approved" />
+        <span class="search_title ml10">鐘舵�侊細</span>
+        <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 180px">
+          <el-option label="鑽夌" :value="1" />
+          <el-option label="瀹℃牳鏈�氳繃" :value="2" />
+          <el-option label="寰呭鏍�" :value="3" />
+          <el-option label="寰呭彂鏀�" :value="4" />
+          <el-option label="宸插彂鏀�" :value="5" />
         </el-select>
         <span class="search_title ml10">宸ヨ祫鏈堜唤锛�</span>
         <el-date-picker
-          v-model="searchForm.payMonth"
+          v-model="searchForm.salaryMonth"
           type="month"
           value-format="YYYY-MM"
           format="YYYY-MM"
@@ -32,17 +29,6 @@
           clearable
           @change="handleQuery"
         />
-        <span class="search_title ml10">瀹℃牳鐘舵�侊細</span>
-        <el-select
-          v-model="searchForm.approvalStatus"
-          placeholder="璇烽�夋嫨瀹℃牳鐘舵��"
-          clearable
-          style="width: 180px"
-        >
-          <el-option label="寰呭鏍�" value="pending" />
-          <el-option label="宸查�氳繃" value="passed" />
-          <el-option label="宸查┏鍥�" value="rejected" />
-        </el-select>
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
           鎼滅储
         </el-button>
@@ -53,6 +39,7 @@
       <div style="margin-bottom: 10px">
         <el-button type="primary" @click="openForm('add')">鏂板缓宸ヨ祫琛�</el-button>
         <el-button @click="handleDelete">鍒犻櫎</el-button>
+        <el-button @click="openBankSetting">璁剧疆閾惰</el-button>
         <el-button @click="handleExport">瀵煎嚭</el-button>
       </div>
       <PIMTable
@@ -74,12 +61,55 @@
       ref="formDiaRef"
       @close="handleQuery"
     />
+    <bank-setting-dia
+      v-model="bankDialogVisible"
+      ref="bankDiaRef"
+      @saved="handleBankSaved"
+    />
+    <el-dialog v-model="issueDialogVisible" title="宸ヨ祫鍙戞斁" width="720px">
+      <el-form label-position="top">
+        <el-form-item label="鍙戞斁閾惰" required>
+          <el-select
+            v-model="issueForm.bank"
+            placeholder="璇烽�夋嫨鍙戞斁閾惰"
+            clearable
+            filterable
+            style="width: 100%"
+          >
+            <el-option v-for="b in issueBankOptions" :key="b" :label="b" :value="b" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="issueDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="issueLoading" @click="confirmIssue">
+          纭畾
+        </el-button>
+      </template>
+    </el-dialog>
+    <el-dialog v-model="auditDialogVisible" title="宸ヨ祫瀹℃牳" width="720px">
+      <el-form label-position="top">
+        <el-form-item label="瀹℃牳缁撴灉" required>
+          <el-radio-group v-model="auditForm.result">
+            <el-radio :value="4">閫氳繃</el-radio>
+            <el-radio :value="2">涓嶉�氳繃</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="auditDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="auditLoading" @click="confirmAudit">
+          纭畾
+        </el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
 import {
   onMounted,
+  computed,
   ref,
   reactive,
   toRefs,
@@ -87,44 +117,58 @@
   nextTick,
 } from "vue";
 import { ElMessageBox } from "element-plus";
+import Cookies from "js-cookie";
 import FormDia from "./components/formDia.vue";
+import BankSettingDia from "./components/bankSettingDia.vue";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
+import { bankList } from "@/api/personnelManagement/bank.js";
 import {
-  monthlyStatisticsListPage,
-  monthlyStatisticsDelete,
-} from "@/api/personnelManagement/monthlyStatistics.js";
+  staffSalaryMainListPage,
+  staffSalaryMainDelete,
+  staffSalaryMainUpdate,
+} from "@/api/personnelManagement/staffSalaryMain.js";
 
 const data = reactive({
   searchForm: {
     title: "",
-    documentStatus: "",
-    payMonth: "",
-    approvalStatus: "",
+    status: "",
+    salaryMonth: "",
   },
 });
 const { searchForm } = toRefs(data);
 
 const tableColumn = ref([
-  { label: "宸ヨ祫涓婚", prop: "title", minWidth: 140 },
-  { label: "宸ヨ祫鏈堜唤", prop: "payMonth", width: 120 },
-  { label: "鍗曟嵁鐘舵��", prop: "documentStatusName", width: 100 },
-  { label: "瀹℃牳鐘舵��", prop: "approvalStatusName", width: 100 },
-  { label: "宸ヨ祫鎬婚", prop: "totalAmount", width: 120 },
-  { label: "鏀粯閾惰", prop: "paymentBank", width: 120 },
-  { label: "鍙戞斁鏃堕棿", prop: "issueTime", width: 160 },
-  { label: "瀹℃壒浜哄憳", prop: "approver", width: 100 },
+  { label: "宸ヨ祫涓婚", prop: "salaryTitle", minWidth: 140 },
+  { label: "宸ヨ祫鏈堜唤", prop: "salaryMonth", width: 120 },
+  { label: "鐘舵��", prop: "statusName", width: 110 },
+  { label: "宸ヨ祫鎬婚", prop: "totalSalary", width: 120 },
+  { label: "鏀粯閾惰", prop: "payBank", width: 120 },
+  { label: "瀹℃牳浜�", prop: "auditUserName", width: 110 },
   { label: "澶囨敞", prop: "remark", minWidth: 120 },
   {
     dataType: "action",
     label: "鎿嶄綔",
     align: "center",
     fixed: "right",
-    width: 120,
+    width: 180,
     operation: [
       {
         name: "缂栬緫",
         type: "text",
+        showHide: (row) => Number(row?.status) === 1 || Number(row?.status) === 2,
         clickFun: (row) => openForm("edit", row),
+      },
+      {
+        name: "瀹℃牳",
+        type: "text",
+        showHide: (row) => Number(row?.status) === 3,
+        clickFun: (row) => openAudit(row),
+      },
+      {
+        name: "鍙戞斁",
+        type: "text",
+        showHide: (row) => Number(row?.status) === 4,
+        clickFun: (row) => openIssue(row),
       },
     ],
   },
@@ -143,6 +187,47 @@
 const operationType = ref("add");
 const currentRow = ref({});
 const { proxy } = getCurrentInstance();
+const bankSetting = ref({});
+const bankDialogVisible = ref(false);
+const bankDiaRef = ref(null);
+const issueDialogVisible = ref(false);
+const issueLoading = ref(false);
+const issueRow = ref(null);
+const issueForm = reactive({ bank: "" });
+const auditDialogVisible = ref(false);
+const auditLoading = ref(false);
+const auditRow = ref(null);
+const auditForm = reactive({ result: 4 }); // 4=閫氳繃(寰呭彂鏀�) 2=涓嶉�氳繃
+
+const issueBankOptions = computed(() => {
+  const options = Array.isArray(bankSetting.value?.options) ? bankSetting.value.options : [];
+  return options
+    .map((v) => (v == null ? "" : String(v).trim()))
+    .filter((v) => v !== "");
+});
+
+const statusName = (s) => {
+  const n = Number(s);
+  return (
+    {
+      1: "鑽夌",
+      2: "瀹℃牳鏈�氳繃",
+      3: "寰呭鏍�",
+      4: "寰呭彂鏀�",
+      5: "宸插彂鏀�",
+    }[n] || "-"
+  );
+};
+
+const loadBankSetting = () => {
+  return bankList().then((res) => {
+    const list = Array.isArray(res?.data) ? res.data : [];
+    const options = list
+      .map((b) => (b?.bankName == null ? "" : String(b.bankName).trim()))
+      .filter((v) => v !== "");
+    bankSetting.value = { options, defaultBank: "" };
+  });
+};
 
 const handleQuery = () => {
   page.current = 1;
@@ -151,9 +236,8 @@
 
 const handleReset = () => {
   searchForm.value.title = "";
-  searchForm.value.documentStatus = "";
-  searchForm.value.payMonth = "";
-  searchForm.value.approvalStatus = "";
+  searchForm.value.status = "";
+  searchForm.value.salaryMonth = "";
   page.current = 1;
   getList();
 };
@@ -166,27 +250,25 @@
 
 const getList = () => {
   tableLoading.value = true;
-  monthlyStatisticsListPage({
+  staffSalaryMainListPage({
     ...searchForm.value,
     current: page.current,
     size: page.size,
   })
     .then((res) => {
       tableLoading.value = false;
-      const records = res.data?.records ?? [];
+      const records = res.data?.records ?? res.data?.list ?? [];
       // 鍏煎鍚庣瀛楁锛氳嫢鎺ュ彛浠嶈繑鍥炲彴璐︾粨鏋勶紝鍙湪姝ゅ仛鏄犲皠
       tableData.value = records.map((item) => ({
         ...item,
-        title: item.title ?? item.payDateStr ?? "-",
-        payMonth: item.payMonth ?? item.payDateStr ?? item.payDate ?? "-",
-        documentStatusName: item.documentStatusName ?? "-",
-        approvalStatusName: item.approvalStatusName ?? "-",
-        totalAmount: item.totalAmount ?? item.actualWages ?? "-",
-        paymentBank: item.paymentBank ?? "-",
-        issueTime: item.issueTime ?? item.createTime ?? "-",
-        approver: item.approver ?? "-",
+        salaryTitle: item.salaryTitle ?? "-",
+        salaryMonth: item.salaryMonth ?? "-",
+        statusName: statusName(item.status),
+        totalSalary: item.totalSalary ?? "-",
+        payBank: (item.payBank == null ? "" : String(item.payBank).trim()) || "-",
+        auditUserName: item.auditUserName ?? "-",
       }));
-      page.total = res.data?.total ?? 0;
+      page.total = res.data?.total ?? res.data?.count ?? 0;
     })
     .catch(() => {
       tableLoading.value = false;
@@ -206,6 +288,85 @@
   });
 };
 
+const openBankSetting = () => {
+  bankDialogVisible.value = true;
+};
+
+const openAudit = (row) => {
+  auditRow.value = row || null;
+  auditForm.result = 4;
+  auditDialogVisible.value = true;
+};
+
+const openIssue = (row) => {
+  if (!issueBankOptions.value?.length) {
+    proxy?.$modal?.msgWarning?.("璇峰厛鍦ㄢ�滆缃摱琛屸�濅腑缁存姢鍙戞斁閾惰閫夐」");
+    return;
+  }
+  issueRow.value = row || null;
+  const current = row?.payBank && row.payBank !== "-" ? String(row.payBank).trim() : "";
+  issueForm.bank = current;
+  issueDialogVisible.value = true;
+};
+
+const confirmAudit = () => {
+  const row = auditRow.value;
+  if (!row?.id) {
+    auditDialogVisible.value = false;
+    return;
+  }
+  const username = Cookies.get("username") || "";
+  const userIdRaw = Cookies.get("userId");
+  const auditUserId = userIdRaw ? Number(userIdRaw) : undefined;
+  auditLoading.value = true;
+  staffSalaryMainUpdate({
+    id: row.id,
+    status: Number(auditForm.result) === 2 ? 2 : 4,
+    auditUserId,
+    auditUserName: username,
+  })
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("瀹℃牳鎴愬姛");
+      auditDialogVisible.value = false;
+      getList();
+    })
+    .finally(() => {
+      auditLoading.value = false;
+    });
+};
+
+const confirmIssue = () => {
+  const bank = issueForm.bank ? String(issueForm.bank).trim() : "";
+  if (!bank) {
+    proxy?.$modal?.msgWarning?.("璇烽�夋嫨鍙戞斁閾惰");
+    return;
+  }
+  const row = issueRow.value;
+  if (!row?.id) {
+    issueDialogVisible.value = false;
+    return;
+  }
+  issueLoading.value = true;
+  staffSalaryMainUpdate({
+    id: row.id,
+    payBank: bank,
+    status: 5,
+  })
+    .then(() => {
+      proxy?.$modal?.msgSuccess?.("鍙戞斁鎴愬姛");
+      issueDialogVisible.value = false;
+      getList();
+    })
+    .finally(() => {
+      issueLoading.value = false;
+    });
+};
+
+const handleBankSaved = () => {
+  loadBankSetting();
+  getList();
+};
+
 const handleDelete = () => {
   if (!selectedRows.value?.length) {
     proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
@@ -218,7 +379,7 @@
     type: "warning",
   })
     .then(() => {
-      monthlyStatisticsDelete(ids).then(() => {
+      staffSalaryMainDelete(ids).then(() => {
         proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
         getList();
       });
@@ -235,6 +396,7 @@
 };
 
 onMounted(() => {
+  loadBankSetting();
   getList();
 });
 </script>

--
Gitblit v1.9.3