2025-10-22 14:43:42 +08:00
|
|
|
|
import { useAntdTable } from "ahooks";
|
2025-11-18 09:09:50 +08:00
|
|
|
|
import useUrlQueryCriteria from "../useUrlQueryCriteria";
|
2025-10-22 14:43:42 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取数据
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getService(service, getExtraParams = {}, transform) {
|
|
|
|
|
|
// 获取额外的参数
|
|
|
|
|
|
const extraParams = (typeof getExtraParams === "function" ? getExtraParams() : getExtraParams) || {};
|
|
|
|
|
|
// 获取数据
|
|
|
|
|
|
return async ({ current, pageSize }, formData = {}) => {
|
|
|
|
|
|
// 如果提供了 transform 函数,则在请求之前调用它
|
|
|
|
|
|
let transformedFormData = formData;
|
|
|
|
|
|
if (typeof transform === "function") {
|
|
|
|
|
|
const transformResult = transform(formData);
|
|
|
|
|
|
// 如果 transform 函数有返回值,则将其与原始表单数据合并,transform 的优先级更高
|
|
|
|
|
|
if (transformResult && typeof transformResult === "object") {
|
|
|
|
|
|
transformedFormData = { ...formData, ...transformResult };
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 发起请求
|
|
|
|
|
|
const res = await service({
|
|
|
|
|
|
pageIndex: current,
|
|
|
|
|
|
pageSize,
|
|
|
|
|
|
...transformedFormData,
|
|
|
|
|
|
...extraParams,
|
|
|
|
|
|
});
|
|
|
|
|
|
// 返回数据
|
|
|
|
|
|
return {
|
|
|
|
|
|
list: res.data || [],
|
|
|
|
|
|
total: res.totalCount || 0,
|
|
|
|
|
|
...res,
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 自定义 useTable,继承 ahooks 的 useAntdTable,根据需求进行扩展
|
|
|
|
|
|
*/
|
|
|
|
|
|
function useTable(service, options) {
|
2025-10-31 14:26:46 +08:00
|
|
|
|
if (!service)
|
|
|
|
|
|
throw new Error("请传入 service");
|
|
|
|
|
|
|
2025-10-22 14:43:42 +08:00
|
|
|
|
// 获取额外参数和转换函数
|
|
|
|
|
|
const { params: extraParams, transform, ...restOptions } = options || {};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取配置项
|
|
|
|
|
|
const {
|
|
|
|
|
|
useStorageQueryCriteria = true,
|
|
|
|
|
|
usePagination = true,
|
|
|
|
|
|
defaultType = "advance",
|
|
|
|
|
|
defaultCurrent = 1,
|
2025-11-11 14:40:56 +08:00
|
|
|
|
defaultPageSize = 20,
|
2025-10-22 14:43:42 +08:00
|
|
|
|
defaultPagination = { current: defaultCurrent, pageSize: defaultPageSize },
|
|
|
|
|
|
...restRestOptions
|
|
|
|
|
|
} = restOptions;
|
|
|
|
|
|
|
2025-11-18 09:09:50 +08:00
|
|
|
|
const { setUrlCriteriaQuery, getUrlCriteriaQuery } = useUrlQueryCriteria();
|
|
|
|
|
|
|
2025-10-22 14:43:42 +08:00
|
|
|
|
// 获取存储的查询条件
|
2025-11-18 09:09:50 +08:00
|
|
|
|
const storageQueryCriteriaSearchForm = useStorageQueryCriteria ? getUrlCriteriaQuery("searchFormKeys", "searchFormValues") : {};
|
|
|
|
|
|
const storageQueryCriteriaPagination = useStorageQueryCriteria && usePagination ? getUrlCriteriaQuery("paginationKeys", "paginationValues") : {};
|
2025-10-22 14:43:42 +08:00
|
|
|
|
|
|
|
|
|
|
// 确定实际使用的搜索表单和分页参数
|
|
|
|
|
|
const actualSearchForm = Object.keys(storageQueryCriteriaSearchForm).length > 0 ? storageQueryCriteriaSearchForm : {};
|
|
|
|
|
|
/** @type {{current: number, pageSize: number}} */
|
|
|
|
|
|
const actualPagination = usePagination ? Object.keys(storageQueryCriteriaPagination).length > 0 ? storageQueryCriteriaPagination : defaultPagination : {};
|
|
|
|
|
|
|
|
|
|
|
|
// 调用 ahooks 的 useAntdTable
|
|
|
|
|
|
const res = useAntdTable(
|
|
|
|
|
|
getService(service, extraParams, transform),
|
|
|
|
|
|
{
|
|
|
|
|
|
...restRestOptions,
|
|
|
|
|
|
defaultParams: [actualPagination, actualSearchForm],
|
|
|
|
|
|
defaultType,
|
|
|
|
|
|
onSuccess: (data, params) => {
|
|
|
|
|
|
// 执行成功回调,为了保留 ahooks 的 onSuccess 回调
|
|
|
|
|
|
restOptions.onSuccess && restOptions.onSuccess(data, params);
|
|
|
|
|
|
// 存储查询条件和分页到 URL
|
2025-11-18 09:09:50 +08:00
|
|
|
|
useStorageQueryCriteria && setUrlCriteriaQuery(
|
2025-10-22 14:43:42 +08:00
|
|
|
|
params[1] ?? {},
|
|
|
|
|
|
usePagination
|
|
|
|
|
|
? { current: res.tableProps.pagination.current, pageSize: res.tableProps.pagination.pageSize }
|
|
|
|
|
|
: {},
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// 执行回调函数
|
|
|
|
|
|
restOptions.callback && restOptions.callback(res?.data?.list || [], res?.data || {});
|
|
|
|
|
|
|
|
|
|
|
|
// 返回结果
|
|
|
|
|
|
return {
|
|
|
|
|
|
...res,
|
|
|
|
|
|
tableProps: {
|
|
|
|
|
|
...res.tableProps,
|
|
|
|
|
|
pagination: usePagination ? { ...res.tableProps.pagination, showQuickJumper: true, showSizeChanger: true } : false,
|
|
|
|
|
|
},
|
|
|
|
|
|
getData: res.search.submit,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default useTable;
|