From 193af68d72a71268054f7d07395c2ea11210ecc1 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期五, 30 五月 2025 09:40:28 +0800
Subject: [PATCH] 提交基础信息 三个模块 提交采购管理

---
 src/hooks/usePaginationApi.jsx |  145 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 145 insertions(+), 0 deletions(-)

diff --git a/src/hooks/usePaginationApi.jsx b/src/hooks/usePaginationApi.jsx
new file mode 100644
index 0000000..aa995b0
--- /dev/null
+++ b/src/hooks/usePaginationApi.jsx
@@ -0,0 +1,145 @@
+import { ref, reactive, watchEffect, unref } from "vue";
+import useFormData from "./useFormData.js";
+// import { message } from "@/utils/message";
+
+import { clone, isEqual } from "lodash";
+/**
+ * 鍒嗛〉api
+ * @param api 鎺ュ彛
+ * @param initalFilters 鍒濆鍖栫瓫閫夋潯浠�
+ * @param sorters
+ * @param filterTransformer
+ */
+export function usePaginationApi(
+  api,
+  initalFilters,
+  columns,
+  sorters,
+  filterTransformer,
+  cb
+) {
+  const dataList = ref([]);
+  const { form: filters, resetForm } = useFormData(initalFilters);
+  let lastFilters = clone(initalFilters);
+  const sorter = reactive(sorters || {});
+  const others = ref({});
+  const loading = ref(true);
+  const paginationAlign = ref("right");
+
+  /** 鍒嗛〉閰嶇疆 */
+  const pagination = reactive({
+    pageSize: 10,
+    currentPage: 1,
+    pageSizes: [10, 15, 20],
+    total: 0,
+    align: "right",
+    background: true
+  });
+
+  /** 鍔犺浇鍔ㄧ敾閰嶇疆 */
+  const loadingConfig = reactive({
+    text: "姝e湪鍔犺浇绗竴椤�...",
+    viewBox: "-10, -10, 50, 50",
+    spinner: `
+        <path class="path" d="
+          M 30 15
+          L 28 17
+          M 25.61 25.61
+          A 15 15, 0, 0, 1, 15 30
+          A 15 15, 0, 1, 1, 27.99 7.5
+          L 15 15
+        " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
+      `
+    // svg: "",
+    // background: rgba()
+  });
+
+  function getFinalParams() {
+    const finalFilters = {};
+    const beforeParams = unref(filters);
+    if (filterTransformer) {
+      Object.keys(beforeParams).forEach(key => {
+        if (filterTransformer[key]) {
+          Object.assign(
+            finalFilters,
+            filterTransformer[key](beforeParams[key], beforeParams)
+          );
+        } else {
+          finalFilters[key] = beforeParams[key];
+        }
+      });
+    }
+
+    return filterTransformer
+      ? { ...finalFilters, ...sorter }
+      : { ...beforeParams, ...sorter };
+  }
+
+  async function getTableData() {
+    // 濡傛灉杩欐鍜屼笂娆$殑filter涓嶅悓锛岄偅涔堝氨閲嶇疆椤电爜
+    if (!isEqual(unref(filters), lastFilters)) {
+      pagination.currentPage = 1;
+      lastFilters = clone(unref(filters));
+    }
+    loading.value = true;
+    api({
+      ...getFinalParams(),
+      current: pagination.currentPage,
+      size: pagination.pageSize
+    }).then(({ code, data, ...rest }) => {
+      if (code == 200) {
+        // pagination.currentPage = meta.current_page;
+        // pagination.pageSize = meta.per_page;
+        pagination.total = data.total;
+        others.value = rest;
+        dataList.value = data.records;
+        cb && cb(data);
+        loading.value = false;
+      } else {
+        loading.value = false;
+        // message(data.msg, { type: "error" });
+      }
+    });
+  }
+
+  function onSizeChange(val) {
+    pagination.pageSize = val;
+    pagination.currentPage = 1;
+    getTableData();
+  }
+
+  function onCurrentChange(val) {
+    loadingConfig.text = `姝e湪鍔犺浇绗�${val}椤�...`;
+    loading.value = true;
+    getTableData();
+  }
+  function resetFilters() {
+    resetForm();
+    pagination.currentPage = 1;
+    getTableData();
+  }
+
+  watchEffect(() => {
+    pagination.align = paginationAlign.value;
+  });
+
+  // onMounted(() => {
+  //   getTableData();
+  // });
+
+  return {
+    loading,
+    columns,
+    dataList,
+    pagination,
+    loadingConfig,
+    paginationAlign,
+    filters,
+    sorter,
+    others,
+    onSizeChange,
+    onCurrentChange,
+    getTableData,
+    resetFilters
+  };
+}

--
Gitblit v1.9.3